# $VSERVER_NAME ... name of vserver
declare -a NICE_CMD=()
-declare -a CHBIND_OPTS=()
+declare -a CHBIND_CMD=()
declare -a CAP_OPTS=()
declare -a CHCONTEXT_INIT_OPTS=()
declare -a CHCONTEXT_FLAG_OPTS=()
declare -a OPTS_ENV=()
declare -a OPTS_VTAG_CREATE=()
declare -a OPTS_VTAG_ENTER=()
+declare -a OPTS_VMEMCTRL=()
+declare -a OPTS_VSPACE=()
declare -a STOPCMD_PREPARE=()
local vdir="$1"
local i
local bcast=
+ local lback=
local nid=
test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$vdir"
- local f=$vdir/interfaces/bcast
+ local f="$vdir"/interfaces/bcast
getFileValue bcast "$f"
+ f="$vdir"/interfaces/lback
+ getFileValue lback "$f"
getFileValue nid "$vdir/ncontext" "$vdir/context"
- CHBIND_OPTS=( $SILENT_OPT --secure ${nid:+--nid "$nid"} ${bcast:+--bcast "$bcast"} )
+ CHBIND_CMD=( $_CHBIND $SILENT_OPT --secure ${nid:+--nid "$nid"}
+ ${bcast:+--bcast "$bcast"} ${lback:+--lback "$lback"}
+ )
for i in "${INTERFACES[@]}"; do
- CHBIND_OPTS=( "${CHBIND_OPTS[@]}" --ip "$i" )
+ CHBIND_CMD=( "${CHBIND_CMD[@]}" --ip "$i" )
done
- _readFileToArray "$vdir"/nflags CHBIND_OPTS --flag
- _readFileToArray "$vdir"/ncapabilities CHBIND_OPTS --ncap
+ _readFileToArray "$vdir"/nflags CHBIND_CMD --flag
+ _readFileToArray "$vdir"/ncapabilities CHBIND_CMD --ncap
_HAVE_CHBIND_OPTIONS=1
}
(xgentoo)
test -n "$RUNLEVEL_START" || RUNLEVEL_START="default"
+ RC_PATH=/usr/sbin:/usr/bin:/sbin:/bin
INITCMD_START=( env TERM=$TERM /lib/rcscripts/sh/init-vserver.sh "$RUNLEVEL_START" )
- INITCMD_STOP=( env -i TERM=$TERM RUNLEVEL=0 /sbin/rc shutdown )
+ INITCMD_STOP=( env -i PATH=$RC_PATH TERM=$TERM RUNLEVEL=0 /sbin/rc shutdown )
INITCMD_PREPARE=( $_FAKE_RUNLEVEL 3 /var/run/utmp )
;;
_HAVE_INTERFACE_OPTIONS=1
}
-function _generateTagOptions
-{
- local vdir="$1"
- local tag
-
- getFileValue tag "$vdir/tag" "$vdir/context" || return 0
-
- OPTS_VTAG_CREATE=( --tag "$tag" )
- OPTS_VTAG_ENTER=( --tag "$tag" )
-}
-
function enableInterfaces
{
local i=0
unlock 1
}
+function _generateTagOptions
+{
+ local vdir="$1"
+ local tag
+
+ getFileValue tag "$vdir/tag" "$vdir/context"
+ test -n "$tag" || return 0
+
+ OPTS_VTAG_CREATE=( --tag "$tag" )
+ OPTS_VTAG_ENTER=( --tag "$tag" )
+}
+
+function _generateMemctrlOptions
+{
+ local vdir="$1"
+ local badness
+
+ getFileValue badness "$vdir/badness"
+ test -n "$badness" || return 0
+
+ OPTS_VMEMCTRL=( --badness "$badness" )
+}
+
+function _generateSpaceOptions
+{
+ local vdir="$1"
+ local d="$vdir"/spaces
+
+ test ! -e "$d"/pid || \
+ OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --pid )
+
+ test ! -e "$d"/net || {
+ OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --net )
+ # network context and namespace don't make much sense
+ _HAVE_CHBIND_OPTIONS=1
+ CHBIND_CMD=()
+ }
+
+ local mask
+ getFileValue mask "$d"/mask || \
+ OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --mask "$mask" )
+}
+
## Usage: prepareInit <vserver-directory>
function prepareInit
{
_generateScheduleOptions "$1"
_generatePersonalityOptions "$1"
_generateTagOptions "$1"
+ _generateMemctrlOptions "$1"
+ _generateSpaceOptions "$1"
if test -n "$_IS_FAKEINIT"; then
CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
_mountVserverInternal "$cfgdir"/fstab
_mountVserverInternal "$cfgdir"/fstab.local
- _mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}"
+ _mountVserverInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}"
isNamespaceCleanup "$cfgdir" && \
_namespaceCleanup "$cfgdir"
test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
pushd "$vdir/" >/dev/null || return 1
- _umountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" || is_ok=
- _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
- _umountVserverInternal "$cfgdir"/fstab || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}" || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab || is_ok=
popd >/dev/null || return 1
test -n "$is_ok"
}
+function fsckAllFS
+{
+ local cfgdir=$1
+ local fstab="$cfgdir"/fstab
+ local FSTAB_FILE
+ local fsck_exitcode
+
+ test -e "$fstab" || return 0
+
+ export FSTAB_FILE="$fstab"
+ $_FSCK -s -n -A -T
+ fsck_exitcode=$?
+ test "$fsck_exitcode" -eq 0 -o \
+ "$fsck_exitcode" -eq 1 || return $fsck_exitcode
+}
+
## Usage: waitForSync <vserver> <context> <vshelper-fifo-varname>
function initSync
{
local root=$($_VSERVER_INFO "$1" VDIR 1)
local -a list
local -a skip
- local tmp
+ local i
+ local j
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" \
+ for i in "$root" "$__SBINDIR" "$__PKGLIBDIR" "$vdir" \
"$__PKGSTATEDIR" "$__LOCKDIR" /usr/local /tmp "${skip[@]}"; do
- while test -n "$tmp"; do
- list=( "${list[@]}" "$tmp" )
- tmp="${tmp%/*}"
+ local real=`getPhysicalDir "$i"`
+ test "$i" != "$real" || real=
+ for j in "$i" "$real"; do
+ while test -n "$j"; do
+ list=( "${list[@]}" "$j" )
+ j="${j%/*}"
+ done
done
done
local -a list_umount
- while read dev path opts; do
+ while read -r dev path opts; do
test -n "$path" || continue
for i in "$root" /dev /proc; do
test "${path#$i}" != "$path" && continue 2
done
}
-function loadDeviceMap
+function handleDeviceMap
{
- local xid="$1"
- local dir="$2"
+ local op="$1"
+ local xid="$2"
+ local dir="$3"
local flags device target
test -d "$dir" || return 0
+ test -n "$xid" || return 0
for i in "$dir"/*; do
test -d "$i" || continue
vdevmap_opts=( "${vdevmap_opts[@]}" ${flags:+--flags "$flags"} \
${device:+--device "$device"} ${target:+--target "$target"} )
- $_VDEVMAP --xid "$xid" "${vdevmap_opts[@]}" || return $?
+ $_VDEVMAP --xid "$xid" "$op" "${vdevmap_opts[@]}" || return $?
done
}