Come avviare automaticamente i contenitori lxc non privilegiati?


9

Su Ubuntu 14.04, ho creato un contenitore senza privilegi che posso avviare e arrestare manualmente.

Ma vorrei che questo avviasse e si fermasse insieme al sistema.

Ho aggiunto quanto segue alla configurazione del contenitore: lxc.start.auto = 1 lxc.start.delay = 5

Tuttavia, gli script di sistema non sembrano selezionare contenitori non privilegiati.

C'è un thread relativo a questo su linuxcontainers.org, ma la soluzione sembra essere limitata rootall'utente.

Esiste un modo chiaro per farlo per un utente non root (con il consenso dell'utente root)?

Risposte:


3

Penso di aver trovato una soluzione migliore di quelle attualmente presentate qui. In parte perché, per quanto ne so, cgmanager è morto, in parte perché la mia soluzione non sembra una sciagurata soluzione, ma soprattutto perché questa discussione si presenta ancora quando si cerca una soluzione al problema. In realtà è piuttosto semplice: usa la modalità utente di systemd .

Concesso se non usi systemd questa soluzione non ti aiuterà. In tal caso, ti consiglierei di capire se il tuo sistema init ha un modo per consentire agli utenti non privilegiati di eseguire servizi all'avvio e usarlo come punto di partenza.

Utilizzo della modalità utente di systemd per avviare automaticamente i contenitori lxc non privilegiati

Suppongo che i container lxc non privilegiati funzionino correttamente e lxc-autostartfunzionino mentre l'utente del container funziona. In tal caso, procedi come segue:

  1. Crea il file ~/.config/systemd/user/lxc-autostart.servicenella home di qualunque utente abbia i contenitori 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
  1. Quindi mentre l'utente esegue:
systemctl --user enable lxc-autostart

(Nota, l' --useropzione dice a systemctl che la stai usando in modalità utente. Tutte le cose che faccio normalmente con systemctl, start, stop, statuc, enable, ecc., Lavoro con --user.)

  1. Quindi eseguire quanto segue, dove $userè il nome dell'utente che ha i contenitori lxc:
sudo loginctl enable-linger $user

Ciò è necessario affinché systemd avvii un'istanza utente di systemd $userall'avvio. Altrimenti ne inizierebbe solo uno al momento del $userlogin.

Per maggiori informazioni, consiglierei la pagina systemd / timer della wiki di archlinux e le pagine man di systemd .

Accesso all'istanza systemd di un utente come root

Puoi effettivamente avviare / interrompere / qualunque sia il servizio systemd di un utente come root, tuttavia questo richiede di impostare la XDG_RUNTIME_DIRvariabile di ambiente. Supponiamo che $user l'utente abbia l'istanza a cui desideri accedere ed $uidè uid, quindi è così che avresti avviato lxc-autostart.service definito sopra:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart

Puoi anche usare systemd-runper eseguire comandi arbitrari come quell'utente in un modo che non rompa lxc. Sto usando i seguenti comandi per arrestare / avviare i miei contenitori prima / dopo il backup, dove si $nametrova il nome del contenitore lxc di cui si esegue il backup:

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

(Si noti che senza --waitsystemd-run non si blocca fino a quando il contenitore non viene arrestato.)


7

Consiglierei di usare il pratico @rebootalias nel cron di Ubuntu per l'esecuzione lxc-autostart.

Come utente proprietario del contenitore non privilegiato, eseguire crontab -ee aggiungere la seguente riga:

@reboot lxc-autostart


Sembra fantastico. Tuttavia, non sembra esserci un modo per eseguire un comando allo spegnimento (tramite cron). Qualche idea?
HRJ,

Non sono a conoscenza di alcun modo semplice per eseguire un lavoro allo spegnimento. Probabilmente dovresti, come root, aggiungere un processo di avvio per chiudere i contenitori per ogni utente che li possiede. Potresti cercare i /etc/init/lxc.confpuntatori. È il processo di avvio che avvia i contenitori privilegiati. Non dovrebbe essere troppo difficile copiarlo e modificarlo per chiudere anche i contenitori non privilegiati.
codificato il

1
Mi viene in mente che, poiché ogni processo nel contenitore è visibile dall'host, il contenitore probabilmente non ha bisogno di nulla di speciale per spegnerlo, ogni processo dovrebbe ricevere il segnale TERM dall'host. È probabile che non sia necessario fare nulla di speciale allo spegnimento. Se vuoi eseguire alcuni script o altre cose simili allo spegnimento, è diverso, ma la maggior parte dei processi dovrebbe avere la possibilità di spegnersi normalmente.
codificato il

L'approccio crontab funziona? Su Ubuntu 14.04, ricevo l'errore "chiamata a cgmanager_move_pid_sync non riuscita: richiesta non valida" che si verifica perché PAM, ovvero libpam-systemd non è coinvolto nel processo di modifica dell'utente. Puoi vedere /proc/self/cgroupche contiene sequenze come /user/0.user/1.sessioninvece di/user/1000.user/1.session
Daniel Alder,

3

Nel caso in cui qualcuno si imbattesse in questo Q&A per la risposta all'avvio automatico di contenitori LXC non privilegiati (certamente cerco di ricontrollare molto qui), ecco una soluzione che funziona bene e che ho seguito per farlo funzionare sul mio server:

http://blog.lifebloodnetworks.com/?p=2118 di Nicholas J Ingrassellino.

In poche parole, comporta la creazione di due script e collaborano all'avvio per consentire a LXC di avviare i contenitori non privilegiati di ciascun utente elencato senza dover effettivamente accedere all'account utente; in altre parole, eseguendo il comando come utente con tutta la magia dei CGroup intatta. In linea con le migliori pratiche SO, ne citerò le ossa qui, ma vale la pena leggere il suo articolo originale.

Consenti al nostro account utente di utilizzare il bridge ...

echo "$USER veth lxcbr0 1024" | sudo tee -a /etc/lxc/lxc-usernet

Crea script Upstart ... In /etc/init/lxc-unprivileged.confaggiungi ...

description "LXC Unprivileged Containers"
author "Mike Bernson <mike@mlb.org>"

start on started lxc

script
    USERS="[user]"

    for u in $USERS; do
        cgm create all lxc$u
        cgm chown all lxc$u $(id -u $u) $(id -g $u)
        lxc-autostart -L -P /home/$u/.local/share/lxc | while read line;
        do
            set -- $line
            /usr/local/bin/startunprivlxc lxc$u $u $1
            sleep $2
        done
    done
end script

Assicurati di sostituire [utente] con il tuo account utente.

Crea lo script di avvio del contenitore ... In /usr/local/bin/startunprivlxc aggiungi ...

#!/bin/sh

cgm movepid all $1 $$
sudo -iH -u $2 -- lxc-start -n $3 -d

... e renderlo eseguibile ...

sudo chmod +x /usr/local/bin/startunprivlxc

Vorrei solo sottolineare che sembra funzionare in modo sicuro, corretto e non richiede il root su SSH negli altri account utente.

C'è anche altro sull'argomento (toccando i gotcha correlati) qui: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f che può essere utile per capire perché è così.



0

SCUSA: rispose troppo presto. Non ha funzionato anche se lxc-ls mostra "AUTOSTART" come "SÌ".

Ecco un link con molte più informazioni utili e forse qualcuno può farne uso: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

Sono arrivato su questa pagina perché avevo lo stesso problema. Dopo aver letto questo thread, mi sono reso conto che lxc-create non può scrivere nella solita directory "/ var / lib / lxc /" se non viene eseguito con sudo.

Mi sono guardato intorno e ho individuato i rootfs per il mio contenitore senza privilegi in "~ / .local / share / lxc", e ho configurato le due righe nella domanda in quella directory.

Ho guardato il modello che ho usato, "lxc-download" per indizio, ma penso che il percorso è stato passato quando viene invocato "lxc-download". Non ho osservato come il sistema cerca contenitori non privilegiati durante l'avvio.


0

sto eseguendo ogni contenitore senza privilegi con un utente con lo stesso nome per un migliore isolamento ed è così che lo faccio:

#!/bin/bash

LXC_CONTAINERS="container1 container2"

for LXC_CONTAINER in $LXC_CONTAINERS; do
 su - $LXC_CONTAINER -c "lxc-start -n $LXC_CONTAINER --logfile /home/$LXC_CONTAINER/.local/share/lxc/lxc-$LXC_CONTAINER.log --logpriority DEBUG"
done

-1

Supponendo (che sono la madre di tutti i modi di rovinare le cose), stai accedendo come l'utente che "possiede" il contenitore lxc non privilegiato, quindi il seguente comando dovrebbe indirizzare ciò che stai cercando ...

$ echo "lxc-start -n LXC-CONTAINER-NAME -d" >> .bashrc

Questo eseguirà semplicemente il comando sopra quando accedi tramite bash. Questo presuppone anche che bash sia la shell di login. Sostituisci il nome: LXC-CONTAINER-NAMEcon il nome del tuo contenitore LXC che desideri avviare.


-1

Ho usato un approccio diverso e sta funzionando

1º Aggiungere le seguenti voci nel file di configurazione del contenitore

AUTO START CONFIG

lxc.start.auto = 1 lxc.start.delay = 5

2º Creare una relazione di fiducia tra l'utente del contenitore e se stesso sullo stesso server

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Generazione di coppie di chiavi rsa pubbliche / private. Inserisci il file in cui salvare la chiave (/home/userlxc/.ssh/id_rsa): inserisci la passphrase (vuota per nessuna passphrase): inserisci di nuovo la stessa passphrase: la tua identificazione è stata salvata in /home/userlxc/.ssh/id_rsa. La tua chiave pubblica è stata salvata in /home/userlxc/.ssh/id_rsa.pub. L'impronta digitale chiave è: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 L'immagine randomart della chiave è: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / authorized_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / authorized_keys -rw-rw-r-- 1 userlxc userlxc 404 nov 19 17:23 .ssh / authorized_keys

Controlla la connessione ssh, devi essere in grado di usarla senza password userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

NOME STATO IPV4 IPV6 AUTOSTART

EXTLXCCONT01 STOPPED - - SÌ
UBUSER1404USERCONT01-test STOPPED - - NO
UBUSER1404USERLXCCONT01 STOPPED - - NO

3º Creare una voce crontab presso il proprietario del contenitore

@reboot ssh userlxc @ localhost "lxc-autostart"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.