Чим відрізняються символічні та жорсткі зв’язки?


Відповіді:


40

Різна семантика між жорсткими і м'якими посиланнями робить їх придатними для різних речей.

Посилання:

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

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

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

1
Хороший список. Просто хотілося додати, що ви також можете розірвати відносний шлях симпосилання, перемістивши саму симпосилання.
jw013

4
"[E] сама запис каталогу - це посилання." Це чудовий момент, якого я ніколи не бачив висловлювати раніше, але я переживаю, що хтось, що тільки починає обертати його чи голову навколо посилань, не отримає цього. Для тих, хто в цій ситуації, ось підказка: Розміщення файлів і каталогів, які ви бачите при виконанні команди ls, не зовсім те саме, що система зберігання, яку вона представляє. Жорсткі посилання - це посилання на окремий файл у системі зберігання. Файл зберігається один раз. Прочитайте на тему "Вземи".
Маріо

@Mario: так. Кожен запис каталогу пов'язує ім'я з індезом. Системний виклик для видалення імені файлу навіть викликається unlink(2). "звичайні" файли (кількість посилань - 1) - лише окремий випадок. Якщо це допомагає, ви можете вважати inode як об'єкти, а імена - як перелічені покажчики (кількість посилань inode - це кількість відліку).
Пітер Кордес

1
Ви можете подумати про символічне посилання як текстовий файл з ім'ям. Це трактується як символічне посилання через спеціальний прапор до файлу. Жорсткі приклади посилання ви знаєте , є ..і ..
Ned64

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

18

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

Символічні посилання або «посилання» працюють трохи як ярлики Windows. Вміст символьної посилання є вказівником на реальне розташування файлу / каталогу. Якщо ви видалите реальний файл, символьне посилання стане "звисаючим" і не працюватиме. Видалення символьного посилання не видаляє реальний файл. Ви можете мати стільки посилань на один файл (або навіть інші символьні посилання), скільки вам подобається.

На відміну від Windows, вони працюють на рівні файлової системи, а не на оболонці або на рівні додатків, тому майже будь-яка програма буде «слідувати» посиланнями, як очікувалося. ls -alможе бути використаний як швидкий спосіб побачити, куди "вказують" символьні посилання.

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

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


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

3
Це справді дуже погано? Що станеться? Найбільше хвилювання, яке мені вдається відтворити, - це повідомлення про помилки "Занадто багато рівнів символічних посилань".
mattdm

1
ls -lдосить , щоб побачити , що вони пов'язаний з допомогою линка, то aварто на --allсм довідкової сторінки. І навіть якщо символьні посилання працюють у файловій системі, є альтернативні функції використовувати символьні посилання як файли, а не наступні.
D4RIO

4
Ярлики Windows насправді сильно відрізняються від символьних посилань: вони слідують своїй цілі, а також вони є звичайними файлами. (У Windows також є посилання, але вони не використовуються багато.) Посилання є чисто текстовими, цільовий текст читається кожного разу, коли ви отримуєте доступ до файлу. Чи мають значення дозволи на симлінк, залежить від ОС та файлової системи.
Жил 'ТАК - перестань бути злим'

AFAIK, вміст файлу символьної посилання - це шлях, на який вказує символ посилання, який можна побачити, дивлячись на розмір файлу символьної посилання: ln -s /home 1; ls -l 1показує, що симпосилання 1 має 5 байт, тоді як ln -s /usr/share/ 2; ls -l 2показує, що 2 - 11 байт.
daniel kullmann

13

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


5
Можливо механізми керування версіями на основі диска? Якщо ви щось жорстко посилаєте, то це не резервне копіювання. Якщо вихідний файл пошкоджується, кожне тверде посилання на нього теж пошкоджується.
D4RIO

1
Подумайте про додаткові системи резервного копіювання, такі як Apple Time Machine. (Очевидно, що це не резервні копії типу відновлення після аварій, але "ой, я видалив цей файл випадково", резервні копії.) Усі незмінені файли в додатковій резервній копії з'єднані між собою; коли файл змінюється, наступний інкремент копіює його замість посилання на попередню версію.
geekosaur

Дякую, тоді додаткові системи резервного копіювання таким чином схожі на системи управління версіями = D
D4RIO

Але як механізм додаткового резервного копіювання зберігає "стару" версію файлу? 1) Резервне копіювання Створений файл із твердим посиланням F; 2) Файл F модифікований; 3) наступного дня створили резервну копію B ... Схоже, я щось не отримую
Дмитро Пашкевич

3

Жорсткі посилання - це лише посилання на ті самі простори на диску, тому "чому" ви не можете жорстко посилатись на інші файлові системи.

Символьні посилання - це файли, що посилаються на інші файли (як ярлики Windows), можливо, в тій же файловій системі, а може і ні.

EDIT: Я поясню щось більше. Кожен існуючий файл має як мінімум 1 жорстке посилання. Жорсткі посилання - це спосіб отримати доступ до вмісту inode файлової системи. Ви можете отримати номер inode файлу за допомогою ls -iта отримати кількість твердих посилань, statяк показано в цьому прикладі:

$ stat plantilla-disenos.odt 
  File: «plantilla-disenos.odt»
  Size: 12367       Blocks: 32         IO Block: 4096   fichero regular
Device: 803h/2051d  Inode: 319875      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   d4rio)   Gid: ( 1000/   d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300

Дякую @geekosaur за це посилання:

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

і це (відредаговано):

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

Ура


Чи корисні ефективність від використання жорстких посилань? Або чому б ви коли-небудь використовували жорстке посилання замість символьного посилання?
ripper234

Ядро повинно перезапустити переклад імені-в-інде (перехід дерева каталогів) для розширення символьних посилань, тоді як жорсткі посилання використовують один і той же inode. (Ви часто будете бачити це як nameiвід назви функції ядра, яка робила це в традиційному Unix.)
geekosaur

@ ripper234: жорсткі посилання - це рішення для економії на диску. Вам не потрібно знати про файлову систему для створення символьної посилання, але вам потрібно подумати, перш ніж створювати посилання, тому що ви можете створити цикл або довгий шлях до роздільної здатності, тому такі функції, як statпомилки.
D4RIO

@geekosaur: Я додаю свою відповідь моїй, оскільки це дуже корисно
D4RIO

Нема проблем. Я фактично почав писати це як коментар до вашого, але коментарі занадто короткі.
geekosaur

3

М'яке посилання вказує на інше ім'я шляху. Таке ім'я може насправді існувати або не може існувати. Шлях не шукається, поки ви не отримаєте доступ до симпосилання. Якщо шлях не існує, коли ви намагаєтесь отримати доступ до нього, у вас порушена символьна посилання.

З жорстким посиланням у вас є один файл з кількома іменами. Ви не можете сказати, що один із них - це "справжній" файл, а інші - лише посилання на нього. Всі вони рівні. Немає такого поняття, як зламаний жорсткий зв'язок, як там порушені символьні посилання.

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

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


3

"жорсткі" посилання мають однаковий inode

$ touch foo
$ ln foo foolink # Creates a hard  link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink

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

$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink

Якби я створив те саме, але з "м'яким" або символічним посиланням, тоді є один файл, один inode та новий файл із власним inode, що вказує на перший.

$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo

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

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

$ rm foo
removed `foo'
$ ls -l foo foolink 
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo

1
Але який практичний випадок для цього?
ewwhite

1
Одне використання, таке ж, як "скорочений" Інше використання, що має кілька версій програми в системі, дозволяє встановити, протестувати нову версію, вказавши додаток по повному шляху, в той час як символьне посилання в біні вказує на виробництво. Після тестування завершення зміни символьного посилання на нову версію, залиште стару версію для всіх користувачів, які мають код, залежний від версії. Подумайте про perl, python тощо
bsd

1
практичне використання для жорстких посилань. В даний час у моїй файловій системі я знайшов велику кількість жорстких посилань у / usr / share / zoneinfo. Придумайте всі названі файли, що представляють часові зони, які всі ідентичні EST. Ми економляємо простір файлової системи, не маючи зайвих копій і дозволяючи простіше керувати пакетами, не маючи накладних / керованих накладних символів посилань встановлювати / видаляти при встановленні / видаленні пакетів. Навіть якщо вилучено, вихідні дані зберігаються. Вибачте, у мене не було часу на більш педантичне пояснення.
bsd

1

Жорсткі посилання - це додаткові записи каталогів для одного файлу. Це означає

  • Усі жорсткі посилання на файл повинні знаходитися в одній файловій системі (оскільки запис каталогу не може вказувати на файл у іншій файловій системі), але не обов'язково в одному каталозі.
  • Немає різниці між початковим записом каталогу та новим жорстким посиланням; з точки зору операційної системи, це лише дві записи каталогів до одного файлу. Файл видаляється лише в тому випадку, якщо всі жорсткі посилання видалені (і крім того, не залишилося жодного процесу, у якому цей файл все ще відкритий).
  • Якщо ви переміщуєте / перейменовуєте "оригінал", якщо ви не переміщуєте його до іншої файлової системи, інші жорсткі посилання не впливають; вони все ще вказують на той самий файл.
  • Багато редакторів не записують новий вміст у той самий файл під час збереження, а скоріше виконують таку процедуру:

    1. Запишіть новий вміст у новий файл.
    2. Перейменуйте старий файл на ім’я резервної копії (або, якщо не зберігаєте резервні копії попередньої версії файлу, просто видаліть його).
    3. Перейменуйте щойно записаний файл на ім'я попереднього файлу.

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

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

З іншого боку, символічні посилання зберігають ім'я шляху (ім'я до файла, а точніше його запис у каталозі - потенційно включає його шлях, як-от /bin/shабо subdir/foo.bar) - іншого файлу. Якщо ім'я шляху відносне, воно завжди інтерпретується відносно каталогу, в якому міститься посилання. Це означає:

  • Символічне посилання може посилатися на файли в іншій файловій системі (навіть до файлової системи, яка сама по собі не підтримує жорсткі або м'які посилання, як FAT).

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

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

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

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

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


1

HARD LINK (тільки файли) проти SOFT LINK (файли або каталоги) проти BIND (HARD LINK для каталогів)

ПЕРЕГЛЯДУЙТЕ ЦЬО ЗОБРАЖЕННЯ ДО ЧИТАННЯ ПОСТ
(джерело: freesoftwareservers.com )

Хоча відповідь daxelrod добре пояснює це питання, я подумав, що картина в цьому випадку зробила велику зміну, особливо для початківців, які ще не розуміють індекси та складний жаргон Linux.

Подумайте про це, якщо ви "видалили" все з свого накопичувача, ви могли б запустити програмне забезпечення для відновлення даних, оскільки "1" і "0" все ще є, ви просто видалили всі жорсткі посилання. Метою програмного забезпечення для відновлення є відновлення жорстких посилань, щоб мати сенс 0 і 1

Я прочитав чудовий "один лайнер", який мав все це має сенс, і я хотів поділитися!

Усі файли в Linux - це "жорсткі посилання" на 0 і 1 на диску. Коли ви створюєте дані (0 і 1), ОС створює жорстке посилання в дереві файлів для посилання на це місце на жорсткому диску.

Створіть HARD LINK 2 та видаліть HARD LINK 1 Оригінальний файл :

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

Видаліть ФАЙЛ (HARD LINK 1), який МУЖЕ ПОСИЛАНО на:

Якщо ви видалили HARD LINK 1, чи вважаєте ви, що SOFT LINK спрацює? Ні, ОС повідомить, що HARD LINK 1 не існує.

Видаліть SOFT LINK на HARD LINK:

У зворотному випадку, якщо ви видалите SOFT LINK, чи спрацює HARD LINK? Так. Поки в ОС є один файл HARD LINK, він повідомляє, що заливка не була видалена.

- Також варто вивчити / відзначити BIND - спосіб BIND двох каталогів, як, наприклад, посилання на два каталоги, але він прозорий для ОС (ОС може сказати, коли ви Symlink, а деякі мають правила щодо погоди, вони можуть слідувати посиланнями). Він використовує Mount, а не LS і може бути налаштований через FSTAB.

Що таке кріплення BIND


1
Це досить амбітні зусилля, особливо для першого повідомлення. На жаль, я вважаю, що додавання матеріалу на "зв'язувати" (про що не вимагали) просто плутає питання; тим більше, що, здається, ви не доклали великих зусиль для пояснення "прив'язки" кріплення. Також я дуже добре розумію тверді та м'які / символічні посилання, і я ледве розумію вашу картину. Я був би дуже здивований, якби новачок міг навчитися чомусь із цього.
G-Man

Хоча ви можете символізувати каталоги, він відображається у файловій системі як посилання, якщо ви BIND, він відкритий для ОС. Показує так само, як файл.
FreeSoftwareServers

1
(1) Насправді, принаймні на деяких версіях Linux, ви можете прив’язати монтувати файл. (2) Хоча кріплення прив'язки дуже схожі на жорсткі посилання, сказати "Прив’язати просто те саме, що жорсткі посилання (за винятком того, що ви не можете жорстко посилати каталог") просто неправильно.
G-Man

@ G-Man, погодили та видалили, лише примітка
згадала

@ Безкоштовно фактично м'яке посилання вказує на ім'я файлу (жорстке посилання 1); схеми, повинні зробити це очевидним.
JB.

0

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


0

Це дуже старе питання, але у мене є випадок використання, який вимагає від мене жорстких посилань.

Я музикант, і тому на моєму Mac є багато, багато і багато аудіофайлів різного роду на декількох жорстких дисках. Терабайти варто. У мене вони здебільшого організовані дуже добре з каталогами symlink, так що я можу їх знайти за видавцем вмісту, стилем / звуком та іншими критеріями, залежно від того, як я думаю в той час. На жаль, одна програма, яку я використовую, Ableton Live, абсолютно не здатна переглядати псевдоніми або посилання зі свого файлового браузера. Єдине рішення, яке я знайшов, - це створити жорсткі посилання каталогів, в які я хочу, щоб вони могли бачити, і тоді все працює чудово.

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


Я б подав звіт про помилки для Ableton Live. Можливо, вони зможуть це виправити.
авентурин

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