Saya tahu apa itu tautan keras, tetapi mengapa saya harus menggunakannya? Apa kegunaan tautan keras?
Saya tahu apa itu tautan keras, tetapi mengapa saya harus menggunakannya? Apa kegunaan tautan keras?
Jawaban:
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 -i
pilihan untuk ls
membuat 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
,, mv
dan rm
semuanya 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 mv
sudah 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.
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 .
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 rm
file 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
, bzcat
dan bzip
semua 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.
/bin
, saya kira itu salah satu sumber kebingungan. Mengapa terkadang executable akan di-symlink dan terkadang - di-hardlink?
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.cfg
maka file ~ / tmp / * dapat dihapus dengan aman.
ln
dan rm
bukannya hanya mv
?
Untuk menambah beberapa diskusi yang baik sudah ada ...
(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.
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/myfile
tautan ke /repo/myfile
. Keduanya adalah pointer ke data file yang sama; ubah satu, perubahan lainnya. Tapi anggap itu /repo
terjadi untuk menyimpan repositori Git. Jika Anda memeriksa cabang yang tidak mengandung myfile
di dalamnya, /repo/myfile
dihapus. Pada saat ini, /foo/myfile
jadilah 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/myfile
dibuat 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:
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.