From: Cyrill Gorcunov <gorcu...@openvz.org> The restore of ploop device is a bit tricky: its major/minor is not a constant but allocated dynamicaly by the kernel driver. Thus we may have a situation when /dev/ploopXX points for some obsolete name which we have to resolve into valid device.
For this sake we save old name in dev/$uuid form and when mount namespaces are restored but their roots are not moved we should walk over every root point and figure out if there ploop device to be adjusted. This patch requires CRIU to export "CRIU_MNT_NS_ROOTS". https://jira.sw.ru/browse/PSBM-71861 Signed-off-by: Cyrill Gorcunov <gorcu...@openvz.org> --- scripts/vz-rst-action.in | 67 ++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/scripts/vz-rst-action.in b/scripts/vz-rst-action.in index fec68a7..a532bad 100755 --- a/scripts/vz-rst-action.in +++ b/scripts/vz-rst-action.in @@ -28,40 +28,48 @@ exec 1>&2 +action_script=@SCRIPTDIR@/vz-rst-action + restore_devices() { local s d t major minor old dir device local pid=$CRTOOLS_INIT_PID - root=/proc/$pid/root - - # VE_PLOOP_DEVS=UUID@ploopN:major:minor:[root] - for s in $VE_PLOOP_DEVS; do - uuid=${s%%@*} - t=${s#*@} - device=${t%%:*} - t=${t#*:} - major=${t%%:*} - t=${t#*:} - minor=${t%%:*} - - [ ! -L "$root/dev/$uuid" ] && continue - - old=$(readlink $root/dev/$uuid) - [ -z "$old" ] && continue - - for d in "${old}" "${device}"; do - dir=$root/$d - dir=${dir%/*} - if [ -e "$dir" ]; then - rm -f $root/$d - else - mkdir -p $dir - fi - mknod -m 600 $root/$d b $major $minor - done + if [ -z "$VZ_RST_USE_NSENTER" ]; then + export VZ_RST_USE_NSENTER="y" + nsenter -m -t $pid bash $action_script + exit 0 + fi - rm -f $root/dev/$uuid + for root in $CRIU_MNT_NS_ROOTS; do + # VE_PLOOP_DEVS=UUID@ploopN:major:minor:[root] + for s in $VE_PLOOP_DEVS; do + uuid=${s%%@*} + t=${s#*@} + device=${t%%:*} + t=${t#*:} + major=${t%%:*} + t=${t#*:} + minor=${t%%:*} + + [ ! -L "$root/dev/$uuid" ] && continue + + old=$(readlink $root/dev/$uuid) + [ -z "$old" ] && continue + + for d in "${old}" "${device}"; do + dir=$root/$d + dir=${dir%/*} + if [ -e "$dir" ]; then + rm -f $root/$d + else + mkdir -p $dir + fi + mknod -m 600 $root/$d b $major $minor + done + + rm -f $root/dev/$uuid + done done } @@ -87,6 +95,7 @@ case "$CRTOOLS_SCRIPT_ACTION" in ;; "post-setup-namespaces") if [ -n "$VEID" ]; then + restore_devices [ -n "$VE_OS_RELEASE" ] && cgset -r ve.os_release="$VE_OS_RELEASE" $VEID [ -n "$VE_PID_MAX" ] && cgset -r ve.pid_max="$VE_PID_MAX" $VEID fi @@ -97,8 +106,6 @@ case "$CRTOOLS_SCRIPT_ACTION" in exit 1 fi - restore_devices - if [ -n "$VEID" ]; then [ -f "$CRTOOLS_IMAGE_DIR/vz_core_pattern.img" ] && \ { cgexec -g ve:$VEID echo `cat $CRTOOLS_IMAGE_DIR/vz_core_pattern.img` \ -- 2.7.5 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel