;;
(xgentoo)
- panic "init-style '$INITSTYLE' is no longer supported; please use plain instead; aborting";;
+ test -n "$RUNLEVEL_START" || RUNLEVEL_START="default"
+
+ INITCMD_START=( /lib/rcscripts/sh/init-vserver.sh "$RUNLEVEL_START" )
+ INITCMD_STOP=( /sbin/rc shutdown )
+ INITCMD_PREPARE=( $_FAKE_RUNLEVEL 3 /var/run/utmp )
+
+ 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";;
function _generateScheduleOptions
{
local vdir=$1
+ if test -d "$vdir"/sched; then
+ OPTS_VSCHED=( --dir "$vdir"/sched --missingok )
+ return 0
+ fi
+
local f="$vdir"/schedule
test -e "$f" || return 0
echo -e $"VLAN device-name used, but vlan subsystem not enabled.\nTry to execute 'modprobe 8021q' before starting the vservers" >&2
return 1
}
- test -f /proc/net/vlan -o -e "$iface"/novlandev || {
+ test -e "$iface/vlandev" \
+ -o \( -e "$iface/../vlandev" -a ! -e "$iface/novlandev" \) \
+ -o \( -e "$__CONFDIR/.defaults/interfaces/vlandev" \
+ -a ! -e "$iface/novlandev" \
+ -a ! -e "$iface/../novlandev" \) && {
_addInterfaceCmd VCONFIG $vlan_info
}
fi
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
}
_mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}"
isNamespaceCleanup "$cfgdir" && \
- _namespaceCleanup
+ _namespaceCleanup "$cfgdir"
isAvoidNamespace "$cfgdir" || \
$_SECURE_MOUNT --rbind -n "$vdir" "/"
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
}