Протокол монтирования
Протокол монтирования, описанный в главе 24, также определен с применением технологии RPC. Хотя сервер NFS всегда используется в сочетании с сервером монтирования, эти два серверных компонента должны быть определены как отдельные удаленные программы. Поэтому в стандарте протокола монтирования указаны константы, типы и набор удаленных процедур, которые входят в состав сервера.
Определения констант протокола монтирования
Хотя оба указанных протокола определены отдельно, значения многих констант и типов, заданных для протокола монтирования, соответствуют константам, применяемым в протоколе NFS. Действительно, оба эти протокола не могли бы успешно взаимодействовать, если бы в них не использовались одинаковые представления для таких объектов, как дескрипторы файлов. Например, в протоколе монтирования размеры имени файла, составного имени и дескриптора файла определены следующим образом:
const MNTPATHLEN = 1024; /* Максимальное число символов в составном имени */
const MNTNAMLEN = 255? /* Максимальное число символов в имени */
const FHSIZE3 =64; /* Число октетов в дескрипторе файла NFS */
В этих объявлениях используется синтаксис RPC; в каждом из них длина выражается числом байтов.
Определения типов монтирования
Протокол монтирования содержит также определения типов, которые соответствуют их аналогам, применяемым в протоколе NFS. Например, в протоколе монтирования определен следующий тип дескриптора файла:
typedef opaque fhandle3;
Аналогичным образом, в протоколе монтирования указано, что составное имя представляет собой массив символов: typedef string dirpath;
Структуры данных монтирования
Поскольку протокол монтирования был определен с использованием технологии RPC, он соответствует общепринятому соглашению по объявлению структуры для параметров и результатов каждой удаленной процедуры. Например, одна из основных процедур этого протокола возвращает дескриптор файла для корневого каталога в именованной иерархии. Возвращаемое значение представляет собой объединение mountres3, объявленное следующим образом:
Как и в протоколе NFS, каждая удаленная процедура в протоколе монтирования возвращает информацию о состоянии наряду с другой информацией. В случае неудачного завершения операции информация о состоянии указывает причину неудачи.
Кроме процедуры, возвращающей дескриптор файла, в протоколе монтирования предусмотрена процедура, позволяющая определить в клиентской программе, какие файловые системы предназначены для доступа. Процедура возвращает результаты в виде связанного списка, который называется списком экспорта. Тип узла в списке экспорта объявлен как структура exportnode; определен также тип указателя для этой структуры — exports:
typedef struct exportnode *exports;
struct exportnode { /* Список доступных иерархий */
dirpath ex_dir; /* Составное имя пути для этой иерархии */ groups ex_groupsj /* Группы, которым разрешен доступ к ней */ exports exjiextj /* Указатель на следующий элемент в списке */
}?
Поле ex_groups узла exportnode содержит указатель на связанный список, который определяет, какие группы защиты имеют право доступа к именованной иерархии. Узлы в списке заданы как экземпляры структуры типа groupnode, а тип groups представляет собой указатель на узел groupnode:
typedef struct groupnode *groups;
struct groupnode { /* Список имен групп */ name grjiamej /* Имя одной группы */
groups gr_next; /* Указатель на следующий элемент в списке */
}?
Протокол монтирования позволяет также определить в клиентской программе, к каким удаленным файловым системам на указанном компьютере происходит доступ. Это дает возможность построить с помощью системы NFS список перекрестных ссылок для ряда компьютеров. Для этой цели каждому компьютеру из списка передается запрос на получение перечня удаленных файловых систем, к которым имеет доступ данный компьютер. Следует отметить, что перечень удаленных файловых систем, доступных для данного компьютера, не совпадает с перечнем локальных файловых систем, экспортируемых компьютером в целях предоставления доступа к ним с других компьютеров.
Ответ с перечнем доступных файловых систем, формируемый программным обеспечением протокола монтирования, представляет собой связанный список, каждый узел которого имеет тип mountbody:
typedef struct mountbody *mountlist;
struct *mountbody { /* Список удаленных монтируемых файловых систем */
name ml_hostname; /* Компьютер, на котором находятся файлы */
dirpath ml_directory; /* Составное имя корневого каталога */
/* иерархии каталогов */ mountlist mljiextentry; /* Указатель на следующий элемент в списке */
}?
Термин "экспорт" подчеркивает аналогию с тем, что сервер экспортирует часть своих файлов на другие компьютеры