]> git.proxmox.com Git - mirror_lxcfs.git/blob - share/lxc.mount.hook.in
Merge pull request #509 from brauner/2021-12-13.fixes
[mirror_lxcfs.git] / share / lxc.mount.hook.in
1 #!/bin/sh -e
2
3 # Parse command flags
4 while [ ! $# -eq 0 ]
5 do
6 case "$1" in
7 --skip-cgroup-mounts )
8 SKIP_CGROUP_MOUNTS=1
9 ;;
10 esac
11 shift
12 done
13
14 # We're dealing with mount entries, so expand any symlink
15 LXC_ROOTFS_MOUNT=$(readlink -f "${LXC_ROOTFS_MOUNT}")
16
17 # /proc files
18 if [ -d {{LXCFSTARGETDIR}}/proc/ ]; then
19 for entry in {{LXCFSTARGETDIR}}/proc/*; do
20 DEST=$(basename "$entry")
21 [ -e "${LXC_ROOTFS_MOUNT}/proc/${DEST}" ] || continue
22 mount -n --bind "$entry" "${LXC_ROOTFS_MOUNT}/proc/${DEST}"
23 done
24 fi
25
26 # /sys/devices/system/cpu
27 if [ -d {{LXCFSTARGETDIR}}/sys/devices/system/cpu ] ; then
28 if [ -f {{LXCFSTARGETDIR}}/sys/devices/system/cpu/uevent ]; then
29 mount -n --bind {{LXCFSTARGETDIR}}/sys/devices/system/cpu "${LXC_ROOTFS_MOUNT}/sys/devices/system/cpu"
30 else
31 for entry in {{LXCFSTARGETDIR}}/sys/devices/system/cpu/*; do
32 DEST=$(basename "$entry")
33 [ -e "${LXC_ROOTFS_MOUNT}/sys/devices/system/cpu/${DEST}" ] || continue
34 mount -n --bind "$entry" "${LXC_ROOTFS_MOUNT}/sys/devices/system/cpu/${DEST}"
35 done
36 fi
37 fi
38
39 # Allow nesting lxcfs
40 if [ -d "${LXC_ROOTFS_MOUNT}{{LXCFSTARGETDIR}}/" ]; then
41 mount -n --bind {{LXCFSTARGETDIR}} "${LXC_ROOTFS_MOUNT}{{LXCFSTARGETDIR}}/"
42 fi
43
44 # no need for lxcfs cgroups if we have cgroup namespaces
45 [ -n "$LXC_CGNS_AWARE" ] && [ -f /proc/self/ns/cgroup ] && exit 0
46
47 # Don't mess with containers that don't have /sys/fs/cgroup configured
48 # (lxc.mount.auto = cgroup:mixed)
49 if touch "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/lxcfs"; then
50 rm "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/lxcfs"
51 else
52 exit 0
53 fi
54
55 # Skip mounting cgroup tree if requested.
56 if [ "${SKIP_CGROUP_MOUNTS}" = "1" ]; then
57 exit 0
58 fi
59
60 # /sys/fs/cgroup files
61 if [ -d "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup" ]; then
62 if [ -d {{LXCFSTARGETDIR}}/cgroup ]; then
63 # Cleanup existing mounts
64 for entry in "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup"/*; do
65 DEST=$(basename "$entry")
66
67 if [ "${DEST}" = "cgmanager" ]; then
68 continue
69 fi
70
71 if [ ! -d "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${DEST}" ]; then
72 continue
73 fi
74
75 while grep -q "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${DEST}" /proc/self/mountinfo; do
76 grep "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${DEST}" /proc/self/mountinfo | cut -d' ' -f5 | while read -r line; do
77 [ -e "${line}" ] || continue
78 umount -l "${line}" || true
79 done
80 done
81
82 rm -Rf "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${DEST}"
83 done
84
85 # Mount the new entries
86 for entry in {{LXCFSTARGETDIR}}/cgroup/*; do
87 DEST=$(basename "$entry")
88 if [ "$DEST" = "name=systemd" ]; then
89 DEST="systemd"
90 fi
91
92 if [ ! -d "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${DEST}" ]; then
93 mkdir "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${DEST}"
94 fi
95
96 mount -n --bind "$entry" "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${DEST}"
97
98 # make sure that cpu,cpuacct shows up as cpu and cpuacct
99 # separately, else systemd is unhappy
100 if echo "$DEST" | grep -q ","; then
101 arr=$(echo "$DEST" | tr "," "\n")
102 for single in $arr
103 do
104 if [ ! -L "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${single}" ]; then
105 ln -s "$DEST" "${LXC_ROOTFS_MOUNT}/sys/fs/cgroup/${single}"
106 fi
107 done
108 fi
109 done
110 fi
111 fi
112
113 exit 0