Нещодавно про це мене запитали під час співбесіди. Я був чесним і сказав, що знаю, як поводиться символічне посилання та як його створити, але не розумію використання жорсткого посилання та чим він відрізняється від символічного.
Нещодавно про це мене запитали під час співбесіди. Я був чесним і сказав, що знаю, як поводиться символічне посилання та як його створити, але не розумію використання жорсткого посилання та чим він відрізняється від символічного.
Відповіді:
Під файловою системою файли представлені вводами. (Або це численні вставки? Не впевнені.)
Файл у файловій системі в основному є посиланням на inode.
Тоді жорстке посилання просто створює інший файл із посиланням на той самий базовий inode.
Коли ви видаляєте файл, він видаляє одне посилання на базовий inode. Inode видаляється (або видаляється / перезаписується) лише тоді, коли всі посилання на індет були видалені.
Символічне посилання - це посилання на інше ім’я файлової системи.
Після того, як зроблено жорстке посилання, посилання переходить до inode. Видалення, перейменування або переміщення вихідного файлу не вплине на жорстке посилання, оскільки воно посилається на базовий inode. Будь-які зміни даних про inode відображаються у всіх файлах, які посилаються на цей inode.
Примітка: жорсткі посилання дійсні лише в одній файловій системі. Символічні посилання можуть охоплювати файлові системи, оскільки вони просто ім'я іншого файлу.
Приємна інтуїція, яка може допомогти, використовуючи будь-яку консоль Linux (ish).
Створіть два файли:
$ touch foo; touch bar
Введіть до них деякі дані:
$ echo "Cat" > foo
$ echo "Dog" > bar
(Насправді, я міг би використовувати ехо в першу чергу, оскільки він створює файли, якщо вони не існують ... але не зауважте.)
І як очікувалося:
$cat foo; cat bar
Cat
Dog
Давайте створимо жорсткі та м'які посилання:
$ ln foo foo-hard
$ ln -s bar bar-soft
Подивимося, що щойно сталося:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
Зміна імені foo не має значення:
$ mv foo foo-new
$ cat foo-hard
Cat
foo-hard вказує на inode, вміст файлу - що не було змінено.
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
Вміст файлу не вдалося знайти, оскільки м'яке посилання вказує на ім’я, яке було змінено, а не на вміст.
Так само, якщо foo
видалено, він foo-hard
все ще містить вміст; якщо bar
видалено, bar-soft
це лише посилання на неіснуючий файл.
touch blah1; touch blah2
можна скоротити доtouch blah1 blah2
Як говориться, картина коштує тисячі слів. Ось як я візуалізую це:
Ось як ми дійшли до цієї картини:
Створіть ім’я myfile.txt
у файловій системі, яке вказує на новий inode (який містить метадані для файлу та вказує на блоки даних, що містять його вміст, тобто текст "Привіт, світ!":
$ echo 'Hello, World!' > myfile.txt
Створіть жорстке посилання my-hard-link
на файл myfile.txt
, що означає "створити файл, який повинен вказувати на той самий inode, який myfile.txt
вказує на":
$ ln myfile.txt my-hard-link
Створіть м'яке посилання my-soft-link
на файл myfile.txt
, що означає "створити файл, який повинен вказувати на файл myfile.txt
":
$ ln -s myfile.txt my-soft-link
Подивіться, що буде зараз, якщо myfile.txt
буде видалено (або переміщено): my-hard-link
усе ще вказує на той самий вміст, і, таким чином, це не впливає, тоді як my-soft-link
зараз вказує ні на що. В інших відповідях обговорюються плюси та мінуси кожного.
myfile.txt
). Для м'якого посилання це посилання - це не inode (який містить дані), а, скоріше, це посилання на шлях файлової системи до myfile.txt
(наприклад /home/Documents/myfile.txt
)
Жорсткі посилання корисні, коли вихідний файл переміщується. Наприклад, переміщення файлу з / bin в / usr / bin або в / usr / local / bin. Будь-яке символьне посилання на файл у / bin би цим було порушено, але жорстке посилання, будучи посиланням безпосередньо на вклад для цього файлу, не було б байдужим.
Жорсткі посилання можуть зайняти менше місця на диску, оскільки вони займають лише запис у каталозі, тоді як для посилання на ім'я, на яке вказує, потрібне власне введення.
Жорсткі посилання також потребують менше часу для вирішення - символьні посилання можуть вказувати на інші символьні посилання, що знаходяться у каталогів, що зв'язані між собою. І деякі з них можуть бути в NFS або інших файлових системах з високою затримкою, і тому це може призвести до вирішення мережевого трафіку. Жорсткі посилання, будучи завжди в одній файловій системі, завжди вирішуються за один пошук і ніколи не передбачають затримки в мережі (якщо це жорстке посилання у файловій системі NFS, сервер NFS зробив би дозвіл, і це було б непомітно для клієнтська система). Іноді це важливо. Не для мене, але я можу уявити високопродуктивні системи, де це може бути важливим.
Я також думаю, що такі речі, як mmap (2) і навіть відкриті (2), використовують таку ж функціональність, як і жорсткі посилання, щоб активувати inode файлу активним, так що навіть якщо файл від’єднається (2) ed, вклад залишається дозволити продовжувати доступ до процесу, і лише після завершення процесу файл дійсно відходить. Це дозволяє набагато безпечніші тимчасові файли (якщо ви можете змусити відкриті та від’єднані атомарні дії, які можуть бути POSIX API, яких я не пам’ятаю, тоді ви дійсно маєте безпечний тимчасовий файл), де ви можете читати / писати ваші дані, не маючи доступу до них. Що ж, це було правдою раніше / proc, що дало всім можливість переглядати дескриптори файлів, але це вже інша історія.
Якщо говорити про це, відновлення файлу, відкритого в процесі A, але від’єднаного у файловій системі, обертається за допомогою жорстких посилань для відтворення посилань inode, щоб файл не зникав, коли відкритий процес закриває його або відходить.
М'яке посилання :
м'який або символічний - це швидше скорочення до оригінального файлу .... якщо ви видалите оригінал, ярлик не виходить і якщо ви видалите лише це, з оригіналом нічого не відбувається.
Синтаксис м'якого посилання :ln -s Pathof_Target_file link
Вихід: link -> ./Target_file
Доказ: readlink link
Також у ls -l link
висновку ви побачите першу букву у lrwxrwxrwx
вигляді l, що вказує на те, що файл є м'яким посиланням.
Видалення посилання: unlink link
Примітка. Якщо ви хочете, ваше програмне посилання може працювати навіть після переміщення його кудись із поточного режиму. Переконайтесь, що ви створюєте абсолютний шлях, а не відносний шлях, створюючи м'яке посилання. тобто (починаючи з / root / user / Target_file, а не ./Target_file)
Посилання:
Жорстке посилання - це більше дзеркальна копія або кілька шляхів до одного файлу. Зробіть щось у file1, і це з’явиться у файлі 2. Видалення одного все одно зберігає інше в порядку.
Inode (або файл) видаляється лише тоді, коли всі (жорсткі) посилання або всі шляхи до (того ж файлу) inode були видалені.
Після того, як зроблено жорстке посилання, посилання має inode вихідного файлу. Видалення перейменування або переміщення вихідного файлу не вплине на жорстке посилання, оскільки воно посилається на базовий inode. Будь-які зміни даних про inode відображаються у всіх файлах, які посилаються на цей inode.
Синтаксис жорсткої посилання :ln Target_file link
Вихід: Файл із посиланням на ім’я буде створений з тим самим номером вводу, що і для Targetfile.
Доказ: ls -i link Target_file
(перевірити їхні введення)
Видалення посилання: rm -f link
(Видаліть посилання так само, як і звичайний файл)
Примітка . Символічні посилання можуть охоплювати файлові системи, оскільки вони просто ім'я іншого файлу. Тоді як жорсткі посилання дійсні лише в одній файловій системі.
У символічних посиланнях є деякі функції, жорсткі посилання відсутні:
Ви відразу знаєте, куди вказує символічне посилання, перебуваючи на жорстких посиланнях, вам потрібно вивчити всю файлову систему, щоб знайти файли, що мають однаковий inode.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
жорсткі посилання не можуть вказувати на каталоги.
Жорсткі посилання мають два обмеження:
Простий спосіб побачити різницю між жорстким і символічним посиланням - через простий приклад. Постійне посилання на файл вказуватиме на місце збереження файлу або на його індексу. Символічне посилання вказуватиме на власне сам файл.
Отже, якщо у нас є файл під назвою "a" і створимо жорстке посилання "b" і символічне посилання "c", яке всі посилаються на файл "a":
echo "111" > a
ln a b
ln -s a c
Виведення "a", "b" і "c" будуть:
cat a --> 111
cat b --> 111
cat c --> 111
Тепер видалимо файл "a" і подивимося, що відбувається з результатами "a", "b" і "c":
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
Так що трапилося?
Оскільки файл "c" вказує на файл "a", якщо файл "a" видалено, тоді файл "c" не буде нічого вказувати, він також видаляється.
Однак файл "b" вказує на місце зберігання або на вкладення файлу "a". Отже, якщо файл "a" буде видалений, він більше не вказуватиме на inode, але оскільки файл "b" робить, inode продовжуватиме зберігати будь-який вміст, що належав до "a", поки більше не з'являться більш жорсткі посилання на нього.
Символічні посилання посилаються на назву шляху. Це може бути будь-де в дереві файлів системи, і навіть не обов’язково існувати, коли створюється посилання. Цільовий шлях може бути відносним або абсолютним.
Жорсткі посилання є додатковими покажчиками на індею, тобто вони можуть існувати лише на тому ж томі, що і цільовий. Додаткові жорсткі посилання на файл не відрізняються від "оригінального" імені, використовуваного для посилання на файл.
Я зазначив би вас у Вікіпедії:
Кілька пунктів:
Жорсткі посилання дуже корисні, коли ви робите резервні копії. Наприклад , дивіться rsnapshot . Ідея полягає в тому, щоб зробити копію, використовуючи жорсткі посилання:
Нова резервна копія не займе додаткового місця крім будь-яких внесених вами змін, оскільки всі додаткові резервні копії вказуватимуть на той самий набір inode для файлів, які не змінилися.
Додаю питання Ніка: коли корисні чи потрібні жорсткі посилання ? Єдиний додаток, який мені спадає на думку, в якому символічні посилання не виконали б роботу, - це надання копії системного файлу в хроноване середовищі.
Символічне посилання - це об'єкт файлової системи, який вказує на інший об’єкт файлової системи. Об'єкт, на який вказують, називається ціллю.
Символічні посилання прозорі для користувачів; посилання відображаються як звичайні файли або каталоги, і користувач або додаток можуть діяти точно таким же чином.
Символічні посилання призначені для сприяння міграції та сумісності програм з операційними системами UNIX. Microsoft впровадила свої символічні посилання для функціонування так само, як UNIX посилання.
Символічні посилання можуть бути абсолютними або відносними. Абсолютні посилання - це посилання, які задають кожну частину назви шляху; відносні посилання визначаються відносно того, де специфікатори відносних зв’язків знаходяться у визначеному шляху
Приклад абсолютного символічного зв’язку
X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"
Приклад відносних символьних посилань
X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"
Жорстка зв'язок є файлова система являє собою файл , з допомогою якого більш ніж один шлях посилається на один файл в тому ж обсязі .
Щоб створити жорстке посилання у Windows, перейдіть до місця створення посилання та введіть цю команду:
mklink /H Link_name target_path
Зауважте, що ви можете видалити жорсткі посилання будь-якого замовлення, незалежно від порядку, в якому вони створені. Також жорсткі посилання неможливо створити, коли
NTFS підтримує інший тип зв'язку, який називається з'єднанням. MSDN визначає це так:
З'єднання (також його називають м'яким посиланням) відрізняється від жорсткого посилання тим, що об'єкти зберігання, на які він посилається, є окремими каталогами, а з'єднання може пов'язувати каталоги, розташовані в різних локальних томах на одному комп'ютері . В іншому випадку переходи діють однаково з жорсткими зв’язками.
Жирні частини, розташовані в розділі твердого з’єднання та секції з'єднання, показують основну різницю між ними.
Команда, щоб створити перехід у Windows, перейдіть до місця створення посилання, а потім введіть:
mklink /J link_name target_path
Також:
Просто, жорстке посилання: це просто додати нове ім'я до файлу, це означає, що файл може мати багато імен за один і той же час, всі імена рівні одна одній, ніхто не бажає, жорстке посилання не означає копіювати весь вміст Файл і створити новий файл - це не те, він просто створить альтернативну назву, яку слід знати.
Символічне посилання (symlink): це вказівник на інший файл, якщо символьне посилання вказує на існуючий файл, який пізніше видаляється, символічне посилання продовжує вказувати на те саме ім’я файлу, навіть якщо ім'я більше не називає жодного файлу.
Те, що ви вважаєте звичайним «файлом», - це насправді дві окремі речі: дані про файл та запис у каталозі. Коли ви створюєте жорстке посилання на файл, ви фактично створюєте другу запис каталогу, що стосується тих же даних. Обидві записи каталогу мають однаковий функціонал; кожен з них може бути використаний для відкриття файлу для його читання. Таким чином, у вас насправді немає "файла плюс жорстке посилання", у вас є "дані файлу з двома записами в каталог". Те, що ви вважаєте видаленням файлу, фактично видаляє запис каталогу, а коли останній запис каталогу для даних видаляється, також видаляються і самі дані. Для звичайних файлів, у яких є лише одна запис каталогу, видалення запису каталогу буде видалено дані, як завжди. (Поки файл відкривається, ОС створює тимчасове посилання на файл,
Як приклад, створіть файл A.txt, жорстке посилання B.txt та видаліть A.txt. Коли ви створили A.txt, були створені деякі дані та запис каталогу .txt. Коли ви створили жорстке посилання, було створено інший запис B.txt в каталозі, який вказує на точно такі ж дані. Коли ви видаляєте A.txt, у вас залишаються всі дані та один запис B.txt в каталозі, точно так, як якщо б ви створили файл B.txt в першу чергу.
М'яке посилання - це просто (майже) звичайний файл, за винятком того, що він не містить даних, а шлях іншого запису каталогу. Якщо ви видалите файл, на який посилається м'яке посилання, то м'яке посилання міститиме шлях, який більше не вказує на запис каталогу; вона порушена. Якщо ви видалите м'яке посилання, це як видалення будь-якого іншого файлу, файл, на який він вказує, не впливає.
Запис у каталозі посилається на структуру:
struct dentry{
ino_t ino;
char name[256];
}
ino - кількість inode, ім'я - ім'я файлу, структура inode, можливо, як:
struct inode{
link_t nlink;
...
}
наприклад, ви створюєте файл / 1, запис у каталозі може бути таким:
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
структура inode може, як:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
тоді ви створюєте жорстке посилання (може бути / 100), запис у каталозі може бути таким:
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
структура inode може, як:
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
тоді ви створюєте символічне посилання (може бути / 200) на файл 1, запис каталогу може бути таким:
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
структура inode може, як:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 2 */
...
}
struct inode{ /* inode number 16 */
link_t nlink; /* nlink = 1 */
...
} /* the data of inode 16 maybe /1 or 1 */
Додавши до всіх вищезазначених відповідей, різницю у знаходженні файлу твердого посилання та програмного забезпечення можна зрозуміти нижче:
У мене є файл f6
у моєму поточному каталозі, а також каталог з іменем t2
.
Файл названий f1
і ./t2/f2
є символічними посиланнями на f6
.
Файл з назвою f7
і ./t2/f8
є посиланнями f6
.
Щоб знайти як м'які, так і жорсткі посилання, ми можемо використовувати:
$ find -L . -samefile f6
> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8
Щоб знайти лише жорстке посилання, ми можемо використовувати:
$ find . -xdev -samefile f6
> ./f6
> ./f7
> ./t2/f8
Оскільки жорсткі посилання можуть бути створені в одній файловій системі, ми можемо шукати всі тверді посилання без -L
використовуваного параметра (з -xdev
опцією) в тій же файловій системі / точці монтажу. Це економить непотрібний пошук у різних точках кріплення.
Тож пошук по жорсткому посиланню відбувається дещо швидше, ніж пошук програмних посилань (Будь ласка, виправте, якщо я помиляюся чи не зрозуміла).
Символічні посилання дають інше ім'я файлу, подібним до жорстких посилань. Але файл можна видалити, навіть якщо залишилися символьні посилання.
Мої два центи за користування:
М'які посилання можуть використовуватися для скорочення довгих імен шляху, тобто:
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
Внесені зміни /short/file.txt
будуть застосовані до вихідного файлу.
Для переміщення великих файлів можна використовувати жорсткі посилання:
$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin
ln /myapp/dev/application.bin /myapp/prd/application.bin
Миттєва копія в іншу папку та оригінальний файл (увімкнено /myapp/dev
) можна переміщувати чи видаляти, не торкаючись цього файлу/myapp/prd
Я просто знайшов простий спосіб зрозуміти жорсткі посилання в загальному сценарії, встановити програмне забезпечення.
Одного разу я завантажив програмне забезпечення в папку Downloads
для встановлення. Після того, як я це зробив sudo make install
, деякі виконувані файли були cp
відредаговані в локальну папку біна. Тут cp
створюється жорстке посилання . Я був задоволений програмним забезпеченням, але незабаром зрозумів, що Downloads
це не гарне місце в довгостроковій перспективі. Тому я mv
редагував папку програмного забезпечення в source
каталог. Ну, я все ще можу запускати програмне забезпечення, як і раніше, не турбуючись про будь-які цільові речі, наприклад, в Windows. Це означає, що жорстке посилання знаходить Inode безпосередньо та інші файли навколо.
У цій відповіді, коли я кажу файл, я маю на увазі місце в пам'яті
Усі збережені дані зберігаються в пам'яті за допомогою структури даних під назвою inode Кожен inode має inodenumber. Номер inode використовується для доступу до inode. Усі жорсткі посилання на файл можуть мати різні назви, але мають однаковий номер inode. Оскільки всі жорсткі посилання мають однаковий числовий номер (який входить до одного і того ж інода), усі вони вказують на одну і ту ж фізичну пам'ять.
Символічне посилання - це особливий вид файлу. Оскільки це також файл, він матиме ім'я файлу та номер inode. Як сказано вище, номер inode підкреслює вкладку, яка вказує на data.Now, що робить символічне посилання особливим, це те, що inodenumbers у символічних посиланнях отримують доступ до тих узорів, які вказують на "шлях" до іншого файлу.
під час переміщення, копіювання, видалення файлу в графічному інтерфейсі ми граємо з твердими посиланнями файлу, а не фізичною пам'яттю. Коли ми видаляємо файл, ми видаляємо тверду посилання файлу. ми не знищуємо фізичну пам'ять. Якщо всі жорсткі посилання на файл видалені, то отримати доступ до збережених даних не вдасться, хоча він все ще може бути присутнім у пам'яті