Crie um espaço para nome PID
O comando correto para usar aqui é unshare
. Observe que as opções necessárias para fazer isso estão disponíveis apenas em util-linux 2.23
. A idéia é criar um novo espaço para nome do PID para o programa que você está executando, de modo que todos os seus filhos também sejam criados nesse espaço para nome. Você pode executar um comando em um novo espaço de nome do PID simplesmente fazendo:
sudo unshare -fp some_command
Para executar um shell, apenas omita o comando. Isso criará um processo que, juntamente com qualquer um de seus filhos, terá um PID normalmente no espaço de nomes pai (sistema). No entanto, dentro do novo espaço para nome, ele terá um PID 1
junto com algumas das características especiais do init
processo. Talvez a característica mais relevante do ponto de vista do monitoramento seja que, se algum de seus descendentes ficar órfão, eles serão reinseridos nesse processo e não no init
processo real .
Simplesmente fazer isso pode ser suficiente para a maioria dos casos de monitoramento. Como mencionado anteriormente, todos os processos no namespace possuem PIDs no namespace pai, portanto, comandos regulares podem ser usados para monitorar suas atividades. Também temos certeza de que, se algum processo no espaço para nome ficar órfão, ele não cairá dos galhos da árvore de processos abaixo do PID do programa de nível superior, o que significa que ele ainda pode ser facilmente rastreado.
Combinar com um espaço para nome de montagem
No entanto, o que não podemos fazer é monitorar o processo em relação ao PID que ele pensa que tem. Para fazer isso, e em particular para poder usar o ps
comando dentro do novo espaço para nome, você precisa montar um procfs
sistema de arquivos separado para o espaço para nome. Por sua vez, isso leva a outro problema, já que o único local que ps
aceita procfs
é /proc
. Uma solução seria criar uma chroot
prisão e montar o novo procfs
lá. Mas essa é uma abordagem complicada, pois, no mínimo, precisaríamos copiar (ou pelo menos vincular) quaisquer binários que pretendamos usar junto com as bibliotecas das quais dependem para a nova raiz.
A solução é também usar um novo espaço para nome de montagem . Dentro disso, podemos montar o novo procfs
de uma maneira que use o /proc
diretório raiz verdadeiro , possa ser usado no espaço de nome PID e não interfira em mais nada. Para tornar esse processo muito simples, o unshare
comando oferece a --mount-proc
opção:
sudo unshare -fp --mount-proc some_command
Agora, a execução ps
nos namespaces combinados mostrará apenas os processos com o namespace do PID e mostrará o processo de nível superior como tendo um PID de 1
.
Que tal nsenter
?
Como o nome sugere, nsenter
pode ser usado para inserir um espaço para nome que já foi criado unshare
. Isso é útil se quisermos obter informações disponíveis apenas dentro do namespace a partir de um script não relacionado. A maneira mais simples é acessar o PID de qualquer programa em execução no espaço para nome. Para ficar claro, esse deve ser o PID do programa de destino no espaço para nome do qual nsenter
está sendo executado (como os espaços para nome podem ser aninhados, é possível que um único processo tenha muitos PIDs). Para executar um shell no espaço de nomes PID / mount de destino, basta:
sudo nsenter -t $PID -m -p
Se esse espaço para nome estiver configurado como acima, ps
agora listará apenas processos dentro desse espaço para nome.