Що станеться, коли ви перейдете на наявну папку із вмістом?


80

Зараз у ньому /tmpє кілька тимчасових файлів. Коли я монтую жорсткий диск ( /dev/sdc1) поверх /tmp, я можу побачити файли на жорсткому диску. Що відбувається з фактичним вмістом, /tmpколи мій жорсткий диск встановлений? Чи можливо виконувати операції r / w над фактичним вмістом, /tmpпоки він встановлений на жорсткому диску?

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

Відповіді:


117

Що відбувається з фактичним вмістом / tmp, коли він встановлений на жорсткому диску?

Досить нічого. Вони просто приховані від перегляду, недоступні за допомогою звичайного обходу файлової системи.

Чи можливо виконувати r / w операції з фактичним вмістом / tmp під час встановлення жорсткого диска?

Так. Процеси, у яких були відкриті ручки файлів усередині вашого "оригіналу" /tmp, надалі зможуть ними користуватися. Ви також можете зробити "знову" деінде, встановивши прив'язку в /іншому місці.

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

Ось невеликий експеримент, який ви можете провести, щоб покращити (сподіваюся) відчуття того, що відбувається.

Примітка. Це не спроба бути абсолютно правильним чи вичерпним описом того, що насправді відбувається. Має бути досить точним, щоб дати тобі велику картину.

Я створив користувача, зателефонованого meна своїй машині, та довільну директорію в його будинку з файлом у ньому:

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

На даний момент нічого незвичайного - це просто звичайний каталог з простим файлом. Залишаю сеанс відкритим право, як є, з його cwdвсередині цього тестового каталогу.

Як root, я створюю невелику файлову систему і монтую її над /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

Потім я відкриваю новий термінал як meі оглядаюсь:

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

Отже, цього файлу, який ми створили, явно немає. lost+foundКаталог є показником кореня з внутр файлової системи. І я втратив дозвіл на запис, тому явно це не оригінальний каталог.

Повернувшись до першого meсеансу, давайте подивимось, як він бачить світ:

me@home $ echo something else > other_file

Немає проблем із написанням.

me@home $ cat some_file other_file 
hello
something else

Оригінальний файл все ще є, новий файл створений без проблем.

Так? Що відбувається?

Перший сеанс увійшов до каталогу до того, як він був накладений кореневим монтажем іншої файлової системи на ньому. Ця дія монтажу взагалі не впливає на оригінальну файлову систему. Процес оболонки має цілком дійсну ручку до каталогу в оригінальній файловій системі і може продовжувати взаємодію з ним. Це свого роду бігають під на килим точки монтування.

Другий сеанс увійшов до каталогу після того, як було встановлено кріплення. Так він бачить нову, порожню файлову систему. І sysadmin захистив дозволи, тому він не може використовувати потрібний простір ... давайте виправити це.

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

Чи може сесія 1 втекти з-під килима? (Стає затхлим.)

Звичайно! Якщо сеанс 1 перемістить резервну копію дерева файлових систем з монтажу, вона втратить цю ручку всередину і піде за версією, як і всі інші.

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

Такий же вигляд, як і сесія №2, ми повернулися до нормального стану.

Але як ти знаєш, файли не зникли? Ніхто більше не дивиться!

Це один із моментів, коли кріплення кріплення стає зручним. Вони дозволяють вам змонтувати вже змонтовану файлову систему десь в іншому місці.

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

(Так, ви можете прив’язати-змонтувати файлову систему "всередині себе". Прохолодний трюк, так?)

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

Так що вони справді є, готові до дії. Просто вони не видимі / недоступні у своєму початковому місці, кріплення приховує їх від звичайних обходів каталогів.


Я закликаю вас пограти з цим, це дійсно не складно, коли ви зрозуміли "фокус", який виконується. І як тільки ви зрозуміли ™, погляньте на файлові системи об'єднання, щоб ще більше потягнути килими :-)

Однак одне зауваження: встановлення над /tmpабо /var(або будь-яким із основних каталогів ОС) насправді не є хорошою ідеєю, коли процес завантаження закінчується. Дуже багато додатків залишають стан у цих каталогах, і можуть серйозно заплутатися, якщо ви граєте в них монтажні ігри.


4
Це чудова відповідь - ви перейшли вище, ніж те, що я просив від вас. Ідея bind-mount також досить класна! Дякую за детальну відповідь. Ура.
користувач

11
Це дуже поширений спосіб таємничо втратити місце на диску. Якщо монтування не вдалося з будь-якої причини в сценарії запуску, дані можуть бути записані в каталог у кореневій файловій системі. Якщо потім спробувати перезапустити, монтування може досягти успіху, і, можливо, ніхто не помітить (наприклад, якщо файлова система містить tmp-файли або журнали), за винятком того, що вона буде мати багато місця, можливо, багато.
Ден Шеппард

2
@DanSheppard Це одна з причин, що мені подобається, що мої точки монтажу встановлені chmod 000. Також чому systemd не спрацьовує при завантаженні, якщо критичні кріплення виходять з ладу.
Зан Лінкс

Чи не могли б ви також -bind змонтувати /home/meна /home/meзамість папки «прив'язки»? Тобто покласти ще один килим поверх килима. Або вам доведеться спочатку відключити fs?
jiggunjer

@jiggunjer Здається, unionваріант може допомогти.
хлю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.