Почему жесткие ссылки, похоже, занимают то же место, что и оригиналы?

Благодаря некоторым хорошим вопросам и ответам здесь и на этой странице я теперь понимаю ссылки. Я вижу, что жесткие ссылки ссылаются на один и тот же индексный дескриптор на другое имя, а копии – на разные «узлы с разными именами». Плюс программные ссылки имеют исходное имя файла и путь в качестве своего inode, поэтому, если файл перемещается, ссылка ломается.

Итак, я тестировал то, что я узнал, с некоторым файлом («saluton_mondo.cpp» ниже), сделал жесткую и мягкую ссылку и копию.

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 

Мне было неловко, что жесткая ссылка, однако, имеет тот же размер, что и оригинал и, что логически, копия. Если жесткая ссылка и оригинал имеют один и тот же индекс, который имеет данные и отличаются только именем файла, не должна ли жесткая ссылка занимать только пространство своего имени вместо 205 байтов? Или это размер исходного файла, который ls -lh возвращается? Но как я могу узнать, какое пространство занимает имя файла? Здесь он говорит, что жесткие ссылки не имеют размера. Поддерживается ли их имя файла вместе с именем исходного файла? Где хранится имя файла жестких ссылок?

Файл является inode с метаданными, среди которых список указателей на то, где найти данные.

Чтобы иметь доступ к файлу, вы должны связать его с каталогом (подумайте о каталогах как телефонных каталогах, а не папках), которые добавляют одну или несколько записей в один из других каталогов, чтобы связать имя с этим файлом.

Все эти ссылки, эти имена файлов указывают на один и тот же файл. Это не тот, который является оригиналом, а другие – ссылками. Они все точки доступа к одному и тому же файлу (тот же inode) в дереве каталогов. Когда вы получаете размер файла (системный вызов lstat ), вы получаете информацию (упомянутые выше метаданные), хранящиеся в inode, не имеет значения, какое имя файла, какая ссылка вы используете, чтобы ссылаться на это файл.

В противоположность этому символические ссылки – это другой файл (другой индексный дескриптор), содержимое которого является контуром целевого файла. Как и любой другой файл, эти символические ссылки должны быть связаны с каталогом (должны иметь имя), чтобы вы могли получить к ним доступ. Вы также можете иметь несколько ссылок на символические ссылки, или, другими словами, символическим ссылкам можно дать несколько имен (в одной или нескольких каталогах).

 $ touch a $ ln ab $ ln -sac $ ln cd $ ls -li [ad] 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 

Над файлом номер 10486707 является обычным файлом. Две записи в текущем каталоге (один с именем a , один с именем b ) ссылаются на него. Поскольку число ссылок равно 2, мы знаем, что нет другого имени этого файла в текущем каталоге или в любом другом каталоге. Номер файла 10502404 – это еще один файл, на этот раз типа symlink, связанный дважды с текущим каталогом. Его содержание (цель) – это относительный путь «a».

Обратите внимание, что если 10502404 был связан с другим каталогом, чем текущий, он обычно указывал бы на другой файл в зависимости от того, как он был доступен.

 $ mkdir 1 2 $ echo foo > 1/a $ echo bar > 2/a $ ln -sa 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 

Файлы не имеют имен, связанных с ними, кроме как в каталогах, которые связывают их. Пространство, занятое их именами, – это записи в этих каталогах, это учитывается в размере файлов / дисках в каталогах.

Вы заметите, что системный вызов для удаления файла unlink . То есть вы не удаляете файлы, вы отсоединяете их от каталогов, на которые они ссылаются. После того, как он был отсоединен от последнего каталога, в котором была запись в данный файл, этот файл затем уничтожается (если процесс не выполняется открыт).

Жесткая ссылка – это, по сути, исходный файл. Таким образом, размер, который вы видите, представляет собой размер связанного файла. Это мягкие ссылки, которые занимают только пространство их имен (kinda).

Что касается файловой системы, жесткая ссылка и оригинал – это одно и то же, они указывают на один и тот же индекс, поэтому сообщается о том же размере.