userns container startet nicht, wie kann man den grund finden?

8

Beim Erstellen eines LXC-Containers für Benutzer (nicht privilegiert) unter Ubuntu 14.04 mit der folgenden Befehlszeile:

lxc-create -n test1 -t download -- -d $(lsb_release -si|tr 'A-Z' 'a-z') -r $(lsb_release -sc) -a $(dpkg --print-architecture)

und (ohne die erstellte Konfigurationsdatei zu berühren) versuchen Sie dann, sie zu starten mit:

lxc-start -n test1 -l DEBUG

es schlägt fehl. Die Protokolldatei zeigt mir:

lxc-start 1420149317.700 INFO     lxc_start_ui - using rcfile /home/user/.local/share/lxc/test1/config
lxc-start 1420149317.700 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type u nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type g nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 WARN     lxc_log - lxc_log_init called with log already initialized
lxc-start 1420149317.701 INFO     lxc_lsm - LSM security driver AppArmor
lxc-start 1420149317.701 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/2' (5/6)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/7' (7/8)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/8' (9/10)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/10' (11/12)
lxc-start 1420149317.702 INFO     lxc_conf - tty's configured
lxc-start 1420149317.702 DEBUG    lxc_start - sigchild handler set
lxc-start 1420149317.702 DEBUG    lxc_console - opening /dev/tty for console peer
lxc-start 1420149317.702 DEBUG    lxc_console - using '/dev/tty' as console
lxc-start 1420149317.702 DEBUG    lxc_console - 14946 got SIGWINCH fd 17
lxc-start 1420149317.702 DEBUG    lxc_console - set winsz dstfd:14 cols:118 rows:61
lxc-start 1420149317.905 INFO     lxc_start - 'test1' is initialized
lxc-start 1420149317.906 DEBUG    lxc_start - Not dropping cap_sys_boot or watching utmp
lxc-start 1420149317.906 INFO     lxc_start - Cloning a new user namespace
lxc-start 1420149317.906 INFO     lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - call to cgmanager_create_sync failed: invalid request
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Failed to create hugetlb:test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Error creating cgroup hugetlb:test1
lxc-start 1420149317.907 INFO     lxc_cgmanager - cgroup removal attempt: hugetlb:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: perf_event:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: blkio:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: freezer:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: devices:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: memory:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpuacct:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpu:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: cpuset:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: name=systemd:test1 did not exist
lxc-start 1420149317.910 ERROR    lxc_start - failed creating cgroups
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start - failed to spawn 'test1'
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start_ui - The container failed to start.
lxc-start 1420149317.910 ERROR    lxc_start_ui - Additional information can be obtained by setting the --logfile and --logpriority options.

Jetzt sehe ich hier zwei Fehler, wobei der letztere wahrscheinlich auf den ersteren zurückzuführen ist:

lxc_start - cgroups konnte nicht erstellt werden

Allerdings sehe ich /sys/fs/cgroupmontiert:

$ mount|grep cgr
none on /sys/fs/cgroup type tmpfs (rw)

und cgmanagerist installiert:

$ dpkg -l|awk '$1 ~ /^ii$/ && /cgmanager/ {print $2 " " $3 " " $4}'
cgmanager 0.24-0ubuntu7 amd64
libcgmanager0:amd64 0.24-0ubuntu7 amd64

Hinweis: Mein Host ist standardmäßig weiterhin aktiviert upstart.

Im Zweifelsfall unterstützt der Kernel cgroups:

$ grep CGROUP /boot/config-$(uname -r)
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
CONFIG_NETPRIO_CGROUP=m

Hinweis: Mein Host ist standardmäßig weiterhin aktiviert upstart.

0xC0000022L
quelle

Antworten:

7

Es stellt sich heraus, überraschend überraschend, dass dies eine Ubuntu-spezifische Sache ist.


Die Ursache

Das Problem: Obwohl der Kernel cgroupsaktiviert ist (überprüfen mit grep CGROUP /boot/config-$(uname -r)) und ausgeführt cgmanagerwird, gibt es keine für meinen Benutzer spezifische cgroup. Sie können dies überprüfen mit:

$ cat / proc / self / cgroup
11: hugetlb: /
10: perf_event: /
9: blkio: /
8: Gefrierschrank: /
7: Geräte: /
6: Speicher: /
5: cpuacct: /
4: CPU: /
3: name = systemd: /
2: cpuset: /

Wenn Ihre UID in jeder der relevanten Zeilen angegeben ist, ist dies in Ordnung. Wenn jedoch keine cgroups definiert wurden, wird in jeder Zeile nur ein Schrägstrich nach dem zweiten Doppelpunkt angezeigt.

Mein Problem war spezifisch für das Starten eines nicht privilegierten Containers. Ich könnte privilegierte Container ganz gut starten.

Es stellte sich heraus, dass mein Problem eng mit diesem Thread auf der lxc-usersMailingliste zusammenhängt .

Abhilfe

Unter Ubuntu ist 14.04 upstartdie Standardeinstellung im Gegensatz zu systemd. Daher werden bestimmte Komponenten, die in einer systemdDistribution auf Basis installiert werden, nicht standardmäßig installiert.

Zusätzlich gab es zwei Pakete, cgmanagerdie ich installieren musste, um den in meiner Frage gezeigten Fehler zu überwinden: cgroup-binund libpam-systemd. Ehrlich gesagt bin ich mir nicht 100% sicher, dass Ersteres unbedingt benötigt wird, also könnten Sie versuchen, es wegzulassen und hier zu kommentieren.

Nach der Installation der Pakete und einem Neustart sollte Ihre UID ( id -uhier 1000) in der Ausgabe angezeigt werden:

$ cat / proc / self / cgroup
11: hugetlb: /user/1000.user/1.session
10: perf_event: /user/1000.user/1.session
9: blkio: /user/1000.user/1.session
8: Gefrierschrank: /user/1000.user/1.session
7: Geräte: /user/1000.user/1.session
6: Speicher: /user/1000.user/1.session
5: cpuacct: /user/1000.user/1.session
4: cpu: /user/1000.user/1.session
3: name = systemd: /user/1000.user/1.session
2: cpuset: /user/1000.user/1.session

Danach wird der Fehler beim Versuch, den Gastcontainer zu starten, der Kürze halber (getrimmt):

lxc-start 1420160065.383 INFO lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420160065.419 FEHLER lxc_start - Das konfigurierte Netzwerk konnte nicht erstellt werden
lxc-start 1420160065.446 FEHLER lxc_start - 'test1' konnte nicht erzeugt werden.
lxc-start 1420160065.451 FEHLER lxc_start_ui - Der Container konnte nicht gestartet werden.

Also immer noch kein Erfolg, aber wir sind einen Schritt näher.

Der oben verknüpfte lxc-usersThread weist darauf hin, /etc/systemd/logind.confdass drei Controller nicht erwähnt werden : net_cls, net_priound debug. Für mich fehlte nur der letzte. Nach der Änderung müssen Sie sich jedoch erneut anmelden, da die Änderungen beim Erstellen Ihrer Anmeldesitzung wirksam werden.

Dieser Blog-Beitrag eines der Autoren von LXC gibt den nächsten Schritt:

Ihr Benutzer kann zwar neue Benutzernamensräume erstellen, in denen er die UID 0 hat und über einige der Root-Berechtigungen für Ressourcen verfügt, die an diesen Namespace gebunden sind, erhält jedoch offensichtlich keine zusätzlichen Berechtigungen auf dem Host.

Eine solche Sache ist das Erstellen neuer Netzwerkgeräte auf dem Host oder das Ändern der Bridge-Konfiguration. Um dies zu umgehen, haben wir ein Tool namens "lxc-user-nic" geschrieben, das der einzige SETUID-Binärteil von LXC 1.0 ist und eine einfache Aufgabe ausführt. Es analysiert eine Konfigurationsdatei und erstellt basierend auf deren Inhalt Netzwerkgeräte für den Benutzer und überbrückt diese. Um Missbrauch zu verhindern, können Sie die Anzahl der Geräte einschränken, die ein Benutzer anfordern kann, und zu welcher Bridge sie hinzugefügt werden können.

Ein Beispiel ist meine eigene Datei / etc / lxc / lxc-usernet:

stgraber veth lxcbr0 10

Dies erklärt, dass der Benutzer "stgraber" bis zu 10 Geräte vom Typ veth erstellen und der Brücke mit dem Namen lxcbr0 hinzufügen darf.

Zwischen dem, was der Benutzernamensraum im Kernel bietet, und dem Setuid-Tool haben wir alles, was benötigt wird, um die meisten Distributionen ohne Privileg auszuführen.

Wenn Ihr Benutzer sudoRechte hat und Sie Bash verwenden, verwenden Sie Folgendes:

echo "$(whoami) veth lxcbr0 10"|sudo tee -a /etc/lxc/lxc-usernet

und stellen Sie sicher, dass der Typ ( veth) mit dem in der Containerkonfiguration übereinstimmt und die Brücke ( lxcbr0) konfiguriert und aktiv ist.

Und jetzt bekommen wir noch eine Reihe von Fehlern:

lxc-start 1420192192.775 INFO lxc_start - Klonen eines neuen Benutzernamensraums
lxc-start 1420192192.775 INFO lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420192192.923 HINWEIS lxc_start - Umschalten auf gid / uid 0 im neuen Benutzernamensraum
lxc-start 1420192192.923 FEHLER lxc_start - Berechtigung verweigert - Zugriff auf / home / user nicht möglich. Bitte gewähren Sie ihm 'x'-Zugriff oder fügen Sie eine ACL für das Container-Stammverzeichnis hinzu.
lxc-start 1420192192.923 FEHLER lxc_sync - ungültige Sequenznummer 1. erwartet 2
lxc-start 1420192192.954 FEHLER lxc_start - 'test1' konnte nicht erzeugt werden.
lxc-start 1420192192.959 FEHLER lxc_start_ui - Der Container konnte nicht gestartet werden.

Genial, das kann behoben werden. Ein weiterer lxc-usersThread von denselben Protagonisten wie im ersten Thread ebnet den Weg.

Im Moment muss ein schneller Test durchgeführt sudo chmod -R o+X $HOMEwerden, aber ACLs sind auch hier eine praktikable Option. YMMV.

0xC0000022L
quelle
Ich bin immer noch fest davon überzeugt, dass es fehlschlägt, wenn ich den LXC-Container des Benutzers als anderen Benutzer ausführen möchte. Die Erstellung funktioniert (mit einer Warnung :) WARN: could not reopen tty: Permission denied. Aber das Starten sudo -H -i -u database lxc-start -n mysql -dschlägt wie in Ihrer Frage fehl. Gleiche Fehler. Ihr Fix funktioniert jedoch nicht mit sudo. In diesem sudo -H -i -u database cat /proc/self/cgroupFall erhalte ich genau die gleiche Ausgabe, als würde ich sie als mein anrufender Benutzer ausführen. Wenn Sie also versuchen, den Container mit sudo zu starten, wird er als anderer Benutzer versuchen, in meine cgroup zu schreiben, was fehlschlägt ... :-( Irgendein Einblick?
Huygens