X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=scripts%2Fvserver.functions;h=e6482c689940bf8a248925c4492d63d92cbb3bea;hb=2f0464efba2a0571561ad0aaa864a42cbd731d4c;hp=01e4c4af51a942f1821cf18caeeca4e0e48ba933;hpb=12fb89d20ac9b975ab861d827672203468a38541;p=util-vserver.git diff --git a/scripts/vserver.functions b/scripts/vserver.functions index 01e4c4a..e6482c6 100644 --- a/scripts/vserver.functions +++ b/scripts/vserver.functions @@ -45,6 +45,8 @@ declare -a OPTS_VSCHED=() 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=() @@ -314,9 +316,10 @@ function _generateInitOptions (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 ) ;; @@ -606,18 +609,6 @@ function _generateInterfaceOptions _HAVE_INTERFACE_OPTIONS=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 enableInterfaces { local i=0 @@ -688,6 +679,49 @@ function disableInterfaces 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 function prepareInit { @@ -732,6 +766,8 @@ function generateOptions _generateScheduleOptions "$1" _generatePersonalityOptions "$1" _generateTagOptions "$1" + _generateMemctrlOptions "$1" + _generateSpaceOptions "$1" if test -n "$_IS_FAKEINIT"; then CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit ) @@ -893,6 +929,22 @@ function umountVserver 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 function initSync { @@ -1216,22 +1268,27 @@ function _namespaceCleanup 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 @@ -1248,13 +1305,15 @@ function _namespaceCleanup 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 @@ -1270,6 +1329,6 @@ function loadDeviceMap 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 }