[PATCH] tar2fs: add support efi

Anton Midyukov antohami at altlinux.org
Tue Dec 17 11:03:11 MSK 2019


---
 bin/tar2fs | 91 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 81 insertions(+), 10 deletions(-)

diff --git a/bin/tar2fs b/bin/tar2fs
index 8436ee20c2..d110bc6579 100755
--- a/bin/tar2fs
+++ b/bin/tar2fs
@@ -30,6 +30,8 @@ CUR_BOUNDARY=0		# align first partition at 1MB for performance (+1)
 
 BOOTFSTYPE=
 BOOTPART=
+EFIPARTFSTYPE=
+EFIPART=
 
 BOOTLOADER="$5"
 
@@ -50,7 +52,14 @@ ppc*)
 	ROOTPART="2"
 	;;
 *)
-	ROOTPART="1"
+	if [ "$BOOTLOADER" == grub-efi ]; then
+		EFIPART="1"
+		EFIPARTSIZEM="256"
+		EFIPARTFSTYPE="fat"
+		ROOTPART="2"
+	else
+		ROOTPART="1"
+	fi
 	BLOCKDEV="/dev/sda"
 	;;
 esac
@@ -82,9 +91,14 @@ mkpart() {
 		CUR_BOUNDARY="$(($start + $1))"
 		local end="$CUR_BOUNDARY"MiB
 	else
-		local end="-1s"	# last sector of the image
+		local end="$OFFSET"MiB	# last sector of the image
 	fi
-	parting mkpart primary ext2 "$start"MiB "$end"
+	if [ -n "$2" ]; then
+		CUR_FS="$2"
+	else
+		CUR_FS=ext2
+	fi
+	parting mkpart primary "$CUR_FS" "$start"MiB "$end"
 }
 
 # a tarball containing chroot with a kernel
@@ -118,7 +132,8 @@ ROOTFSTYPE="${4:-ext4}"
 ROOTDEV="$BLOCKDEV$ROOTPART"
 
 # last preparations...
-MKFS="mkfs.$ROOTFSTYPE ${BOOTFSTYPE:+mkfs.$BOOTFSTYPE}"
+MKFS="mkfs.$ROOTFSTYPE ${BOOTFSTYPE:+mkfs.$BOOTFSTYPE} \
+  ${EFIPARTFSTYPE:+mkfs.$EFIPARTFSTYPE}"
 for i in losetup sfdisk parted kpartx $MKFS; do
 	if ! type -t "$i" >&/dev/null; then
 		fatal "$i required but not found in host system"
@@ -129,15 +144,20 @@ LOOPDEV="$(losetup --find)"	# would be sad about non-binary megabytes too
 ROOTFS="$WORKDIR/chroot"
 
 BOOTFS=
+EFIPARTFS=
 if [ -n "$BOOTPART" ]; then
 	BOOTFS="$ROOTFS/boot"
 fi
+if [ -n "$EFIPART" ]; then
+	EFIPARTFS="$ROOTFS/boot/efi"
+fi
 
 exit_handler() {
 	rc=$?
 	cd /
 	if [ -n "$ROOTFS" ]; then
-		umount ${BOOTFS:+"$BOOTFS"} "$ROOTFS"{/dev,/proc,/sys,}
+		umount ${EFIPARTFS:+"$EFIPARTFS"} ${BOOTFS:+"$BOOTFS"} \
+		  "$ROOTFS"{/dev,/proc,/sys,}
 
 		if [ -n "$LOOPDEV" ]; then
 			kpartx -d -s "$LOOPDEV" || {
@@ -157,12 +177,15 @@ trap exit_handler EXIT ERR
 
 # prepare disk image and a filesystem inside it
 rm -f -- "$IMG"
-
-OFFSET="$(($CUR_BOUNDARY + $BOOTLOADERPARTSIZEM + $BOOTSIZEM + $ROOTSIZEM - 1))"
+OFFSET="$(($CUR_BOUNDARY + $EFIPARTSIZEM + $BOOTLOADERPARTSIZEM + $BOOTSIZEM + $ROOTSIZEM - 1))"
 dd if=/dev/zero of="$IMG" conv=notrunc bs=$MB count=1 seek="$OFFSET"
 losetup "$LOOPDEV" "$IMG"
 
-parting mklabel msdos
+if [ "$BOOTLOADER" == grub-efi ]; then
+	parting mklabel gpt
+else
+	parting mklabel msdos
+fi
 
 if [ -n "$BOOTLOADERPART" ] && [ -n "$BOOTLOADERPARTSIZEM" ]; then
 	case "$ARCH" in
@@ -175,6 +198,14 @@ if [ -n "$BOOTLOADERPART" ] && [ -n "$BOOTLOADERPARTSIZEM" ]; then
 	esac
 fi
 
+if [ -n "$EFIPART" ]; then
+	EFIDEV="$EFIDEV$EFIPART"
+	parting mkpart fat32 2048s ${EFIPARTSIZEM}M
+	CUR_BOUNDARY="$(($CUR_BOUNDARY + $EFIPARTSIZEM))"
+	parting set 1 boot on
+	parting set 1 esp on
+fi
+
 if [ -n "$BOOTPART" ]; then
 	BOOTDEV="$BLOCKDEV$BOOTPART"
 	mkpart "$BOOTSIZEM"
@@ -197,6 +228,11 @@ if [ -n "$BOOTLOADERPART" ] && [ -n "$BOOTLOADERPARTSIZEM" ]; then
 	LOOPBOOTLOADER="/dev/mapper/$(basename "$LOOPDEV")p$BOOTLOADERPART"
 fi
 
+if [ -n "$EFIPART" ]; then
+	LOOPEFI="/dev/mapper/$(basename "$LOOPDEV")p$EFIPART"
+	mkfs.fat -F32 "$LOOPEFI"
+fi
+
 ROOTUUID="$(blkid -s UUID -o value -c /dev/null "$LOOPROOT")"
 if [ -n "$ROOTUUID" ]; then
        ROOTDEV="UUID=$ROOTUUID"
@@ -206,11 +242,18 @@ fi
 
 if [ -n "$BOOTPART" ]; then
 	BOOTUUID="$(blkid -s UUID -o value -c /dev/null "$LOOPBOOT")"
-	if [ -n "$ROOTUUID" ]; then
+	if [ -n "$BOOTUUID" ]; then
 		BOOTDEV="UUID=$BOOTUUID"
 	fi
 fi
 
+if [ -n "$EFIPART" ]; then
+	EFIUUID="$(blkid -s UUID -o value -c /dev/null "$LOOPEFI")"
+	if [ -n "$EFIUUID" ]; then
+		EFIDEV="UUID=$EFIUUID"
+	fi
+fi
+
 # mount and populate it
 mkdir -pm755 "$ROOTFS"
 mount "$LOOPROOT" "$ROOTFS"
@@ -220,6 +263,11 @@ if [ -n "$BOOTPART" ]; then
 	mount "$LOOPBOOT" "$BOOTFS"
 fi
 
+if [ -n "$EFIPART" ]; then
+	mkdir -pm751 "$EFIPARTFS"
+	mount "$LOOPEFI" "$EFIPARTFS"
+fi
+
 tar -C "$ROOTFS" --numeric-owner -xf "$TAR"
 for i in /dev /proc /sys; do mount --bind "$i" "$ROOTFS$i"; done
 
@@ -234,6 +282,9 @@ fi
 if [ -n "$BOOTPART" ]; then
 	echo "$BOOTDEV /boot $BOOTFSTYPE defaults 1 2" >> "$ROOTFS/etc/fstab"
 fi
+if [ -n "$EFIPART" ]; then
+	echo "$EFIDEV /boot/efi vfat umask=0,quiet,showexec,iocharset=utf8,codepage=866 1 2" >> "$ROOTFS/etc/fstab"
+fi
 
 # Query ARCH in chroot and redefine arch-dependent variable
 ARCH="$(chroot "$ROOTFS" rpm --eval '%_host_cpu')"
@@ -323,13 +374,33 @@ image=/boot/vmlinuz
 	;;
 grub-efi)
 	chroot "$ROOTFS" grub-mkconfig -o /boot/grub/grub.cfg
-	chroot "$ROOTFS" grub-install
+	case "$ARCH" in
+		*86)
+			chroot "$ROOTFS" grub-install --target=i386-efi --removable
+			sed -i 's/initrd16/initrdefi/g' "$ROOTFS/boot/grub/grub.cfg"
+			sed -i 's/linux16/linuxefi/g' "$ROOTFS/boot/grub/grub.cfg"
+		;;
+		x86_64)
+			chroot "$ROOTFS" grub-install --target=i386-efi --removable
+			chroot "$ROOTFS" grub-install --target=x86_64-efi --removable
+			sed -i 's/initrd16/initrdefi/g' "$ROOTFS/boot/grub/grub.cfg"
+			sed -i 's/linux16/linuxefi/g' "$ROOTFS/boot/grub/grub.cfg"
+		;;
+		aarch64)
+			chroot "$ROOTFS" grub-install --target=arm64-efi --removable
+		;;
+		armh)
+			chroot "$ROOTFS" grub-install --target=arm-efi --removable
+		;;
+	esac
 	;;
 grub)
 	chroot "$ROOTFS" grub-mkconfig -o /boot/grub/grub.cfg
 	case "$ARCH" in
 		*86*)
 			chroot "$ROOTFS" grub-install --target=i386-pc "$LOOPDEV"
+			sed -i 's/initrdefi/initrd16/g' "$ROOTFS/boot/grub/grub.cfg"
+			sed -i 's/linuxefi/linux16/g' "$ROOTFS/boot/grub/grub.cfg"
 			;;
 		ppc*)
 			[ -z "$LOOPBOOTLOADER" ] ||
-- 
2.24.1


--------------A1FCB4F734D5A2EC97FD6110
Content-Type: text/plain; charset=UTF-8;
 name="tar2fs"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="tar2fs"

IyEvYmluL2Jhc2ggLWV4CiMgdXNhZ2U6CiMgdGFyMmZzIGNocm9vdC50YXIgaW1hZ2UucmF3
IFtzaXplX2luX2J5dGVzIFtmc3R5cGVdXQoKLiBzaGVsbC1lcnJvcgpleHBvcnQgTEFORz1D
CgppZiBbICQjIC1sdCAyIF07IHRoZW4KCWZhdGFsICJlcnJvcjogdGFyMmZzIG5lZWRzIGF0
IGxlYXN0IHR3byBhcmd1bWVudHMiCmZpCgojIHRoaXMgbmVlZHMgZW52X2tlZXAgc3VkbyBz
ZXR1cCB0byBhY3R1YWxseSB3b3JrCmlmIFsgLW4gIiRHTE9CQUxfQlVJTERESVIiIF07IHRo
ZW4KCVdPUktESVI9IiRHTE9CQUxfQlVJTERESVIvdm1yb290IgplbHNlCglXT1JLRElSPSIk
KG1rdGVtcCAtLXRtcGRpciAtZCB2bXJvb3QtWFhYWFgpIgpmaQoKWyAtbiAiJFdPUktESVIi
IF0gfHwgZmF0YWwgImNvdWxkbid0IGNvbWUgdXAgd2l0aCBzdWl0YWJsZSBXT1JLRElSIgoK
WyAtbiAiJEdMT0JBTF9ERUJVRyIgXSB8fCBtZXNzYWdlICJXT1JLRElSOiAkV09SS0RJUiIK
Ck1CPTEwNDg1NzYJCSMgYSBwYXJ0ZWQncyAibWVnYWJ5dGUiIGluIGJ5dGVzIGlzICpicm9r
ZW4qCgpTSVpFX0ZBQ1RPUj0yCQkjIG11bHRpcGx5IHRoZSBzaXplcyBmb3VuZCBieSB0aGlz
IHZhbHVlCkJPT1RfU0laRV9GQUNUT1I9MgkjIG11bHRpcGx5IC9ib290IHNpemUgYnkgdGhp
cyB2YWx1ZSBhZGRpdGlvbmFsbHkKQk9PVExPQURFUlBBUlRTSVpFTT0wCSMgUFJlUCBwYXJ0
aXRpb24gc2l6ZSAocHBjKikKCkNVUl9CT1VOREFSWT0wCQkjIGFsaWduIGZpcnN0IHBhcnRp
dGlvbiBhdCAxTUIgZm9yIHBlcmZvcm1hbmNlICgrMSkKCkJPT1RGU1RZUEU9CkJPT1RQQVJU
PQpFRklQQVJURlNUWVBFPQpFRklQQVJUPQoKQk9PVExPQURFUj0iJDUiCgpBUkNIPSIkKGFy
Y2gpIgkJIyBOQjogc3VkbyA9PiBubyBHTE9CQUxfIHdpbGwgZG8gZWl0aGVyOyBtaW5kIHFl
bXUtKgoKY2FzZSAiJEFSQ0giIGluCmUyaykKCUJPT1RGU1RZUEU9ImV4dDIiICAgICAgICMg
ZmlybXdhcmUga25vd3MgaXQKCUJMT0NLREVWPSIvZGV2L3NkYSIgICAgICMgLi4uaG9wZWZ1
bGx5Li4uCglCT09UUEFSVD0iMSIKCVJPT1RQQVJUPSIyIgoJOzsKcHBjKikKCUJPT1RGU1RZ
UEU9ImV4dDQiCglCTE9DS0RFVj0iL2Rldi9zZGEiCglCT09UTE9BREVSUEFSVD0iMSIKCUJP
T1RMT0FERVJQQVJUU0laRU09IjgiCglST09UUEFSVD0iMiIKCTs7CiopCglpZiBbICIkQk9P
VExPQURFUiIgPT0gZ3J1Yi1lZmkgXTsgdGhlbgoJCUVGSVBBUlQ9IjEiCgkJRUZJUEFSVFNJ
WkVNPSIyNTYiCgkJRUZJUEFSVEZTVFlQRT0iZmF0IgoJCVJPT1RQQVJUPSIyIgoJZWxzZQoJ
CVJPT1RQQVJUPSIxIgoJZmkKCUJMT0NLREVWPSIvZGV2L3NkYSIKCTs7CmVzYWMKCiMgZmln
dXJlIG91dCB0aGUgcGFydCB0YWtlbiBieSAvYm9vdCBpbiB0aGUgZ2l2ZW4gdGFyYmFsbApi
b290X3NpemUoKSB7CglpZiBbIC1uICIkQk9PVFBBUlQiIF07IHRoZW4KCQl0YXIgdHZmICIk
MSIgXAoJCXwgYXdrICcgXAoJCQlCRUdJTiB7IHN1bT0wIH0KCQkJL14tLiogXC5cL2Jvb3Rc
Ly8geyBzdW09c3VtKyQzIH0KCQkJRU5EIHsgcHJpbnQgc3VtIH0nCgllbHNlCgkJZWNobyAi
MCIKCWZpCn0KCiMgcGFydGVkIHdyYXBwZXIgZm9yIGNvbnZlbmllbmNlCnBhcnRpbmcoKSB7
IHBhcnRlZCAiJExPT1BERVYiIC0tYWxpZ24gb3B0aW1hbCAtLXNjcmlwdCAtLSAiJEAiOyB9
CgojIHVuZm9ydHVuYXRlbHkgcGFydGVkIGlzIGluc2FuZSBlbm91Z2ggdG8gbHVtcCBhbGln
bm1lbnQgY29udHJvbHMKIyBpbnRvIHVuaXQgY29udHJvbHMgc28gY3JlYXRpbmcgYWRqYWNl
bnQgcGFydGl0aW9ucyBzaXplZCBpbiBNaUIKIyBpcyBub3QgYXMgc3RyYWlnaHRmb3J3YXJk
IGFzIGl0IG1pZ2h0IGJlLi4uIHRodXMgIisxIiBwYWRkaW5nOwojIHNlZSBhbHNvIGh0dHA6
Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9wYXJ0ZWQvbWFudWFsL3BhcnRlZC5odG1sI3VuaXQK
bWtwYXJ0KCkgewoJIyBhIGJpdCBkaWZmZXJlbnQgc3RhcnQvZW5kIHNlbWFudGljcyB0byBo
YW5kbGUgZW5kIG9mIGRldmljZSB0b28KCWxvY2FsIHN0YXJ0PSIkKCgkQ1VSX0JPVU5EQVJZ
ICsgMSkpIgkjIHllcywgd2UgbG9zZSBhIG1lZ2FieXRlCglpZiBbIC1uICIkMSIgXTsgdGhl
bgoJCUNVUl9CT1VOREFSWT0iJCgoJHN0YXJ0ICsgJDEpKSIKCQlsb2NhbCBlbmQ9IiRDVVJf
Qk9VTkRBUlkiTWlCCgllbHNlCgkJbG9jYWwgZW5kPSIkT0ZGU0VUIk1pQgkjIGxhc3Qgc2Vj
dG9yIG9mIHRoZSBpbWFnZQoJZmkKCWlmIFsgLW4gIiQyIiBdOyB0aGVuCgkJQ1VSX0ZTPSIk
MiIKCWVsc2UKCQlDVVJfRlM9ZXh0MgoJZmkKCXBhcnRpbmcgbWtwYXJ0IHByaW1hcnkgIiRD
VVJfRlMiICIkc3RhcnQiTWlCICIkZW5kIgp9CgojIGEgdGFyYmFsbCBjb250YWluaW5nIGNo
cm9vdCB3aXRoIGEga2VybmVsClRBUj0iJDEiClsgLXMgIiRUQVIiIF0gfHwgZmF0YWwgInNv
dXJjZSB0YXJiYWxsIGRvZXNuJ3QgcmVhbGx5IGV4aXN0IgoKIyBhIHBhdGggdG8gdGhlIGlt
YWdlIHRvIGJlIGdlbmVyYXRlZApJTUc9IiQyIgpbIC1kICIkKGRpcm5hbWUgIiRJTUciKSIg
XSB8fCBmYXRhbCAidGFyZ2V0IGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IgoKIyAwIG1lYW5z
IGF1dG87IGlmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGl0IGhvbGRzIChubyAvYm9vdCBzdWJ0
cmFjdGVkKQpST09UU0laRT0iJDMiClsgLW4gIiRST09UU0laRSIgLWEgIiRST09UU0laRSIg
IT0gMCBdIHx8IHVuc2V0IFJPT1RTSVpFCgojIGltYWdlIHNpemUgaW4gYnl0ZXMKVEFSU0la
RT0iJChzdGF0IC1MYyAlcyAiJFRBUiIpIgojIC9ib290IHNpemUgaW4gdGhhdCB0YXJiYWxs
CkJPT1RTSVpFPSIkKGJvb3Rfc2l6ZSAiJFRBUiIpIgpERUZTSVpFPSIkKCgkU0laRV9GQUNU
T1IgKiAoJFRBUlNJWkUgLSAkQk9PVFNJWkUpKSkiCSMgKGV4YWN0IHNpemVzKQpST09UU0la
RT0iJCgoJHtST09UU0laRTotJERFRlNJWkV9ICsgJE1CIC0gMSkpIgkjIGZvciBjZWlsIHJv
dW5kaW5nIHRvIE1CCiMgaW1hZ2UgYW5kIC9ib290IHNpemVzIGluIG1lZ2FieXRlcwpST09U
U0laRU09IiQoKCRST09UU0laRSAvICRNQikpIgpCT09UU0laRU09IiQoKCgkU0laRV9GQUNU
T1IgKiAkQk9PVF9TSVpFX0ZBQ1RPUiAqICRCT09UU0laRSArICRNQiAtIDEpIC8gJE1CKSki
CgojIHRlc3RlZCB0byB3b3JrOiBleHRbMjM0XSwgamZzCiMgTkI6IHhmcyBkb2Vzbid0IGhh
dmUgYSBzcGFyZSBzZWN0b3IgZm9yIHRoZSBib290bG9hZGVyClJPT1RGU1RZUEU9IiR7NDot
ZXh0NH0iCgojIHNpbmdsZSByb290IHBhcnRpdGlvbiBoYXJkd2lyZWQgc28gZmFyLAojIGFk
ZCBhbm90aGVyIGltYWdlIGZvciBob21lL2RhdGEvc3dhcCBpZiBuZWVkZWQKUk9PVERFVj0i
JEJMT0NLREVWJFJPT1RQQVJUIgoKIyBsYXN0IHByZXBhcmF0aW9ucy4uLgpNS0ZTPSJta2Zz
LiRST09URlNUWVBFICR7Qk9PVEZTVFlQRTorbWtmcy4kQk9PVEZTVFlQRX0gXAogICR7RUZJ
UEFSVEZTVFlQRTorbWtmcy4kRUZJUEFSVEZTVFlQRX0iCmZvciBpIGluIGxvc2V0dXAgc2Zk
aXNrIHBhcnRlZCBrcGFydHggJE1LRlM7IGRvCglpZiAhIHR5cGUgLXQgIiRpIiA+Ji9kZXYv
bnVsbDsgdGhlbgoJCWZhdGFsICIkaSByZXF1aXJlZCBidXQgbm90IGZvdW5kIGluIGhvc3Qg
c3lzdGVtIgoJZmkKZG9uZQoKTE9PUERFVj0iJChsb3NldHVwIC0tZmluZCkiCSMgd291bGQg
YmUgc2FkIGFib3V0IG5vbi1iaW5hcnkgbWVnYWJ5dGVzIHRvbwpST09URlM9IiRXT1JLRElS
L2Nocm9vdCIKCkJPT1RGUz0KRUZJUEFSVEZTPQppZiBbIC1uICIkQk9PVFBBUlQiIF07IHRo
ZW4KCUJPT1RGUz0iJFJPT1RGUy9ib290IgpmaQppZiBbIC1uICIkRUZJUEFSVCIgXTsgdGhl
bgoJRUZJUEFSVEZTPSIkUk9PVEZTL2Jvb3QvZWZpIgpmaQoKZXhpdF9oYW5kbGVyKCkgewoJ
cmM9JD8KCWNkIC8KCWlmIFsgLW4gIiRST09URlMiIF07IHRoZW4KCQl1bW91bnQgJHtFRklQ
QVJURlM6KyIkRUZJUEFSVEZTIn0gJHtCT09URlM6KyIkQk9PVEZTIn0gXAoJCSAgIiRST09U
RlMiey9kZXYsL3Byb2MsL3N5cyx9CgoJCWlmIFsgLW4gIiRMT09QREVWIiBdOyB0aGVuCgkJ
CWtwYXJ0eCAtZCAtcyAiJExPT1BERVYiIHx8IHsKCQkJCXNsZWVwIDEwCgkJCQlrcGFydHgg
LWQgLXMgLXYgIiRMT09QREVWIgoJCQl9CgkJCWxvc2V0dXAgLS1kZXRhY2ggIiRMT09QREVW
IgoJCWZpCgkJcm0gLXIgLS0gIiRST09URlMiCgkJcm1kaXIgLS0gIiRXT1JLRElSIgoJZmkK
CWV4aXQgJHJjCn0KCiMgaGFuZGxlIC1lIGluIHNoZWJhbmcgYXMgd2VsbAp0cmFwIGV4aXRf
aGFuZGxlciBFWElUIEVSUgoKIyBwcmVwYXJlIGRpc2sgaW1hZ2UgYW5kIGEgZmlsZXN5c3Rl
bSBpbnNpZGUgaXQKcm0gLWYgLS0gIiRJTUciCk9GRlNFVD0iJCgoJENVUl9CT1VOREFSWSAr
ICRFRklQQVJUU0laRU0gKyAkQk9PVExPQURFUlBBUlRTSVpFTSArICRCT09UU0laRU0gKyAk
Uk9PVFNJWkVNIC0gMSkpIgpkZCBpZj0vZGV2L3plcm8gb2Y9IiRJTUciIGNvbnY9bm90cnVu
YyBicz0kTUIgY291bnQ9MSBzZWVrPSIkT0ZGU0VUIgpsb3NldHVwICIkTE9PUERFViIgIiRJ
TUciCgppZiBbICIkQk9PVExPQURFUiIgPT0gZ3J1Yi1lZmkgXTsgdGhlbgoJcGFydGluZyBt
a2xhYmVsIGdwdAplbHNlCglwYXJ0aW5nIG1rbGFiZWwgbXNkb3MKZmkKCmlmIFsgLW4gIiRC
T09UTE9BREVSUEFSVCIgXSAmJiBbIC1uICIkQk9PVExPQURFUlBBUlRTSVpFTSIgXTsgdGhl
bgoJY2FzZSAiJEFSQ0giIGluCgkJcHBjKikKCQkJcGFydGluZyBta3BhcnQgcHJpbWFyeSBl
eHQyIDIwNDhzICR7Qk9PVExPQURFUlBBUlRTSVpFTX1NCgkJCUNVUl9CT1VOREFSWT0iJCgo
JENVUl9CT1VOREFSWSArICRCT09UTE9BREVSUEFSVFNJWkVNKSkiCgkJCXBhcnRpbmcgc2V0
IDEgcHJlcCBvbgoJCQlwYXJ0aW5nIHNldCAxIGJvb3Qgb24KCQkJOzsKCWVzYWMKZmkKCmlm
IFsgLW4gIiRFRklQQVJUIiBdOyB0aGVuCglFRklERVY9IiRFRklERVYkRUZJUEFSVCIKCXBh
cnRpbmcgbWtwYXJ0IGZhdDMyIDIwNDhzICR7RUZJUEFSVFNJWkVNfU0KCUNVUl9CT1VOREFS
WT0iJCgoJENVUl9CT1VOREFSWSArICRFRklQQVJUU0laRU0pKSIKCXBhcnRpbmcgc2V0IDEg
Ym9vdCBvbgoJcGFydGluZyBzZXQgMSBlc3Agb24KZmkKCmlmIFsgLW4gIiRCT09UUEFSVCIg
XTsgdGhlbgoJQk9PVERFVj0iJEJMT0NLREVWJEJPT1RQQVJUIgoJbWtwYXJ0ICIkQk9PVFNJ
WkVNIgpmaQoKIyBub3QgUk9PVFNJWkVNIGJ1dCAidGhlIHJlc3QiOyBzb21ld2hhdCBub24t
dHJpdmlhbCBhcml0aG1ldGljcyBsdXJrIGluIHBhcnRlZApta3BhcnQKCmtwYXJ0eCAtYSAt
cyAiJExPT1BERVYiCkxPT1BST09UPSIvZGV2L21hcHBlci8kKGJhc2VuYW1lICIkTE9PUERF
ViIpcCRST09UUEFSVCIKCm1rZnMuIiRST09URlNUWVBFIiAiJExPT1BST09UIgoKaWYgWyAt
biAiJEJPT1RQQVJUIiBdOyB0aGVuCglMT09QQk9PVD0iL2Rldi9tYXBwZXIvJChiYXNlbmFt
ZSAiJExPT1BERVYiKXAkQk9PVFBBUlQiCglta2ZzLiIkQk9PVEZTVFlQRSIgIiRMT09QQk9P
VCIKZmkKCmlmIFsgLW4gIiRCT09UTE9BREVSUEFSVCIgXSAmJiBbIC1uICIkQk9PVExPQURF
UlBBUlRTSVpFTSIgXTsgdGhlbgoJTE9PUEJPT1RMT0FERVI9Ii9kZXYvbWFwcGVyLyQoYmFz
ZW5hbWUgIiRMT09QREVWIilwJEJPT1RMT0FERVJQQVJUIgpmaQoKaWYgWyAtbiAiJEVGSVBB
UlQiIF07IHRoZW4KCUxPT1BFRkk9Ii9kZXYvbWFwcGVyLyQoYmFzZW5hbWUgIiRMT09QREVW
IilwJEVGSVBBUlQiCglta2ZzLmZhdCAtRjMyICIkTE9PUEVGSSIKZmkKClJPT1RVVUlEPSIk
KGJsa2lkIC1zIFVVSUQgLW8gdmFsdWUgLWMgL2Rldi9udWxsICIkTE9PUFJPT1QiKSIKaWYg
WyAtbiAiJFJPT1RVVUlEIiBdOyB0aGVuCiAgICAgICBST09UREVWPSJVVUlEPSRST09UVVVJ
RCIKZWxzZQogICAgICAgUk9PVERFVj0iJExPT1BST09UIgpmaQoKaWYgWyAtbiAiJEJPT1RQ
QVJUIiBdOyB0aGVuCglCT09UVVVJRD0iJChibGtpZCAtcyBVVUlEIC1vIHZhbHVlIC1jIC9k
ZXYvbnVsbCAiJExPT1BCT09UIikiCglpZiBbIC1uICIkQk9PVFVVSUQiIF07IHRoZW4KCQlC
T09UREVWPSJVVUlEPSRCT09UVVVJRCIKCWZpCmZpCgppZiBbIC1uICIkRUZJUEFSVCIgXTsg
dGhlbgoJRUZJVVVJRD0iJChibGtpZCAtcyBVVUlEIC1vIHZhbHVlIC1jIC9kZXYvbnVsbCAi
JExPT1BFRkkiKSIKCWlmIFsgLW4gIiRFRklVVUlEIiBdOyB0aGVuCgkJRUZJREVWPSJVVUlE
PSRFRklVVUlEIgoJZmkKZmkKCiMgbW91bnQgYW5kIHBvcHVsYXRlIGl0Cm1rZGlyIC1wbTc1
NSAiJFJPT1RGUyIKbW91bnQgIiRMT09QUk9PVCIgIiRST09URlMiCgppZiBbIC1uICIkQk9P
VFBBUlQiIF07IHRoZW4KCW1rZGlyIC1wbTcwMCAiJEJPT1RGUyIKCW1vdW50ICIkTE9PUEJP
T1QiICIkQk9PVEZTIgpmaQoKaWYgWyAtbiAiJEVGSVBBUlQiIF07IHRoZW4KCW1rZGlyIC1w
bTc1MSAiJEVGSVBBUlRGUyIKCW1vdW50ICIkTE9PUEVGSSIgIiRFRklQQVJURlMiCmZpCgp0
YXIgLUMgIiRST09URlMiIC0tbnVtZXJpYy1vd25lciAteGYgIiRUQVIiCmZvciBpIGluIC9k
ZXYgL3Byb2MgL3N5czsgZG8gbW91bnQgLS1iaW5kICIkaSIgIiRST09URlMkaSI7IGRvbmUK
CiMgbG9vcCBkZXZpY2Ugc28gbGlsbyBjb3VsZCB3b3JrLi4uCmlmIGdyZXAgLXFlICJbWzpz
cGFjZTpdXS9bWzpzcGFjZTpdXSIgIiRST09URlMvZXRjL2ZzdGFiIjsgdGhlbiBcCglzZWQg
LWkgInMvTEFCRUw9Uk9PVC8kUk9PVERFVi8iICIkUk9PVEZTL2V0Yy9mc3RhYiIKZWxzZQoJ
ZWNobyAiJFJPT1RERVYgLyAkUk9PVEZTVFlQRSByZWxhdGltZSAxIDEiID4+ICIkUk9PVEZT
L2V0Yy9mc3RhYiIKZmkKCiMgdGFyZ2V0IGRldmljZSBhdCBvbmNlCmlmIFsgLW4gIiRCT09U
UEFSVCIgXTsgdGhlbgoJZWNobyAiJEJPT1RERVYgL2Jvb3QgJEJPT1RGU1RZUEUgZGVmYXVs
dHMgMSAyIiA+PiAiJFJPT1RGUy9ldGMvZnN0YWIiCmZpCmlmIFsgLW4gIiRFRklQQVJUIiBd
OyB0aGVuCgllY2hvICIkRUZJREVWIC9ib290L2VmaSB2ZmF0IHVtYXNrPTAscXVpZXQsc2hv
d2V4ZWMsaW9jaGFyc2V0PXV0ZjgsY29kZXBhZ2U9ODY2IDEgMiIgPj4gIiRST09URlMvZXRj
L2ZzdGFiIgpmaQoKIyBRdWVyeSBBUkNIIGluIGNocm9vdCBhbmQgcmVkZWZpbmUgYXJjaC1k
ZXBlbmRlbnQgdmFyaWFibGUKQVJDSD0iJChjaHJvb3QgIiRST09URlMiIHJwbSAtLWV2YWwg
JyVfaG9zdF9jcHUnKSIKCiMgTkI6IGRvbid0IHN0aWNrIEJPT1RGUyBoZXJlLCBpdCBoYXMg
c2xpZ2h0bHkgZGlmZmVyZW50IHNlbWFudGljcwpwdXNoZCAkUk9PVEZTL2Jvb3QKCiMgNC45
Ljc2LWVsYnJ1cy1kZWYtYWx0MS4xMS4xIC0+IGRlZgpnZXRfbGFiZWwoKSB7IGVjaG8gIiR7
MSMgKn0iIHwgc2VkIC1yICdzLC4qZWxicnVzLShbMC05YS16XSspLS4qJCxcMSwnOyB9CgpL
VkVSU0lPTlM9CktWRVJTSU9OUz0iJChjaHJvb3QgIiRST09URlMiIHJwbSAtcWEgJ2tlcm5l
bC1pbWFnZSonIFwKICAgICAgICAgICAgLS1xZiAnJXtpbnN0YWxsdGltZX0gJXt2ZXJzaW9u
fS0le25hbWV9LSV7cmVsZWFzZX1cbicgXAogICAgICAgIHwgc29ydCAtbiBcCiAgICAgICAg
fCBjdXQgLWYgMiAtZCAnICcgXAogICAgICAgIHwgc2VkICdzL2tlcm5lbC1pbWFnZS0vLycp
IgpbIC1uICIkS1ZFUlNJT05TIiBdIHx8IGZhdGFsICJ1bmFibGUgdG8gZGVkdWNlIGtlcm5l
bCB2ZXJzaW9uIgpybSAtZiAub3JpZ3ZlcgoKIyBjbGVhbiBmc3RhYgpzZWQgLWkgIi9MQUJF
TD1ST09UL2QiICIkUk9PVEZTL2V0Yy9mc3RhYiIKIyAuLi50YXJnZXQgZGV2aWNlIHRvbwpz
ZWQgLWkgInMsJExPT1BST09ULCRST09UREVWLCIgIiRST09URlMvZXRjL2ZzdGFiIgoKZWNo
byAiKiogS1ZFUlNJT05TPVskS1ZFUlNJT05TXSIgPiYyCgppZiBbICJgZWNobyAkS1ZFUlNJ
T05TIHwgd2MgLXdgIiA9IDEgXTsgdGhlbiAjIDIrIGxhYmVscwoJZWNobyAtZSAiZGVmYXVs
dD1gZ2V0X2xhYmVsICRLVkVSU0lPTlNgXG4iID4+IGJvb3QuY29uZgpmaQoKIyBGSVhNRTog
cmVsaWVzIG9uIHBhcnRpY3VsYXIgKGN1cnJlbnQpIGtlcm5lbCBwYWNrYWdlIG5hbWluZyBz
Y2hlbWUKZm9yIHYgaW4gJEtWRVJTSU9OUzsgZG8KCWw9ImBnZXRfbGFiZWwgIiR2ImAiCglj
YXQgPj4gYm9vdC5jb25mIDw8RU9GCmxhYmVsPSRsCglwYXJ0aXRpb249MAoJaW1hZ2U9L2lt
YWdlLSR2Cglpbml0cmQ9L2luaXRyZC0kdi5pbWcKCWNtZGxpbmU9Y29uc29sZT10dHlTMCwx
MTUyMDAgY29uc29sZT10dHkwIGNvbnNvbGVibGFuaz0wIGhhcmRyZXNldCByb290PVVVSUQ9
JFJPT1RVVUlECgpFT0YKZG9uZQoKZWNobyAiKiogc3RhcnQgb2YgYm9vdC5jb25mIgpjYXQg
Ym9vdC5jb25mCmVjaG8gIioqIGVuZCBvZiBib290LmNvbmYiCgpwb3BkCgojIFNldHVwIGJv
b3Rsb2FkZXIKY2FzZSAiJEJPT1RMT0FERVIiIGluCnVib290KQoJRVhUTElOVVhfQ09ORj0i
JFJPT1RGUy9ib290L2V4dGxpbnV4L2V4dGxpbnV4LmNvbmYiCglzZWQgLWkgInMvTEFCRUw9
Uk9PVC8kUk9PVERFVi9nIiAiJEVYVExJTlVYX0NPTkYiCgk7OwpsaWxvKQoJIyBjb25maWd1
cmUgYW5kIGluc3RhbGwgYm9vdGxvYWRlcgoJUkVHRVhQPSdeLio6IChbMC05XSspIGN5bGlu
ZGVycywgKFswLTldKykgaGVhZHMsIChbMC05XSspIHNlY3RvcnMvdHJhY2sqJCcKCXNldCAt
LSAkKHNmZGlzayAtZyAiJExPT1BERVYiIHwgZ3JlcCAtRSAiJFJFR0VYUCIgfCBzZWQgLXIg
InNAJFJFR0VYUEBcMSBcMiBcM0AiKQoKCUxJTE9fQ09NTU9OPSJsYmEzMgpkZWxheT0xCnZn
YT0wCmltYWdlPS9ib290L3ZtbGludXoKICBpbml0cmQ9L2Jvb3QvaW5pdHJkLmltZwogIGFw
cGVuZD1cInJvb3Q9JFJPT1RERVYgcm9vdGRlbGF5PTMgY29uc29sZT10dHkxIGNvbnNvbGU9
dHR5UzAsMTE1MjAwbjhcIgogIGxhYmVsPWxpbnV4IgoKCWNhdCA+ICIkUk9PVEZTIi9ldGMv
bGlsby1sb29wLmNvbmYgPDwtRU9GCglib290PSRMT09QREVWCglkaXNrPSRMT09QREVWCgkg
IGJpb3M9MHg4MAoJICBjeWxpbmRlcnM9JDEKCSAgaGVhZHM9JDIKCSAgc2VjdG9ycz0kMwoJ
ICBwYXJ0aXRpb249JExPT1BST09UCgkgIHN0YXJ0PTYzCgkkTElMT19DT01NT04KCUVPRgoK
CWNocm9vdCAiJFJPT1RGUyIgbGlsbyAtQyAvZXRjL2xpbG8tbG9vcC5jb25mCgoJY2F0ID4g
IiRST09URlMiL2V0Yy9saWxvLmNvbmYgPDwtRU9GCglib290PSRCTE9DS0RFVgoJJExJTE9f
Q09NTU9OCglFT0YKCTs7CmdydWItZWZpKQoJY2hyb290ICIkUk9PVEZTIiBncnViLW1rY29u
ZmlnIC1vIC9ib290L2dydWIvZ3J1Yi5jZmcKCWNhc2UgIiRBUkNIIiBpbgoJCSo4NikKCQkJ
Y2hyb290ICIkUk9PVEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9aTM4Ni1lZmkgLS1yZW1v
dmFibGUKCQkJc2VkIC1pICdzL2luaXRyZDE2L2luaXRyZGVmaS9nJyAiJFJPT1RGUy9ib290
L2dydWIvZ3J1Yi5jZmciCgkJCXNlZCAtaSAncy9saW51eDE2L2xpbnV4ZWZpL2cnICIkUk9P
VEZTL2Jvb3QvZ3J1Yi9ncnViLmNmZyIKCQk7OwoJCXg4Nl82NCkKCQkJY2hyb290ICIkUk9P
VEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9aTM4Ni1lZmkgLS1yZW1vdmFibGUKCQkJY2hy
b290ICIkUk9PVEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9eDg2XzY0LWVmaSAtLXJlbW92
YWJsZQoJCQlzZWQgLWkgJ3MvaW5pdHJkMTYvaW5pdHJkZWZpL2cnICIkUk9PVEZTL2Jvb3Qv
Z3J1Yi9ncnViLmNmZyIKCQkJc2VkIC1pICdzL2xpbnV4MTYvbGludXhlZmkvZycgIiRST09U
RlMvYm9vdC9ncnViL2dydWIuY2ZnIgoJCTs7CgkJYWFyY2g2NCkKCQkJY2hyb290ICIkUk9P
VEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9YXJtNjQtZWZpIC0tcmVtb3ZhYmxlCgkJOzsK
CQlhcm1oKQoJCQljaHJvb3QgIiRST09URlMiIGdydWItaW5zdGFsbCAtLXRhcmdldD1hcm0t
ZWZpIC0tcmVtb3ZhYmxlCgkJOzsKCWVzYWMKCTs7CmdydWIpCgljaHJvb3QgIiRST09URlMi
IGdydWItbWtjb25maWcgLW8gL2Jvb3QvZ3J1Yi9ncnViLmNmZwoJY2FzZSAiJEFSQ0giIGlu
CgkJKjg2KikKCQkJY2hyb290ICIkUk9PVEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9aTM4
Ni1wYyAiJExPT1BERVYiCgkJCXNlZCAtaSAncy9pbml0cmRlZmkvaW5pdHJkMTYvZycgIiRS
T09URlMvYm9vdC9ncnViL2dydWIuY2ZnIgoJCQlzZWQgLWkgJ3MvbGludXhlZmkvbGludXgx
Ni9nJyAiJFJPT1RGUy9ib290L2dydWIvZ3J1Yi5jZmciCgkJCTs7CgkJcHBjKikKCQkJWyAt
eiAiJExPT1BCT09UTE9BREVSIiBdIHx8CgkJCQljaHJvb3QgIiRST09URlMiIGdydWItaW5z
dGFsbCAtLXRhcmdldD1wb3dlcnBjLWllZWUxMjc1IFwKCQkJCS0tbm8tbnZyYW0gIiRMT09Q
Qk9PVExPQURFUiIKCQkJOzsKCWVzYWMKCTs7CmVzYWMKCmlmIFsgLW4gIiRTVURPX1VTRVIi
IF07IHRoZW4KCWNob3duICIkU1VET19VU0VSOiQoaWQgLWcgIiRTVURPX1VTRVIiKSIgIiRJ
TUciIHx8OgpmaQojIG1heWJlIHFlbXUgaW50ZXJwcmV0ZXIgd2FzIGNvcGllZCB0byBjaHJv
b3Q7CiMgdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LCByZW1vdmUKcm0gLXJmICIkUk9P
VEZTIi8uaG9zdCB8fDoK
--------------A1FCB4F734D5A2EC97FD6110--


More information about the devel-distro mailing list