Apa perbedaan antara ln -s dan mount --bind?

36

Saya mencoba memahami perbedaan antara menggunakan ln -sdan mount --bind. Dalam skenario dasar saya dapat menggunakan keduanya untuk mengakses satu direktori dari tempat lain. Dalam skenario apa keduanya akan berperilaku berbeda?

Łukasz
sumber
7
Saya harus memperingatkan terhadap rm -ra mount --bind. Dengan a ln, ia menghapus tautan, sedangkan untuk a --bind, ia memiliki efek yang sama dengan menjalankan rm -rtarget. Tidak bagus, seperti yang saya temukan sesaat sebelum membangun kembali salah satu server saya ...
Mark K Cowan
@MarkKCowan itu benar, kecuali jika Anda membuat tautan keras .
JohnnyQ
@JohnnyQ Tidak dapat direktori hardlink
Mark K Cowan

Jawaban:

33

Mereka akan berperilaku berbeda dalam setidaknya dua kasus:

  • Dalam chroot , jika target tautan di luar chroot, tautannya akan mati. Bind mount masih dapat diakses.
  • Beberapa program dapat membedakan antara tautan simbolik dan direktori atau file aktual. Beberapa (jika ada) dapat membedakan antara direktori atau file dan yang dipasang di sana. Ini juga meluas ke tautan simbolis ke sesuatu ( A) yang memiliki sesuatu yang lain ( B) dipasang pada mereka. Tautan akan menampilkan konten target pemasangan ( B) alih-alih yang asli ( A).

Selain itu, Anda dapat mengikat mount direktori atau file pada direktori atau file yang ada, menutupi konten asli (membuat konten asli tidak dapat diakses kecuali yang asli diikat dipasang di tempat lain). Tautan simbolik mensyaratkan bahwa dokumen asli dipindahkan atau dihapus.

muru
sumber
16

Nah, ln -sbuat tautan simbolik, sedangkan mount --bindbuat gunung.

Tautan simbolik adalah jenis file khusus. Jika Anda melakukannya ln -s /var/target /var/link, maka /var/linkakan ada file yang berisi path " /var/target" di dalamnya. Satu-satunya perbedaan antara tautan simbolik dan file biasa adalah ketika sebuah program mencoba melakukan operasi pada tautan simbolik, operasi biasanya dilakukan pada target alih-alih file. Jadi sekarang jika Anda melakukannya ls /var/link, lsprogram akan mencoba untuk mendapatkan daftar direktori untuk /var/link, tetapi sebenarnya akan mendapatkan daftar direktori sebagai /var/targetgantinya.

Tautan simbolik masih berupa file. Mereka dapat diubah namanya dan dihapus dan semua jazz itu. Perhatikan bahwa Anda tidak dapat membuat tautan simbolik (atau file biasa, dalam hal ini) yang disebut /var/linkjika sudah ada file yang dipanggil /var/link; Anda harus menyingkirkannya terlebih dahulu.

Mount bukanlah file; itu adalah catatan yang disimpan dalam memori kernel. Jika Anda melakukannya mount --bind /var/target /var/mount, kernel akan mencatat fakta yang /var/mountsekarang menjadi nama baru untuk /var/target. (Saya tidak tahu detailnya; khususnya, saya tidak tahu apakah memasang sesuatu di subdirektori /var/targetakan membuatnya muncul /var/mountjuga, atau mengapa atau mengapa tidak. Pengeditan untuk jawaban ini akan dihargai.) Jadi sekarang jika Anda melakukannya ls /var/mount, hal yang sama akan terjadi seolah-olah Anda melakukannya ls /var/target, karena /var/mountdan /var/targetmerupakan direktori yang sama.

Mount bukan file. Saya tidak tahu apa yang akan terjadi jika Anda mencoba mengubah nama atau menghapus /var/mount. Perhatikan bahwa Anda tidak dapat memasang apa pun /var/mount kecuali jika sudah ada direktori di /var/mount.

Tanner Swett
sumber
1
Saya belum pernah menggunakan mount --bind, tapi saya ragu ini bisa meniru perilaku symlink ln -s ../../myfile .. Jika Anda memindahkannya ke direktori lain, itu akan menunjuk ke tempat lain karena itu adalah tautan relatif. Ini bisa berguna jika Anda perlu membuat cadangan sub-pohon dan masih memiliki tautan yang berfungsi di cadangan.
Joe
10

Selain itu, ln -s akan selamat dari reboot; sedangkan mount --bind tidak akan, kecuali jika Anda mengedit / etc / fstab untuk membuatnya persisten.

Mark Williams
sumber
2

Selain jawaban lainnya. Sistem tidak mengizinkan tautan keras ke direktori:

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

Mount memungkinkan Anda membuat tautan seperti dua atau lebih nama untuk satu inode yang sama :

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(Satu dapat menemukannya membantu untuk snapshot-backup dengan rsync versi lama.)

Perhatikan juga bahwa pemasangan ini tidak lengkap:

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

Jadi, mount masih membaca dan menulis walaupun saya meminta opsi ro (read only).

Udi
sumber