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
).