GNU/Linux >> Belajar Linux >  >> Linux

Gunung Pengikat?

Apa itu "ikatan pengikat"? Bagaimana cara membuatnya? Apa gunanya?

Saya telah diberitahu untuk menggunakan bind mount untuk sesuatu, tetapi saya tidak mengerti apa itu atau bagaimana menggunakannya.

Jawaban yang Diterima:

Apa itu pengikatan?

ikatan pengikat adalah tampilan alternatif dari pohon direktori. Secara klasik, pemasangan membuat tampilan perangkat penyimpanan sebagai pohon direktori. Sebagai gantinya, pengikatan mount mengambil pohon direktori yang ada dan mereplikasinya di bawah titik yang berbeda. Direktori dan file di bind mount sama dengan aslinya. Setiap modifikasi di satu sisi akan segera direfleksikan di sisi lain, karena kedua 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, yaitu konten /some/where . (Jika /else/where tidak kosong, konten sebelumnya sekarang disembunyikan.)

Tidak seperti tautan keras atau tautan simbolik, pengikatan tidak memengaruhi apa yang disimpan di sistem file. Ini adalah properti dari sistem live.

Bagaimana cara membuat pengikatan?

bindfs

bindfs filesystem adalah sistem file FUSE yang membuat tampilan pohon direktori. Misalnya, perintah

bindfs /some/where /else/where

membuat /else/where titik mount di mana isi /some/where terlihat.

Karena bindfs adalah sistem file terpisah, file /some/where/foo dan /else/where/foo muncul sebagai file yang berbeda untuk aplikasi (filesystem bindfs memiliki st_dev-nya sendiri nilai). Setiap perubahan di satu sisi "secara ajaib" tercermin di sisi lain, tetapi fakta bahwa file-file tersebut sama hanya terlihat ketika seseorang mengetahui bagaimana bindfs beroperasi.

Bindfs tidak memiliki pengetahuan tentang titik mount, jadi jika ada titik mount di bawah /some/where , tampaknya hanya sebagai direktori lain di bawah /else/where . Memasang atau melepas sistem file di bawah /some/where muncul di bawah /else/where sebagai perubahan direktori yang sesuai.

Bindfs dapat mengubah beberapa metadata file:itu dapat menunjukkan izin dan kepemilikan palsu untuk file. Lihat manual untuk detailnya, dan lihat di bawah untuk contoh.

Sistem file bindfs dapat dipasang sebagai pengguna non-root, Anda hanya perlu hak istimewa untuk memasang sistem file FUSE. Tergantung pada distribusi Anda, ini mungkin memerlukan fuse grup atau diizinkan untuk semua pengguna. Untuk melepas sistem file FUSE, gunakan fusermount -u bukannya umount , misalnya

fusermount -u /else/where

nol

FreeBSD menyediakan nullfs sistem file yang membuat tampilan 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 mount di mana isi /some/where terlihat.

Karena nullfs adalah sistem file terpisah, file /some/where/foo dan /else/where/foo muncul sebagai file yang berbeda untuk aplikasi (filesystem nullfs memiliki st_dev sendiri nilai). Setiap perubahan di satu sisi "secara ajaib" tercermin di sisi lain, tetapi fakta bahwa file-file tersebut sama hanya terlihat ketika seseorang mengetahui bagaimana nullfs beroperasi.

Tidak seperti FUSE bindfs, yang bekerja pada level pohon direktori, nullf FreeBSD bekerja lebih dalam di kernel, jadi mount point di bawah /else/where tidak terlihat:hanya pohon yang merupakan bagian dari titik pemasangan yang sama dengan /some/where tercermin di bawah /else/where .

Sistem file nullfs mungkin dapat digunakan pada varian BSD lainnya (OS X, OpenBSD, NetBSD) tetapi tidak dikompilasi sebagai bagian dari sistem default.

Linux bind mount

Di Linux, bind mount tersedia sebagai fitur kernel. Anda dapat membuatnya dengan mount perintah, dengan meneruskan --bind opsi baris perintah atau bind opsi pemasangan. 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 dalam kasus sistem file on-disk, tetapi direktori yang ada. Titik pemasangan /else/where harus menjadi direktori yang ada seperti biasa. Perhatikan bahwa tidak ada tipe filesystem yang ditentukan dengan cara apa pun:membuat mount bind tidak melibatkan driver filesystem, ini 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 harus berupa file biasa juga).

Binding mount Linux sebagian besar tidak dapat dibedakan dari aslinya. Perintah df -T /else/where menunjukkan perangkat yang sama dan jenis sistem file yang sama dengan df -T /some/where . File /some/where/foo dan /else/where/foo tidak dapat dibedakan, seolah-olah itu adalah tautan keras. Dimungkinkan untuk melepas /some/where , dalam hal ini /else/where tetap terpasang.

Dengan kernel yang lebih lama (saya tidak tahu persis kapan, saya pikir sampai sekitar 3.x), bind mount benar-benar tidak dapat dibedakan dari aslinya. Kernel terbaru melacak pengikatan mount dan mengekspos informasi melalui PID /mountinfo, yang memungkinkan findmnt untuk menunjukkan pengikatan mount seperti itu.

Anda dapat meletakkan entri bind mount di /etc/fstab . Cukup sertakan bind (atau rbind dll.) dalam opsi, bersama dengan opsi lain yang Anda inginkan. "Perangkat" adalah pohon yang ada. Kolom sistem file dapat berisi none atau bind (diabaikan, tetapi menggunakan nama sistem file akan membingungkan). Misalnya:

/some/where /readonly/view none bind,ro

Jika ada titik pemasangan di bawah /some/where , isinya tidak terlihat di bawah /else/where . Alih-alih bind , Anda dapat menggunakan rbind , juga tiru titik pemasangan di bawah /some/where . Misalnya, 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 mengizinkan mount dideklarasikan sebagai dibagikan , budak , pribadi atau tidak dapat diikat . Ini memengaruhi apakah operasi pemasangan itu tercermin di bawah pemasangan pengikat yang mereplikasi titik pemasangan. Untuk detail lebih lanjut, lihat dokumentasi kernel.

Linux juga menyediakan cara untuk memindahkan tunggangan:di mana --bind salinan, --move memindahkan titik pemasangan.

Dimungkinkan untuk memiliki opsi mount yang berbeda di dua direktori yang dipasang di bind. Namun, ada kekhasan:membuat pengikatan mount dan pengaturan opsi mount tidak dapat dilakukan secara atom, mereka harus menjadi dua operasi berturut-turut. (Kernel lama tidak mengizinkan ini.) Misalnya, perintah berikut membuat tampilan hanya baca, tetapi ada jendela waktu kecil di mana /else/where adalah baca-tulis:

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

Saya tidak bisa mengaktifkan pengikatan!

Jika sistem Anda tidak mendukung FUSE, trik klasik untuk mencapai efek yang sama adalah dengan menjalankan server NFS, membuatnya mengekspor file yang ingin Anda ekspos (memungkinkan akses ke localhost ) dan pasang di mesin yang sama. Ini memiliki overhead yang signifikan dalam hal memori dan kinerja, jadi pengikatan mount memiliki keuntungan pasti jika tersedia (yang ada di sebagian besar varian Unix berkat FUSE).

Terkait:Bagaimana cara men-debug skrip bash?

Kasus penggunaan

Tampilan hanya baca

Akan berguna untuk membuat tampilan sistem file hanya-baca, baik untuk alasan keamanan atau hanya sebagai lapisan keamanan untuk memastikan bahwa Anda tidak akan memodifikasinya secara tidak sengaja.

Dengan bindfs:

bindfs -r /some/where /mnt/readonly

Dengan Linux, cara sederhananya:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

Ini menyisakan interval waktu yang singkat selama /mnt/readonly adalah baca-tulis. Jika ini adalah masalah keamanan, pertama-tama buat mount bind 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 bahwa /root/private (direktori di atas titik pemasangan) bersifat pribadi; izin asli di /root/private/mnt tidak relevan karena tersembunyi di balik titik pemasangan.

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 ulang pengguna dan grup

Filesystem merekam pengguna dan grup berdasarkan ID numerik mereka. Terkadang Anda berakhir dengan beberapa sistem yang menetapkan ID pengguna 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 membuat disk tersebut 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 sebagai milik Alice (karena ID pengguna adalah 1000).

Anda dapat menggunakan bindfs untuk memetakan ulang ID pengguna. Pertama-tama pasang partisi disk di direktori pribadi, di mana hanya root yang dapat mengaksesnya. Kemudian buat tampilan bindfs di area publik, dengan pemetaan ulang ID pengguna dan ID grup 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 cara mengakses file yang diizinkan di folder beranda pengguna sistem yang tidak di-boot? dan mount –bind user lain seperti saya contoh lainnya.

Memasang di penjara atau wadah

Penjara atau wadah chroot menjalankan proses di subpohon dari pohon direktori sistem. Ini berguna untuk menjalankan program dengan akses terbatas, mis. menjalankan server jaringan dengan akses hanya ke filenya sendiri dan file yang dilayaninya, tetapi tidak ke data lain yang disimpan di komputer yang sama). Keterbatasan chroot adalah bahwa program terbatas pada satu subpohon:ia tidak dapat mengakses subpohon independen. Bind mount memungkinkan pencangkokan subpohon lain ke pohon utama itu. Ini menjadikannya dasar untuk penggunaan container yang paling praktis di Linux.

Misalnya, anggaplah sebuah 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 layanan dapat dibatasi? Satu kemungkinan adalah membuat tautan keras ke semua file yang dibutuhkan layanan (setidaknya /usr/sbin/somethingd dan beberapa perpustakaan bersama) di bawah /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 &

Ruang nama mount Linux menggeneralisasi chroot. Bind mount 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 lain dari chroot adalah untuk menginstal distribusi yang berbeda dalam direktori dan menjalankan program darinya, bahkan ketika mereka memerlukan file di jalur hard-coded yang tidak ada atau memiliki konten yang 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 diuji fitur terbaru sambil mempertahankan sistem dasar yang stabil, dll. Lihat Bagaimana cara menjalankan program 32-bit pada Debian/Ubuntu 64-bit? untuk contoh di Debian/Ubuntu.

Misalkan Anda memiliki instalasi paket terbaru distribusi Anda di bawah direktori /f/unstable , tempat Anda menjalankan program dengan beralih ke direktori tersebut dengan chroot /f/unstable . Untuk membuat direktori home tersedia dari instalasi ini, ikat mount ke dalam chroot:

mount --bind /home /f/unstable/home

Program schroot melakukan ini secara otomatis.

Mengakses file yang tersembunyi di balik titik pemasangan

Saat Anda memasang sistem file pada direktori, ini menyembunyikan apa yang ada di balik direktori. File dalam direktori itu menjadi tidak dapat diakses sampai direktori dilepas. Karena nullfs BSD dan mount bind Linux beroperasi pada tingkat yang lebih rendah daripada infrastruktur mount, mount nullfs atau mount bind dari sistem file memperlihatkan direktori yang tersembunyi di balik submount di aslinya.

Terkait:Perbarui nilai file menggunakan informasi dari file lain?

Misalnya, Anda memiliki sistem file tmpfs yang dipasang di /tmp . Jika ada file di bawah /tmp ketika sistem file tmpfs dibuat, file-file ini mungkin masih ada, secara efektif tidak dapat diakses tetapi menghabiskan ruang disk. Jalankan

mount --bind / /mnt

(Linux) atau

mount -t nullfs / /mnt

(FreeBSD) untuk membuat tampilan sistem file root di /mnt . Direktori /mnt/tmp adalah yang berasal dari sistem file root.

NFS mengekspor di jalur yang berbeda

Beberapa server NFS (seperti server NFS kernel Linux sebelum NFSv4) selalu mengiklankan lokasi direktori sebenarnya ketika mereka mengekspor direktori. Yaitu, ketika klien meminta server:/requested/location , server melayani pohon di lokasi /requested/location . Terkadang diinginkan untuk mengizinkan klien meminta /request/location tetapi sebenarnya menyajikan file di bawah /actual/location . Jika server NFS Anda tidak mendukung penyajian lokasi alternatif, Anda dapat membuat pengikatan untuk permintaan yang diharapkan, mis.

/requested/location *.localdomain(rw,async)

di /etc/exports dan berikut ini di /etc/fstab :

/actual/location /requested/location bind bind

Pengganti tautan simbolik

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 simbolik dan menolak /some/where/is/my/file . Bind mount dapat mengatasi ini:bind-mount /some/where/is/my ke /else/where/is/my , lalu realpath akan melaporkan /else/where/is/my/file berada di bawah /else/where , bukan di bawah /some/where .

Efek samping pengikatan pengikat

Perjalanan direktori rekursif

Jika Anda menggunakan bind mount, Anda perlu menangani aplikasi yang melintasi pohon sistem file secara rekursif, seperti pencadangan dan pengindeksan (mis. untuk membangun basis data lokasi).

Biasanya, pengikatan mount harus dikecualikan dari traversal direktori rekursif, sehingga setiap pohon direktori hanya dilintasi sekali, di lokasi aslinya. Dengan bindfs dan nullfs, konfigurasikan alat traversal untuk mengabaikan tipe sistem file ini, jika memungkinkan. Binding mount Linux tidak dapat dikenali seperti itu:lokasi baru setara dengan yang asli. Dengan mount bind Linux, atau dengan alat yang hanya dapat mengecualikan jalur dan bukan tipe sistem file, Anda perlu mengecualikan titik mount untuk mount bind.

Traversal yang berhenti pada batas sistem file (mis. find -xdev , rsync -x , du -x , ...) secara otomatis akan berhenti ketika mereka menemukan titik mount bindfs atau nullfs, karena titik mount itu adalah sistem file yang berbeda. Dengan mount bind Linux, situasinya sedikit lebih rumit:ada batas sistem file hanya jika mount bind mencangkok sistem file yang berbeda, bukan jika mencangkok bagian lain dari sistem file yang sama.

Melampaui pengikatan mount

Bind mount memberikan tampilan pohon direktori di lokasi yang berbeda. Mereka mengekspos file yang sama, mungkin dengan opsi pemasangan yang berbeda dan (dengan bindfs) kepemilikan dan izin yang berbeda. Sistem file yang menampilkan tampilan pohon direktori yang diubah disebut sistem file overlay atau sistem file yang dapat ditumpuk . Ada banyak sistem file overlay lain yang melakukan transformasi lebih lanjut. Berikut adalah beberapa yang umum. Jika kasus penggunaan yang Anda inginkan tidak tercakup di sini, periksa repositori sistem file FUSE.

  • loggedfs — mencatat semua akses sistem file untuk keperluan debugging atau pemantauan (sintaks file konfigurasi, Apakah mungkin untuk mengetahui program atau skrip apa yang membuat file tertentu?, Daftar file yang diakses oleh suatu program)

Filter 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 mount — menghadirkan beberapa filesystem (disebut branch ) di bawah satu direktori:if tree1 berisi foo dan tree2 berisi bar maka tampilan gabungan mereka berisi foo dan bar . File baru ditulis ke cabang tertentu, atau ke cabang yang dipilih menurut aturan yang lebih kompleks. Ada beberapa implementasi dari konsep ini, antara lain:

    • aufs — Implementasi kernel Linux, tetapi ditolak upstream berkali-kali
    • funionfs — implementasi FUSE
    • mhddfs — FUSE, tulis file ke cabang berdasarkan ruang kosong
    • overlay — Implementasi kernel Linux, digabung upstream di Linux v3.18
    • unionfs-fuse — FUSE, dengan fitur caching dan copy-on-write

Ubah nama file dan metadata

  • ciopfs — nama file peka huruf besar/kecil (dapat berguna untuk memasang sistem file Windows)
  • convmvfs — mengonversi nama file antar set karakter (contoh)
  • posixovl — menyimpan nama file Unix dan metadata lainnya (izin, kepemilikan, ...) pada sistem file yang lebih terbatas seperti VFAT (contoh)

Melihat konten file yang diubah

  • avfs — untuk setiap file arsip, tampilkan direktori dengan konten arsip (contoh, lebih banyak contoh). Ada juga banyak sistem file FUSE yang mengekspos arsip tertentu sebagai direktori.
  • fuseflt — menjalankan file melalui saluran pipa saat membacanya, mis. untuk mengkode ulang file teks atau file media (contoh)
  • lzopfs — dekompresi transparan file terkompresi
  • mp3fs — mentranskode file FLAC ke MP3 saat dibaca (contoh)
  • scriptfs — menjalankan skrip untuk menyajikan konten (semacam CGI lokal) (contoh)

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 — simpan salinan semua versi file

Linux
  1. Bash =~ Regex Dan Https://regex101.com/?

  2. Bagaimana Cara Mengubah Mount Points?

  3. Bind mount di Linux

  1. Django static_root di /var/www/... - tidak ada izin untuk mengumpulkan statis

  2. Bagaimana cara memigrasikan server BIND DNS ke perangkat keras baru?

  3. /sys/ dokumentasi?

  1. gema atau cetak /dev/stdin /dev/stdout /dev/stderr

  2. Haruskah situs web berada di /var/ atau /usr/ sesuai dengan penggunaan yang disarankan?

  3. Sedikit ruang dalam / jalankan