Почему новый каталог имеет количество жестких ссылок 2, прежде чем что-то добавить в него?

38

Скажем, я просто создаю каталог newDirectory, а затем делаю команду ls -ld. Я вижу, что количество жестких ссылок равно 2. Что именно делает жесткую ссылку 2 с самого начала? Кроме того, количество подкаталогов в текущем каталоге равно количеству жестких ссылок - 2?

Джон
источник
Чрезвычайно похожие или связанные вопросы: unix.stackexchange.com/questions/22664/… , unix.stackexchange.com/questions/22664/… , unix.stackexchange.com/questions/21847/…
Брюс Эдигер,

Ответы:

39

Исторически , первая файловая система Unix создавала две записи в каждом каталоге: .указывая на сам каталог и ..указывая на его родителя. Это обеспечило простой способ обхода файловой системы, как для приложений, так и для самой ОС.

Таким образом, каждый каталог имеет количество ссылок 2 + n, где n - это количество подкаталогов. Ссылки - это запись для этого каталога в его родительском элементе, собственная .запись каталога и ..запись в каждом подкаталоге. Например, предположим, что это содержимое поддерева, корень которого находится во /parentвсех каталогах:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

Затем dirимеет счетчик ссылок 5: dirзапись в /parent, .запись в /parent/dirи три ..записи в каждой из /parent/dir/sub1, /parent/dir/sub2и /parent/dir/sub3. Так /parent/dir/sub1как не имеет подкаталога, его счетчик ссылок равен 2 ( sub1запись в /parent/dirи .запись в /parent/dir/sub1).

Чтобы свести к минимуму количество специальных регистров для корневого каталога, у которого нет «правильного» родителя, корневой каталог содержит ..запись, указывающую на себя. Таким образом, он также имеет счетчик ссылок 2 плюс количество подкаталогов, где 2 /.и /...

Более поздние файловые системы, как правило, отслеживали родительские каталоги в памяти и, как правило, не нужны .и ..существуют как реальные записи; Типичные современные Unix-системы рассматривают .и ..как специальные значения как часть кода файловой системы, независимого от типа файловой системы. Некоторые файловые системы по-прежнему включают .и ..записи, или делают вид, что на диске ничего не появляется.

Большинство файловых систем до сих пор сообщают количество ссылок на 2 + п для каталогов , независимо от того .и ..существуют записи, но есть исключения, например , Btrfs не делает этого.

Жиль "ТАК - прекрати быть злым"
источник
4
..указание на родителя не влияет на количество ссылок текущего каталога. Счетчик 2 исходит из .самого каталога (оригинального) имени. То, как вы это называете, немного двусмысленно, и звучит так, как .и ..они. ..следует использовать только для объяснения того, как работает математика 2+n:)
th3an0maly
@ th3an0maly Указание на родителя влияет на количество ссылок родителя. Я действительно не вижу, как «запись в каждом подкаталоге» является неоднозначной, и я не понимаю, что вы подразумеваете под «списком имен каталогов».
Жиль "ТАК - перестань быть злым"
На самом деле, этот ответ: unix.stackexchange.com/a/101516/160264 - это именно то, на что я намекал. Прочитайте его после того, как я прочел ваш ответ, так как ваш был первым.
th3an0maly
@ th3an0maly Я до сих пор не понимаю, на что ты намекаешь. Не могли бы вы выразить это ясно, вместо намеков?
Жиль "ТАК - перестань быть злым"
Ответ @ goldilocks ясен. Я хотел сказать, что ваш ответ может быть больше похож на его. Но тогда я не читал его ответ, когда читал ваш ответ. Первая строка - это именно то, что сказал мой первоначальный комментарий: «Есть один для самого каталога и один для .него». Если вам все еще неясно, мне очень жаль, что я не могу уточнить дальше. Все, что я мог сделать лучше, это скопировать + вставить свой ответ здесь в комментариях.
th3an0maly
13

Есть один для самого каталога, и один для .него.

Кроме того, количество подкаталогов в текущем каталоге равно количеству жестких ссылок - 2?

Это имеет смысл, поскольку каждый подкаталог создает ..жесткую ссылку, и кроме этого вы не можете создавать жесткие ссылки на каталоги. 1 Тем не менее, я бы не стал доверять этому что-либо серьезное, особенно. так как легко подсчитать подкаталоги и получить действительное число.

Если вы просто смотрите на lsвывод, чтобы получить представление о количестве подводных лодок, тогда он даст вам достойную идею.

1 Или, по крайней мере, вы не можете с ln. Я не пытался программно, и man 2 linkэто неоднозначно - нет очевидной ошибки для ссылки на каталог, хотя есть пара, которая может применяться ( EMLINK, EPERM). Поэтому, если где-то не существует какого-либо стандарта, в котором говорится, что единственными возможными жесткими ссылками на каталог являются, .и .., опять же, я бы отнесся к этому количеству жестких ссылок как к случайной подсказке.

лютик золотистый
источник
2
Разрешены ли ссылки на каталоги, и можете ли вы подсчитать подкаталоги из счетчика ссылок, зависит от того, какую файловую систему вы используете - некоторые разрешают, некоторые нет.
Алан
Обратите внимание, что MacOS Time Machine фактически связывает каталоги с предыдущими резервными копиями; таким образом они могут делать вид, что каждая инкрементная резервная копия является полной копией, и они могут удалять любые инкрементальные копии, не затрагивая другие. Это также очень хрупко, я играл с ним, используя обычные системные вызовы, и я тщательно использовал свою файловую систему.
17