Основная часть главы посвящена файловым системам, которые представляют собой упорядоченные наборы файлов и каталогов. Мы рассмотрим некоторые понятия, относящиеся к файловым системам, используя в отдельных случаях в качестве конкретного примера традиционную для Linux файловую систему ext2. Кроме того, вкратце будут описаны некоторые журналируемые файловые системы, доступные в Linux.
В завершение главы мы рассмотрим системные вызовы, которые используются для монтирования и размонтирования файловой системы, а также библиотечные функции, применяемые для получения информации о смонтированных файловых системах.
В текущей главе часто упоминаются дисковые устройства, поэтому мы начнем с краткого рассмотрения понятия
Специальный файл устройства соответствует какому-либо устройству в системе. Внутри ядра каждому типу устройства соответствует драйвер устройства, который обрабатывает для него все запросы на ввод-вывод.
Некоторые устройства являются
Устройства можно подразделить на два типа.
•
•
Файлы устройств располагаются внутри файловой системы, подобно другим файлам, обычно в каталоге /dev. Суперпользователь может создать файл устройства с помощью команды mknod. Эту же задачу можно выполнить в привилегированной (CAP_MKNOD) программе, используя системный вызов mknod().
Мы не рассматриваем подробно системный вызов mknod() («создать индексный дескриптор файловой системы»), поскольку его применение очевидно и единственное его назначение в настоящее время состоит в создании файлов устройств, что не является необходимым для типичного приложения. Можно также использовать вызов mknod() для организации очередей FIFO (см. раздел 44.7), однако предпочтительнее использовать функцию mkfifo(). Исторически в некоторых реализациях UNIX вызов mknod() применялся также для создания каталогов, но теперь вместо него используется системный вызов mkdir(). Тем не менее в некоторых реализациях UNIX (но не в Linux) такая возможность вызова mknod() сохранена для обратной совместимости. Дальнейшие подробности см. на странице mknod(2) руководства к ОС.
В ранних версиях Linux каталог /dev содержал записи для всех возможных устройств в системе, даже если такие устройства фактически не были подключены к нему. Это означало, что каталог /dev мог содержать буквально тысячи неиспользуемых записей, замедляющих работу команд, которым было необходимо просматривать его содержимое. При этом было невозможно использовать содержимое для того, чтобы выяснить, какие устройства действительно есть в системе. В Linux 2.6 эта проблема решена за счет программы-менеджера udev, которая опирается на файловую систему sysfs, экспортирующую информацию об устройствах и других объектах ядра в пространство пользователя через фиктивную файловую систему, смонтированную в каталоге /sys.
В статье [Kroah-Hartman, 2003] приведен обзор менеджера udev и указаны причины, по которым его следует считать лучше файловой системы devfs, призванной решать те же проблемы в Linux 2.4. Информацию о файловой системе sysfs можно найти в файле Documentation/filesystems/sysfs.txt Linux 2.6, а также в работе [Mochel, 2005].
Каждый файл устройства имеет