Apakah ada kelemahan menggunakan mount --bind sebagai pengganti tautan simbolik?

55

Symlinks memiliki batasan dalam bagaimana fungsi suka ls,, mvdan cpdapat beroperasi pada mereka karena tidak seperti perintah yang diinisiasi shell seperti cd, fungsi-fungsi ini tidak memiliki informasi tentang bagaimana pengguna mengakses direktori sehubungan dengan jalur logis (lihat posting terkait ). Sepertinya menggunakan mount --bindopsi sebagai gantinya dapat menyiasati hal ini, menawarkan peningkatan fungsionalitas dan kompatibilitas dengan samba dan server file lain karena direktori yang di-mount kemudian akan memiliki dua jalur fisik independen, alih-alih tautan.

Saya ingin mengganti semua tautan simbolis saya dengan referensi menggunakan mount --bindopsi tetapi ini berarti pemasangan lebih dari 150 poin di fstab. Apakah ada masalah kinerja yang berpotensi timbul dari ini atau kelemahan lain yang harus saya pertimbangkan?

mrtrujiyo
sumber
Sudahkah Anda mempertimbangkan untuk menggunakan tautan keras ?
ire_and_curses
1
@ire_and_curses Kebanyakan sistem mirip Unix melarang tautan keras, untuk alasan yang baik (dan untuk alasan yang sama, Anda seharusnya tidak pernah menggunakannya bahkan pada sistem di mana Anda dapat).
Eliah Kagan
3
@ire_and_curses: Untuk mengklarifikasi pernyataan Eliah, Anda tidak dapat membuat tautan keras ke direktori (walaupun HFS + mendukungnya, dengan cara). Dan membuat pohon rekursif dari tautan keras tidak membuat kedua jalur direktori tetap sinkron.
bahamat

Jawaban:

62

Dengan mount --bind, pohon direktori ada di dua (atau lebih) tempat di hierarki direktori. Ini dapat menyebabkan sejumlah masalah. Cadangan dan salinan file lainnya akan mengambil semua salinan. Menjadi sulit untuk menentukan bahwa Anda ingin menyalin sistem file: Anda akan berakhir menyalin file yang di-mount bind dua kali. Pencarian dengan find, grep -r, locate, dll, akan melintasi semua salinan, dan sebagainya.

Anda tidak akan mendapatkan "peningkatan fungsionalitas dan kompatibilitas" dengan bind mounts. Mereka terlihat seperti direktori lain, yang sebagian besar waktu bukan perilaku yang diinginkan. Sebagai contoh, Samba mengekspos tautan simbolik sebagai direktori secara default; tidak ada untungnya menggunakan bind mount. Di sisi lain, bind mounts dapat berguna untuk mengekspos hierarki direktori di atas NFS.

Anda tidak akan memiliki masalah kinerja dengan bind mounts. Apa yang akan Anda miliki adalah sakit kepala administrasi. Bind mounts memiliki kegunaannya, seperti membuat pohon direktori dapat diakses dari chroot, atau mengekspos direktori yang disembunyikan oleh titik mount (ini biasanya penggunaan sementara sementara struktur direktori sedang direnovasi). Jangan menggunakannya jika Anda tidak membutuhkannya.

Hanya root yang dapat memanipulasi bind mounts. Mereka tidak bisa digerakkan dengan cara biasa; mereka mengunci lokasi mereka dan direktori leluhur.

Secara umum, jika Anda mengirimkan tautan simbolik ke suatu perintah, perintah tersebut akan bertindak pada tautan itu sendiri jika beroperasi pada file, dan pada target tautan tersebut jika beroperasi pada konten file. Ini berlaku untuk direktori juga. Ini biasanya hal yang benar. Beberapa perintah memiliki opsi untuk link simbolik memperlakukan secara berbeda, misalnya ls -L, cp -d, rsync -l. Apa pun yang Anda coba lakukan, jauh lebih mungkin bahwa symlink adalah alat yang tepat, daripada bind mount menjadi alat yang tepat.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih. Saya kira saya tidak mempertimbangkan dampak pada cadangan, salinan, dan pencarian file. Saya bisa membuat Samba mengikuti symlinks dengan menambahkan 'follow symlinks = yes' di smb.conf tapi ini mengganggu keamanan di mana setiap pengguna samba dapat mengeksekusi katakan, 'ln -s / etc' di folder yang dapat ditulisi dan dapatkan akses ke file sistem. Saya mencoba mencari jalan keluar. Tolong beri tahu saya jika Anda mengetahuinya.
mrtrujiyo
2
@mrtrujiyo Untuk persyaratan itu, saya pikir masuk akal untuk menjalankan server samba di chroot, dan bind-mount direktori yang ingin Anda ekspor di dalam chroot itu. Pastikan untuk mengecualikan root chroot dari cadangan dan sebagainya (dengan organisasi ini, Anda hanya perlu mengecualikan direktori tingkat atas, sehingga tidak banyak sakit kepala pemeliharaan).
Gilles 'SO- stop being evil'
14

Selain apa yang ditulis @Gilles sebelumnya, perlu dicatat bahwa beberapa utilitas mungkin menganggap direktori bind-mount sebagai sistem file terpisah. Ini mungkin memiliki implikasi kinerja atau fungsionalitas jika program tidak lagi dapat berasumsi bahwa nomor inode yang sama merujuk ke file yang sama (jika tidak, jika mereka berada di sistem file yang berbeda), suatu langkah tidak dapat dioptimalkan sebagai tautan-at- target-lalu-batalkan tautan sumber, dll.

sebuah CVn
sumber
Terima kasih. Saya bertanya-tanya bagaimana utilitas sederhana seperti df dan du akan menangani perhitungan ukuran direktori pada filesystem dengan bind mounts.
mrtrujiyo
1
Setidaknya GNU dfdi sistem saya bahkan tidak menganggap direktori bind-mount secara default, tetapi jika ditanya secara spesifik, itu diperlakukan sebagai mount lain dari sistem file yang sama. (Yang, jika Anda bertanya kepada saya, perilaku yang diharapkan untuk alat dengan tujuan df.)
CVn
6

Anda juga harus menggunakan bind mounts alih-alih symlink ketika Anda mengandalkan dukungan yang mungkin tidak selalu ada (misalnya disk eksternal) dan Anda ingin memastikan bahwa struktur direktori asli ada di tempatnya bahkan jika dukungan tersebut gagal atau dihapus.

Sebagai contoh jika saya ingin menyimpan / var / tmp dalam kartu sd saya akan menggunakan bind mount, karena beberapa program akan mengharapkan / var / tmp menjadi direktori yang valid bahkan jika kartu dihapus.

TopperH
sumber
1

Saya telah mencoba mengikat me-mount untuk solusi masalah menginstal beberapa paket dengan pacman(archlinux, tentang itu di sini ) pada sistem mana /var(serta /homedan /usr/local) adalah symlink (di filesystem: SSD untuk SATA).

Itu tampak hebat pada awalnya, tetapi, seperti yang ditunjukkan Gilles, locateselalu memberikan banyak hasil untuk satu file, meskipun ada PRUNE_BIND_MOUNTS = "yes"garis masuk /etc/updatedb.conf.

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

Menggali lebih jauh, saya menemukan bahwa bind mount yang lebih kompleks dapat dipangkas dengan benar:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

Tanpa opsi PRUNE_BIND_MOUNT, saya akan mendapatkan 3 hasil:

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

Masalah lain dengan bind mounts:

Tentu saja, seseorang dapat secara manual menambahkan bind mount (mounpoint atau target) ke PRUNEPATHSdalam /etc/updatedb.conf.

Juga, mountpointdan berbagai statperintah atau fungsi dapat digunakan dalam alat untuk meningkatkan traversal sistem file seperti yang diusulkan di sini

Jalan berbatu
sumber
0

Ketika datang ke file bind mounts, mereka berperilaku lebih dekat dengan tautan keras daripada symlink. Ini dapat memiliki konsekuensi yang agak halus, misalnya:

# echo 1 > 1.txt
# touch 2.txt
# mount --bind 1.txt 2.txt
# cat 2.txt
1
# echo 1a > 1.txt
# cat 2.txt
1a

Sejauh ini bagus, tetapi sekarang pertimbangkan berapa banyak program (editor, skrip yang ditulis dengan benar, dll.) Yang benar-benar memodifikasi file:

# echo 1new > 1new.txt
# mv 1new.txt 1.txt
# cat 1.txt
1new
# cat 2.txt
1a

Jika 2.txttelah menjadi symlink 1.txtmaka perintah terakhir akan memiliki output 1new, yang mungkin diharapkan.

Ini dapat menyebabkan beberapa masalah halus: di systemd saya gunakan BindReadOnlyPaths=untuk membuat layanan tertentu menggunakan resolv.conffile yang berbeda dari sisa sistem, tetapi itu ternyata bersisik dalam cara yang aneh dan sulit untuk mendiagnosis karena resolvconfakan mengganti file sumber di belakang layanan kembali.

Etienne Dechamps
sumber