declare -a OPTS_VCONTEXT_ENTER=()
declare -a OPTS_VATTRIBUTE=( --flag fakeinit )
declare -a OPTS_VSCHED=()
+declare -a OPTS_ENV=()
declare -a STOPCMD_PREPARE=()
function _generateNiceCommand
{
local vdir=$1
- local nice
+ local nice=0
+ local current_nice=`$_NICE`
- test -r "$vdir/nice" || return 0;
- read nice <"$vdir"/nice
+ test -r "$vdir/nice" && read nice <"$vdir"/nice
- NICE_CMD=( $_NICE -$nice )
+ let nice=$nice-$current_nice || :
+ NICE_CMD=( $_NICE -n $nice )
}
getFileValue RUNLEVEL_STOP "$cfgdir"/runlevel.stop
getFileArray INITKILL_SEQ "$cfgdir"/killseq || :
+ findFile _gio_env "$cfgdir"/environment \
+ "$__CONFDIR"/.defaults/apps/init/environment \
+ "$__PKGLIBDEFAULTDIR"/environment
+ getFileArray OPTS_ENV "$_gio_env" || :
+
case x"$INITSTYLE" in
(xrescue)
INITCMD_START=( "${INITCMD_RESCUE[@]}" )
;;
(xgentoo)
- INITCMD_START=( /sbin/rc default )
- INITCMD_STOP=( /sbin/rc shutdown )
- ;;
+ panic "init-style '$INITSTYLE' is no longer supported; please use plain instead; aborting";;
(x) ;;
(*) panic "Unknown init-style '$INITSTYLE'; aborting";;
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
fi
}
+function addtoCPUSET
+{
+ local vdir=$1
+ local cpuset
+ local f="$vdir"/cpuset
+ local i
+ local configured=0
+
+ test -d "$f" || return 0
+ test -e "$f"/name || return 0
+
+ read cpuset < "$f"/name
+ test -e "$f"/nocreate || {
+ 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 || {
+ configured=1
+ break
+ }
+ fi
+ done
+ }
+
+ echo $$ >/dev/cpuset/"$cpuset"/tasks || configured=1
+ if [ "$configured" -ne 0 ]; then
+ warning $"\
+WARNING: Failed to create or CPUSET \"$cpuset\" does not exist! Not using it!" >&2
+ rmdir /dev/cpuset/"$cpuset" 2>/dev/null || :
+ return 0
+ fi
+}
+
+function removeCPUSET
+{
+ local vdir=$1
+ local cpuset
+ local f="$vdir"/cpuset
+
+ test -d "$f" || return 0
+ test -e "$f"/name || return 0
+
+ read cpuset < "$f"/name
+ test -e "$f"/nocreate || {
+ rmdir /dev/cpuset/"$cpuset" 2>/dev/null || :
+ }
+}
+
function _mountVserverInternal
{
local fstab="$1"
test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
- test -z "$NAMESPACE_CLEANUP" || isAvoidNamespace "$cfgdir" || \
- $_VNAMESPACE --cleanup
-
_mountVserverInternal "$cfgdir"/fstab
_mountVserverInternal "$cfgdir"/fstab.local
_mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}"
+ isNamespaceCleanup "$cfgdir" && \
+ _namespaceCleanup
+
isAvoidNamespace "$cfgdir" || \
$_SECURE_MOUNT --rbind -n "$vdir" "/"
}
isAvoidNamespace "$cfgdir" || return 0
test -e "$cfgdir"/fstab -o \
- -e "$cfgdir"/fstab.local || return 0
+ -e "$cfgdir"/fstab.local -o \
+ -e "$cfgdir"/fstab.remote || return 0
test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
pushd "$vdir/" >/dev/null || return 1
- _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
- _umountVserverInternal "$cfgdir"/fstab $_CHBIND "${CHBIND_OPTS[@]}" || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab || is_ok=
popd >/dev/null || return 1
test -n "$is_ok"
_saveSingleDiskLimit "$vdir" "$dlimit"
done
}
+
+function _namespaceCleanup
+{
+ local root=$(readlink -f "$vdir")
+ local tmp="$root"
+ local -a list
+ while [ "$tmp" ]; do
+ list=( "${list[@]}" "$tmp" )
+ tmp="${tmp%/*}"
+ 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" )
+ done < /proc/mounts
+ for i in "${list_umount[@]}"; do
+ umount -l -n "$i"
+ done
+}
+