forked from artix/66-scripts
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.1 KiB
120 lines
3.1 KiB
#!/bin/sh |
|
|
|
CGROUP_OPTS=nodev,noexec,nosuid |
|
CGROUP_MODE=$1 |
|
CGROUP_CONTROLLERS=$2 |
|
HAVE_CONTROLLER1_GROUPS=$3 |
|
|
|
if [ $CGROUP_CONTROLLERS = "none" ]; then |
|
CGROUP_CONTROLLERS="" |
|
fi |
|
|
|
cgroup2_find_path() { |
|
if grep -qw cgroup2 /proc/filesystems; then |
|
case "${CGROUP_MODE}" in |
|
hybrid) printf "/sys/fs/cgroup/unified" ;; |
|
unified) printf "/sys/fs/cgroup" ;; |
|
esac |
|
fi |
|
return 0 |
|
} |
|
|
|
cgroup1_base() { |
|
grep -qw cgroup /proc/filesystems || return 0 |
|
if ! mountpoint -q /sys/fs/cgroup; then |
|
local opts="${CGROUP_OPTS},mode=755,size=${rc_cgroupsize:-10m}" |
|
mount -n -t tmpfs -o "${opts}" cgroup_root /sys/fs/cgroup |
|
fi |
|
|
|
if ! mountpoint -q /sys/fs/cgroup/openrc; then |
|
local agent="/etc/66/script/cgroups-release.sh" |
|
mkdir /sys/fs/cgroup/openrc |
|
mount -n -t cgroup -o none,${CGROUP_OPTS},name=openrc,release_agent="$agent" openrc /sys/fs/cgroup/openrc |
|
printf 1 > /sys/fs/cgroup/openrc/notify_on_release |
|
fi |
|
return 0 |
|
} |
|
|
|
cgroup1_controllers() { |
|
${HAVE_CONTROLLER1_GROUPS} && [ -e /proc/cgroups ] && grep -qw cgroup /proc/filesystems || return 0 |
|
while read -r name _ _ enabled _; do |
|
case "${enabled}" in |
|
1) if mountpoint -q "/sys/fs/cgroup/${name}";then continue;fi |
|
local x |
|
for x in $CGROUP_CONTROLLERS; do |
|
[ "${name}" = "blkio" ] && [ "${x}" = "io" ] && |
|
continue 2 |
|
[ "${name}" = "${x}" ] && |
|
continue 2 |
|
done |
|
mkdir "/sys/fs/cgroup/${name}" |
|
mount -n -t cgroup -o "${CGROUP_OPTS},${name}" "${name}" "/sys/fs/cgroup/${name}" |
|
;; |
|
esac |
|
done < /proc/cgroups |
|
return 0 |
|
} |
|
|
|
cgroup2_base() { |
|
grep -qw cgroup2 /proc/filesystems || return 0 |
|
local base |
|
base="$(cgroup2_find_path)" |
|
mkdir -p "${base}" |
|
mount -t cgroup2 none -o "${CGROUP_OPTS},nsdelegate" "${base}" 2> /dev/null || |
|
mount -t cgroup2 none -o "${CGROUP_OPTS}" "${base}" |
|
return 0 |
|
} |
|
|
|
cgroup2_controllers() { |
|
grep -qw cgroup2 /proc/filesystems || return 0 |
|
local active cgroup_path x y |
|
cgroup_path="$(cgroup2_find_path)" |
|
[ -z "${cgroup_path}" ] && return 0 |
|
[ -e "${cgroup_path}/cgroup.controllers" ] && read -r active < "${cgroup_path}/cgroup.controllers" |
|
for x in ${CGROUP_CONTROLLERS}; do |
|
for y in ${active}; do |
|
[ "$x" = "$y" ] && [ -e "${cgroup_path}/cgroup.subtree_control" ] && |
|
echo "+${x}" > "${cgroup_path}/cgroup.subtree_control" |
|
done |
|
done |
|
return 0 |
|
} |
|
|
|
cgroups_hybrid() { |
|
cgroup1_base |
|
cgroup2_base |
|
cgroup2_controllers |
|
cgroup1_controllers |
|
return 0 |
|
} |
|
|
|
cgroups_legacy() { |
|
cgroup1_base |
|
cgroup1_controllers |
|
return 0 |
|
} |
|
|
|
cgroups_unified() { |
|
cgroup2_base |
|
cgroup2_controllers |
|
return 0 |
|
} |
|
|
|
mount_cgroups() { |
|
case "${CGROUP_MODE}" in |
|
hybrid) cgroups_hybrid ;; |
|
legacy) cgroups_legacy ;; |
|
unified) cgroups_unified ;; |
|
esac |
|
return 0 |
|
} |
|
|
|
mount_cgs() { |
|
if [ -d /sys/fs/cgroup ];then |
|
mount_cgroups |
|
return 0 |
|
fi |
|
return 1 |
|
} |
|
|
|
mount_cgs
|
|
|