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 1insieme ad alcune delle caratteristiche speciali del initprocesso. 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 initprocesso 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 pscomando nel nuovo spazio dei nomi, è necessario montare un procfsfilesystem separato per lo spazio dei nomi. Questo a sua volta porta a un altro problema poiché l'unica posizione che psaccetta procfsè /proc. Una soluzione sarebbe quella di creare una chrootprigione e montare procfslì 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 procfsin un modo che utilizza la vera /procdirectory root , può essere utilizzabile nello spazio dei nomi PID e non interferisce con nient'altro. Per rendere questo processo molto semplice, il unsharecomando offre l' --mount-procopzione:
sudo unshare -fp --mount-proc some_command
Ora l'esecuzione psall'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, nsenterpuò 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 nsenterviene 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, psora elencherà solo i processi all'interno di quello spazio dei nomi.