Somente leitura bind-mount?

9

Eu uso mount -o bind para montar diretórios dentro de chroots, o que funciona muito bem. O problema é que eu gostaria que alguns desses diretórios montados em bind fossem lidos apenas no chroot.

É possível? Se não - alguma outra maneira de conseguir isso?

Eu estava pensando em usar o NFS para montagens localhost, mas parece um exagero.


fonte

Respostas:

6

De acordo com este artigo , é possível. Você precisa de um kernel recente.

mount --bind -o ro /vital_data /untrusted_container/vital_data
Zoredache
fonte
16

Resposta direta do artigo do LWN :

mount --bind /vital_writable_data /untrusted_container/vital_data
mount -o bind,remount,ro /untrusted_container/vital_data

Suportado desde o Linux 2.6.26.

azulado
fonte
4

No Squeeze, costumava trabalhar apenas com:

mount --bind /src /dst

então

mount -o remount,ro /dst

Agora no Debian Wheezy você tem que fazer:

mount -o remount,ro,bind /dst

para se livrar da mensagem: resource busy.

Edit: Agora no Debian Jessie, o mount tenta ser inteligente e monta sub-diretórios, que se já montados com bind, ficam recursivos e acontecem coisas ruins :)

Há uma opção especial que força o util-linux a ser 'estúpido' novamente. Soluções é esta:

mount --bind --make-rprivate /sbin/ $prefix/sbin/
mount -o remount,ro,bind $prefix/sbin/

Depois você pode montar --bind $ prefix / sbin em outro diretório.

Na página do manual:

As operações de subárvore compartilhada. Desde o Linux 2.6.15, é possível marcar uma montagem e seus subconjuntos como compartilhados, privados, escravos ou desatáveis. Uma montagem compartilhada fornece a capacidade de criar espelhos dessa montagem, de forma que as montagens e desmontagens em qualquer um dos espelhos se propagem para o outro espelho. Uma montagem escrava recebe propagação de seu mestre, mas não vice-versa. Uma montagem privada não possui capacidade de propagação. Uma montagem desmontável é uma montagem privada que não pode ser clonada por meio de uma operação de ligação. A semântica detalhada está documentada no arquivo Documentation / filesystems / sharedsubtree.txt na árvore de origem do kernel. As operações suportadas são:

     mount --make-shared mountpoint
     mount --make-slave mountpoint
     mount --make-private mountpoint
     mount --make-unbindable mountpoint

Os comandos a seguir permitem alterar recursivamente o tipo de todas as montagens em um determinado ponto de montagem.

     mount --make-rshared mountpoint
     mount --make-rslave mountpoint
     mount --make-rprivate mountpoint
     mount --make-runbindable mountpoint

O mount (8) não lê o fstab (5) quando uma operação --make- * é solicitada. Todas as informações necessárias devem ser especificadas na linha de comando. Observe que o kernel do Linux não permite alterar vários sinalizadores de propagação com um único syscall de montagem (2) e os sinalizadores não podem ser misturados com outras opções de montagem.

Desde o util-linux 2.23, o comando mount permite usar vários sinalizadores de propagação juntos e também junto com outras operações de montagem. Esse recurso é EXPERIMENTAL. Os sinalizadores de propagação são aplicados por syscalls adicionais da montagem (2) quando as operações de montagem anteriores foram bem-sucedidas. Observe que este caso de uso não é atômico. É possível especificar os sinalizadores de propagação no fstab (5) como opções de montagem (privada, escrava, compartilhada, não-ligável, privada, rslave, rshared, executável).

Anton Valqk
fonte
2

mount --bind / vital_data / untrusted_container / vital_data

mount -o remount, ro, bind / untrusted_container / vital_data

na segunda montagem, você precisa usar "remount, ro, bind"; caso contrário, todas as outras instâncias de / vital_data também terão somente leitura.

rexo
fonte
Não, você não (pelo menos não no Linux 3.19). Onde você sentiu a necessidade de adicionar a bindopção?
Karl Richter
1
@KarlRichter - Eu não testei, mas man 2 mountindica que bindé necessário: "Desde o Linux 2.6.26, o MS_REMOUNTsinalizador pode ser usado MS_BINDpara modificar apenas os sinalizadores por ponto de montagem. Isso é particularmente útil para definir ou limpar a" leitura -only "flag em um ponto de montagem sem alterar o sistema de arquivos subjacente. A especificação de mountflags como: MS_REMOUNT | MS_BIND | MS_RDONLYtornará o acesso por esse ponto de montagem somente leitura, sem afetar outros pontos de montagem." (Do Ubuntu 19.10, Linux man-pagesrelease 5.0.2, de 02/08/2019)
mpb
1
@KarlRichter - Atualização: de acordo com unix.stackexchange.com/a/128388 , as versões mais recentes da função libmountchamam a mount()função duas vezes durante uma única chamada do /usr/bin/mountprograma. Portanto, é a versão libmount, e não a versão do kernel, que determinará se /usr/bin/mountsão necessárias ou não duas invocações .
mpb