Apa perbedaan antara tautan keras dan file?


37

Sebuah hard link didefinisikan sebagai pointer ke inode. Sebuah soft link , juga dikenal sebagai symbolic link , didefinisikan sebagai file independen yang menunjuk ke link lain tanpa pembatasan hard link.

Apa perbedaan antara file dan tautan keras? Tautan keras mengarah ke inode, jadi apa itu file? Entri inode itu sendiri? Atau inode dengan tautan keras?

Katakanlah saya membuat file dengan sentuhan. Kemudian entri inode dibuat dalam tabel inode . Dan saya membuat tautan keras, yang memiliki nomor inode yang sama dengan file. Jadi, apakah saya membuat file baru? Atau file tersebut hanya didefinisikan sebagai inode?


Ini hampir pasti merupakan duplikat dari unix.stackexchange.com/questions/9575/…
diinfiks

7
@infix Tidak persis, saya menanyakan perbedaan file dan tautan keras.
Levent Divilioglu

Jadi saya telah membatalkan jawaban asli saya yang saya percaya juga tercakup dalam jawaban untuk pertanyaan terkait itu. Jadi, apakah masih 'tepatnya tidak'?
dipasang

7
Perbedaan antara file dan hardlink sama dengan perbedaan antara Anda dan baris dengan nama Anda di buku telepon.
Jörg W Mittag

Jawaban:


61

Jawaban yang sangat singkat adalah:

  • file adalah gumpalan data anonim
  • hardlink adalah nama untuk suatu file
  • tautan simbolik adalah file khusus yang isinya pathname

File dan direktori Unix bekerja persis seperti file dan direktori di dunia nyata (dan tidak seperti folder di dunia nyata); Filesystem Unix terstruktur (secara konseptual) seperti ini:

  • file adalah gumpalan data anonim; tidak memiliki nama, hanya nomor (inode)
  • direktori adalah jenis file khusus yang berisi pemetaan nama ke file (lebih khusus inode); karena direktori hanya file, direktori dapat memiliki entri untuk direktori, itulah cara rekursi diimplementasikan (catatan bahwa ketika Unix filesystem diperkenalkan, ini tidak sama sekali jelas, banyak sistem operasi tidak memungkinkan direktori mengandung direktori kembali kemudian)
  • entri direktori ini disebut hardlink
  • tautan simbolik adalah jenis file khusus lainnya, yang isinya adalah pathname; nama path ini ditafsirkan sebagai nama file lain
  • jenis file khusus lainnya adalah: soket, fifos, perangkat blok, perangkat karakter

Mempertahankan metafora ini dalam pikiran, dan secara khusus mengingat bahwa direktori Unix bekerja seperti direktori dunia nyata dan tidak seperti folder dunia nyata menjelaskan banyak "keanehan" yang sering ditemui pendatang baru, seperti: mengapa saya bisa menghapus file yang saya tidak punya? tidak memiliki akses tulis? Untuk satu, Anda tidak menghapus file, Anda menghapus salah satu dari banyak nama yang mungkin untuk file, dan untuk melakukan itu, Anda hanya perlu menulis akses ke direktori, bukan file. Sama seperti di dunia nyata.

Atau, mengapa saya bisa memiliki symlink yang menggantung? Nah, symlinknya hanya berisi pathname. Tidak ada yang mengatakan bahwa sebenarnya harus ada file dengan nama itu.

Pertanyaan saya hanyalah apa perbedaan file dan tautan keras?

Perbedaan antara file dan tautan keras sama dengan perbedaan antara Anda dan baris dengan nama Anda di buku telepon.

Tautan keras mengarah ke inode, jadi apa itu file? Entri inode itu sendiri? Atau Inode dengan tautan keras?

File adalah bagian data anonim. Itu dia. File bukan inode, file memiliki inode, sama seperti Anda bukan Nomor Jaminan Sosial, Anda memiliki SSN.

Tautan keras adalah nama untuk suatu file. Suatu file dapat memiliki banyak nama.

Katakanlah, saya membuat file dengan sentuhan, kemudian entri Inode dibuat di Tabel Inode .

Iya nih.

Dan saya membuat tautan keras, yang memiliki nomor Inode yang sama dengan file tersebut.

Tidak. Tautan keras tidak memiliki nomor inode, karena ini bukan file. Hanya file yang memiliki nomor inode.

Hardlink mengaitkan nama dengan nomor inode.

Jadi, apakah saya membuat file baru?

Iya nih.

Atau file tersebut hanya didefinisikan sebagai Inode?

Tidak. File memiliki inode, bukan inode.


15
Saya tidak pernah benar-benar mengerti (atau memikirkan dengan baik) apa metafora di balik kata "direktori". Contoh buku telepon adalah contoh yang bagus; mungkin Anda harus memperkenalkannya lebih awal (ketika Anda pertama kali menyebutkan dunia nyata). Demikian pula, kebanyakan orang jarang berurusan dengan "file" di luar komputer, jadi mungkin akan lebih jelas untuk mengatakan "seperti file kertas, dan direktori seperti buku telepon".
IMSoP

2
@ IMSoP Ini adalah kesenjangan generasi. Sebelum komputer, buku telepon adalah salah satu dari jenis direktori. Cambridge kamus mengatakan: " direktori: sebuah buku yang memberikan daftar nama, alamat, atau fakta lain [... contoh] Carilah jumlah mereka di buku telepon. "
kubanczyk

2
@kubanczyk Memang - untuk orang-orang yang bekerja di kantor pra-digital, saya kira metafora tampak begitu jelas sehingga rasanya hampir merendahkan untuk menjelaskannya. Tetapi bagi generasi saya dan di bawahnya, tidak jelas mengapa area penyimpanan di belakang mobil disebut "boot" atau "bagasi", jadi Anda harus benar-benar mengejanya.
IMSoP

Kata "miliki" dalam frasa "Tautan keras tidak memiliki nomor inode" mungkin menyesatkan, karena Anda mengatakan bahwa "Tautan mengaitkan nama dengan nomor inode". Struktur data entri direktori "hardlink" sebenarnya berisi inode # - ini adalah bagaimana tautan "dikaitkan" dengan inode #. By "not have" Saya pikir maksud Anda hardlink tidak memiliki inode # yang menunjukkan di mana tautan disimpan pada disk.
Kelvin

2
Mengatakan bahwa file memiliki inode agak mundur. Inode adalah struktur yang berisi informasi tentang di mana "gumpalan data" berada. Jika tidak ada inode, tidak ada file.
Barmar

18

Tautan keras adalah entri direktori. File mungkin memiliki beberapa entri direktori, jika ada di bawah nama yang berbeda atau di direktori yang berbeda. Entri direktori disebut "tautan keras" ketika dimasukkan dalam kaitannya dengan entri direktori lain untuk file yang sama.

Inode berisi metadata file selain dari nama dan isinya (lokasi konten, izin, cap waktu, dll.). Ada satu inode per file. (Tidak semua sistem file meletakkan metadata dalam ruang yang dapat diidentifikasi dengan jelas pada disk yang bisa Anda sebut "inode", tetapi itu adalah arsitektur umum.) Entri direktori menghubungkan nama ke inode. Dimungkinkan untuk lebih dari satu entri direktori untuk menautkan ke inode yang sama, maka istilah "tautan". Tautan semacam itu disebut "tautan keras" dengan menentang "tautan lunak" atau "tautan simbolik" yang tidak mengatakan "untuk nama ini, gunakan inode ini" tetapi "untuk nama ini, cari nama lain itu".

Pikirkan file sebagai entri kamar dan direktori sebagai pintu. "Buka file /foo/bar" berarti "pergi ke koridor /foodan pergi ke kamar bar". "Pergi ke kamar bar" benar-benar berarti "membuka pintu bertanda bardan memasuki ruangan" tetapi "pergi ke kamar bar" adalah cara biasa untuk mengatakan hal yang sama dengan cara yang lebih pendek. Mungkin saja memiliki lebih dari satu pintu menuju ke ruangan yang sama.

Saat Anda membuat tautan keras ke file yang ada ( ln existing new), Anda membuat tautan kedua ke file yang sama, yaitu Anda membuat entri direktori baru yang menautkan ke file yang sudah ada. Setelah pembuatan, kedua entri direktori memiliki status yang sama: tidak ada satu yang "primer" dan satu yang "sekunder", keduanya hanya tautan ke file yang sama.

Anda juga dapat menghapus semua tautan ke file tanpa menghapus file itu sendiri. Ini terjadi jika Anda menghapus file (yaitu Anda menghapus semua entri direktori) saat program masih memiliki file terbuka. File tetap pada sistem file, itu hanya benar-benar dihapus ketika proses terakhir yang membuka file menutupnya. Dalam metafora kamar-dan-pintu, ruangan yang tidak memiliki pintu masih membutuhkan ruang.


Kapan pertama kali tautan keras dan lunak diperkenalkan?
n611x007

2
@ n611x007: Bisakah Anda membuka pertanyaan baru jika Anda memiliki pertanyaan baru atau tindak lanjut? Bagian komentar tidak cocok atau dimaksudkan untuk pertanyaan baru atau diskusi panjang. Terima kasih.
David Foerster

1
@ n611x007 Tautan keras lebih tua dari Unix, v1 memilikinya . Symlinks di Unix sedikit lebih baru; Wikipedia memiliki beberapa sejarah.
Gilles 'SO- stop being evil'

Kamar dan pintu adalah analogi yang bagus! Symlink kemudian seperti tanda ke pintu.
curiousdannii

1
@curiousdannii: Symlinks lebih seperti kamar dengan orang yang duduk di dalamnya yang mengatakan "oi m8 office salah masuk ke # 234 sebagai gantinya"
Lightness Races with Monica

8

Selain semua jawaban lain, saya ingin menunjukkan properti penting berikut:

Softlink adalah referensi yang benar, yaitu itu adalah file kecil yang berisi nama path. Menyelesaikan softlink terjadi secara transparan ke aplikasi: jika suatu proses membuka file, katakan /this/path/hereyang merupakan symlink menunjuk ke /that/other/pathmaka seluruh penanganan pembukaan /that/other/pathdilakukan oleh OS. Selanjutnya, jika /that/other/pathkebetulan menjadi symlink itu sendiri, maka ini juga sedang ditangani oleh OS. Bahkan, OS mengikuti rantai symlink sampai menemukan sesuatu yang lain (misalnya file biasa) atau sampai mencapai SYMLOOP_MAX(lihat sysconf(3)) banyak entri, dalam hal ini OS (lebih tepatnya: panggilan sistem yang sesuai) mengembalikan kesalahan dan menetapkan errnountuk ELOOP. Dengan demikian, referensi melingkar seperti xyz -> xyztidak akan menghentikan proses. (Untuk sistem Linux lihat path_resolution(7)detail lengkapnya.)

Perhatikan bahwa suatu proses dapat memeriksa apakah pathname adalah symlink atau tidak melalui penggunaan lstat(2)dan dapat memodifikasi atribut file-nya (disimpan dalam tabel inode) melalui lchown(2)dan lain-lain (lihat symlink(7)keseluruhan cerita.)

Sekarang, dalam hal izin Anda akan melihat bahwa symlink selalu memiliki izin 777 ( rwxrwxrwxdalam notasi simbolis). Ini karena fakta bahwa izin lainnya dapat dilewati dengan mengakses file yang sebenarnya. Sebaliknya, 777 untuk symlink tidak membuat file symlink dapat diakses jika tidak dapat diakses sejak awal. Sebagai contoh, symlink dengan izin 777 menunjuk ke file dengan izin 640 tidak membuat file tidak dapat diakses oleh "lain" (masyarakat umum). Dengan kata lain, file xyzdapat diakses melalui symlink jika dan hanya jika dapat diakses secara langsung, yaitu tanpa tipuan. Dengan demikian, izin symlink tidak memiliki efek keamanan apa pun.

Salah satu perbedaan utama yang terlihat antara hardlinks dan symlinks (alias softlinks) adalah bahwa symlinks bekerja di seluruh filesystems sementara hardlinks terbatas pada satu filesystem. Yaitu, file di partisi A dapat disinkronkan ke dari partisi B, tetapi tidak dapat di-hardlink dari sana. Ini jelas dari kenyataan bahwa hardlink sebenarnya adalah entri dalam direktori, yang terdiri dari nama file dan nomor inode, dan bahwa nomor inode unik hanya per sistem file.

Istilah hardlink sebenarnya agak menyesatkan. Sementara untuk sumber dan tujuan symlink dapat dibedakan dengan jelas (symlink memiliki entri sendiri dalam tabel inode), ini tidak berlaku untuk hardlink. Jika Anda membuat hardlink untuk file, entri asli dan hardlink tidak dapat dibedakan dalam hal apa yang ada di sana terlebih dahulu. (Karena mereka merujuk pada inode yang sama, mereka berbagi atribut file mereka seperti pemilik, izin, cap waktu dll.) Ini mengarah pada pernyataan bahwa setiap entri direktori sebenarnya adalah hardlink, dan bahwa menghubungkan file dengan cara hanya berarti membuat yang kedua ( atau ketiga, atau keempat ...) hardlink. Bahkan, setiap inode menyimpan penghitung untuk jumlah hardlink ke inode itu.

Terakhir, perhatikan bahwa pengguna biasa mungkin tidak memiliki direktori hardlink. Ini karena ini harus dilakukan dengan sangat hati-hati: pengguna yang tidak waspada dapat memperkenalkan siklus ke hierarki file hierarki yang ketat, yang semua alat biasa (seperti fsck) dan OS itu sendiri tidak siap untuk menangani.


6

Jawaban sederhana:

  • Entri file dalam direktori adalah tautan keras ke file itu.

  • Beberapa file memiliki lebih dari satu tautan keras seperti itu, karena banyak tautan keras ke file yang sama diizinkan.


3

Pada hari-hari awal Unix, file-file internal adalah inode pada disk drive tertentu. Nama file adalah cara yang lebih ramah untuk mengaksesnya.

Tautan keras menetapkan lebih dari satu nama file ke inode. Anda dapat membuat file, menautkan nama kedua ke dalamnya dan menghapus nama depan dan itu tidak bisa dibedakan dengan hanya membuat file dengan nama kedua di tempat pertama.

Memang, panggilan sistem yang perlu digunakan program untuk menghapus file adalah 'batalkan tautan (2) `. Data tidak hilang sampai nama belakang tidak terhubung dari inode. (dan inode tidak terbuka oleh suatu proses di suatu tempat)

Inilah yang membuatnya lebih mudah bagi Linux untuk memutakhirkan sesuatu sambil tetap menjalankan program. Jika suatu proses menjalankan suatu yang dapat dieksekusi, dan pembaruan terjadi maka nama program akan digunakan kembali, tetapi inode yang berisi versi lama masih ada sehingga dapat terus berjalan. Dan ketika proses terakhir yang menjalankan versi lama berhenti, penyimpanan versi lama dilepaskan.

Tautan lunak muncul karena ketika Anda memiliki pohon file kesatuan, dengan beberapa titik pemasangan, Anda tidak dapat membuat tautan keras dari satu hard drive ke inode yang lain. Jadi tautan lunak ditemukan.


Saya kira ini adalah duplikat dari unix.stackexchange.com/questions/9575/…
diinfiks

2
early daysmengapa sekarang berbeda? jawaban Anda sepertinya tidak mencerminkan pandangan itu?
n611x007

@ n611x007 Karena 'hari ini' hal-hal seperti Linux dapat memasang sistem file jenis non-unix yang tidak sesuai dengan model inode. Seperti derivatif FAT dan ISO-9660 misalnya. Ini adalah ekologi sistem file yang jauh lebih beragam daripada hanya satu ukuran untuk semua
dipasang

1

File adalah data yang ditulis pada disk. Data ini direferensikan oleh inode-nya, yang berisi metadata tentang file yang memberitahu sistem apa blok pada disk yang digunakan oleh file ini, antara lain. Tautan keras menunjuk ke nomor inode dari file ini.

Jadi secara teknis, ya, Anda membuat file baru, tetapi semua file ini berisi nomor inode untuk file yang dirujuk dan namanya. Lebih baik menganggapnya sebagai membuat pointer ke inode, atau pointer ke file.


1

File adalah konsep yang banyak digunakan tentang entri dalam sistem file.

Biasanya itu termasuk Direktori , File Biasa (hard link), dan Symbolic Link (soft link). Dan bahkan mungkin termasuk perangkat dan soket.

Pertanyaan saya hanyalah apa perbedaan file dan tautan keras? Tautan keras mengarah ke inode, jadi apa itu file? Entri inode itu sendiri? Atau Inode dengan tautan keras?

Katakanlah, saya membuat file dengan sentuhan, kemudian entri Inode dibuat di Tabel Inode. Dan saya membuat tautan keras, yang memiliki nomor Inode yang sama dengan file tersebut. Jadi, apakah saya membuat file baru? Atau file tersebut hanya didefinisikan sebagai Inode?

Karena bahkan tautan simbolik biasanya dihitung sebagai file, tautan keras itu sendiri juga dapat dihitung sebagai file. Anda dapat mengatakan itu file terlepas dari apakah itu tautan keras atau lunak.

Konsepnya agak ambigu sehingga tidak masalah untuk mengatakan bahwa entri inode adalah file, meskipun Anda mungkin sebenarnya ingin merujuk ke data.

Jika Anda seorang programmer C ++ atau Java, Anda mungkin ingin membaca tentang std :: filesystem :: file_type , java.io.File , dan java.nio.file.Files .

Rincian tentang perbedaan antara tautan keras dan tautan lunak dapat ditemukan di tautan dalam komentar infixed.


1

Perbedaan antara "file" dengan nama yang diberikan dan "tautan keras" adalah salah satu dari sejarah. File (biasa) dengan nama yang diberikan dibuat menggunakan panggilan sistem creat, tautan keras dibuat menggunakan panggilan sistem tautan.

Namun, sementara manusia berbicara tentang dan mengingat sejarah entri direktori dan menyebutnya file dan tautan keras yang sesuai, sistem file tidak. Entri direktori "file asli" dan "tautan keras" benar-benar tidak dapat dibedakan dalam kualitas: keduanya menetapkan referensi antara nama file dan inode file, dan begitu referensi terakhir hilang (referensi bukan hanya nama file untuk sebuah file tetapi juga deskriptor file yang dengannya file yang dibuka dapat diakses), file untuk inode yang tidak direferensikan dianggap dihapus dan inode serta ruang file terkait direklamasi.

Jadi ketika manusia membandingkan "file" dan "tautan keras", yang pertama muncul dengan "jumlah tautan 1", dan yang lainnya terbentuk dengan jumlah tautan yang lebih besar. Perbedaannya bersifat akademis, dan memang mengubah nama file pada satu waktu terdiri dari membuat tautan keras untuk nama target dan kemudian menghapus tautan untuk nama sumber. Saat ini, biasanya panggilan sistem tunggal digunakan yang melakukan ini secara atom.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.