[Devel] [PATCH libvzctl 3/3] scripts: Tune up ploop links on post-setup-namespaces stage

Andrei Vagin avagin at gmail.com
Tue Oct 24 01:35:34 MSK 2017


On Thu, Oct 12, 2017 at 10:21:31AM +0300, Cyrill Gorcunov wrote:
> From: Cyrill Gorcunov <gorcunov at 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 <gorcunov at 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 at 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

We can use /proc/$pid/root instead of entring a mount namespace

> +		exit 0
> +	fi
>  
> -		rm -f $root/dev/$uuid
> +	for root in $CRIU_MNT_NS_ROOTS; do
> +		# VE_PLOOP_DEVS=UUID at 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 at openvz.org
> https://lists.openvz.org/mailman/listinfo/devel


More information about the Devel mailing list