Файл - это индекс с метаданными, среди которых список указателей, где найти данные.
Чтобы получить доступ к файлу, необходимо связать его с каталогом (представьте каталоги как телефонные каталоги, а не папки), то есть добавьте одну или несколько записей в один из нескольких каталогов, чтобы связать имя с этим файлом.
Все эти ссылки, эти имена файлов указывают на один и тот же файл. Нет ни одного оригинала, а других ссылок. Все они являются точками доступа к одному и тому же файлу (одному и тому же узлу) в дереве каталогов. Когда вы получаете размер файла ( lstat
системный вызов), вы извлекаете информацию (эти метаданные, упомянутые выше), хранящиеся в inode, не имеет значения, какое имя файла, какую ссылку вы используете для ссылки на этот файл ,
В противоположность этому, символические ссылки - это другой файл (другой индекс), содержимое которого представляет собой путь к целевому файлу. Как и любой другой файл, эти символические ссылки должны быть связаны с каталогом (должно иметь имя), чтобы вы могли получить к ним доступ. Вы также можете иметь несколько ссылок на символические ссылки, или, другими словами, символические ссылки могут иметь несколько имен (в одном или нескольких каталогах).
$ 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
Над номером файла 10486707 находится обычный файл. Две записи в текущем каталоге (одна с именем a
, другая с именем b
) ссылаются на него. Поскольку счетчик ссылок равен 2, мы знаем, что в текущем каталоге или любом другом каталоге нет другого имени этого файла. Файл с номером 10502404 - это другой файл, на этот раз с типом символической ссылки, дважды связанный с текущим каталогом. Его содержание (цель) - это относительный путь «а».
Обратите внимание, что если бы 10502404 был связан с другим каталогом, отличным от текущего, он обычно указывал бы на другой файл в зависимости от того, как к нему обращались.
$ 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
Файлы не имеют имен, связанных с ними, кроме как в каталогах, которые связывают их. Место, занимаемое их именами, является записями в этих каталогах, это учитывается в размере файла / использовании диска в каталогах.
Вы заметите, что системный вызов для удаления файла unlink
. То есть вы не удаляете файлы, вы отсоединяете их от каталогов, на которые они ссылаются. После того, как вы отменили связь с последним каталогом, в котором была запись в данный файл, этот файл затем уничтожается (если его нет у процесса) открыт).
lstat
системного вызова, который получает их размер.Жесткая ссылка, по сути, оригинальный файл. Таким образом, сообщаемый вами размер равен размеру файла, на который идет ссылка. Это мягкие ссылки, которые занимают только пространство их имен (вроде).
Что касается файловой системы, то жесткая ссылка и оригинал - это одно и то же, они указывают на один и тот же индекс, поэтому сообщается об одном и том же размере.
источник
/
должно храниться само по себе, как если бы вы делали этоcd ..
в/
своем пребывании/
.