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