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.
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.
Jawaban:
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
mount --bind /some/where /else/where
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.
The bindfs
filesystem adalah FUSE filesystem yang menciptakan pemandangan pohon direktori. Misalnya, perintahnya
bindfs /some/where /else/where
membuat /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 memiliki st_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, gunakan fusermount -u
sebagai ganti umount
, mis
fusermount -u /else/where
FreeBSD menyediakan sistem nullfs
file yang menciptakan pandangan alternatif dari sistem file. Dua perintah berikut ini setara:
mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where
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 memiliki st_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.
Di Linux, bind mounts tersedia sebagai fitur kernel. Anda bisa membuatnya dengan mount
perintah, dengan melewatkan --bind
opsi baris perintah atau bind
opsi mount. Dua perintah berikut ini setara:
mount --bind /some/where /else/where
mount -o bind /some/where /else/where
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 sama df -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 sertakan bind
(atau rbind
dll.) Dalam opsi, bersama dengan opsi lain yang Anda inginkan. "Perangkat" adalah pohon yang ada. Kolom filesystem dapat berisi none
atau bind
(diabaikan, tetapi menggunakan nama filesystem akan membingungkan). Sebagai contoh:
/some/where /readonly/view none bind,ro
Jika ada mount point di bawah /some/where
, isinya tidak terlihat di bawah /else/where
. Alih-alih bind
, Anda dapat menggunakan rbind
, juga mereplikasi titik mount di bawahnya /some/where
. Sebagai contoh, jika /some/where/mnt
adalah titik mount maka
mount --rbind /some/where /else/where
setara dengan
mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt
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:
mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where
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).
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:
bindfs -r /some/where /mnt/readonly
Dengan Linux, caranya sederhana:
mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly
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.
mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly
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.
mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk
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.
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:
mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &
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.
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 itu chroot /f/unstable
. Untuk membuat direktori home tersedia dari instalasi ini, ikat mount ke chroot:
mount --bind /home /f/unstable/home
Schroot program melakukan ini secara otomatis.
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
mount --bind / /mnt
(Linux) atau
mount -t nullfs / /mnt
(FreeBSD) untuk membuat tampilan sistem file root di /mnt
. Direktori /mnt/tmp
adalah direktori dari sistem berkas root.
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, misalnya
/requested/location *.localdomain(rw,async)
di /etc/exports
dan yang berikut di /etc/fstab
:
/actual/location /requested/location bind bind
Terkadang Anda ingin membuat tautan simbolis untuk membuat file /some/where/is/my/file
muncul di bawah /else/where
, tetapi aplikasi yang menggunakan file
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 kemudian realpath
akan melaporkan /else/where/is/my/file
berada di bawah /else/where
, bukan di bawah /some/where
.
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.
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 .
bindfs -r
, hanya sedikit lebih ringan.Union mounts - menghadirkan beberapa sistem file (disebut cabang ) di bawah satu direktori: jika tree1
berisi foo
dan tree2
mengandung, bar
maka tampilan gabungannya mengandung keduanya foo
dan bar
. File baru ditulis ke cabang tertentu, atau ke cabang yang dipilih menurut aturan yang lebih kompleks. Ada beberapa implementasi konsep ini, termasuk:
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.