function _generateIONiceCommand
{
local vdir=$1
- local ionice_class=2
- local ionice_priority=0
+ local ionice_class=
+ local ionice_priority=
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
- IONICE_CMD=( $_IONICE -c$ionice_class -n$ionice_priority )
+ test -n "$ionice_class$ionice_priority" || return 0
+
+ if test -z "$ionice_class" -a -n "$ionice_priority"; then
+ IONICE_CMD=( $_IONICE -c2 -n"$ionice_priority" )
+ else
+ IONICE_CMD=( $_IONICE ${ionice_class:+-c$ionice_class} ${ionice_priority:+-n$ionice_priority} )
+ fi
}
function _generatePersonalityOptions
_readFileToArray "$vdir"/bcapabilities OPTS_VATTRIBUTE --bcap
}
+function _generateUMaskOptions
+{
+ local vdir=$1
+
+ _readFileToArray "$vdir"/umask OPTS_VATTRIBUTE --umask
+}
+
function _generateCapabilityOptions
{
local vdir=$1
! isNumber "${RUNLEVEL_START:-3}" || INITCMD_PREPARE=( $_FAKE_RUNLEVEL "${RUNLEVEL_START:-3}" /var/run/utmp )
;;
- (xgentoo)
+ (xgentoo|xopenrc)
test -n "$RUNLEVEL_START" || RUNLEVEL_START="default"
RC_PATH=/usr/sbin:/usr/bin:/sbin:/bin
_generateCapabilityOptions "$vdir"
_generateFlagOptions "$vdir"
+ _generateUMaskOptions "$vdir"
CHCONTEXT_OPTS=( $SILENT_OPT \
"${CHCONTEXT_FLAG_OPTS[@]}" \
IP_ADDR_FLUSH) ;;
IP_LINK) ;; ## Ignore the link-down command for now
IP_ROUTE) $_IP route del "$@";;
- TUNCTL) $_TUNCTL --~persist "$1";;
+ TUNCTL)
+ local dev="$1"
+ shift
+ $_TUNCTL --~persist "$@" "$dev"
+ ;;
*) echo "Unknown interface-command type '$type'" >&2; false;;
esac
done
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
+ local -a dirs=( $($_CHROOT_SH realpath /var/run /var/lock | $_SED 's!^/*!!' || :) )
+ local dir
+ for dir in "${dirs[@]}"; do
+ $_FIND $dir ! -type d -print0 | xargs -0r $_CHROOT_SH rm
+ done
;;
plain)
$_CHROOT_SH rm .autofsck forcefsck 2>/dev/null || :
done
done
+ # keep cgroup mount points
+ list=( "${list[@]}" "${CGROUP_MNT}" )
+ if test -n "$CGROUP_MNT_PER_SS"; then
+ for ss in "${CGROUP_SUBSYS[@]}"; do
+ list=( "${list[@]}" "${CGROUP_MNT}/${ss}" )
+ done
+ fi
+
local -a list_umount
while read -r dev path opts; do
test -n "$path" || continue
- for i in "$root" /dev /proc; do
- path_dir="${path}/"
+ path_dir="${path}/"
+ for i in "$root" /dev /proc /sys; do
test "${path_dir#${i}/}" != "${path_dir}" && continue 2
done
for i in "${list[@]}" /; do
hasCgroup || return 0
- findFile file "$__CONFDIR/.defaults/cgroup/mnt" ""
- if test -n "$file"; then
- read CGROUP_MNT < "$file"
- fi
findFile file "$__CONFDIR/.defaults/cgroup/subsys" ""
if test -n "$file"; then
_readFileToArray CGROUP_SUBSYS "$file"
else
- CGROUP_SUBSYS=( $($_SED '/^#/d;/^ns[[:space:]]/d;s/[[:space:]].*//' /proc/cgroups) )
+ CGROUP_SUBSYS=( $($_AWK '/^#/ { next; } $1 == "ns" { next; } $4 != "0" { print $1; }' /proc/cgroups) )
+ fi
+ findFile file "$__CONFDIR/.defaults/cgroup/mnt" ""
+ if test -n "$file"; then
+ read CGROUP_MNT < "$file"
+ elif test -d /sys/fs/cgroup -a -d /sys/fs/cgroup/"${CGROUP_SUBSYS[0]}"; then
+ CGROUP_MNT=/sys/fs/cgroup
+ CGROUP_MNT_PER_SS=1
fi
findFile file "$__CONFDIR/.defaults/cgroup/inherit" ""
if test -n "$file"; then
function useCgroup
{
hasCgroup || return 1
- test -e "$CGROUP_MNT/tasks" || return 1
- memcg=""
+ if test -n "$CGROUP_MNT_PER_SS"; then
+ local existing=0
+ local ss
+ for ss in "${CGROUP_SUBSYS[@]}"; do
+ if test -e "$CGROUP_MNT/$ss/tasks"; then
+ let existing=${existing}+1
+ fi
+ done
+ test "$existing" -gt 0 || return 1
+ else
+ test -e "$CGROUP_MNT/tasks" || return 1
+ fi
+ local memcg=""
if $_VSERVER_INFO - FEATURE memcg; then
memcg=1
fi
if test -n "$CGROUP_MNT_PER_SS"; then
mnts=()
- for ss in $($_SED '/^#/d;/^ns[[:space:]]/d;s/[[:space:]].*//' /proc/cgroups); do
+ for ss in "${CGROUP_SUBSYS[@]}"; do
mnts=( "${mnts[@]}" "$CGROUP_MNT/$ss" )
done
else
mnts=( "$CGROUP_MNT" )
fi
for mnt in "${mnts[@]}"; do
+ test -d "$mnt" || continue
if test "$action" = "attach"; then
if test -n "$CGROUP_BASE"; then
local -a dirs=()
for i in "$dir"/*; do
f="${i##*/}"
test "$f" != mnt -a "$f" != subsys -a \
- "$f" != inherit -a "$f" != name -a "$f" != base \
+ "$f" != inherit -a "$f" != name -a "$f" != base -a \
+ "$f" != per-ss \
|| continue
+ if test -n "$CGROUP_MNT_PER_SS"; then
+ ss="${f%%.*}"
+ test "$ss" = "${mnt##*/}" || continue
+ fi
cat "$i" > "$mnt/$CGROUP_BASE$name/$f"
done
fi