Acesso ao conteúdo original do ponto de montagem

32

No meu NAS sem cabeça, eu tenho sdf1(um cartão flash) montado /enquanto /homeestá montado 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. no /home/foo/.sshsistema de arquivos de sdf1.
Para atualizar os arquivos que estão escondidos pela montado /homeI normalmente remount lv00em /mnt/home, fazer o que tenho que fazer, e depois passar lv00de volta no lugar.
Existe uma maneira de conseguir isso sem desmontar /home?

Janus
fonte

Respostas:

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

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

efémero
fonte
Perfeito! Eu estava brincando com a idéia de mount --bind, mas só tinha algumas idéias complicadas que certamente quebrariam quando eu precisasse. Isso faz exatamente o que eu preciso e pode até entrar como uma montagem permanente. Graças
Janus
Vale a pena editar esta resposta para incluir o fato de que você precisa montar um nível acima do diretório que você cobriu com uma montagem, como é coberto na outra resposta? Caso contrário, esta resposta é melhor, porque é mais curta e, portanto, mais fácil de ler rapidamente!
Michael Firth
5

Tentei alcançar algo semelhante, mas a resposta efêmera não explicou a semântica do método. Ele falhou para mim e, portanto, fiz praticamente a mesma pergunta anteriormente 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 /, tenho uma pasta /home/joepara o usuário joe. Depois que o outro local é montado ( /data), tenho o conjunto completo de pastas pessoais disponíveis e, portanto, estou montando-as no lugar ( /data/home on /home). Há uma pasta /data/home/joe, desde que a montagem seja /dev/sdb1bem-sucedida, ele receberá o conteúdo /data/home/joe, caso contrário, voltará a /home/joe(ligado /dev/sda1!).

Quando é bem-sucedido, como posso acessar o conteúdo original de /home/joe(ativado /dev/sda1!) Em vez daqueles montados no local /data/home/joe?

Solução

Com base em um comentário do comentário de Patrick sobre minha pergunta e a 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, assim, acessar 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 local) eu 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 /(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 uma ligação, /está sem sorte, pois não há uma pasta pai para ela /.

0xC0000022L
fonte
Montar a pasta pai foi a parte principal que estava faltando. Obrigado.
Aidan
1

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
Michael Mrozek
fonte
1
Obrigado Michael. Isso tem a mesma desvantagem de tornar / home inacessível para outros usuários.
Janus