Обычный или регулярный файл состоит из трех частей. Его первая часть является файловой записью в каталоге, состоящей из пяти полей и включающей имя файла и номер его индексного дескриптора, т. е. фактически является указателем на индексный дескриптор. Вторая часть файла – это 128-байтный индексный дескриптор, в котором хранятся метаданные файла. Третья, и главная, часть – это собственно данные, которые содержатся в логических блоках, выделенных файлу в пределах конкретной файловой системы.
Соображениями экономии дискового пространства и удобства именования файлов мы обязаны существованию таких объектов, как файловые ссылки, или указатели. С помощью утилиты ln можно создать два типа ссылок: «жесткие» и символические. В то же время само существование и неверное использование этих объектов может представлять не только удобство, но и информационную опасность.
Вспомним традиционное определение файла: «файл – это именованная область памяти» (именованная – значит имеющая уникальное имя). Но в Linux уникальным идентификатором файла является не его имя, а номер его индексного дескриптора. В данном случае правильнее было бы сказать «файл – это нумерованная область памяти». В то же время для обозначения одного и того же файла может использоваться до 65536 имен. Множество имен, или символьных указателей на один и тот же индексный дескриптор, называются непосредственными или «жесткими» ссылками. В самом индексном дескрипторе ни одно из имен файла не хранится, но содержится их суммарное число. Удаление последнего имени файла сопровождается логическим удалением файла с освобождением его индексного дескриптора и блоков данных.
Имея в своем каталоге имя часто используемого файла, пользователь получает более удобную возможность обращения к нему. С точки зрения расхода дискового пространства, как будет показано ниже, «жесткая» ссылка оказывается гораздо экономнее, чем копия файла.
Команда, создающая жесткую ссылку, записывается в виде
ln <file_name> <link_name>
Несмотря на то, что жесткая ссылка является указателем на inode файла, в команде используется одно из существующих имен; они совершенно равнозначны. Чтобы создать жесткую ссылку на файл, пользователю не требуется никаких прав на него. Минимально необходимо иметь только право на вход в каталог, содержащий целевой файл (этот файл нужно знать по имени, иначе для того, чтобы его увидеть, потребуется еще право на чтение каталога), а также права на вход и запись в каталог, в котором создается новое имя. Возможность создания жесткой ссылки на недоступный файл кажется противоестественной, ведь появление у файла еще одного имени увеличивает на единицу счетчик ссылок, который хранится в inode файла. Но для перезаписи inode прав на запись в сам файл вовсе не требуется. Так, например, без модификации файла изменяются хранимые в его индексном дескрипторе временные отметки последнего доступа и удаления файла.
Для того чтобы проверить, сколько непосредственных ссылок (или имен) имеет файл, можно использовать команду stat или ls –l с именем файла в качестве аргумента. Найти все имена обычного файла можно, зная его inode. Для этого используется команда