ALT Linux Distributions development
 help / color / mirror / Atom feed
* [devel-distro] tar2fs: добавлена поддержка grub-efi
@ 2019-12-18 20:24 Антон Мидюков
  2019-12-19 21:54 ` Leonid Krivoshein
  2020-01-15 13:55 ` Антон Мидюков
  0 siblings, 2 replies; 7+ messages in thread
From: Антон Мидюков @ 2019-12-18 20:24 UTC (permalink / raw)
  To: devel-distro

[-- Attachment #1: Type: text/plain, Size: 1867 bytes --]

Доброго времени суток!

Пару дней назад добавил в tar2fs из комплекта mkimage-profiles поддержку 
grub-efi. До этого она была в зачаточном состоянии.

Для того, чтобы собрать vm/target.img с grub-efi, необходимо вызвать 
цель /use/efi/grub. которая установит EFI_BOOTLOADER в grub-efi.

Изменения:

1. tar2fs для BOOTLOADER=grub-efi создаёт таблицу разделов GPT. Но, 
оказывается, можно и msdos оставить, тоже должно грузиться

2. Создаётся раздел EFI размером 256 МБ

3. Для того, чтобы грузилось без записей в nvram, установка производится 
командой:

grub-install --target=<target> --removable

4. Для x86_64 устанавливается ещё и 32-битный EFI загрузчик

5. sed'ом исправляется initrd16 на inirdefi для grub-efi и наоборот для 
grub-pc. Это изменение необходимо, чтобы получать рабочий конфиг для 
grub-pc на системах с EFI и для grub-efi на системах без EFI.

6. Можно собирать также и для aarch64. Моя сборка зависла на этапе 
загрузки initrd, так что grub, вероятно, получился рабочий. А x86_64 
сборки успешно грузятся в режиме EFI.

Во вложении как патч, так и сам tar2fs, так как tar2fs может 
использоваться и отдельно от mkimage-profiles.

-- 
С уважением, Антон Мидюков <antohami@altlinux.org>


[-- Attachment #2: 0001-tar2fs-add-support-efi.patch --]
[-- Type: text/x-patch, Size: 5888 bytes --]

>From bf7b18bbfc96943b3b777d6a9553528792dbeca6 Mon Sep 17 00:00:00 2001
From: Anton Midyukov <antohami@altlinux.org>
Date: Tue, 17 Dec 2019 15:03:11 +0700
Subject: [PATCH] tar2fs: add support efi

---
 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


[-- Attachment #3: tar2fs --]
[-- Type: text/plain, Size: 10545 bytes --]

#!/bin/bash -ex
# usage:
# tar2fs chroot.tar image.raw [size_in_bytes [fstype]]

. shell-error
export LANG=C

if [ $# -lt 2 ]; then
	fatal "error: tar2fs needs at least two arguments"
fi

# this needs env_keep sudo setup to actually work
if [ -n "$GLOBAL_BUILDDIR" ]; then
	WORKDIR="$GLOBAL_BUILDDIR/vmroot"
else
	WORKDIR="$(mktemp --tmpdir -d vmroot-XXXXX)"
fi

[ -n "$WORKDIR" ] || fatal "couldn't come up with suitable WORKDIR"

[ -n "$GLOBAL_DEBUG" ] || message "WORKDIR: $WORKDIR"

MB=1048576		# a parted's "megabyte" in bytes is *broken*

SIZE_FACTOR=2		# multiply the sizes found by this value
BOOT_SIZE_FACTOR=2	# multiply /boot size by this value additionally
BOOTLOADERPARTSIZEM=0	# PReP partition size (ppc*)

CUR_BOUNDARY=0		# align first partition at 1MB for performance (+1)

BOOTFSTYPE=
BOOTPART=
EFIPARTFSTYPE=
EFIPART=

BOOTLOADER="$5"

ARCH="$(arch)"		# NB: sudo => no GLOBAL_ will do either; mind qemu-*

case "$ARCH" in
e2k)
	BOOTFSTYPE="ext2"       # firmware knows it
	BLOCKDEV="/dev/sda"     # ...hopefully...
	BOOTPART="1"
	ROOTPART="2"
	;;
ppc*)
	BOOTFSTYPE="ext4"
	BLOCKDEV="/dev/sda"
	BOOTLOADERPART="1"
	BOOTLOADERPARTSIZEM="8"
	ROOTPART="2"
	;;
*)
	if [ "$BOOTLOADER" == grub-efi ]; then
		EFIPART="1"
		EFIPARTSIZEM="256"
		EFIPARTFSTYPE="fat"
		ROOTPART="2"
	else
		ROOTPART="1"
	fi
	BLOCKDEV="/dev/sda"
	;;
esac

# figure out the part taken by /boot in the given tarball
boot_size() {
	if [ -n "$BOOTPART" ]; then
		tar tvf "$1" \
		| awk ' \
			BEGIN { sum=0 }
			/^-.* \.\/boot\// { sum=sum+$3 }
			END { print sum }'
	else
		echo "0"
	fi
}

# parted wrapper for convenience
parting() { parted "$LOOPDEV" --align optimal --script -- "$@"; }

# unfortunately parted is insane enough to lump alignment controls
# into unit controls so creating adjacent partitions sized in MiB
# is not as straightforward as it might be... thus "+1" padding;
# see also http://www.gnu.org/software/parted/manual/parted.html#unit
mkpart() {
	# a bit different start/end semantics to handle end of device too
	local start="$(($CUR_BOUNDARY + 1))"	# yes, we lose a megabyte
	if [ -n "$1" ]; then
		CUR_BOUNDARY="$(($start + $1))"
		local end="$CUR_BOUNDARY"MiB
	else
		local end="$OFFSET"MiB	# last sector of the image
	fi
	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
TAR="$1"
[ -s "$TAR" ] || fatal "source tarball doesn't really exist"

# a path to the image to be generated
IMG="$2"
[ -d "$(dirname "$IMG")" ] || fatal "target directory doesn't exist"

# 0 means auto; if a value is specified it holds (no /boot subtracted)
ROOTSIZE="$3"
[ -n "$ROOTSIZE" -a "$ROOTSIZE" != 0 ] || unset ROOTSIZE

# image size in bytes
TARSIZE="$(stat -Lc %s "$TAR")"
# /boot size in that tarball
BOOTSIZE="$(boot_size "$TAR")"
DEFSIZE="$(($SIZE_FACTOR * ($TARSIZE - $BOOTSIZE)))"	# (exact sizes)
ROOTSIZE="$((${ROOTSIZE:-$DEFSIZE} + $MB - 1))"	# for ceil rounding to MB
# image and /boot sizes in megabytes
ROOTSIZEM="$(($ROOTSIZE / $MB))"
BOOTSIZEM="$((($SIZE_FACTOR * $BOOT_SIZE_FACTOR * $BOOTSIZE + $MB - 1) / $MB))"

# tested to work: ext[234], jfs
# NB: xfs doesn't have a spare sector for the bootloader
ROOTFSTYPE="${4:-ext4}"

# single root partition hardwired so far,
# add another image for home/data/swap if needed
ROOTDEV="$BLOCKDEV$ROOTPART"

# last preparations...
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"
	fi
done

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 ${EFIPARTFS:+"$EFIPARTFS"} ${BOOTFS:+"$BOOTFS"} \
		  "$ROOTFS"{/dev,/proc,/sys,}

		if [ -n "$LOOPDEV" ]; then
			kpartx -d -s "$LOOPDEV" || {
				sleep 10
				kpartx -d -s -v "$LOOPDEV"
			}
			losetup --detach "$LOOPDEV"
		fi
		rm -r -- "$ROOTFS"
		rmdir -- "$WORKDIR"
	fi
	exit $rc
}

# handle -e in shebang as well
trap exit_handler EXIT ERR

# prepare disk image and a filesystem inside it
rm -f -- "$IMG"
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"

if [ "$BOOTLOADER" == grub-efi ]; then
	parting mklabel gpt
else
	parting mklabel msdos
fi

if [ -n "$BOOTLOADERPART" ] && [ -n "$BOOTLOADERPARTSIZEM" ]; then
	case "$ARCH" in
		ppc*)
			parting mkpart primary ext2 2048s ${BOOTLOADERPARTSIZEM}M
			CUR_BOUNDARY="$(($CUR_BOUNDARY + $BOOTLOADERPARTSIZEM))"
			parting set 1 prep on
			parting set 1 boot on
			;;
	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"
fi

# not ROOTSIZEM but "the rest"; somewhat non-trivial arithmetics lurk in parted
mkpart

kpartx -a -s "$LOOPDEV"
LOOPROOT="/dev/mapper/$(basename "$LOOPDEV")p$ROOTPART"

mkfs."$ROOTFSTYPE" "$LOOPROOT"

if [ -n "$BOOTPART" ]; then
	LOOPBOOT="/dev/mapper/$(basename "$LOOPDEV")p$BOOTPART"
	mkfs."$BOOTFSTYPE" "$LOOPBOOT"
fi

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"
else
       ROOTDEV="$LOOPROOT"
fi

if [ -n "$BOOTPART" ]; then
	BOOTUUID="$(blkid -s UUID -o value -c /dev/null "$LOOPBOOT")"
	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"

if [ -n "$BOOTPART" ]; then
	mkdir -pm700 "$BOOTFS"
	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

# loop device so lilo could work...
if grep -qe "[[:space:]]/[[:space:]]" "$ROOTFS/etc/fstab"; then \
	sed -i "s/LABEL=ROOT/$ROOTDEV/" "$ROOTFS/etc/fstab"
else
	echo "$ROOTDEV / $ROOTFSTYPE relatime 1 1" >> "$ROOTFS/etc/fstab"
fi

# target device at once
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')"

# NB: don't stick BOOTFS here, it has slightly different semantics
pushd $ROOTFS/boot

# 4.9.76-elbrus-def-alt1.11.1 -> def
get_label() { echo "${1# *}" | sed -r 's,.*elbrus-([0-9a-z]+)-.*$,\1,'; }

KVERSIONS=
KVERSIONS="$(chroot "$ROOTFS" rpm -qa 'kernel-image*' \
            --qf '%{installtime} %{version}-%{name}-%{release}\n' \
        | sort -n \
        | cut -f 2 -d ' ' \
        | sed 's/kernel-image-//')"
[ -n "$KVERSIONS" ] || fatal "unable to deduce kernel version"
rm -f .origver

# clean fstab
sed -i "/LABEL=ROOT/d" "$ROOTFS/etc/fstab"
# ...target device too
sed -i "s,$LOOPROOT,$ROOTDEV," "$ROOTFS/etc/fstab"

echo "** KVERSIONS=[$KVERSIONS]" >&2

if [ "`echo $KVERSIONS | wc -w`" = 1 ]; then # 2+ labels
	echo -e "default=`get_label $KVERSIONS`\n" >> boot.conf
fi

# FIXME: relies on particular (current) kernel package naming scheme
for v in $KVERSIONS; do
	l="`get_label "$v"`"
	cat >> boot.conf <<EOF
label=$l
	partition=0
	image=/image-$v
	initrd=/initrd-$v.img
	cmdline=console=ttyS0,115200 console=tty0 consoleblank=0 hardreset root=UUID=$ROOTUUID

EOF
done

echo "** start of boot.conf"
cat boot.conf
echo "** end of boot.conf"

popd

# Setup bootloader
case "$BOOTLOADER" in
uboot)
	EXTLINUX_CONF="$ROOTFS/boot/extlinux/extlinux.conf"
	sed -i "s/LABEL=ROOT/$ROOTDEV/g" "$EXTLINUX_CONF"
	;;
lilo)
	# configure and install bootloader
	REGEXP='^.*: ([0-9]+) cylinders, ([0-9]+) heads, ([0-9]+) sectors/track*$'
	set -- $(sfdisk -g "$LOOPDEV" | grep -E "$REGEXP" | sed -r "s@$REGEXP@\1 \2 \3@")

	LILO_COMMON="lba32
delay=1
vga=0
image=/boot/vmlinuz
  initrd=/boot/initrd.img
  append=\"root=$ROOTDEV rootdelay=3 console=tty1 console=ttyS0,115200n8\"
  label=linux"

	cat > "$ROOTFS"/etc/lilo-loop.conf <<-EOF
	boot=$LOOPDEV
	disk=$LOOPDEV
	  bios=0x80
	  cylinders=$1
	  heads=$2
	  sectors=$3
	  partition=$LOOPROOT
	  start=63
	$LILO_COMMON
	EOF

	chroot "$ROOTFS" lilo -C /etc/lilo-loop.conf

	cat > "$ROOTFS"/etc/lilo.conf <<-EOF
	boot=$BLOCKDEV
	$LILO_COMMON
	EOF
	;;
grub-efi)
	chroot "$ROOTFS" grub-mkconfig -o /boot/grub/grub.cfg
	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" ] ||
				chroot "$ROOTFS" grub-install --target=powerpc-ieee1275 \
				--no-nvram "$LOOPBOOTLOADER"
			;;
	esac
	;;
esac

if [ -n "$SUDO_USER" ]; then
	chown "$SUDO_USER:$(id -g "$SUDO_USER")" "$IMG" ||:
fi
# maybe qemu interpreter was copied to chroot;
# this is no longer necessary, remove
rm -rf "$ROOTFS"/.host ||:

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel-distro] tar2fs: добавлена поддержка grub-efi
  2019-12-18 20:24 [devel-distro] tar2fs: добавлена поддержка grub-efi Антон Мидюков
@ 2019-12-19 21:54 ` Leonid Krivoshein
  2019-12-20  3:52   ` Антон Мидюков
  2020-01-15 13:55 ` Антон Мидюков
  1 sibling, 1 reply; 7+ messages in thread
From: Leonid Krivoshein @ 2019-12-19 21:54 UTC (permalink / raw)
  To: devel-distro

Привет!


18.12.2019 23:24, Антон Мидюков пишет:
> 3. Для того, чтобы грузилось без записей в nvram, установка 
> производится командой:
>
> grub-install --target=<target> --removable 


--no-nvram
               don't update the `boot-device'/`Boot*' NVRAM variables. 
This option is only available on EFI and IEEE1275 targets.

--removable
               the installation device is removable. This option is only 
available on EFI.


-- 
Best regards,
Leonid Krivoshein.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel-distro] tar2fs: добавлена поддержка grub-efi
  2019-12-19 21:54 ` Leonid Krivoshein
@ 2019-12-20  3:52   ` Антон Мидюков
  2019-12-20 16:24     ` Leonid Krivoshein
  0 siblings, 1 reply; 7+ messages in thread
From: Антон Мидюков @ 2019-12-20  3:52 UTC (permalink / raw)
  To: devel-distro

20.12.2019 4:54, Leonid Krivoshein пишет:
>
> 18.12.2019 23:24, Антон Мидюков пишет:
>> 3. Для того, чтобы грузилось без записей в nvram, установка 
>> производится командой:
>>
>> grub-install --target=<target> --removable 
>
>
> --no-nvram
>               don't update the `boot-device'/`Boot*' NVRAM variables. 
> This option is only available on EFI and IEEE1275 targets.
Используя --no-nvram, придётся прописывать в nvram или выбирать руками 
загрузчик при загрузке.
>
> --removable
>               the installation device is removable. This option is 
> only available on EFI.
>
а с --removable ничего больше делать не надо :-) Но это для случая, 
когда на носителе будет лишь одна ОС.

-- 
С уважением, Антон Мидюков <antohami@altlinux.org>



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel-distro] tar2fs: добавлена поддержка grub-efi
  2019-12-20  3:52   ` Антон Мидюков
@ 2019-12-20 16:24     ` Leonid Krivoshein
  2019-12-20 16:47       ` Антон Мидюков
  0 siblings, 1 reply; 7+ messages in thread
From: Leonid Krivoshein @ 2019-12-20 16:24 UTC (permalink / raw)
  To: devel-distro


20.12.2019 6:52, Антон Мидюков пишет:
> 20.12.2019 4:54, Leonid Krivoshein пишет:
>>
>> 18.12.2019 23:24, Антон Мидюков пишет:
>>> 3. Для того, чтобы грузилось без записей в nvram, установка 
>>> производится командой:
>>>
>>> grub-install --target=<target> --removable 
>>
>>
>> --no-nvram
>>               don't update the `boot-device'/`Boot*' NVRAM variables. 
>> This option is only available on EFI and IEEE1275 targets.
> Используя --no-nvram, придётся прописывать в nvram или выбирать руками 
> загрузчик при загрузке.
>>
>> --removable
>>               the installation device is removable. This option is 
>> only available on EFI.
>>
> а с --removable ничего больше делать не надо :-) Но это для случая, 
> когда на носителе будет лишь одна ОС.
>

Да, он просто кладёт загрузчик под именем 
/boot/efi/EFI/BOOT/bootx64.efi, а не grubx64.efi. Просто с --removable и 
список GRUB'овских модулей может быть другой, хотя и не уверен.


-- 
Best regards,
Leonid Krivoshein.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel-distro] tar2fs: добавлена поддержка grub-efi
  2019-12-20 16:24     ` Leonid Krivoshein
@ 2019-12-20 16:47       ` Антон Мидюков
  0 siblings, 0 replies; 7+ messages in thread
From: Антон Мидюков @ 2019-12-20 16:47 UTC (permalink / raw)
  To: devel-distro

20.12.2019 23:24, Leonid Krivoshein пишет:
>
> 20.12.2019 6:52, Антон Мидюков пишет:
>> 20.12.2019 4:54, Leonid Krivoshein пишет:
>>>
>>> 18.12.2019 23:24, Антон Мидюков пишет:
>>>> 3. Для того, чтобы грузилось без записей в nvram, установка 
>>>> производится командой:
>>>>
>>>> grub-install --target=<target> --removable 
>>>
>>>
>>> --no-nvram
>>>               don't update the `boot-device'/`Boot*' NVRAM 
>>> variables. This option is only available on EFI and IEEE1275 targets.
>> Используя --no-nvram, придётся прописывать в nvram или выбирать 
>> руками загрузчик при загрузке.
>>>
>>> --removable
>>>               the installation device is removable. This option is 
>>> only available on EFI.
>>>
>> а с --removable ничего больше делать не надо :-) Но это для случая, 
>> когда на носителе будет лишь одна ОС.
>>
>
> Да, он просто кладёт загрузчик под именем 
> /boot/efi/EFI/BOOT/bootx64.efi, а не grubx64.efi. Просто с --removable 
> и список GRUB'овских модулей может быть другой, хотя и не уверен.
>
Надо будет сравнить, значит.

-- 
С уважением, Антон Мидюков <antohami@altlinux.org>



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel-distro] tar2fs: добавлена поддержка grub-efi
  2019-12-18 20:24 [devel-distro] tar2fs: добавлена поддержка grub-efi Антон Мидюков
  2019-12-19 21:54 ` Leonid Krivoshein
@ 2020-01-15 13:55 ` Антон Мидюков
  2020-01-15 13:57   ` Антон Мидюков
  1 sibling, 1 reply; 7+ messages in thread
From: Антон Мидюков @ 2020-01-15 13:55 UTC (permalink / raw)
  To: devel-distro

19.12.2019 3:24, Антон Мидюков пишет:
>
> 3. Для того, чтобы грузилось без записей в nvram, установка 
> производится командой:
>
> grub-install --target=<target> --removable
>
Выяснил интересный момент. Если устанавливать одновременно с опциями 
--removable и --uefi-secure-boot, то не грузится. Погуглил, не только у 
нас так не работает. Похоже, так делать нельзя.

А в текущем виде подходит только для небезопасной загрузки, что впрочем 
для виртуальных машин вполне нормально.

И всё же у меня вопрос, что лучше:

1. Как сейчас, чтобы из коробки грузилось, но только с отключенным 
secure boot?

2. или же устанавливать с параметрами --uefi-secure-boot --no-nvram? 
Тогда придётся руками прописывать в nvram, но и с включенным secure boot 
должно грузиться.

3. Или попробовать реализовать сборку подписанного загрузчика, как это 
делается в mkimage-profiles?

> 5. sed'ом исправляется initrd16 на inirdefi для grub-efi и наоборот 
> для grub-pc. Это изменение необходимо, чтобы получать рабочий конфиг 
> для grub-pc на системах с EFI и для grub-efi на системах без EFI.
Тут нужно добавить, что если собирать на системе без EFI не добавляется 
пункт System setup, и наоборот при сборке на системе с EFI этот пункт 
добавляется для grub-pc. Также при сборке для aarch64 этот пункт не 
добавляется всегда, так как сборка проходит в qemu без EFI. Вот такие 
вот недостатки, однако.

-- 
С уважением, Антон Мидюков <antohami@altlinux.org>



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel-distro] tar2fs: добавлена поддержка grub-efi
  2020-01-15 13:55 ` Антон Мидюков
@ 2020-01-15 13:57   ` Антон Мидюков
  0 siblings, 0 replies; 7+ messages in thread
From: Антон Мидюков @ 2020-01-15 13:57 UTC (permalink / raw)
  To: devel-distro


15.01.2020 20:55, Антон Мидюков пишет:
>
> 3. Или попробовать реализовать сборку подписанного загрузчика, как это 
> делается в mkimage-profiles?
В mkimage, конечно же, в tools/mki-copy-efiboot

-- 
С уважением, Антон Мидюков <antohami@altlinux.org>



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-01-15 13:57 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-18 20:24 [devel-distro] tar2fs: добавлена поддержка grub-efi Антон Мидюков
2019-12-19 21:54 ` Leonid Krivoshein
2019-12-20  3:52   ` Антон Мидюков
2019-12-20 16:24     ` Leonid Krivoshein
2019-12-20 16:47       ` Антон Мидюков
2020-01-15 13:55 ` Антон Мидюков
2020-01-15 13:57   ` Антон Мидюков

ALT Linux Distributions development

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel-distro/0 devel-distro/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel-distro devel-distro/ http://lore.altlinux.org/devel-distro \
		devel-distro@lists.altlinux.org devel-distro@lists.altlinux.ru devel-distro@lists.altlinux.com
	public-inbox-index devel-distro

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel-distro


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git