fix fstab fixing for gentoo/initpost
[util-vserver.git] / scripts / vserver.functions
index 752bd85..be6e813 100644 (file)
@@ -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
 }