Работа с файловой системой
Файл и его имена: ссылки
Жесткие ссылки
Каждый файл представляет собой область данных на жестком диске компьютера или на другом носителе информации, которую можно найти по имени. В файловой системе Linux содержимое файла связывается с его именем при помощи жестких ссылок. Создание файла с помощью любой программы означает, что будет создана жесткая ссылка - имя файла, и открыта новая область данных на диске. Причем количество ссылок на одну и ту же область данных (файл) не ограничено, т. е. у файла может быть несколько имен.
Пользователь Linux может добавить файлу еще одно имя (создать еще одну жесткую ссылку на файл) при помощи утилиты ln (от англ. "link" - "соединять, связывать"). Первый параметр - это имя файла, на который нужно создать ссылку, второй - имя новой ссылки. По умолчанию ссылка будет создана в текущем каталоге:
[methody@localhost methody]$ ln examples/text text-hardlink [methody@localhost methody]$ ls -lR ./: . . . drwxr-xr-x 3 methody methody 4096 Окт 16 04:45 examples -rw-r--r-- 2 methody methody 653 Окт 6 10:31 text-hardlink ./examples: итого 92 -rw-r--r-- 1 methody methody 84718 Окт 6 10:31 -filename-with- -rw-r--r-- 2 methody methody 653 Окт 6 10:31 textПример 4.12. Создание жестких ссылок
Мефодий создал в своем домашнем каталоге жесткую ссылку с именем "text-hardlink" на файл "text ", который находится в подкаталоге "examples ". Выведя подробный список файлов текущего каталога и его подкаталогов (" ls -lR "), Мефодий обратил внимание, что у файлов "text" и "text-hardlink" совпадают и размер (" 653 "), и время создания. Это его совершенно не удивило, поскольку он знает, что теперь "/home/methody/text-hardlink" и "/home/methody/examples/text" - это два имени одного и того же файла. В подробном описании, выведенном командой "ls -l ", Мефодию остались непонятны только два первых поля. Как объяснил Гуревич, первое "слово", состоящее из знаков "-drwx ", - это обозначение прав доступа к файлу, о которых речь пойдет в лекции 6. А следующее за ним число - количество жестких ссылок на данный файл или каталог. У "text" и "text-hardlink" стоит число "2" - у этого файла два имени.
Доступ к одному и тому же файлу при помощи нескольких имен может понадобиться в следующих случаях:
- Одна и та же программа известна под несколькими именами.
- Доступ пользователей к некоторым каталогам в системе может быть ограничен из соображений безопасности. Однако если все же нужно организовать доступ пользователей к файлу, который находится в таком каталоге, можно создать жесткую ссылку на этот файл в другом каталоге.
- Современные файловые системы даже на домашних персональных компьютерах могут насчитывать до нескольких десятков тысяч файлов и тысячи каталогов. Обычно у таких файловых систем сложная многоуровневая иерархическая организация - в результате пути ко многим файлам становятся очень длинными. Чтобы организовать более удобный доступ к файлу, который находится очень "глубоко" в иерархии каталогов, также можно использовать жесткую ссылку в более доступном каталоге.
- Полное имя некоторых программ может быть весьма длинным (например, i586-alt-linux-gcc-3.3 ), к таким программам удобнее обращаться при помощи сокращенного имени (жесткой ссылки) - gcc-3.3.
Индексные дескрипторы
Поскольку благодаря жестким ссылкам у файла может быть несколько имен, понятно, что вся существенная информация о файле в файловой системе привязана не к имени. В файловых системах Linux вся информация, необходимая для работы с файлом, хранится в индексном дескрипторе. Для каждого файла существует индексный дескриптор: не только для обычных файлов, но и для каталогов6Каталоги в Linux – тоже файлы особого типа, см. раздел "Система файлов: каталоги"., файлов-дырок и т. д. Каждому файлу соответствует один индексный дескриптор.
Индексный дескриптор - это описание файла, в котором содержится:
- тип файла (обычный файл, каталог, файл-дырка и т. д.);
- права доступа к файлу;
- информация о том, кому принадлежит файл;
- отметки о времени создания, модификации, последнего доступа к файлу;
- размер файла;
- указатели на физические блоки на диске, принадлежащие этому файлу - в этих блоках хранится "содержимое" файла.
Все индексные дескрипторы пронумерованы, поэтому номер индексного дескриптора - это уникальный идентификатор файла в файловой системе - в отличие от имени файла (жесткой ссылки на него), которых может быть несколько. Узнать номер индексного дескриптора любого файла можно при помощи все той же утилиты ls с ключом -i:
[methody@localhost methody]$ ls -i ./text-hardlink examples/text 127705 examples/text 127705 ./text-hardlinkПример 4.13. Информация об индексных дескрипторах файлов
Мефодий решил поинтересоваться номерами индексных дескрипторов файла "text" и жесткой ссылки на него "text-hardlink" - он обнаружил, что эти номера совпадают ("127705"), то есть этим двум именам соответствует один индексный дескриптор, т. е. один и тот же файл.
Все операции с файловой системой - создание, удаление и перемещение файлов - производятся на самом деле над индексными дескрипторами, а имена нужны только для того, чтобы пользователь мог легко ориентироваться в файловой системе. (Было бы очень неудобно запоминать многозначный номер каждого нужного файла или каталога.) Более того, имя (или имена) файла в его индексном дескрипторе не указаны. В файловой системе Ext2 имена файлов хранятся в каталогах: каждый каталог представляет собой список имен файлов и номеров их индексных дескрипторов. Жесткую ссылку (имя файла, хранящееся в каталоге) можно представлять как каталожную карточку, на которой указан номер индексного дескриптора - идентификатор файла.
Жесткая ссылка (hard link) - запись вида имя файла+номер индексного дескриптора в каталоге . Жесткие ссылки в Linux - основной способ обратиться к файлу по имени.
Символьные ссылки
У жестких ссылок есть два существенных ограничения:
- Жесткая ссылка может указывать только на файл, но не на каталог, потому что в противном случае в файловой системе могут возникнуть циклы - бесконечные пути.
- Жесткая ссылка не может указывать на файл в другой файловой системе. Например, невозможно создать на жестком диске жесткую ссылку на файл, расположенный на дискете7Причина этого ограничения в том, что номер индексного дескриптора уникален только в рамках одной файловой системы. В разных файловых системах могут оказаться два разных файла с одинаковым номером индексного дескриптора. В результате будет невозможно установить, на какой из них указывает жесткая ссылка.. Чтобы избежать этих ограничений, были разработаны символьные ссылки. Cимвольная ссылка - это просто файл, в котором содержится имя другого файла. Cимвольные ссылки, как и жесткие, предоставляют возможность обращаться к одному и тому же файлу по разным именам. Кроме того, символьные ссылки могут указывать и на каталог, чего не позволяют жесткие ссылки. Символьные ссылки называются так потому, что содержат символы - путь к файлу или каталогу.
Cимвольная ссылка (symbolic link, файл-ссылка) - это файл особого типа (" l "), в котором содержится путь к другому файлу. Если на пути к файлу встречается cимвольная ссылка, система выполняет подстановку: исходный путь заменяется тем, что содержится в ссылке.
Cимвольную ссылку можно создать при помощи команды ln с ключом "-s" (сокращение от "symbolic"):
[methody@localhost methody]$ ln -s examples/text text-symlink [methody@localhost methody]$ ls -li . . . 127699 drwxr-xr-x 2 methody methody 4096 Окт 4 17:12 examples 127705 -rw-r--r-- 2 methody methody 653 Сен 30 10:04 text-hardlink 3621 lrwxrwxrwx 1 methody methody 13 Окт 4 18:05 text-symlink -> examples/text [methody@localhost methody]$Пример 4.14. Создание символьных ссылок
Теперь Мефодий решил создать в своем домашнем каталоге символьную ссылку на файл text и назвать ее text-symlink. Команда ls -li отобразила этот файл совсем не так, как остальные: стрелочка (" -> ") указывает, куда направлена ссылка. Кроме того, Мефодий обратил внимание, что номер индексного дескриптора (первое поле), размер и время создания файла text-symlink отличаются от text-hardlink, а также во втором поле (количество жестких ссылок на файл) text-symlink указано "1 ". Все эти признаки недвусмысленно свидетельствуют о том, что text-symlink и text - это разные файлы. Однако если выполнить команду cat text-symlink, то на экран будет выведено содержимое файла text.
Символьная ссылка вполне может содержать имя несуществующего файла. В этом случае ссылка будет существовать, но не будет "работать": например, если попробовать вывести содержимое такой "битой" ссылки при помощи команды cat, будет выдано сообщение об ошибке.
Узнать, куда указывает символьная ссылка, можно при помощи утилиты realpath:
[methody@localhost methody]$ realpath text-symlink /home/methody/examples/textПример 4.15. Раскрытие символьных ссылок