ฉันใช้lxc
ตู้คอนเทนเนอร์ที่Arch Linux
ไม่ได้รับสิทธิพิเศษมา นี่คือข้อมูลพื้นฐานของระบบ:
[chb@conventiont ~]$ uname -a
Linux conventiont 3.17.4-Chb #1 SMP PREEMPT Fri Nov 28 12:39:54 UTC 2014 x86_64 GNU/Linux
มันเป็นเคอร์เนลที่กำหนดเอง / คอมไพล์ด้วยuser namespace enabled
:
[chb@conventiont ~]$ lxc-checkconfig
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
[chb@conventiont ~]$ systemctl --version
systemd 217
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD +IDN
แต่น่าเสียดายที่systemd
ไม่ได้เล่นได้ดีกับlxc
ปัจจุบัน โดยเฉพาะอย่างยิ่งการตั้งค่าcgroups
สำหรับผู้ใช้ที่ไม่ใช่รูทดูเหมือนจะทำงานได้ไม่ดีหรือฉันก็ไม่คุ้นเคยกับวิธีการทำเช่นนี้ lxc
จะเริ่มต้นภาชนะในโหมดด้อยโอกาสเมื่อมันสามารถสร้าง cgroups /sys/fs/cgroup/XXX/*
จำเป็น อย่างไรก็ตามเรื่องนี้เป็นไปไม่ได้lxc
เพราะsystemd
ม้าroot
ลำดับชั้น cgroup /sys/fs/cgroup/*
ใน วิธีแก้ปัญหาดูเหมือนจะทำต่อไปนี้:
for d in /sys/fs/cgroup/*; do
f=$(basename $d)
echo "looking at $f"
if [ "$f" = "cpuset" ]; then
echo 1 | sudo tee -a $d/cgroup.clone_children;
elif [ "$f" = "memory" ]; then
echo 1 | sudo tee -a $d/memory.use_hierarchy;
fi
sudo mkdir -p $d/$USER
sudo chown -R $USER $d/$USER
echo $$ > $d/$USER/tasks
done
รหัสนี้สร้างcgroup
ไดเรกทอรีที่สอดคล้องกันในcgroup
ลำดับชั้นสำหรับผู้ใช้ที่ไม่มีสิทธิ์ อย่างไรก็ตามสิ่งที่ฉันไม่เข้าใจเกิดขึ้น ก่อนดำเนินการตามที่กล่าวมาฉันจะเห็นสิ่งนี้:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope
หลังจากรันโค้ดข้างต้นฉันเห็นในเชลล์ฉันรันใน:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/chb
7:net_cls:/chb
6:freezer:/chb
5:devices:/chb
4:memory:/chb
3:cpu,cpuacct:/chb
2:cpuset:/chb
1:name=systemd:/chb
แต่ในเปลือกอื่น ๆ ฉันยังเห็น:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope
ดังนั้นฉันสามารถเริ่มต้นlxc
ภาชนะunprivileged ของฉันในเปลือกฉันเรียกใช้รหัสที่กล่าวถึงข้างต้น แต่ไม่ได้อยู่ในอื่น ๆ
มีคนอธิบายพฤติกรรมนี้ได้ไหม
มีคนพบวิธีที่ดีกว่าในการตั้งค่าสิ่งที่จำเป็น
cgroups
ด้วยsystemd
(>= 217
) รุ่นปัจจุบันหรือไม่?