Mengapa tautan keras tampaknya mengambil ruang yang sama dengan aslinya?

14

Berkat beberapa T&J yang bagus di sekitar sini dan halaman ini , saya sekarang mengerti tautan. Saya melihat hard link merujuk inode yang sama dengan nama yang berbeda, dan salinannya "berbeda node, dengan nama yang berbeda. Ditambah soft link memiliki nama file asli dan path sebagai inode mereka, jadi jika file dipindahkan, tautan akan terputus.

Jadi, saya menguji apa yang telah saya pelajari dengan beberapa file ("saluton_mondo.cpp" di bawah), membuat tautan yang keras dan lunak serta salinan.

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

Saya menemukan canggung bahwa tautan keras, bagaimanapun, memiliki ukuran yang sama dengan aslinya dan, secara logis, salinannya. Jika tautan keras dan asli berbagi inode yang sama, yang memiliki data, dan hanya berbeda dengan nama file, bukankah tautan keras hanya mengambil ruang namanya, alih-alih 205 byte? Atau apakah itu ukuran file asli yang ls -lhkembali? Tapi bagaimana saya bisa tahu ruang apa yang diambil nama file? Di sini dikatakan tautan keras tidak memiliki ukuran. Apakah nama file mereka disimpan di samping nama file asli? Di mana nama file tautan keras disimpan?

JMCF125
sumber

Jawaban:

16

File adalah inode dengan meta data di antaranya daftar pointer ke mana menemukan data.

Agar dapat mengakses file, Anda harus menautkannya ke direktori (anggap direktori sebagai direktori ponsel, bukan folder), yaitu menambahkan satu atau lebih entri ke salah satu direktori lebih untuk menghubungkan nama dengan file itu.

Semua tautan itu, nama-nama file itu menunjuk ke file yang sama. Tidak ada satu yang asli dan yang lainnya adalah tautan. Mereka semua adalah titik akses ke file yang sama (inode yang sama) di pohon direktori. Ketika Anda mendapatkan ukuran file ( lstatsystem call), Anda sedang mengambil informasi (metadata yang disebutkan di atas) yang disimpan dalam inode, tidak masalah nama file mana, tautan mana yang Anda gunakan untuk merujuk ke file itu .

Sebaliknya, symlink adalah file lain (inode lain) yang isinya merupakan jalur ke file target. Seperti file lainnya, symlink tersebut harus ditautkan ke direktori (harus memiliki nama) sehingga Anda dapat mengaksesnya. Anda juga dapat memiliki beberapa tautan ke symlink, atau dengan kata lain, symlink dapat diberikan beberapa nama (dalam satu atau lebih direktori).

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

Di atas nomor file 10486707 adalah file biasa. Dua entri di direktori saat ini (satu dengan nama a, satu dengan nama b) tautannya. Karena jumlah tautannya adalah 2, kita tahu tidak ada nama lain dari file itu di direktori saat ini atau direktori lainnya. File nomor 10502404 adalah file lain, kali ini jenis symlink ditautkan dua kali ke direktori saat ini. Kontennya (target) adalah jalur relatif "a".

Perhatikan bahwa jika 10502404 ditautkan ke direktori lain dari yang sekarang, biasanya akan menunjuk ke file yang berbeda tergantung pada bagaimana itu diakses.

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

File tidak memiliki nama yang dikaitkan dengan mereka selain dari direktori yang menautkannya. Ruang yang diambil oleh nama mereka adalah entri dalam direktori tersebut, itu diperhitungkan dalam ukuran file / penggunaan disk direktori.

Anda akan melihat bahwa panggilan sistem untuk menghapus file adalah unlink. Artinya, Anda tidak menghapus file, Anda memutuskan tautannya dari direktori tempat mereka dirujuk. Setelah dihapus tautan dari direktori terakhir yang memiliki entri ke file yang diberikan, file itu kemudian dihancurkan (selama tidak ada proses memilikinya dibuka).

Stéphane Chazelas
sumber
Ahh ... Sekarang saya mengerti. Jadi file yang disebut "hai" dan salinan persisnya yang disebut "ajhĝjdmjefsjmksgskgjkmŝŭna" mengambil ruang yang persis sama; karena nama mereka tidak masuk hitungan untuk lstatpanggilan sistem yang mendapatkan ukuran mereka.
JMCF125
@ JMCF125, ya ukuran yang diambil oleh nama mereka adalah entri di direktori yang sesuai, itu diperhitungkan dalam ukuran file direktori.
Stéphane Chazelas
Terima kasih. Bisakah Anda memasukkan itu dalam jawaban Anda? Tunggu, saya akan mengklarifikasi pertanyaan saya terlebih dahulu.
JMCF125
5

Hard link pada dasarnya adalah file asli. Jadi, ukuran yang Anda lihat dilaporkan adalah ukuran file yang ditautkan. Ini adalah tautan lunak yang hanya mengambil ruang nama mereka (agak).

Sejauh menyangkut filesystem, hard link dan aslinya adalah hal yang sama, mereka menunjuk ke inode yang sama sehingga ukuran yang sama dilaporkan.

terdon
sumber
Tetapi nama tautan keras itu harus mengambil tempat, benar?
JMCF125
Lihat jawaban @ stephan di bawah, ia menjelaskannya dengan lebih baik.
terdon
2
@ JMCF125 Ya, tetapi ruang itu ada di dalam direktori. Jika Anda membuat cukup file, Anda akan melihat bahwa ukuran direktori bertambah. Ukuran file tidak termasuk metadata-nya seperti namanya.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles, terima kasih, tetapi @Stephane telah memperbarui jawabannya dengan informasi itu. Juga, sekarang saya pikir itu lebih baik, nama /harus disimpan dalam dirinya sendiri, seolah-olah Anda lakukan cd ..di /Anda tinggal di /.
JMCF125