Banyak orang terus mengatakan bahwa Linux tidak menyimpan informasi tentang bind mounts, jadi tidak ada cara untuk mendapatkan daftar mereka dan sumber mereka. Berikut ini beberapa contohnya:
dari salah satu komentar di sini :
IIRC informasi ini tidak disimpan di mana pun: setelah
mount --bind
, dua salinan itu setara, tidak ada satu yang lebih "asli" dari yang lain. Lagipula tidak ada yang orisinal jika Anda sudah tidak terpasang/mnt
.dari jawaban di situs ini :
Jadi satu-satunya cara untuk mengingat mount apa yang mengikat mount adalah log dari perintah mount yang tersisa
/etc/mtab
. Operasi bind mount ditunjukkan oleh opsi bind mount (yang menyebabkan tipe sistem file diabaikan). Tetapi mount tidak memiliki opsi untuk mendaftar hanya filesystem yang dipasang dengan sekumpulan set opsi tertentu.dari laporan bug Debian :
Ini disengaja. Kedua titik pemasangan sepenuhnya sama dalam semua hal sehingga kernel tidak menyimpan flag apa pun untuk membedakannya.
Di atas adalah omong kosong. Alat findmnt
ini dapat membuat daftar jalur sumber bind mounts (dalam bentuk device[source-path]
; Saya juga mencoba untuk mendapatkannya hanya mencantumkan jalur sumber dan bukan perangkat). Jika kernel Linux mempertahankan bind mount, maka informasi itu harus disimpan di suatu tempat , jika tidak, ia tidak akan tahu /home
pasti terikat /users
. Jadi di mana data ini? Apakah ini disimpan di beberapa wilayah yang tidak jelas dalam RAM? Apakah findmnt
mencari di /proc
suatu tempat?
sumber
findmnt
yang Anda jalankan dan opsi apa yang Anda berikan? Milik saya tidak mencetaknya seperti itu dan melihat kode sumber yang tampaknya menggunakan_PATH_PROC_MOUNTINFO
yang tampaknya/proc/self/mountinfo
tidak memiliki informasi ini di dalamnya juga./proc/self/mountinfo
relatif baru saja direstrukturisasi. Saya menggunakan mesin RHEL6 saya sebelumnya yang tidak memiliki info jalur tetapi mesin RHEL7 saya melakukan dan seperti yang disebutkan dalam tautan Anda Wheezy juga./dev/A
sudah terpasang di/B
dan Anda melakukannyamount --bind /B /C
, kernel yang lebih tua hanya ingat/B → /dev/A
dan/C → /dev/A
, mereka tidak ingat hubungan antara/B
dan/C
. Jadi unmount/B
secara alami tidak berpengaruh/C
. Kernel yang lebih baru ingat bahwa/C
itu adalah ikatan/B
, tetapi dengan cara yang tidak mencegah/C
dari melanjutkan bekerja jika/B
tidak di-mount, saya tidak tahu persis bagaimana caranya.Jawaban:
Anda sedikit salah paham; dua titik pemasangan sama dalam hal izin, bendera, dll karena ikatan secara efektif mengalihkan akses dari satu jalur ke jalur lainnya. Tetapi mereka masih berbeda .
Jika Anda melihat
/proc/self/mountinfo
Anda akan melihat tampilan kernel dari dunia mount untuk proses ini (ruang nama membuat segalanya lebih rumit; tidak hanya ada satu tampilan dari tabel mount).man 5 proc
akan menjelaskan format file ini, tetapi Anda dapat melihat hierarki pohon dan di mana bind mount memiliki "induk". Ini adalah file yangfindmnt
diuraikan.sumber
Linux tidak menyimpan informasi tentang mount mana yang merupakan mount mengikat . Itu menyimpan informasi tentang semua mount termasuk bind mounts .
Ini sangat mirip dengan tautan keras. Mount tautan ke sistem file seperti tautan nama file ke inode. Satu-satunya perbedaan adalah bahwa mounts juga memiliki flag per-mountpoint dan dapat merujuk ke subdirektori dari sistem file target alih-alih root sistem file.
Ketika Anda membuat tautan keras, sistem file tidak menyimpan nama file mana yang asli dan mana yang merupakan tautan keras. Keduanya hanya merujuk pada inode yang sama. Jika Anda membatalkan tautan file asli situasinya tidak dapat dibedakan dari apakah Anda secara langsung membuat file dengan nama file kedua.
Kembali ke bind mounts: Kernel menyimpan tabel yang berisi filesystem (diidentifikasi oleh major: pasangan nomor minor), mountpoint, path relatif ke root filesystem dan beberapa flag. Anda dapat mengakses daftar ini dengan melihat
/proc/self/mountinfo
. (Semakin rumit ketika ruang nama terlibat, seperti yang disebutkan @ stephen-harris).findmnt
parsing daftar ini.Jika root Anda
/dev/sda1
dengan mayor: minor8:1
dan Anda jalankanmount --bind /a /b
/proc/self/mountinfo
akan berisi baris yang mirip dengan ini:Jika Anda
/home
adalah/dev/sda2
dengan utama: minor8:2
dan Anda menjalankanmount --bind /home /users
itu akan terlihat seperti ini:Kolom yang relevan untuk pertanyaan Anda adalah yang ketiga, keempat dan kelima. Ini adalah id filesystem (untuk filesystem nyata sama dengan device mayor: minor; untuk filesystem virtual seperti tmpfs [0: counter ]), path relatif ke root filesystem yang terikat ke mountpoint (biasanya / untuk normal mounts, bisa berupa apa saja untuk binding mounts) dan mountpoint.
Untuk makna kolom yang tersisa, lihat dokumentasi kernel Linux .
findmnt
memanggil jalur sumber relatif ke root filesystem "FSROOT". Anda bisa menggunakannyafindmnt -o TARGET,FSROOT
untuk mendapatkannya. Jika Anda menginginkan path sumber absolut, Anda mungkin perlu mem-parsing/proc/self/mountinfo
sendiri dan menggabungkan informasi tentang mount untuk sistem file yang sama.Untuk informasi lebih lanjut, lihat jawaban saya untuk "Daftar hanya ikatan mount" .
sumber
/proc/self/mountinfo
dapat berisi baris seperti2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro
, maka Linux pasti tidak menyimpan beberapa informasi tentang gunung mengikat.mount --bind /home/melab /mnt
garis yang dihasilkan mungkin terlihat seperti salah satu dari berikut tergantung pada dari/home
dan/home/melab
merupakan mountpoint sebuah:3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw
,3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw
,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
/
di kolom keempat sering menunjukkan bind mount. Tetapi mungkin juga subvolume Btrfs./dev/sda3
seharusnya dipasang di/home/melab
?/dev/sda1
as/
,/dev/sda2
as/home
dan/dev/sda3
as/home/melab