Myślę, że znalazłem lepsze rozwiązanie niż obecnie prezentowane tutaj. Po części dlatego, że o ile mogę stwierdzić, cgmanager nie żyje, po części dlatego, że moje rozwiązanie nie wydaje się hackującym obejściem, ale głównie dlatego, że ta dyskusja wciąż pojawia się podczas szukania rozwiązania problemu. Jest to dość proste: użyj trybu użytkownika systemowego .
Oczywiście, jeśli nie używasz systemd, to rozwiązanie nie pomoże. W takim przypadku radzę ci dowiedzieć się, czy Twój system init ma jakiś sposób na umożliwienie nieuprzywilejowanym użytkownikom uruchamiania usług podczas rozruchu i używania tego jako punktu wyjścia.
Używanie trybu użytkownika systemowego do automatycznego uruchamiania nieuprzywilejowanych kontenerów LXC
Zakładam, że masz nieuprzywilejowane kontenery lxc działające poprawnie i działające, lxc-autostart
gdy działa użytkownik kontenera. Jeśli tak, wykonaj następujące czynności:
- Utwórz plik
~/.config/systemd/user/lxc-autostart.service
w domu dowolnego użytkownika, który ma kontenery lxc:
[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
- Następnie jako ten użytkownik uruchom:
systemctl --user enable lxc-autostart
(Uwaga, --user
opcja mówi systemctl, że używasz go w trybie użytkownika. Wszystkie rzeczy, które normalnie robię z systemctl, start, stop, statuc, enable itp., Praca z --user.)
- Następnie uruchom następujące polecenie, gdzie
$user
jest nazwa użytkownika, który ma kontenery LXC:
sudo loginctl enable-linger $user
Jest to konieczne, aby systemd uruchomił instancję użytkownika systemd $user
podczas uruchamiania. W przeciwnym razie uruchomiłby się tylko w momencie $user
zalogowania.
Aby uzyskać więcej informacji, poleciłbym stronę archlinux wiki systemd / timer i systemd strony man .
Dostęp do wystąpienia systemowego użytkownika jako root
Możesz faktycznie uruchomić / zatrzymać / dowolną usługę systemową użytkownika jako root, jednak wymaga to ustawienia XDG_RUNTIME_DIR
zmiennej środowiskowej. Załóżmy, że $user
jest to użytkownik, do którego instancji chcesz uzyskać dostęp i $uid
jest to identyfikator UID, a następnie uruchom lxc-autostart.service zdefiniowany powyżej:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Możesz nawet użyć systemd-run
do uruchomienia dowolnych poleceń jako ten użytkownik w sposób, który nie psuje LXC. Korzystam z następujących poleceń, aby zatrzymać / uruchomić moje kontenery przed / po utworzeniu kopii zapasowej, gdzie $name
jest nazwa kontenera LXC, którego kopię zapasową wykonuję:
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
(Pamiętaj, że bez --wait
uruchomienia systemowego nie blokuje się, dopóki kontener nie zostanie zatrzymany).
/etc/init/lxc.conf
wskazówek. To pierwsze zadanie, które uruchamia uprzywilejowane kontenery. Nie powinno być zbyt trudne do skopiowania go i zmodyfikowania, aby zamknąć również nieuprzywilejowane kontenery./proc/self/cgroup
tym, że zawiera sekwencje podobne/user/0.user/1.session
zamiast/user/1000.user/1.session
W przypadku, gdy ktoś natknie się na to pytanie i odpowiedź na pytanie o automatyczne uruchamianie nieuprzywilejowanych kontenerów LXC (z pewnością często tu sprawdzam), oto rozwiązanie, które działa dobrze i które zastosowałem, aby działało na moim serwerze:
http://blog.lifebloodnetworks.com/?p=2118 autor: Nicholas J Ingrassellino.
Mówiąc w skrócie, polega to na utworzeniu dwóch skryptów, które działają razem podczas uruchamiania, aby LXC mógł uruchomić nieuprzywilejowane kontenery każdego wymienionego użytkownika bez konieczności logowania się na konto użytkownika; innymi słowy, wykonanie polecenia jako użytkownik przy nienaruszonej magii CGroups. Zgodnie z najlepszą praktyką SO przytoczę jej kości, ale warto przeczytać jego oryginalny artykuł.
Chciałbym tylko podkreślić, że wydaje się działać bezpiecznie, poprawnie i nie wymaga rootowania do SSH na innych kontach użytkowników.
Więcej informacji na ten temat (dotykając pokrewnych gotch) można znaleźć tutaj: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, które mogą być pomocne w zrozumieniu, dlaczego tak jest.
źródło
Napisałem mały skrypt, aby obejść ten problem, po prostu postępuj zgodnie z komentowanymi instrukcjami.
źródło
SORRY: odpowiedział zbyt wcześnie. Nie działało, mimo że lxc-ls pokazuje „AUTOSTART” jako „TAK”.
Oto link z dużo bardziej użytecznymi informacjami i być może ktoś może z niego skorzystać: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/
Wylądowałem na tej stronie, ponieważ miałem ten sam problem. Po przeczytaniu tego wątku zdałem sobie sprawę, że lxc-create nie może pisać do zwykłego katalogu „/ var / lib / lxc /”, jeśli nie jest uruchamiany z sudo.
Rozejrzałem się i zlokalizowałem rootfs dla mojego nieuprzywilejowanego kontenera w "~ / .local / share / lxc" i umieszczając dwie linie w pytaniu w config w tym katalogu.
Spojrzałem na szablon, którego użyłem, „lxc-download” na wskazówkę, ale myślę, że ta ścieżka została przekazana, gdy wywoływane jest „lxc-download”. Nie patrzyłem, jak system szuka nieuprzywilejowanych kontenerów podczas uruchamiania.
źródło
Korzystam z każdego nieuprzywilejowanego kontenera z tym samym nazwanym użytkownikiem dla lepszej izolacji i tak to robię:
źródło
Zakładając (że są matką wszystkich sposobów na zepsucie rzeczy), logujesz się jako użytkownik, który „jest właścicielem” nieuprzywilejowanego kontenera lxc, to poniższe polecenie powinno odpowiedzieć na to, czego szukasz ...
To po prostu uruchomi powyższe polecenie, gdy zalogujesz się przez bash. Zakłada się również, że bash jest powłoką logowania. Zastąp nazwę:
LXC-CONTAINER-NAME
nazwą kontenera LXC, który chcesz rozpocząć.źródło
Użyłem innego podejścia i działa
1º Dodaj następujące wpisy w pliku konfiguracji kontenera
KONFIGURACJA AUTOMATYCZNEGO STARTU
lxc.start.auto = 1 lxc.start.delay = 5
2º Utwórz relację zaufania między użytkownikiem kontenera a sobą na tym samym serwerze
userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Generowanie pary kluczy publiczny / prywatny rsa. Wpisz plik, w którym chcesz zapisać klucz (/home/userlxc/.ssh/id_rsa): Wpisz hasło (puste dla hasła): Wprowadź ponownie to samo hasło: Twoja identyfikacja została zapisana w /home/userlxc/.ssh/id_rsa. Twój klucz publiczny został zapisany w /home/userlxc/.ssh/id_rsa.pub. Kluczowy odcisk palca to: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Losowy obraz klucza to: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +
userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / Author_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / 17:23 .ssh / autoryzowane_klucze
Sprawdź połączenie ssh, musisz mieć możliwość korzystania z niego bez hasła userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"
NAZWA STAN IPV4 IPV6 AUTOSTART
EXTLXCCONT01 ZATRZYMANY - - TAK
UBUSER1404USERCONT01-test ZATRZYMANY - - BRAK
UBUSER1404USERLXCCONT01 ZATRZYMANY - - NIE
3º Utwórz wpis crontab u właściciela kontenera
@ reboot ssh userlxc @ localhost "lxc-autostart"
źródło