Mengapa ada tautan keras?

Jawaban:

56

Keuntungan utama dari tautan keras adalah, dibandingkan dengan tautan lunak, tidak ada penalti ukuran atau kecepatan. Tautan lunak adalah lapisan tambahan tipuan di atas akses file normal; kernel harus melakukan dereferensi tautan ketika Anda membuka file, dan ini membutuhkan sedikit waktu. Tautan ini juga membutuhkan sedikit ruang pada disk, untuk menampung teks dari tautan tersebut. Hukuman ini tidak ada dengan tautan keras karena mereka dibangun ke dalam struktur sistem berkas.

Cara terbaik yang saya tahu untuk melihatnya adalah:

$ ls -id .
1069765 ./
$ mkdir tmp ; cd tmp
$ ls -id ..
1069765 ../

The -ipilihan untuk lsmembuat memberikan nomor inode dari file. Pada sistem tempat saya menyiapkan contoh di atas, saya kebetulan berada di direktori dengan nomor inode 1069765, tetapi nilai spesifiknya tidak masalah. Itu hanya nilai unik yang mengidentifikasi file / direktori tertentu.

Apa yang dikatakan ini adalah bahwa ketika kita masuk ke subdirektori dan melihat entri sistem file yang berbeda.. , ia memiliki nomor inode yang sama dengan yang kita dapatkan sebelumnya. Ini tidak terjadi karena shell menafsirkan ..untuk Anda, seperti yang terjadi pada MS-DOS dan Windows. Pada sistem file Unix ..adalah entri direktori nyata; itu adalah tautan keras yang menunjuk kembali ke direktori sebelumnya.

Hard link adalah tendon yang menyatukan direktori filesystem. Sekali waktu, Unix tidak memiliki tautan keras. Mereka ditambahkan untuk mengubah sistem file flat asli Unix menjadi sistem file hirarkis.

(Untuk lebih lanjut tentang ini, lihat Mengapa entri '/' memiliki entri '..'? )

Ini juga agak umum pada sistem Unix untuk beberapa perintah berbeda untuk diimplementasikan oleh executable yang sama. Tampaknya tidak lagi menjadi masalah di Linux, tetapi pada sistem yang saya gunakan di masa lalu cp,, mvdan rmsemuanya dapat dieksekusi sama. Masuk akal jika Anda memikirkannya: ketika Anda memindahkan file di antara volume, itu secara efektif merupakan salinan yang diikuti oleh penghapusan, jadi mvsudah harus mengimplementasikan fungsi dua perintah lainnya. Yang dapat dieksekusi dapat mengetahui operasi mana yang harus disediakan karena dapat melewati nama yang dipanggil oleh.

Contoh lain, yang umum di Linux tertanam, adalah BusyBox , sebuah executable tunggal yang mengimplementasikan puluhan perintah.

Saya harus menunjukkan bahwa pada kebanyakan sistem file, pengguna tidak diperbolehkan membuat tautan keras ke direktori. The .dan ..entri secara otomatis dikelola oleh kode filesystem, yang biasanya bagian dari kernel. Pembatasan ada karena dimungkinkan untuk menyebabkan masalah sistem file yang serius jika Anda tidak berhati-hati dengan cara Anda membuat dan menggunakan tautan keras direktori. Ini adalah salah satu alasan banyak tautan lunak ada; mereka tidak membawa risiko yang sama.

Warren Young
sumber
4
Tentang "Tautan juga membutuhkan sedikit ruang pada disk, untuk menampung teks tautan." Pada sistem file modern, tidak ada ruang tambahan yang digunakan untuk menyimpan jalur tautan karena entri direktori itu sendiri digunakan untuk menyimpannya, setidaknya jika namanya tidak terlalu panjang untuk masuk. Ini disebut "symlink cepat"
jlliagre
Saya ingin menambahkan bahwa beberapa aplikasi tidak tahu bagaimana menangani tautan lunak (sym), dan dengan demikian tautan keras mungkin berguna untuk menghindari redundansi saat mengonfigurasinya dengan merujuk ke data / file konfigurasi yang sama. Contohnya adalah ioquake3, yang tidak dapat mengikuti file pk3 yang disinkronkan, tetapi dapat mengikuti file pk3 yang di-link.
Gaborous
3
Juga, jika Anda menghapus target symlink, file hilang dan symlink rusak. Masalah yang tidak ada dengan tautan keras.
Spektrum
1
Tetapi tautan keras memiliki info juga - namanya. Jadi itu seharusnya mengambil ruang.
Josef Klimuk
39

Salah satu penggunaan hardlink yang sangat berguna adalah cadangan tambahan yang dikombinasikan dengan rsync. Ini menghemat banyak ruang dan membuat prosedur pemulihan sangat mudah. Saya menggunakan pendekatan itu untuk cadangan di server saya.

Luangkan waktu untuk membaca penjelasan ini .

hmontoliu
sumber
12

Jika setelah membaca halaman wikipedia pertanyaan Anda adalah "mengapa saya pernah menggunakannya" maka Anda tidak mengerti apa itu tautan keras.

Sebuah hubungan adalah entri direktori yang menunjuk ke blok pada disk. Dengan kata lain setiap file di sistem Anda memiliki setidaknya satu tautan. Ketika Anda rmfile panggilan sistem yang sebenarnya unlink(). Ini menghapus entri direktori. Blok pada disk tidak berubah tetapi tautannya hilang, sehingga file tersebut hilang dari daftar direktori.

Anda secara pribadi mungkin tidak pernah menggunakan tautan keras, tetapi semuanya ada di sistem Anda. Sebagai contoh:

$ ls -li /bin | grep 53119771
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bunzip2
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzcat
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzip2

Anda dapat melihat itu bunzip2, bzcatdan bzipsemua menggunakan inode yang sama. Intinya, itu adalah satu file dengan tiga nama. Anda bisa memiliki tiga salinan file, tetapi mengapa? Itu hanya akan menggunakan ruang disk yang tidak perlu.

bahamat
sumber
12
Tetapi ada juga sejumlah symlinks di /bin, saya kira itu salah satu sumber kebingungan. Mengapa terkadang executable akan di-symlink dan terkadang - di-hardlink?
Dmitry Pashkevich
16
Jawaban ini gagal memberikan alasan apa pun untuk menggunakan tautan keras melalui tautan lunak.
Mark Amery
8

Ada sejumlah kegunaan. Saya menggunakannya untuk membuat kunci berbasis file. Link (2) panggilan sistem bersifat atomik, tidak seperti kebanyakan panggilan sistem lainnya.

Penggunaan lain adalah dalam rsnapshot, di mana cadangan diambil dari waktu ke waktu menggunakan hard-link untuk mengurangi jumlah ruang disk. Jika suatu file tidak berubah, maka file tersebut terhubung dengan keras ke instance file yang lebih lama, file yang telah diubah disalin lagi.

Saya juga menggunakannya untuk menukar file konfigurasi di server:, rm file.cfg && ln ~/tmp/file.cfg file.cfgmaka file ~ / tmp / * dapat dihapus dengan aman.

Arcege
sumber
1
Kenapa terpisah lndan rmbukannya hanya mv?
Tommiie
6

Untuk menambah beberapa diskusi yang baik sudah ada ...

  • Cara akses sumber daya untuk program diimplementasikan dalam unix (yaitu "semuanya adalah file" ), berarti infrastruktur untuk menangani beberapa referensi ke suatu file diperlukan untuk OS untuk bekerja sama sekali, sehingga tidak ada biaya tambahan di sini.
  • Cara direktori diimplementasikan dalam sistem file unix asli (yaitu daftar (inode, name)pasangan format tetap berarti bahwa tidak ada biaya tambahan pada sistem file untuk memiliki hardlink (yah, selama kita mencegah siklus dengan melarang hardlinke ke direktori (selain .dan ..(Apakah ini mulai terasa seperti sampah bagi orang lain?)))

jadi kami mendapatkannya secara gratis.

dmckee
sumber
2

Saya mungkin harus membahas skenario jebakan dari tautan keras. Hard link akan berupa file yang sama dengan nama yang berbeda dan / atau lokasi yang berbeda selama file tertaut asli ada . Bahkan tidak benar untuk menganggap file tersebut sebagai "asli": keduanya adalah entri direktori dengan hak mereka sendiri, dan keduanya (atau lebih) semuanya adalah rekan yang setara. Untuk file yang berumur panjang, ini bisa menjadi berkah, tetapi jika salah satu dari pasangan dihapus dan kemudian dibuat, bahkan dengan nama dan konten yang sama, file akan terpisah.

Misalkan Anda membuat /foo/myfiletautan ke /repo/myfile. Keduanya adalah pointer ke data file yang sama; ubah satu, perubahan lainnya. Tapi anggap itu /repoterjadi untuk menyimpan repositori Git. Jika Anda memeriksa cabang yang tidak mengandung myfiledi dalamnya, /repo/myfiledihapus. Pada saat ini, /foo/myfilejadilah salinan sederhana dari /repo/myfile, seperti pada saat pasangan yang lain tidak terhubung. Sangat mudah untuk tidak memperhatikan saat Anda membalik di antara cabang-cabang yang mengajukan perubahan repertoar, tetapi, ketika Anda checkout cabang asli, sebuah file baru/repo/myfiledibuat oleh Git. Jika Anda tidak memperhatikan, Anda akan bertanya-tanya mengapa kedua file sekarang memiliki konten yang berbeda, meskipun mudah untuk grok, karena hubungan tautan keras antara file tidak tahu tentang nama mereka. Tautan lunak, sebaliknya, akan bertahan melalui siklus delete-create ini.

Di sisi lain, perangkat lunak yang menggunakan tautan keras sangat menyadari hal ini, dan Git adalah contoh utama. Git mengkloning repositori pada sistem file yang sama hampir gratis, karena menggunakan tautan keras secara default alih-alih menyalin file. Untuk Git hard link adalah kasus penggunaan yang sempurna, karena objek dan file paketnya tidak pernah berubah, jadi satu klon repositori tidak akan pernah memodifikasi yang lain (Git tahu untuk tidak menghubungkan file yang dapat dimodifikasi dengan tautan keras), dan salah satu klon dapat berupa dihapus tanpa tindakan pencegahan apa pun: tidak perlu untuk melacak mana yang merupakan "asli" dan benar - benar berisi file: salah satu tautan keras adalah mitra yang sama dan "berisi" file lengkap. Tautan lunak tidak akan berfungsi di sini.

Keuntungan lain dari tautan keras adalah bahwa tautan apa pun dapat dipindahkan tanpa memutus akses ke konten file. Dengan tautan lunak, memindahkan file asli menjadikan semua tautan lunak itu menggantung.

Intinya adalah bahwa dalam banyak kasus penggunaan salah satu jenis tautan berfungsi dengan baik, tetapi dalam beberapa jenis lainnya menguntungkan. Efisiensi, yang disebutkan dalam banyak jawaban di sini, mungkin merupakan masalah yang sangat kecil dengan mesin dan sistem file modern, kecuali jika Anda mencari-cari sistem file pada chip FLASH dari chip pengendali tertanam yang lemah. Perbedaan fungsional lebih penting, dan biasanya menentukan kendala teknis dan pilihan akhir:

  • "Sumber" tautan keras dapat dipindahkan dengan aman, sementara tautan lunak akan putus.
  • Hard link tidak dapat dibedakan dari file yang ditautkan darinya, dan file tersebut tetap hidup selama ada tautan keras yang masih hidup; tautan lunaknya asimetris.
  • Rekan yang ditautkan dengan keras keluar dari grup yang ditautkan jika dihapus dan dibuat kembali, tetapi tautan lunak tidak kehilangan targetnya.
  • Tautan lunak dapat melintasi sistem file, tautan keras tidak dapat.
  • Tautan lunak dapat menunjuk ke suatu direktori, biasanya tautan keras tidak dapat (dan praktis tidak seharusnya).

Juga, saya harus menunjukkan bahwa panggilan perpustakaan yang menghapus file dipanggil unlink()karena suatu alasan! Setiap entri direktori hanyalah tautan keras yang awalnya tunggal ke inode-nya.

kkm
sumber