Apa yang terjadi ketika Anda 'me-mount' folder yang ada dengan konten?

80

Saat /tmpini ada beberapa file sementara di dalamnya. Ketika saya memasang hard drive saya ( /dev/sdc1) di atas /tmp, saya dapat melihat file di hard drive. Apa yang terjadi pada konten aktual /tmpsaat hard drive saya dipasang? Apakah mungkin untuk melakukan operasi r / w pada konten aktual /tmpsaat hard drive dipasang?

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
pengguna
sumber

Jawaban:

117

Apa yang terjadi pada konten aktual / tmp ketika hard drive saya dipasang?

Cukup banyak. Mereka hanya disembunyikan dari pandangan, tidak dapat dicapai melalui traversal sistem file normal.

Apakah mungkin untuk melakukan operasi r / w pada konten aktual dari / tmp ketika hard drive dipasang?

Iya. Proses yang memiliki pegangan file terbuka di dalam "asli" Anda /tmpakan terus dapat menggunakannya. Anda juga dapat membuat "muncul kembali" di tempat lain dengan mengikat pemasangan di /tempat lain.

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

Inilah sedikit percobaan yang dapat Anda jalankan untuk mendapatkan perasaan yang lebih baik (saya harap) untuk apa yang terjadi.

Catatan: Ini bukan upaya untuk sepenuhnya benar atau deskripsi lengkap tentang apa yang sebenarnya terjadi. Seharusnya cukup akurat untuk memberi Anda gambaran besar sekalipun.

Saya membuat pengguna yang dipanggil medi mesin saya, dan direktori acak di rumahnya, dengan file di dalamnya:

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

Pada titik ini, tidak ada yang aneh - itu hanya direktori biasa dengan file biasa. Saya membiarkan sesi itu tetap terbuka seperti apa adanya, dengan bagian cwddalamnya di dalam direktori tes.

Sebagai root, saya membuat sistem file kecil dan memasangnya /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

Saya kemudian membuka terminal baru sebagai me, dan melihat-lihat:

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

Jadi, file yang kami buat itu jelas tidak ada. The lost+founddirektori indikasi dari akar sebuah filesystem ext. Dan saya kehilangan izin menulis, jadi itu jelas bukan direktori asli.

Kembali ke mesesi pertama , mari kita lihat bagaimana ia melihat dunia:

me@home $ echo something else > other_file

Tidak ada masalah menulis.

me@home $ cat some_file other_file 
hello
something else

File asli masih ada, file baru dibuat tanpa masalah.

Hah? Apa yang sedang terjadi?

Sesi pertama memasuki direktori sebelum overlay oleh root mount filesystem lain di atasnya. Tindakan mount itu tidak mempengaruhi sistem file asli sama sekali. Proses shell memiliki pegangan yang benar-benar valid ke direktori di sistem file asli, dan dapat terus berinteraksi dengannya. Ini semacam berlarian di bawah ini karpet mount point.

Sesi kedua memasuki direktori setelah mount diletakkan. Jadi ia melihat filesystem baru yang kosong. Dan sysadmin merusak izin, sehingga tidak dapat menggunakan ruang yang diminta ... mari perbaiki itu.

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

Bisakah sesi 1 lolos dari bawah permadani? (Sudah mulai apak.)

Tentu! Jika sesi 1 bergerak mundur pohon sistem file dari mount, itu akan kehilangan pegangan itu ke dalam dan akan mengikuti mount seperti orang lain.

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

Tampilan yang sama seperti sesi # 2, kita kembali normal.

Tapi bagaimana Anda tahu file-file itu tidak hilang? Tidak ada yang melihat lagi!

Itulah salah satu momen di mana bind mount menjadi berguna. Mereka membiarkan Anda memasang sistem file yang sudah terpasang di tempat lain.

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

(Ya, Anda dapat mengikat-mount filesystem "di dalam dirinya sendiri". Trik keren, eh?)

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

Jadi mereka memang ada di sana, siap beraksi. Hanya saja mereka tidak terlihat / dapat dijangkau di lokasi aslinya, mount menyembunyikannya dari lintasan direktori normal.


Saya mendorong Anda untuk bermain-main dengan ini, itu benar-benar tidak rumit setelah Anda memahami "trik" yang sedang dimainkan. Dan begitu Anda sudah mendapatkannya, lihat sistem file gabungan untuk lebih banyak lagi karpet yang menarik :-)

Namun satu catatan: pemasangan lebih /tmpatau /var(atau direktori inti OS) sebenarnya bukan ide yang baik setelah proses booting selesai. Banyak aplikasi meninggalkan status dalam direktori tersebut, dan mungkin akan sangat bingung jika Anda memainkan permainan di sekitarnya.

Tikar
sumber
4
Ini adalah jawaban yang bagus - Anda telah melampaui apa yang saya minta dari Anda. Gagasan bind-mount juga cukup keren! Terima kasih atas jawaban terinci. Tepuk tangan.
pengguna
11
Ini adalah cara yang sangat umum untuk secara misterius kehilangan ruang disk. Jika mount gagal karena alasan apa pun dalam skrip startup, data dapat ditulis ke direktori pada sistem file root. Jika restart kemudian dicoba, mount dapat berhasil dan mungkin tidak ada yang akan memperhatikan (misalnya, jika filesystem berisi file tmp atau log), kecuali itu akan memakan ruang, mungkin banyak.
Dan Sheppard
2
@DanSheppard Itulah salah satu alasan mengapa saya suka poin mount saya mengatur chmod 000. Juga mengapa systemd gagal boot jika mount kritis gagal.
Zan Lynx
Bisakah Anda juga -bind mount /home/mepada /home/mebukan folder "bind"? Yaitu meletakkan karpet lain di atas karpet. Atau haruskah Anda melepas fsdulu?
jiggunjer
@ jiggunjer Tampaknya unionopsi dapat membantu.
hliu