Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(458)

Unified Diff: src/scripts/build_image

Issue 1561014: Fix symlinks for gmergefs on stateful and keep other stateful items installed from build_image (Closed)
Patch Set: Merged Created 10 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/scripts/build_image
diff --git a/src/scripts/build_image b/src/scripts/build_image
index 04b1ad64dd51e188a68ca5959d6d1ac90711c3be..6c933356b038f967efdcb6c55aff70946ee74b1e 100755
--- a/src/scripts/build_image
+++ b/src/scripts/build_image
@@ -36,7 +36,7 @@ DEFINE_boolean installmask $FLAGS_TRUE \
DEFINE_integer jobs -1 \
"How many packages to build in parallel at maximum."
DEFINE_boolean statefuldev $FLAGS_FALSE \
- "Install development packages on stateful partition -- still experimental"
+ "Install development packages on stateful partition rather than the rootfs"
DEFINE_string to "" \
"The target image file or device"
DEFINE_boolean withtest $FLAGS_FALSE \
@@ -55,13 +55,6 @@ if [ -z "$FLAGS_board" ] ; then
exit 1
fi
-# Sanity check: statefuldev cannot be true if withdev is false.
-if [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] &&
- [ $FLAGS_withdev -eq $FLAGS_FALSE ] ; then
- echo "ERROR: statefuldev flag cannot be set to true without withdev"
- exit 1
-fi
-
# Determine build version.
. "${SCRIPTS_DIR}/chromeos_version.sh"
@@ -77,6 +70,7 @@ BOARD="${FLAGS_board}"
BOARD_ROOT="${FLAGS_build_root}/${BOARD}"
LOOP_DEV=
+STATEFUL_LOOP_DEV=
# What cross-build are we targeting?
. "${BOARD_ROOT}/etc/make.conf.board_setup"
@@ -119,12 +113,14 @@ mkdir -p "$OUTPUT_DIR"
cleanup_rootfs_loop() {
sudo umount "$LOOP_DEV"
- sleep 1 # in case $LOOP_DEV is in use (TODO: Try umount -l?).
+ sleep 1 # in case $LOOP_DEV is in use.
sudo losetup -d "$LOOP_DEV"
}
cleanup_stateful_fs_loop() {
- sudo umount "$STATEFUL_LOOP_DEV"
+ sudo umount "${ROOT_FS_DIR}/usr/local"
+ sudo umount "${ROOT_FS_DIR}/var"
+ sudo umount "${STATEFUL_DIR}"
sleep 1 # follows from cleanup_root_fs_loop.
sudo losetup -d "$STATEFUL_LOOP_DEV"
}
@@ -137,11 +133,6 @@ cleanup() {
# Disable die on error.
set +e
- # Unmount stateful partition from usr/local if bound.
- if [ -s "$ROOT_FS_DIR/usr/local/bin" ] ; then
- sudo umount $ROOT_FS_DIR/usr/local
- fi
-
if [[ -n "$STATEFUL_LOOP_DEV" ]]; then
cleanup_stateful_fs_loop
fi
@@ -158,6 +149,39 @@ cleanup() {
set -e
}
+# ${DEV_IMAGE_ROOT} specifies the location of where developer packages will
+# be installed on the stateful dir. On a Chromium OS system, this will
+# translate to /usr/local
+DEV_IMAGE_ROOT=
+
+# Sets up symlinks for the stateful partition based on the root specified by
+# ${1} and var directory specified by ${2}.
+setup_symlinks_on_root() {
+ echo "Setting up symlinks on the stateful partition rooted at ${1} with"\
+ "var directory located at ${2}"
+
+ for path in usr local; do
+ if [ -h "${DEV_IMAGE_ROOT}/${path}" ] ; then
+ sudo unlink "${DEV_IMAGE_ROOT}/${path}"
+ elif [ -e "${DEV_IMAGE_ROOT}/${path}" ] ; then
+ echo "*** ERROR: ${DEV_IMAGE_ROOT}/${path} should be a symlink if exists"
+ return 1
+ fi
+ sudo ln -s ${1} "${DEV_IMAGE_ROOT}/${path}"
+ done
+
+ # Setup var. Var is on the stateful partition at /var for both non-developer
+ # builds and developer builds.
+ if [ -h "${DEV_IMAGE_ROOT}/var" ] ; then
+ sudo unlink "${DEV_IMAGE_ROOT}/var"
+ elif [ -e "${DEV_IMAGE_ROOT}/var" ] ; then
+ echo "*** ERROR: ${DEV_IMAGE_ROOT}/var should be a symlink if it exists"
+ return 1
+ fi
+
+ sudo ln -s "${2}" "${DEV_IMAGE_ROOT}/var"
+}
+
trap cleanup EXIT
mkdir -p "$ROOT_FS_DIR"
@@ -202,6 +226,9 @@ sudo tune2fs -L "C-STATE" -U "$UUID" -c 0 -i 0 \
mkdir -p "$STATEFUL_DIR"
sudo mount "$STATEFUL_LOOP_DEV" "$STATEFUL_DIR"
+# Set dev image root now that we have mounted the stateful partition we created
+DEV_IMAGE_ROOT="$STATEFUL_DIR/dev_image"
+
# Turn root file system into bootable image.
if [[ "$ARCH" = "x86" ]]; then
# Setup extlinux configuration.
@@ -253,27 +280,21 @@ if [[ $FLAGS_jobs -ne -1 ]]; then
EMERGE_JOBS="--jobs=$FLAGS_jobs"
fi
-if [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] ; then
- # Creating stateful partition.
- echo "Setting up symlinks for stateful partition install"
- DEV_IMAGE_ROOT="$STATEFUL_DIR/dev_image"
- sudo mkdir -p "$DEV_IMAGE_ROOT/usr"
-
- # Setup symlinks in stateful partition.
- for path in bin include lib libexec sbin share; do
- sudo mkdir "$DEV_IMAGE_ROOT/$path"
- sudo ln -s "$DEV_IMAGE_ROOT/$path" "$DEV_IMAGE_ROOT/usr/$path"
- done
+# Prepare stateful partition with some pre-created directories
+sudo mkdir -p "${DEV_IMAGE_ROOT}"
+sudo mkdir -p "${STATEFUL_DIR}/var"
- # Setup symlinks that don't conform to above model.
- sudo ln -s "$DEV_IMAGE_ROOT/lib" "$DEV_IMAGE_ROOT/usr/lib64"
- sudo ln -s "$DEV_IMAGE_ROOT" "$DEV_IMAGE_ROOT/usr/local"
+# Create symlinks so that /usr/local/usr based directories are symlinked to
+# /usr/local/ directories e.g. /usr/local/usr/bin -> /usr/local/bin, etc.
+setup_symlinks_on_root "${DEV_IMAGE_ROOT}" "${STATEFUL_DIR}/var"
- # Bind to rootfs.
- echo "Binding stateful partition to rootfs's /usr/local"
- sudo mkdir -p "$ROOT_FS_DIR/usr/local"
- sudo mount -n --bind "$DEV_IMAGE_ROOT" "$ROOT_FS_DIR/usr/local"
-fi
+# Perform binding rather than symlinking because directories must exist
+# on rootfs so that we can bind at run-time since rootfs is read-only
+echo "Binding directories from stateful partition onto the rootfs"
+sudo mkdir -p "${ROOT_FS_DIR}/usr/local"
+sudo mount --bind "${DEV_IMAGE_ROOT}" "${ROOT_FS_DIR}/usr/local"
+sudo mkdir -p "${ROOT_FS_DIR}/var"
+sudo mount --bind "${STATEFUL_DIR}/var" "${ROOT_FS_DIR}/var"
# We "emerge --root=$ROOT_FS_DIR --root-deps=rdeps --usepkgonly" all of the
# runtime packages for chrome os. This builds up a chrome os image from binary
@@ -304,25 +325,6 @@ if [[ $FLAGS_withtest -eq $FLAGS_TRUE ]] ; then
--usepkgonly chromeos-test $EMERGE_JOBS
fi
-# Clean up links setup for stateful install of extra packages.
-if [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] ; then
- # Fix symlinks so they work on live system.
- for path in bin include lib libexec sbin share; do
- sudo unlink $DEV_IMAGE_ROOT/usr/$path
- sudo ln -s /usr/local/$path $DEV_IMAGE_ROOT/usr/$path
- done
-
- # Fix exceptions.
- sudo unlink "$DEV_IMAGE_ROOT/usr/lib64"
- sudo unlink "$DEV_IMAGE_ROOT/usr/local"
-
- sudo ln -s "/usr/local/lib" "$DEV_IMAGE_ROOT/usr/lib64"
- sudo ln -s "/usr/local" "$DEV_IMAGE_ROOT/usr/local"
-
- #TODO(sosa@chromium.org) - /usr/bin/xterm symlink not created in stateful.
- sudo ln -sf "/usr/local/bin/aterm" "/usr/bin/xterm"
-fi
-
# Perform any customizations on the root file system that are needed.
WITH_DEV=""
if [[ $FLAGS_withdev -eq $FLAGS_TRUE ]]; then
@@ -358,7 +360,6 @@ menuentry "32-bit serial" {
}
EOF
-#TODO(sosa@chromium.org) - Does it make sense to leave /usr/local bound here?
"${SCRIPTS_DIR}/customize_rootfs" \
--root="$ROOT_FS_DIR" \
--target="$ARCH" \
@@ -370,21 +371,27 @@ EOF
--root="$ROOT_FS_DIR" \
--target="$ARCH"
-# Set dev_mode flag and update library cache.
+# Enable dev mode on the target system and re-run ldconfig
+# for rootfs's ld.so.cache
if [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] ; then
+ # Flag will mount /usr/local on target device
+ sudo mkdir -p "$ROOT_FS_DIR/root"
sudo touch "$ROOT_FS_DIR/root/.dev_mode"
+
+ # Re-run ldconfig to fix /etc/ldconfig.so.cache
sudo /sbin/ldconfig -r "$ROOT_FS_DIR"
-fi
-# Only bound if installing dev to stateful.
-if [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] ; then
- sudo umount "$ROOT_FS_DIR/usr/local"
+ #TODO(sosa@chromium.org) - /usr/bin/xterm symlink not created in stateful.
+ sudo ln -sf "/usr/local/bin/aterm" "/usr/bin/xterm"
fi
+# Clean up symlinks so they work on a running target rooted at "/".
+# Here development packages are rooted at /usr/local. However, do not
+# create /usr/local or /var on host (already exist on target).
+setup_symlinks_on_root "/usr/local" "/var"
+
# Cleanup loop devices.
-cleanup_esp_loop
-cleanup_stateful_fs_loop
-cleanup_rootfs_loop
+cleanup
# Create the GPT-formatted image
${SCRIPTS_DIR}/build_gpt.sh \
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698