Symlinks memiliki batasan dalam bagaimana fungsi suka ls
,, mv
dan cp
dapat 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 --bind
opsi 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 --bind
opsi 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?
Jawaban:
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 denganfind
,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.sumber
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.
sumber
df
di 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.)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.
sumber
Saya telah mencoba mengikat me-mount untuk solusi masalah menginstal beberapa paket dengan
pacman
(archlinux, tentang itu di sini ) pada sistem mana/var
(serta/home
dan/usr/local
) adalah symlink (di filesystem: SSD untuk SATA).Itu tampak hebat pada awalnya, tetapi, seperti yang ditunjukkan Gilles,
locate
selalu memberikan banyak hasil untuk satu file, meskipun adaPRUNE_BIND_MOUNTS = "yes"
garis masuk/etc/updatedb.conf
.Menggali lebih jauh, saya menemukan bahwa bind mount yang lebih kompleks dapat dipangkas dengan benar:
Tanpa opsi PRUNE_BIND_MOUNT, saya akan mendapatkan 3 hasil:
Masalah lain dengan bind mounts:
Tentu saja, seseorang dapat secara manual menambahkan bind mount (mounpoint atau target) ke
PRUNEPATHS
dalam/etc/updatedb.conf
.Juga,
mountpoint
dan berbagaistat
perintah atau fungsi dapat digunakan dalam alat untuk meningkatkan traversal sistem file seperti yang diusulkan di sinisumber
Ketika datang ke file bind mounts, mereka berperilaku lebih dekat dengan tautan keras daripada symlink. Ini dapat memiliki konsekuensi yang agak halus, misalnya:
Sejauh ini bagus, tetapi sekarang pertimbangkan berapa banyak program (editor, skrip yang ditulis dengan benar, dll.) Yang benar-benar memodifikasi file:
Jika
2.txt
telah menjadi symlink1.txt
maka perintah terakhir akan memiliki output1new
, yang mungkin diharapkan.Ini dapat menyebabkan beberapa masalah halus: di systemd saya gunakan
BindReadOnlyPaths=
untuk membuat layanan tertentu menggunakanresolv.conf
file yang berbeda dari sisa sistem, tetapi itu ternyata bersisik dalam cara yang aneh dan sulit untuk mendiagnosis karenaresolvconf
akan mengganti file sumber di belakang layanan kembali.sumber