Файл - це inode з метаданими, серед яких список покажчиків на те, де знайти дані.
Для того, щоб мати доступ до файлу, вам потрібно зв’язати його з каталогом (думати про каталоги як про каталоги телефонів, а не про папки), тобто додати одну або декілька записів до одного з декількох каталогів, щоб пов’язати ім’я з цим файлом.
Усі ці посилання, ці назви файлів, вказують на один і той же файл. Існує не одна, яка є оригінальною, та інша, що є посиланнями. Всі вони є точками доступу до одного і того ж файлу (однакового inode) у дереві каталогів. Коли ви отримуєте розмір файлу ( lstat
системний виклик), ви отримуєте інформацію (вказані вище метадані), що зберігається в inode, не має значення, яке ім'я файлу, яке посилання ви використовуєте для посилання на цей файл .
На противагу цим символьним посиланням є ще один файл (інший inode), вміст якого - шлях до цільового файлу. Як і будь-який інший файл, ці посилання повинні бути пов'язані з каталогом (повинен мати ім'я), щоб ви могли отримати доступ до них. Ви також можете мати кілька посилань на символьні посилання, або, іншими словами, символьним посиланням може бути надано кілька назв (в одному або декількох каталогах).
$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a
Над номером файлу 10486707 - звичайний файл. На нього посилаються два записи в поточному каталозі (один з ім'ям a
, один з ім'ям b
). Оскільки кількість посилань становить 2, ми знаємо, що в поточному каталозі чи в будь-якому іншому каталозі іншого імені цього файлу немає. Номер файлу 10502404 - це ще один файл, цей час типу символьного посилання, пов'язаного двічі до поточного каталогу. Його зміст (ціль) - відносний шлях "а".
Зауважте, що якщо 10502404 було пов'язано з іншим каталогом, ніж поточний, він, як правило, вказує на інший файл залежно від способу доступу до нього.
$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
2:
total 92
10608674 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar
У файлах немає імен, пов’язаних із ними, крім каталогів, що їх пов'язують. Простір, зайнятий їх іменами, - це записи в цих каталогах, він враховується у розмірі файлу / використанні диска каталогів.
Ви помітите, що системний виклик для видалення файлу є unlink
. Тобто ви не видаляєте файли, ви від’єднуєте їх із каталогів, на які вони посилаються. Після від’єднання від останнього каталогу, який мав запис до заданого файлу, цей файл потім знищується (доки жоден процес не має відкрито).
lstat
системного виклику, який набуває їх розміру.