mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-10 22:46:58 +02:00
This commit is a part of transition to enable ARM kernel signing. It is at first an option that is enabled manually, and then (in this commit) enabled by default. After more tests, the scripts that generate unsigned ARM kernel partition will probably be removed. BUG=chromium-os:12352 TEST=./build_image && load_kernel_test -b 2 /path/to/chromiumos_image.bin /usr/share/vboot/devkeys/recovery_key.vbpubk Change-Id: I7d4ecc566f9c5cc0106a7af59255fc63fdfe017a Tested-by: Che-Liang Chiou <clchiou@chromium.org> Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org> Reviewed-by: Che-Liang Chiou <clchiou@chromium.org> Reviewed-by: Rong Chang <rongchang@chromium.org> Tested-by: Tom Wai-Hong Tam <waihong@chromium.org> Reviewed-on: http://gerrit.chromium.org/gerrit/1319 Tested-by: Nick Sanders <nsanders@chromium.org>
279 lines
8.7 KiB
Bash
Executable File
279 lines
8.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Copyright (c) 2011 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 keyfob-based chromeos system image for testability.
|
|
|
|
# --- BEGIN COMMON.SH BOILERPLATE ---
|
|
# Load common CrOS utilities. Inside the chroot this file is installed in
|
|
# /usr/lib/crosutils. Outside the chroot we find it relative to the script's
|
|
# location.
|
|
find_common_sh() {
|
|
local common_paths=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")"))
|
|
local path
|
|
|
|
SCRIPT_ROOT=
|
|
for path in "${common_paths[@]}"; do
|
|
if [ -r "${path}/common.sh" ]; then
|
|
SCRIPT_ROOT=${path}
|
|
break
|
|
fi
|
|
done
|
|
}
|
|
|
|
find_common_sh
|
|
. "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1)
|
|
# --- END COMMON.SH BOILERPLATE ---
|
|
|
|
# Need to be inside the chroot to load chromeos-common.sh
|
|
assert_inside_chroot
|
|
|
|
# Load functions and constants for chromeos-install
|
|
. "/usr/lib/installer/chromeos-common.sh" || \
|
|
die "Unable to load /usr/lib/installer/chromeos-common.sh"
|
|
|
|
get_default_board
|
|
|
|
DEFINE_string board "$DEFAULT_BOARD" "Board for which the image was built" b
|
|
DEFINE_boolean factory $FLAGS_FALSE \
|
|
"Modify the image for manufacturing testing" f
|
|
DEFINE_string image "" "Location of the rootfs raw image file" i
|
|
DEFINE_boolean installmask $FLAGS_TRUE \
|
|
"Use INSTALL_MASK to shrink the resulting image." m
|
|
DEFINE_integer jobs -1 \
|
|
"How many packages to build in parallel at maximum." j
|
|
DEFINE_string qualdb "" "Location of qualified component file" d
|
|
DEFINE_boolean yes $FLAGS_FALSE "Answer yes to all prompts" y
|
|
DEFINE_string build_root "/build" \
|
|
"The root location for board sysroots."
|
|
DEFINE_boolean fast $DEFAULT_FAST "Call many emerges in parallel"
|
|
DEFINE_boolean inplace $FLAGS_TRUE \
|
|
"Modify/overwrite the image $CHROMEOS_IMAGE_NAME in place. \
|
|
Otherwise the image will be copied to $CHROMEOS_TEST_IMAGE_NAME \
|
|
(or $CHROMEOS_FACTORY_TEST_IMAGE_NAME for --factory) if needed, and \
|
|
modified there"
|
|
DEFINE_boolean force_copy $FLAGS_FALSE \
|
|
"Always rebuild test image if --noinplace"
|
|
# TODO(clchiou): Remove this flag after arm verified boot is stable
|
|
DEFINE_boolean crosbug12352_arm_kernel_signing ${FLAGS_TRUE} \
|
|
"Sign kernel partition for ARM images (temporary hack)."
|
|
|
|
# Parse command line
|
|
FLAGS "$@" || exit 1
|
|
eval set -- "$FLAGS_ARGV"
|
|
|
|
EMERGE_CMD="emerge"
|
|
EMERGE_BOARD_CMD="emerge-$FLAGS_board"
|
|
if [ $FLAGS_fast -eq $FLAGS_TRUE ]; then
|
|
echo "Using alternate emerge"
|
|
EMERGE_CMD="$GCLIENT_ROOT/chromite/bin/parallel_emerge"
|
|
EMERGE_BOARD_CMD="$EMERGE_CMD --board=$FLAGS_board"
|
|
fi
|
|
|
|
# No board, no default and no image set then we can't find the image
|
|
if [ -z "$FLAGS_image" -a -z "$FLAGS_board" ] ; then
|
|
setup_board_warning
|
|
die "mod_image_for_test failed. No board set and no image set"
|
|
fi
|
|
|
|
# We have a board name but no image set. Use image at default location
|
|
if [ -z "$FLAGS_image" ] ; then
|
|
IMAGES_DIR="$DEFAULT_BUILD_ROOT/images/$FLAGS_board"
|
|
FILENAME="$CHROMEOS_IMAGE_NAME"
|
|
FLAGS_image="$IMAGES_DIR/$(ls -t $IMAGES_DIR 2>&-| head -1)/$FILENAME"
|
|
fi
|
|
|
|
# Turn path into an absolute path.
|
|
FLAGS_image=$(eval readlink -f $FLAGS_image)
|
|
|
|
# What cross-build are we targeting?
|
|
. "$FLAGS_build_root/$FLAGS_board/etc/make.conf.board_setup"
|
|
# Figure out ARCH from the given toolchain.
|
|
# TODO: Move to common.sh as a function after scripts are switched over.
|
|
TC_ARCH=$(echo "$CHOST" | awk -F'-' '{ print $1 }')
|
|
case "$TC_ARCH" in
|
|
arm*)
|
|
ARCH="arm"
|
|
;;
|
|
*86)
|
|
ARCH="x86"
|
|
;;
|
|
*x86_64)
|
|
ARCH="amd64"
|
|
;;
|
|
*)
|
|
error "Unable to determine ARCH from toolchain: $CHOST"
|
|
exit 1
|
|
esac
|
|
|
|
if [[ ${FLAGS_crosbug12352_arm_kernel_signing} -eq ${FLAGS_TRUE} ]]; then
|
|
crosbug12352_flag="--crosbug12352_arm_kernel_signing"
|
|
else
|
|
crosbug12352_flag="--nocrosbug12352_arm_kernel_signing"
|
|
fi
|
|
|
|
# Make sure anything mounted in the rootfs/stateful is cleaned up ok on exit.
|
|
cleanup_mounts() {
|
|
# Occasionally there are some daemons left hanging around that have our
|
|
# root/stateful image file system open. We do a best effort attempt to kill
|
|
# them.
|
|
PIDS=$(sudo lsof -t "$1" | sort | uniq)
|
|
for pid in $PIDS; do
|
|
local cmdline=$(cat /proc/$pid/cmdline)
|
|
echo "Killing process that has open file on the mounted directory: $cmdline"
|
|
sudo kill $pid || true
|
|
done
|
|
}
|
|
|
|
cleanup() {
|
|
"$SCRIPTS_DIR/mount_gpt_image.sh" -u -r "$ROOT_FS_DIR" -s "$STATEFUL_DIR"
|
|
}
|
|
|
|
# Emerges chromeos-test onto the image.
|
|
emerge_chromeos_test() {
|
|
INSTALL_MASK=""
|
|
if [[ $FLAGS_installmask -eq $FLAGS_TRUE ]]; then
|
|
INSTALL_MASK="$DEFAULT_INSTALL_MASK"
|
|
fi
|
|
|
|
# Determine the root dir for test packages.
|
|
ROOT_DEV_DIR="$ROOT_FS_DIR/usr/local"
|
|
|
|
sudo INSTALL_MASK="$INSTALL_MASK" $EMERGE_BOARD_CMD \
|
|
--root="$ROOT_DEV_DIR" --root-deps=rdeps \
|
|
--usepkgonly chromeos-test $EMERGE_JOBS
|
|
}
|
|
|
|
|
|
install_autotest() {
|
|
local autotest_src="$FLAGS_build_root/$FLAGS_board/usr/local/autotest"
|
|
local stateful_root="$ROOT_FS_DIR/usr/local"
|
|
local autotest_client="$stateful_root/autotest"
|
|
|
|
echo "Install autotest into stateful partition from $AUTOTEST_SRC"
|
|
|
|
sudo mkdir -p "$autotest_client"
|
|
|
|
# Remove excess files from stateful partition.
|
|
sudo rm -rf "$autotest_client/"*
|
|
sudo rm -rf "$stateful_root/autotest-pkgs"
|
|
sudo rm -rf "$stateful_root/lib/icedtea6"
|
|
|
|
sudo rsync --delete --delete-excluded -auv \
|
|
--exclude=deps/realtimecomm_playground \
|
|
--exclude=tests/ltp \
|
|
--exclude=site_tests/graphics_O3DSelenium \
|
|
--exclude=site_tests/realtimecomm_GTalk\* \
|
|
--exclude=site_tests/platform_StackProtector \
|
|
--exclude=deps/chrome_test \
|
|
--exclude=site_tests/desktopui_BrowserTest \
|
|
--exclude=site_tests/desktopui_PageCyclerTests \
|
|
--exclude=site_tests/desktopui_UITest \
|
|
--exclude=.svn \
|
|
"$autotest_src/client/"* "$autotest_client"
|
|
|
|
sudo chmod 755 "$autotest_client"
|
|
sudo chown -R 1000:1000 "$autotest_client"
|
|
}
|
|
|
|
# main process begins here.
|
|
|
|
IMAGE_DIR=$(dirname "$FLAGS_image")
|
|
|
|
# Copy the image to a test location if required
|
|
if [ $FLAGS_inplace -eq $FLAGS_FALSE ]; then
|
|
if [ $FLAGS_factory -eq $FLAGS_TRUE ]; then
|
|
TEST_PATHNAME="$IMAGE_DIR/$CHROMEOS_FACTORY_TEST_IMAGE_NAME"
|
|
typename="factory"
|
|
else
|
|
TEST_PATHNAME="$IMAGE_DIR/$CHROMEOS_TEST_IMAGE_NAME"
|
|
typename="test"
|
|
fi
|
|
if [ ! -f "$TEST_PATHNAME" -o $FLAGS_force_copy -eq $FLAGS_TRUE ] ; then
|
|
echo "Creating test image from original..."
|
|
$COMMON_PV_CAT "$FLAGS_image" >"$TEST_PATHNAME" ||
|
|
die "Cannot copy $FLAGS_image to test image"
|
|
FLAGS_image="$TEST_PATHNAME"
|
|
else
|
|
echo "Using cached $typename image"
|
|
exit
|
|
fi
|
|
|
|
# No need to confirm now, since we are not overwriting the main image
|
|
FLAGS_yes="$FLAGS_TRUE"
|
|
fi
|
|
|
|
# Make sure this is really what the user wants, before nuking the device
|
|
if [ $FLAGS_yes -ne $FLAGS_TRUE ]; then
|
|
read -p "Modifying image $FLAGS_image for test; are you sure (y/N)? " SURE
|
|
SURE="${SURE:0:1}" # Get just the first character
|
|
if [ "$SURE" != "y" ]; then
|
|
echo "Ok, better safe than sorry."
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "Modifying image $FLAGS_image for test..."
|
|
fi
|
|
|
|
# Abort early if we can't find the image
|
|
if [ ! -f $FLAGS_image -a $FLAGS_inplace -eq $FLAGS_TRUE ] ; then
|
|
die "No image found at $FLAGS_image to modify"
|
|
fi
|
|
|
|
set -e
|
|
|
|
IMAGE_DIR=$(dirname "$FLAGS_image")
|
|
IMAGE_NAME=$(basename "$FLAGS_image")
|
|
ROOT_FS_DIR="$IMAGE_DIR/rootfs"
|
|
STATEFUL_DIR="$IMAGE_DIR/stateful_partition"
|
|
|
|
trap cleanup EXIT
|
|
|
|
# Mounts gpt image and sets up var, /usr/local and symlinks.
|
|
"$SCRIPTS_DIR/mount_gpt_image.sh" -i "$IMAGE_NAME" -f "$IMAGE_DIR" \
|
|
-r "$ROOT_FS_DIR" -s "$STATEFUL_DIR"
|
|
|
|
emerge_chromeos_test
|
|
|
|
MOD_TEST_SCRIPT="$SCRIPTS_DIR/mod_for_test_scripts/test_setup.sh"
|
|
# Run test setup script to modify the image
|
|
sudo GCLIENT_ROOT="$GCLIENT_ROOT" ROOT_FS_DIR="$ROOT_FS_DIR" \
|
|
STATEFUL_DIR="$STATEFUL_DIR" ARCH="$ARCH" "$MOD_TEST_SCRIPT"
|
|
|
|
if [ $FLAGS_factory -eq $FLAGS_TRUE ]; then
|
|
sudo INSTALL_MASK="$INSTALL_MASK" $EMERGE_BOARD_CMD \
|
|
--root="$ROOT_FS_DIR" --root-deps=rdeps \
|
|
factorytest-init $EMERGE_JOBS
|
|
|
|
install_autotest
|
|
|
|
MOD_FACTORY_SCRIPT="$SCRIPTS_DIR/mod_for_factory_scripts/factory_setup.sh"
|
|
# Run factory setup script to modify the image
|
|
sudo GCLIENT_ROOT="$GCLIENT_ROOT" ROOT_FS_DIR="$ROOT_FS_DIR" \
|
|
QUALDB="$FLAGS_qualdb" BOARD=$FLAGS_board "$MOD_FACTORY_SCRIPT"
|
|
fi
|
|
|
|
# Re-run ldconfig to fix /etc/ldconfig.so.cache.
|
|
sudo ldconfig -r "$ROOT_FS_DIR"
|
|
|
|
# Let's have a look at the image just in case..
|
|
if [ "$VERIFY" = "true" ]; then
|
|
pushd "$ROOT_FS_DIR"
|
|
bash
|
|
popd
|
|
fi
|
|
|
|
cleanup
|
|
|
|
# Now make it bootable with the flags from build_image
|
|
"$SCRIPTS_DIR/bin/cros_make_image_bootable" "$(dirname "$FLAGS_image")" \
|
|
"$(basename "$FLAGS_image")" \
|
|
${crosbug12352_flag}
|
|
|
|
|
|
print_time_elapsed
|
|
|
|
trap - EXIT
|