Mengapa tautan keras tidak diizinkan untuk direktori?

129

Saya menggunakan Ubuntu 12.04. Ketika saya mencoba membuat tautan keras untuk direktori apa pun, itu gagal. Saya dapat membuat tautan keras untuk file di dalam batas sistem file. Saya tahu alasan mengapa kami tidak dapat membuat hardlink untuk file di luar sistem file.

Saya mencoba perintah ini:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Saya hanya ingin tahu alasan di balik ini. Apakah sama untuk semua distro GNU / Linux dan citarasa Unix (BSD, Solaris, HP-UX, IBM AIX) atau hanya di Ubuntu atau Linux?

Nischay
sumber
2
Coba ln -F <src> <dst>dan mungkin berhasil. Tentu saja, ini digunakan untuk superuser di versi Unix yang lebih lama. Adakah yang ingat apakah itu UCB atau System V? Ya, hal-hal buruk bisa terjadi, tetapi biasanya tidak. Seingat saya, saya rmdirtahu untuk tidak terus menghapus tautan yang sulit. Namun, pengguna bisa menjadi bingung dan menghapus hal-hal yang salah.
Steve Pitchers
@StevePitchers Bagaimana cara rmdirmenangani tautan keras dengan cara khusus? Tautan keras hanyalah tautan biasa - tetapi tautan tambahan. Bahkan tidak mudah untuk mengetahui apakah ada tautan ekstra yang tidak biasa tanpa rekaman tambahan.
Volker Siegel
1
Setiap node menyimpan jumlah tautan keras yang mengarah ke sana: konten hanya dirilis setelah tidak ada tautan yang tersisa. Jadi rmdirbisa tahu apakah direktori tersebut memiliki tautan dari tempat lain. Penghapusan rekursif rm -r,, harus dikodekan dengan hati-hati, untuk memastikan itu akan bertindak dengan benar bahkan jika ada kesalahan seperti "izin ditolak". BTW, UCB = BSD, doh!
Steve Pitchers
2
Saya telah mengerjakan ln -Fdirektori dan membuatnya bekerja. Tetapi Anda tidak berani menghapus direktori setelahnya karena takut merusak sistem file.
Edward Falk

Jawaban:

159

Hardlink direktori memecah sistem file dengan berbagai cara

Mereka memungkinkan Anda untuk membuat loop

Tautan keras ke direktori dapat menautkan ke induknya sendiri, yang membuat loop sistem file. Misalnya, perintah ini dapat membuat lingkaran dengan tautan balik l:

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Sistem file dengan loop direktori memiliki kedalaman tak terbatas:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Menghindari infinite loop ketika melintasi struktur direktori semacam itu agak sulit (meskipun misalnya POSIX findharus menghindari ini).

Sistem file dengan jenis tautan keras ini bukan lagi pohon, karena pohon tidak boleh mengandung perulangan.

Mereka memecahkan ambiguitas direktori induk

Dengan loop sistem file, ada beberapa direktori induk:

cd /tmp/a/b
cd /tmp/a/b/l/b

Dalam kasus pertama, /tmp/aadalah direktori induk dari /tmp/a/b.
Dalam kasus kedua, /tmp/a/b/ladalah direktori induk dari /tmp/a/b/l/b, yang sama dengan /tmp/a/b.
Jadi ia memiliki dua direktori induk.

Mereka melipatgandakan file

File diidentifikasi oleh jalur, setelah menyelesaikan symlink. Begitu

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

adalah file yang berbeda.
Ada jauh lebih banyak jalur file. Mereka sama dalam hal jumlah inode mereka tentu saja. Tetapi jika Anda tidak secara eksplisit mengharapkan loop, tidak ada alasan untuk memeriksa itu.

Hardlink direktori juga dapat menunjuk ke direktori anak, atau direktori yang bukan anak atau orang tua dari kedalaman apa pun. Dalam hal ini, file yang merupakan anak dari tautan akan direplikasi ke dua file, diidentifikasi oleh dua jalur.

Contoh anda

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Bagaimana cara kerja tautan lunak ke direktori?

Jalur yang mungkin berisi softlink dan bahkan loop direktori lunak sering digunakan hanya untuk mengidentifikasi dan membuka file. Ini dapat digunakan sebagai jalur linear normal.

Tetapi ada situasi lain, ketika path digunakan untuk membandingkan file. Dalam hal ini, tautan simbolik di jalur dapat diselesaikan terlebih dahulu, mengubahnya menjadi minimal , dan representasi yang disepakati bersama membuat jalur kanonik :

Ini dimungkinkan, karena semua tautan lunak dapat diperluas ke jalur tanpa tautan. Setelah melakukan itu dengan semua tautan lunak di jalur, jalur yang tersisa adalah bagian dari pohon, di mana jalur selalu tidak ambigu.

Perintah readlinkdapat menyelesaikan jalur ke jalur kanoniknya:

$ readlink -f /some/symlinked/path

Tautan lunak berbeda dari apa yang digunakan sistem file

Tautan lunak tidak dapat menyebabkan semua masalah karena berbeda dari tautan di dalam sistem file. Itu dapat dibedakan dari tautan keras, dan diselesaikan ke jalur tanpa symlink jika diperlukan.
Dalam beberapa hal, menambahkan symlink tidak mengubah struktur sistem file dasar - ia tetap mempertahankannya, tetapi menambahkan lebih banyak struktur seperti lapisan aplikasi.


Dari man readlink:

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]
Volker Siegel
sumber
1
Mengapa tautan lunak tidak dapat melakukan semua ini?
Tanay
1
@Tanay Benar, ini bisa membantu ekspansi untuk membandingkannya dengan kasus serupa dengan tautan lunak. Saya akan mencoba.
Volker Siegel
Persisnya bagaimana ini hanya berkaitan dengan direktori? Cara saya memahaminya, masalah ini juga merupakan masalah untuk file yang di-hardlink juga. Selain itu, saya melihat hardlinking sebagai cara mudah untuk mengubah izin direktori yang diberikan untuk memungkinkan orang lain di dalam, tanpa harus mengizinkan mereka di dalam rantai induk juga. Kedengarannya sangat berguna jika Anda tidak memiliki kemampuan untuk menambah / memodifikasi grup ...
inetknght
jawaban yang bagus, tetapi kemudian ... bagaimana Apple memecahkan masalah ini untuk Time Machine?
Damien
Kedengarannya sangat menarik! Tapi saya tidak tahu apa masalahnya - bisakah Anda memberi saya petunjuk?
Volker Siegel
77

"Anda biasanya tidak boleh menggunakan tautan keras" terlalu luas. Anda perlu memahami perbedaan antara tautan keras dan tautan, dan gunakan masing-masing sesuai kebutuhan. Masing-masing dilengkapi dengan kelebihan dan kekurangan masing-masing:

Symlinks dapat:

  • Arahkan ke direktori
  • Arahkan ke objek yang tidak ada
  • Arahkan ke file dan direktori di luar sistem file yang sama

Tautan keras dapat:

  • Simpan file yang dirujuk agar tidak dihapus

Hard link sangat berguna dalam menjalankan aplikasi "copy on write". Mereka memungkinkan Anda untuk menyimpan salinan cadangan dari struktur direktori, sementara hanya menggunakan ruang untuk file yang berubah di antara dua versi.

Perintah cp -alini sangat berguna dalam hal ini. Itu membuat salinan lengkap dari struktur direktori, di mana semua file diwakili oleh tautan keras ke file asli. Anda kemudian dapat melanjutkan untuk memperbarui file dalam struktur, dan hanya file yang Anda perbarui akan mengambil ruang tambahan. Ini sangat berguna saat memelihara cadangan multigenerasi.

pengguna133232
sumber
41
mengenai paragraf terakhir, jika Anda mengedit file yang di- hard
link
32
Deskripsi tautan keras ini agak menyesatkan. Pada dasarnya benar bahwa tautan keras "menjaga file yang dirujuk agar tidak dihapus", tetapi itu hanyalah efek samping dari tautan keras. Tentunya TIDAK benar bahwa Anda dapat membuat tautan keras dalam satu direktori, mengubah file "asli", dan kemudian mengharapkan tautan keras tersebut entah bagaimana mengarah ke konten lama. Kenyataannya, kebenaran panduan dari tautan keras adalah fakta bahwa itu bukan tautan sama sekali, setidaknya tidak lebih dari "file" asli, yang hanya merupakan nama yang menunjuk ke sebuah file. Tautan keras hanyalah nama lain yang menunjuk ke file yang sama.
matty
7
Ide cadangan itu bagus dan saya benar-benar sering menggunakannya, tetapi saya pikir pengguna harus diingatkan bahwa mengubah file juga akan mengubah cadangan.
Mark
3
Heck, symlink tidak perlu menunjuk apa pun. ln -s "Don't use this directory" READMEitu sah. Bahkan, jika Anda memikirkannya, direktori dapat digunakan sebagai basis data relasional dan tidak mengandung file sebenarnya sama sekali.
Edward Falk
5
-1 Ini tidak menjawab pertanyaan, dan beberapa info jelas-jelas salah.
wjandrea
43

FYI, Anda dapat mencapai hal yang sama dengan tautan keras untuk direktori dengan menggunakan mount:

mount -t bind /var/www /home/user/workspace/www

Ini sangat berbahaya karena sebagian besar alat dan program tidak akan menyadari ikatannya . Saya pernah melakukan sesuatu seperti pada contoh di atas dan kemudian melanjutkan rm -rf /home/user. Untungnya, tidak ada yang relevan di dalamnya /var/www.

stackount
sumber
6
Saya sudah menggunakan mount --bind <src> <dest>. Gunakan dengan hati-hati untuk tidak menghapus src;)
kachar
1
Saya mendapatkan:mount: unknown filesystem type 'bind'
Wizek
4
di Busybox, itumount -o bind src dest
Mat M
@MatM sama dengan Debian
hanshenrik
2
Jika Anda hanya perlu me-mount untuk membaca, Anda dapat mengatur izin pada titik mount dan menghindari rm -rfmasalah. superuser.com/questions/320415/…
zanerock
19

Alasan direktori penghubung keras tidak diperbolehkan sedikit teknis. Pada dasarnya, mereka merusak struktur sistem file . Anda umumnya tidak boleh menggunakan tautan keras. Tautan simbolik memungkinkan sebagian besar fungsi yang sama tanpa menyebabkan masalah (misalnya ln -s target link).

astex
sumber
17
Hard link memiliki kasus penggunaan yang baik. Mengatakan Anda seharusnya tidak menggunakannya agak terlalu luas.
Sander Steffann
4
+2 untuk menyediakan tautan yang benar-benar menjawab pertanyaan OP (dan milik saya), -1 untuk memancarkan pendapat ("Anda seharusnya tidak menggunakan tautan keras" - jika memiliki tautan untuk mendukungnya, itu akan baik-baik saja). Itu bagus, karena saya toh tidak bisa memberi +2. ; D
msb
3
tautan "mereka merusak struktur sistem file" tidak berfungsi.
Charlie Parker
5
Cobalah untuk meringkas isi tautan dalam jawaban, dan simpan tautan itu sebagai referensi. Ini merupakan praktik yang baik dari Stack Exchange untuk menghindari tautan busuk, terima kasih.
Oxwivi
3
@CharlieParker dilakukan dengan baik; komentar ironis terbaik yang tidak disengaja (?) sepanjang masa :)
Eliran Malka