В Linux hardlink
– “жёсткая ссылка”. По сути – является тем же файлом, на который ссылается, в отличии от symlink
-а – “мягкой ссылки”.
Проще всего это объяснить используя inode
– “индексный дескриптор“.
Содержание
inode
inode
– это объект файловой системы, содержащий информацию о владельце/группе, которым принадлежит файл или каталог, его права доступа к нему, его размер, тип файла, timestamp
-ы отражающие время модификации индексного дескриптора (ctime, changing time
), время модификации содержимого файла (mtime, modification time
) и время последнего доступа к файлу (atime, access time
) и счётчик для учёта количества жёстких ссылок на файл. Каждый inode
имеет собственный номер, который присваевается ему файловой системой в момент её создания (форматирования).
Для примера возьмём описание файлов, где с помощью ключа
-i команды ls
вместо отобразим их “номер” inode
:
[simterm]
# ls -lih | grep file 475949 -rw-r--r-- 1 root setevoy 0B Aug 13 11:51 file1 475950 -rw-r--r-- 1 root setevoy 0B Aug 13 11:51 file2 475951 -rw-r--r-- 1 root setevoy 0B Aug 13 11:51 file3
[/simterm]
Первая колонка как раз и отображает номер inode
. Далее указываются права доступа, счётчик hardlink
-ов на этот файл, права доступа и тип файла, пользователь, группа, размер, дата последней модификации файла и последним – его имя.
Inodes и ошибка “No Space Left on Device”
Немного не по общей теме поста, но полезно знать.
Иногда может возникнуть “странная” ситуация: с одной стороны – df
или du
будут говорить, что свободное место на диске есть, а с другой стороны операционная система будет уверждать, что “No Space Left on Device”.
Одна из вероятных причин как раз явлется полное использование пула inode, выделенных для раздела на жёстком диске, т.к. кол-во inode фиксировано и задаётся во время создания таблицы раздела.
Проверить общее, занятое и доступное количество inode можно с помощью df
и опции -i
:
[simterm]
[/simterm]
Тут для раздела /dev/sdb4
создано 2.042.653 inode, и это же является ограничением на количество файлов и директорий, которые можно будет создать на этом разделе (но есть ещё ограничения самой файловой системы, см Linux: файловые системы — краткий обзор и сравнение).
Hard link
Вернёмся к рассмотрению того, что же такое hardlink
.
По сути, “жесткая” ссылка – это тот же самый файл, на который идёт такая “ссылка”. Что бы продемонстрировать это – создадим такую ссылку при помощи команды ln
. Синтаксис команды:
[simterm]
$ ln целевой_файл файл_ссылка
[/simterm]
Пример – создадим файл-ссылку с именем hardlink1
, которая будет указывать на уже существующий файл
file1:
[simterm]
# ln file1 hardlink1
[/simterm]
Что бы убедиться, что по сути оба файла являются одним и тем же объектом файловой системы – сравним их inode
-номер, в данном случае – это номер 475949:
[simterm]
# ls -lih | grep 475949 475949 -rw-r--r-- 2 root setevoy 0B Aug 13 11:51 file1 475949 -rw-r--r-- 2 root setevoy 0B Aug 13 11:51 hardlink1
[/simterm]
Как видим – оба файла с разными именами, но имеют общий inode
. Добавим ещё одну ссылку – и посмотрим на счётчик жестких ссылок:
[simterm]
# ln file1 hardlink2 # ls -lih | grep 475949 475949 -rw-r--r-- 3 root setevoy 0B Aug 13 11:51 file1 475949 -rw-r--r-- 3 root setevoy 0B Aug 13 11:51 hardlink1 475949 -rw-r--r-- 3 root setevoy 0B Aug 13 11:51 hardlink2
[/simterm]
Счётчик вместо 2 теперь отображает 3.
Правильнее было бы называть его не “счётчик ссылок” – а “счётчик имён файла”, так как по сути один файл хранится с разными именами.
Symlink
Перейдём к symlink
-ам. Создаётся такая ссылка с помощью той же команды ln
но с ключём -s
:
[simterm]
# ln -s file1 symlink1
[/simterm]
Мы создаём новый (!) объект файловой системы с именем symlink1
, который указывает на уже существующий файл file1
:
[simterm]
# ls -lih | grep sym 475948 lrwxr-xr-x 1 root setevoy 5B Aug 13 12:02 symlink1 -> file1
[/simterm]
Обратите внимание на тип (или атрибут), указанный буквой l
перед правами доступа к файлу – в данном случае он указывает на то, что этот файл является символической ссылкой на другой файл. То же самое отображается и в его имени – symlink1 -> file1
.
Основные типы файлов, которые отображаются командой ls:
-
: обычный файлd
: каталогl
: символическая ссылкаs
: сокет
Теперь – сравним inode
-номера обоих файлов:
[simterm]
# ls -li ... 475949 -rw-r--r-- 3 root setevoy 0 Aug 13 11:51 file1 ... 475949 -rw-r--r-- 3 root setevoy 0 Aug 13 11:51 hardlink1 475949 -rw-r--r-- 3 root setevoy 0 Aug 13 11:51 hardlink2 ... 475948 lrwxr-xr-x 1 root setevoy 5 Aug 13 12:02 symlink1 -> file1
[/simterm]
Номера отличаются, так как для файловой системы это уже два независимых файла.
Hard link vs symlink – ключевые различия
Тепреь кратко рассмотрим основные раззличия при работе с жёсткими и “мягкими” ссылками:
hardlink
не может указывать на файл в другой файловой системе (так какinode
может принадлежать только одной ФС), аsymlink
– может.- рри редактировании файла-ссылки в случае с
hardlink
-ом – изменятся оба файла, так как это один и тот же объект, а в случае сsymlink
-а – можно изменять его имя, атрибуты, направить его на другой файл и при этом оригинальный файл не будет затронут (но учтите, что если вы откроете файл симлинка для редактирования – то измените оригинальный файл, т.к. по сути вы откроете для редактирования именно его) - жёсткая ссылка не может указывать на на каталог (см. причины тут>>>)
Удаление ссылок
При удалении hardlink
-а – файл будет существовать до тех пор, пока есть хотя бы 1 hardlink
на него, но может “менять каталог размещения”, если был удалён “исходный” файл, но остался файл-hardlink
в другом месте. При удалении же файла, на который указывает symlink
– файл-ссылка просто станет нерабочим.
Например – удалим файл file1
, на который у нас есть символическая ссылка symlink1
:
[simterm]
# rm file1
[/simterm]
При этом сам файл симлинка остался:
[simterm]
# ls -la | grep file1 lrwxr-xr-x 1 root setevoy 5 Aug 13 12:02 symlink1 -> file1
[/simterm]
Но при попытке получить информацию о file1
– получим сообщение об ошибке:
[simterm]
# file file1 file1: cannot open `file1' (No such file or directory)
# file symlink1 symlink1: broken symbolic link to `file1'
[/simterm]
В целом – на этом всё.