Чому жорсткі посилання не дозволені для каталогів?


129

Я використовую Ubuntu 12.04. Коли я намагаюся створити жорстке посилання для будь-якого каталогу, це не вдається. Я можу створити жорсткі посилання для файлів всередині кордону файлової системи. Я знаю причину, чому ми не можемо створити жорсткі посилання для файлів, що перевищують файлову систему.

Я спробував ці команди:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Я просто хочу знати причину цього. Це однаково для всіх GNU / Linux дистрибутивів та ароматів Unix (BSD, Solaris, HP-UX, IBM AIX) чи лише в Ubuntu чи Linux?



2
Спробуйте, ln -F <src> <dst>і це може спрацювати. Безумовно, він працював на суперрусера в старих версіях Unix. Хтось пам’ятає, чи це було UCB чи System V? Так, погані речі можуть трапитися, але зазвичай ні. Наскільки я пам’ятаю, rmdirзнав, що не продовжувати видаляти минуле жорстке посилання. Однак користувачі можуть заплутатися та видалити речі помилково.
Стів Пітчерс

@StevePitchers Як rmdirособливим чином можна обробляти жорсткі посилання? Жорстке посилання - це лише звичайне посилання - але додаткове. Зрозуміти, чи існують незвичні додаткові посилання без зайвих записів, навіть непросто.
Volker Siegel

1
Кожен вузол зберігає кількість жорстких посилань, які вказують на нього: вміст випускається лише після того, як не залишиться інших. Так rmdirможна сказати, чи є в каталозі посилання з інших місць. Рекурсивне видалення, rm -rповинно бути зашифровано обережно, щоб бути впевненим, що воно буде діяти правильно, навіть якщо помилки типу "дозволу відмовлено". BTW, UCB = BSD, так!
Стів Пітчерс

2
Я ln -Fпрацював у каталогах і працював у ньому. Але після цього ви не наважуєтесь видалити каталог, побоюючись зіпсувати файлову систему.
Едвард Фолк

Відповіді:


159

Жорсткі посилання каталогів розбивають файлову систему декількома способами

Вони дозволяють створювати петлі

Жорстке посилання на каталог може посилатися на сам батьків, який створює цикл файлової системи. Наприклад, ці команди можуть створити цикл із зворотним посиланням l:

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Файлова система з циклом каталогів має нескінченну глибину:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Уникнути нескінченного циклу при переході до такої структури каталогів дещо складно (хоча, наприклад, POSIX вимагає findцього уникати).

Файлова система з таким жорстким посиланням більше не є деревом, оскільки дерево, за визначенням, не повинно містити циклу.

Вони порушують однозначність батьківських каталогів

З циклом файлової системи існує декілька батьківських каталогів:

cd /tmp/a/b
cd /tmp/a/b/l/b

У першому випадку /tmp/aце батьківський каталог /tmp/a/b.
У другому випадку /tmp/a/b/lце батьківський каталог /tmp/a/b/l/b, який такий самий, як /tmp/a/b.
Отже, він має два батьківські каталоги.

Вони множать файли

Файли ідентифікуються шляхом, після вирішення символьних посилань. Тому

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

- це різні файли.
Існує нескінченно багато подальших шляхів файлу. Вони однакові з точки зору їх кількості inode, звичайно. Але якщо ви чітко не очікуєте циклів, немає підстав для цього перевірити.

Жорстке посилання каталогу також може вказувати на дочірній каталог або на каталог, який не є ані дочірнім, ані батьківським. У цьому випадку файл, який є дочірньою ланкою, буде реплікуватися у два файли, ідентифіковані двома шляхами.

Ваш приклад

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Як тоді можуть працювати м'які посилання на каталоги?

Шлях, який може містити софтпосилання і навіть м'які пов'язані петлі каталогів, часто використовується лише для ідентифікації та відкриття файлу. Його можна використовувати як звичайний, лінійний шлях.

Але є й інші ситуації, коли шляхи використовуються для порівняння файлів. У цьому випадку символьні посилання на шляху можуть бути вирішені спочатку, перетворивши його на мінімальний , і зазвичай узгоджене уявлення, створюючи канонічний шлях :

Це можливо, тому що м'які посилання можуть бути розширені до шляхів без посилання. Зробивши це з усіма м'якими посиланнями на контуру, шлях, що залишився, є частиною дерева, де шлях завжди однозначний.

Команда readlinkможе вирішити шлях до свого канонічного шляху:

$ readlink -f /some/symlinked/path

М'які посилання відрізняються від тих, що використовує файлова система

М’яке посилання не може викликати всіх проблем, оскільки воно відрізняється від посилань всередині файлової системи. Його можна відрізнити від жорстких посилань та вирішити на шлях без символьних посилань.
У певному сенсі додавання символьних посилань не змінює базову структуру файлової системи - вона зберігає її, але додає більше структури, як рівень програми.


Від man readlink:

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]

1
Чому м'яке посилання не може все це зробити?
Танай

1
@Tanay Правильно, це може допомогти розширенню порівняти його з подібними випадками з м'якими посиланнями. Я спробую.
Волкер Зігель

Як саме це стосується лише каталогів? Наскільки я це розумію, ці проблеми також є проблемою і для файлів з твердими посиланнями. Більше того, я вважаю, що жорстке посилання є простим способом змінити дозвіл заданого каталогу, щоб дозволити іншим всередину, не вимагаючи їх також і в батьківському ланцюжку. Звучить дуже корисно, якщо у вас немає можливості додавати / змінювати групи ...
inetknght

чудова відповідь, але тоді ... як Apple вирішила ці питання для Time Machine?
Демієн

Звучить дуже цікаво! Але я нічого не знаю про те, в чому полягає проблема - чи можете ви підказати мені?
Волкер Зігель

77

"Ви, як правило, не повинні використовувати жорсткі посилання все одно" є надто широким. Вам потрібно зрозуміти різницю між жорсткими посиланнями та символьними посиланнями та використовувати кожне, як годиться. Кожен має свій набір переваг та недоліків:

Посилання може:

  • Вкажіть на каталоги
  • Вкажіть на неіснуючі об’єкти
  • Вкажіть на файли та каталоги за межами однієї файлової системи

Постійні посилання можуть:

  • Не допускайте видалення файлу, на який вони посилаються

Жорсткі посилання особливо корисні при виконанні програм «копіювати при написанні». Вони дозволяють зберігати резервну копію структури каталогів, використовуючи лише простір для файлів, що змінюються між двома версіями.

Команда cp -alособливо корисна в цьому плані. Це робить повну копію структури каталогів, де всі файли представлені жорсткими посиланнями на вихідні файли. Після цього можна перейти до оновлення файлів у структурі, і лише ті оновлені файли займуть додаткове місце. Це особливо корисно при підтримці резервного копіювання на багато поколінь.


41
щодо останнього абзацу, якщо ви редагуєте "скопійований" файл з твердим
marcin

32
Цей опис жорстких посилань є досить оманливим. В основному це правда, що жорсткі посилання "не дозволяють видалити файл, на який вони посилаються,", але це лише побічний ефект жорстких посилань. Це, звичайно, НЕ правда, що ви можете створювати жорсткі посилання в одному каталозі, змінювати "оригінальний" файл, а потім очікувати, що жорсткі посилання якось вказують на старий вміст. Насправді, провідна істина твердих посилань полягає в тому, що це зовсім не посилання, принаймні не більше, ніж оригінальний "файл", який є лише назвою, що вказує на файл. Жорстке посилання - це просто інша назва, що вказує на той самий файл.
матовий

7
Ідея створення резервної копії хороша, і я її дуже багато використовую, але, думаю, користувачів слід попередити, що зміна файлу також змінить резервну копію.
Марк

3
Чорт, символьне посилання взагалі нічого не повинно вказувати. ln -s "Don't use this directory" READMEє законним. Насправді, якщо ви думаєте про це, каталог може використовуватися як реляційна база даних і взагалі не містити фактичних файлів.
Едвард Фолк

5
-1 Це не дає відповіді на запитання, і деяка інформація явно неправильна.
wjandrea

43

FYI, ви можете досягти того ж, що і жорсткі посилання для каталогів, використовуючи mount:

mount -t bind /var/www /home/user/workspace/www

Це дуже небезпечно, оскільки більшість інструментів і програм не будуть усвідомлювати обов'язковість . Я колись робив щось подібне у наведеному вище прикладі, а потім переходив до rm -rf /home/user. На щастя, нічого в цьому не було /var/www.


6
Я звик mount --bind <src> <dest>. Будьте обережні, щоб не протирати src;)
качар

1
Я отримую:mount: unknown filesystem type 'bind'
Wizek

4
на Busybox, це воноmount -o bind src dest
Мат М

@MatM те ж саме з Debian
hanshenrik

2
Якщо вам потрібно встановити лише для читання, ви можете встановити дозволи на точку монтажу та уникнути rm -rfпроблеми. superuser.com/questions/320415/…
zanerock

19

Причина жорсткого зв’язування каталогів не дозволена - це невелика технічна. По суті, вони порушують структуру файлової системи . Як правило, не варто використовувати жорсткі посилання в будь-якому випадку. Символічні посилання дозволяють отримати більшість однакових функціональних можливостей, не створюючи проблем (наприклад, ln -s target link).


17
Жорсткі посилання мають добрі випадки використання. Сказання, що зазвичай не слід їх використовувати, є занадто широким.
Сандер Стеффан

4
+2 для надання посилання, яке насправді відповідає на питання ОП (і моє), -1 для висловлення думки ("Як правило, ви не повинні використовувати жорсткі посилання все одно" - якби у нього були посилання для його підтримки, було б нормально). Що було добре, тому що я так і не можу дати +2. ; D
msb

3
посилання "вони порушують структуру файлової системи" не працює.
Чарлі Паркер

5
Спробуйте узагальнити вміст посилання у відповіді та зберегти посилання як орієнтир. Це хороша практика обміну стеками, щоб уникнути гниття посилань, дякую.
Oxwivi

3
молодець @CharlieParker; найкращий ненавмисний (?) іронічний коментар усіх часів :)
Еліран Малька
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.