Index: mod_image_for_recovery.sh |
diff --git a/mod_image_for_recovery.sh b/mod_image_for_recovery.sh |
index 6a0b261330ea9d1fdb98c28b1ff29f19bb228547..3e4a6f978032ff5743503d35293b328343635514 100755 |
--- a/mod_image_for_recovery.sh |
+++ b/mod_image_for_recovery.sh |
@@ -27,7 +27,7 @@ get_default_board |
DEFINE_string board "$DEFAULT_BOARD" "Board for which the image was built" b |
DEFINE_integer statefulfs_sectors 4096 \ |
- "Number of sectors to use for the stateful filesystem" |
+ "Number of sectors to use for the stateful filesystem when minimizing" |
# Skips the build steps and just does the kernel swap. |
DEFINE_string kernel_image "" \ |
"Path to a pre-built recovery kernel" |
@@ -42,6 +42,12 @@ DEFINE_boolean kernel_image_only $FLAGS_FALSE \ |
"Emit the recovery kernel image only" |
DEFINE_boolean sync_keys $FLAGS_TRUE \ |
"Update the kernel to be installed with the vblock from stateful" |
+DEFINE_boolean minimize_image $FLAGS_TRUE \ |
+ "Decides if the original image is used or a minimal recovery image is \ |
+created." |
+DEFINE_boolean modify_in_place $FLAGS_FALSE \ |
+ "Modifies the source image in place. This cannot be used with \ |
+--minimize_image." |
DEFINE_integer jobs -1 \ |
"How many packages to build in parallel at maximum." j |
DEFINE_string build_root "/build" \ |
@@ -50,6 +56,9 @@ DEFINE_string build_root "/build" \ |
DEFINE_string rootfs_hash "/tmp/rootfs.hash" \ |
"Path where the rootfs hash should be stored." |
+DEFINE_boolean verbose $FLAGS_FALSE \ |
+ "Log all commands to stdout." v |
+ |
# Keep in sync with build_image. |
DEFINE_string keys_dir "/usr/share/vboot/devkeys" \ |
"Directory containing the signing keys." |
@@ -58,6 +67,17 @@ DEFINE_string keys_dir "/usr/share/vboot/devkeys" \ |
FLAGS "$@" || exit 1 |
eval set -- "${FLAGS_ARGV}" |
+if [ $FLAGS_verbose -eq $FLAGS_FALSE ]; then |
+ exec 2>/dev/null |
+ # Redirecting to stdout instead of stderr since |
+ # we silence stderr above. |
+ die() { |
+ echo -e "${V_BOLD_RED}ERROR : $1${V_VIDOFF}" |
+ exit 1 |
+ } |
+fi |
+set -x # Make debugging with -v easy. |
+ |
EMERGE_CMD="emerge" |
EMERGE_BOARD_CMD="emerge-${FLAGS_board}" |
@@ -178,10 +198,11 @@ create_recovery_kernel_image() { |
local kern_tmp=$(mktemp) |
local kern_hash= |
- dd if="$FLAGS_image" bs=512 count=$kern_size skip=$kern_offset of="$kern_tmp" |
+ dd if="$FLAGS_image" bs=512 count=$kern_size \ |
+ skip=$kern_offset of="$kern_tmp" 1>&2 |
# We're going to use the real signing block. |
if [ $FLAGS_sync_keys -eq $FLAGS_TRUE ]; then |
- dd if="$INSTALL_VBLOCK" of="$kern_tmp" conv=notrunc |
+ dd if="$INSTALL_VBLOCK" of="$kern_tmp" conv=notrunc 1>&2 |
fi |
local kern_hash=$(sha1sum "$kern_tmp" | cut -f1 -d' ') |
rm "$kern_tmp" |
@@ -200,7 +221,7 @@ create_recovery_kernel_image() { |
--root=${cros_root} \ |
--keys_dir="${FLAGS_keys_dir}" \ |
--nouse_dev_keys \ |
- ${verity_args} |
+ ${verity_args} 1>&2 |
sudo rm "$FLAGS_rootfs_hash" |
sudo losetup -d "$root_dev" |
trap - RETURN |
@@ -236,6 +257,13 @@ install_recovery_kernel() { |
local kern_a_size=$(partsize "$RECOVERY_IMAGE" 2) |
local kern_b_offset=$(partoffset "$RECOVERY_IMAGE" 4) |
local kern_b_size=$(partsize "$RECOVERY_IMAGE" 4) |
+ |
+ if [ $kern_b_size -eq 1 ]; then |
+ echo "Image was created with no KERN-B partition reserved!" 1>&2 |
+ echo "Cannot proceed." 1>&2 |
+ return 1 |
+ fi |
+ |
# Backup original kernel to KERN-B |
dd if="$RECOVERY_IMAGE" of="$RECOVERY_IMAGE" bs=512 \ |
count=$kern_a_size \ |
@@ -277,14 +305,22 @@ install_recovery_kernel() { |
} |
maybe_resize_stateful() { |
+ # If we're not minimizing, then just copy and go. |
+ if [ $FLAGS_minimize_image -eq $FLAGS_FALSE ]; then |
+ if [ "$FLAGS_image" != "$RECOVERY_IMAGE" ]; then |
+ cp "$FLAGS_image" "$RECOVERY_IMAGE" |
+ fi |
+ return 0 |
+ fi |
+ |
# Rebuild the image with a 1 sector stateful partition |
local err=0 |
local small_stateful=$(mktemp) |
dd if=/dev/zero of="$small_stateful" bs=512 \ |
- count=${FLAGS_statefulfs_sectors} |
+ count=${FLAGS_statefulfs_sectors} 1>&2 |
trap "rm $small_stateful" RETURN |
# Don't bother with ext3 for such a small image. |
- /sbin/mkfs.ext2 -F -b 4096 "$small_stateful" |
+ /sbin/mkfs.ext2 -F -b 4096 "$small_stateful" 1>&2 |
# If it exists, we need to copy the vblock over to stateful |
# This is the real vblock and not the recovery vblock. |
@@ -301,14 +337,20 @@ maybe_resize_stateful() { |
# Create a recovery image of the right size |
# TODO(wad) Make the developer script case create a custom GPT with |
# just the kernel image and stateful. |
- update_partition_table "$FLAGS_image" "$small_stateful" 4096 "$RECOVERY_IMAGE" |
+ update_partition_table "$FLAGS_image" "$small_stateful" 4096 \ |
+ "$RECOVERY_IMAGE" 1>&2 |
return $err |
} |
-# main process begins here. |
+cleanup() { |
+ set +e |
+ if [ "$FLAGS_image" != "$RECOVERY_IMAGE" ]; then |
+ rm "$RECOVERY_IMAGE" |
+ fi |
+ rm "$INSTALL_VBLOCK" |
+} |
-# Make sure this is really what the user wants, before nuking the device |
-echo "Creating recovery image ${FLAGS_to} from ${FLAGS_image} . . . " |
+# main process begins here. |
set -e |
set -u |
@@ -335,6 +377,15 @@ if [ $FLAGS_kernel_image_only -eq $FLAGS_TRUE -a \ |
die "Cannot use --kernel_image_only with --kernel_image" |
fi |
+if [ $FLAGS_modify_in_place -eq $FLAGS_TRUE ]; then |
+ if [ $FLAGS_minimize_image -eq $FLAGS_TRUE ]; then |
+ die "Cannot use --modify_in_place and --minimize_image together." |
+ fi |
+ RECOVERY_IMAGE="${FLAGS_image}" |
+fi |
+ |
+echo "Creating recovery image from ${FLAGS_image}" |
+ |
INSTALL_VBLOCK=$(get_install_vblock) |
if [ -z "$INSTALL_VBLOCK" ]; then |
die "Could not copy the vblock from stateful." |
@@ -343,10 +394,10 @@ fi |
if [ -z "$FLAGS_kernel_image" ]; then |
emerge_recovery_kernel |
create_recovery_kernel_image |
+ echo "Recovery kernel created at $RECOVERY_KERNEL_IMAGE" |
else |
RECOVERY_KERNEL_IMAGE="$FLAGS_kernel_image" |
fi |
-echo "Kernel emitted: $RECOVERY_KERNEL_IMAGE." |
if [ $FLAGS_kernel_image_only -eq $FLAGS_TRUE ]; then |
echo "Kernel emitted. Stopping there." |
@@ -354,13 +405,16 @@ if [ $FLAGS_kernel_image_only -eq $FLAGS_TRUE ]; then |
exit 0 |
fi |
-rm "$RECOVERY_IMAGE" || true # Start fresh :) |
+if [ $FLAGS_modify_in_place -eq $FLAGS_FALSE ]; then |
+ rm "$RECOVERY_IMAGE" || true # Start fresh :) |
+fi |
-trap "rm \"$RECOVERY_IMAGE\" && rm \"$INSTALL_VBLOCK\"" EXIT |
+trap cleanup EXIT |
-maybe_resize_stateful # Also copies the image |
+maybe_resize_stateful # Also copies the image if needed. |
install_recovery_kernel |
+echo "Recovery image created at $RECOVERY_IMAGE" |
print_time_elapsed |
trap - EXIT |