mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-08 13:36:58 +02:00
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
This commit is contained in:
parent
b3cf233d4c
commit
e28239d294
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user