Apa itu "bind mount"? Bagaimana saya membuatnya? Apa manfaatnya?
Saya telah diberitahu untuk menggunakan bind mount untuk sesuatu, tetapi saya tidak mengerti apa itu atau bagaimana menggunakannya.
filesystems
mount
bind-mount
Gilles
sumber
sumber
Jawaban:
Apa itu bind mount?
Sebuah mengikat gunung adalah pandangan alternatif dari pohon direktori. Secara klasik, pemasangan menciptakan tampilan perangkat penyimpanan sebagai pohon direktori. Bind mount sebagai gantinya mengambil pohon direktori yang ada dan mereplikasi di bawah titik yang berbeda. Direktori dan file di bind mount sama dengan aslinya. Setiap modifikasi di satu sisi segera tercermin di sisi lain, karena dua tampilan menunjukkan data yang sama.
Misalnya, setelah mengeluarkan perintah Linux
direktori
/some/where
dan/else/where
memiliki konten yang sama.Tidak seperti tautan keras atau tautan simbolik, bind mount tidak memengaruhi apa yang disimpan di sistem file. Ini properti sistem live.
Bagaimana cara membuat bind mount?
bindf
The
bindfs
filesystem adalah FUSE filesystem yang menciptakan pemandangan pohon direktori. Misalnya, perintahnyamembuat
/else/where
titik mount di mana konten/some/where
terlihat.Karena bindfs adalah sistem file yang terpisah, file
/some/where/foo
dan/else/where/foo
muncul sebagai file yang berbeda untuk aplikasi (sistem file bindf memilikist_dev
nilai sendiri ). Setiap perubahan di satu sisi "ajaib" tercermin di sisi lain, tetapi fakta bahwa file-file itu sama hanya terlihat ketika orang tahu bagaimana bindf beroperasi.Bindfs tidak memiliki pengetahuan tentang titik mount, jadi jika ada titik mount di bawah
/some/where
, itu muncul hanya sebagai direktori lain di bawah/else/where
. Mount atau unmount sistem file di bawahnya/some/where
muncul di bawah/else/where
sebagai perubahan direktori yang sesuai.Bindf dapat mengubah beberapa metadata file: ini dapat menunjukkan izin palsu dan kepemilikan untuk file. Lihat manual untuk detailnya, dan lihat di bawah untuk contohnya.
Filesystem bindfs dapat di-mount sebagai pengguna non-root, Anda hanya perlu hak istimewa untuk me-mount filesystem FUSE. Bergantung pada distribusi Anda, ini mungkin mengharuskan Anda berada dalam
fuse
grup atau diizinkan untuk semua pengguna. Untuk melepas sistem file FUSE, gunakanfusermount -u
sebagai gantiumount
, misnullfs
FreeBSD menyediakan sistem
nullfs
file yang menciptakan pandangan alternatif dari sistem file. Dua perintah berikut ini setara:Setelah mengeluarkan salah satu perintah,
/else/where
menjadi titik pemasangan di mana konten/some/where
terlihat.Karena nullfs adalah sistem file yang terpisah, file
/some/where/foo
dan/else/where/foo
muncul sebagai file yang berbeda untuk aplikasi (sistem file nullfs memilikist_dev
nilai sendiri ). Setiap perubahan di satu sisi "ajaib" tercermin di sisi lain, tetapi fakta bahwa file-file itu sama hanya terlihat ketika orang tahu bagaimana nullfs beroperasi.Berbeda dengan binding FUSE, yang bertindak pada tingkat pohon direktori, nullfs FreeBSD bertindak lebih dalam di kernel, jadi mount poin di bawahnya
/else/where
tidak terlihat: hanya pohon yang merupakan bagian dari titik mount yang sama seperti/some/where
yang tercermin di bawah/else/where
.Sistem file nullfs dapat digunakan di bawah varian BSD lainnya (OS X, OpenBSD, NetBSD) tetapi tidak dikompilasi sebagai bagian dari sistem default.
Linux mengikat mount
Di Linux, bind mounts tersedia sebagai fitur kernel. Anda bisa membuatnya dengan
mount
perintah, dengan melewatkan--bind
opsi baris perintah ataubind
opsi mount. Dua perintah berikut ini setara:Di sini, "perangkat"
/some/where
bukan partisi disk seperti pada sistem file pada disk, tetapi direktori yang ada. Mount point/else/where
harus berupa direktori yang sudah ada seperti biasa. Perhatikan bahwa tidak ada tipe sistem file yang ditentukan: membuat bind mount tidak melibatkan driver sistem file, ia menyalin struktur data kernel dari mount asli.mount --bind
juga mendukung pemasangan non-direktori ke non-direktori:/some/where
dapat berupa file biasa (dalam hal ini/else/where
perlu file biasa juga).Bind mount Linux sebagian besar tidak dapat dibedakan dari aslinya. Perintah
df -T /else/where
menunjukkan perangkat yang sama dan jenis sistem file yang samadf -T /some/where
. File-file/some/where/foo
dan/else/where/foo
tidak bisa dibedakan, seolah-olah mereka adalah tautan keras. Dimungkinkan untuk melepas/some/where
, dalam hal ini/else/where
tetap terpasang.Dengan kernel yang lebih tua (saya tidak tahu kapan, saya pikir sampai 3.x), bind mount benar-benar tidak dapat dibedakan dari aslinya. Kernel terkini melacak bind mounts dan mengekspos informasi melalui PID / mountinfo, yang memungkinkan
findmnt
untuk mengindikasikan bind mount seperti itu .Anda dapat memasukkan entri mount bind
/etc/fstab
. Cukup sertakanbind
(ataurbind
dll.) Dalam opsi, bersama dengan opsi lain yang Anda inginkan. "Perangkat" adalah pohon yang ada. Kolom filesystem dapat berisinone
ataubind
(diabaikan, tetapi menggunakan nama filesystem akan membingungkan). Sebagai contoh:Jika ada mount point di bawah
/some/where
, isinya tidak terlihat di bawah/else/where
. Alih-alihbind
, Anda dapat menggunakanrbind
, juga mereplikasi titik mount di bawahnya/some/where
. Sebagai contoh, jika/some/where/mnt
adalah titik mount makasetara dengan
Selain itu, Linux memungkinkan mount dideklarasikan sebagai shared , slave , private atau unbindable . Ini memengaruhi apakah operasi pemasangan tercermin di bawah bind mount yang mereplikasi titik pemasangan. Untuk lebih jelasnya, lihat dokumentasi kernel .
Linux juga menyediakan cara untuk memindahkan mount: di mana
--bind
salinan,--move
memindahkan titik mount.Dimungkinkan untuk memiliki opsi pemasangan yang berbeda di dua direktori yang diikat oleh bind. Namun ada kekhasan: membuat bind mount dan pengaturan opsi mount tidak dapat dilakukan secara atomis, mereka harus dua operasi berturut-turut. (Kernel yang lebih lama tidak mengizinkan ini.) Sebagai contoh, perintah berikut membuat tampilan read-only, tetapi ada jendela kecil waktu di mana
/else/where
read-write:Saya tidak bisa membuat bind mount untuk bekerja!
Jika sistem Anda tidak mendukung FUSE, trik klasik untuk mencapai efek yang sama adalah menjalankan server NFS, membuatnya mengekspor file yang ingin Anda ekspos (memungkinkan akses
localhost
) dan memasangnya di mesin yang sama. Ini memiliki overhead yang signifikan dalam hal memori dan kinerja, sehingga bind mount memiliki keunggulan yang pasti di mana tersedia (yang ada pada sebagian besar varian Unix berkat FUSE).Gunakan kasing
Tampilan hanya baca
Mungkin berguna untuk membuat tampilan read-only dari sistem file, baik untuk alasan keamanan atau hanya sebagai lapisan keamanan untuk memastikan bahwa Anda tidak akan sengaja memodifikasinya.
Dengan bindf:
Dengan Linux, caranya sederhana:
Ini menyisakan interval waktu singkat selama
/mnt/readonly
baca-tulis. Jika ini merupakan masalah keamanan, pertama-tama buat bind mount di direktori yang hanya dapat diakses oleh root, buat hanya-baca, lalu pindahkan ke titik mount publik. Dalam cuplikan di bawah ini, perhatikan bahwa penting/root/private
(direktori di atas titik mount) bersifat pribadi; izin asli pada/root/private/mnt
tidak relevan karena mereka tersembunyi di balik titik mount.Memetakan kembali pengguna dan grup
Sistem file merekam pengguna dan grup berdasarkan ID numerik mereka. Terkadang Anda berakhir dengan beberapa sistem yang menetapkan ID pengguna yang berbeda untuk orang yang sama. Ini bukan masalah dengan akses jaringan, tetapi itu membuat ID pengguna tidak berarti ketika Anda membawa data dari satu sistem ke sistem lain pada disk. Misalkan Anda memiliki disk yang dibuat dengan sistem file multi-pengguna (mis. Ext4, btrfs, zfs, UFS, ...) pada sistem di mana Alice memiliki ID pengguna 1000 dan Bob memiliki ID pengguna 1001, dan Anda ingin agar disk itu dapat diakses di sistem di mana Alice memiliki ID pengguna 1001 dan Bob memiliki ID pengguna 1000. Jika Anda memasang disk secara langsung, file Alice akan muncul sebagai milik Bob (karena ID pengguna adalah 1001) dan file Bob akan muncul seperti dimiliki oleh Alice (karena ID pengguna adalah 1000).
Anda dapat menggunakan bindf untuk memetakan ulang ID pengguna. Pertama-tama pasang partisi disk di direktori pribadi, di mana hanya root yang dapat mengaksesnya. Kemudian buat tampilan bindf di area publik, dengan ID pengguna dan ID grup dibuat ulang yang menukar ID pengguna dan ID grup Alice dan Bob.
Lihat Bagaimana seseorang dapat mengakses file di folder home pengguna sistem yang tidak di-boot? dan mount --bind pengguna lain sebagai diri saya contoh lain.
Memasang di penjara atau wadah
Sebuah penjara chroot atau wadah menjalankan proses dalam subtree dari pohon direktori sistem. Ini berguna untuk menjalankan program dengan akses terbatas, mis. Jalankan server jaringan dengan akses hanya ke file sendiri dan file yang dilayaninya, tetapi tidak untuk data lain yang disimpan di komputer yang sama). Batasan chroot adalah bahwa program ini terbatas pada satu subtree: ia tidak dapat mengakses subtree independen. Bind mounts memungkinkan mencangkok sub pohon lain ke pohon utama itu. Ini menjadikannya dasar untuk penggunaan kontainer yang paling praktis di Linux.
Misalnya, misalkan mesin menjalankan layanan
/usr/sbin/somethingd
yang seharusnya hanya memiliki akses ke data di bawah/var/lib/something
. Pohon direktori terkecil yang berisi kedua file ini adalah root. Bagaimana cara layanan dibatasi? Satu kemungkinan adalah membuat tautan keras ke semua file yang diperlukan layanan (setidaknya/usr/sbin/somethingd
dan beberapa perpustakaan bersama) di bawahnya/var/lib/something
. Tapi ini rumit (tautan keras perlu diperbarui setiap kali file ditingkatkan), dan tidak berfungsi jika/var/lib/something
dan/usr
berada di sistem file yang berbeda. Solusi yang lebih baik adalah membuat root ad hoc dan mengisinya dengan menggunakan mount:Mount namespaces Linux menggeneralisasi chroot. Bind mounts adalah bagaimana ruang nama dapat diisi dengan cara yang fleksibel. Lihat Membuat proses membaca file yang berbeda untuk nama file yang sama sebagai contoh.
Menjalankan distribusi yang berbeda
Penggunaan chroot lainnya adalah menginstal distribusi yang berbeda dalam direktori dan menjalankan program darinya, bahkan ketika mereka membutuhkan file pada jalur kode keras yang tidak ada atau memiliki konten berbeda pada sistem dasar. Ini dapat berguna, misalnya, untuk menginstal distribusi 32-bit pada sistem 64-bit yang tidak mendukung paket campuran, untuk menginstal rilis distribusi yang lebih lama atau distribusi lain untuk menguji kompatibilitas, untuk menginstal rilis yang lebih baru untuk menguji fitur-fitur terbaru dengan tetap mempertahankan sistem basis yang stabil, dll. Lihat Bagaimana cara menjalankan program 32-bit pada 64-bit Debian / Ubuntu? untuk contoh di Debian / Ubuntu.
Misalkan Anda memiliki instalasi paket terbaru distribusi Anda di bawah direktori
/f/unstable
, tempat Anda menjalankan program dengan berpindah ke direktori ituchroot /f/unstable
. Untuk membuat direktori home tersedia dari instalasi ini, ikat mount ke chroot:Schroot program melakukan ini secara otomatis.
Mengakses file yang tersembunyi di balik titik mount
Ketika Anda memasang sistem file pada direktori, ini menyembunyikan apa yang ada di balik direktori. File-file dalam direktori itu menjadi tidak dapat diakses sampai direktori tidak di-mount. Karena BSD nullfs dan Linux bind mounts beroperasi pada level yang lebih rendah dari infrastruktur mount, nullfs mount atau bind mount dari sistem file memperlihatkan direktori yang tersembunyi di balik submount dalam dokumen aslinya.
Sebagai contoh, misalkan Anda memiliki sistem file tmpfs yang terpasang di
/tmp
. Jika ada file di bawah/tmp
ketika filesystem tmpfs dibuat, file-file ini mungkin masih, secara efektif tidak dapat diakses tetapi mengambil ruang disk. Lari(Linux) atau
(FreeBSD) untuk membuat tampilan sistem file root di
/mnt
. Direktori/mnt/tmp
adalah direktori dari sistem berkas root.Ekspor NFS di jalur yang berbeda
Beberapa server NFS (seperti server kernel Linux NFS sebelum NFSv4) selalu mengiklankan lokasi direktori yang sebenarnya ketika mereka mengekspor direktori. Artinya, ketika permintaan klien
server:/requested/location
, server melayani pohon di lokasi/requested/location
. Kadang-kadang diinginkan untuk memungkinkan klien untuk meminta/request/location
tetapi sebenarnya melayani file di bawah/actual/location
. Jika server NFS Anda tidak mendukung penyajian lokasi alternatif, Anda dapat membuat bind mount untuk permintaan yang diharapkan, misalnyadi
/etc/exports
dan yang berikut di/etc/fstab
:Pengganti untuk tautan simbolik
Terkadang Anda ingin membuat tautan simbolis untuk membuat file
/some/where/is/my/file
muncul di bawah/else/where
, tetapi aplikasi yang menggunakanfile
memperluas tautan simbolis dan menolak/some/where/is/my/file
. Bind mount dapat mengatasi hal ini: bind-mount/some/where/is/my
to/else/where/is/my
, dan kemudianrealpath
akan melaporkan/else/where/is/my/file
berada di bawah/else/where
, bukan di bawah/some/where
.Efek samping dari bind mounts
Traversal direktori rekursif
Jika Anda menggunakan bind mounts, Anda perlu menjaga aplikasi yang melintasi pohon sistem file secara rekursif, seperti cadangan dan pengindeksan (misalnya untuk membangun basis data lokasi ).
Biasanya, bind mounts harus dikecualikan dari traversal direktori rekursif, sehingga setiap pohon direktori hanya dilintasi satu kali, di lokasi asli. Dengan bindfs dan nullfs, konfigurasikan alat traversal untuk mengabaikan tipe sistem file ini, jika memungkinkan. Linux bind mounts tidak dapat dikenali seperti itu: lokasi baru sama dengan yang asli. Dengan Linux bind mounts, atau dengan alat yang hanya bisa mengecualikan lintasan dan bukan tipe sistem file, Anda perlu mengecualikan titik mount untuk bind mounts.
Traversals yang berhenti di batas filesystem (misalnya
find -xdev
,rsync -x
,du -x
, ...) secara otomatis akan berhenti ketika mereka menghadapi bindfs atau nullfs mount point, karena itu mount point adalah filesystem yang berbeda. Dengan Linux bind mounts, situasinya sedikit lebih rumit: ada batas sistem file hanya jika bind mount mencangkok sistem file yang berbeda, bukan jika itu mencangkok bagian lain dari sistem file yang sama.Melampaui ikatan mengikat
Bind mounts memberikan tampilan pohon direktori di lokasi yang berbeda. Mereka mengekspos file yang sama, mungkin dengan opsi mount yang berbeda dan (dengan bindf) kepemilikan dan izin yang berbeda. Filesystem yang menyajikan tampilan yang diubah dari pohon direktori disebut filesystem overlay atau filesystem stackable . Ada banyak filesystem overlay lainnya yang melakukan transformasi lebih lanjut. Berikut adalah beberapa yang umum. Jika case use yang Anda inginkan tidak tercakup di sini, periksa repositori sistem file FUSE .
Saring file yang terlihat
bindfs -r
, hanya sedikit lebih ringan.Union mounts - menghadirkan beberapa sistem file (disebut cabang ) di bawah satu direktori: jika
tree1
berisifoo
dantree2
mengandung,bar
maka tampilan gabungannya mengandung keduanyafoo
danbar
. File baru ditulis ke cabang tertentu, atau ke cabang yang dipilih menurut aturan yang lebih kompleks. Ada beberapa implementasi konsep ini, termasuk:Ubah nama file dan metadata
Lihat konten file yang diubah
Ubah cara konten disimpan
sumber
mount --bind /dir1 /dir1
harus dilakukan Apa bedanya dengan sumber dan target pemasangan berbeda?/proc/self/mountinfo
. Adapun chroot, dapat digunakan untuk isolasi, tetapi tidak dengan sendirinya. Anda tidak perlu me - mount namespace: chroot sudah cukup untuk bagian namespace filesystem. Anda perlu memastikan bahwa tidak ada proses dalam chroot yang berjalan sebagai pengguna yang sama dengan proses di luar chroot.Sederhana, ketika Anda menggunakan bind mount, file atau direktori pada mesin host dipasang ke wadah sehingga perubahan apa pun yang dilakukan di dalam direktori file pada mesin host akan secara otomatis tersedia di dalam wadah pada direktori.
sumber