Como posso dizer que estou executando em um chroot?

43

Eu tenho uma instalação unix que deve ser usada tanto como um sistema chroot quanto como um sistema independente. Se ele estiver sendo executado como um chroot, não quero executar nenhum serviço (cron, inetd e assim por diante), porque eles iriam entrar em conflito com o sistema host ou seriam redundantes.

Como eu escrevo um script de shell que se comporta de maneira diferente dependendo se ele está sendo executado em um chroot? Minha necessidade imediata é um sistema Linux moderno, com /proc montado no chroot, e o script está sendo executado como root, mas respostas mais portáteis são bem-vindas também. (Veja Como posso saber se estou executando em um chroot se / proc não estiver montado? para o caso do Linux sem /proc .)

Em geral, sugestões que funcionem para outros métodos de contenção seriam interessantes. A questão prática é: esse sistema deveria estar executando algum serviço? (A resposta é não em um chroot e sim em máquinas virtuais completas; não sei sobre casos intermediários como cadeias ou contêineres.)

    
por Gilles 03.06.2011 / 18:55

3 respostas

40

O que eu fiz aqui é testar se a raiz do processo init (PID 1) é a mesma que a raiz do processo atual. Embora /proc/1/root seja sempre um link para / (a menos que init seja o chrooted, mas esse não é o caso de que eu me importo), seguir leva ao diretório-raiz "mestre". Esta técnica é usada em alguns scripts de manutenção no Debian, por exemplo, para pular o início do udev após a instalação em um chroot.

if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  echo "We are chrooted!"
else
  echo "Business as usual"
fi

(A propósito, este é mais um exemplo do porque chroot é inútil para segurança se o processo chroot tiver acesso root. Processos não-raiz não podem ler /proc/1/root , mas eles podem seguir /proc/1234/root se existe um processo em execução com o PID 1234 sendo executado como o mesmo usuário.)

Se você não tem permissões de root, você pode olhar para /proc/1/mountinfo e /proc/$$/mountinfo (brevemente documentado em filesystems/proc.txt na documentação do kernel do Linux ). Esse arquivo é legível por todo o mundo e contém muitas informações sobre cada ponto de montagem na visualização do processo do sistema de arquivos. Os caminhos nesse arquivo são restritos pelo chroot que afeta o processo do leitor, se houver. Se a leitura do processo /proc/1/mountinfo for chrooted em um sistema de arquivos diferente da raiz global (supondo que a raiz do pid 1 seja a raiz global), nenhuma entrada para / aparecerá em /proc/1/mountinfo . Se a leitura do processo /proc/1/mountinfo for chrooted para um diretório no sistema de arquivos raiz global, uma entrada para / aparecerá em /proc/1/mountinfo , mas com um ID de montagem diferente. Aliás, o campo raiz ( $4 ) indica onde o chroot está em seu sistema de arquivos mestre.

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]

Esta é uma solução pura do Linux. Pode ser generalizável para outras variantes do Unix com um /proc suficientemente similar (o Solaris tem um /proc/1/root semelhante, eu acho, mas não mountinfo ).

    
por 03.06.2011 / 18:55
20

Como mencionado em Maneira portátil de encontrar o número de inode e < um href="https://stackoverflow.com/questions/75182/detecting-a-chroot-jail-from-within"> Detectando uma cadeia chroot de dentro , você pode verificar se o número de inode de / é 2 :

$ ls -di /
2 /

Um número de inode diferente de 2 indica que a raiz aparente não é a raiz real de um sistema de arquivos. Isso não detectará chroots que estejam enraizados em um ponto de montagem ou em sistemas operacionais com números de inode root aleatórios .

    
por 09.11.2011 / 09:24
3

Embora claramente não seja tão portátil quanto muitas outras opções listadas aqui, se você estiver em um sistema baseado no Debian, tente ischroot .

Veja: link

    
por 10.01.2018 / 16:18

Tags