it-swarm-pt.com

Acesso ao conteúdo original do ponto de montagem

No meu decapitado NAS eu tenho sdf1 (um cartão de memória flash) montado como / enquanto /home é montado a partir de lv00 (um volume LVM suportado por um RAID de software). Para poder acessar a máquina quando o RAID falhar, eu tenho uma cópia da minha chave pública ssh etc. em /home/foo/.ssh no sistema de arquivos de sdf1.
Para atualizar os arquivos ocultos pelos arquivos montados /home Eu normalmente remonte lv00 no /mnt/home, faça o que eu tenho que fazer e depois mova lv00 de volta no lugar.
Existe uma maneira de conseguir isso sem desmontar /home?

35
Janus
mkdir /mnt/root
mount --bind / /mnt/root
ls /mnt/root/home/foo/.ssh

Contanto que você use --bind (ao contrário de --rbind), você obtém um clone da montagem sem o material montado em cima dela.

49
ephemient

Eu tentei conseguir algo semelhante, mas a resposta de ephemient não explicou a semântica do método. Falhou para mim e, por isso, fiz praticamente a mesma pergunta aqui no unix.SE. Depois de um comentário, descobri por conta própria e atendi. Esta é uma versão editada da minha resposta para caber neste contexto aqui. Eu removi minha outra pergunta (e resposta) em favor desta.

Aqui está o que eu estava tentando fazer:

Exemplo de caso

Suportes:

/dev/sda1  on /     type ext4 (rw)
/dev/sdb1  on /data type ext4 (rw)
/data/home on /home type none (rw,bind)

Após a montagem / Eu tenho uma pasta /home/joe para o usuário joe. Depois que o outro local for montado (/data) Eu tenho o conjunto completo de pastas pessoais disponíveis, então estou montando-as no lugar (/data/home on /home). Há uma pasta /data/home/joe, desde que a montagem de /dev/sdb1 for bem-sucedido, ele obterá o conteúdo de /data/home/joe, caso contrário, ele voltará a /home/joe (em /dev/sda1!).

Quando for bem-sucedido, como posso acessar o conteúdo original de /home/joe (em /dev/sda1!) em vez daqueles montados em ligação no lugar de /data/home/joe?

Solução

Com base no comentário do comentário de Patrick na minha pergunta e na solução por ephemient (resposta aceita aqui), vim com o seguinte.

é aparentemente possível mount --bind (ou mount -o bind) a pasta pai ( esta é a parte crucial) de uma montagem de ligação em outro local e, portanto, acesse o conteúdo original. Portanto, no meu exemplo de caso, em vez de tentar:

mount --bind /home/joe /home/joe/underneath
# or ...
mount --bind /home /home/joe/underneath

(ou seja, montar os locais já montados em ligação em outro lugar), tive que:

test -d /.ROOT || mkdir /.ROOT
mount --bind / /.ROOT
mount --bind /.ROOT/home/joe /home/joe/underneath

Então é isso que Patrick quis dizer em seu comentário

A menos que você esteja remontando por mais / (root), essa resposta deve funcionar muito bem.

Contanto que você tenha uma pasta pai disponível no local montado na ligação, ela funcionará, embora com um indireto, como mostrado acima. Se você montou algo sobre / você está sem sorte, pois não há pasta pai para /.

5
0xC0000022L

Você pode mover o suporte para um novo local sem desmontá-lo, usando mount --move:

$ mount --move /home /mnt/home
do stuff with the local /home
$ mount --move /mnt/home /home
1
Michael Mrozek