Skip to content
Snippets Groups Projects
Commit e47d253f authored by Timo Teräs's avatar Timo Teräs
Browse files

scripts/mkimage: preparation for efi boot in iso images

not enabled yet, but uncommenting the grub_mod should enable
building of isolinux+grubefi hybrid images. once uefi boot works
and is verified on aarch64, we can enable the vanilla iso image
(grsec does not support aarch64).
parent 0a56fcdb
No related branches found
No related tags found
No related merge requests found
#!/bin/sh
# apk add abuild apk-tools alpine-conf busybox fakeroot xorriso
# apk add \
# abuild apk-tools alpine-conf busybox fakeroot syslinux xorriso
# (for efi:) mtools dosfstools grub-efi
# FIXME: clean workdir out of unneeded sections
# FIXME: --release: cp/mv images to REPODIR/$ARCH/releases/
......@@ -55,7 +57,7 @@ usage() {
$0 [--tag RELEASE] [--outdir OUTDIR] [--workdir WORKDIR]
[--arch ARCH] [--profile PROFILE] [--hostkeys] [--simulate]
[--yaml FILE]
[--repository REPO] [--yaml FILE]
$0 --help
options:
......@@ -64,6 +66,7 @@ options:
--hostkeys Copy system apk signing keys to created images
--outdir Specify directory for the created images
--profile Specify which profiles to build
--repository Add package repository to use for the image
--simulate Don't execute commands
--tag Build images for tag RELEASE
--workdir Specify temporary working directory (cache)
......
......@@ -74,13 +74,14 @@ build_syslinux() {
local _fn
mkdir -p "$DESTDIR"/boot/syslinux
apk fetch --root "$APKROOT" --stdout syslinux | tar -C "$DESTDIR" -xz usr/share/syslinux
for _fn in isolinux.bin ldlinux.c32 libutil.c32 libcom32.c32 mboot.c32; do
for _fn in isohdpfx.bin isolinux.bin ldlinux.c32 libutil.c32 libcom32.c32 mboot.c32; do
mv "$DESTDIR"/usr/share/syslinux/$_fn "$DESTDIR"/boot/syslinux/$_fn || return 1
done
rm -rf "$DESTDIR"/usr
}
section_syslinux() {
[ "$ARCH" = x86 -o "$ARCH" = x86_64 ] || return 0
[ "$output_format" = "iso" ] || return 0
build_section syslinux $(apk fetch --root "$APKROOT" --simulate syslinux | sort | checksum)
}
......@@ -94,27 +95,41 @@ syslinux_gen_config() {
local _f
for _f in $kernel_flavors; do
if [ -z "${xen_params+set}" ]; then
cat <<EOF
LABEL $_f
MENU LABEL Linux $_f
KERNEL /boot/vmlinuz-$_f
INITRD /boot/initramfs-$_f
DEVICETREEDIR /boot/dtbs
APPEND $initfs_cmdline $kernel_cmdline
EOF
cat <<- EOF
LABEL $_f
MENU LABEL Linux $_f
KERNEL /boot/vmlinuz-$_f
INITRD /boot/initramfs-$_f
DEVICETREEDIR /boot/dtbs
APPEND $initfs_cmdline $kernel_cmdline
EOF
else
cat <<EOF
cat <<- EOF
LABEL $_f
MENU LABEL Xen/Linux $_f
KERNEL /boot/syslinux/mboot.c32
APPEND /boot/xen.gz ${xen_params} --- /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline --- /boot/initramfs-$_f
EOF
LABEL $_f
MENU LABEL Xen/Linux $_f
KERNEL /boot/syslinux/mboot.c32
APPEND /boot/xen.gz ${xen_params} --- /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline --- /boot/initramfs-$_f
EOF
fi
done
}
grub_gen_config() {
local _f
echo "set timeout=2"
for _f in $kernel_flavors; do
cat <<- EOF
menuentry "Linux $_f" {
linux /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline
initrd /boot/initramfs-$_f
}
EOF
done
}
build_syslinux_cfg() {
local syslinux_cfg="$1"
mkdir -p "${DESTDIR}/$(dirname $syslinux_cfg)"
......@@ -123,27 +138,123 @@ build_syslinux_cfg() {
section_syslinux_cfg() {
syslinux_cfg=""
[ ! "$output_format" = "iso" ] || syslinux_cfg="boot/syslinux/syslinux.cfg"
if [ "$ARCH" = x86 -o "$ARCH" = x86_64 ]; then
[ ! "$output_format" = "iso" ] || syslinux_cfg="boot/syslinux/syslinux.cfg"
fi
[ ! -n "$uboot_install" ] || syslinux_cfg="extlinux/extlinux.conf"
[ -n "$syslinux_cfg" ] || return 0
build_section syslinux_cfg $syslinux_cfg $(syslinux_gen_config | checksum)
}
build_grub_cfg() {
local grub_cfg="$1"
mkdir -p "${DESTDIR}/$(dirname $grub_cfg)"
grub_gen_config > "${DESTDIR}"/$grub_cfg
}
grub_gen_earlyconf() {
cat <<- EOF
search --no-floppy --set=root --label "alpine-$PROFILE $RELEASE $ARCH"
set prefix=(\$root)/boot/grub
EOF
}
build_grubefi_img() {
local _format="$1"
local _efi="$2"
local _tmpdir="$WORKDIR/efiboot.$3"
# Prepare grub-efi bootloader
mkdir -p "$_tmpdir/efi/boot"
grub_gen_earlyconf > "$_tmpdir"/grub_early.cfg
grub-mkimage \
--config="$_tmpdir"/grub_early.cfg \
--prefix="/boot/grub" \
--output="$_tmpdir/efi/boot/$_efi" \
--format="$_format" \
--compression="xz" \
$grub_mod
# Create the EFI image
# mkdosfs and mkfs.vfat are busybox applets which failed to create a proper image
# use dosfstools mkfs.fat instead
mkdir -p ${DESTDIR}/boot/grub/
dd if=/dev/zero of=${DESTDIR}/boot/grub/efiboot.img bs=1K count=1440
mkfs.fat -F 12 ${DESTDIR}/boot/grub/efiboot.img
mcopy -s -i ${DESTDIR}/boot/grub/efiboot.img $_tmpdir/efi ::
}
section_grubefi() {
[ -n "$grub_mod" ] || return 0
[ "$output_format" = "iso" ] || return 0
local _format _efi
case "$ARCH" in
x86_64)
_format="x86_64-efi"
_efi="bootx64.efi"
;;
aarch64)
_format="arm64-efi"
_efi="bootaa64.efi"
;;
*)
return 0
;;
esac
build_section grub_cfg boot/grub/grub.cfg $(grub_gen_config | checksum)
build_section grubefi_img $_format $_efi $(grub_gen_earlyconf | checksum)
}
create_image_iso() {
local ISO="${OUTDIR}/${output_filename}"
local _isolinux
local _efiboot
if [ -e "${DESTDIR}/boot/syslinux/isolinux.bin" ]; then
# isolinux enabled
_isolinux="
-isohybrid-mbr ${DESTDIR}/boot/syslinux/isohdpfx.bin
-eltorito-boot boot/syslinux/isolinux.bin
-eltorito-catalog boot/syslinux/boot.cat
-no-emul-boot
-boot-load-size 4
-boot-info-table
"
fi
if [ -e "${DESTDIR}/boot/grub/efiboot.img" ]; then
# efi boot enabled
if [ -z "$_isolinux" ]; then
# efi boot only
_efiboot="
-efi-boot-part
--efi-boot-image
-e boot/grub/efiboot.img
-no-emul-boot
"
else
# hybrid isolinux+efi boot
_efiboot="
-eltorito-alt-boot
-e boot/grub/efiboot.img
-no-emul-boot
-isohybrid-gpt-basdat
"
fi
fi
xorrisofs \
-o ${ISO} -l -J -R \
-b boot/syslinux/isolinux.bin \
-c boot/syslinux/boot.cat \
-V "alpine-$PROFILE $RELEASE $ARCH" \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-quiet \
-follow-links \
${iso_opts} \
-quiet \
-output ${ISO} \
-full-iso9660-filenames \
-joliet \
-rock \
-volid "alpine-$PROFILE $RELEASE $ARCH" \
$_isolinux \
$_efiboot \
-follow-links \
${iso_opts} \
${DESTDIR}
isohybrid ${ISO}
}
create_image_targz() {
......@@ -154,6 +265,7 @@ profile_base() {
kernel_flavors="grsec"
initfs_cmdline="modules=loop,squashfs,sd-mod,usb-storage quiet"
initfs_features="ata base bootchart cdrom squashfs ext2 ext3 ext4 mmc raid scsi usb virtio"
#grub_mod="disk part_msdos linux normal configfile search search_label efi_uga efi_gop fat iso9660 cat echo ls test true help"
apks="alpine-base alpine-mirrors bkeymaps chrony e2fsprogs network-extras openssl openssh tzdata"
apkovl=
hostname="alpine"
......
......@@ -9,6 +9,7 @@ profile_standard() {
profile_vanilla() {
profile_standard
#arch="$arch aarch64"
kernel_flavors="vanilla"
kernel_addons=
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment