Apa itu bind mount?

325

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.

Gilles
sumber
2
klarifikasi alternatif yang berguna antara mount dan symlink: quora.com/...
Charlie Parker

Jawaban:

564

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

mount --bind /some/where /else/where

direktori /some/wheredan /else/wherememiliki 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 bindfsfilesystem adalah FUSE filesystem yang menciptakan pemandangan pohon direktori. Misalnya, perintahnya

bindfs /some/where /else/where

membuat /else/wheretitik mount di mana konten /some/whereterlihat.

Karena bindfs adalah sistem file yang terpisah, file /some/where/foodan /else/where/foomuncul sebagai file yang berbeda untuk aplikasi (sistem file bindf memiliki st_devnilai 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/wheremuncul di bawah /else/wheresebagai 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 fusegrup atau diizinkan untuk semua pengguna. Untuk melepas sistem file FUSE, gunakan fusermount -usebagai ganti umount, mis

fusermount -u /else/where

nullfs

FreeBSD menyediakan sistem nullfsfile 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/wheremenjadi titik pemasangan di mana konten /some/whereterlihat.

Karena nullfs adalah sistem file yang terpisah, file /some/where/foodan /else/where/foomuncul sebagai file yang berbeda untuk aplikasi (sistem file nullfs memiliki st_devnilai 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/wheretidak terlihat: hanya pohon yang merupakan bagian dari titik mount yang sama seperti /some/whereyang 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 mountperintah, dengan melewatkan --bindopsi baris perintah atau bindopsi mount. Dua perintah berikut ini setara:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

Di sini, "perangkat" /some/wherebukan partisi disk seperti pada sistem file pada disk, tetapi direktori yang ada. Mount point /else/whereharus 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 --bindjuga mendukung pemasangan non-direktori ke non-direktori: /some/wheredapat berupa file biasa (dalam hal ini /else/whereperlu file biasa juga).

Bind mount Linux sebagian besar tidak dapat dibedakan dari aslinya. Perintah df -T /else/wheremenunjukkan perangkat yang sama dan jenis sistem file yang sama df -T /some/where. File-file /some/where/foodan /else/where/footidak bisa dibedakan, seolah-olah mereka adalah tautan keras. Dimungkinkan untuk melepas /some/where, dalam hal ini /else/wheretetap 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 findmntuntuk mengindikasikan bind mount seperti itu .

Anda dapat memasukkan entri mount bind /etc/fstab. Cukup sertakan bind(atau rbinddll.) Dalam opsi, bersama dengan opsi lain yang Anda inginkan. "Perangkat" adalah pohon yang ada. Kolom filesystem dapat berisi noneatau 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/mntadalah 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 --bindsalinan, --movememindahkan 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/whereread-write:

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

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:

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/readonlybaca-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/mnttidak 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

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.

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.

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/somethingdyang 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/somethingddan 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/somethingdan /usrberada 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.

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 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.

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 /tmpketika 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/tmpadalah 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/locationtetapi 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/exportsdan yang berikut di /etc/fstab:

/actual/location /requested/location bind bind

Pengganti untuk tautan simbolik

Terkadang Anda ingin membuat tautan simbolis untuk membuat file /some/where/is/my/filemuncul di bawah /else/where, tetapi aplikasi yang menggunakan filememperluas tautan simbolis dan menolak /some/where/is/my/file. Bind mount dapat mengatasi hal ini: bind-mount /some/where/is/myto /else/where/is/my, dan kemudian realpathakan melaporkan /else/where/is/my/fileberada 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

  • clamfs - menjalankan file melalui pemindai virus saat dibaca
  • filterfs - menyembunyikan bagian dari sistem file
  • rofs - tampilan hanya baca. Mirip dengan bindfs -r, hanya sedikit lebih ringan.
  • Union mounts - menghadirkan beberapa sistem file (disebut cabang ) di bawah satu direktori: jika tree1berisi foodan tree2mengandung, barmaka tampilan gabungannya mengandung keduanya foodan bar. 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

  • ciopfs - nama file case-insensitive (dapat berguna untuk me-mount sistem file Windows)
  • convmvfs - mengonversi nama file di antara set karakter ( contoh )
  • posixovl - menyimpan nama file Unix dan metadata lainnya (izin, kepemilikan, ...) pada sistem file yang lebih terbatas seperti VFAT ( contoh )

Lihat konten file yang diubah

Ubah cara konten disimpan

  • chironfs - mereplikasi file ke beberapa penyimpanan yang mendasarinya ( RAID-1 di tingkat pohon direktori )
  • copyfs - menyimpan salinan semua versi file
  • encfs - mengenkripsi file
  • pcachefs - lapisan cache pada disk untuk sistem file jarak jauh yang lambat
  • simplecowfs - menyimpan perubahan melalui tampilan yang disediakan di memori, membiarkan file asli tetap utuh
  • wayback - menyimpan salinan semua versi file
Gilles
sumber
1
orang mungkin ingin menambahkan contoh bagaimana melakukannya dengan systemd: utcc.utoronto.ca/~cks/space/blog/linux/SystemdBindMountUnits
dothebart
1
Apa yang mount --bind /dir1 /dir1harus dilakukan Apa bedanya dengan sumber dan target pemasangan berbeda?
Mark
Saya tidak melihat catatan di / proc / self / mountinfo, menggunakan linux 5.0. Kernel tidak memberi tahu saya itu bind mount atau tidak. Dan sebuah proses dapat dengan mudah memecah chroot, isolasi harus dilakukan oleh mount namespace.
炸鱼 薯条 德里克
@ 炸鱼 薯条 德里克 Saya pikir pertanyaan terkait alamat unix.stackexchange.com/questions/295525/…/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.
Gilles
@Mark Bind-mount direktori ke dirinya sendiri tidak terlalu berguna. Saya kira Anda dapat menggunakannya untuk menyembunyikan filesystem yang dipasang di bawah direktori tertentu, tetapi saya tidak dapat memikirkan saat ketika saya ingin melakukannya secara khusus.
Gilles
-1

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.

srinivas
sumber
Itu salah satu cara untuk menggunakan bind mount, tetapi bind mount sendiri tidak ada hubungannya dengan kontainer. Saya menyebutkannya dalam jawaban saya, tetapi dengan nama "penjara" bukan "wadah"; menambahkan "wadah" akan menjadi suntingan yang berharga (saya akan melakukannya). Ini juga deskripsi yang buruk: mengapa menyebutkan bahwa perubahan yang dilakukan di luar juga tersedia di dalam tanpa menyebutkan sebaliknya?
Gilles