Ich denke, ich habe eine bessere Lösung gefunden als die derzeit hier vorgestellten. Zum einen, weil cgmanager, soweit ich das beurteilen kann, tot ist, zum anderen, weil sich meine Lösung nicht wie eine hackige Problemumgehung anfühlt, sondern zum größten Teil, weil diese Diskussion immer noch auftaucht, wenn nach einer Lösung für das Problem gesucht wird. Eigentlich ist es ziemlich einfach: Verwenden Sie den Systemd-Benutzermodus .
Zugegeben, wenn Sie systemd nicht verwenden, hilft diese Lösung nicht weiter. In diesem Fall würde ich Ihnen raten, herauszufinden, ob Ihr Init-System es nicht privilegierten Benutzern ermöglicht, Dienste beim Booten auszuführen und dies als Ausgangspunkt zu verwenden.
Verwenden des Systemd-Benutzermodus zum automatischen Starten nicht privilegierter lxc-Container
Ich gehe davon aus, dass Sie nicht privilegierte lxc-Container haben, die ordnungsgemäß funktionieren und die ausgeführt werden, lxc-autostart
wenn der Benutzer des Containers arbeitet. Wenn ja, gehen Sie wie folgt vor:
- Erstellen Sie die Datei
~/.config/systemd/user/lxc-autostart.service
in der Startseite des Benutzers, der über die lxc-Container verfügt:
[Unit]
Description="Lxc-autostart for lxc user"
[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1
[Install]
WantedBy=default.target
- Führen Sie dann als dieser Benutzer Folgendes aus:
systemctl --user enable lxc-autostart
(Beachten Sie, dass die --user
Option systemctl mitteilt, dass Sie es im Benutzermodus verwenden. Alle Dinge, die ich normalerweise mit systemctl, start, stop, statuc, enable usw. mache, funktionieren mit --user.)
- Führen Sie dann Folgendes aus, wobei
$user
der Name des Benutzers lautet, der über die lxc-Container verfügt:
sudo loginctl enable-linger $user
Dies ist erforderlich, damit systemd $user
beim Booten eine systemd-Benutzerinstanz für startet . Andernfalls würde im Moment nur eine $user
Anmeldung gestartet .
Für weitere Informationen würde ich die archlinux wiki systemd / timer Seite und die systemd Manpages empfehlen .
Zugriff auf die systemd-Instanz eines Benutzers als root
Sie können den systemd-Dienst eines Benutzers als root starten / stoppen / was auch immer. Dazu müssen Sie jedoch die XDG_RUNTIME_DIR
Umgebungsvariable festlegen . Angenommen, es $user
handelt sich um den Benutzer, auf dessen Instanz Sie zugreifen möchten, und um $uid
die UID. Auf diese Weise starten Sie den oben definierten lxc-autostart.service:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Sie können sogar systemd-run
beliebige Befehle als Benutzer so ausführen, dass lxc nicht beschädigt wird. Ich verwende die folgenden Befehle, um meine Container vor / nach der Sicherung zu stoppen / zu starten. Dabei $name
lautet der Name des lxc-Containers, der gesichert wird:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name
(Beachten Sie, dass ohne --wait
systemd-run nicht blockiert wird, bis der Container gestoppt wird.)
/etc/init/lxc.conf
Hinweisen suchen . Es ist der Startjob, der die privilegierten Container startet. Es sollte nicht zu schwierig sein, es zu kopieren und zu ändern, um auch nicht privilegierte Container herunterzufahren./proc/self/cgroup
dass es Sequenzen wie/user/0.user/1.session
anstelle von/user/1000.user/1.session
Für den Fall, dass jemand auf diese Fragen und Antworten stößt, um die Antwort auf das automatische Starten von nicht privilegierten LXC-Containern zu erhalten (ich schaue hier sicherlich viel nach), ist hier eine Lösung, die gut funktioniert und die ich befolgt habe, um sie auf meinem Server zum Laufen zu bringen:
http://blog.lifebloodnetworks.com/?p=2118 von Nicholas J Ingrassellino.
Kurz gesagt, es werden zwei Skripte erstellt, die beim Start zusammenarbeiten, damit LXC die nicht privilegierten Container jedes aufgelisteten Benutzers starten kann, ohne sich tatsächlich beim Benutzerkonto anmelden zu müssen. Mit anderen Worten: Ausführen des Befehls als Benutzer mit intakter CGroups-Magie. In Übereinstimmung mit SO Best Practice werde ich hier die Knochen zitieren, aber es lohnt sich, seinen Originalartikel zu lesen.
Ich möchte nur betonen, dass es sicher und korrekt zu funktionieren scheint und nicht erfordert, dass der Root für SSH in die anderen Benutzerkonten eingeht.
Hier finden Sie auch weitere Informationen zu diesem Thema (Berühren verwandter Fallstricke): https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, die hilfreich sein können, um zu verstehen, warum dies so ist.
quelle
Ich habe ein kleines Skript geschrieben , um das Problem zu umgehen. Befolgen Sie einfach die kommentierten Anweisungen.
quelle
ENTSCHULDIGUNG: antwortete zu früh. Es hat nicht funktioniert, obwohl lxc-ls "AUTOSTART" als "YES" anzeigt.
Hier ist ein Link mit viel nützlicheren Informationen, und vielleicht kann jemand davon Gebrauch machen: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/
Ich bin auf dieser Seite gelandet, weil ich das gleiche Problem hatte. Nachdem ich diesen Thread gelesen hatte, stellte ich fest, dass lxc-create nicht in das übliche Verzeichnis "/ var / lib / lxc /" schreiben kann, wenn es nicht mit sudo ausgeführt wird.
Ich habe mich umgesehen und die rootfs für meinen nicht privilegierten Container in "~ / .local / share / lxc" gefunden und die beiden Zeilen in der Frage in config in diesem Verzeichnis abgelegt.
Ich habe mir die von mir verwendete Vorlage "lxc-download" als Hinweis angesehen, aber ich glaube, dieser Pfad wurde übergeben, als "lxc-download" aufgerufen wurde. Ich habe nicht untersucht, wie das System beim Booten nach nicht privilegierten Containern sucht.
quelle
Ich führe jeden nicht privilegierten Container mit einem gleichnamigen Benutzer aus, um die Isolation zu verbessern, und so mache ich es:
quelle
Angenommen, Sie melden sich als der Benutzer an, der den nicht privilegierten lxc-Container "besitzt". Der folgende Befehl sollte sich mit dem befassen, wonach Sie suchen.
Dadurch wird einfach der obige Befehl ausgeführt, wenn Sie sich über bash anmelden. Dies setzt auch voraus, dass bash die Login-Shell ist. Bitte ersetzen Sie den Namen:
LXC-CONTAINER-NAME
durch den Namen Ihres LXC-Containers, den Sie starten möchten.quelle
Ich habe einen anderen Ansatz gewählt und es funktioniert
1º Fügen Sie die folgenden Einträge in die Container-Konfigurationsdatei ein
AUTO START CONFIG
lxc.start.auto = 1 lxc.start.delay = 5
2º Erstellen Sie eine Vertrauensbeziehung zwischen dem Containerbenutzer und sich selbst auf demselben Server
userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Generiert ein öffentliches / privates rsa-Schlüsselpaar. Geben Sie die Datei ein, in der der Schlüssel gespeichert werden soll (/home/userlxc/.ssh/id_rsa): Geben Sie die Passphrase ein (leer für keine Passphrase): Geben Sie dieselbe Passphrase erneut ein: Ihre Identifikation wurde in /home/userlxc/.ssh/id_rsa gespeichert. Ihr öffentlicher Schlüssel wurde in /home/userlxc/.ssh/id_rsa.pub gespeichert. Der Schlüsselfingerabdruck lautet: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Das Randomart-Bild des Schlüssels lautet: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +
userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / autorisierte_schlüssel userlxc @ GEST-4: ~ $ ls -lrt .ssh / autorisierte_keys -rw-rw-r-- 1 userlxc userlxc 404 19. November 17:23 .ssh / autorisierte_Tasten
Überprüfen Sie die SSH-Verbindung. Sie müssen sie ohne Kennwort verwenden können. Userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"
NAME STATE IPV4 IPV6 AUTOSTART
EXTLXCCONT01 STOPPED - - JA
UBUSER1404USERCONT01-Test STOPPED - - NEIN
UBUSER1404USERLXCCONT01 STOPPED - - NO
3º Erstellen Sie einen Crontab-Eintrag beim Containerbesitzer
@reboot ssh userlxc @ localhost "lxc-autostart"
quelle