Index: bin/cros_make_image_bootable |
diff --git a/bin/cros_make_image_bootable b/bin/cros_make_image_bootable |
deleted file mode 100755 |
index ba4f7af6bc4cd9dc944b1a9c5a49345821dba340..0000000000000000000000000000000000000000 |
--- a/bin/cros_make_image_bootable |
+++ /dev/null |
@@ -1,261 +0,0 @@ |
-#!/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. |
-# |
-# Script which ensures that a given image has an up-to-date |
-# kernel partition, rootfs integrity hashes, and legacy bootloader configs. |
- |
-# Load common constants. This should be the first executable line. |
-# The path to common.sh should be relative to your script's location. |
-COMMON_PATH="/usr/lib/crosutils/common.sh" |
-if [ ! -r "${COMMON_PATH}" ]; then |
- echo "ERROR! Cannot find common.sh: ${COMMON_PATH}" 1>&2 |
- exit 1 |
-fi |
-. "/usr/lib/crosutils/common.sh" |
- |
-set -e |
-. "/usr/lib/installer/chromeos-common.sh" # for partoffset and partsize |
-if [ $# -lt 2 ]; then |
- echo "Usage: ${0} /PATH/TO/IMAGE IMAGE.BIN [shflags overrides]" |
- exit 1 |
-fi |
- |
-BOOT_DESC_FILE="${1}/boot.desc" |
-IMAGE="${1}/${2}" |
-shift |
-shift |
-FLAG_OVERRIDES="${@}" |
- |
-if [ ! -r "${BOOT_DESC_FILE}" ]; then |
- warn "${BOOT_DESC_FILE} cannot be read!" |
- warn "Falling back to command line parsing" |
- BOOT_DESC="${@}" |
-else |
- BOOT_DESC="$(cat ${BOOT_DESC_FILE} | tr -s '\n' ' ')" |
- info "Boot-time configuration for $(dirname ${IMAGE}): " |
- cat ${BOOT_DESC_FILE} | while read line; do |
- info " ${line}" |
- done |
-fi |
- |
-if [ ! -r "${IMAGE}" ]; then |
- die "${IMAGE} cannot be read!" |
-fi |
- |
-# Script must be run inside the chroot. |
-restart_in_chroot_if_needed $* |
- |
-locate_gpt |
-set +e |
- |
-# Now parse the build settings from ${OUTPUT_DIR}/boot.desc |
- |
-DEFINE_string output_dir "/tmp" \ |
- "Directory to place output in." |
-DEFINE_string image "chromiumos_base.img" \ |
- "Full path to the chromiumos image to make bootable." |
-DEFINE_string arch "x86" \ |
- "Architecture to make bootable for: arm or x86" |
-DEFINE_string usb_disk "/dev/sdb3" \ |
- "Path syslinux should use to do a usb boot." |
-DEFINE_boolean cleanup_dirs ${FLAGS_TRUE} \ |
- "Whether the mount dirs should be removed on completion." |
- |
-DEFINE_integer rootfs_size 720 \ |
- "rootfs filesystem size in MBs." |
-# ceil(0.1 * rootfs_size) is a good minimum. |
-DEFINE_integer rootfs_hash_pad 8 \ |
- "MBs reserved at the end of the rootfs image." |
- |
-DEFINE_string rootfs_hash "/tmp/rootfs.hash" \ |
- "Path where the rootfs hash should be stored." |
-DEFINE_boolean enable_rootfs_verification ${FLAGS_FALSE} \ |
- "Default all bootloaders to use kernel-based root fs integrity checking." |
-DEFINE_integer verity_error_behavior 2 \ |
- "Kernel verified boot error behavior (0: I/O errors, 1: reboot, 2: nothing)" |
-DEFINE_integer verity_depth 1 \ |
- "Kernel verified boot hash tree depth" |
-DEFINE_integer verity_max_ios 1024 \ |
- "Number of outstanding I/O operations dm-verity caps at." |
-DEFINE_string verity_algorithm "sha1" \ |
- "Cryptographic hash algorithm used for kernel vboot." |
- |
-DEFINE_string arm_extra_bootargs "" \ |
- "Additional command line options to pass to the ARM kernel." |
- |
-DEFINE_string keys_dir "/usr/share/vboot/devkeys" \ |
- "Directory containing the signing keys." |
- |
-DEFINE_string rootfs_mountpoint "/tmp/rootfs" \ |
- "Path where the rootfs can be safely mounted" |
-DEFINE_string statefulfs_mountpoint "/tmp/statefulfs" \ |
- "Path where the statefulfs can be safely mounted" |
-DEFINE_string espfs_mountpoint "/tmp/espfs" \ |
- "Path where the espfs can be safely mounted" |
- |
-DEFINE_boolean use_dev_keys ${FLAGS_FALSE} \ |
- "Use developer keys for signing. (Default: false)" |
- |
-# Parse the boot.desc and any overrides |
-eval set -- "${BOOT_DESC} ${FLAG_OVERRIDES}" |
-FLAGS "${@}" || exit 1 |
- |
-# Only now can we die on error. shflags functions leak non-zero error codes, |
-# so will die prematurely if 'set -e' is specified before now. |
-set -e -u |
- |
-# $1 - Directory where developer rootfs is mounted. |
-# $2 - Directory where developer stateful_partition is mounted. |
-# $3 - Directory where the ESP partition is mounted. |
-mount_gpt_cleanup() { |
- local rootfs="${1-$FLAGS_rootfs_mountpoint}" |
- local statefs="${2-$FLAGS_statefulfs_mountpoint}" |
- local espfs="${3-$FLAGS_espfs_mountpoint}" |
- "/usr/bin/cros_mount_gpt_image.sh" \ |
- -u -r "${rootfs}" -s "${statefs}" -e "${espfs}" |
-} |
- |
-make_image_bootable() { |
- local image="$1" |
- local use_dev_keys= |
- |
- cros_root=/dev/sd%D%P |
- if [[ "${FLAGS_arch}" = "arm" ]]; then |
- # TODO(wad) assumed like in build_gpt for now. |
- cros_root=/dev/mmcblk1p3 |
- fi |
- if [[ ${FLAGS_enable_rootfs_verification} -eq ${FLAGS_TRUE} ]]; then |
- cros_root=/dev/dm-0 |
- fi |
- |
- trap "mount_gpt_cleanup" EXIT |
- /usr/bin/cros_mount_gpt_image.sh --from "$(dirname ${image})" \ |
- --image "$(basename ${image})" -r "${FLAGS_rootfs_mountpoint}" \ |
- -s "${FLAGS_statefulfs_mountpoint}" |
- |
- # The rootfs should never be mounted rw again after this point without |
- # re-calling make_image_bootable. |
- sudo mount -o remount,ro "${FLAGS_rootfs_mountpoint}" |
- root_dev=$(mount | grep -- "on ${FLAGS_rootfs_mountpoint} type" | |
- cut -f1 -d' ' | tail -1) |
- |
- if [ ${FLAGS_use_dev_keys} -eq ${FLAGS_TRUE} ]; then |
- use_dev_keys="--use_dev_keys" |
- fi |
- |
- # Builds the kernel partition image. The temporary files are kept around |
- # so that we can perform a load_kernel_test later on the final image. |
- /usr/bin/cros_build_kernel_image.sh \ |
- --arch="${FLAGS_arch}" \ |
- --to="${FLAGS_output_dir}/vmlinuz.image" \ |
- --hd_vblock="${FLAGS_output_dir}/vmlinuz_hd.vblock" \ |
- --vmlinuz="${FLAGS_rootfs_mountpoint}/boot/vmlinuz" \ |
- --working_dir="${FLAGS_output_dir}" \ |
- --keep_work \ |
- --rootfs_image=${root_dev} \ |
- --rootfs_hash=${FLAGS_rootfs_hash} \ |
- --verity_hash_alg=${FLAGS_verity_algorithm} \ |
- --verity_tree_depth=${FLAGS_verity_depth} \ |
- --verity_max_ios=${FLAGS_verity_max_ios} \ |
- --verity_error_behavior=${FLAGS_verity_error_behavior} \ |
- --root=${cros_root} \ |
- --keys_dir="${FLAGS_keys_dir}" \ |
- ${use_dev_keys} |
- |
- local rootfs_hash_size=$(stat -c '%s' ${FLAGS_rootfs_hash}) |
- info "Appending rootfs.hash (${rootfs_hash_size} bytes) to the root fs" |
- if [[ ${rootfs_hash_size} -gt $((FLAGS_rootfs_hash_pad * 1024 * 1024)) ]] |
- then |
- die "--rootfs_hash_pad reserves less than the needed ${rootfs_hash_size}" |
- fi |
- # Unfortunately, cros_mount_gpt_image uses mount and not losetup to create the |
- # loop devices. This means that they are not the correct size. We have to |
- # write directly to the image to append the hash tree data. |
- local hash_offset="$(partoffset ${image} 3)" |
- hash_offset=$((hash_offset + ((1024 * 1024 * ${FLAGS_rootfs_size}) / 512))) |
- sudo dd bs=512 \ |
- seek=${hash_offset} \ |
- if="${FLAGS_rootfs_hash}" \ |
- of="${image}" \ |
- conv=notrunc |
- # We don't need to keep the file around anymore. |
- sudo rm "${FLAGS_rootfs_hash}" |
- |
- # Move the verification block needed for the hard disk install to the |
- # stateful partition. Mount stateful fs, copy file, and umount fs. |
- # In original CL: http://codereview.chromium.org/2868044, this was done in |
- # create_base_image(). However, it could break the build if it is a clean |
- # build because vmlinuz_hd.vblock hasn't been created by |
- # cros_build_kernel_image.sh |
- if [[ "${FLAGS_arch}" = "x86" ]]; then |
- sudo cp "${FLAGS_output_dir}/vmlinuz_hd.vblock" \ |
- "${FLAGS_statefulfs_mountpoint}" |
- fi |
- |
- # START_KERN_A is set by the first call to install the gpt. |
- local koffset="$(partoffset ${image} 2)" |
- sudo dd if="${FLAGS_output_dir}/vmlinuz.image" of="${image}" \ |
- conv=notrunc bs=512 seek=${koffset} |
- |
- # Update the bootloaders. For legacy/efi x86, the EFI system partition |
- # will be updated and for arm, the mbr will be updated (for u-boot). |
- local kernel_part= |
- local usb_disk="${FLAGS_usb_disk}" |
- |
- # We should update the esp in place in the image. |
- local bootloader_to="${image}" |
- local esp_offset="$(partoffset ${image} 12)" |
- esp_offset=$((esp_offset * 512)) # sectors to bytes |
- local esp_size="$(partsize ${image} 12)" |
- esp_size=$((esp_size * 512)) # sectors to bytes |
- local bootloader_to_flags="--to_offset=${esp_offset} --to_size=${esp_size}" |
- |
- if [[ "${FLAGS_arch}" = "x86" ]]; then |
- # Use the kernel partition to acquire configuration flags. |
- kernel_part="--kernel_partition='${FLAGS_output_dir}/vmlinuz.image'" |
- # Install syslinux on the EFI System Partition. |
- kernel_part="${kernel_part} --install_syslinux" |
- elif [[ "${FLAGS_arch}" = "arm" ]]; then |
- # TODO(wad) mmcblk1p3 is hardcoded for arm for now! |
- usb_disk="/dev/mmcblk1p3" |
- # ARM doesn't support using the kernel image for kernel cmdline flags yet. |
- kernel_part="--kernel_cmdline=\"${FLAGS_arm_extra_bootargs}\" " |
- # TODO(wad) Integrate dmtable extraction into the arm build |
- # E.g. $(cat ${FLAGS_output_dir}/boot.config | tr -s '\n' ' ')" |
- local kpart_offset="--kernel_partition_offset=${koffset}" |
- local kpart_size="--kernel_partition_sectors=" |
- kpart_size="${kpart_size}$(partsize ${image} 2)" |
- kernel_part="${kernel_part} ${kpart_size} ${kpart_offset}" |
- info "Using addition bootloader arguments: ${kernel_part}" |
- fi |
- |
- # Update partition 12 |
- /usr/bin/cros_update_bootloaders.sh \ |
- --arch=${FLAGS_arch} \ |
- --to="${bootloader_to}" \ |
- --from="${FLAGS_rootfs_mountpoint}"/boot \ |
- --vmlinuz="${FLAGS_rootfs_mountpoint}"/boot/vmlinuz \ |
- --usb_disk="${usb_disk}" \ |
- ${bootloader_to_flags} \ |
- $kernel_part |
- |
- trap - EXIT |
- /usr/bin/cros_mount_gpt_image.sh -u -r "${FLAGS_rootfs_mountpoint}" \ |
- -s "${FLAGS_statefulfs_mountpoint}" |
-} |
- |
-# Create the directories if they don't exist. |
-mkdir -p ${FLAGS_rootfs_mountpoint} |
-mkdir -p ${FLAGS_statefulfs_mountpoint} |
-mkdir -p ${FLAGS_espfs_mountpoint} |
- |
-make_image_bootable ${IMAGE} |
- |
-if [ ${FLAGS_cleanup_dirs} -eq ${FLAGS_TRUE} ]; then |
- rmdir ${FLAGS_rootfs_mountpoint} |
- rmdir ${FLAGS_statefulfs_mountpoint} |
- rmdir ${FLAGS_espfs_mountpoint} |
-fi |