declare -a OPTS_VCONTEXT_ENTER=()
declare -a OPTS_VATTRIBUTE=( --flag fakeinit )
declare -a OPTS_VSCHED=()
+declare -a OPTS_ENV=()
declare -a STOPCMD_PREPARE=()
SILENT_OPT='--silent'
fi
+function _readFileToArray
+{
+ local _rfta_f="$1"
+ local _rfta_a="$2"
+ local _rfta_p="$3"
+ local _rfta_v
+
+ test -e "$_rfta_f" || return 0
+ while read _rfta_v; do
+ case x"$_rfta_v" in
+ (x|x\#*) ;;
+ (*) eval "$_rfta_a=( \"\${$_rfta_a[@]}\" $_rfta_p \"$_rfta_v\" )";;
+ esac
+ done <"$_rfta_f"
+}
+
function _generateChbindOptions
{
local vdir="$1"
getFileValue nid "$vdir/ncontext" "$vdir/context"
- CHBIND_OPTS=( $SILENT_OPT ${nid:+--nid "$nid"} ${bcast:+--bcast "$bcast"} )
+ CHBIND_OPTS=( $SILENT_OPT --secure ${nid:+--nid "$nid"} ${bcast:+--bcast "$bcast"} )
for i in "${INTERFACES[@]}"; do
CHBIND_OPTS=( "${CHBIND_OPTS[@]}" --ip "$i" )
done
+ _readFileToArray "$vdir"/nflags CHBIND_OPTS --flag
+ _readFileToArray "$vdir"/ncapabilities CHBIND_OPTS --ncap
+
_HAVE_CHBIND_OPTIONS=1
}
function _generateCCapabilityOptions
{
local vdir=$1
- local cap
- local f="$vdir"/ccapabilities
-
- test -e "$f" || return 0
- while read cap; do
- case x"$cap" in
- (x|x\#*) ;;
- (*) OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --ccap "$cap" );;
- esac
- done <"$f"
+
+ _readFileToArray "$vdir"/ccapabilities OPTS_VATTRIBUTE --ccap
}
function _generateBCapabilityOptions
{
local vdir=$1
- local cap
- local f="$vdir"/bcapabilities
-
- test -e "$f" || return 0
- while read cap; do
- case x"$cap" in
- (x|x\#*) ;;
- (*) OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --bcap "$cap" );;
- esac
- done <"$f"
+
+ _readFileToArray "$vdir"/bcapabilities OPTS_VATTRIBUTE --bcap
}
function _generateCapabilityOptions
CHCONTEXT_INIT_OPTS=()
- getFileValue INITSTYLE "$cfgdir"/style
+ test x"$INITSTYLE" = xrescue || \
+ getFileValue INITSTYLE "$cfgdir"/style
getFileValue RUNLEVEL_START "$cfgdir"/runlevel
getFileValue RUNLEVEL_START "$cfgdir"/runlevel.start
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[@]}" )
INITCMD_STOP=( /sbin/killall5 )
- _IS_FAKEINIT=1
- _NEED_VSHELPER_SYNC=
;;
(xsysv)
;;
(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 )
+ ;;
(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
## LEGACY ALERT
test ! -e "$iface"/only_ip || break
- local vlan_info
- if vlan_info=$(_getVLANInfo "$dev"); then
- test -d /proc/net/vlan || {
- 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" \) && {
+ local vlan_info
+ if vlan_info=$(_getVLANInfo "$dev"); then
+ test -d /proc/net/vlan || {
+ echo -e $"VLAN device-name used, but vlan subsystem not enabled.\nTry to execute 'modprobe 8021q' before starting the vservers" >&2
+ return 1
+ }
_addInterfaceCmd VCONFIG $vlan_info
- }
- fi
+ fi
+ }
if ! test -e "$iface"/indirect; then
_addInterfaceCmd IP_ADDR "$ip${prefix:+/$prefix}" broadcast ${bcast:-+} ${name:+label "$dev:$name"} dev "$dev"
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
}
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 "$cfgdir"
+
isAvoidNamespace "$cfgdir" || \
$_SECURE_MOUNT --rbind -n "$vdir" "/"
}
panic $"\
/proc/uptime can not be accessed. Usually, this is caused by
procfs-security. Please read the FAQ for more details
-http://www.linux-vserver.org/index.php?page=Linux-Vserver+FAQ"
+http://linux-vserver.org/Proc-Security"
}
$_VDLIMIT --xid $ctx "$directory" | \
$_GREP '_used=' > "$vdir/cache/dlimits/$cachename"
+
+ $_VDLIMIT --xid $ctx --remove "$directory"
}
_saveSingleDiskLimit "$vdir" "$dlimit"
done
}
+
+function _namespaceCleanup
+{
+ local vdir="$1"
+ local root=$($_VSERVER_INFO "$1" VDIR 1)
+ local -a list
+ 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" "$__LOCKDIR" /usr/local /tmp "${skip[@]}"; do
+ while test -n "$tmp"; do
+ list=( "${list[@]}" "$tmp" )
+ tmp="${tmp%/*}"
+ done
+ done
+
+ local -a list_umount
+ while read dev path opts; do
+ 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"
+ done
+}
+
+function loadDeviceMap
+{
+ local xid="$1"
+ local dir="$2"
+ local flags device target
+
+ test -d "$dir" || return 0
+
+ for i in "$dir"/*; do
+ test -d "$i" || continue
+
+ local -a vdevmap_opts=()
+ test -e "$i/create" && vdevmap_opts=( "${vdevmap_opts[@]}" --create )
+ test -e "$i/open" && vdevmap_opts=( "${vdevmap_opts[@]}" --open )
+ test -e "$i/remap" && vdevmap_opts=( "${vdevmap_opts[@]}" --remap )
+
+ getFileValue flags "$i/flags" || :
+ getFileValue device "$i/device" || :
+ getFileValue target "$i/target" || :
+ vdevmap_opts=( "${vdevmap_opts[@]}" ${flags:+--flags "$flags"} \
+ ${device:+--device "$device"} ${target:+--target "$target"} )
+
+ $_VDEVMAP --xid "$xid" "${vdevmap_opts[@]}" || return $?
+ done
+}