Creare uno spazio dei nomi PID
Il comando corretto da usare qui è unshare
. Si noti che le opzioni necessarie per farlo sono disponibili solo da util-linux 2.23
. L'idea è quella di creare un nuovo spazio dei nomi PID per il programma in esecuzione in modo tale che anche tutti i suoi figli vengano creati in questo spazio dei nomi. È possibile eseguire un comando in un nuovo spazio dei nomi PID semplicemente facendo:
sudo unshare -fp some_command
Per eseguire una shell, basta omettere il comando. Ciò creerà un processo che, insieme a uno qualsiasi dei suoi figli, avrà un PID come al solito all'interno dello spazio dei nomi padre (sistema). Tuttavia, all'interno del nuovo spazio dei nomi, avrà un PID 1
insieme ad alcune delle caratteristiche speciali del init
processo. Forse la caratteristica più rilevante dal punto di vista del monitoraggio è che se uno qualsiasi dei suoi discendenti è orfano, verranno ricondizionati a questo processo piuttosto che al init
processo reale .
Fare semplicemente questo potrebbe essere sufficiente per la maggior parte dei casi di monitoraggio. Come accennato in precedenza, i processi all'interno dello spazio dei nomi hanno tutti PID all'interno dello spazio dei nomi padre, quindi è possibile utilizzare comandi regolari per monitorare la loro attività. Siamo inoltre certi che se qualsiasi processo nello spazio dei nomi diventa orfano, non cadrà dai rami dell'albero dei processi sotto il PID del programma di livello superiore, il che significa che può ancora essere facilmente monitorato.
Combina con uno spazio dei nomi di mount
Tuttavia, ciò che non possiamo fare è monitorare il processo rispetto al PID che ritiene abbia. Per fare ciò, e in particolare per poter usare il ps
comando nel nuovo spazio dei nomi, è necessario montare un procfs
filesystem separato per lo spazio dei nomi. Questo a sua volta porta a un altro problema poiché l'unica posizione che ps
accetta procfs
è /proc
. Una soluzione sarebbe quella di creare una chroot
prigione e montare procfs
lì il nuovo . Ma questo è un approccio ingombrante in quanto come minimo dovremmo copiare (o almeno hard link) tutti i binari che intendiamo usare insieme a tutte le librerie da cui dipendono dalla nuova radice.
La soluzione è utilizzare anche un nuovo spazio dei nomi di mount . All'interno di questo possiamo montare il nuovo procfs
in un modo che utilizza la vera /proc
directory root , può essere utilizzabile nello spazio dei nomi PID e non interferisce con nient'altro. Per rendere questo processo molto semplice, il unshare
comando offre l' --mount-proc
opzione:
sudo unshare -fp --mount-proc some_command
Ora l'esecuzione ps
all'interno degli spazi dei nomi combinati mostrerà solo i processi con lo spazio nams PID e mostrerà il processo di livello superiore come avere un PID di 1
.
Che dire nsenter
?
Come suggerisce il nome, nsenter
può essere utilizzato per inserire uno spazio dei nomi con cui è già stato creato unshare
. Ciò è utile se vogliamo ottenere informazioni disponibili solo all'interno dello spazio dei nomi da uno script altrimenti non correlato. Il modo più semplice è accedere a dare il PID di qualsiasi programma in esecuzione all'interno dello spazio dei nomi. Per essere chiari, questo deve essere il PID del programma di destinazione all'interno dello spazio dei nomi da cui nsenter
viene eseguito (poiché gli spazi dei nomi possono essere nidificati, è possibile che un singolo processo abbia molti PID). Per eseguire una shell nello spazio dei nomi PID / mount di destinazione, è sufficiente:
sudo nsenter -t $PID -m -p
Se questo spazio dei nomi è impostato come sopra, ps
ora elencherà solo i processi all'interno di quello spazio dei nomi.