flatcar-scripts/mod_image_for_test.sh
Tom Wai-Hong Tam bf772cffaa Skip dropping caches in each test and between iterations during factory tests.
Dropping caches (writing back all dirty pages to disk and clearing all the caches) is not necessary for factory tests. It can reduce the latency significantly. The scale is about 27s -> 3s, for running 2 empty tests.

Review URL: http://codereview.chromium.org/1780011
2010-04-29 14:57:37 +08:00

155 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2009 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.
# 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"
get_default_board
DEFINE_string board "$DEFAULT_BOARD" "Board for which the image was built"
DEFINE_string qualdb "/tmp/run_remote_tests.*" \
"Location of qualified component file"
DEFINE_string image "" "Location of the rootfs raw image file"
DEFINE_boolean factory $FLAGS_FALSE "Modify the image for manufacturing testing"
DEFINE_boolean yes $FLAGS_FALSE "Answer yes to all prompts" "y"
# Parse command line
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
# No board, no default and no image set then we can't find the image
if [ -z $FLAGS_image ] && [ -z $FLAGS_board ] ; then
setup_board_warning
echo "*** mod_image_for_test failed. No board set and no image set"
exit 1
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="chromiumos_image.bin"
FLAGS_image="${IMAGES_DIR}/$(ls -t $IMAGES_DIR 2>&-| head -1)/${FILENAME}"
fi
# Abort early if we can't find the image
if [ ! -f $FLAGS_image ] ; then
echo "No image found at $FLAGS_image"
exit 1
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 || /bin/true
done
}
cleanup_loop() {
sudo umount "$1"
sleep 1 # in case the loop device is in use
sudo losetup -d "$1"
}
cleanup() {
# Disable die on error.
set +e
cleanup_mounts "${ROOT_FS_DIR}"
if [ -n "${ROOT_LOOP_DEV}" ]
then
cleanup_loop "${ROOT_LOOP_DEV}"
fi
rmdir "${ROOT_FS_DIR}"
cleanup_mounts "${STATEFUL_DIR}"
if [ -n "${STATEFUL_LOOP_DEV}" ]
then
cleanup_loop "${STATEFUL_LOOP_DEV}"
fi
rmdir "${STATEFUL_DIR}"
# Turn die on error back on.
set -e
}
# main process begins here.
# 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
set -e
ROOT_FS_DIR=$(dirname "${FLAGS_image}")/rootfs
mkdir -p "${ROOT_FS_DIR}"
STATEFUL_DIR=$(dirname "${FLAGS_image}")/stateful_partition
mkdir -p "${STATEFUL_DIR}"
trap cleanup EXIT
# Figure out how to loop mount the rootfs partition. It should be partition 3
# on the disk image.
offset=$(partoffset "${FLAGS_image}" 3)
ROOT_LOOP_DEV=$(sudo losetup -f)
if [ -z "$ROOT_LOOP_DEV" ]; then
echo "No free loop device"
exit 1
fi
sudo losetup -o $(( $offset * 512 )) "${ROOT_LOOP_DEV}" "${FLAGS_image}"
sudo mount "${ROOT_LOOP_DEV}" "${ROOT_FS_DIR}"
# The stateful partition should be partition 1 on the disk image.
offset=$(partoffset "${FLAGS_image}" 1)
STATEFUL_LOOP_DEV=$(sudo losetup -f)
if [ -z "$STATEFUL_LOOP_DEV" ]; then
echo "No free loop device"
exit 1
fi
sudo losetup -o $(( $offset * 512 )) "${STATEFUL_LOOP_DEV}" "${FLAGS_image}"
sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_DIR}"
STATEFUL_DIR="${STATEFUL_DIR}"
MOD_TEST_ROOT="${GCLIENT_ROOT}/src/scripts/mod_for_test_scripts"
# Run test setup script to modify the image
sudo GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \
"${MOD_TEST_ROOT}/test_setup.sh"
if [ ${FLAGS_factory} -eq ${FLAGS_TRUE} ]; then
MOD_FACTORY_ROOT="${GCLIENT_ROOT}/src/scripts/mod_for_factory_scripts"
# Run factory setup script to modify the image
sudo GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \
STATEFUL_DIR="${STATEFUL_DIR}/dev_image" QUALDB="${FLAGS_qualdb}" \
"${MOD_FACTORY_ROOT}/factory_setup.sh"
fi
cleanup
trap - EXIT