Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Unified Diff: create_legacy_bootloader_templates.sh

Issue 2829038: [PATCH 3/5] Unify efi and legacy bootloader configuration generation (Closed)
Patch Set: fix typo Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build_image ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: create_legacy_bootloader_templates.sh
diff --git a/create_legacy_bootloader_templates.sh b/create_legacy_bootloader_templates.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e0f2bfcb0115c4ba3b495671c1b2104828cc05c9
--- /dev/null
+++ b/create_legacy_bootloader_templates.sh
@@ -0,0 +1,203 @@
+#!/bin/bash
+
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Helper script that generates the signed kernel image
+
+. "$(dirname "$0")/common.sh"
+
+get_default_board
+
+# Flags.
+DEFINE_string arch "x86" \
+ "The boot architecture: arm or x86. (Default: x86)"
+# TODO(wad) once extlinux is dead, we can remove this.
+DEFINE_boolean install ${FLAGS_FALSE} \
+ "Controls whether extlinux is run on 'to'. (Default: false)"
+DEFINE_string to "/tmp/boot" \
+ "Path to populate with bootloader templates (Default: /tmp/boot)"
+DEFINE_string usb_disk /dev/sdb3 \
+ "Path syslinux should use to do a usb boot. Default: /dev/sdb3"
+DEFINE_string boot_args "" \
+ "Additional boot arguments to pass to the commandline (Default: '')"
+DEFINE_boolean use_vboot ${FLAGS_FALSE} \
+ "Controls whether the default boot targets are verified (Default: false)"
+DEFINE_integer vboot_error_behavior 2 \
+ "Verified boot error behavior [0: I/O errors, 1: reboot, 2: nothing] \
+(Default: 2)"
+DEFINE_integer vboot_max_ios 1024 \
+ "Optional number of outstanding I/O operations. (Default: 1024)"
+
+# Parse flags
+FLAGS "$@" || exit 1
+eval set -- "${FLAGS_ARGV}"
+set -e
+
+# Common kernel command-line args
+common_args="quiet console=tty2 init=/sbin/init boot=local rootwait ro noresume"
+common_args="${common_args} noswap loglevel=1"
+
+# Common verified boot command-line args
+vboot_common="dm_verity.error_behavior=${FLAGS_vboot_error_behavior}"
+vboot_common="${vboot_common} dm_verity.max_bios=${FLAGS_vboot_max_ios}"
+
+# Populate the x86 rootfs to support legacy and EFI bios config templates.
+# The templates are used by the installer to populate partition 12 with
+# the correct bootloader configuration.
+# While we transition to that model, extlinux.conf will still be used
+# on the root filesystem.
+if [[ "${FLAGS_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 ${FLAGS_to}
+ # TODO(adlr): use initramfs for booting.
+ cat <<EOF | sudo dd of="${FLAGS_to}"/extlinux.conf 2>/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 <<EOF | sudo dd of="${SYSLINUX_DIR}/syslinux.cfg" 2>/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 <<EOF | sudo dd of="${SYSLINUX_DIR}/default.cfg" 2>/dev/null
+DEFAULT chromeos-vusb.A
+EOF
+ else
+ cat <<EOF | sudo dd of="${SYSLINUX_DIR}/default.cfg" 2>/dev/null
+DEFAULT chromeos-usb.A
+EOF
+ fi
+ info "Emitted ${SYSLINUX_DIR}/default.cfg"
+
+ cat <<EOF | sudo dd of="${SYSLINUX_DIR}/usb.A.cfg" 2>/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 <<EOF | sudo dd of="${SYSLINUX_DIR}/root.A.cfg" 2>/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 <<EOF | sudo dd of="${SYSLINUX_DIR}/root.B.cfg" 2>/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 <<EOF | sudo dd of="${SYSLINUX_DIR}/README" 2>/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 <<EOF | sudo dd of="${FLAGS_to}/efi/boot/grub.cfg" 2>/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."
« no previous file with comments | « build_image ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698