[CRIU] [PATCH vv 2/3] scripts: systemd-autofs-restart.sh added

Stanislav Kinsburskiy skinsbursky at virtuozzo.com
Thu Apr 7 02:59:36 PDT 2016


This script restarts systemd autofs services to workaround a problem, when
systemd doesn't consider autofs mount as own after restore (alien device ID
problem)

v2:
1) Added different checks: for process with pid, active service, systemd based
container.

Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
 scripts/systemd-autofs-restart.sh |   58 +++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100755 scripts/systemd-autofs-restart.sh

diff --git a/scripts/systemd-autofs-restart.sh b/scripts/systemd-autofs-restart.sh
new file mode 100755
index 0000000..0bdbb33
--- /dev/null
+++ b/scripts/systemd-autofs-restart.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+#
+# This script can be used as a workaround for systemd autofs mount migration.
+# The problem is that systemd is a clever guy: before mounting of actual file
+# system on top of autofs mount, it first checks that device number of autofs
+# mount is equal to the one, stored in sytemd internals. If they do not match,
+# systemd ignores kernel request.
+# The problem happens each time autofs is restored (new device number for
+# autofs superblock) and can't be properly solved without some kind of "device
+# namespaces", where device number can be preseved.
+# But some of systemd services can be painlessly restarted. Like
+# proc-sys-fs-binfmt_misc.
+#
+# Usage:
+# criu restore <options> --action-script $(pwd)/scripts/systemd-autofs-restart.sh
+#
+[ "$CRTOOLS_SCRIPT_ACTION" == "post-resume" ] || exit 0
+
+if [ ! -n "$NS_PID" ]; then
+	echo "NS_PID environment variable is not set"
+	exit 1
+fi
+
+if [ ! -d "/proc/$NS_PID" ]; then
+	echo "Process with NS_PID=$NS_PID doesn't exist"
+	exit 1
+fi
+
+NS_ENTER=/usr/nsenter
+[ ! -x $NSENTER ] || NS_ENTER=/usr/bin/nsenter
+
+if [ ! -x $NS_ENTER ]; then
+	echo "$NS_ENTER binary not found"
+	exit 2
+fi
+
+JOIN_CT="$NS_ENTER -t $NS_PID -m -u"
+
+# Skip container, if it's not systemd based
+[ $($JOIN_CT basename -- $(readlink /proc/1/exe)) == "systemd" ] || exit 0
+
+AUTOFS_SERVICES="proc-sys-fs-binfmt_misc.automount"
+
+for service in $AUTOFS_SERVICES; do
+	status=$($JOIN_CT systemctl is-active $service)
+	if [ $status == "active" ]; then
+		$JOIN_CT systemctl restart $service
+		if [ $? -ne 0 ]; then
+			echo "Failed to restart $service service"
+			exit 2
+		fi
+		echo "$service restarted"
+	else
+		echo "$service skipped ($status)"
+	fi
+done
+
+exit 0



More information about the CRIU mailing list