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

71

Agora, /tmp tem alguns arquivos temporários. Quando montei meu disco rígido ( /dev/sdc1 ) em cima de /tmp , posso ver os arquivos no disco rígido. O que acontece com o conteúdo real de /tmp quando meu disco rígido está montado? É possível executar operações de r / w no conteúdo real de /tmp enquanto 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
    
por user 25.04.2015 / 11:15

1 resposta

104

What happens to the actual content of /tmp when my hard drive is mounted?

Quase nada. Eles estão apenas escondidos da vista, não alcançáveis através da travessia normal do sistema de arquivos.

Is it possible to perform r/w operations on the actual content of /tmp while the hard drive is mounted?

Sim. Os processos que tinham identificadores de arquivos abertos dentro de seu "original" /tmp continuarão sendo capazes de usá-los. Você também pode fazer o "reaparecimento" em algum outro lugar por meio da montagem de bind / em outro lugar.

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

Aqui está um pequeno experimento que você pode fazer para melhorar (espero) o que está acontecendo.

Nota: Esta não é uma tentativa de ser perfeitamente correta ou uma descrição exaustiva do que realmente está acontecendo. Deve ser apenas preciso o suficiente para lhe dar uma visão geral.

Eu criei um usuário chamado me em 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 incomum - é apenas um diretório simples com um arquivo simples. Deixo essa sessão aberta como está, com seu cwd dentro desse diretório de teste.

Como root, eu crio um pequeno sistema de arquivos e o monto sobre /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

Eu então abro um novo terminal como me , e dou uma olhada:

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

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

Voltar para a primeira sessão de me , vamos ver como ela vê o mundo:

me@home $ echo something else > other_file

Não há problemas para escrever.

me@home $ cat some_file other_file 
hello
something else

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

Huh? O que está acontecendo?

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

A segunda sessão entrou no diretório depois que a montaria foi colocada. Então, ele vê o novo sistema de arquivos vazio. E o sysadmin borked 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 de debaixo do tapete? (Está ficando mofado.)

Claro! Se a sessão 1 voltar a subir a árvore do sistema de arquivos para fora da montagem, ela perderá essa alça para dentro 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

Mesma visão da sessão 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 bind se tornam úteis. Eles permitem que você monte 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 ligar-montar um sistema de arquivos "dentro de si". Legal truque, hein?)

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 que eles não são visíveis / alcançáveis em sua localização original, a montagem os oculta de travessias de diretórios normais.

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

Uma nota: a montagem sobre /tmp ou /var (ou qualquer um dos principais diretórios do sistema operacional) realmente não é uma boa ideia depois que o processo de inicialização é concluído. Muitos aplicativos deixam o estado nesses diretórios e podem ficar seriamente confusos se você jogar jogos montados em volta deles.

    
por 25.04.2015 / 11:23

Tags