Работа с файловой системой
Каждый файл представляет собой область данных на жестком диске компьютера или на другом носителе информации, которую можно найти по имени. В файловой системе 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
Мефодий создал в своем домашнем каталоге жесткую ссылку с именем » 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
Мефодий решил поинтересоваться номерами индексных дескрипторов файла » 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]$
Теперь Мефодий решил создать в своем домашнем каталоге символьную ссылку на файл 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