vincular montagem somente leitura usando o fstab no Ubuntu?

8

Preciso remontar um diretório (/ src) como somente leitura em outro local (/ dst). Isso pode ser feito assim:

$ sudo mount --bind /src /dst
$ sudo mount -o remount,ro /dst

No entanto, eu gostaria de usar /etc/fstabpara que a montagem ocorra no momento da inicialização e tenha visto diferentes soluções sugeridas para esse problema, por exemplo,

/src  /dst    none  bind            0 0
/src  /dst    none  remount,bind,ro 0 0

que infelizmente deixa o diretório montado de leitura / gravação no meu sistema e isso

/src  /dst    none  bind            0 0
/dst  /dst    none  remount,bind,ro 0 0

que emitirá um erro ao tentar montar /dst:

mount: /dst not mounted already, or bad option

As soluções acima supostamente funcionam em diferentes distros, mas infelizmente não no Ubuntu 10.04.4 LTS (kernel 2.6.32-41-server).

Alguma idéia de como fazer isso além de colocar os mountcomandos /etc/rc.local?

mgd
fonte

Respostas:

6

Em kernels antigos, mount --bindnão é possível criar uma exibição somente leitura de um sistema de arquivos de leitura / gravação. O kernel armazena o status de leitura e gravação do sistema de arquivos em um único local que não é duplicado pela montagem de ligação. Os kernels mais recentes permitem isso, mas ainda exigem uma mountetapa separada : primeiro vincule e depois faça somente leitura. Existe um patch do kernel para mudar isso, e algumas distribuições (como o Debian) o aplicaram, mas o Ubuntu não (pelo menos não a partir do 12.04).

Uma solução é criar a exibição somente leitura a partir de um script de inicialização /etc/fstab, como explica Oli .

Caso contrário, você pode usar bindfs . Este é um sistema de arquivos FUSE . Passar pelo FUSE é um pouco mais lento, pois introduz uma camada adicional de indireção. Você também perde o suporte para metadados de arquivo estendidos, como ACLs. Por outro lado, a exibição somente leitura terá um tipo de sistema de arquivos reconhecível, facilitando a exclusão dos percursos do sistema de arquivos (como locatebackups).

A fstabentrada fica assim:

bindfs#/src  /dst  fuse perms=a=rX
Gilles 'SO- parar de ser mau'
fonte
6

De acordo com este artigo do LWN , esse comportamento entrou no Kernel na versão 2.6.25. Em resumo, se o sistema de arquivos de destino é rw, vincular algo no topo não pode convertê-lo em ro.

Na 2.6.26, eles consertaram parcialmente as coisas para que você possa acionar uma remontagem (como você descobriu), mas ainda não há como fazer isso no fstab.


Aqui está o que eu estava tentando no fstab:

/home/oli/Desktop/testmount  /mnt none bind,ro

Depois de disparar um mount -a, /mntfoi montado, mas eu ainda podia criar arquivos. Depois de disparar sudo mount -o remount /mnt, tornou-se somente leitura.

Então, sim, acho que o método mais limpo é incluir uma linha /etc/rc.localou escrever um script Upstart super simples que começa no mountallevento (isso acontece imediatamente).

Oli
fonte
Também li que mount --bindnão é possível alterar as mountopções (também diz isso na página de manual mount). O estranho é que as soluções que listei aparentemente (de acordo com outras fontes) funcionam, por exemplo, no Fedora (a 1ª solução). Obrigado, pela idéia de usar upstart. (BTW eu acho que o segundo "rw" em sua primeira linha deve ter sido um "ro".)
MGD