Серверная часть NFS
Категория: Сетевая файловая система | Автор: admin | 9-05-2010, 14:45 | Просмотров: 4222

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

Процесс монтирования файловой системы (т.е. определения ее секретного ключа) полностью отличается от процесса последующего доступа к удаленным файлам. В обеих операциях используются совершенно разные протоколы, а запросы обслуживаются разными демонами: в первом случае — mountd, во втором — nfsd. В некоторых системах они называются соответственно rpc.mountd и rpc.nfsd — как напоминание о том, что их работа основана на технологии Sur, RPC (следовательно, для их выполнения требуется демон portmap, о котором рассказывается в параграфе 28.3).

На сервере NFS оба демона, mountd и nfsd, должны стартовать на этапе начальной загрузки системы и продолжать выполняться, пока система не будет выключена. Чаще всего запуск демонов осуществляется автоматически. Стартовые сценарии проверяют, сконфигурированы ли экспортируемые файловые системы, и если это так, то демоны запускаются.

Демоны mountd и nfsd совместно эксплуатируют общую базу данных с информацией о правах доступа, где указано, какие файловые системы следует экспортировать и какие клиенты могут их монтировать. Рабочая копия этой базы данных обычно хранится в двоичном файле (в большинстве систем он называется xtab, в Solaris — sharetab) где-то в корневой файловой системе; ее копия может быть также спрятана в ядре.

Поскольку файл базы данных представлен в нечитаемом формате, для добавления и редактирования записей требуется вспомогательная команда. В большинстве систем это команда exportfs, в Solaris — share. Удалить записи можно посредством команды exportfs -u или unshare.

Управлять двоичным файлом вручную — не самое приятное занятие, поэтому большинство систем предполагает, что пользователь ведет текстовый файл, в котором перечислены все экспортируемые каталоги системы и права доступа к ним. На этапе начальной загрузки система читает этот файл и на его основании автоматически создает файл xtab или sharetab.

В большинстве систем имеется файл /etc/exports, включающий канонический список экспортируемых каталогов в текстовом виде. Его содержимое читается посредством команды exportfs -а. В Solaris канонический список хранится в файле /etc/dfs/dfstab, который в действительности представляет собой сценарий, состоящий из последовательности команд share. (Команда shareall с помощью утилиты grep извлекает из файла dfstab все NFS-команды и выполняет их. Но NFS — единственная широко распространенная система совместного использования файлов, поэтому команда shareall эквивалентна вызову sh /etc/dfs/dfstab.)

FreeBSD необычна тем, что демон mountd опрашивает файл /etc/exports напрямую, поэтому необходимости в файле xtab и команде exportfs не возникает. Изменив файл exports, нужно послать демону mountd сигнал HUP, чтобы он повторно прочитал содержимое файла:

# kill -HUP 'cat /var/run/mountd.pid'

 

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

Таблица 17.2. Как экспортировать каталог

Система

Список экспортируемых файловых систем

Что делать после внесения изменений

Solaris

/etc/dfs/dfstab

Выполнить команду shareall

HP-UX

/etc/exports

Выполнить команду /usr/sbin/exportfs -а

Red Hat

/etc/exports

Выполнить команду /usr/sbin/exportfs -а

FreeBSD

/etc/exports

Послать демону mountd сигнал HUP

 

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

Обычно клиентам позволяется монтировать подкаталоги экспортированного каталога. Скажем, если сервер экспортирует каталог /chimchim/users, то клиент может смонтировать подкаталог /chimchim/users/joe, а остальную часть каталога users — проигнорировать. Большинство систем не позволяет экспортировать подкаталоги с другими параметрами, чем у родительского экспортированного каталога, хотя Red Hat — исключение из правила.

 

Команда share и файл dfstab (Solaris)

 

Сценарий /etc/dfs/dfstab выполняет команду share однократно для каждой экспортируемой файловой системы. Например, на сервере, совместно использующем каталог /chimchim/users с машинами band и moon (при этом клиент band имеет права пользователя root) и каталог /user/share/man с машинами chimchim и rastadon, файл /etc/dfs/dfstab будет содержать такие команды:

 

share -F nfs -о rw=band.xor.com:moon.xor.com,root=band.xor.com /chimchim/users

share -F nfs -о rw=chimchim.xor.com:rastadon.xor.com /usr/share/mar.

 

После редактирования файла /etc/dfs/dfstab не забудьте вызвать команду shareall, и все изменения вступят в силу. Учтите, что команда shareall просто выполняет команды, записанные в файле dfstab, поэтому она не сможет отменить совместное использование файловых систем, записи которых были удалены из файла. Наиболее распространенные опции команды share перечислены в табл. 17.3.

Таблица 17.3. Опции команды share (Solaris)

Опция

Описание

ro

Экспорт с доступом только для чтения всем пользователям (не рекомендуется)

ro=список

Экспорт с доступом только для чтения указанным узлам

rw 

Экспорт с доступом для чтения и записи всем пользователям (не рекомендуется)

rw=список

Экспорт с доступом для чтения и записи указанным узлам

root=список

Список узлов, которым разрешен доступ к этой файловой системе с правами суперпользователя; без данной опции привилегированный доступ с машины-клиента эквивалентен доступу от имени пользователя nobody (как правило, его идентификатор равен -2)

anon=uid

Значение UID, которое нужно использовать для запросов, поступающих от пользователя root; по умолчанию — nobody

nosub

Запрещает клиентам монтировать подкаталоги экспортированного каталога

nosuid

Запрещает создавать через NFS файлы с установленными битами SUID и SGID

 

 

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

Таблица 17.4. Спецификации узлов в команде share

Тип

Синтаксис

Назначение

Имя компьютера

имя_компьютера

Имена отдельных узлов (должны быть полностью определены, если используется DNS)

Сетевая группа

имя_группы

Сетевые группы NIS; подробнее об этом рассказывается в параграфе 18.3

Домен DNS

xхх.ууу

Любой узел в пределах домена

ІР-сети

@имя сети

Имена сетей, заданные в файле /etc/networks1

1   Допускаются также спецификации в формате CIDR, например @128.138.92.128/25.

 

Примечание к табл. 17.4, касающееся имен узлов, стоит повторить еще раз: если в организации используется система DNS, имена отдельных узлов должны быть полностью определенными, иначе они будут проигнорированы.

Перед элементом можно поставить дефис, что означает запрет. Список просматривается слева направо, пока не будет найдено совпадение, поэтому операции отрицания должны предшествовать более общим спецификациям. Например, строка

 

share -F nfs -о rw=-8128.138.243/24:.cs.colorado.edu /users

 

экспортирует каталог /usr с доступом для чтения-записи всем узлам в домене cs.colorado.edu, за исключением узлов сети 128.138.243.

Разрешается экспортировать каталог одним клиентам с доступом только для чтения, а другим — для чтения-записи. Нужно просто включить в спецификацию как опцию rw=, так и опцию ro=.

На man-странице share(lM) описаны некоторые базовые параметры NFS. Полный их список приведен на странице share_nfs(lM).

 

Команда exportfs и файл exports (HP-UX, Red Hat, FreeBSD)

 

Файл exports содержит в крайней левой колонке перечень экспортируемых каталогов, за которым следуют списки опций и атрибутов. Например, в HP-UX файл exports, содержащий строки

 

/chimchim/users      -access=band:moon,root=band

/usr/share/man       -access=xorasaurus:rastadon:moon,ro

 

определяет, что машинам band и moon разрешено монтировать файловую систему /chimchim/users, а с машины band можно получить доступ к этой файловой системе от имени суперпользователя. Кроме того, машины xorasaurus, rastadon и moon могут монтировать файловую систему /usr/share/man с доступом только для чтения.

Файловые системы, которые указаны в файле exports без соответствующего списка компьютеров, обычно могут монтироваться всеми компьютерами. Подобная беспечность приводит к возникновению серьезной бреши в системе защиты.

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

Конкретные параметры, которые можно указывать в файле /etc/exports а также их синтаксис у каждой системы свои, хотя и наблюдается определенное сходство. Ниже описаны особенности систем HP-UX, Red Hai Linux и FreeBSD, но, как всегда, не помешает все сверить по документации

 

Файл exports в HP-UX

 

В HP-UX формат файла exports наиболее "классический" среди всех наших тестовых систем. Возможные опции (табл. 17.5) очень напоминают те, которые распознаются командой share в Solaris. Но есть и ряд тонких различий. Например, строка

rw=anchor.cs.colorado.edu:moet.cs.colorado.edu

 

в Solaris означает экспорт каталога с доступом для чтения-записи только перечисленным узлам. В HP-UX эта же строка разрешает всем пользователям монтировать каталог только для записи, а двум указанным — еще и для чтения. Попробуй пойми этих разработчиков! В HP-UX, чтобы разрешить монтирование заданным клиентам, нужно воспользоваться опцией access

rw,access=anchor.cs.colorado.edu:moet.cs.colorado.edu

 

Установка на чтение-запись сделана по умолчанию, поэтому опцию rw можно опустить. С другой стороны, не помешает указать ее явно.

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

В табл. 17.5 перечислены наиболее распространенные опции, которые можно указывать в файле exports. Под списком понимается разделенная двоеточиями последовательность имен узлов и сетевых групп (о последних речь пойдет в параграфе 18.3).

Таблица 17.5. Наиболее распространенные опции файла exports в HP-UX

Опция

Описание

access=список

Список клиентов, которые могут монтировать файловую систему

Ro

Экспорт только для чтения; ни один клиент не имеет права записи в файловую систему

Rw

Экспорт для чтения и записи (по умолчанию)

rw=список

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

root=список

Список клиентов, которым разрешен доступ к файловой системе с правами суперпользователя; без этой опции привилегированны доступ с машины-клиента эквивалентен доступу от имени пользователя nobody

anon=n

Значение UID, которое нужно использовать для запросов, посыпающих от пользователя root По умолчанию это -2 (пользователь nobody). При указании значения -1 доступ от имени суперпользователя будет вообще запрещен

Async

Асинхронная обработка всех запросов на запись; при наличие этой опции производительность операций записи повышается, равно как и вероятность потери данных в случае краха сервера

 

Не забудьте по окончании редактирования файла /etc/exports выполнить команду exportfs -а.

 

Файл exports в Red Hat Linux

 

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

Вот образцы записей:

 

/chimchim/users       band(rw,no_root_squash) moon(rw)

/usr/share/man        *.cs.colorado.edu(ro)

 

 

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

Таблица 17.6. Клиентские спецификации в Red Hat

Тип

Синтаксис

Назначение

Имя компьютера

имя_компъютера

Имена отдельных узлов

Сетевая группа

@имя_группы

Сетевые группы NIS; подробнее об этом рассказывается в параграфе 18.3

Подстановочные знаки

* и ?

Полностью определенные доменные имена с подстановочными знаками; метасимвол '*' не соответствует точке

ІР-сети

IР-адрес/маска

Спецификация в формате CIDR, например 128.138.92.128/25

 

В табл. 17.7 описаны наиболее распространенные опции файла exports, характерные для Red Hat.

Программное обеспечение NFS в Red Hat обладает необычной возможностью: разрешается экспортировать родительский каталог с одними опциями, а подкаталоги — с другими. Имеется также опция noaccess, позволяющая отменить экспорт подкаталогов, к которым не нужно предоставлять удаленный доступ. Например, в конфигурации ,

 

/users            *.xor.com(rw)

/users/evi        (noaccess)

 

 

узлам домена xor.com разрешен доступ ко всем каталогам файловой системы /users, кроме /users/evi. Отсутствие имени клиента во второй строке означает, что установка относится ко всем узлам; так, очевидно, безопаснее.

В Red Hat имеется богатый набор средств преобразования удаленных идентификаторов пользователей в локальные. Мы не советуем применять их в гетерогенной среде, но если в организации установлены только Linux-системы, тогда пожалуйста. Подробности можно узнать на man-странице exports(5).

 

Таблица 17.7. Наиболее распространенные опции файла exports в Red Hat

Опция

Описание

ro

Экспорт только для чтения

rw

Экспорт для чтения и записи (по умолчанию)

rw=cnucoK

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

root_squash

Закрепляет значения UID и GID, равные 0, за идентификаторами, указанными в опциях anonuid и anongid;1 это установка по умолчанию

no_root_squash

Разрешает обычный доступ от имени пользователя root (опасно)

all_squash

Закрепляет идентификаторы всех пользователей и групп за своими анонимными версиями; это удобно при работе с персональными компьютерами и ненадежными однопользовательскими станциями

anonuid=xxx

Значение UID, которое нужно использовать для запросов, поступающих от пользователя root

anongid=xxx

Значение GID, которое нужно использовать для запросов поступающих от пользователя root

secure

Требует, чтобы запрос на удаленный доступ поступал из привилегированного порта

insecure

Разрешает удаленный доступ с любого порта

noaccess

Предотвращает доступ к данному каталогу и его подкаталогам

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

 

Демон mountd в Red Hat может запускаться по запросу из демона inetd, а не выполняться непрерывно. Это позволяет обеспечить дополнительный контроль доступа с помощью программы tcpd; подробнее о ней говорится в параграфе 21.7.

В настоящее время в Red Hat не поддерживается NFS 3, но ожидается, что эта поддержка появится в ближайшем будущем. Клиентам, по умолчанию работающим с версией 3, нужно явно сообщить о необходимости монтирования файловых систем с помощью протокола NFS 2, иначе будут появляться непонятные сообщения об ошибках.

 

Файл exports во FreeBSD

 

Во FreeBSD записи файла exports состоят из разделенного пробелами списка каталогов, аналогичного списка опций (каждая из них начинается с дефиса) и набора клиентских спецификаций, также разделенных пробелами. Приведем короткий пример:

 

/chimchim/users       -maproot=root band

/chimchim/users       moon

/usr/share/man        -ro -mapall=daemon xorasaurus rastadon moon

 

 

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

В табл. 17.8 описаны наиболее распространенные опции. В отличие от большинства реализаций NFS, FreeBSD не позволяет клиентам монтировать подкаталоги экспортируемых файловых систем, если только разрешение не выдано явно с помощью опции -alldirs. Зачем это было сделано, навсегда останется загадкой; безопасность от этого не повышается.

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

-network сетевой_адрес -mask маска
 

 

Таблица 17.8. Наиболее распространенные опции файла exports во FreeBSD

Опция

Описание

-ro

Экспорт только для чтения; по умолчанию экспорт предоставляется для чтения-записи

-maproot=пользователь

Закрепляет идентификатор учетной записи root за указанным пользователем (это может быть значение UID или имя). По умолчанию выбирается пользователь nobody (идентификатор -2). Чтобы разрешить привилегированный доступ, задайте -maproot=root

-mapall=полъзователь

Закрепляет все значения UID за определенным пользователем; это удобно при работе с персональными компьютерами и ненадежными однопользовательскими станциями

-alldirs

Разрешает монтировать любой подкаталог; по умолчанию разрешение выдается только для указанного каталога

-webnfs

Экспорт каталога в формате WebNFS; доступ только для чтения всем пользователям, а все идентификаторы закрепляются за пользователем nobody

 

Документация иногда требует наличия оператора = между параметром -network или -mask и его аргументом, но похоже, что такая система записи работает неправильно. Сетевой адрес и маска подсети задаются в традиционной точечной нотации, например:

/chimchim/users       -ro -network 128.138.243.0 -mask 255.255.255.0

 

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

Помните о необходимости отправки демону mountd сигнала HUP, который заставит его повторно прочитать файл /etc/exports после внесения в него изменений. К сожалению, демон не способен сообщать пользователям об обнаруженных в файле ошибках. Придется просматривать системные журнальные файлы. Демон mountd передает сообщения в Syslog от имени средства "daemon".

 

Демон nfsd: файловый сервис

 

Если демон mountd проверил клиентский запрос на монтирование и нашел его правильным, клиенту разрешается запрашивать различные операции файловой системы. Эти запросы обрабатываются на стороне сервера демоном nfsd . Ему нет необходимости выполняться на машине-клиенте NFS. Единственное исключение — когда клиент тоже экспортирует свои файловые системы.

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

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

Раньше максимальное количество процессов nfsd было тесно связано с числом аппаратных контекстов, поддерживаемых центральным процессором. Сегодня в большинстве реализаций NFS все копии демона совместно пользуются общим контекстом, поэтому упомянутый показатель больше не является определяющим. Более реальная метрика — число обслуживаемых жестких дисков. При высокой активности NFS полоса пропускания жесткого диска станет ограничивающим фактором для канала NFS. Нет необходимости запускать слишком много экземпляров демона на один шпиндель.

Четыре процесса вполне достаточно для сервера, который используется нечасто, и достаточно для того, чтобы не возникало проблем с производительностью. На крупном сервере этот показатель должен быть в диапазоне от 12 до 20. Увеличивайте число процессов до тех пор, пока показатель средней загруженности сервера (его сообщает команда uptime) не начнет заметно возрастать. Это признак того, что система не справляется со своими функциями. Уничтожьте несколько процессов, и все придет в норму.

На загруженном сервере NFS с большим числом UDP-клиентов буферы UDP-сокетов могут переполниться, если запросы будут поступать в то время, когда все демоны nfsd уже задействованы. Число переполнений можно отслеживать с помощью команды netstat -s. Запускайте дополнительные демоны до тех пор, пока число переполнений не упадет до нуля, так как переполнение свидетельствует о серьезной нехватке серверных демонов.

Во многих системах число процессов nfsd задается в одном из файлов /etc/rc* или в одном из стартовых сценариев, запускаемых демоном init. Иногда существуют и более элегантные способы установки данного значения.

В Solaris демон nfsd нужно запускать с флагом , чтобы разрешить сервис как через протокол UDP, так и через TCP. Подобный запуск осуществляется по умолчанию.

В HP-UX число процессов nfsd задается посредством переменной NUM_NFSD в файле /etc/rc.config.d/nfsconf.

Во FreeBSD демон nfsd нужно запускать с флагами -t и -u, что сделает возможным обслуживание по протоколам TCP и UDP. Число процессов задается с помощью флага -n (например, nfsd -t -u -n 8). Аргументы командной строки, передаваемые демону, берутся из переменной nfs_server_flags в файле /etc/rc.conf (или в файле /etc/defaults/rc.conf, если пользователь не задал эту переменную; по умолчанию используются следующие аргументы: "-u -t -n 4"). Необходимо также установить переменную nfs_server_enable равной YES, чтобы обеспечить запуск демонов NFS.



 (голосов: 0)
Версия для печати | Комментариев: 0
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.


 
Логин
Пароль
 

 
Locations of visitors to this page