diff options
Diffstat (limited to 'xi/s6/scripts/mount-cgroups')
-rwxr-xr-x | xi/s6/scripts/mount-cgroups | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/xi/s6/scripts/mount-cgroups b/xi/s6/scripts/mount-cgroups new file mode 100755 index 0000000..fd711a0 --- /dev/null +++ b/xi/s6/scripts/mount-cgroups @@ -0,0 +1,120 @@ +#!/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/s6/sv/mount-cgroups/cgroup-release-agent.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 |