From e28239d294f70cf0036d9fc9e07a93fa129b4e4e Mon Sep 17 00:00:00 2001 From: Zdenek Behan Date: Thu, 7 Apr 2011 00:37:20 +0200 Subject: [PATCH] enter_chroot: introduce a sync process that synchronizes given files between chroot and host Currently used for resolv.conf and hosts, because these files can change during the lifetime of a chroot, for example on computers with more dynamic network (laptops). While this creates a persistent process in the background for the sole purpose of syncing files, the performance impact is negligible. BUG=12316 TEST=below 1) enter_chroot once+quit, many times + quit, verify correct exit behaviour 2) enter_chroot, modify host resolv.conf, see chroot being updated Change-Id: I26573570c027acc2c214a00838a6f982a7585b13 R=robotboy@chromium.org,dparker@chromium.org,sosa@chromium.org Review URL: http://codereview.chromium.org/6720005 --- enter_chroot.sh | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/enter_chroot.sh b/enter_chroot.sh index bca9c68866..5c7f07b52a 100755 --- a/enter_chroot.sh +++ b/enter_chroot.sh @@ -129,6 +129,7 @@ SAVED_AUTOMOUNT_PREF_FILE="/tmp/.automount_pref" sudo chmod 0777 "$FLAGS_chroot/var/lock" LOCKFILE="$FLAGS_chroot/var/lock/enter_chroot" +SYNCERPIDFILE="${FLAGS_chroot}/var/tmp/enter_chroot_sync.pid" function ensure_mounted { @@ -153,12 +154,46 @@ function ensure_mounted { fi } +function env_sync_proc { + # This function runs and performs periodic updates to the chroot env, if + # necessary. + + local poll_interval=10 + local sync_files="etc/resolv.conf etc/hosts" + + # Make sure the synced files are writable by normal user, so that we + # don't have to sudo inside the loop. + for file in ${sync_files}; do + sudo chown ${USER} ${FLAGS_chroot}/${file} 1>&2 + done + + while true; do + # Sync files + for file in ${sync_files}; do + if ! cmp /${file} ${FLAGS_chroot}/${file} &> /dev/null; then + cp -f /${file} ${FLAGS_chroot}/${file} + fi + done + + sleep ${poll_interval} + done +} + function setup_env { # Validate sudo timestamp before entering the critical section so that we # don't stall for a password while we have the lockfile. # Don't use sudo -v since that has issues on machines w/ no password. sudo echo "" > /dev/null + # Syncer proc, but only the first time + if ! [ -f "${SYNCERPIDFILE}" ] || \ + ! [ -d /proc/$(cat "${SYNCERPIDFILE}") ]; then + debug "Starting sync process" + env_sync_proc & + echo $! > "${SYNCERPIDFILE}" + disown $! + fi + ( flock 200 echo $$ >> "$LOCKFILE" @@ -283,6 +318,9 @@ function teardown_env { debug "At least one other pid is running in the chroot, so not" debug "tearing down env." else + debug "Stopping syncer process" + kill $(cat "${SYNCERPIDFILE}") + MOUNTED_PATH=$(readlink -f "$FLAGS_chroot") debug "Unmounting chroot environment." # sort the list of mounts in reverse order, to ensure umount of