O que acontece quando você 'monta' uma pasta existente com conteúdo?

80

No momento, /tmphá alguns arquivos temporários. Quando monto meu disco rígido ( /dev/sdc1) na parte superior /tmp, consigo ver os arquivos no disco rígido. O que acontece com o conteúdo real de /tmpquando meu disco rígido está montado? É possível executar operações r / w no conteúdo real /tmpenquanto o disco rígido está montado?

python@lanix / $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       286G   43G  229G  16% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            3.8G  4.0K  3.8G   1% /dev
tmpfs           766M  1.4M  765M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.8G   38M  3.8G   1% /run/shm
none            100M   24K  100M   1% /run/user
/dev/sdb1       7.5G  2.7G  4.9G  35% /mnt
/dev/sdc1       932G  242G  691G  26% /tmp
do utilizador
fonte

Respostas:

117

O que acontece com o conteúdo real de / tmp quando meu disco rígido está montado?

Praticamente nada. Eles estão apenas ocultos, não acessíveis através do sistema de arquivos normal.

É possível executar operações r / w no conteúdo real de / tmp enquanto o disco rígido está montado?

Sim. Os processos que tinham identificadores de arquivos abertos dentro do seu "original" /tmpcontinuarão sendo capazes de usá-los. Você também pode fazer o "reaparecer" em outro lugar montando-o em /outro local.

# mount -o bind / /somewhere/else
# ls /somewhere/else/tmp  

Aqui está um pequeno experimento que você pode executar para ter uma ideia melhor (espero) do que está acontecendo.

Nota: Esta não é uma tentativa de estar perfeitamente correta ou uma descrição exaustiva do que realmente está acontecendo. No entanto, deve ser preciso o suficiente para fornecer uma imagem geral.

Criei um usuário chamado mena minha máquina e um diretório aleatório em sua casa, com um arquivo:

me@home $ pwd
/home/me/tmp
me@home $ echo hello > some_file
me@home $ ls  
some_file
me@home $ cat some_file 
hello

Neste ponto, nada de incomum - é apenas um diretório simples com um arquivo simples. Deixo essa sessão aberta da maneira que está, com a pasta cwddentro desse diretório de teste.

Como root, crio um pequeno sistema de arquivos e o montei /home/me/tmp.

root@home # dd if=/dev/zero of=./fs bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00467318 s, 2.2 GB/s

root@home # mkfs -t ext2 ./fs 
mke2fs 1.42.12 (29-Aug-2014)
[... snip ...]
Writing superblocks and filesystem accounting information: done

root@home # mount ./fs /home/me/tmp

Abro um novo terminal como mee olho em volta:

me@home #2 $ cd tmp
me@home #2 $ ls
lost+found
me@home #2 $ cat some_file
cat: some_file: No such file or directory
me@home #2 $ echo bye bye > some_file
-su: some_file: Permission denied

Portanto, esse arquivo que criamos claramente não está lá. O lost+founddiretório é indicativo da raiz de um sistema de arquivos ext. E eu perdi a permissão de gravação, portanto, claramente não é o diretório original.

De volta à primeira mesessão, vejamos como ele vê o mundo:

me@home $ echo something else > other_file

Não há problema em escrever.

me@home $ cat some_file other_file 
hello
something else

O arquivo original ainda está lá, novo arquivo criado sem problemas.

Hã? O que está acontecendo?

A primeira sessão entrou no diretório antes de ser sobreposta pela montagem raiz de outro sistema de arquivos nele. Essa ação de montagem não afeta o sistema de arquivos original. O processo do shell possui um identificador perfeitamente válido para o diretório no sistema de arquivos original e pode continuar interagindo com ele. É meio que correndo por baixo do ponto de montagem do tapete .

A segunda sessão entrou no diretório depois que a montagem foi estabelecida. Então ele vê o novo sistema de arquivos vazio. E o sysadmin utilizou as permissões, por isso não pode usar o espaço solicitado ... vamos corrigir isso.

root@home # chown me:users /home/me/tmp
me@home #2 $ echo bye bye > some_file
me@home #2 $ ls 
lost+found  some_file
me@home #2 $ cat some_file 
bye bye

A sessão 1 pode escapar debaixo do tapete? (Está ficando mofado.)

Certo! Se a sessão 1 voltar a subir a árvore do sistema de arquivos da montagem, ela perderá o identificador para o interior e seguirá a montagem como todos os outros.

me@home $ cd
me@home $ pwd
/home/me
me@home $ cd tmp
me@home $ cat some_file other_file
bye bye
cat: other_file: No such file or directory

Da mesma maneira que a sessão nº 2, voltamos ao normal.

Mas como você sabe que os arquivos não desapareceram? Ninguém está mais olhando!

Esse é um dos momentos em que montagens de encadernação se tornam úteis. Eles permitem montar um sistema de arquivos já montado em outro lugar.

me@home $ mkdir ~/bind
root@home # mount -o bind /home/me /home/me/bind

(Sim, você pode montar um sistema de arquivos "dentro de si". Truque legal, não é?)

me@home $ ls bind/tmp
other_file  some_file
me@home $ cat bind/tmp/*
something else
hello

Então eles estão realmente lá, prontos para a ação. Simplesmente eles não são visíveis / alcançáveis ​​em seu local original, a montagem os oculta dos percursos normais de diretório.


Encorajo-vos a brincar com isso, não é realmente complicado uma vez que você entendeu o "truque" que está sendo jogado. E depois que o Got It ™, analise os sistemas de arquivos da união para obter ainda mais carpetes :-)

A observação embora: montagem sobre /tmpou /var(ou qualquer um dos diretórios do núcleo do sistema operacional) realmente não é uma boa idéia uma vez que o processo de inicialização for concluído. Muitos aplicativos deixam o estado nesses diretórios e podem ficar seriamente confusos se você jogar jogos de montagem em torno deles.

Esteira
fonte
4
Esta é uma ótima resposta - você foi além do que eu lhe pedi. A idéia de montar uma montagem também é bem legal! Obrigado pela resposta detalhada. Felicidades.
usuário
11
Essa é uma maneira muito comum de perder misteriosamente espaço em disco. Se uma montagem falhar por qualquer motivo em um script de inicialização, os dados poderão ser gravados no diretório no sistema de arquivos raiz. Se uma reinicialização for tentada, a montagem poderá ser bem-sucedida e talvez ninguém notará (por exemplo, se o sistema de arquivos contiver arquivos ou logs tmp), exceto que ele consumirá espaço, talvez muito.
Dan Sheppard
2
@ DanSheppard Essa é uma das razões pelas quais eu gosto dos meus pontos de montagem definidos no chmod 000. Também porque o systemd falha na inicialização se montagens críticas falharem.
precisa
Você também pode -bind montar /home/meem /home/mevez da pasta "bind"? Ou seja, coloque outro tapete em cima do tapete. Ou você teria que desmontar fsprimeiro?
precisa saber é
@jiggunjer Parece que a unionopção pode ajudar.
hliu