Saya menggunakan lxc
wadah yang tidak terjangkau di Arch Linux
. Berikut adalah informasi sistem dasar:
[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
Ini kernel yang dikustomisasi / dikompilasi dengan 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
Sayangnya, systemd
tidak bermain dengan baik lxc
saat ini. Terutama pengaturan cgroups
untuk pengguna non-root tampaknya tidak berfungsi dengan baik atau saya tidak terlalu terbiasa bagaimana melakukan ini. lxc
hanya akan memulai sebuah wadah dalam mode tidak privat ketika itu dapat membuat cgroup yang diperlukan di /sys/fs/cgroup/XXX/*
. Namun ini tidak mungkin lxc
karena me systemd
-mount root
hierarki cgroup di /sys/fs/cgroup/*
. Solusi tampaknya untuk melakukan hal berikut:
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
Kode ini membuat cgroup
direktori yang sesuai dalam cgroup
hierarki untuk pengguna yang tidak memiliki hak. Namun, sesuatu yang saya tidak mengerti terjadi. Sebelum mengeksekusi di atas saya akan melihat ini:
[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
Setelah mengeksekusi kode yang tadi saya lihat di shell saya menjalankannya:
[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
Tetapi di shell lain saya masih melihat:
[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
Oleh karena itu, saya dapat memulai lxc
wadah yang tidak terjangkau di shell saya menjalankan kode yang disebutkan di atas tetapi tidak di yang lain.
Adakah yang bisa menjelaskan perilaku ini?
Adakah yang menemukan cara yang lebih baik untuk menyiapkan yang diperlukan
cgroups
dengan versisystemd
(>= 217
) saat ini?
sudo systemctl start cgmanager && sudo cgm create all $USER && sudo cgm chown all $USER $(id -u) $(id -g) && sudo cgm movepid all $USER $PPID
. Perintah terakhir harus dijalankan di shell saat ini untuk menambahkannya ke cgroup baru$USER
.Sebenarnya di archlinux, ini tidak akan berfungsi dengan misalnya pengguna yang tidak memiliki hak pribadi (disarankan saat menggunakan wadah yang tidak diprivasi. Lxc). yaitu pengguna yang tidak memiliki sudo :)
Sebagai gantinya, tentukan grup di /etc/cgconfig.conf, aktifkan cgconfig, cgrules (libcgroup di AUR), tambahkan juga cgrules, selesai .. unpriv. pengguna juga akan memiliki hak yang sama.
Dalam systemd 218 (saya tidak tahu kapan, tetapi tampaknya kita harus menambahkan dua kondisi lagi karena tidak diatur ketika dibuat dari cara cgconfig):
Dengan asumsi namespace dikompilasi dalam kernel.
Ini adalah templat, cpus dapat sesuai dengan berapa banyak inti yang Anda miliki, mem dapat diatur ke beberapa nilai aktual, dll.
EDIT 2: Akhirnya, di systemd, jika Anda ingin menggunakan auto-start dengan pengguna yang tidak memiliki privasi, Anda dapat melakukan:
cp /usr/lib/systemd/system/lxc{,admin}\@.service, lalu tambahkan Pengguna = lxcadmin
dan mengaktifkannya untuk wadah lxcadmin yang disebut lolz systemctl aktifkan lxcadmin @ lolz.
sumber
root
administrator untuk buat danchown
Anda menjadi semuacgroup
pengendali. Ini sangat baik dan aman.movepid
dapat dilakukan tanparoot
hak dan karenanya, undriv. pengguna tidak membutuhkansudo
hak apa pun . (Btw,libcgroup
tidak seharusnya digunakan lagi. RHEL dan yang lainnya telah menghentikannya.)Jadi saya mengalami masalah yang sama ketika mencoba untuk mendapatkan LXC kontainer yang tidak digunakan bekerja pada CentOS 7. Saya tidak ingin menggunakan
cgmanager
karena saya tidak suka memperkenalkan layanan tambahan jika tidak benar-benar diperlukan. Yang akhirnya saya lakukan adalah menambal systemd menggunakan beberapa tambalan dari paket ubuntu dan satu tambalan khusus untuk memperluas daftar pengontrol cgroup. Saya memiliki sumber yang diperlukan untuk membuat RPM di akun GitHub saya di https://github.com/CtrlC-Root/rpmdist . Saya juga telah menambal versi shadow-utils (untuk subuids dan subgids) dan pam (untuk loginuid). Setelah saya menginstal RPM ini dan mengonfigurasi pengguna untuk menjalankan wadah yang tidak diprivatisasi (tetapkan subuids & subgids, alokasikan pasangan veth di lxc-usernet, buat .config / lxc / default.conf, dll.) Saya dapat menjalankan kontainer tidak berprivasi LXC dengan baik.EDIT: Alasan lain saya tidak ingin menggunakan cgmanager adalah karena saya tidak ingin pengguna reguler saya harus menggunakan sudo sama sekali. Pengguna biasa harus bisa masuk dan semuanya harus "hanya berfungsi" di luar kotak.
sumber