Apa perbedaan antara tautan simbolik dan tautan keras?

768

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.

Nick Stinemates
sumber
2
tentang 'tidak memahami penggunaan hard link', dapat digunakan dalam membangun sistem yang banyak menyalin binari. Membuat tautan keras alih-alih kecepatan salinan yang sebenarnya mempercepat. MSBuild 4.0 mendukung ini.
Ankush
13
Saya menemukan tautan ini sangat berguna untuk memahaminya. askubuntu.com/questions/108771/…
kta
2
unix.stackexchange memiliki daftar poin-poin yang bagus ... sangat membantu karena menjabarkan semua kendala dengan sangat ringkas dan mudah dibaca. (banyak poin-poin ini mencakup kasus tepi / peringatan yang hanya disebutkan dalam komentar pertanyaan ini ... atau tidak disebutkan sama sekali)
Trevor Boyd Smith

Jawaban:

781

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.

Martin York
sumber
2
Saya yakin simpul-i bergantung pada varian OS tertentu; Namun, saya percaya itu biasanya i-node tunggal. I-simpul memiliki info tentang file dan info tentang di mana data disimpan pada disk. File besar akan memiliki pointer tidak langsung ke tabel tambahan.
terson
76
Anda mungkin ingin menambahkan fitur berguna yang tautan simbolis dapat melintasi sistem file, tautan keras tidak dapat (mereka harus merujuk ke file pada sistem file yang sama).
paxdiablo
52
Ada penjelasan visual yang baik dalam sebuah artikel di Linux Gazette
Rodrigue
1
Saya juga menulis blog tentang itu setelah beberapa bacaan dan percobaan csharpbsharp.tumblr.com
Adnan Bhatti
1
@zen: Anda dapat meng-unmount / mengirim kembali sistem file kapan saja tidak digunakan. Untuk partisi root, ini agak rumit tetapi dapat dilakukan (tidak direkomendasikan). Untuk melakukannya untuk root, biasanya yang terbaik adalah mem-boot CD rescuse, pertama-tama memodifikasi mount dan boot ulang. Tetapi Anda harus mengajukan pertanyaan semacam ini pada pengguna super.
Martin York
464

Beberapa intuisi bagus yang mungkin membantu, menggunakan konsol Linux (ish) apa saja.

Buat dua file:

$ touch foo; touch bar

Masukkan beberapa data ke dalamnya:

$ echo "Cat" > foo
$ echo "Dog" > bar

(Sebenarnya, saya bisa menggunakan gema di tempat pertama, karena membuat file jika mereka tidak ada ... tapi tidak apa-apa.)

Dan seperti yang diharapkan:

$cat foo; cat bar
Cat
Dog

Mari buat tautan keras dan lunak:

$ ln foo foo-hard
$ ln -s bar bar-soft

Mari kita lihat apa yang baru saja terjadi:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

Mengubah nama foo tidak masalah:

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard menunjuk ke inode, isi, dari file - itu tidak berubah.

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-soft: No such file or directory

Isi file tidak dapat ditemukan karena tautan lunak menunjuk ke nama, yang diubah, dan bukan ke konten.

Demikian juga, Jika foodihapus, foo-hardmasih menyimpan konten; jika bardihapus, bar-softitu hanya tautan ke file yang tidak ada.

Adam Matan
sumber
12
apakah ini menyiratkan bahwa "file" dan "hard link" sama, keduanya menunjuk ke inode? pada menghapus file atau tautan keras, isinya masih ada selama masih menunjuk ke inode kan?
Daniel W.
1
@DanFromGermany Benar. Konten dapat dijangkau selama setidaknya satu tautan keras (yaitu, file) menunjuk padanya.
Adam Matan
6
touch blah1; touch blah2dapat disingkat menjaditouch blah1 blah2
Dmitri Zaitsev
11
@DmitriZaitsev Benar, tetapi akan kurang dapat dibaca untuk IMO pemula.
Adam Matan
8
Saya pikir ini adalah jawaban yang paling mudah dipahami sehubungan dengan banyak jawaban yang saya baca. Sampel lebih baik daripada banyak teks penjelasan.
Scott Chu
435

Seperti kata pepatah, sebuah gambar bernilai ribuan kata. Inilah cara saya memvisualisasikannya:

masukkan deskripsi gambar di sini

Inilah cara kita mencapai gambaran itu:

  1. Buat nama myfile.txtdalam sistem file yang menunjuk ke inode baru (yang berisi metadata untuk file dan menunjuk ke blok data yang berisi isinya, yaitu teks "Halo, Dunia!":

    $ echo 'Hello, World!' > myfile.txt
    
  2. Buat tautan keras my-hard-linkke file myfile.txt, yang berarti "buat file yang harus mengarah ke inode yang sama yang myfile.txtmenunjuk":

    $ ln myfile.txt my-hard-link
    
  3. Buat tautan lunak my-soft-linkke file myfile.txt, yang berarti "buat file yang mengarah ke file myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

Lihat apa yang sekarang akan terjadi jika myfile.txtdihapus (atau dipindahkan): my-hard-linkmasih menunjuk ke konten yang sama, dan dengan demikian tidak terpengaruh, sedangkan my-soft-linksekarang tidak menunjukkan apa-apa. Jawaban lain membahas pro / kontra masing-masing.

akivajgordon
sumber
3
@ThunderWiring By "point", maksud saya apa pun referensi tautan. Dalam kasus tautan keras, ia mereferensikan inode secara langsung (yaitu inode yang sama dengan yang dirujuk oleh myfile.txt). Untuk tautan lunak, rujukannya bukan inode (yang berisi data), melainkan rujukannya adalah jalur sistem file ke myfile.txt(misalnya /home/Documents/myfile.txt)
akivajgordon
4
Saya sangat menyukai respons visual Anda @akivajgordon - sangat membantu saya memahami perbedaan dengan lebih baik!
wmock
7
Sepuluh ribu kata!
SaganRitual
13
Mungkin saya lambat, tetapi gambar Anda baru saja menyelesaikan 20 tahun misteri dalam waktu sekitar 2 detik.
jdk1.0
3
Jawaban yang paling berguna, saya marah ini terkubur dalam-dalam di posting ini. Saya akan memberi Anda seratus poin internet tetapi sayangnya saya hanya bisa memberi Anda satu.
Dagroom
71

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.

Tanktalus
sumber
35

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 dalam ls -l linkoutput Anda akan melihat huruf pertama lrwxrwxrwxsebagai 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:

  • Tautan keras menunjuk ke konten file. sedangkan tautan lunak menunjuk ke nama file.
  • sedangkan ukuran hard link adalah ukuran konten sementara soft link memiliki ukuran nama file.
  • Tautan keras berbagi inode yang sama. Tautan lunak tidak.
  • Tautan keras tidak dapat melewati sistem file. Tautan lunak lakukan.
  • 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

    /home/bobbin/sync.sh
    /root/synchro
    
  • tautan keras tidak dapat menunjuk ke direktori.

Tautan keras memiliki dua batasan:

  • Direktori tidak dapat ditautkan. Linux tidak mengizinkan ini untuk mempertahankan struktur direktori pohon asiklik.
  • Tautan keras tidak dapat dibuat di seluruh sistem file. Kedua file harus berada pada sistem file yang sama, karena sistem file yang berbeda memiliki tabel inode independen yang berbeda (dua file pada sistem file yang berbeda, tetapi dengan nomor inode yang sama akan berbeda).
Prabhat Kumar Singh
sumber
3
"sedangkan ukuran hard link adalah ukuran konten sementara soft link memiliki ukuran nama file." Sekadar memperjelas, membuat tautan keras lain hanya memengaruhi ruang kosong beberapa byte.
Ingo
34

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":

echo "111" > a
ln a b
ln -s a c

Output dari "a", "b", dan "c" adalah:

cat a --> 111
cat b --> 111
cat c --> 111

Sekarang mari kita hapus file "a" dan lihat apa yang terjadi pada output dari "a", "b", dan "c":

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

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.

buydadip
sumber
Mungkin bermanfaat untuk menunjukkan bahwa, file adalah objek yang sangat abstrak dan memiliki semua hal yang abstrak, maksud sebenarnya dari implementasi tingkat tinggi bisa gagal penjelasan yang tepat tanpa risiko meniup abstraksi.
Cholthi Paul Ttiopic
28

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.

tak seorangpun
sumber
Juga, ketika Anda menghapus file yang Anda tautkan, tautan simbolik rusak, tautan keras tetap valid, karena "menyimpan" file dalam sistem file.
njsf
21

Saya akan mengarahkan Anda ke Wikipedia:

Beberapa poin:

  • Symlink, tidak seperti hard link, dapat melintasi sistem file (sebagian besar waktu).
  • Symlink dapat mengarah ke direktori.
  • Tautan keras menunjuk ke suatu file dan memungkinkan Anda untuk merujuk ke file yang sama dengan lebih dari satu nama.
  • Selama setidaknya ada satu tautan, datanya masih tersedia.
Jauder Ho
sumber
1
Secara teori (dan dalam beberapa kasus bahkan dalam praktiknya) tautan keras dapat menunjuk ke direktori juga (pada kenyataannya "." Adalah tautan keras ke direktori saat ini dan ".." adalah tautan keras ke direktori induk). Tetapi mereka bisa berbahaya, sehingga sebagian besar UNIX tidak mengizinkannya (atau mengharuskan Anda mengambil langkah-langkah khusus untuk mengambilnya). Apple menggunakannya untuk implementasi mesin waktu mereka misalnya: earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer
3
Anda menunjuk ke tautan ke artikel ... apakah itu membuat Anda menjadi tautan simbolis?
Ian Campbell
@ JoachimSauer Apakah Anda pikir sistem file Apple yang baru akan menghilangkan kebutuhan Time Machine untuk menggunakan tautan keras ke direktori?
cjm
Saya menemukan penjelasan wikipedia secara signifikan lebih pendek dan lebih konkret daripada penjelasan dalam jawaban dengan peringkat terbaik.
Danau
9

Hard link sangat berguna saat melakukan backup tambahan. Lihat rsnapshot , misalnya. Idenya adalah melakukan penyalinan menggunakan tautan keras:

  • salin nomor cadangan n ke n + 1
  • salin cadangan n - 1 ke n
  • ...
  • salin cadangan 0 ke cadangan 1
  • perbarui cadangan 0 dengan file yang diubah.

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.

JesperE
sumber
6

Tautan keras vs. Tautan lunak

Hard link Vs Soft link dapat dengan mudah dijelaskan oleh gambar ini.

PGOEL
sumber
5
Saya kira pic tautan lunak Anda salah. Poin: inode tautan lunak tidak boleh mengarah ke inode file asli. Karena jika Anda mengganti nama file asli, tautan lunak terkait mati
percy507
@ percy507 ya Anda benar - tetapi saya masih menemukan itu penjelasan yang sangat bagus dan intuitif. Bayangkan saja bahwa panah di antara inode tidak ada ...
Michael Litvin
5

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.

Federico A. Ramponi
sumber
Sistem terdistribusi dengan titik pemasangan di berbagai tempat pada sistem yang berbeda. Tentu saja, ini dapat dirancang dari sistem dengan konsisten.
terson
Saya pikir @Tanktalus memberikan contoh yang bagus.
Nick Stinemates
4

Dari MSDN ,

Tautan simbolik

Tautan simbolik adalah objek sistem file yang menunjuk ke objek sistem file lain. Objek yang ditunjuk disebut target.

Tautan simbol bersifat transparan bagi pengguna; tautan muncul sebagai file atau direktori normal, dan dapat ditindaklanjuti oleh pengguna atau aplikasi dengan cara yang persis sama.

Tautan simbolis dirancang untuk membantu migrasi dan kompatibilitas aplikasi dengan sistem operasi UNIX. Microsoft telah mengimplementasikan tautan simbolisnya untuk berfungsi seperti halnya tautan UNIX.

Tautan simbolik dapat berupa tautan absolut atau relatif. Tautan absolut adalah tautan yang menentukan setiap bagian dari nama jalur; tautan relatif ditentukan relatif ke tempat penentu tautan relatif berada di jalur yang ditentukan

Contoh Link Simbol Mutlak

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Contoh Tautan Simbol Relatif

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

Tautan keras

Sebuah hard link adalah sistem file representasi dari sebuah file dengan yang lebih dari satu jalur referensi file tunggal dalam volume yang sama .

Untuk membuat tautan keras di windows, navigasikan ke tempat tautan itu dibuat dan masukkan perintah ini:

mklink /H Link_name target_path

Perhatikan bahwa Anda dapat menghapus tautan keras pesanan apa pun, terlepas dari urutan pembuatannya. Juga, tautan keras tidak dapat dibuat kapan

  • referensi ada di drive lokal yang berbeda
  • referensi termasuk drive jaringan. Dengan kata lain, salah satu referensi adalah drive jaringan
  • tautan keras yang akan dibuat berada di jalur yang sama dengan target

Persimpangan jalan

NTFS mendukung jenis tautan lain yang disebut persimpangan. MSDN mendefinisikannya sebagai berikut:

Persimpangan (juga disebut tautan lunak) berbeda dari tautan keras karena objek penyimpanan yang dirujuknya adalah direktori yang terpisah, dan persimpangan dapat menghubungkan direktori yang terletak di volume lokal yang berbeda di komputer yang sama . Jika tidak, persimpangan berfungsi identik dengan tautan keras.

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:

mklink /J link_name target_path
Sнаđошƒаӽ
sumber
3

Juga:

  1. Membaca kinerja tautan keras lebih baik daripada tautan simbolik (kinerja mikro)
  2. Tautan simbolik dapat disalin, dikendalikan versi, dll. Dengan kata lain, mereka adalah file yang sebenarnya. Di sisi lain, tautan keras adalah sesuatu di tingkat yang sedikit lebih rendah dan Anda akan menemukan bahwa dibandingkan dengan tautan simbolis, ada lebih sedikit alat yang menyediakan sarana untuk bekerja dengan tautan keras sebagai tautan keras dan bukan sebagai file biasa.
Amr Mostafa
sumber
3

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.

Yassine Abdul-Rahman
sumber
3

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.

gnasher729
sumber
2

Entri direktori adalah tautan sebuah struktur:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino adalah jumlah inode, nama adalah nama file, struktur inode mungkin seperti:

struct inode{
      link_t nlink; 
      ...
}

misalnya Anda membuat file / 1, entri direktori mungkin seperti:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

inode struct mungkin menyukai:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

kemudian Anda membuat tautan keras (mungkin / 100), entri direktori mungkin seperti:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

inode struct mungkin menyukai:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

lalu Anda membuat tautan simbolis (mungkin / 200) ke file 1, entri direktori mungkin seperti:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

inode struct mungkin menyukai:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */
mc.robin
sumber
2

Menambah semua jawaban di atas, perbedaan dalam menemukan file hardlink dan softlink dapat dipahami sebagai berikut:

Saya memiliki file f6di direktori saya saat ini, serta direktori bernamat2 .

Nama file f1dan ./t2/f2tautan simbolis kef6 .

Nama file f7dan ./t2/f8merupakan tautan keras darif6 .

Untuk menemukan tautan lunak dan keras, kita dapat menggunakan:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

Untuk menemukan hanya tautan keras yang dapat kita gunakan:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Karena hardlink dapat dibuat pada sistem file yang sama, kami dapat mencari semua hardlink tanpa -Lopsi 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).

ChandanK
sumber
1

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.

lmmorris1
sumber
Tidak. Symlink bukan "nama lain untuk file yang sama", itu adalah file yang memiliki hak sendiri, menghubungkan ke file target.
Kusalananda
1

Dua sen saya pada penggunaan:

Tautan lunak dapat digunakan untuk mempersingkat nama jalur panjang, yaitu:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

Perubahan yang dilakukan /short/file.txtakan diterapkan pada file asli.

Tautan keras dapat digunakan untuk memindahkan file-file besar:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

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

Matheus Santoro
sumber
0

Saya baru saja menemukan cara mudah untuk memahami tautan keras dalam skenario umum, memasang perangkat lunak.

Suatu hari saya mengunduh perangkat lunak ke folder Downloadsuntuk diinstal. Setelah saya lakukan sudo make install, beberapa executable cpdiedit ke folder bin lokal. Di sini, cpbuat tautan keras . Saya senang dengan perangkat lunak tetapi segera menyadari bahwa Downloadsitu bukan tempat yang baik dalam jangka panjang. Jadi saya mvmengedit folder perangkat lunak ke sourcedirektori. 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.

tengah lapangan
sumber
0

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

s. srinath
sumber