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

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

14.1. Специальные файлы устройств

В текущей главе часто упоминаются дисковые устройства, поэтому мы начнем с краткого рассмотрения понятия «файл устройства».

Специальный файл устройства соответствует какому-либо устройству в системе. Внутри ядра каждому типу устройства соответствует драйвер устройства, который обрабатывает для него все запросы на ввод-вывод. Драйвер устройства — это модуль программного кода ядра, реализующий набор операций, которые (как правило) соответствуют операциям ввода-вывода на связанном аппаратном средстве. API, предоставляемый драйверами устройств, является фиксированным и содержит операции, соответствующие системным вызовам open(), close(), read(), write(), mmap() и ioctl(). Тот факт, что каждый драйвер устройства обеспечивает единый интерфейс, скрывающий различия в работе отдельных устройств, позволяет добиться универсальности ввода-вывода (см. раздел 4.2).

Некоторые устройства являются реальными, например мыши, диски и USB-накопители, другие — виртуальными. Это означает, что им не соответствует никакое аппаратное средство, а вместо него ядро предоставляет (с помощью драйвера устройства) абстрактное устройство с API таким же, как у реального устройства.

Устройства можно подразделить на два типа.

• Символьные — обрабатывают данные посимвольно. Примеры символьных устройств: терминалы и клавиатуры.

• Блочные — обрабатывают за один заход один блок данных. Размер блока зависит от типа устройства, но обычно является кратным 512 байтам. Примеры блочных устройств: диски и USB-накопители.

Файлы устройств располагаются внутри файловой системы, подобно другим файлам, обычно в каталоге /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].

Идентификаторы устройств

Каждый файл устройства имеет старший идентификационный номер и младший идентификационный номер. Старший номер идентифицирует общий класс устройства и используется ядром для поиска драйвера, который подходит для данного типа устройства. Младший номер уникальным образом идентифицирует устройство внутри общего класса. Старший и младший номера устройства можно вывести с помощью команды ls — l.

Перейти на страницу:

Похожие книги