Como conseguir o efeito de chroot no userspace no Linux (sem ser root)?

5

O objetivo é instalar e executar programas em uma distribuição deslocada (realocada) (cuja / não deve coincidir com a global /) dentro de um sistema Linux host. Os programas não são adaptados para usar um diferente /.

fakechroot não é uma solução completa porque emprega substituição de biblioteca em vez de atuar no nível de chamadas do sistema (portanto, não é bom para binários estaticamente vinculados).

    
por imz -- Ivan Zakharyaschev 17.04.2013 / 05:00

2 respostas

9

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
    
por 17.04.2013 / 05:11
1

Você pode tentar o User-Mode Linux . O código para construir tal kernel agora está presente nas fontes principais, e você pode encontrar compilações pré-compiladas (desatualizadas) na página que eu vinculei.

    
por 17.08.2018 / 00:30