Apa perbedaan antara tautan keras dan tautan simbolik?

488

Seperti judulnya, saya ingin tahu perbedaan antara tautan keras dan tautan lunak yang dibuat oleh perintah ln. Perintah man lnmemang memberikan informasi, tetapi tidak cukup menjawab pertanyaan saya.

Juga, alangkah baiknya jika seseorang dapat memberikan pengaturan di mana tautan keras mungkin lebih disukai daripada tautan simbolis.

ste_kwr
sumber
15
salah satu perbedaan ... Anda memiliki beberapa file, misalnya pengujian file. Jika Anda membuat ln test hardlink, buat ln -s test symlink dan kemudian pindahkan file test ke dir (atau rename) lain, symlink tidak akan berfungsi. Hardlink akan berfungsi. Sekarang coba hapus file test. Hardlink akan tetap berfungsi, bahkan Anda masih dapat mengakses file hingga jumlah hardlink ke file bukan 0. Thats karena inode, ini ditulis secara manual ...
Denwerko
5
Saya telah membuka kembali ini karena layak mendapatkan jawaban umum yang baik tentang masalah ini (tidak seperti pertanyaan sebelumnya yang merupakan contoh C yang tidak jelas).
Oli
4
Jawaban terbaik: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia
1
Juga jawaban yang cukup lengkap: stackoverflow.com/questions/185899/…
Elzo Valugi
@AbhishekBhatia video tidak tersedia
Ooker

Jawaban:

59

Di Linux / Unix, Shortcuts dikenal sebagai Links


Tautan terdiri dari dua jenis: tautan lunak (tautan simbolik) atau tautan keras.

  1. Tautan Lunak (tautan simbolik)

    Anda dapat membuat tautan ke file dan direktori, dan Anda dapat membuat tautan (pintasan) pada partisi yang berbeda dan dengan nomor inode yang berbeda dari aslinya.

    Jika nyata copy dihapus, link tidak akan bekerja .

  2. Tautan Keras

    Tautan keras hanya untuk file; Anda tidak dapat menautkan ke file di partisi yang berbeda dengan nomor inode yang berbeda.

    Jika nyata salinan menghapus link yang akan bekerja , karena ia mengakses data yang mendasari copy yang sebenarnya mengakses.


Pertanyaan: Bagaimana cara saya membuat tautan lunak?

Jawaban: Tautan lunak dapat dibuat dengan ln -s; pertama-tama Anda perlu mendefinisikan sumber dan kemudian Anda perlu menentukan tujuan. (Ingatlah bahwa Anda perlu menentukan jalur lengkap dari sumber dan tujuan; jika tidak, ia tidak akan berfungsi.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, ia memiliki inode yang berbeda dan dapat dibuat pada partisi yang berbeda.


Pertanyaan: Bagaimana cara saya membuat tautan keras?

Jawaban: Hard link dapat dibuat dengan ln; pertama-tama Anda perlu mendefinisikan sumber dan kemudian Anda perlu menentukan tujuan. (Ingatlah bahwa Anda perlu menentukan jalur lengkap dari sumber dan tujuan; jika tidak, ia tidak akan berfungsi.)

Katakanlah saya memiliki skrip dalam /scriptdirektori bernama firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, ini memiliki inode yang sama. Jika saya menghapus yang asli tautannya akan berfungsi, dan itu akan bertindak seperti aslinya.

masukkan deskripsi gambar di sini

Di atas saya memeriksa apakah tautannya berfungsi, dan kemudian menghapus skrip firefox yang asli.


Anda Pertanyaan: Akan lebih baik jika seseorang dapat memberikan pengaturan di mana tautan keras mungkin lebih disukai daripada tautan simbolis.

Jawaban : Bergantung pada tata letak partisi disk, Hard Link memiliki batasan bahwa mereka harus berada pada partisi yang sama (-1 titik) dan hanya dapat menautkan ke file (-1 titik) ), tetapi +1 menunjuk jika dokumen asli dihapus tautannya akan bekerja dan berfungsi seperti aslinya.

Di sisi lain, tautan lunak dapat menunjuk ke direktori atau file (titik +1) dan tidak ada batasan partisi (titik +1), tetapi (titik -1) jika sumber dihapus tautan tidak akan berfungsi.

Qasim
sumber
Bisakah saya membuat tautan keras dan menyediakan inode sebagai sumbernya?
TMOTTM
324

Hardlink bukan penunjuk ke file, itu adalah entri direktori (file) yang menunjuk ke inode yang sama. Bahkan jika Anda mengubah nama file lain, hardlink tetap menunjuk ke file tersebut. Jika Anda mengganti file lain dengan versi baru (dengan menyalinnya), hardlink tidak akan mengarah ke file baru. Anda hanya dapat memiliki hardlink dalam sistem file yang sama. Dengan hardlink, Anda tidak memiliki konsep file dan tautan asli, semuanya sama (anggap sebagai referensi ke objek). Ini adalah konsep level yang sangat rendah.

Di sisi lain, symlink sebenarnya menunjuk ke jalur lain (nama file); itu memecahkan nama file setiap kali Anda mengaksesnya melalui symlink. Jika Anda memindahkan file, symlink tidak akan mengikuti. Jika Anda mengganti file dengan yang lain, menyimpan namanya, symlink akan menunjuk ke file baru. Symlink dapat menjangkau sistem file. Dengan symlink Anda memiliki perbedaan yang sangat jelas antara file aktual dan symlink, yang tidak menyimpan info di samping path tentang file yang ditunjuknya.

vartec
sumber
1
Suatu hal yang (dengan kata-kata sendiri) "menunjuk ke file" dapat disebut pointer (itu secara sepele hampir secara tautologis benar). Jika kita melakukan nitpicking maka (secara umum) gagasan tentang hardlink mungkin ada bahkan jika sistem file tidak menggunakan inode.
jfs
320

"Sebuah gambar bernilai ribuan kata." Representasi bergambar


Dan, "Sebuah contoh bernilai seratus paragraf ..."

Buat dua file:

$ touch blah1   
$ touch blah2

Masukkan beberapa data ke dalamnya:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

Dan seperti yang diharapkan:

$cat blah1; cat blah2
Cat
Dog

Mari buat tautan keras dan lunak:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Mari kita lihat apa yang baru saja terjadi:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Mengubah nama blah1 tidak masalah:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

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

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

Isi file tidak dapat ditemukan karena tautan lunak menunjuk ke nama, yang diubah, dan bukan ke konten.
Demikian pula, Jika blah1 dihapus, blah1-hard masih menyimpan konten; jika blah2 dihapus, blah2-soft hanyalah tautan ke file yang tidak ada.


sumber: menyalinnya dengan terang-terangan dari StackOverflow!

ABcDexter
sumber
13
Agar adil bagi Anda - Anda memang menambahkan gambar yang indah di bagian atas ... ah Anda juga menyalinnya! Menggabungkan dua jawaban ini sebenarnya sangat membantu :)
icc97
2
lebih baik dijelaskan, tidak ada tempat!
dennisbot
3
Saya terus menatap gambar selama 20 detik dan kemudian, tiba-tiba, saya menemukan jawabannya. Ini sebenarnya brilian.
Mohammed Joraid
1
btw: Menggunakan hardlink dengan git adalah ide yang buruk , untuk berjaga-jaga kalau-kalau seseorang (frustrasi dengan softlink) bertanya-tanya ... bisa berlaku untuk sistem versi lain juga.
Frank Nocke
1
Apakah inode ke hardlinksnya mirip dengan file yang disimpan di cloud untuk perangkat apa pun yang mengaksesnya?
Ooker
89

Keduanya adalah pointer ke file; perbedaannya adalah jenis pointer. Tautan simbolis menunjuk ke file lain dengan nama . Ini memiliki bit mode khusus yang mengidentifikasinya sebagai tautan simbolik, dan isinya adalah nama dari file asli. Karena hanya berisi nama, nama itu sebenarnya tidak harus ada, atau mungkin ada pada sistem file yang berbeda. Jika Anda mengganti file yang dinamai (ubah isinya tanpa memengaruhi namanya), maka tautan itu masih berisi nama yang sama, dan sekarang ia menunjuk ke file yang baru. Anda dapat dengan mudah mengidentifikasi tautan simbolik dan melihat nama file yang ditunjuknya.

Tautan keras menunjuk ke file dengan nomor inode. Dengan demikian, tautan keras tidak berbeda dengan nama depan file. Tidak ada nama "asli" vs. nama tautan keras; semua tautan keras adalah nama yang sama validnya untuk file tersebut. Karena itu, file yang Anda tautkan harus benar-benar ada dan berada di sistem file yang sama di mana Anda mencoba membuat tautan. Jika Anda menghapus nama asli, maka tautan keras masih menunjuk ke file yang sama. Karena semua tautan keras adalah nama yang sama-sama valid untuk file tersebut, Anda tidak dapat melihatnya dan melihat nama-nama lain untuk file tersebut; untuk menemukan ini, Anda harus melihat setiap file dan membandingkan nomor inode mereka untuk menemukan nama lain yang memiliki nomor inode yang sama.

Anda dapat mengetahui berapa banyak nama file dari output ls -l. Angka pertama setelah mode file adalah jumlah tautan. File dengan lebih dari 1 tautan memiliki nama lain di suatu tempat, dan sebaliknya, file dengan jumlah tautan hanya 1 tidak memiliki tautan keras (lainnya).

psusi
sumber
If you replace the named file, then the link still contains the same name, and so now it points to the new file- Saya pikir ini tidak dijelaskan dengan baik. Maksud Anda jika saya mengganti file tempat saya mendapatkan tautan simbolis, maka tautan yang berisi nama itu tetap tidak tersentuh. Tapi itu hanya akan menunjuk ke file yang diganti ketika nama file-nya (yaitu file baru yang menggantikan yang lama) sama dengan yang diganti (yaitu file lama yang diganti dengan yang baru) yang benar, benar?
Mike
@ Mike, ya: tautan simbolik menunjuk ke nama file asli, jadi mengganti file itu berarti tautan sekarang menunjuk ke file baru.
psusi
Tetapi hanya jika itu memiliki nama yang sama dengan benar? Akan symlink menunjuk ke pisang dan saya mengganti file dengan oranye maka tautan sy tidak dapat menemukan file pisang lagi yaitu tidak akan bekerja
Mike
@ Mike, ganti dunia berarti memiliki nama yang sama, jika tidak, Anda hanya menghapus satu file dan menambahkan yang lain;)
psusi
58

Hardlink hanya dapat bekerja pada sistem file yang sama, itu hanya nama yang berbeda untuk inode yang sama (file secara internal direferensikan oleh inode). Sebuah file hanya akan dihapus dari disk ketika tautan terakhir ke inode-nya hilang (Anda rmd atau unlinkd tautan terakhir). Hardlink biasanya hanya berfungsi untuk file, bukan direktori.

Symlink (tautan simbolik) adalah file khusus yang berisi path ke file lain. Jalan ini bisa absolut atau relatif. symlink dapat bekerja di seluruh sistem file, dan bahkan dapat menunjuk ke file yang berbeda, jika Anda misalnya mencabut hard drive eksternal dan menggantinya dengan yang lain, yang memiliki file berbeda di jalur yang sama. Symlink dapat mengarah ke file atau direktori.

rajutan
sumber
Terima kasih, ini memberitahu saya cara kerjanya, tetapi apa sebenarnya yang dilakukan tautan keras? Dan mengapa itu tidak berhasil untuk direktori?
ste_kwr
@ Knittl: Anda yakin? Tampaknya pada beberapa sistem file, tautan ke direktori diizinkan tetapi hanya root yang dapat membuatnya. Lihat -d, -F, --directorysakelar. Dan ya, saya telah melihat catatan di ln(1)halaman :)
0xC0000022L
1
@ kniwor: cara termudah untuk menggambarkan hardlink adalah "hanya nama lain untuk file yang sama (yaitu, data pada disk)". Dan - setidaknya di sistem saya - lntidak dapat digunakan untuk membuat hardlink ke direktori. Ada hardlink ke direktori, contoh yang paling menonjol adalah .dan ... Saya tidak ingin memasukkan itu dalam jawaban asli saya, karena itu hanya akan mempersulit.
knittl
2
@STATUS_ACCESS_DENIED: baiklah ... tapi biasanya itu bukan ide yang baik. Itu sebabnya saya menulis »biasanya« dalam jawaban asli saya. Lihat juga komentar saya sebelumnya untuk contoh.
knittl
jadi tautan keras dapat menunjuk ke folder / file yang sama dengan nama yang berbeda yaitu memiliki nama yang berbeda yang terhubung ke inode yang sama?
Charlie Parker
21

Salah satu jawaban dari utas lainnya (sekarang ditautkan dari bagian atas posting Anda) menyebutkan halaman ini yang menurut saya merupakan penjelasan tingkat menengah yang cukup baik. Jika Anda tersesat dalam ascii art, ini versi tl; dr:

  • File standar adalah pointer dari sistem file ke inode yang pada gilirannya mengarah ke data fisik. Komponen file menyimpan tautannya ke sistem file (dasarnya jalurnya) dan tautan ke inode.
  • Hard-link, sama seperti file. Mereka hanya penunjuk tambahan langsung ke inode.
  • Tautan simbolis adalah file terpisah (termasuk inode dan data terpisah) yang menyimpan jalur sistem file ke file.

Kernel dan sistem file yang terlibat menerjemahkan semuanya secara transparan.

Jadi berdasarkan itu:

  • Hard-link hanya memungkinkan tautan sistem file yang sama. Symlink dapat menunjuk pada jalur apa pun.
  • Hard-link (intinya) menunjuk ke data absolut. Symlinks dapat mengarah ke jalur relatif (misalnya ../parent.file)
  • Dengan ekstensi, jika Anda memindahkan pointer target dari hard-link (yang, ingat, itu sendiri pada dasarnya hanyalah sebuah hard-link yang menunjuk ke sebuah inode), hard-link masih berfungsi. Memindahkan target symlink biasanya akan mematahkan symlink.
  • Memecahkan hard-link akan lebih cepat tetapi tak terkira. Porsi kecepatan yang tidak signifikan itu muncul dengan mengorbankan sistem file yang tidak fleksibel.

Saya mungkin telah sedikit membingungkan diri saya sendiri tetapi membaca berbagai hal, saya berjuang untuk menemukan perbedaan antara file standar dan hardlink. Cara saya membacanya adalah setiap file terdiri dari hardlink (menyimpan nama file), menghubungkan ke inode yang menunjuk pada data fisik.

Menambahkan hardlink hanya menyediakan inode dengan pointer berbasis sistem file tambahan. Apakah itu benar?

Oli
sumber
5
Saya pikir Anda benar, setiap file adalah pathname untuk inode, dan hard link adalah pathname tambahan untuk inode yang sama. Jadi tautan keras tidak berbeda dengan file normal.
enzotib
Saya mencoba memahami ini ... tetapi Anda mengatakan:> "Tautan simbolis adalah file terpisah (termasuk inode dan data terpisah ) yang menyimpan jalur sistem file ke file." Apakah symlink benar-benar memiliki data terpisah? Lalu seperti salinan direktori yang ditautkan, kan? ... dan setiap kali sesuatu ditulis ke symlink, harus ditulis dua kali ke disk? Tidak masuk akal.
MiniGod
@MiniGod Tidak ada symlink adalah inode ke blok data yang menyimpan path ke inode lain (nama file). Ya, ini seperti Matrix membingungkan tetapi setelah Anda mendapatkannya, Anda tidak akan pernah lupa :)
Oli
@Oli Saya mungkin bingung, tetapi ketika Anda mengatakan: "termasuk inode dan data yang terpisah ", maksud Anda symlink memiliki data yang terpisah !?
MiniGod
1
@ MinGod Ya. Symlink adalah inode yang menunjuk ke data (seperti file normal) dan data itu adalah path. Ini sedikit lebih pintar dari itu - untuk memungkinkan penggunaan transparan melalui symlink - tetapi pada dasarnya itulah mereka.
Oli
15

Kapan menggunakan Soft Link:

Tautan antar sistem file: Jika Anda ingin menautkan file di seluruh sistem file, Anda hanya dapat menggunakan symlink / tautan lunak.

Tautan ke direktori: Jika Anda ingin menautkan direktori, maka Anda harus menggunakan tautan lunak, karena Anda tidak dapat membuat tautan keras ke direktori.

Kapan menggunakan Hard Link:

Ruang Penyimpanan: Tautan keras membutuhkan jumlah ruang yang sangat kecil, karena tidak ada inode baru yang dibuat saat membuat tautan keras. Dalam tautan lunak, kami membuat file yang menghabiskan ruang (biasanya 4KB, tergantung pada sistem file)

Kinerja: Performa akan sedikit lebih baik saat mengakses tautan keras, karena Anda secara langsung mengakses penunjuk disk alih-alih melalui file lain. Memindahkan lokasi file: Jika Anda memindahkan file sumber ke beberapa lokasi lain pada sistem file yang sama, tautan keras akan tetap berfungsi, tetapi tautan lunak akan gagal.

Redundansi: Jika Anda ingin memastikan keamanan data Anda, Anda harus menggunakan hard link, seperti pada hard link, data aman, sampai semua tautan ke file dihapus, alih-alih dalam soft link, Anda akan kehilangan data jika instance master file dihapus.

Osama
sumber
Perhatikan bahwa ada juga tautan simbolis cepat untuk ukuran pathname hingga 64 byte. Masih membutuhkan satu inode, tetapi tidak mengkonsumsi ruang blok 4kb.
syockit
8

Kebingungan muncul ketika Anda mencoba menemukan perbedaan antara "nama file" dan tautan keras karena tidak ada.

Setiap file yang Anda buat terdiri dari data pada disk dan tautan keras - yang merupakan nama file dalam direktori dan penunjuk ke data pada disk. Akhir dari cerita. Ketika tautan keras terakhir (atau satu-satunya) dihapus, maka OS tahu bahwa data tidak lagi diperlukan.

Dari sini Anda dapat melihat bahwa data aktual tidak pernah dihapus, hanya tautan kerasnya. Dan ketika sudah cukup ramai di disk, data mungkin ditimpa oleh data file lain. Sampai saat itu, data dari file yang dihapus mungkin dipulihkan, tetapi agak sulit ditemukan tanpa tautan keras.

Symlinks, seperti yang dijelaskan sebelumnya, cukup memberi tahu Anda "ada file bernama <targetname>di folder bernama <targetfolder>". Mereka menunjuk ke tautan yang sulit. Mereka tidak tahu di mana datanya. Tautan keras tahu itu.

Gonesoft
sumber
0

Ini sangat sederhana. File (dan direktori!) Disimpan di alamat pada perangkat blok (HDD atau apa pun). Biasanya Anda memiliki satu nama yang dipetakan ke suatu alamat, dan itulah cara Anda mendapatkan file Anda. Sebuah hard link adalah kedua, ketiga, nama dll dipetakan ke alamat yang sama. Sebuah link simbolik bukan mengacu pada simbol - nama - dan begitu juga nama kedua dipetakan ke nama pertama. Sejauh menyangkut kernel, begitu ia membaca target tautan simbolis itu berhenti dan kembali ke awal dengan nilai target sebagai nama file (lebih atau kurang) sehingga symlink relatif mungkin tetapi sangat tidak membantu. Nama target tidak digunakan di atas tingkat sistem file kecuali jika secara eksplisit ditanya dalam kode userspace.

Jim Driscoll
sumber