Unix що таке symlink, hardlink і inode, rtfm linux, devops і системне адміністрування

Найпростіше це пояснити використовуючи inode - "індексний дескриптор". inode - це об'єкт файлової системи, що містить інформацію про власника / групі, яким належить файл або каталог, його права доступу до нього, його розмір, тип файлу, timestamp -и відображають час модифікації індексного дескриптора (ctime, changing time), час модифікації вмісту файлу (mtime, modification time) і час останнього доступу до файлу (atime, access time) і лічильник для обліку кількості жорстких посилань на файл. Кожен inode має власний номер, який присвоюється йому файлової системою в момент її створення (форматування).

Для прикладу візьмемо опис файлів, де за допомогою ключа -i команди ls замість відобразимо їх "номер" inode:

Перша колонка якраз і відображає номер inode. Далі вказуються права доступу, лічильник hardlink -ів на цей файл, права доступу і тип файлу, користувач, група, розмір, дата останньої модифікації файлу і останнім - його ім'я.

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

Повернемося до пояснення того, що ж таке hardlink.

Приклад - створимо файл-посилання з ім'ям hardlink1. яка буде вказувати на вже існуючий файл file1:

Що б переконатися, що по суті обидва файли є одним і тим же об'єктом файлової системи - порівняємо їх inode-номер, в даному випадку - це номер 475949:

Як бачимо - обидва файли з різними іменами, але мають загальний inode. Додамо ще одне посилання - і подивимося на лічильник жорстких посилань:

Лічильник замість 2 тепер відображає 3.

Правильніше було б називати його не «лічильник посилань" - а "лічильник імен файлу", так як по суті один файл зберігається з різними іменами.

Ми створюємо новий (!) Об'єкт файлової системи з ім'ям symlink1. який вказує на вже існуючий файл file1:

Зверніть увагу на тип (або атрибут), зазначений літерою l перед правами доступу до файлу - в даному випадку він вказує на те, що цей файл є символічним посиланням на інший файл. Те ж саме відображається і в його імені - symlink1 -> file1.

Тепер - порівняємо inode -номери обох файлів:

Номери відрізняються, так як для файлової системи це вже два незалежних файлу.

В цьому і полягають основні відмінності між файлами і способами роботи з ними.

hardlink не може вказувати на файл в інший файлової системи (так як inode може належати тільки одній ФС), а symlink - може.

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

При цьому сам файл симлінк залишився:

Але при спробі отримати інформацію про file1 - отримаємо повідомлення про помилку:

Крім того, за допомогою hardlink не можна створити посилання на каталог:

Але можна з допомогою symlink: