From 1ee156fd00bb1d62dd527aa9b20631712a3c7485 Mon Sep 17 00:00:00 2001 From: Will Drewry Date: Sat, 3 Jul 2010 13:27:19 -0500 Subject: [PATCH] [PATCH 3/5] Unify efi and legacy bootloader configuration generation This change unifies the creation of extlinux.conf, syslinux cfgs, and grub efi files. It shouldn't change the existing behavior but does add support for further arguments and future use of syslinux (once it is properly rewritten by an installer or other script). TEST=in progress; manual run BUG=chromium-os:327 Review URL: http://codereview.chromium.org/2829038 --- build_image | 66 +++------ create_legacy_bootloader_templates.sh | 203 ++++++++++++++++++++++++++ 2 files changed, 222 insertions(+), 47 deletions(-) create mode 100755 create_legacy_bootloader_templates.sh diff --git a/build_image b/build_image index 6fd3720b3e..c4f94dfe4e 100755 --- a/build_image +++ b/build_image @@ -403,33 +403,6 @@ create_base_image() { sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${OEM_LOOP_DEV}" sudo mount "${OEM_LOOP_DEV}" "${OEM_FS_DIR}" - # Turn root file system into bootable image. - if [[ "${ARCH}" = "x86" ]]; then - # Setup extlinux configuration. - # TODO: For some reason the /dev/disk/by-uuid is not being generated by udev - # in the initramfs. When we figure that out, switch to root=UUID=${UUID}. - sudo mkdir -p "${ROOT_FS_DIR}"/boot - # TODO(adlr): use initramfs for booting. - cat </dev/null +DEFAULT chromeos-usb +PROMPT 0 +TIMEOUT 0 + +label chromeos-usb + menu label chromeos-usb + kernel vmlinuz + append ${common_args} root=/dev/sdb3 i915.modeset=1 cros_legacy + +label chromeos-hd + menu label chromeos-hd + kernel vmlinuz + append ${common_args} root=HDROOT i915.modeset=1 cros_legacy +EOF + + # Make partition bootable and label it. + # TODO(wad) remove this after we've transitioned everyone to syslinux. + if [[ ${FLAGS_install} -eq ${FLAGS_TRUE} ]]; then + sudo extlinux -z --install "${FLAGS_to}" + fi + + # /boot/syslinux must be installed in partition 12 as /syslinux/. + SYSLINUX_DIR="${FLAGS_to}/syslinux" + sudo mkdir -p "${SYSLINUX_DIR}" + + cat </dev/null +PROMPT 0 +TIMEOUT 0 + +# the actual target +include /syslinux/default.cfg + +# chromeos-usb.A +include /syslinux/usb.A.cfg + +# chromeos-hd.A / chromeos-vhd.A +include /syslinux/root.A.cfg + +# chromeos-hd.B / chromeos-vhd.B +include /syslinux/root.B.cfg +EOF + info "Emitted ${SYSLINUX_DIR}/syslinux.cfg" + + if [[ ${FLAGS_use_vboot} -eq ${FLAGS_TRUE} ]]; then + # To change the active target, only this file needs to change. + cat </dev/null +DEFAULT chromeos-vusb.A +EOF + else + cat </dev/null +DEFAULT chromeos-usb.A +EOF + fi + info "Emitted ${SYSLINUX_DIR}/default.cfg" + + cat </dev/null +label chromeos-usb.A + menu label chromeos-usb.A + kernel vmlinuz.A + append ${common_args} root=${FLAGS_usb_disk} i915.modeset=1 cros_legacy + +label chromeos-vusb.A + menu label chromeos-vusb.A + kernel vmlinuz.A + append ${common_args} ${vboot_common} root=/dev/dm-0 i915.modeset=1 cros_legacy dm="DMTABLEA" +EOF + info "Emitted ${SYSLINUX_DIR}/usb.A.cfg" + + # Different files are used so that the updater can only touch the file it + # needs to for a given change. This will minimize any potential accidental + # updates issues, hopefully. + cat </dev/null +label chromeos-hd.A + menu label chromeos-hd.A + kernel vmlinuz.A + append ${common_args} root=HDROOTA i915.modeset=1 cros_legacy + +label chromeos-vhd.A + menu label chromeos-vhd.A + kernel vmlinuz.A + append ${common_args} ${vboot_common} root=/dev/dm-0 i915.modeset=1 cros_legacy dm="DMTABLEA" +EOF + info "Emitted ${SYSLINUX_DIR}/root.A.cfg" + + cat </dev/null +label chromeos-hd.B + menu label chromeos-hd.B + kernel vmlinuz.B + append ${common_args} root=HDROOTB i915.modeset=1 cros_legacy + +label chromeos-vhd.B + menu label chromeos-vhd.B + kernel vmlinuz.B + append ${common_args} ${vboot_common} root=/dev/dm-0 i915.modeset=1 cros_legacy dm="DMTABLEB" +EOF + info "Emitted ${SYSLINUX_DIR}/root.B.cfg" + + cat </dev/null +Partition 12 contains the active bootloader configuration when +booting from a non-Chrome OS BIOS. EFI BIOSes use /efi/* +and legacy BIOSes use this syslinux configuration. +EOF + info "Emitted ${SYSLINUX_DIR}/README" + + # To cover all of our bases, now populate templated boot support for efi. + sudo mkdir -p "${FLAGS_to}"/efi/boot + sudo grub-mkimage -p /efi/boot -o "${FLAGS_to}/efi/boot/bootx64.efi" \ + part_gpt fat ext2 normal boot sh chain configfile linux + # Templated variables: + # DMTABLEA, DMTABLEB -> '0 xxxx verity ... ' + # This should be replaced during postinst when updating the ESP. + cat </dev/null +set default=0 +set timeout=2 + +# NOTE: These magic grub variables are a Chrome OS hack. They are not portable. + +menuentry "local image A" { + linux \$grubpartA/boot/vmlinuz ${common_args} i915.modeset=1 cros_efi root=/dev/\$linuxpartA +} + +menuentry "local image B" { + linux \$grubpartB/boot/vmlinuz ${common_args} i915.modeset=1 cros_efi root=/dev/\$linuxpartB +} + +menuentry "verified image A" { + linux \$grubpartA/boot/vmlinuz ${common_args} ${vboot_common} i915.modeset=1 cros_efi root=/dev/dm-0 dm="DMTABLEA" +} + +menuentry "verified image B" { + linux \$grubpartB/boot/vmlinuz ${common_args} ${vboot_common} i915.modeset=1 cros_efi root=/dev/dm-0 dm="DMTABLEB" +} + +# FIXME: usb doesn't support verified boot for now +menuentry "Alternate USB Boot" { + linux (hd0,3)/boot/vmlinuz ${common_args} root=/dev/sdb3 i915.modeset=1 cros_efi +} +EOF + if [[ ${FLAGS_use_vboot} -eq ${FLAGS_TRUE} ]]; then + sed -i -e 's/^set default=.*/set default=2/' "${FLAGS_to}/efi/boot/grub.cfg" + fi + info "Emitted ${FLAGS_to}/efi/boot/grub.cfg" + exit 0 +fi + +info "The target platform does not use bootloader templates."