diff --git a/build_gpt.sh b/build_gpt.sh index b0d77228ae..c333118bda 100755 --- a/build_gpt.sh +++ b/build_gpt.sh @@ -23,8 +23,6 @@ DEFINE_string board "$DEFAULT_BOARD" \ "The board to build an image for." DEFINE_string arm_extra_bootargs "" \ "Additional command line options to pass to the ARM kernel." -DEFINE_boolean recovery $FLAGS_FALSE \ - "Build GPT for a recovery image. Default: False." DEFINE_integer rootfs_partition_size 1024 \ "rootfs parition size in MBs." @@ -81,7 +79,6 @@ set -e set -u # Check for missing parts. -# For recovery image, only populate ROOT-A and KERN-A ROOTFS_IMG="${IMAGEDIR}/rootfs.image" if [[ ! -s ${ROOTFS_IMG} ]]; then error "Can't find ${ROOTFS_IMG}" @@ -95,13 +92,13 @@ if [[ ! -s ${KERNEL_IMG} ]]; then fi STATEFUL_IMG="${IMAGEDIR}/stateful_partition.image" -if [ ! -s ${STATEFUL_IMG} ] && [ ${FLAGS_recovery} -eq $FLAGS_FALSE ]; then +if [ ! -s ${STATEFUL_IMG} ]; then error "Can't find ${STATEFUL_IMG}" exit 1 fi ESP_IMG="${IMAGEDIR}/esp.image" -if [ ! -s ${ESP_IMG} ] && [ ${FLAGS_recovery} -eq $FLAGS_FALSE ]; then +if [ ! -s ${ESP_IMG} ]; then error "Can't find ${ESP_IMG}" exit 1 fi @@ -117,7 +114,7 @@ fi # Create the GPT. This has the side-effect of setting some global vars # describing the partition table entries (see the comments in the source). install_gpt $OUTDEV $ROOTFS_IMG $KERNEL_IMG $STATEFUL_IMG $PMBRCODE $ESP_IMG \ - false $FLAGS_recovery $FLAGS_rootfs_partition_size + false $FLAGS_rootfs_partition_size if [[ "$ARCH" = "arm" ]]; then # assume /dev/mmcblk1. we could not get this from ${OUTDEV} @@ -152,19 +149,6 @@ echo "Copying rootfs..." $sudo dd if=${ROOTFS_IMG} of=${OUTDEV} conv=notrunc bs=512 \ seek=${START_ROOTFS_A} -# TODO(tgao): write a script to populate ROOT-B and KERN-B with user-specified -# rootfs and kernel. Do NOT remove if block below until then (otherwise -# chromeos-installer will fail b/c it expects to install from partition B) -if [ ${FLAGS_recovery} -eq $FLAGS_TRUE ]; then - echo "Copying kernel B..." - $sudo dd if=${KERNEL_IMG} of=${OUTDEV} conv=notrunc bs=512 \ - seek=${START_KERN_B} - - echo "Copying rootfs B..." - $sudo dd if=${ROOTFS_IMG} of=${OUTDEV} conv=notrunc bs=512 \ - seek=${START_ROOTFS_B} -fi - echo "Copying EFI system partition..." $sudo dd if=${ESP_IMG} of=${OUTDEV} conv=notrunc bs=512 seek=${START_ESP} diff --git a/build_image b/build_image index 545dd65727..77ce152c93 100755 --- a/build_image +++ b/build_image @@ -44,8 +44,6 @@ DEFINE_boolean factory_install ${FLAGS_FALSE} \ is also required in image_to_usb." DEFINE_string arm_extra_bootargs "" \ "Additional command line options to pass to the ARM kernel." -DEFINE_boolean recovery ${FLAGS_FALSE} \ - "Build a recovery image. Default: False." DEFINE_integer rootfs_partition_size 1024 \ "rootfs parition size in MBs." DEFINE_integer rootfs_size 720 \ @@ -96,11 +94,6 @@ if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then DEVELOPER_IMAGE_NAME=chromiumos_image.bin fi -# If we are creating a recovery image, rename pristine image. -if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then - PRISTINE_IMAGE_NAME=recovery_image.bin -fi - OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME}} BOARD="${FLAGS_board}" @@ -283,35 +276,6 @@ update_dev_packages() { ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${ROOT_FS_DIR}" -s "${STATEFUL_FS_DIR}" } - -# Modifies an existing image to add recovery packages -update_recovery_packages() { - local image_name=$1 - - echo "Adding recovery packages to ${image_name}" - - # Create stateful partition of the same size as the rootfs. - trap "mount_gpt_cleanup \"${ROOT_FS_DIR}\" \"${STATEFUL_FS_DIR}\"" EXIT - - ${SCRIPTS_DIR}/mount_gpt_image.sh --from "${OUTPUT_DIR}" \ - --image "$( basename ${image_name} )" -r "${ROOT_FS_DIR}" \ - -s "${STATEFUL_FS_DIR}" - - # Install recovery installer. - sudo ${EMERGE_BOARD_CMD} --root=${ROOT_FS_DIR} --usepkg \ - --root-deps=rdeps --nodeps chromeos-recovery - - # Re-run ldconfig to fix /etc/ldconfig.so.cache. - sudo /sbin/ldconfig -r "${ROOT_FS_DIR}" - - # Mark the image as a developer image (input to chromeos_startup). - sudo mkdir -p "${ROOT_FS_DIR}/root" - sudo touch "${ROOT_FS_DIR}/root/.recovery_installer" - - trap - EXIT - ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${ROOT_FS_DIR}" -s "${STATEFUL_FS_DIR}" -} - create_base_image() { trap "cleanup && delete_prompt" EXIT @@ -499,18 +463,12 @@ EOF trap delete_prompt EXIT - RECOVERY="--norecovery" - if [[ ${FLAGS_recovery} -eq ${FLAGS_TRUE} ]]; then - RECOVERY="--recovery" - fi - # Create the GPT-formatted image. ${SCRIPTS_DIR}/build_gpt.sh \ --arch=${ARCH} \ --board=${FLAGS_board} \ --arm_extra_bootargs="${FLAGS_arm_extra_bootargs}" \ --rootfs_partition_size=${FLAGS_rootfs_partition_size} \ - ${RECOVERY} \ "${OUTPUT_DIR}" \ "${OUTPUT_IMG}" } @@ -523,13 +481,6 @@ mkdir -p "${ESP_FS_DIR}" create_base_image ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} -# Create a recovery image based on the chromium os base image. -if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ] ; then - update_recovery_packages ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} -fi -trap - EXIT - - # Create a developer image based on the chromium os base image. if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ] ; then echo "Creating developer image from base image ${OUTPUT_IMG}" @@ -554,9 +505,6 @@ rmdir "${ROOT_FS_DIR}" "${STATEFUL_FS_DIR}" "${ESP_FS_DIR}" echo "Done. Image created in ${OUTPUT_DIR}" echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}" -if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then - echo "Recovery image created as ${PRISTINE_IMAGE_NAME}" -fi if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then echo "Developer image created as ${DEVELOPER_IMAGE_NAME}" fi diff --git a/mod_image_for_recovery.sh b/mod_image_for_recovery.sh new file mode 100755 index 0000000000..5d927f1931 --- /dev/null +++ b/mod_image_for_recovery.sh @@ -0,0 +1,90 @@ +#!/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 to modify a pristine/dev Chrome OS image to be used for recovery + +. "$(dirname "$0")/common.sh" + +# Script must be run inside the chroot. +restart_in_chroot_if_needed $* + +DEFINE_string image_dir "" \ + "Directory to pristine/base image." +DEFINE_string image_name "chromiumos_image.bin" \ + "Name of Chrome OS image to modify." + +# Parse command line +FLAGS "$@" || exit 1 +eval set -- "${FLAGS_ARGV}" + +set -e + +if [ -z $FLAGS_image_dir ] || [ ! -d $FLAGS_image_dir ]; then + echo "Error: invalid flag --image_dir" + exit 1 +fi + +SRC_PATH="${FLAGS_image_dir}/${FLAGS_image_name}" +if [ -z $FLAGS_image_name ] || [ ! -f $SRC_PATH ]; then + echo "Error: invalid flag --image_name" + exit 1 +fi + +# Constants +OUTPUT_DIR=$FLAGS_image_dir +ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" +STATEFUL_FS_DIR="${OUTPUT_DIR}/stateful_partition" +RECOVERY_IMAGE="recovery_image.bin" + +mount_gpt_cleanup() { + "${SCRIPTS_DIR}/mount_gpt_image.sh" -u -r "$1" -s "$2" +} + +# Modifies an existing image for recovery use +update_recovery_packages() { + local image_name=$1 + local sector_size=512 # sector size in bytes + local num_sectors_vb=128 # number of sectors in kernel verification blob + # Start offset of kernel A (aligned to 4096-sector boundary) + local start_kern_a=4096 + local vb_file="${STATEFUL_FS_DIR}/verification_blob.kernel" + + echo "Modifying image ${image_name} for recovery use" + + trap "mount_gpt_cleanup \"${ROOT_FS_DIR}\" \"${STATEFUL_FS_DIR}\"" EXIT + + ${SCRIPTS_DIR}/mount_gpt_image.sh --from "${OUTPUT_DIR}" \ + --image "$( basename ${image_name} )" -r "${ROOT_FS_DIR}" \ + -s "${STATEFUL_FS_DIR}" + + # Mark the image as a recovery image (needed for recovery boot) + sudo touch "${STATEFUL_FS_DIR}/.recovery" + + # Copy verification blob out of kernel A into stateful partition + # so that we can restore it during recovery + sudo touch $vb_file + echo "Backing up kernel verification blob onto stateful partition ..." + sudo dd if="$image_name" of="$vb_file" skip=$start_kern_a bs=$sector_size \ + count=$num_sectors_vb conv=notrunc + + # Overwrite verification blob with recovery image verification blob + # TODO(tgao): resign kernel for recovery image + echo "Overwrite kernel verification blob with resigned blob for recovery..." + sudo dd if=/dev/zero of="$image_name" seek=$start_kern_a bs=$sector_size \ + count=$num_sectors_vb conv=notrunc + + trap - EXIT + ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${ROOT_FS_DIR}" \ + -s "${STATEFUL_FS_DIR}" +} + +# Main + +DST_PATH="${OUTPUT_DIR}/${RECOVERY_IMAGE}" +echo "Making a copy of original image ${SRC_PATH}" +cp $SRC_PATH $DST_PATH +update_recovery_packages $DST_PATH +echo "Recovery image created at ${DST_PATH}"