Tôi sử dụng lxc
container không có đặc quyền trong Arch Linux
. Dưới đây là các thông tin hệ thống cơ bản:
[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
Đó là một kernel tùy chỉnh / biên dịch với 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
Thật không may, systemd
hiện tại không chơi tốt lxc
. Đặc biệt là thiết lập cgroups
cho một người dùng không root có vẻ không hoạt động tốt hoặc tôi quá lạ lẫm làm thế nào để làm điều này. lxc
sẽ chỉ bắt đầu một container trong chế độ không có đặc quyền khi nó có thể tạo các nhóm cần thiết trong /sys/fs/cgroup/XXX/*
. Tuy nhiên điều này là không thể lxc
vì systemd
gắn kết root
hệ thống phân cấp cgroup /sys/fs/cgroup/*
. Một cách giải quyết có vẻ là để làm như sau:
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
Mã này tạo các thư mục tương ứng cgroup
trong cgroup
hệ thống phân cấp cho người dùng không có đặc quyền. Tuy nhiên, điều mà tôi không hiểu xảy ra. Trước khi thực hiện những điều đã nói ở trên, tôi sẽ thấy điều này:
[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
Sau khi thực thi mã đã nói ở trên, tôi thấy trong trình bao, tôi chạy nó vào:
[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
Nhưng trong bất kỳ vỏ nào khác tôi vẫn thấy:
[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
Do đó, tôi có thể bắt đầu vùng lxc
chứa không có đặc quyền của mình trong trình bao Tôi đã thực thi mã được đề cập ở trên nhưng không phải trong bất kỳ mã nào khác.
Ai đó có thể giải thích hành vi này?
Có ai đó tìm thấy một cách tốt hơn để thiết lập yêu cầu
cgroups
với phiên bản hiện tại củasystemd
(>= 217
) không?