PID no arch-chroot está incorreto

5

Estou tentando executar um script python em chroot (especificamente, o chroot é criado com arch-chroot ). O script python depende de os.getpid() , mas isso parece estar retornando um PID incorreto dentro do chroot . Se em python eu faço

import os
os.getpid()

Eu recebo um PID que não está listado em /proc/ no chroot ou na raiz real. Além disso, o que eu acho que é o PID correto está listado em /proc/ no chroot ou na raiz real.

O problema não é específico do Python. Se eu executar o script Bash a seguir no chroot

echo $$
ps -a
ls /proc

O PID não está listado por ps ou em /proc .

O que estou fazendo de errado? Existe uma maneira de obter o PID correto?

    
por StrongBad 14.10.2015 / 00:24

1 resposta

3

arch-chroot faz mais do que criar um chroot: também cria um namespace PID .

unshare --fork --pid chroot "$chrootdir" "$@"

Como o nome sugere, um namespace PID possui seu próprio conjunto de IDs de processo, distinto do resto do sistema. Isso significa que os processos dentro do namespace não podem ver os processos fora do namespace (e, em particular, não podem matá-los ou rastreá-los) e os processos fora do namespace - vê-los com diferentes PIDs.

Para mais informações sobre namespaces, leia meu resumo aqui e a série LWN de Michael Kerrisk , especialmente Parte 3: PID namespaces e Parte 4: mais sobre namespaces de PID , bem como artigo anterior de Pavel Emelyanov e Kir Kolyshkin . como descobrir o namespace de um processo específico? e Maneira confiável de prender processos filhos usando 'nsenter:' também pode ser de interesse.

Se você quiser fazer coisas para um processo em execução em um namespace de fora, você pode usar o nsenter utility ; consulte Existe um comando para alternar para em um namespace existente? . Você também pode usar o nsenter pacote Python . Ou você pode organizar essas operações de dentro do namespace (isso pode ou não ser uma boa solução, dependendo da arquitetura e dos requisitos de segurança); é mais fácil acessar algo em um chroot do lado de fora (apenas prefixar o caminho do diretório correto) do que em um namespace do PID.

Observe que os namespaces e chroots do PID são independentes. Se você chroot para o mesmo diretório de forma independente, isso não permite que você alcance o mesmo namespace PID. Se você executar arch-chroot duas vezes no mesmo diretório, acabará trabalhando no mesmo diretório, mas em dois namespaces PID diferentes.

¹ Mais precisamente, em um namespace de ancestral. (Espaços de nomes têm uma estrutura de árvore onde as crianças são confinadas dentro do pai.)

    
por 15.10.2015 / 10:44