X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=scripts%2Fvserver.functions;h=be6e8138a76fd98589f743621924e3df151a0233;hb=899eb82a3219589a6748a6112e74a990a5accaec;hp=752bd854533444ee25a40d5b1f65da0dc8575a45;hpb=b0ff6a1c514a1705967cc5aa784d564a7417301c;p=util-vserver.git diff --git a/scripts/vserver.functions b/scripts/vserver.functions index 752bd85..be6e813 100644 --- a/scripts/vserver.functions +++ b/scripts/vserver.functions @@ -299,7 +299,24 @@ function _generateInitOptions ;; (xgentoo) - panic "init-style '$INITSTYLE' is no longer supported; please use plain instead; aborting";; + INITCMD_START=( /lib/rcscripts/sh/init-vserver.sh ) + INITCMD_STOP=( /sbin/rc shutdown ) + + pushd "$vdir"/vdir &>/dev/null + basever=$($_CHROOT_SH cat /etc/gentoo-release | $_AWK '{print $5}') + popd &>/dev/null + + basemaj=${basever/.*} + basemin=${basever#*.} + basemin=${basemin/.*} + + test "$basemaj" -lt 1 -o "$basemin" -lt 13 && \ + panic "\ +Using init-style 'gentoo' requires >=baselayout-1.13 inside the vserver! + +Your vserver ($(basename "$vdir")) seems to have baselayout-$basever, +please use 'plain' init-style instead!" + ;; (x) ;; (*) panic "Unknown init-style '$INITSTYLE'; aborting";; @@ -715,7 +732,7 @@ function addtoCPUSET test -d /dev/cpuset/"$cpuset" || mkdir /dev/cpuset/"$cpuset" || configured=1 for i in cpus mems cpu_exclusive mem_exclusive virtualized; do if test -e "$f"/"$i"; then - cat "$f"/"$i" >/dev/cpuset/"$cpuset"/"$i" 2>/dev/null || { + cat "$f"/"$i" >/dev/cpuset/"$cpuset"/"$i" || { configured=1 break } @@ -805,7 +822,7 @@ function mountVserver _mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" isNamespaceCleanup "$cfgdir" && \ - _namespaceCleanup + _namespaceCleanup "$cfgdir" isAvoidNamespace "$cfgdir" || \ $_SECURE_MOUNT --rbind -n "$vdir" "/" @@ -1161,26 +1178,39 @@ function saveDiskLimits function _namespaceCleanup { - local root=$(readlink -f "$vdir") - local tmp="$root" + local vdir="$1" + local root=$($_VSERVER_INFO "$1" VDIR 1) local -a list - while [ "$tmp" ]; do - list=( "${list[@]}" "$tmp" ) - tmp="${tmp%/*}" + local -a skip + local tmp + + getFileArray skip "$vdir"/namespace-cleanup-skip \ + "$__CONFDIR"/.defaults/namespace-cleanup-skip || : + + # these are things that have to be accessible post-cleanup + for tmp in "$root" "$__SBINDIR" "$__PKGLIBDIR" "$vdir" \ + "$__PKGSTATEDIR" "${skip[@]}"; do + while test -n "$tmp"; do + list=( "${list[@]}" "$tmp" ) + tmp="${tmp%/*}" + done done + local -a list_umount while read dev path opts; do - [ "$path" ] || continue - for i in "$root" /dev /proc; do - [ "${path#$i}" != "$path" ] && continue 2 - done - for i in "${list[@]}" /; do - [ "$path" = "$i" ] && continue 2 - done - list_umount=( "${list_umount[@]}" "$path" ) + test -n "$path" || continue + for i in "$root" /dev /proc; do + test "${path#$i}" != "$path" && continue 2 + done + for i in "${list[@]}" /; do + test "$path" = "$i" && continue 2 + done + # unmount them in reverse order so mounts further down the tree get unmounted first + list_umount=( "$path" "${list_umount[@]}" ) done < /proc/mounts + # separate loop to avoid races while reading /proc/mounts for i in "${list_umount[@]}"; do - umount -l -n "$i" + $_UMOUNT -l -n "$i" done }