Файловая система Unix

Ответьте, не раздумывая, на вопрос: что из перечисленного ниже можно считать элементами файловой системы?

  • Процессы
  • Аудиоустройства
  • Структуры данных ядра и параметры настройки
  • Каналы межзадачного взаимодействия

Если речь идет о системах UNIX или Linux, ответ будет таков: все перечисленное выше. Ну и, конечно же, в файловую систему входят собственно файлы.

Хотя основным назначением файловой системы является упорядочение хранимых ресурсов системы (т.е. файлов), программистам не хотелось каждый раз заново изобретать колесо при управлении объектами других типов. Очень часто оказывалось удобным представлять такие объекты в виде элементов файловой системы. Подобный унифицированный подход имеет как преимущества (единый программный интерфейс, легкий доступ из интерпретатора команд), так и недостатки (реализация файловых систем по методу доктора Франкенштейна), но независимо от того, нравится он вам или нет, именно такой подход применяется в UNIX (а значит, и в Linux).

Файловую систему можно представить состоящей из четырех основных компонентов:

  • пространство имен — методы именования объектов и организации их в виде единой иерархии;
  • API2 — набор системных вызовов для перемещения между объектами и управления ими;
  • модель безопасности — схема защиты, сокрытия и совместного использования объектов;
  • реализация — программный код, который связывает логические модели с диско вой подсистемой.

В современных ядрах систем определен абстрактный интерфейс, позволяющий работать с различными файловыми системами. Одни части файлового дерева обрабатываются традиционной дисковой подсистемой, другие — управляются специальными драйверами ядра. Например, за работу файловых систем — как сетевых (Network File System — NFS), так и общих межсетевых (Common Internet File System — CIFS), — отвечает драйвер, который перенаправляет запросы серверу, расположенному на другом компьютере.

К сожалению, концептуальные границы нечетко очерчены, поэтому имеется слишком много "особых" случаев. К примеру, файлы устройств позволяют программам взаимодействовать с драйверами ядра. Они не являются файлами данных, но обрабатываются файловой системой, а их характеристики записываются на диск.

Еще одним усложняющим (но, в конечном счете, полезным) фактором является то, что ядро поддерживает несколько типов дисковых файловых систем. Среди наиболее перспективных на данный момент файловых систем можно назвать ext3 и ext4, которые во многих дистрибутивах являются базовыми, а также ReiserFS, JFS компании IBM, ZFS компании Sun, VxFS компании Veritas. К этому списку можно добавить и Btrfs — новую свободную файловую систему, все еще разрабатываемую при поддержке компании Oracle.

Есть много реализаций файловых систем с другой семантикой, таких как FAT и NTFS (используются в Microsoft Windows) и 9660 (применяется на компакт-дисках). Linux поддерживает больше файловых систем, чем любая другая разновидность UNIX. Столь широкий выбор упрощает обмен файлами с другими системами.

Организация файловой системы — очень обширная тема, которую мы рассмотрим с нескольких точек зрения. Далее рассказывается, где обычно хранятся файлы, и описываются характеристики файлов, а также рассматриваются ключевые команды, позволяющие задавать атрибуты файлов. Структура файловой системы описывается на более низком уровне. Рассматриваются средства совместного доступа к файлам, столь часто используемые в системе Linux. Средства совместного доступа к файлам в системе Microsoft Windows.

При столь большом разнообразии реализаций файловых систем может показаться странным, что данная статья посвящена всего лишь одной файловой системе. Однако на отдельных реализациях можно специально не останавливаться, поскольку в большинстве современных файловых систем либо предприняты попытки обеспечить более эффективное и надежное применение традиционных функциональных возможностей, либо дополнительные функциональные возможности реализованы в качестве отдельного слоя, работающего поверх семантики стандартной файловой системы (некоторые Файловые системы реализуют оба направления). Как бы то ни было, слишком много программных пакетов ориентировано на описанную модель, чтобы ею можно пренебречь.

 

Имена файлов и каталогов

Файловая система — это единая иерархическая структура, которая начинается с каталога / и разветвляется, охватывая произвольное число подкаталогов. Каталог самого верхнего уровня называется корневым. Эта моноиерархическая система отличается от используемой в Windows, где применяется понятие пространства имен, основанное на принципе деления диска на разделы.

 

Абсолютные и относительные пути

Цепочка имен каталогов, через которые необходимо пройти для доступа к заданному файлу, вместе с именем этого файла образуют путь к файлу. Путь может быть абсолютным (например, /tmp/foo) или относительным (например, book4/filesystem). Последние интерпретируются начиная с текущего каталога. Возможно, многие считают, что текущий каталог задается интерпретатором команд. На самом деле текущий каталог есть у каждого процесса. (Большинство процессов никогда не изменяет свои рабочие каталоги, и поэтому они просто наследуют текущий каталог процесса, который их запустил.)

Термины имя файла и путь в той или иной степени являются взаимозаменяемыми (по крайней мере, так они трактуются в данной книге). Соответственно, имя файла бывает полным (абсолютный путь) или сокращенным (относительный путь). Файловое дерево может иметь произвольную глубину, однако каждый компонент имени файла должен состоять не более чем из 255 символов.

Существует также ограничение на длину пути, который вы можете передавать ядру в качестве аргумента системного вызова (4095 байт в Linux и 1023 байт в более старых системах). Для того чтобы получить доступ к файлу, полное имя которого превышает эти ограничения, необходимо с помощью команды cd перейти в промежуточный каталог, а затем воспользоваться сокращенным именем.

 

Использование пробелов в именах файлов

На имена файлов и каталогов не налагаются никакие ограничения, за исключением того, что длина имени не должна превышать заданный предел и в имя нельзя включать символы косой черты и нулевые символы. В частности, допускаются имена, содержащие пробелы. К сожалению, по давней традиции аргументы командной строки в системе UNIX разделяются пробелами, поэтому старые программы интерпретируют пробелы в именах файлов как признак конца одного имени и начала другого.

Первоначально пробелы в именах файлов применялись в основном в файловых системах, используемых на компьютерах Мае и PC, но теперь они проникли и в культуру UNIX и их можно встретить в некоторых стандартных программных пакетах. По этому поводу не может быть двух мнений: административные сценарии должны быть готовы к обработке пробелов в именах файлов (не говоря уже об апострофах, звездочках и других "опасных" знаках препинания).

В интерпретаторе команд и его сценариях имена с пробелами необходимо просто заключать в двойные кавычки. Например, команда

$ less "My excellent file.txt"

будет воспринята как попытка передать программе less единый аргумент My excellent file. txt. Отдельные пробелы можно также предварять символом обратной косой черты. Функция завершения имен файлов, предоставляемая современными интерпретаторами (обычно она связана с клавишей <Таb>), позволяет это делать автоматически.

При написании сценариев полезным инструментом является опция –print0 команды find. В сочетании с опцией -0 команды xargs эта опция позволяет сочетанию команд find/xargs работать правильно независимо от наличия пробелов в именах файлов. Например, команда

$ find /home -type f -size +1M –print0 | xargs -0 Is -1

выводит длинный ls-список всех файлов, хранящихся в логическом разделе /home, размер которых превышает один мегабайт.

К сожалению, система HP-UX поддерживает команду find –print0, а  не xargs -0. Система AIX не поддерживает ни один из этих вариантов. Но в любой системе вы можете инсталлировать GNU-пакет findutils, чтобы получить текущие версии команд find и xargs. (В качестве альтернативного варианта вместо команды xargs можно использовать опцию -ехес команды find, хотя она работает менее эффективно.)

 

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.