Baru-baru ini saya ditanyai selama wawancara kerja. Saya jujur dan berkata bahwa saya tahu bagaimana tautan simbolik berperilaku dan cara membuatnya, tetapi tidak memahami penggunaan tautan keras dan bagaimana tautan itu berbeda dari tautan simbolik.
768
Jawaban:
Di bawah sistem file, file diwakili oleh inode. (Atau beberapa inode? Tidak yakin.)
File dalam sistem file pada dasarnya adalah tautan ke inode.
Tautan keras, kemudian, hanya membuat file lain dengan tautan ke inode mendasar yang sama.
Ketika Anda menghapus file, itu menghapus satu tautan ke inode yang mendasarinya. Inode hanya dihapus (atau dihapus / bisa ditulisi) ketika semua tautan ke inode telah dihapus.
Tautan simbolik adalah tautan ke nama lain di sistem file.
Setelah tautan keras dibuat, tautannya adalah ke inode. Menghapus, mengganti nama, atau memindahkan file asli tidak akan memengaruhi tautan keras karena tautan ke inode yang mendasarinya. Setiap perubahan pada data pada inode tercermin dalam semua file yang merujuk pada inode itu.
Catatan: Tautan keras hanya valid dalam Sistem File yang sama. Tautan simbolis dapat menjangkau sistem file karena hanya nama file lain.
sumber
Beberapa intuisi bagus yang mungkin membantu, menggunakan konsol Linux (ish) apa saja.
Buat dua file:
Masukkan beberapa data ke dalamnya:
(Sebenarnya, saya bisa menggunakan gema di tempat pertama, karena membuat file jika mereka tidak ada ... tapi tidak apa-apa.)
Dan seperti yang diharapkan:
Mari buat tautan keras dan lunak:
Mari kita lihat apa yang baru saja terjadi:
Mengubah nama foo tidak masalah:
foo-hard menunjuk ke inode, isi, dari file - itu tidak berubah.
Isi file tidak dapat ditemukan karena tautan lunak menunjuk ke nama, yang diubah, dan bukan ke konten.
Demikian juga, Jika
foo
dihapus,foo-hard
masih menyimpan konten; jikabar
dihapus,bar-soft
itu hanya tautan ke file yang tidak ada.sumber
touch blah1; touch blah2
dapat disingkat menjaditouch blah1 blah2
Seperti kata pepatah, sebuah gambar bernilai ribuan kata. Inilah cara saya memvisualisasikannya:
Inilah cara kita mencapai gambaran itu:
Buat nama
myfile.txt
dalam sistem file yang menunjuk ke inode baru (yang berisi metadata untuk file dan menunjuk ke blok data yang berisi isinya, yaitu teks "Halo, Dunia!":Buat tautan keras
my-hard-link
ke filemyfile.txt
, yang berarti "buat file yang harus mengarah ke inode yang sama yangmyfile.txt
menunjuk":Buat tautan lunak
my-soft-link
ke filemyfile.txt
, yang berarti "buat file yang mengarah ke filemyfile.txt
":Lihat apa yang sekarang akan terjadi jika
myfile.txt
dihapus (atau dipindahkan):my-hard-link
masih menunjuk ke konten yang sama, dan dengan demikian tidak terpengaruh, sedangkanmy-soft-link
sekarang tidak menunjukkan apa-apa. Jawaban lain membahas pro / kontra masing-masing.sumber
myfile.txt
). Untuk tautan lunak, rujukannya bukan inode (yang berisi data), melainkan rujukannya adalah jalur sistem file kemyfile.txt
(misalnya/home/Documents/myfile.txt
)Tautan keras berguna saat file asli dipindahkan. Misalnya, memindahkan file dari / bin ke / usr / bin atau ke / usr / local / bin. Setiap symlink ke file di / bin akan rusak oleh ini, tetapi hardlink, menjadi tautan langsung ke inode untuk file, tidak akan peduli.
Tautan keras mungkin membutuhkan lebih sedikit ruang disk karena hanya mengambil entri direktori, sedangkan symlink memerlukan inode sendiri untuk menyimpan nama yang ditunjuknya.
Tautan keras juga membutuhkan waktu lebih sedikit untuk diselesaikan - symlink dapat mengarah ke symlink lain yang ada di direktori symlink. Dan beberapa di antaranya bisa pada NFS atau sistem file latensi tinggi lainnya, dan bisa mengakibatkan lalu lintas jaringan untuk menyelesaikannya. Hard link, yang selalu pada sistem file yang sama, selalu diselesaikan dalam satu pencarian tunggal, dan tidak pernah melibatkan latensi jaringan (jika itu adalah hardlink pada sistem file NFS, server NFS akan melakukan resolusi, dan itu tidak akan terlihat oleh sistem klien). Terkadang ini penting. Bukan untuk saya, tapi saya bisa membayangkan sistem berkinerja tinggi di mana ini mungkin penting.
Saya juga berpikir hal-hal seperti mmap (2) dan bahkan buka (2) menggunakan fungsionalitas yang sama dengan hardlink untuk menjaga inode file tetap aktif sehingga bahkan jika file tersebut dibatalkan tautannya (2) ed, inode tetap membiarkan proses melanjutkan akses, dan hanya sekali proses menutup itu file benar-benar hilang. Ini memungkinkan file sementara yang jauh lebih aman (jika Anda bisa membuka dan memutuskan tautan terjadi secara atom, yang mungkin ada API POSIX untuk itu saya tidak ingat, maka Anda benar-benar memiliki file sementara yang aman) di mana Anda dapat membaca / menulis data Anda tanpa ada yang bisa mengaksesnya. Ya, itu benar sebelum / proc memberi semua orang kemampuan untuk melihat deskriptor file Anda, tapi itu cerita lain.
Omong-omong, memulihkan file yang terbuka dalam proses A, tetapi tidak terhubung pada sistem file berputar di sekitar menggunakan hardlink untuk membuat ulang inode tautan sehingga file tidak hilang ketika proses yang terbuka membuka menutupnya atau hilang.
sumber
Tautan Lunak :
lunak atau simbolis lebih merupakan jalan pintas ke file asli .... jika Anda menghapus yang asli pintasan gagal dan jika Anda hanya menghapus jalan pintas tidak ada yang terjadi pada aslinya.
Sintaks tautan lunak :
ln -s Pathof_Target_file link
Keluaran:
link -> ./Target_file
Bukti:
readlink link
Juga dalamls -l link
output Anda akan melihat huruf pertamalrwxrwxrwx
sebagai l yang menunjukkan bahwa file tersebut adalah tautan lunak.Menghapus tautan:
unlink link
Catatan: Jika diinginkan, softlink Anda dapat berfungsi bahkan setelah memindahkannya di tempat lain dari direktori saat ini. Pastikan Anda memberikan jalur absolut dan bukan jalur relatif saat membuat tautan lunak. yaitu (mulai dari / root / user / Target_file dan tidak ./Target_file)
Tautan Keras:
Hard link lebih merupakan salinan cermin atau banyak jalur ke file yang sama. Lakukan sesuatu untuk file1 dan muncul di file 2. Menghapus satu masih membuat yang lain ok.
Inode (atau file) hanya dihapus ketika semua (hard) link atau semua path ke inode (file yang sama) telah dihapus.
Setelah tautan keras dibuat, tautan memiliki inode dari file asli. Menghapus mengganti nama atau memindahkan file asli tidak akan memengaruhi tautan keras karena tautan ke inode yang mendasarinya. Setiap perubahan pada data pada inode tercermin dalam semua file yang merujuk pada inode itu.
Sintaks tautan keras :
ln Target_file link
Output: File dengan tautan nama akan dibuat dengan nomor inode yang sama dengan Targetfile.
Bukti:
ls -i link Target_file
(periksa inode mereka)Menghapus tautan:
rm -f link
(Hapus tautan seperti file normal)Catatan : Tautan simbolik dapat menjangkau sistem file karena hanya berupa nama file lain. Sedangkan tautan keras hanya valid dalam Sistem File yang sama.
Tautan simbolik memiliki beberapa fitur yang tidak ada tautan kerasnya:
Anda segera tahu di mana tautan simbolis menunjuk ke saat dengan tautan keras, Anda perlu menjelajahi seluruh sistem file untuk menemukan file yang berbagi inode yang sama.
# find / -inum 517333
tautan keras tidak dapat menunjuk ke direktori.
Tautan keras memiliki dua batasan:
sumber
Cara sederhana untuk melihat perbedaan antara tautan keras dan tautan simbolik adalah melalui contoh sederhana. Tautan keras ke suatu file akan menunjuk ke tempat di mana file itu disimpan, atau inode dari file itu. Tautan simbolis akan menunjuk ke file itu sendiri.
Jadi jika kita memiliki file yang disebut "a" dan membuat tautan keras "b" dan tautan simbolis "c" yang semuanya merujuk ke file "a":
Output dari "a", "b", dan "c" adalah:
Sekarang mari kita hapus file "a" dan lihat apa yang terjadi pada output dari "a", "b", dan "c":
Jadi apa yang terjadi?
Karena file "c" menunjuk ke file "a" itu sendiri, jika file "a" dihapus maka file "c" tidak akan menunjuk apa pun, sebenarnya file itu juga dihapus.
Namun, file "b" menunjuk ke tempat penyimpanan, atau inode, dari file "a". Jadi jika file "a" dihapus maka tidak akan lagi menunjuk ke inode, tetapi karena file "b" tidak, inode akan terus menyimpan konten apa pun milik "a" sampai tidak ada lagi hard link menunjuk ke inode lagi.
sumber
Tautan simbolik menautkan ke nama jalur. Ini bisa di mana saja di pohon file sistem, dan bahkan tidak harus ada saat tautan dibuat. Jalur target bisa relatif atau absolut.
Hard link adalah petunjuk tambahan untuk sebuah inode, yang berarti mereka hanya bisa ada pada volume yang sama dengan target. Tautan keras tambahan ke file tidak dapat dibedakan dari nama "asli" yang digunakan untuk referensi file.
sumber
Saya akan mengarahkan Anda ke Wikipedia:
Beberapa poin:
sumber
Hard link sangat berguna saat melakukan backup tambahan. Lihat rsnapshot , misalnya. Idenya adalah melakukan penyalinan menggunakan tautan keras:
Cadangan baru tidak akan mengambil ruang tambahan selain dari perubahan yang telah Anda buat, karena semua cadangan tambahan akan mengarah ke set inode yang sama untuk file yang belum berubah.
sumber
Hard link Vs Soft link dapat dengan mudah dijelaskan oleh gambar ini.
sumber
Saya menambahkan pertanyaan Nick: kapan tautan keras bermanfaat atau perlu? Satu-satunya aplikasi yang muncul di benak saya, di mana tautan simbolis tidak akan melakukan pekerjaan, adalah menyediakan salinan file sistem di lingkungan chroot.
sumber
Dari MSDN ,
Tautan simbolik
Contoh Link Simbol Mutlak
Contoh Tautan Simbol Relatif
Tautan keras
Untuk membuat tautan keras di windows, navigasikan ke tempat tautan itu dibuat dan masukkan perintah ini:
Perhatikan bahwa Anda dapat menghapus tautan keras pesanan apa pun, terlepas dari urutan pembuatannya. Juga, tautan keras tidak dapat dibuat kapan
Persimpangan jalan
NTFS mendukung jenis tautan lain yang disebut persimpangan. MSDN mendefinisikannya sebagai berikut:
Bagian yang dicetak tebal di bagian tautan dan persimpangan menunjukkan perbedaan mendasar antara keduanya.
Perintah untuk membuat persimpangan di windows, arahkan ke tempat tautan akan dibuat dan kemudian masukkan:
sumber
Juga:
sumber
Cukup, Hard link: hanya menambahkan nama baru ke file, itu artinya, file dapat memiliki banyak nama dalam waktu yang bersamaan, semua nama sama satu sama lain, tidak ada yang disukai, Hard link tidak berarti menyalin semua konten file dan membuat file baru bukan itu, itu hanya membuat nama alternatif untuk diketahui ..
Tautan simbolik (symlink): adalah penunjuk file ke file lain, jika tautan simbolis menunjuk ke file yang ada yang kemudian dihapus, tautan simbolik terus menunjuk ke nama file yang sama meskipun nama tersebut tidak lagi menyebutkan nama file apa pun.
sumber
Apa yang Anda anggap sebagai "file" biasa sebenarnya adalah dua hal yang terpisah: Data file, dan entri direktori. Ketika Anda membuat tautan keras untuk suatu file, Anda sebenarnya membuat entri direktori kedua yang mengacu pada data yang sama. Kedua entri direktori memiliki fungsi yang sama persis; masing-masing dapat digunakan untuk membuka file untuk membacanya. Jadi Anda tidak benar-benar memiliki "file plus tautan keras", Anda memiliki "file data dengan dua entri direktori". Apa yang Anda anggap sebagai menghapus file sebenarnya menghapus entri direktori, dan ketika entri direktori terakhir untuk data dihapus, maka data itu sendiri dihapus juga. Untuk file biasa yang hanya memiliki satu entri direktori, menghapus entri direktori akan menghapus data seperti biasa. (Saat file dibuka, OS membuat tautan sementara ke file,
Sebagai contoh, buat file A.txt, tautan keras B.txt, dan hapus A.txt. Ketika Anda membuat A.txt, beberapa data dibuat, dan entri direktori A.txt. Ketika Anda membuat tautan keras, entri direktori lain B.txt telah dibuat, menunjuk ke data yang sama persis. Ketika Anda menghapus A.txt, Anda masih memiliki semua data dan satu entri direktori B.txt, persis seperti jika Anda telah membuat file B.txt di tempat pertama.
Tautan lunak hanyalah sebuah (hampir) file biasa, kecuali bahwa itu tidak mengandung data, tetapi jalur entri direktori lain. Jika Anda menghapus file yang dimaksud tautan lunak, maka tautan lunak tersebut akan berisi jalur yang tidak mengarah ke entri direktori lagi; ini rusak. Jika Anda menghapus tautan lunak, itu seperti menghapus file lain, file yang ditunjuknya tidak akan terpengaruh.
sumber
Entri direktori adalah tautan sebuah struktur:
ino adalah jumlah inode, nama adalah nama file, struktur inode mungkin seperti:
misalnya Anda membuat file / 1, entri direktori mungkin seperti:
inode struct mungkin menyukai:
kemudian Anda membuat tautan keras (mungkin / 100), entri direktori mungkin seperti:
inode struct mungkin menyukai:
lalu Anda membuat tautan simbolis (mungkin / 200) ke file 1, entri direktori mungkin seperti:
inode struct mungkin menyukai:
sumber
Menambah semua jawaban di atas, perbedaan dalam menemukan file hardlink dan softlink dapat dipahami sebagai berikut:
Saya memiliki file
f6
di direktori saya saat ini, serta direktori bernamat2
.Nama file
f1
dan./t2/f2
tautan simbolis kef6
.Nama file
f7
dan./t2/f8
merupakan tautan keras darif6
.Untuk menemukan tautan lunak dan keras, kita dapat menggunakan:
Untuk menemukan hanya tautan keras yang dapat kita gunakan:
Karena hardlink dapat dibuat pada sistem file yang sama, kami dapat mencari semua hardlink tanpa
-L
opsi yang digunakan (dengan-xdev
opsi) di file-system / mount-point yang sama. Ini menyimpan pencarian yang tidak perlu ke berbagai titik pemasangan.Jadi mencari hardlink agak lebih cepat daripada mencari softlink (Harap perbaiki jika saya salah atau tidak jelas).
sumber
Tautan simbolik memberi nama lain ke file, dengan cara yang mirip dengan tautan keras. Tetapi file dapat dihapus bahkan jika ada tautan simbolik yang tersisa.
sumber
Dua sen saya pada penggunaan:
Tautan lunak dapat digunakan untuk mempersingkat nama jalur panjang, yaitu:
Perubahan yang dilakukan
/short/file.txt
akan diterapkan pada file asli.Tautan keras dapat digunakan untuk memindahkan file-file besar:
ln /myapp/dev/application.bin /myapp/prd/application.bin
Salinan instan ke folder yang berbeda, dan file asli (aktif
/myapp/dev
) dapat dipindahkan atau dihapus, tanpa menyentuh file aktif/myapp/prd
sumber
Saya baru saja menemukan cara mudah untuk memahami tautan keras dalam skenario umum, memasang perangkat lunak.
Suatu hari saya mengunduh perangkat lunak ke folder
Downloads
untuk diinstal. Setelah saya lakukansudo make install
, beberapa executablecp
diedit ke folder bin lokal. Di sini,cp
buat tautan keras . Saya senang dengan perangkat lunak tetapi segera menyadari bahwaDownloads
itu bukan tempat yang baik dalam jangka panjang. Jadi sayamv
mengedit folder perangkat lunak kesource
direktori. Yah, saya masih bisa menjalankan perangkat lunak seperti sebelumnya tanpa khawatir tentang hal-hal tautan target, seperti di Windows. Ini berarti hard link menemukan inode secara langsung dan file lain di sekitarnya.sumber
DALAM jawaban ini ketika saya mengatakan file maksud saya lokasi di memori
Semua data yang disimpan disimpan dalam memori menggunakan struktur data yang disebut inode Setiap inode memiliki nomor inodenumber. Nomor inode digunakan untuk mengakses inode. Semua tautan keras ke file mungkin memiliki nama yang berbeda tetapi berbagi nomor inode yang sama. Karena semua tautan keras memiliki nomor kode yang sama (yang inturn mengakses inode yang sama), semuanya menunjuk ke memori fisik yang sama.
Tautan simbolik adalah jenis file khusus. Karena itu juga merupakan file, ia akan memiliki nama file dan nomor inode. Seperti yang dikatakan di atas, nomor inode mengakses inode yang menunjuk ke data. Sekarang yang membuat tautan simbolik adalah inodenumber dalam tautan simbolik mengakses inode yang mengarah ke "jalan" ke file lain. Lebih khusus nomor inode dalam tautan simbolik mengakses inode yang menunjuk ke tautan keras lain.
ketika kita memindahkan, menyalin, menghapus file dalam GUI, kita bermain dengan hardlink dari file bukan memori fisik. ketika kita menghapus file kita menghapus hardlink dari file. kita tidak memusnahkan memori fisik. Jika semua hardlink ke file dihapus maka tidak akan mungkin untuk mengakses data yang disimpan meskipun mungkin masih ada dalam memori
sumber