Для создания нового типа файловой системы необходимо разработать драйвер для самой файловой системы и для монтирования. Ниже описаны особенности реализации и синтаксис вызова драйверов файловой системы и монтирования.
В большей части команд файловой системы нет специального кода для работы с файловыми системами конкретного типа. Такие команды собирают параметры, имена файловых систем и другую информацию об операции, и передают ее драйверу конкретной файловой системы.
Драйвер предназначен для работы непосредственно с файловой системой конкретного типа. Программы-драйверы, используемые командами файловой системы, называются драйверами файловой системы и драйверами монтирования.
При выполнении команды, обрабатывающей файлы, выполняется поиск драйвера с именем вида /sbin/helpers/vfstype/command, где vfstype - тип файловой системы, указанный в файле /etc/vfs, а command - имя выполняемой команды. Флаги команды передаются драйверу файловой системы.
Для каждого типа файловой системы должны быть предоставлены драйверы для всех команд, а также один дополнительный драйвер. Этот драйвер должен называться так же, как и тип файловой системы. Он должен определять, действительно ли на указанном логическом томе находится файловая система соответствующего типа. Драйвер должен возвращать 0, если на логическом томе нет подходящей файловой системы. Он должен возвращать 1, если на логическом томе есть файловая система нужного типа, и для протокола файловой системы не требуется отдельное устройство. Драйвер должен возвращать значение 2, если на логическом томе есть подходящая файловая система, и для ее протокола требуется отдельное устройство. Если в драйвер будет передан флаг -l, он должен проверять наличие протокола файловой системы на указанном логическом томе. Значение 0 в этом случае должно указывать, что протокол найден, а 1 - что протокол не найден.
В этом разделе описана устаревшая схема работы с файловыми системами, применявшаяся в предыдущих версиях AIX. Ей по-прежнему можно пользоваться, хотя и не рекомендуется.
Ниже приведен список всех
операций, которые может выполнять драйвер файловой системы (они описаны в
файле /usr/include/fshelp.h):
Файловая система JFS поддерживает
только следующие операции:
Операция Значение Команда
#define FSHOP_CHECK 1 fsck
#define FSHOP_CHGSIZ 2 chfs
#define FSHOP_MAKE 5 mkfs
#define FSHOP_STATFS 7 df
#define FSHOP_NAMEI 10 ff
Драйверы файловой системы имеют следующий формат запуска:
OpName OpKey FilsysFileDescriptor PipeFileDescriptor Modeflags DebugLevel OpFlags
Поле | Определение |
---|---|
OpName | Задает параметр arg0 при запуске драйвера из программы. Значение поля OpName помещается в список процессов (см. описание команды ps). |
OpKey | Задает операцию драйвера. Например, если параметр OpKey имеет значение 1, будет запрошена операция fsck (проверить файловую систему). |
FilsysFileDescriptor | Указывает дескриптор файла, по которому программа обратилась к файловой системе. |
PipeFileDescriptor | Указывает файловый дескриптор конвейера (см. описание процедуры pipe), открытого между исходной программой и
драйвером. Этот канал обеспечивает связь драйвера и вызывающей
программы.
Пример: Драйвер передает по конвейеру сообщение об успешном выполнении операции или ошибке, в зависимости от чего определяется дальнейшая работа программы. В режиме отладки драйвер может передавать по конвейеру и другую информацию. |
Modeflags | Описывает характер запуска драйвера и может влиять на его работу,
особенно в отношении сообщений об ошибках. Флаги режимов определены в
файле /usr/include/fshelp.h :
Пример: Флаг FSHMOD_INTERACT указывает, будет ли команда выполняться интерактивно (определяется с помощью проверки значения функции isatty стандартного ввода). Не все операции поддерживают перечисленные выше режимы. |
DebugLevel | Задает требуемый объем отладочной информации - чем выше уровень отладки, тем подробнее будет отладочная информация. |
OpFlags | Указывает устройство (или устройства) для которого необходимо выполнить операцию, и все остальные опции, переданные вызывающей программой. |
При запуске команды fsck -fp /user выполняется следующий вызов драйвера:
execl("/etc/helpers/v3fshelpers","fshop_check","1","3","5","ifp", "0","devices=/dev/lv02,fast,preen,mounted")
Другой пример вызова драйверов рассматривается для команды mkfs. Для создания файловой системы JFS на существующем логическом томе /dev/lv02 применяется следующая команда:
mkfs /junk
Создается точка монтирования. Если при создании файловой системы известно только устройство, на котором она создается, то нужно ввести:
mkfs /dev/lv02
В любом из этих вызовов вызывается следующий драйвер файловой системы:
execl ("/etc/helpers/v3fshelpers", "fshop_make", "5", "3", "5", "-ip",\ "0", "name=/junk,label=/junk,dev=/dev/lv02")
В этом примере запрошена операция FSHOP_MAKE. Указываются режимы interactive и perror. Строка OpFlags указывает точку монтирования и устройство.
Команда mount - это интерфейсная программа, запускающая драйвер для конкретных файловых систем. Драйверы для команд mount и umount (или unmount) называются драйверами монтирования.
Как и другие команды файловой системы, команда mount считывает опции, заданные в командной строке, и интерпретирует их в контексте файловой системы, описанной файлом /etc/filesystems. С помощью информации из файла /etc/filesystems, команда вызывает драйвер монтирования, соответствующий типу заданной файловой системы. Например, пусть введена команда
mount /test
В этом случае программа mount обратится к файлу /etc/filesystems и найдет раздел, описывающий файловую систему /test. По данным файла /etc/filesystems команда mount определит, что файловая система /test смонтирована по NFS на удаленном узле host1. Команда mount также учтет указанные опции монтирования.
Ниже приведен пример раздела файла /etc/filesystems:
/test: dev = /export vfs = nfs nodename = host1 options = ro,fg,hard,intr
По типу файловой системы (в этом примере - nfs ) будет определен драйвер монтирования. Для этого команда сравнит тип файловой системы со значением первых полей записей файла /etc/vfs. В третьем поле строки с соответствующим первым полем будет указано имя драйвера.
Ниже приведен пример вызова драйвера монтирования:
/etc/helpers/nfsmnthelp M 0 host1 /export /test ro,fg,hard,intr
В командах mount и
unmount указывается шесть параметров. Первые
четыре параметра совпадают для обеих команд:
У команды mount есть
два дополнительных параметра:
У команды unmount есть
два дополнительных параметра:
vfsNumber | Задает уникальный номер размонтируемого объекта. Этот номер возвращается функцией vmount и может быть получен процедурами mntctl и stat. Драйверу это значение передается как первый параметр вызова процедуры uvmount, которая и выполняет размонтирование. |
flag | Определяет значение второго параметра процедуры uvmount. Значение 1 соответствует принудительному размонтированию, если указан флаг -f (umount -f). В противном случае этот параметр имеет значение 0. Не все файловые системы поддерживают принудительное размонтирование. |
Управление файловыми системами - Обзор
Глава 5, Файловые системы и каталоги
Обзор виртуальных файловых систем
Глава 13, Создание программ, работающих с логическими томами
Вводная информация об общих I-узлах (G-узлах)
Команды chfs, df, ff, fsck, mkfs, mount, ps, umount и unmount.
Файлы vfs и filesystems.
Функции vmount, mount, umount и uvmount.