Co się stanie, gdy „zamontujesz” istniejący folder z zawartością?

80

W tej chwili /tmpsą w nim pliki tymczasowe. Po zamontowaniu dysku twardego ( /dev/sdc1) na wierzchu /tmpwidzę pliki na dysku twardym. Co stanie się z faktyczną zawartością /tmpdysku twardego? Czy możliwe jest wykonywanie operacji r / w na rzeczywistej zawartości, /tmpgdy dysk twardy jest zamontowany?

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
użytkownik
źródło

Odpowiedzi:

117

Co stanie się z rzeczywistą zawartością / tmp, kiedy mój dysk twardy zostanie zamontowany?

Prawie nic. Są po prostu ukryte, niedostępne podczas normalnego przechodzenia przez system plików.

Czy możliwe jest wykonywanie operacji r / w na rzeczywistej zawartości / tmp, gdy dysk twardy jest zamontowany?

Tak. Procesy, które miały otwarte uchwyty plików w twoim „oryginale” /tmpbędą nadal mogły z nich korzystać. Możesz także „ponownie wyświetlić” gdzie indziej, łącząc się z /innymi w innym miejscu.

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

Oto mały eksperyment, który możesz przeprowadzić, aby lepiej (mam nadzieję) poczuć to, co się dzieje.

Uwaga: Nie jest to próba bycia całkowicie poprawnym ani wyczerpujący opis tego, co się naprawdę dzieje. Powinien być jednak wystarczająco dokładny, aby dać Ci duży obraz.

Utworzyłem użytkownika wywoływanego mena moim komputerze i losowy katalog w jego domu z plikiem:

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

W tym momencie nie ma nic niezwykłego - to tylko zwykły katalog ze zwykłym plikiem. Sesję pozostawiam otwartą taką, jaka jest, z jej cwdwewnątrz tego katalogu testowego.

Jako root tworzę mały system plików i montuję go /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

Następnie otwieram nowy terminal mei rozglądam się:

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

Tak więc utworzonego przez nas pliku najwyraźniej nie ma. lost+foundKatalog wskazuje korzenia systemie plików ext. I straciłem uprawnienia do zapisu, więc najwyraźniej nie jest to oryginalny katalog.

Wróć do pierwszej mesesji, zobaczmy, jak postrzega świat:

me@home $ echo something else > other_file

Nie ma problemu z pisaniem.

me@home $ cat some_file other_file 
hello
something else

Oryginalny plik nadal tam jest, nowy plik utworzony bez problemu.

Co? Co się dzieje?

Pierwsza sesja weszła do katalogu, zanim została nałożona przez podłączenie do niego innego systemu plików przez root. Ta czynność montowania w ogóle nie wpływa na oryginalny system plików. Proces powłoki ma doskonale poprawny uchwyt do katalogu w oryginalnym systemie plików i może kontynuować z nim interakcję. To coś w rodzaju biega pod tym dywanie punkt montowania.

Druga sesja weszła do katalogu po złożeniu montowania. Widzi więc nowy, pusty system plików. I sysadmin wykasował uprawnienia, więc nie może użyć żądanego miejsca ... naprawmy to.

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

Czy sesja 1 może uciec spod dywanu? (Robi się stęchły.)

Pewnie! Jeśli sesja 1 przesunie się w górę drzewa systemu plików poza wierzchowiec, straci ten uchwyt do wewnątrz i podąży za wierzchowcem, jak wszyscy inni.

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

Ten sam widok, co w sesji nr 2, wróciliśmy do normy.

Ale skąd wiesz, że pliki nie zniknęły? Nikt już nie patrzy!

To jeden z momentów, w których uchwyty do wiązania stają się przydatne. Pozwalają zamontować już zamontowany system plików w innym miejscu.

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

(Tak, możesz podłączyć system plików „do siebie”. Fajna sztuczka, co?)

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

Są więc naprawdę gotowi do działania. Po prostu nie są widoczne / dostępne w oryginalnym miejscu, mount ukrywa je przed normalnymi przeglądarkami katalogów.


Zachęcam do wspólnej zabawy, naprawdę nie jest to skomplikowane, gdy zrozumiesz „sztuczkę”, którą się gra. A kiedy już go masz, zajrzyj do unijnych systemów plików, aby uzyskać jeszcze więcej ciągnienia dywanów :-)

Jedna uwaga: podłączenie do /tmplub /var(lub dowolnego z głównych katalogów systemu operacyjnego) naprawdę nie jest dobrym pomysłem po zakończeniu procesu rozruchu. Wiele aplikacji pozostawia stan w tych katalogach i może się poważnie zdezorientować, jeśli będziesz grać wokół nich.

Mata
źródło
4
To świetna odpowiedź - wykroczyłeś ponad to, o co cię prosiłem. Pomysł na bind-mount też jest całkiem fajny! Dziękuję za szczegółową odpowiedź. Twoje zdrowie.
użytkownik
11
Jest to bardzo powszechny sposób na tajemniczą utratę miejsca na dysku. Jeśli podłączenie nie powiedzie się z jakiegokolwiek powodu w skrypcie startowym, dane można zapisać do katalogu w głównym systemie plików. Jeśli następnie zostanie podjęta próba ponownego uruchomienia, podłączenie może się powieść i być może nikt nie zauważy (na przykład, jeśli system plików zawiera pliki tmp lub dzienniki), z wyjątkiem tego, że zajmie miejsce, być może dużo.
Dan Sheppard,
2
@DanSheppard To jeden z powodów, dla których lubię moje punkty montowania ustawić chmod 000. Także dlaczego systemd nie powiedzie się podczas rozruchu, jeśli krytyczne podłączenia nie powiodą się.
Zan Lynx,
Można również -bind zamontować /home/mena /home/mezamiast folderu „bind”? Tj. Położyłem kolejny dywan na dywanie. A może najpierw musisz odmontować fs?
jiggunjer
@ jiggunjer Wygląda na to, że unionopcja może pomóc.
hliu