No meu sistema Arch Linux (Linux Kernel 3.14.2), as montagens de ligação não respeitam a opção somente leitura
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
cria o arquivo /mnt/foo
. A entrada relevante em /proc/mounts
é
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
As opções de montagem não correspondem às minhas opções solicitadas, mas correspondem ao comportamento de leitura / gravação da montagem de ligação e às opções usadas para montar originalmente /dev/sda2
no/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Se, no entanto, eu remontar a montagem, ela respeitará a opção somente leitura
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
e a entrada relevante em /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
parece com o que eu poderia esperar (embora, na verdade, eu esperasse ver o caminho completo do test
diretório). A entrada /proc/mounts/
para a montagem original de /dev/sda2/
on /
também não é alterada e permanece de leitura / gravação
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Esse comportamento e a solução alternativa são conhecidos desde pelo menos 2008 e estão documentados na página de manual domount
Observe que as opções de montagem do sistema de arquivos permanecerão as mesmas do ponto de montagem original e não poderão ser alteradas passando a opção -o junto com --bind / - rbind. As opções de montagem podem ser alteradas por um comando de remontagem separado
Nem todas as distribuições se comportam da mesma forma. O Arch parece silenciosamente falhar em respeitar as opções, enquanto o Debian gera um aviso quando o mount bind não obtém o mount somente leitura
mount: warning: /mnt seems to be mounted read-write.
Há relatos de que esse comportamento foi "corrigido" no Debian Lenny e Squeeze, embora não pareça ser uma correção universal nem ainda funcione no Debian Wheezy. Qual é a dificuldade associada ao fazer com que a montagem de ligação respeite a opção somente leitura na montagem inicial?
fonte
mount -t bind
um script auxiliar em bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380/etc/mtab
. Após a montagem inicial, a entrada diz que a montagem é rw e após a remontagem diz ro, portanto está relatando o estado da montagem corretamente. É apenas o comando mount que falha.mount --bind -o ro
, ambas emitem uma mensagemmount: warning: «mountpoint» seems to be mounted read-write.
. Parece que o Debian caiu ou perdeu o patch em algum momento ... funciona, no entanto.Respostas:
Montagem de ligação é apenas ... bem ... uma montagem de ligação. Ou seja, não é uma nova montaria. Ele apenas "vincula" / "expõe" / "considera" um subdiretório como um novo ponto de montagem. Como tal, não pode alterar os parâmetros de montagem. É por isso que você está recebendo reclamações:
Mas, como você disse, uma montagem de ligação normal funciona:
E então um ro remount também funciona:
No entanto, o que acontece é que você está alterando a montagem inteira e não apenas essa montagem de ligação. Se você der uma olhada em / proc / mounts, verá que a montagem de ligação e a montagem original mudam para somente leitura:
Então, o que você está fazendo é como alterar a montagem inicial para uma montagem somente leitura e, em seguida, fazer uma montagem de ligação que, obviamente, será somente leitura.
ATUALIZAÇÃO 20-07-2016:
O seguinte é verdadeiro para os kernels 4.5, mas não para os kernels 4.3 (isso está errado. Consulte a atualização nº 2 abaixo):
O kernel possui dois sinalizadores que controlam somente leitura:
MS_READONLY
: Indicando se a montagem é somente leituraMNT_READONLY
: indicando se o "usuário" deseja que ele seja somente leituraEm um kernel 4.5, fazer um
mount -o bind,ro
realmente fará o truque. Por exemplo, isto:criará uma montagem de ligação somente leitura de
/tmp/test/a/d
para/tmp/test/b
, que será visível/proc/mounts
como:Uma visão mais detalhada é visível
/proc/self/mountinfo
, o que leva em consideração a visão do usuário (namespace). As linhas relevantes serão estas:Onde na segunda linha, você pode ver que diz ambos
ro
(MNT_READONLY
) erw
(!MS_READONLY
).O resultado final é este:
ATUALIZAÇÃO 20-07-2016 # 2:
Um pouco mais detalhadamente mostra que o comportamento de fato depende da versão do libmount, que faz parte do util-linux. O suporte para isso foi adicionado com este commit e foi lançado com a versão 2.27:
que também fornece a solução alternativa. O comportamento pode ser visto usando strace em uma montagem mais antiga e mais recente:
Velho:
Novo:
Conclusão:
Para alcançar o resultado desejado, é necessário executar dois comandos (como o @Thomas já disse):
As versões mais recentes do mount (util-linux> = 2.27) fazem isso automaticamente quando se executa
fonte
mount -o bind,ro
criava uma visão somente leitura de um sistema de arquivos de leitura e gravação (mas ele não parece mais estar presente no chiado).mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/
... entãotouch /tmp/a
está tudo bem, mastouch /mnt/tmp/b
dátouch: cannot touch ‘/mnt/tmp/b’: Read-only file system
. Isso funciona tanto no Debian 3.13 quanto no kernel.org 3.14.2. Portanto, não muda apenas a montagem inteira. Pelo menos não com kernels recentes.A solução adequada é realmente montá-lo duas vezes. Na linha de comando:
Em
/etc/fstab
:O manual (
man mount
) afirma assim:fonte
Você está perguntando da perspectiva da
mount(8)
linha de comando (aceitável neste site). Esse comando foi discutido nas outras respostas e, em alguns casos, abstrai a segundamount(2)
chamada de sistema necessária .Mas por que a segunda chamada do sistema é necessária? Por que uma única
mount(2)
chamada não pode criar a montagem de ligação somente leitura?A
mount(2)
página de manual explica que existem, como outros já apontaram, dois conjuntos de sinalizadores sendo configurados:Diz:
E em relação a
MS_REMOUNT
:Acho que o problema surgiu quando as montagens de ligação foram introduzidas pela primeira vez:
Parece que, em vez de usar
MS_BIND | MS_REMOUNT
como sinal para definir apenas os sinalizadores VFS, eles poderiam ter escolhido exceto (e aceitar)MS_RDONLY
junto com o inicialMS_BIND
e aplicá-lo ao ponto de montagem.Portanto, devido à semântica um tanto estranha da
mount(2)
chamada do sistema:fonte