Ich benutze nichtprivilegierte lxc
Container in Arch Linux
. Hier sind die grundlegenden Systeminfos:
[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
Es ist ein angepasster / kompilierter Kernel mit 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
Leider systemd
spielt das lxc
momentan nicht gut mit . Insbesondere das Einrichten cgroups
für einen Nicht-Root-Benutzer scheint nicht gut zu funktionieren, oder ich bin einfach zu ungewohnt, wie dies zu tun ist. lxc
startet einen Container nur im nichtprivilegierten Modus, wenn er die erforderlichen Gruppen erstellen kann /sys/fs/cgroup/XXX/*
. Dies ist jedoch nicht möglich, lxc
da systemd
die root
cgroup-Hierarchie darin eingebunden ist /sys/fs/cgroup/*
. Eine Problemumgehung scheint darin zu bestehen, Folgendes zu tun:
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
Dieser Code erstellt die entsprechenden cgroup
Verzeichnisse in der cgroup
Hierarchie für einen nicht privilegierten Benutzer. Es passiert jedoch etwas, was ich nicht verstehe. Vor dem Ausführen des oben genannten werde ich Folgendes sehen:
[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
Nachdem ich den oben genannten Code ausgeführt habe, sehe ich in der Shell, in der ich ihn ausgeführt habe:
[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
Aber in jeder anderen Hülle sehe ich noch:
[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
Daher kann ich meinen nichtprivilegierten lxc
Container in der Shell starten , in der ich den oben genannten Code ausgeführt habe, aber in keiner anderen.
Kann jemand dieses Verhalten erklären?
Hat jemand eine bessere Möglichkeit gefunden, die
cgroups
mit einer aktuellen Version vonsystemd
(>= 217
) benötigten einzurichten ?
sudo systemctl start cgmanager && sudo cgm create all $USER && sudo cgm chown all $USER $(id -u) $(id -g) && sudo cgm movepid all $USER $PPID
. Der letzte Befehl muss in der aktuellen Shell ausgeführt werden, um ihn der neuen cgroup für hinzuzufügen$USER
.Tatsächlich funktioniert dies in Archlinux nicht mit einem nicht privilegierten Benutzer (empfohlen, wenn unpriv. Lxc-Container verwendet werden). dh dieser Benutzer hat kein sudo :)
Definieren Sie stattdessen group in /etc/cgconfig.conf, aktivieren Sie cgconfig, cgrules (libcgroup in AUR), fügen Sie auch cgrules hinzu, done .. unpriv. Benutzer haben auch die gleichen Rechte.
In systemd 218 (ich weiß nicht wann, aber es scheint, als müsste man zwei weitere Bedingungen hinzufügen, da diese bei der Erstellung mit cgconfig nicht festgelegt werden):
Vorausgesetzt, der Namespace ist im Kernel kompiliert.
Dies ist eine Vorlage, die CPU kann abhängig von der Anzahl der Kerne sein, die Sie haben, Mem kann auf einen tatsächlichen Wert gesetzt werden, usw. usw.
BEARBEITEN 2: Schließlich können Sie in systemd Folgendes tun, wenn Sie den automatischen Start für einen solchen nicht privilegierten Benutzer verwenden möchten:
cp /usr/lib/systemd/system/lxc{,admin}\@.service, dann fügen Sie User = lxcadmin hinzu
und aktivieren Sie es für den lxcadmin-Container mit dem Namen lolz systemctl enable lxcadmin @ lolz.
quelle
root
Administrator benötigen erstellen undchown
Sie in allecgroup
Controller. Das ist vollkommen in Ordnung und sicher.movepid
kann ohneroot
Rechte und damit die unpriv getan werden. Benutzer benötigt keinesudo
Rechte. (Übrigens, solltelibcgroup
nicht mehr verwendet werden. RHEL und andere haben es abgelehnt.)Daher trat das gleiche Problem auf, als ich versuchte, unprivilegierte LXC-Container unter CentOS 7 zum Laufen zu bringen. Ich wollte sie nicht verwenden,
cgmanager
weil ich keine zusätzlichen Dienste einführen möchte, wenn sie nicht unbedingt benötigt werden. Stattdessen habe ich systemd mit einigen Patches aus dem Ubuntu-Paket und einem benutzerdefinierten Patch gepatcht, um die Liste der Gruppencontroller zu erweitern. Ich habe die Quellen, die zum Erstellen eines RPM auf meinem GitHub-Konto unter https://github.com/CtrlC-Root/rpmdist benötigt werden . Ich habe auch Versionen von shadow-utils (für subuids und subgids) und pam (für loginuid) gepatcht. Nachdem ich diese RPMs installiert und einen Benutzer so konfiguriert habe, dass unprivilegierte Container ausgeführt werden (Zuweisen von Sub-Uids und Sub-Gids, Zuweisen von Veth-Paaren in lxc-usernet, Erstellen von .config / lxc / default.conf usw.), kann ich unprivilegierte LXC-Container problemlos ausführen.BEARBEITEN: Ein weiterer Grund, warum ich cgmanager nicht verwenden wollte, ist, dass meine regulären Benutzer Sudo überhaupt nicht verwenden sollten. Normale Benutzer sollten sich anmelden können und alles sollte sofort funktionieren.
quelle