Яка різниця між жорсткою ланкою і символічною ланкою?


487

Як говориться в заголовку, я хотів би знати різницю між жорстким посиланням і м'яким посиланням, створеним командою ln. Команда man lnнадає інформацію, але недостатньо відповідає на моє запитання.

Також було б непогано, якби хтось міг надати налаштування, де жорстке посилання може бути кращим над символічним посиланням.


15
одна з відмінностей ... у вас є якийсь файл, наприклад тест на файл. Якщо ви робите тест-посилання ln-тесту, зробіть тестовий посилання ln -s, а потім перенесіть тест файлу на інший dir (або перейменуйте), символьне посилання не буде працювати. Hardlink буде працювати. Тепер спробуйте видалити тест файлів. Hardlink все ще працюватиме, адже ви все одно зможете отримати доступ до файлу до тих пір, поки кількість твердих посилань на файл не буде 0. Це через inode, написано в інструкції ...
Denwerko,

5
Я знову відкрив це, тому що він заслуговує на хорошу загальну відповідь на це питання (на відміну від попереднього питання, яке було незрозумілим прикладом С).
Олі

4
Найкраща відповідь: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia

1
Також досить повну відповідь: stackoverflow.com/questions/185899 / ...
Elzo Valugi

@AbhishekBhatia відео не доступне
Ooker

Відповіді:


58

У Linux / Unix ярлики відомі як Посилання


Посилання бувають двох типів: м'які (символічні) або жорсткі.

  1. М'які посилання (символічні посилання)

    Ви можете створювати посилання на файли та каталоги, а також можете створювати посилання (ярлики) на іншому розділі та з іншим номером введення від оригіналу.

    Якщо справжню копію буде видалено, посилання не працюватиме .

  2. Жорсткі посилання

    Жорсткі посилання призначені лише для файлів; ви не можете зв’язати файл до іншого розділу з іншим номером inode.

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


Питання: Як зробити м'яке посилання?

Відповідь: м'яке посилання можна зробити за допомогою ln -s; спочатку потрібно визначити джерело, а потім визначити місце призначення. (Майте на увазі, вам потрібно визначити повний шлях як до джерела, так і до місця призначення; інакше це не працюватиме.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

введіть тут опис зображення

Як ви бачите, він має інший inode і може бути зроблений на іншому розділі.


Питання: Як зробити жорстке посилання?

Відповідь: Жорстке посилання можна зробити з ln; спочатку потрібно визначити джерело, а потім визначити місце призначення. (Майте на увазі, вам потрібно визначити повний шлях як джерела, так і пункту призначення; інакше це не буде працювати.)

Скажімо, у мене в скрипті /scriptвказаний сценарій firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

введіть тут опис зображення

Як бачите, він має однаковий inode. Якщо я видалю оригінал, посилання спрацює, і воно буде діяти як оригінал.

введіть тут опис зображення

Вище я перевіряю, чи працює посилання, а потім видаляю оригінальний скрипт Firefox.


Ви запитуєте: Було б добре, якби хтось міг надати налаштування, де жорстке посилання може бути кращим над символічним посиланням.

Відповідь : Залежно від макета розділу диска, жорсткі посилання мають обмеження, що вони повинні бути на одному розділі (-1 бал) і можуть посилатися лише на файли (-1 бал) ), але +1 бал, якщо оригінал видалено посилання буде працювати, і він діє як оригінал.

З іншого боку, м'яке посилання може вказувати на каталоги або файли (+1 бал) і немає обмеження розділів (+1 бал), але (-1 бал), якщо джерело видалено, посилання не працюватиме.


Чи можу я створити жорстке посилання та надати inode як джерело?
TMOTTM

324

Жорстке посилання - це не вказівник на файл, це запис у каталог (файл), що вказує на той самий вхід. Навіть якщо ви зміните ім'я іншого файлу, тверде посилання все одно вказує на файл. Якщо ви заміните інший файл новою версією (скопіювавши його), жорстке посилання не вказуватиме на новий файл. Ви можете мати лише жорсткі посилання в межах однієї файлової системи. З жорсткими посиланнями у вас немає концепції оригінальних файлів і посилань, всі рівні (подумайте про це як на посилання на об'єкт). Це дуже низький рівень концепції.

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


1
Те, що (власними словами) "вказує на файл", можна назвати покажчиком (це тривіально майже тавтологічно вірно). Якщо ми запускаємо запит, тоді (загалом), поняття жорстких посилань може існувати, навіть якщо файлова система не використовує inode.
jfs

319

"Картина варта тисячі слів". Образотворче зображення


І, "Приклад вартує ста абзаців ..."

Створіть два файли:

$ touch blah1   
$ touch blah2

Введіть у них деякі дані:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

І як очікувалося:

$cat blah1; cat blah2
Cat
Dog

Давайте створимо жорсткі та м'які посилання:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Подивимося, що щойно сталося:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Зміна імені blah1 не має значення:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard вказує на inode, вміст файлу - що не було змінено.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

Вміст файлу не вдалося знайти, оскільки м'яке посилання вказує на ім’я, яке було змінено, а не на вміст.
Аналогічно, якщо blah1 видалено, blah1-hard все ще містить вміст; якщо blah2 видалено, blah2-soft - це лише посилання на неіснуючий файл.


джерело: грубо копіюючи його з StackOverflow!


13
Щоб бути справедливим до вас - ви додали прекрасне зображення вгорі ... ах, ви теж скопіювали це! Поєднання двох відповідей насправді дуже корисне :)
icc97

2
краще пояснено, нікуди!
dennisbot

3
Я продовжував дивитись на зображення протягом 20 секунд, а потім, раптом, я зрозумів це. Це насправді геніально.
Мохаммед Джораїд

1
btw: Використання жорстких посилань на git це - погана ідея , на випадок, якщо хтось (засмучений через м'які посилання) дивується ... може застосуватись і до інших версійних систем.
Френк Нокк

1
Чи inode до її жорстких посилань схожий на файл, що зберігається у хмарі, до будь-якого пристрою, який має доступ до нього?
Окер

89

Обидва є вказівниками на файли; різниця - вид вказівника. Символічне посилання вказує на інший файл по імені . Він має спеціальний біт режиму, який ідентифікує його як символічне посилання, а його вміст - це ім'я реального файлу. Оскільки воно просто містить ім'я, це ім'я фактично не повинно існувати або може існувати в іншій файловій системі. Якщо ви заміните названий файл (змініть його вміст, не впливаючи на його ім'я), посилання все ще містить те саме ім'я, і ​​тепер воно вказує на новий файл. Ви можете легко визначити символічне посилання та побачити ім'я файлу, на який він вказує.

Постійне посилання вказує на файл за номером inode. Таким чином, жорсткі посилання не відрізняються від імені файлу. Немає "справжнього" імені проти імені жорсткого посилання; всі жорсткі посилання є однаково допустимими іменами для файлу. Через це файл, до якого ви посилаєтесь, повинен фактично існувати і знаходитися в тій же файловій системі, де ви намагаєтеся створити посилання. Якщо ви видалите оригінальне ім'я, то тверде посилання все одно вказує на той самий файл. Оскільки всі жорсткі посилання є однаково допустимими іменами для файлу, ви не можете подивитися на одне і побачити інші назви для цього файлу; щоб знайти це, вам доведеться переглянути кожен файл і порівняти їх номер inode, щоб знайти інші імена, які мають той самий номер inode.

Ви можете сказати, скільки імен має файл з виводу ls -l. Перше число після режиму файлу - це кількість посилань. У файлі з більш ніж 1 посиланням десь є інші імена, і, навпаки, файл із кількістю посилань лише 1 не має (інших) жорстких посилань.


If you replace the named file, then the link still contains the same name, and so now it points to the new file- Я думаю, це недостатньо пояснено. Ви маєте на увазі, якщо я замінюю файл, на який я отримав символічне посилання, тоді посилання, що містять ім’я, залишаються недоторканими. Але він би вказував на замінений файл лише тоді, коли його ім'я файлу (тобто новий файл, який замінив старий) є таким же, як замінений (тобто старий файл, який замінили на новий), правильно?
Майк

@Mike, так: символічне посилання вказує на оригінальне ім'я файлу, тому заміна цього файла означає, що посилання тепер вказує на новий файл.
psusi

Але тільки в тому випадку, якщо він отримав те саме ім’я? Символьне посилання вказує на банан, і я заміню файл на помаранчевий, тоді sy-посилання більше не може знайти файл банан, тобто він не працюватиме
Майк

@Mike, світова заміна означає, що вона має те саме ім’я, інакше ви просто видаляєте один файл і додаєте інший;)
psusi

58

Жорстке посилання може працювати лише в одній і тій же файловій системі, це просто інше ім'я для одного і того ж інода (на файли внутрішньо посилаються вставки). Файл буде видалений з диска лише тоді, коли остання посилання на його inode відсутня (ви rmd або unlinkd останнє посилання). Жорсткі посилання зазвичай працюють лише для файлів, а не для каталогів.

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


Дякую, це говорить мені, як вони працюють, але що саме робить жорстке посилання? І чому це не працює для каталогів?
ste_kwr

@knittl: ви впевнені? Здається, у деяких файлових системах дозволені жорсткі посилання на каталоги, але створити їх може тільки root. Дивіться -d, -F, --directoryперемикачі. І так, я вже бачив записку в ln(1)сторінці :)
0xC0000022L

1
@kniwor: найпростіший спосіб описати жорсткі посилання - це "лише інша назва цього ж файлу (тобто даних на диску)". І - принаймні в моїх системах (системах) - lnне можна використовувати для створення посилань на каталоги. Хоча існують жорсткі посилання на каталоги, хоча найвизначнішим прикладом є .і ... Я не хотів це включати в свою оригінальну відповідь, оскільки це лише ускладнить речі.
knittl

2
@STATUS_ACCESS_DENIED: ну гаразд ... але зазвичай це не дуже гарна ідея. Ось чому я писав «зазвичай» у своїй оригінальній відповіді. Також дивіться приклади мого попереднього коментаря.
вязання

значить, жорстке посилання може вказувати на одну і ту ж папку / файл з різними іменами до неї, тобто з різними іменами, що посилаються на один і той же індекс
Чарлі Паркер

21

В одній з відповідей з другого потоку (зараз він пов'язаний вгорі вашої публікації) згадується ця сторінка, яка, на мою думку, є досить хорошим середнім рівнем пояснення. Якщо ви загубитесь у мистецтві ascii, ось версія tl; dr:

  • Стандартні файли - це вказівник від файлової системи на індекс, який у свою чергу вказує на фізичні дані. Компонент файлу зберігає свою посилання на файлову систему (по суті, її шлях) і посилання на inode.
  • Жорсткі посилання - це як файли. Вони є лише додатковим вказівником безпосередньо на індед.
  • Символічні посилання - це окремі файли (включаючи окремий вклад та дані), які зберігають шлях файлової системи до файлу.

Ядро та файлові системи, що займаються, перекладають усе прозоро.

Отже, виходячи з цього:

  • Жорсткі посилання дозволяють пов'язувати лише ті ж файлові системи. Символьні посилання можуть вказувати на будь-який шлях.
  • Жорсткі посилання (по суті) вказують на абсолютні дані. Символьні посилання можуть вказувати на відносні шляхи (наприклад ../parent.file)
  • За умови розширення, якщо ви перемістите цільовий вказівник жорсткої посилання (що, пам’ятайте, саме по суті є лише твердою ланкою, що вказує на індез), жорстке посилання все одно працює. Переміщення цілі симпосилання зазвичай розриває символьне посилання.
  • Розв’язання жорсткого зв’язку було б швидше, але незмірно так. Ця незначна частина швидкості йде ціною негнучкої файлової системи.

Я, можливо, трохи заплутався, але читаючи різні речі, я намагаюся знайти різницю між стандартним файлом і жорстким посиланням. Те, як я читаю його у кожному файлі, складається з жорсткого посилання (зберігання імені файлу), посилання на inode, який вказує на фізичні дані.

Додавання жорсткого посилання просто забезпечує inode додатковим покажчиком на основі файлової системи. Це так?


5
Я думаю, що ти маєш рацію, кожен файл - це ім'я шляху для inode, а жорстке посилання - це додаткове ім'я шляху для того ж inode. Тож жорстке посилання нічим не відрізняється від звичайного файлу.
enzotib

Я намагаюся це зрозуміти ... але ви говорите:> "Символічні посилання - це окремі файли (включаючи окремий вклад та дані ), які зберігають шлях файлової системи до файлу." Чи справді символьне посилання має окремі дані? Тоді це так само, як копія режисури, на яку він посилається, правда? ... і кожного разу, коли щось записується на симпосилання, воно має бути записане двічі на диск? Не має сенсу.
MiniGod

@MiniGod Немає симпосилання - це inode до блоку даних, який зберігає шлях до іншого inode (ім'я файлу). Так, це заплутаність у матриці, але як тільки ви її отримаєте, ви ніколи не забудете :)
Олі

@ Олі, я можу заплутатися, але коли ти кажеш: "включаючи окремий inode та дані ", ти маєш на увазі, що у симпосилання є окремі дані !?
MiniGod

1
@MiniGod Так. Symlink - це інода, що вказує на дані (як і звичайний файл), і ці дані - шлях. Це трохи розумніше, ніж це - дозволити прозоре використання через посилання - але це, по суті, все, що вони є.
Олі

15

Коли використовувати Soft Link:

Посилання між файловими системами: Якщо ви хочете з'єднати файли у файлових системах, ви можете використовувати лише посилання / м'які посилання.

Посилання на каталог: Якщо ви хочете пов’язати каталоги, тоді ви повинні використовувати «Прості посилання», оскільки ви не можете створити жорстке посилання на каталог.

Коли використовувати жорстке посилання:

Місце для зберігання: жорсткі посилання займають дуже незначну кількість простору, оскільки немає нових входів, створених під час створення жорстких посилань. У м'яких посиланнях ми створюємо файл, який займає простір (як правило, 4 КБ, залежно від файлової системи)

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

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


Зауважте, що існує також швидке символічне посилання на розмір імені до 64 байт. Він як і раніше займає один inode, але не використовує 4kb блочного простору.
syockit

8

Плутанина встановлюється, коли ви намагаєтеся знайти різницю між "ім'ям файлу" та жорстким посиланням, оскільки його немає.

Кожен створений файл складається з даних на диску та твердого посилання - це ім'я файлу в каталозі та вказівник на дані на диску. Кінець історії. Коли останнє (або єдине) жорстке посилання видалено, ОС знає, що дані більше не потрібні.

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

Символьні посилання, як було пояснено раніше, просто скажуть вам, що " <targetname>в папці з іменем <targetfolder>" є файл . Вони вказують на жорстке посилання. Вони не знають, де дані. Жорстке посилання це знає.


0

Це дуже просто. Файли (і каталоги!) Зберігаються за адресами на блоковому пристрої (HDD або будь-якому іншому). Зазвичай у вас є одне ім’я, відображене на адресу, і саме так ви отримуєте свій файл. Жорстка зв'язок є другим, третім і т.д. ім'ям відображається на ту саму адресу. Символічна посилання замість того, відноситься до символу - ім'я - і так це друге ім'я відображається на перше ім'я. Що стосується ядра, то коли він читає символічну ціль посилання, вона зупиняється і повертається до початку з цільовим значенням як ім'я файлу (більш-менш), тому відносні символьні посилання можливі, але дико не корисні. Ім'я цілі не використовується вище рівня файлової системи, за винятком випадків, коли це явно запитується в коді простору користувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.