X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=scripts%2Fvserver.functions;h=e48bf217128eb748f3133e10e6d85d185941b08f;hb=f7848af2302aba9398c0f4e4c2e05012d736783b;hp=b8ed2779f6573ed406a12cec845027c5006a0764;hpb=116542ffd07d679315cf7ca7b17f29fc59ab342b;p=util-vserver.git diff --git a/scripts/vserver.functions b/scripts/vserver.functions index b8ed277..e48bf21 100644 --- a/scripts/vserver.functions +++ b/scripts/vserver.functions @@ -49,6 +49,8 @@ declare -a OPTS_VTAG_CREATE=() declare -a OPTS_VTAG_ENTER=() declare -a OPTS_VMEMCTRL=() declare -a OPTS_VSPACE=( --default ) +declare -a OPTS_VSPACE_SHARED=() +declare -a VSPACE_SHARED_CMD=() declare -a STOPCMD_PREPARE=() @@ -110,6 +112,12 @@ function _generateChbindOptions test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$vdir" + if test -e "$vdir"/noncontext -o + \( -e "$vdir"/spaces/net -a ! -e "$vdir"/ncontext \); then + _HAVE_CHBIND_OPTIONS=1 + return 0 + fi + local f="$vdir"/interfaces/bcast getFileValue bcast "$f" f="$vdir"/interfaces/lback @@ -147,6 +155,8 @@ function _generateIONiceCommand local ionice_class=2 local ionice_priority=0 + test -n "$_IONICE" || return 0 + test -r "$vdir/ionice/class" && read ionice_class <"$vdir"/ionice/class test -r "$vdir/ionice/priority" && read ionice_priority <"$vdir"/ionice/priority @@ -342,7 +352,8 @@ function _generateInitOptions panic "init-vserver.sh not found; aborting" fi - INITCMD_START=( env TERM=$TERM $RC_WRAP "$RUNLEVEL_START" ) + OPTS_ENV=( "${OPTS_ENV[@]}" TERM=$TERM ) + INITCMD_START=( $RC_WRAP "$RUNLEVEL_START" ) INITCMD_STOP=( env -i PATH=$RC_PATH TERM=$TERM RUNLEVEL=0 /sbin/rc shutdown ) INITCMD_PREPARE=( $_FAKE_RUNLEVEL 3 /var/run/utmp ) ;; @@ -784,16 +795,22 @@ 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 shared + local space + + for space in pid net; do + if test -e "$d"/$space; then + getFileValue shared "$d"/$space || shared="" + if test -z "$shared"; then + OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --$space ) + elif test "$shared" = "0"; then + : # Do nothing + else + OPTS_VSPACE_SHARED=( "${OPTS_VSPACE_SHARED[@]}" --$space ) + VSPACE_SHARED_CMD=( "${VSPACE_SHARED_CMD[@]}" $_VSPACE --enter "$shared" --$space -- ) + fi + fi + done local mask getFileValue mask "$d"/mask || \ @@ -806,8 +823,8 @@ function prepareInit pushd "$1/vdir" >/dev/null case "$INITSTYLE" in sysv) - { find var/run ! -type d -print0; \ - find var/lock ! -type d -print0; } | xargs -0r $_CHROOT_SH rm + { $_FIND var/run ! -type d -print0; \ + $_FIND var/lock ! -type d -print0; } | xargs -0r $_CHROOT_SH rm ;; plain) $_CHROOT_SH rm .autofsck forcefsck 2>/dev/null || : @@ -916,6 +933,10 @@ function _mountVserverInternal # magic regarding the mtab file; when etc/mtab can not be touched, # add the '-n' flag to mount test -w etc -o -w etc/mtab || xflag=-n + if test -h etc/mtab; then + local l=$($_READLINK etc/mtab) + test "${l##/proc/}" = "$l" || xflag=-n + fi "$@" $_SECURE_MOUNT -a $xflag --chroot --fstab "$fstab" --rootfs no popd >/dev/null } @@ -1211,7 +1232,7 @@ WARNING: There is no cachedirectory configured for this vserver; ln -s ../.defaults/cachebase/$VSERVER_NAME $cfgdir/cache " - find "$cfgdir" -type f -exec "$_CHECK_UNIXFILE" '{}' ';' + $_FIND "$cfgdir" -type f -exec "$_CHECK_UNIXFILE" '{}' ';' vshelper.doSanityCheck @@ -1376,7 +1397,8 @@ function _namespaceCleanup while read -r dev path opts; do test -n "$path" || continue for i in "$root" /dev /proc; do - test "${path#$i}" != "$path" && continue 2 + path_dir="${path}/" + test "${path_dir#${i}/}" != "${path_dir}" && continue 2 done for i in "${list[@]}" /; do test "$path" = "$i" && continue 2 @@ -1436,6 +1458,10 @@ function _generateCgroupOptions findFile file "$__CONFDIR/.defaults/cgroup/subsys" "" if test -n "$file"; then read CGROUP_SUBSYS < "$file" + elif $_GREP -q '^ns[[:space:]]' /proc/cgroups; then + # Hack for the ns subsystem, with which we are incompatible + CGROUP_SUBSYS=$($_SED '/^#/d;/^ns[[:space:]]/d;s/[[:space:]].*//' /proc/cgroups | \ + (s=""; while read x; do test -n "$s" && s="$s,"; s="$s$x"; done; echo "$s")) fi findFile file "$__CONFDIR/.defaults/cgroup/inherit" "" if test -n "$file"; then @@ -1485,7 +1511,10 @@ function _handleCgroup shopt -s nullglob for i in "$dir"/*; do - cat "$i" > "$CGROUP_MNT/$name/${i##*/}" + f="${i##*/}" + test "$f" != mnt -a "$f" != subsys -a \ + "$f" != inherit -a "$f" != name || continue + cat "$i" > "$CGROUP_MNT/$name/$f" done fi echo "$$" > "$CGROUP_MNT/$name/tasks"