A solução provavelmente deve ser baseada nos espaços de nomes ptrace ou (sem compartilhamento) .
As soluções baseadas em ptrace são provavelmente menos eficientes do que namespaces / unshare-based (mas a última tecnologia é de ponta e não é bem explorada, provavelmente).
baseado em ptrace
UMView
Quanto a soluções baseadas em ptrced, graças aos comentários no link , descobri o UMView:
Os documentos relacionados descrevem como ter uma "visão copy-on-write" do host fs - isso não é exatamente como executar um chroot. Entradas exatas sobre como conseguir / -substituição em umview seria bom ter em uma resposta para a minha pergunta (por favor, escreva um, se você descobrir como fazer isso!).
Umview deve ser open-source, porque está incluído no Ubuntu e no Debian - link .
"Confinando programas"
Outra implementação é descrita no link , link .
Eles possuem uma regra de política de mudança de raiz, CHRDIR, cujo efeito é semelhante ao chroot. (Seção "A política de prisão")
No entanto, eles podem não ter publicado seu código-fonte (parcialmente com base em um link da seção modificada - Seção "Implementação") ...
geordi
Geordi ( link , link ) provavelmente poderia ser modificado para fazer o desejado reescrevendo os argumentos do arquivo para chamadas do sistema nos programas presos.
proot
O PRoot é uma ferramenta pronta para usar o ptrace para isso. link :
chroot equivalent
To execute a command inside a given Linux distribution, just give proot the path to the guest rootfs followed by the desired command. The example below executes the program cat to print the content of a file:
proot -r /mnt/slackware-8.0/ cat /etc/motd Welcome to Slackware Linux 8.0
The default command is /bin/sh when none is specified. Thus the shortest way to confine an interactive shell and all its sub-programs is:
proot -r /mnt/slackware-8.0/ $ cat /etc/motd Welcome to Slackware Linux 8.0
baseado em não compartilhamento
o suporte a user_namespaces no kernel do Linux ficou mais maduro desde quando a pergunta foi feita. Agora você pode jogar com a execução de chroot
como normal com a ajuda de unshare
, como em Simular chroot com não compartilhamento :
unshare --user --map-root-user --mount-proc --pid --fork
chroot ......
su - user1