Você não precisa de bibliotecas do sistema ou binários dentro de um chroot
para que um aplicativo seja executado.
Por exemplo:
$ ls chroot_test
hello*
$ sudo chroot chroot_test /hello
Hello, World
Por que isso funciona? Porque o programa hello
está vinculado estaticamente e não tem dependências:
$ file chroot_test/hello
chroot_test/hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
Basicamente, não importa qual seja a tecnologia, os arquivos que precisam entrarem na "sandbox" são o mínimo necessário para executar o aplicativo. Portanto, um programa vinculado dinamicamente pode precisar de libc.so
e ld.so
e assim por diante.
Um ambiente simples de bash
pode precisar de mais alguns arquivos:
$ find chroot-bash -type f
chroot-bash/lib64/libdl.so.2
chroot-bash/lib64/ld-linux-x86-64.so.2
chroot-bash/lib64/libc.so.6
chroot-bash/lib64/libtinfo.so.5
chroot-bash/bin/bash
Não podemos fazer muito (por exemplo, não há ls
command, mas é um bash
shell em execução.
$ sudo chroot chroot-bash /bin/bash
bash-4.2# pwd
/
bash-4.2# ls
bash: ls: command not found
bash-4.2# echo *
bin lib64
Note que estes arquivos são cópias dos originais; eles não são os originais (bem, você poderia ligar-los). O sistema operacional não está exposto.
Você precisaria ter o mesmo conjunto de arquivos neles, se você usa chroot
ou docker
ou lxc
...
Um exemplo de um pequeno contêiner docker
Agora observe que isso é também verdadeiro para o próprio sistema operacional. Quando você yum install
or apt-get install
a package pode trazer algumas dependências, incluindo bibliotecas! Seu sistema operacional não tem tudo! Ele só tem um conjunto maior de coisas padrão para facilitar o uso das pessoas.