Це просто погана ідея, оскільки немає можливості сказати різницю між жорстким посиланням та оригінальним іменем.
Дозволення жорстких посилань на каталоги може порушити спрямовану ациклічну структуру графіки файлової системи, можливо, створивши петлі каталогів та звисаючі підтрубки каталогів, що зробить fsck
будь-які інші помилки ходу дерев файлів.
По-перше, щоб зрозуміти це, поговоримо про індекси. Дані у файловій системі зберігаються в блоках на диску, і ці блоки збираються разом за допомогою inode. Ви можете думати про inode як файл THE. Однак у індексах відсутні імена файлів. Ось де входять посилання.
Посилання - це лише вказівник на inode. Каталог - це inode, який містить посилання. Кожне ім'я файлу в каталозі - це лише посилання на індед. Відкриття файлу в Unix також створює посилання, але це інший тип посилання (це не назване посилання).
Жорстке посилання - це лише додатковий запис каталогу, який вказує на цей інод. Коли ви ls -l
, число після дозволів - це названий кількість посилань. Більшість звичайних файлів матиме одне посилання. Створення нового жорсткого посилання на файл призведе до того, що обидві назви файлів вказують на один і той же індекс. Примітка:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
Тепер ви чітко бачите, що немає такого поняття, як жорстке посилання. Жорстке посилання - це те саме, що і звичайне ім'я. У наведеному вище прикладі, test
або test2
, що є оригінальним файлом і який є твердим посиланням? Зрештою, ви не можете насправді сказати (навіть за часовими позначками), оскільки обидва назви вказують на один і той же вміст, на один і той же індет
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
-i
Прапор ls
показує иноді номера на початку рядка. Зверніть увагу на те, як test
і test2
мають однаковий номер inode, але test3
має інше.
Тепер, якщо вам було дозволено це робити для каталогів, два різні каталоги в різних точках файлової системи можуть вказувати на одне і те ж. Насправді, субдір може вказувати на бабусь і дідусь, створюючи цикл.
Чому ця петля викликає занепокоєння? Тому що, коли ви проїжджаєте, немає ніякого способу виявити, що ви лупаєтеся (не відслідковуючи числа іодів під час переходу). Уявіть, що ви пишете du
команду, яку потрібно повторити через підкаталоги, щоб дізнатися про використання диска. Як би du
знати, коли потрапив у петлю? Це схильність до помилок і багато бухгалтерського обліку, що du
потрібно було б зробити, щоб просто зняти це просте завдання.
Символьні посилання - це зовсім інший звір, оскільки вони є особливим типом "файлу", за яким багато API файлових файлових систем прагнуть автоматично слідувати. Зауважте, символьне посилання може вказувати на неіснуюче місце призначення, оскільки вони вказують по імені, а не безпосередньо на індеді. Ця концепція не має сенсу для жорстких посилань, оскільки саме існування "жорсткої посилання" означає, що файл існує.
Так чому можна du
поводитися з символьними посиланнями легко і не жорсткими посиланнями? Вище ми могли переконатися, що жорсткі посилання не відрізняються від звичайних записів каталогів. Симпосилання, однак, спеціальні, виявляються та пропускаються!
du
зауважує, що симпосилання - це симпосилання, і пропускає її повністю!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
вказати? Особливо після видалення жорсткого посилання на цей каталог, у каталог, на який вказує..
? Це потрібно кудись вказати.