Index: mod_image_for_recovery.sh |
diff --git a/mod_image_for_recovery.sh b/mod_image_for_recovery.sh |
new file mode 100755 |
index 0000000000000000000000000000000000000000..5d927f1931c547e9205613de7e2320342cba8877 |
--- /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}" |