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: