Modify geninstaller for uefi booting
Switch image to use overlay partition and use uefi layout and boot loader configuration. Signed-off-by: Ryan Harper <ryan.harper@canonical.com>
This commit is contained in:
parent
a744245f03
commit
522a546b5c
|
@ -20,6 +20,7 @@ USQUERY=${TOPDIR}/usquery
|
||||||
LOGFILE="geninstaller.log"
|
LOGFILE="geninstaller.log"
|
||||||
PREFIX="${PROG}"
|
PREFIX="${PROG}"
|
||||||
RESOURCES=`pwd`/resources
|
RESOURCES=`pwd`/resources
|
||||||
|
UBUNTU_RELEASE=$(lsb_release -c -s)
|
||||||
PKG_DEPS="
|
PKG_DEPS="
|
||||||
qemu-utils
|
qemu-utils
|
||||||
kpartx
|
kpartx
|
||||||
|
@ -42,19 +43,23 @@ INSTALLER_DEPS=(
|
||||||
"python3-tornado"
|
"python3-tornado"
|
||||||
)
|
)
|
||||||
CACHEDIR=""
|
CACHEDIR=""
|
||||||
|
GRUB_MODS="configfile fat part_gpt part_msdos cat echo test search search_label search_fs_uuid boot chain linux reboot halt normal efi_gop efi_uga font gfxterm"
|
||||||
|
|
||||||
cleanup_noexit() {
|
cleanup_noexit() {
|
||||||
[ -n "${CACHEDIR}" ] && {
|
[ -n "${CACHEDIR}" ] && {
|
||||||
sync
|
sync
|
||||||
sudo umount ${CACHEDIR}/mnt/{dev,proc,sys} || exit
|
sudo umount -l ${CACHEDIR}/mnt/{dev,proc,sys}
|
||||||
sudo umount ${CACHEDIR}/mnt || exit
|
sudo umount -l ${CACHEDIR}/mnt
|
||||||
|
sudo umount -l ${CACHEDIR}/lower
|
||||||
|
sudo umount -l ${CACHEDIR}/upper
|
||||||
|
sudo umount -l ${CACHEDIR}/efimnt
|
||||||
sudo kpartx -v -d ${CACHEDIR}/installer.img || exit
|
sudo kpartx -v -d ${CACHEDIR}/installer.img || exit
|
||||||
|
for DEV in $EFI_DEV $ROOTFS_DEV $OVERLAY_DEV; do
|
||||||
[ -e "/dev/mapper/`basename $DEV`" ] && {
|
[ -e "/dev/mapper/`basename $DEV`" ] && {
|
||||||
sudo dmsetup remove $DEV || exit
|
sudo dmsetup remove $DEV || exit
|
||||||
}
|
}
|
||||||
if sudo losetup -a | grep -q $LOOPDEV; then
|
done
|
||||||
sudo losetup -d $LOOPDEV || exit
|
sudo losetup -d $LOOPDEV
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,13 +387,21 @@ generate_img() {
|
||||||
local dldir=${1};
|
local dldir=${1};
|
||||||
local cachedir=${2};
|
local cachedir=${2};
|
||||||
local bootloader=${3};
|
local bootloader=${3};
|
||||||
|
local offline=${4};
|
||||||
local extlinux_conf=${TOPDIR}/resources/menu/extlinux-menu.conf
|
local extlinux_conf=${TOPDIR}/resources/menu/extlinux-menu.conf
|
||||||
local apparmor_path=${TOPDIR}/resources/apparmor
|
local apparmor_path=${TOPDIR}/resources/apparmor
|
||||||
|
local grub_efi_core=${TOPDIR}/resources/grub/bootx64.efi # FIXME, ARCH
|
||||||
local grub_conf=${TOPDIR}/resources/grub/grub.cfg
|
local grub_conf=${TOPDIR}/resources/grub/grub.cfg
|
||||||
|
local embed_conf=${TOPDIR}/resources/grub/embed_efi.cfg
|
||||||
|
local efi_grub_conf=${TOPDIR}/resources/grub/efi_grub.cfg
|
||||||
local gptmbr=$(dpkg -L syslinux-common | grep \/gptmbr.bin | grep -v efi)
|
local gptmbr=$(dpkg -L syslinux-common | grep \/gptmbr.bin | grep -v efi)
|
||||||
local installimg=${cachedir}/installer.img
|
local installimg=${cachedir}/installer.img
|
||||||
local mnt=${cachedir}/mnt
|
local mnt=${cachedir}/mnt
|
||||||
local rootfs=${cachedir}/rootfs
|
local rootfs=${cachedir}/rootfs
|
||||||
|
local efimnt=${cachedir}/efimnt
|
||||||
|
local lower=${cachedir}/lower
|
||||||
|
local upper=${cachedir}/upper
|
||||||
|
local work=${cachedir}/upper/overlay-work
|
||||||
local seed=$cachedir/seed/nocloud-net
|
local seed=$cachedir/seed/nocloud-net
|
||||||
local splash=${TOPDIR}/resources/images/splash.png
|
local splash=${TOPDIR}/resources/images/splash.png
|
||||||
local syslinux_path=$(dpkg -L syslinux-common | grep \/vesamenu.c32 |
|
local syslinux_path=$(dpkg -L syslinux-common | grep \/vesamenu.c32 |
|
||||||
|
@ -401,24 +414,17 @@ generate_img() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
log "Partitioning Installer image"
|
log "Partitioning Installer image (UEFI)"
|
||||||
parted -s $installimg mklabel gpt &&
|
parted -s $installimg mklabel msdos &&
|
||||||
parted -s $installimg mkpart primary 2048s 100% || {
|
parted -s $installimg mkpart primary fat32 0% 200M &&
|
||||||
|
parted -s $installimg mkpart primary ext3 200M 1700M &&
|
||||||
|
parted -s $installimg mkpart primary ext3 1700M 2147M &&
|
||||||
|
parted -s $installimg set 1 boot on || {
|
||||||
log "Failed to partition image: $installimg"
|
log "Failed to partition image: $installimg"
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ "${bootloader}" == "syslinux" ]; then
|
if [ "${bootloader}" != "grub2" ]; then
|
||||||
[ -z "$gptmbr" ] && {
|
|
||||||
log "ERROR: failed to find GPT MBR record on host";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
log "Embedding bootloader"
|
|
||||||
dd bs=440 conv=notrunc count=1 if=$gptmbr of=$installimg || {
|
|
||||||
log "Failed to embed bootloader into $installimg";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
elif [ "${bootloader}" != "grub2" ]; then
|
|
||||||
log "Bootloader ${bootloader} not supported, cannot install"
|
log "Bootloader ${bootloader} not supported, cannot install"
|
||||||
usage;
|
usage;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -430,30 +436,72 @@ generate_img() {
|
||||||
log "Failed to map image partitions into LVM"
|
log "Failed to map image partitions into LVM"
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
sudo udevadm settle
|
||||||
|
|
||||||
local looppart=`echo ${kpartx_ret} | fmt -w 1 | grep ^loop`
|
local loopparts=( `echo ${kpartx_ret} | fmt -w 1 | grep ^loop` )
|
||||||
DEV="/dev/mapper/${looppart}"
|
EFI_DEV="/dev/mapper/${loopparts[0]}"
|
||||||
|
ROOTFS_DEV="/dev/mapper/${loopparts[1]}"
|
||||||
|
OVERLAY_DEV="/dev/mapper/${loopparts[2]}"
|
||||||
|
LOOPDEV="`echo ${kpartx_ret} | fmt -w 1 | grep ^/dev | head -n1`"
|
||||||
|
|
||||||
# frob the bits for gpt boot?
|
log "Building Grub (EFI and BIOS) boot partition"
|
||||||
# http://www.funtoo.org/Extlinux
|
(sudo mkfs.vfat -F32 -n GRUB2EFI ${EFI_DEV} &&
|
||||||
# /dev/loopX is what we want
|
mkdir -p ${efimnt} &&
|
||||||
LOOPDEV="`echo ${kpartx_ret} | fmt -w 1 | grep ^/dev`"
|
sudo mount $EFI_DEV ${efimnt} &&
|
||||||
log "Marking partitions bootable on $installimg ($LOOPDEV)"
|
sudo mkdir -p ${efimnt}/EFI/BOOT &&
|
||||||
sudo sgdisk $LOOPDEV --attributes=1:set:2 &&
|
sudo mkdir -p ${efimnt}/boot/grub &&
|
||||||
sudo sgdisk $LOOPDEV --attributes=1:show || {
|
sudo mkdir -p ${efimnt}/grub/fonts &&
|
||||||
log "ERROR: failed to set bootable partition in $installimg";
|
sudo mkdir -p ${efimnt}/grub/x86_64-efi &&
|
||||||
|
sudo cp -a /usr/lib/shim/MokManager.efi.signed ${efimnt}/EFI/BOOT/MokManager.efi &&
|
||||||
|
sudo cp -a /usr/lib/shim/shim.efi.signed ${efimnt}/EFI/BOOT/shimx64.efi &&
|
||||||
|
sudo cp -a /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed ${efimnt}/EFI/BOOT/grubx64.efi &&
|
||||||
|
sudo cp -a /usr/share/grub/unicode.pf2 ${efimnt}/grub/fonts/ &&
|
||||||
|
sudo cp -a /usr/share/grub/unicode.pf2 ${efimnt}/boot/grub &&
|
||||||
|
cat ${efi_grub_conf} | sudo tee ${efimnt}/EFI/BOOT/grub.cfg &&
|
||||||
|
cat ${embed_conf} | sudo tee ${efimnt}/grub/embed_efi.cfg &&
|
||||||
|
cat ${grub_conf} | sudo tee ${efimnt}/grub/grub.cfg &&
|
||||||
|
sudo rsync -a /usr/lib/grub/x86_64-efi/ ${efimnt}/grub/x86_64-efi/ &&
|
||||||
|
sudo grub-mkimage -O x86_64-efi -p /grub -c ${efimnt}/grub/embed_efi.cfg -o ${efimnt}/EFI/BOOT/bootx64.efi ${GRUB_MODS} &&
|
||||||
|
sudo grub-install --force --removable --no-floppy \
|
||||||
|
--boot-directory=${efimnt}/boot $LOOPDEV &&
|
||||||
|
sudo cp -v ${splash} ${efimnt}/boot/grub) || {
|
||||||
|
log "ERROR: failed to create multiboot partition"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
log "Creating and syncing filesystem for install image rootfs"
|
log "Creating and syncing filesystem (original cloudimg rootfs)"
|
||||||
sudo mkfs.ext3 -L cloudimg-rootfs $DEV &&
|
sudo mkfs.ext3 -L cloudimg-rootfs $ROOTFS_DEV &&
|
||||||
mkdir -p ${mnt} &&
|
mkdir -p ${lower} &&
|
||||||
sudo mount $DEV ${mnt} &&
|
sudo mount $ROOTFS_DEV ${lower} &&
|
||||||
sudo rsync -a ${rootfs}/ ${mnt}/ || {
|
sudo rsync -a ${rootfs}/ ${lower}/ || {
|
||||||
log "ERROR: failed to sync rootfs into install image";
|
log "ERROR: failed to sync rootfs into install image";
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log "Creating and syncing filesystem (installer overlay)"
|
||||||
|
sudo mkfs.ext3 -L overlay-rootfs $OVERLAY_DEV
|
||||||
|
# mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,\
|
||||||
|
# workdir=/work /merged
|
||||||
|
case $UBUNTU_RELEASE in
|
||||||
|
precise|trusty) # precise/trusty use overlayfs (older)
|
||||||
|
FS=overlayfs
|
||||||
|
OPTS="-olowerdir=$lower,upperdir=$upper/overlay"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
FS=overlay
|
||||||
|
OPTS="-olowerdir=$lower,upperdir=$upper/overlay,workdir=$work"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# load the right overlay module
|
||||||
|
if ! lsmod | grep -q ${FS}; then sudo modprobe $FS; fi
|
||||||
|
|
||||||
|
sudo mkdir -p ${work} ${upper} ${mnt} &&
|
||||||
|
sudo mount $OVERLAY_DEV ${upper} &&
|
||||||
|
sudo mkdir -p ${upper}/overlay ${work} &&
|
||||||
|
sudo mount -t $FS $FS $OPTS ${mnt} || {
|
||||||
|
log "ERROR: failed to overlay mount installer";
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
log "Installing bootloader configuration"
|
log "Installing bootloader configuration"
|
||||||
set +x
|
set +x
|
||||||
|
@ -464,7 +512,7 @@ generate_img() {
|
||||||
sudo mount none -t sysfs ${mnt}/sys &&
|
sudo mount none -t sysfs ${mnt}/sys &&
|
||||||
sudo mount -o bind /dev ${mnt}/dev &&
|
sudo mount -o bind /dev ${mnt}/dev &&
|
||||||
|
|
||||||
if [ "${OFFLINE}" == "yes" ]; then
|
if [ "${offline}" == "yes" ]; then
|
||||||
set -x
|
set -x
|
||||||
log "Setting up for offline use"
|
log "Setting up for offline use"
|
||||||
local resolvconf=${mnt}/etc/resolv.conf
|
local resolvconf=${mnt}/etc/resolv.conf
|
||||||
|
@ -493,10 +541,7 @@ generate_img() {
|
||||||
cat ${extlinux_conf} | sudo tee ${mnt}/boot/extlinux/extlinux.conf
|
cat ${extlinux_conf} | sudo tee ${mnt}/boot/extlinux/extlinux.conf
|
||||||
else
|
else
|
||||||
log "Installing grub2"
|
log "Installing grub2"
|
||||||
sudo mkdir -p ${mnt}/boot/grub &&
|
cat ${grub_conf} | sudo tee ${efimnt}/boot/grub/grub.cfg && true
|
||||||
sudo grub-install --boot-directory=${mnt}/boot $LOOPDEV --force &&
|
|
||||||
sudo cp -av ${splash} ${mnt}/boot/grub &&
|
|
||||||
cat ${grub_conf} | sudo tee ${mnt}/boot/grub/grub.cfg
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# update apparmor policy for dhclient
|
# update apparmor policy for dhclient
|
||||||
|
@ -514,7 +559,6 @@ generate_img() {
|
||||||
}
|
}
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
|
|
||||||
_RETVAL="$installimg";
|
_RETVAL="$installimg";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue