Index: make_developer_script_runner.sh |
diff --git a/make_developer_script_runner.sh b/make_developer_script_runner.sh |
new file mode 100755 |
index 0000000000000000000000000000000000000000..a1ef2db1e5a9e64c87ec892ec4e8662838ade7d3 |
--- /dev/null |
+++ b/make_developer_script_runner.sh |
@@ -0,0 +1,122 @@ |
+#!/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. |
+ |
+# This script modifies a base image to act as a recovery installer. |
+# If a developer payload is supplied, it will be used. |
+# It is very straight forward, top to bottom to show clearly what is |
+# little is needed to create a developer shim to run a signed script. |
+ |
+# Load common constants. This should be the first executable line. |
+# The path to common.sh should be relative to your script's location. |
+. "$(dirname "$0")/common.sh" |
+ |
+# Load functions and constants for chromeos-install |
+. "$(dirname "$0")/chromeos-common.sh" |
+ |
+DEFINE_integer statefulfs_size 2 \ |
+ "Number of mebibytes to use for the stateful filesystem" |
anush
2010/11/01 22:29:48
Nit: mebibyte - does it come after the yottabyte :
|
+DEFINE_string developer_private_key \ |
+ "/usr/share/vboot/devkeys/kernel_data_key.vbprivk" \ |
+ "Path to the developer's private key" |
+DEFINE_string developer_keyblock \ |
+ "/usr/share/vboot/devkeys/kernel.keyblock" \ |
+ "Path to the developer's keyblock" |
+DEFINE_string developer_script "" \ |
+ "Path to the developer script if desired." |
+# TODO(wad) wire up support for just swapping a pre-made kernel |
+# Skips the build steps and just does the kernel swap. |
+DEFINE_string kernel_image "" \ |
+ "Path to a pre-built recovery kernel" |
+DEFINE_boolean verbose $FLAGS_FALSE \ |
+ "Emits stderr too" v |
+DEFINE_string image "dev_runner_image.bin" \ |
+ "Path to output image to" |
+ |
+# Parse command line |
+FLAGS "$@" || exit 1 |
+eval set -- "${FLAGS_ARGV}" |
+ |
+if [ $FLAGS_verbose -eq $FLAGS_FALSE ]; then |
+ exec 2>/dev/null |
+fi |
+set -x # Make debugging with -v easy. |
+ |
+if [ -z "$FLAGS_kernel_image" ]; then |
+ die "--kernel_image with a recovery kernel is needed" |
+fi |
+ |
+if [ -z "$FLAGS_developer_script" ]; then |
+ die "--developer_script must be supplied." |
+fi |
+ |
+locate_gpt |
+ |
+set -eu |
+ |
+header_offset=34 |
+stateful_sectors=$(((FLAGS_statefulfs_size * 1024 * 1024) / 512)) |
+stateful_sectors=$(roundup $stateful_sectors) |
+ |
+if [ -b "$FLAGS_image" ]; then |
+ sudo=sudo |
+else |
+ max_kern_size=32768 |
+ dd if=/dev/zero of="${FLAGS_image}" bs=512 count=0 \ |
+ seek=$((1 + max_kern_size + header_offset + stateful_sectors)) |
+ sudo="" |
+fi |
+ |
+## STATEFUL |
+ |
+stateful_image=$(mktemp) |
+trap "rm $stateful_image" EXIT |
+ |
+dd if=/dev/zero of="$stateful_image" bs=512 \ |
+ seek=$stateful_sectors count=0 |
+/sbin/mkfs.ext3 -F -b 4096 $stateful_image 1>&2 |
+ |
+stateful_mnt=$(mktemp -d) |
+sudo mount -o loop $stateful_image "$stateful_mnt" || exit 1 |
+userdir="$stateful_mnt/userdir" |
+userfile="$userdir/runme" |
+sudo mkdir -p "$userdir" |
+sudo cp "$FLAGS_developer_script" "$userfile" |
+sudo chmod +x "$userfile" |
+sudo dev_sign_file --sign "$userfile" \ |
+ --keyblock "$FLAGS_developer_keyblock" \ |
+ --signprivate "$FLAGS_developer_private_key" \ |
+ --vblock "${userfile}.vblock" |
+sudo umount -d "$stateful_mnt" |
+rmdir "$stateful_mnt" |
+ |
+## GPT |
+ |
+kernel_bytes=$(stat -c '%s' $FLAGS_kernel_image) |
+kernel_sectors=$((kernel_bytes / 512)) |
+kernel_sectors=$(roundup $kernel_sectors) |
+ |
+$sudo $GPT create $FLAGS_image |
+trap "rm $FLAGS_image" ERR |
+ |
+offset=$header_offset |
+$sudo $GPT add -b $offset -s $stateful_sectors \ |
+ -t data -l "STATE" $FLAGS_image |
+$sudo dd if=$stateful_image of=$FLAGS_image bs=512 conv=notrunc \ |
+ seek=$offset count=$stateful_sectors |
+ |
+offset=$((offset + stateful_sectors)) |
+$sudo $GPT add -b $offset -s $kernel_sectors \ |
+ -t kernel -l "KERN-A" -S 0 -T 15 -P 15 $FLAGS_image |
+$sudo dd if=$FLAGS_kernel_image of=$FLAGS_image bs=512 conv=notrunc \ |
+ seek=$offset count=$kernel_sectors |
+# The kernel will ignore GPT without a legacymbr. |
+PMBRCODE=$(readlink -f /usr/share/syslinux/gptmbr.bin) |
+# Have it legacy boot off of stateful, not that it should matter. |
+$sudo $GPT boot -p -b "$PMBRCODE" -i 1 $FLAGS_image 1>&2 |
+ |
+$sudo $GPT show $FLAGS_image |
+ |
+echo "Done." |