Системное администрирование ОС Solaris 10

Настройка сервера и клиента NFS

Разбить на страницы
Показывать лекцию целиком

Задачи NFS

Сетевая файловая система (Network File System – NFS) служит для обеспечения доступа компьютерам сети к общим каталогам на сервере. Централизованное хранение файлов на сервере облегчает организацию работы в большой сети, особенно там, где один и тот же пользователь может работать в разное время на разных компьютерах. С помощью файлового сервера решается сразу несколько задач:

  • регулярное резервное копирование всех данных: нереально выполнять регулярное копирование данных с нескольких десятков или сотен компьютеров, но вполне реально – с единственного сервера или нескольких серверов;
  • повышение надежности хранения данных: глупо в каждый компьютер в сети устанавливать RAID-массив, ведь подавляющее большинство файлов в компьютере, таких, как установленные пакеты программ, проще установить заново, чем защищать их от сбоя; но совершенно разумно укомплектовать файловый сервер аппаратным RAID-массивом или организовать там программный RAID-массив, хотя бы простое зеркалирование дисков;
  • уменьшение стоимости хранения данных: дорого и неэффективно в каждый компьютер устанавливать огромный диск на случай, если потребуется хранить много данных, но на сервере вполне можно установить масштабируемую дисковую подсистему большого объема;
  • обеспечение доступа к одним и тем же данным с любого компьютера.
  • Описание NFS

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

    Версии NFS

    NFS была разработана компанией Sun Microsystems и оказалась настолько удачной, что ее реализации были воплощены разными компаниями почти для всех операционных систем. Существует несколько принципиально разных реализаций NFS. Достаточно распространена версия NFS 2.0, хотя уже в Solaris 2.5 была введена NFS 3.0. В последующих версиях Solaris, включая Solaris 9, в NFS были внесены существенные дополнения, но сам протокол остался совместимым с реализацияим NFS 3.0 в других системах. Начиная с NFS 3.0, поддерживается передача пакетов посредством TCP и UDP, ранее поддерживался только UDP.

    Будьте внимательны! В сети следует использовать клиентов и серверы NFS одной и той же версии. NFS 2.0 можно встретить в старых системах, например, в HP-UX 10.0. Совместная работа систем, использующих разные версии NFS, нежелательна.

    Совместимость NFS и других служб разделяемых каталогов

    NFS по смыслу и по организации работы похожа на разделяемые каталоги (shared folders) в системах Windows, но в этих службах используются совершенно разные протоколы работы и между собой они не совместимы. Однако, существует несколько программных продуктов, которые устанавливают поддержку NFS в системах Windows, поэтому применение NFS в сети с различными операционными системами не представляет проблемы, надо только помнить о необходимости использовать одинаковые версии NFS.

    Служба NFS предполагает работу модели клиент-сервер, причем на компьютерах-клиентах и компьютерах-серверах запускаются разные программы для обеспечения доступа к общим каталогам на сервере.

    Поскольку компьютеры на рабочих местах сотрудников в России обычно управляются Windows-системами, в качестве файловых серверов часто используются также Windows-системы. Однако, нередко возникает желание установить UNIX на файл-сервер, чтобы повысить надежность, сократить затраты на оборудование или использовать этот же сервер для ряда других корпоративных нужд: веб-сервера, сервера баз данных и т.п. Чтобы не устанавливать дополнительное ПО для поддержки NFS в таком случае, достаточно установить пакет samba на UNIX-машину. Он позволит ей "прикинуться" Windows NT сервером так, чтобы все клиентские компьютеры воспринимали его как самый обычный файл-сервер или принт-сервер Windows-сети. Пакет samba умеет обеспечивает поддержку "родного" для Windows-сетей протокола SMB.

    В тех случаях, когда в сети работают несколько UNIX-компьютеров и им нужно обращаться к одному файл-серверу, имеет смысл использовать механизм NFS (network file system).

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

    Терминология NFS

    После настройки NFS-сервера UNIX-компьютер будет предоставлять доступ внешним пользователям к некоторым каталогам своей файловой системы. Такое предоставление доступа называется "экспортом": говорят, что система экспортирует свои каталоги. Как именно каталоги будут экспортироваться, определяется списком, который задает системный администратор. В большинстве систем UNIX этот список содержится в файле /etc/exports, но в Solaris он находится в другом файле – /etc/dfs/dfstab.

    NFS работает посредством механизма удаленного вызова процедур (RPC – Remote Procedure Call).

    Что такое RPC

    Идеология RPC очень проста и привлекательна для программиста. Как обычно работает сетевое приложение? Оно следует некоему протоколу (например, HTTP): формирует пакет с запросом, вызывает системную функцию установления соединения, затем функцию отправки пакета, затем ждет ответного пакета и вызывает функцию закрытия соединения. Это значит, что вся работа с сетью является заботой программиста, который пишет приложение: он должен помнить о вызове функций сетевого API системы, думать о действиях в случае сбоев сети.

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

    Для того, чтобы обеспечить прозрачность пересылки данных через сеть, придумана двухступенчатая процедура. На сервере любое приложение, которое хочет предоставлять свой сервис через RPC, регистрируется в программе, которая называется транслятором портов (port mapper). Функция этой программы – устанавливать соответствие между номером процедуры RPC, которую запросил клиент, и номером TCP или UDP порта, на котором приложение сервера ждет запросов. Вообще говоря, RPC может работать не только с TCP или UDP, в Solaris как раз реализована работа на базе механизма TI (Transport-Independent), поэтому в Solaris транслятор портов называется rpcbind, а не portmap, как в Linux или FreeBSD.

    Приложение, которое регистрируется у транслятора портов, сообщает ему номер программы, номер версии и номера процедур, которые могут обрабатываться данной программой. Эти процедуры будут впоследствии вызываться клиентом по номеру. Кроме этого, приложение сообщает номера портов TCP и UDP, которые будут использоваться для приема запросов на выполнение процедур.

    Клиент, желающий вызвать выполнение процедуры на сервер, сначала отправляет запрос транслятору портов на сервер, чтобы узнать, на какой TCP или UDP порт надо отправить запрос. Транслятор портов запускается при старте системы и всегда работает на стандартном порте 111. Получив ответ от него, клиент отправляет запрос на тот порт, который соответствует требуемому приложению. Например, сервер NFS работает на порту 2049.

    Процедура монтирования общего каталога через NFS

    Прежде чем мы перейдем к описанию настроек сервера и клиентов NFS, следует понять, как осуществляется монтирование удаленных файловых систем в принципе.

    Клиент NFS посылает запрос на монтирование удаленному компьютеру, который предоставляет свою файловую систему (обычно – некоторую ее часть) для общего пользователя. При этом говорят, что сервер NFS "экспортирует" тот или иной каталог (подразумевается – с подкаталогами). Запрос от клиента NFS попадает на обработку демону mountd. Тот выдает клиенту NFS специальный ключ. Этот ключ является идентификатором, который однозначно идентифицирует каталог, смонтированный по сети.

    По NFS можно смонтировать как целые файловые системы, так и отдельные каталоги. Из соображений безопасности запрещено монтировать каталоги "через раздел". Это означает, что если каталог /var расположен на одном разделе диска, а каталог /var/adm – на другом, то при монтировании каталога /var каталог /var/adm не будет автоматически смонтирован. Если требуется монтировать те подкаталоги экспортируемого каталога, которые расположены в другой файловой системе (на другом разделе), следует экспортировать их отдельно и указывать в /etc/dfs/dfstab еще один разделяемый каталог – тот самый подкаталог с другого раздела.

    Ключ, выданный клиенту при монтировании и идентифицирующий сеанс работы с данным удаленным каталогом, сохраняется при перезагрузке NFS-сервера, чтобы после восстановления его работы клиенты, замершие в ожидании, продолжили работу с удаленным сервером как ни в чем ни бывало. При демонтировании и новом монтировании файловой системы через NFS ключ обычно изменяется. На практике перезагрузка NFS-сервера все-таки может привести к сбою в работе клиентского приложения, особенно, если приложение читает или записывает файл в удаленный каталог во время перезагрузки.

    После монтирования файловой системы через NFS клиент посылает серверу запросы на передачу и прием файлов, эти запросы обрабатывает демон nfsd.

    Демонтирование файловой системы выполняется также, как и демонтирование любой другой файловой системы – командой umount.

    Ниже будут обсуждены следующие аспекты настройки службы клиент-сервер в сети:

  • определение списка каталогов на сервере, которые должны быть общими;
  • определение прав доступа к этим каталогам;
  • аутентификация и назначение прав доступа в NFS;
  • настройка сервера NFS, запуск необходимых программ;
  • настройка клиентов NFS, монтирование удаленных каталогов.
  • Настройка NFS-сервера

    Для настройки NFS сервера нам потребуется выполнить настройку как минимум трех приложений: rpcbind, mountd и nfsd. Прежде всего, создадим файл /etc/dfs/dfstab, в котором опишем экспортируемые каталоги; в отличие от других систем UNIX, Solaris требует указать здесь не просто список каталогов с параметрами монтирования, а набор команд share, которые фактически и запускают экспорт каталогов. Таким образом, получается, что /etc/dfs/dfstab – это скрипт, который выполняется для того, чтобы сделать общие каталоги доступными для монтирования через сеть.

    rpcbind: объявление служб RPC

    Для начала следует запустить программу rpcbind, если она еще не запущена. Скорее всего, она запускается при старте вашей системы, если это действительно Solaris. Эта программа, как мы помним, преобразует номера вызовов процедур RPC в номера портов TCP и UDP. При запуске любого RPC-сервера, т.е. программы, работающей с протоколом RPC, программа rpcbind получает от этого RPC-сервера информацию о том, какие номера процедур RPC он намерен обслуживать и через какой порт TCP (UDP) ему следует направлять запросы.

    Когда клиент деалет RPC-вызов, сперва происходит выяснение требуемого номера порта на машине сервера у rpcbind.

    Поэтому rpcbind должен быть запущен до того, как будет запущен любой из RPC-серверов. При аварийном завершении rpcbind необходимо вначале перезапустить rpcbind, и затем перезапустить все RPC-серверы.

    Для проверки готовности всех служб NFS к работе через rpcbind используется команда rpcinfo -p:

    rpcinfo -p
    program vers proto port service
    100000 4 tcp 111 rpcbind
    100000 3 tcp 111 rpcbind
    100000 2 tcp 111 rpcbind
    100000 4 udp 111 rpcbind
    100000 3 udp 111 rpcbind
    100000 2 udp 111 rpcbind
    100232 10 udp 32772 sadmind
    100083 1 tcp 32771
    100221 1 tcp 32772
    100068 2 udp 32773
    100068 3 udp 32773
    100068 4 udp 32773
    100068 5 udp 32773
    100229 1 tcp 32773 metad
    100230 1 tcp 32774 metamhd
    100242 1 tcp 32775 metamedd
    100001 2 udp 32774 rstatd
    100001 3 udp 32774 rstatd
    100001 4 udp 32774 rstatd
    100002 2 udp 32775 rusersd
    100002 3 udp 32775 rusersd
    100002 2 tcp 32776 rusersd
    100002 3 tcp 32776 rusersd
    100008 1 udp 32776 walld
    100012 1 udp 32777 sprayd
    100011 1 udp 32778 rquotad
    100024 1 udp 32779 status
    100024 1 tcp 32777 status
    100133 1 udp 32779
    100133 1 tcp 32777
    100021 1 udp 4045 nlockmgr
    100021 2 udp 4045 nlockmgr
    100021 3 udp 4045 nlockmgr
    100021 4 udp 4045 nlockmgr
    100021 1 tcp 4045 nlockmgr
    100021 2 tcp 4045 nlockmgr
    100021 3 tcp 4045 nlockmgr
    100021 4 tcp 4045 nlockmgr
    300598 1 udp 32784
    300598 1 tcp 32781
    805306368 1 udp 32784
    805306368 1 tcp 32781
    100249 1 udp 32785
    100249 1 tcp 32782
    1289637086 5 tcp 32787
    1289637086 1 tcp 32787
    100005 1 udp 32814 mountd
    100005 2 udp 32814 mountd
    100005 3 udp 32814 mountd
    100005 1 tcp 33201 mountd
    100005 2 tcp 33201 mountd
    100005 3 tcp 33201 mountd
    100003 2 udp 2049 nfs
    100003 3 udp 2049 nfs
    100227 2 udp 2049 nfs_acl
    100227 3 udp 2049 nfs_acl
    100003 2 tcp 2049 nfs
    100003 3 tcp 2049 nfs
    100227 2 tcp 2049 nfs_acl
    100227 3 tcp 2049 nfs_acl

    При запуске системы в многопользовательском режиме 3 rpcbind запускается автоматически, а службы NFS – в случае, если существует файл /etc/dfs/dfstab.

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

    Сервис NFS предоставляется двумя программами, которые обрабатывают соответствующие RPC-запросы. Это программы mountd и nfsd.

    Программа mountd обрабатывает запросы на удаленное монтирование файловых систем. Для получения списка экспортируемых каталогов применяют команду showmount –e, которая обращается к mountd за информацией:

    showmount -e
    export list for sunny:
    /nfst (everyone)

    Для того, чтобы на сервере NFS узнать, какие системы подсоединили к себе разделяемые каталоги этого сервера, следует дать команду showmount без параметров:

    showmount
    www.eu.spb.ru

    Программа nfsd – это обработчик файлового запроса удаленного клиента NFS к файловой системе сервера NFS.

    Параметры службы NFS настраиваются в файле /etc/default/nfs, а запуск и остановка службы осуществляется, соответственно, командами

    /etc/init.d/nfs.server start

    и

    /etc/init.d/nfs.server stop

    В Solaris 10 служба NFS запускается и останавливается также, как и другие службы – командой svcadm enable nfs/server и svcadm disable nfs/server соответственно. О новом механизме работы со службами, появившемся в Solaris 10, более подробно рассказано в лекции 13.

    В файле /etc/default/nfs следует указать достаточное количество потоков, которые можно параллельно запускать для обслуживания одновременных запросов к файлам через NFS. За это отвечает параметр NFSD_SERVERS.

    Значение этого параметра не должно быть меньшим максимального количества одновременных обращений к разделяемым файловым системам NFS на сервере. Слишком маленькое число потоков вызовет задержки в работе клиентов, поскольку им придется становиться в очередь на обработку запросов. В то же время, излишне большое число приведет к нерациональному расходу памяти NFS-сервера. Оптимальное число определяется из опыта, и единственное, что можно сказать определенно: оно не должно быть больше удвоенного общего количества компьютеров сети, которые настроены для работы через NFS. По умолчанию это число равно 16, что для нагруженных серверов NFS очевидно мало.

    Если из-за слишком большого количества потоков nfsd загрузка процессора возрастет до 100%, имеет смысл уменьшить число этих потоков. С одной стороны, идеально иметь 2 потока на каждого активного клиента, постоянно обращающегося к ресурсам NFS, с другой – на один процессор рекомендуется запускать не более 16 потоков, если это достаточно медленный процессор типа тех, что установлены в системах SPARCstation 5, и не более.

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

    Перед запуском mountd и nfsd следует убедиться, что в /etc/dfs/dfstab указаны все каталоги, которые вы собираетесь экспортировать, а также разумно настроены параметры безопасности.

    Аутентичность пользователей NFS

    Работа с общим диском, разделяемым между многими пользователями сети, предполагает, что в пределах сети существует общее пространство имен пользователей, т.е. пользователь gregory на любом клиентском (в терминах NFS) компьютере имеет то же реальное имя и (что важнее) тот же идентификатор, что и пользователь gregory на сервере NFS. Это достигается использованием централизованной аутентификации (например, с помощью PAM и сервера аутентификации или с помощью NIS+). Кроме этого, важно ограничить права пользователя root при доступе через NFS, т.к. пользователь root на любом компьютере в любой системе UNIX имеет идентификатор 0, но от имени пользователя root на разных компьютерах могут работать разные люди.

    Для ограничения доступа пользователя root на сервере NFS любые файловые запросы от имени пользователей root клиентских компьютеров выполняются от имени nobody. Можно указать, пользователям root каких компьютеров мы предоставляем привилегированный доступ от имени root и через NFS.

    По умолчанию файловая система экспортируется с правами чтения и записи для тех, кто ее смонтирует. Однако, права доступа к конкретным каталогам могут запрещать запись в них; фактически права доступа к удаленной файловой системе определяются комбинацией прав, данными при монтировании системы и прав доступа к каталогам; силу имеют более строгие права (например, нельзя записать файл в каталог, если нет права записи в каталог ИЛИ если право есть, но файловая система экспортируется в режиме read-only – только для чтения).

    Рассмотрим для примера файл /etc/dfs/dfstab системы Solaris:

    share -F nfs -o rw=@212.231.110, ro=@192.168.4 /home
    share -F nfs -o ro=212.231.110@,root=212.231.110.112 /usr/share/man

    Файловая система /home экспортируется с возможностью чтения и записи для компьютеров сети 212.231.110, и только чтения – для компьютеров сети 192.168.4. Файловая система /usr/share/man экспортируется для чтения для компьютеров сети 212.231.110. Пользователю root с компьютера 212.231.110.112 разрешен доступ с правами суперпользователя к этой файловой системе.

    Полный список доступных режимов и настроек при указании экспортируемой файловой системы доступен в man share и man share_nfs, а некоторые из них обсуждаются ниже, в разделе "параметры экспорта в /etc/dfs/dfstab ".

    Сервер NFS и бездисковые станции

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

    Под "корневой файловой системой" мы здесь понимаем определенный заранее каталог на сервере NFS, играющий роль корневой файловой системы для бездисковой станции. Собственный корневой каталог сервера не следует экспортировать вообще.

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

    Табл. 7.1 демонстрирует соответствие экспортируемых на сервере каталогов и точек монтирования на бездисковых рабочих станциях.

    Обычным пользователям сервера доступ к каталогу /export, как правило, запрещают, ибо этот каталог предназначен только для монтирования его клиентами, и управление этим каталогом осуществляет администратор, работая от имени root.

    Каталог /export/root следует экспортировать с правами пользователей на чтение и запись.

    Параметр nosuid запрещает клиентам устанавливать бит setuid для файлов на смонтированной файловой системе NFS. Этот параметр может быть полезен для случаев, когда файл принадлежит пользователю root клиента или пользователю, чей uid совпадает с uid наделенного большими правами пользователя в какой-либо из систем сети (особенно – сервера NFS).

    Вместо того, чтобы использовать при монтировании каталога /export/root параметр nosuid, может быть достаточно запретить пользователям сервера NFS доступ к этому каталогу.

    Параметр ro обеспечивает монтирование каталога только для чтения для всех клиентов. Например, каталог с системными исполняемыми файлами пользователям менять незачем, и его рекомендуется экспортировать только для чтения.

    Соответствие каталогов сервера NFS и точек монтирования бездисковых рабочих станций
    Экспортируемые каталоги на сервереИмпортируемые каталоги на бездисковом компьютереПояснениеПараметры монтирования
    /export/root/<hostname> / Корневой каталог -o nosuid
    /export/exec/<platformname> /usr Каталог выполняемых файлов (Shared Product Object Tree – SPOT) Содержимое этого каталога зависит от аппаратной платформы, разным платформам должны монтироваться разные каталоги -o ro
    /export/home/<hostname> /home возможно, потребуется -o nosuid
    /export/share /usr/share -o ro
    /export/swap/<hostname> Применяется на бездисковых клиентах в качестве удаленного пространства подкачки

    При экспорте каталога /export/home можно пойти двумя путями:

  • экспортировать каталог /home сервера, так, чтобы дать возможность пользователям работать на сервере интерактивно в своем домашнем каталоге и монтировать этот же каталог по сети при работе на других компьютерах;
  • экспортировать каталог /export/home сервера с тем, чтобы пользователи на сервере не имели домашних каталогов (или же, что менее удобно, имели разные домашние каталоги при работе на сервере и при работе на остальных компьютерах сети).
  • В первом случае следует обязательно указать параметр nosuid для монтирования этого каталога через NFS.

    Проверка работоспособности служб NFS

    Теперь вы должны проверить, что mountd и nfsd запущены правильно. Сначала это делается с помощью команды rpcinfo -p. Вывод программы должен показать что-то похожее на следующее:

    100000 4 tcp 111 rpcbind
    100000 3 tcp 111 rpcbind
    100000 2 tcp 111 rpcbind
    100000 4 udp 111 rpcbind
    100000 3 udp 111 rpcbind
    100000 2 udp 111 rpcbind
    100003 2 udp 2049 nfs
    100003 3 udp 2049 nfs
    100005 3 udp 1023 mountd
    100005 3 tcp 1023 mountd
    100005 1 udp 1023 mountd
    100005 1 tcp 1023 mountd

    Как видно, rpcbind успешно анонсирует службы.

    Если в ответ на rpcinfo -p мы получили сообщение

    rpcinfo: can't contact
    rpcbind: RPC: Remote system error - Connection refused

    или

    RPC_PROG_NOT_REGISTERED

    или нечто похожее вместо ожидаемого – стало быть, rpcbind не доступен (отключен). Возможно, в файлах /etc/hosts.allow или /etc/hosts.deny есть настройки, запрещающие программе rpcbind отвечать нам.

    Для перезапуска служб NFS можно завершить выполнение демонов nfsd, mountd и rpcbind, запустить их вновь в следующем порядке: rpcbind, затем mountd и следом nfsd. Программе nfsd может быть передан числовой аргумент – число потоков, которые следует запустить при старте. Программа "распараллелится" в указанном количестве потоков.

    Более стандартным выходом является запуск скрипта /etc/init.d/nfs.server вначале с параметром stop, затем с параметром start.

    При штатной работе mountd и nfsd запускаются на сервере NFS при старте системы из стартовых скриптов. Это можно проверить командами

    ps -ef | grep mountd
    ps -ef | grep nfsd

    Программа rpcbind объявляет свои службы независимо от того, продолжают ли работать программы, ранее зарегистрировавшиеся и (возможно) прекратившие работу вследствие аварии.

    Следовательно, вышеприведенная проверка с помощью ps обязательна, если служба NFS перестала работать.

    Не забудьте перед настройкой сервера NFS изучить страницы руководства, рассказывающие о rpcbind, mountd, nfsd, dfstab.

    Блокировка файлов на NFS-сервере

    Для того, чтобы несколько процессов не конфликтовали при доступе к одному и тому же файлу, обычно используется механизм блокировки файла. Подробнее о блокировках следует читать в документации по системным фукнциям lockf() и flock(). В NFS механизм блокировки реализован посредством двух демонов: lockd и statd.

    Оба демона запускаются на сервере NFS после mountd и nfsd.

    Программа lockd устанавливает и снимает блокировку файлов по запросу, а демон statd следит за состоянием блокировок и работоспособностью NFS-сервера.

    В сети демон statd сервера NFS обменивается информацией с демонами statd на других компьютерах. Демон lockd посылает запросы демону statd для установления статуса компьютеров. взаимодействующих с ним.

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

    Дисковые квоты в NFS

    Если на сервере NFS установлены дисковые квоты для отдельных пользователей, то для того, чтобы пользователь "издалека" мог узнать свою дисковую квоту, запускается демон rquotad.

    Вообще говоря, установка дисковых квот (независимо от NFS) выполняется следующим образом:

  • в файле /etc/vfstab для файловой системы, для которой будет применяться квотирование, устанавливается параметр монтирования quota. Не забудьте демонтировать и снова смонтировать соответствующую файловую систему, если хотите, чтобы параметр оказал воздействие на работу файловой системы немедленно!
  • затем создается файл quotas в корне этой файловой системы (например, если речь идет о файловой системе /export/home, то файл будет называться /export/home/quotas );
  • затем с помощью команды edquota устанавливаются квоты для каждого из пользователей в отдельности;
  • выполняется команда quotaon.
  • Для выключения поддержки квот достаточно выполнить команду

    quotaoff

    Для проверки квот в файловых системах надо выполнить команду

    quota username

    Особенности NFS в системах Solaris

    В Solaris NFS организован иначе, нежели в других системах UNIX, и это следует иметь в виду при настройке систем в гетерогенных сетях:

  • файл /etc/dfs/dfstab в других системах называется /etc/exports ;
  • в других системах файл /etc/exports является файлом конфигурации, а не скриптом, вызывающим программу share ;
  • в Solaris после изменения параметров монтирования в файле /etc/dfs/dfstab нужно дать команду shareall для вступления изменений в силу; в других системах следует перезапустить mountd и nfsd, обычно для этого можно использовать сценарий, как и в Solaris;
  • Solaris автоматически становится NFS сервером при загрузке, если в файле /etc/dfs/dfstab указаны экспортированнные каталоги.
  • Помните, что команда shareall просто выполняет подряд все команды share, содержащиеся в файле /etc/dfs/dfstab. Если этот файл был модифицирован и некоторые команды экспорта каких-то файловых систем были удалены, действие старых команд share, запущенных до модификации файла, продолжится и после выполнения shareall.

    Поэтому следует перезапустить mountd для того, чтобы изменения возымели эффект. Внимание: нельзя перезапускать mountd, когда пользователи работают с файловой системой сервера NFS: это может вызвать потери данных и зависание систем – клиентов NFS.

    Если требуется ограничить доступ к разделяемой файловой системе только определенной группой машин, следует указать их список команде share:

    share -F nfs -o rw=host1:host2 /home/host12

    Параметры экспорта в /etc/dfs/dfstab

    При экспорте файловых систем можно передавать командам share ряд параметров, указывающих, в каком режиме следует экспортировать те или иные каталоги. Наиболее важные параметры сведены в табл. 7.2:

    Например, файл /etc/dfs/dfstab может иметь такой вид для экспорта двух файловых систем:

    share -F nfs -o rw=@212.231.110, ro=@192.168.4 /home
    share -F nfs -o ro=212.231.110@,root=212.231.110.112 /usr/share/man
    Парамеры экспорта файловых систем NFS
    ПараметрЗначение
    ro только для чтения – для всех
    ro=host1, host2 только для чтения и только указанным компьютерам
    rw для чтения и записи – для всех
    rw=host1, host2 для чтения и записи, но только указанным компьютерам
    root=host1, host2 с указанных компьютеров пользователь root получает доступ к файлам на сервере NFS от имени root (иначе – от имени nobody или указанного в параметре anon)
    anon=uid идентификатор пользователя, от имени которого сможет работать с файлами на сервере NFS пользователь root удаленного (клиентского) компьютера, по умолчанию – nobody
    nosub запрещается монтировать подкаталоги экспортируемого каталога
    nosuid запрещается создавать в экспортируемой файловой системе файлы с установленными битами suid и sgid

    Особенности NFS в Solaris версии 9 и новее

    В Solaris 9 были добавлены некоторые расширения поддержки NFS, которые улучшили ее производительность:

  • сняты ограничения на размер пакета; остались только ограничения, налагаемые транспортным протоколом, поэтому для NFS через UDP максимальный размер пакета составляет 32 Кб, а для TCP – 1 Мбайт;
  • клиент NFS больше не занимает большое количество портов UDP. Ранее NFS использовала отдельный порт UDP для каждого запроса. Начиная с Solaris 9 клиент NFS по умолчанию использует только один заранее определенный порт. Однако, эта функция настраивается: можно попытаться увеличить число портов, так как это может привести к увеличению производительности;
  • изменен алгоритм выполнения последовательных записей: ранее все запросы на запись выполнялись последовательно клиентом, затем сервером. Введена возможность (для клиента NFS) разрешить приложению выполнять одновременную запись (равно и одновременное чтение и запись) в один и тот же файл. Разрешить такое поведение можно с помощью параметра forcedirectio при монтировании файловой системы. Этот параметр распространяется на все файлы смонтированной файловой системы. Существует возможность разрешить такой режим работы с единственным файлом с помощью функции directio(). По умолчанию (без указания параметра при монтировании) запись в файл производится так же, как и раньше
  • Статистика сервера NFS

    Для получения статистики о работе сервера NFS следует использовать команду nfsstat на таком сервере:

    nfsstat -s
    Server rpc:
    Connection oriented:
    calls badcalls nullrecv badlen xdrcall dupchecks
    0 0 0 0 0 0
    dupreqs
    0
    Connectionless:
    calls badcalls nullrecv badlen xdrcall dupchecks
    33 0 0 0 0 3
    dupreqs
    0
    Server nfs:
    calls badcalls
    33 0
    Version 2: (0 calls)
    null getattr setattr root lookup readlink
    0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
    read wrcache write create remove rename
    0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
    link symlink mkdir rmdir readdir statfs
    0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
    Version 3: (33 calls)
    null getattr setattr lookup access readlink
    0 0% 5 15% 1 3% 4 12% 13 39% 0 0%
    read write create mkdir symlink mknod
    0 0% 1 3% 1 3% 0 0% 0 0% 0 0%
    remove rmdir rename link readdir readdirplus
    0 0% 0 0% 0 0% 0 0% 1 3% 0 0%
    fsstat fsinfo pathconf commit
    3 9% 3 9% 0 0% 1 3%
    Server nfs_acl:
    Version 2: (0 calls)
    null getacl setacl getattr access
    0 0% 0 0% 0 0% 0 0% 0 0%
    Version 3: (0 calls)
    null getacl setacl
    0 0% 0 0% 0 0%

    Кэширование файловой системы

    Для ускорения доступа к любой медленной файловой системе, такой, как удаленная система NFS или файловая система привода CD-ROM, может быть применено создание файловой системы кэша. Проще говоря, содержимое медленной файловой системы может быть закэшировано на локальном диске. Управление такой файловой системой кэша (cachefs) осуществляется утилитой cfsadmin.

    NFS. Настройка клиента

    Монтирование удаленных файловых систем

    Монтирование файловых систем NFS осуществляется очень похоже на монтирование файловой системы любого другого типа. Посмотрим, как смонтировать файловую систему с машины под управлением Linux, если роль файлового сервера выполняет Solaris (компьютер pxy работает под Linux, компьютер с адресом 192.168.5.33):

    root@pxy# mount -t nfs 192.168.5.33:/nfst ./nfst
    root@pxy# mount
    /dev/hda1 on / type ext2 (rw)
    none on /proc type proc (rw)
    none on /dev/pts type devpts (rw,mode=0620)
    /dev/hda3 on /usr type ext2 (rw)
    /dev/hda2 on /var type ext2 (rw)
    192.168.5.33:/nfst on /usr/home/filip/nfst type nfs
    (rw,addr=192.168.5.33)

    Удаленная файловая система успешно смонтирована, о чем говорит последняя строка вывода mount.

    Попробуем осуществить копирование файла:

    root@pxy# cp /etc/mail/aliases /usr/home/filip/nfst/
    root@pxy# ls /usr/home/filip/nfst/
    aliases
    root@pxy# ls -l /usr/home/filip/nfst/
    total 1
    -rw-r--r-- 1 root root 406 Jun 20 22:30 aliases

    Файл был записан, как видите, от имени пользователя root и группы root. На самом деле, в выводе команды ls таится подвох. Ведь команда ls на локальной машине использует для получения соответствия между идентификатором в файловой системе и именем пользователя (группы) локальный файл /etc/passwd. Потенциальная опасность состоит в том, что на удаленном сервере и на локальной машине файлы /etc/passwd окажутся разными. В случае пользователя root это не важно, если только на сервере NFS пользователю root нашей машины разрешено монтировать файловую систему от имени root. В противном случае все файлы, которые локальный root будет записывать на удаленный сервер, будут записываться от имени nobody (или иного имени, если так определено конфигурацией сервера).

    root@pxy# ls -ld /usr/home/filip/nfst/
    drwxrwxr-x 2 root bin 512 Jun 20 22:30 /usr/home/filip/nfst/

    Коль скоро в нашем примере файл был записан от имени root, следует предположить, что настройки сервера NFS это позволяют. Проверим это на компьютере 192.168.5.33:

    192.168.5.33# cat /etc/dfs/dfstab
    # Place share(1M) commands here for automatic execution
    # on entering init state 3.
    #
    # Issue the command '/etc/init.d/nfs.server start' to run the NFS
    # daemon processes and the share commands, after adding the very
    # first entry to this file.
    #
    # share [-F fstype] [ -o options] [-d "<text>"] <pathname> [resource]
    # .e.g,
    # share -F nfs -o rw=engineering -d "home dirs" /export/home2
    share -F nfs -o root=pxy.spb.ru /nfst

    Здесь, на компьютере 192.168.5.33, управляемом Solaris, разделяется общий каталог /nfst, а с компьютера pxy.spb.ru разрешено работать с этим каталогом от имени root. Следует осторожно раздавать подобные права и в большинстве случаев избегать разделения в сети каталогов с настроечной или секретной информацией.

    По команде showmount можно получить список компьютеров, подключенных к серверу NFS:

    192.168.5.33# showmount
    pxy.spb.ru
    www.spb.ru

    Как видно, на сервере NFS имя хозяина файла совпадает с тем, что мы видели с клиента NFS, а имя группы файла – нет, так как под одним и тем же идентификатором в файлах /etc/group на сервере и на клиенте значатся разные группы. На практике следует избегать подобных расхождений, чтобы не возникало ситуаций, компроментирующих безопасность системы файлов. Синхронизация файлов passwd и group на сервере и клиентах или использование общей базы NIS помогут миновать путаницу в именах групп и владельцев файлов на сервере и клиенте NFS.

    192.168.5.33# pwd
    /nfst
    192.168.5.33# ls -l
    total 2
    -rw-r--r-- 1 root root 406 Июн 20 22:30 aliases

    Обратите внимание на одинаковое время создания файла с точки зрения команды ls сервера и клиента. В поле времени указывается время создания, которое записывает туда сервер NFS. Следует синхронизировать не только файлы group и passwd, но и время на сервере NFS и его клиентах, чтобы не было расхождений между клиентом и сервером при выполнении резервного копирования или выяснения "свежести" файлов.

    Оптимизация производительности

    Для оптимизации производительности NFS используется несколько средств. Во-первых, чем быстрее работают диски сервера NFS, тем быстрее информация сможет быть переданной через сеть. Современные сети часто строятся на основе высокоскоростных (как минимум, 100-мегабитных) коммутаторов, поэтому диски даже чаще оказываются узким местом в производительности, чем сеть. Если говорить об архитектуре x86, то предпочтительнее использовать в серверах современные жесткие диски с поддержкой UltraDMA-100, которые позволяют отдавать данные приложению с диска со скоростью порядка 50 Мб/с.

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

    В-третьих, может использоваться локальное кэширование посредством создания кэширующей файловой системы cachefs, как рассказано выше.

    В SunOS 4.x для кэширования запросов к удаленной файловой системе NFS использовался процесс biod, но в SunOS 5.x (т.е. с самых ранних версий Solaris) применяется кэширование автоматическое всех операций чтения и записи, в том числе и для файлов, расположенных на удаленных серврах NFS. Поэтому в специальном процессе biod (в некоторых системах UNIX аналогичный по смыслу процесс называется nfsiod ) нет необходимости в Solaris.

    Соответствие версий SunOS и Solaris Operating Environment
    Версия SunOS Версия Solaris
    4.x 1.x
    5.6 2.6
    5.7 7
    5.8 8
    5.9 9
    5.10 10

    Выполним еще один эксперимент: сервером NFS будет компьютер pxy (Linux), клиентом – компьютер под управлением Solaris. Все команды даются на компьютере-клиенте:

    showmount -e ixy
    export list for ixy:
    /usr/home/filip/nfst (everyone)

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

    cd /
    ls
    devices lost+found opt TT_DB
    bin etc mnt platform tuition
    boot export named.run proc usr
    cdrom home net sbin var
    core kernel nfst test vol
    dev lib nsmail tmp xfn
    mkdir nfsc
    mount ixy:/usr/home/filip/nfst /nfsc

    Проверим, получилось ли:

    mount
    / on /dev/dsk/c0d0s0 read/write/setuid/intr/largefiles/xattr/
    onerror=panic/dev=1980000 on Сбт Июл 3 18:59:13 2004
    /boot on /dev/dsk/c0d0p0:boot read/write/setuid/nohidden/nofoldcase/
    dev=19a3010 on Сбт Июл 3 18:59:11 2004
    /proc on /proc read/write/setuid/dev=2d80000 on Сбт Июл 3 18:59:12 2004
    /etc/mnttab on mnttab read/write/setuid/dev=2e40000 on Сбт Июл 3
    18:59:12 2004
    /dev/fd on fd read/write/setuid/dev=2e80000 on Сбт Июл 3 18:59:14 2004
    /var/run on swap read/write/setuid/xattr/dev=1 on Сбт Июл 3 18:59:17 2004
    /tmp on swap read/write/setuid/xattr/dev=2 on Сбт Июл 3 18:59:18 2004
    /export/home on /dev/dsk/c0d0s7 read/write/setuid/intr/largefiles/xattr/
    onerror=panic/dev=1980007 on Сбт Июл 3 18:59:18 2004
    /nfsc on ixy:/usr/home/filip/nfst remote/read/write/setuid/xattr/
    dev=2fc0002 on Сбт Июл 3 21:23:45 2004

    Последняя строка вывода mount говорит о нашем успехе.

    Попобуем копировать файл на сервер NFS:

    cp /etc/dfs/dfstab /nfsc
    cp: cannot create /nfsc/dfstab: Read-only file system

    Это говорит о том, что данная файловая система экспортируется сервером NFS только для чтения. Демонтирование удаленной файловой системы производится аналогично демонтированию файловых систем других типов:

    umount /nfsc

    При экспорте файловых систем, если экспорт осуществляется компьютером под управлением Solaris, могут быть использованы параметры, указывающие, в каком режиме экспортируется файловая система. Подробнее об этих параметрах рассказывает руководство по dfstab(4) – см. man dfstab.

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

    Основные параметры монтирования приведены в табл. 7.4. Их следует указывать в файле /etc/dfs/dfstab в поле параметров монтирования (последнее поле строки dfstab ). Пример /etc/dfs/dfstab приведен выше в этой лекции, в разделе "Параметры экспорта в /etc/dfs/dfstab ".

    Параметры монтирования файловой системы NFS
    ПараметрЗначение
    rw смонтировать в режиме чтения и записи (действует только если сервер экспортирует указанный каталог в режиме чтения и записи)
    ro смонтировать только для чтения
    hard если сервер станет недоступен, повторять обращение к файлу на удаленной файловой системе до тех пор, пока сервер снова станет доступен; приводит к зависанию приложения, обращающегося к недоступной файловой системе
    soft если сервер станет недоступен, повторять обращение к файлу на удаленной файловой системе столько раз, сколько указано в параметре retrans ; обычно приводит к ошибке приложения, обращающегося к недоступной файловой системе (подобно тому, как будет вести себя приложение при попытке чтения с неисправного жесткого диска, например)
    retrans=n количество повторений запроса до принятии решения об ошибке, см. soft, тайм-аут задается параметром timeo
    timeo=n n – тайм-аут между запросами в десятых долях секунды
    intr позволяет прервать (послать сигнал INTR, Ctrl-C) обращение к недоступной файловой системе
    nointr не позволяет прерывать обращения к недоступной файловой системе
    proto=(tcp|udp) выбор протокола, по умолчанию – первый доступный из /etc/netconfig
    rsize=n размер буфера чтения в байтах
    wsize=n размер буфера записи в байтах

    Пример файла /etc/vfstab:

    #device device mount FS fsck mount mount
    #to mount to fsck point type pass at boot option
    /proc - /proc proc - no -
    fd - /dev/fd fd - no -
    swap - /tmp tmpfs - yes -
    pxy.gu.ru:/exprt - /home nfs - yes rw,noquota
    Страницы:

    Задачи NFS

    Сетевая файловая система (Network File System – NFS) служит для обеспечения доступа компьютерам сети к общим каталогам на сервере. Централизованное хранение файлов на сервере облегчает организацию работы в большой сети, особенно там, где один и тот же пользователь может работать в разное время на разных компьютерах. С помощью файлового сервера решается сразу несколько задач:

  • регулярное резервное копирование всех данных: нереально выполнять регулярное копирование данных с нескольких десятков или сотен компьютеров, но вполне реально – с единственного сервера или нескольких серверов;
  • повышение надежности хранения данных: глупо в каждый компьютер в сети устанавливать RAID-массив, ведь подавляющее большинство файлов в компьютере, таких, как установленные пакеты программ, проще установить заново, чем защищать их от сбоя; но совершенно разумно укомплектовать файловый сервер аппаратным RAID-массивом или организовать там программный RAID-массив, хотя бы простое зеркалирование дисков;
  • уменьшение стоимости хранения данных: дорого и неэффективно в каждый компьютер устанавливать огромный диск на случай, если потребуется хранить много данных, но на сервере вполне можно установить масштабируемую дисковую подсистему большого объема;
  • обеспечение доступа к одним и тем же данным с любого компьютера.
  • Описание NFS

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

    Версии NFS

    NFS была разработана компанией Sun Microsystems и оказалась настолько удачной, что ее реализации были воплощены разными компаниями почти для всех операционных систем. Существует несколько принципиально разных реализаций NFS. Достаточно распространена версия NFS 2.0, хотя уже в Solaris 2.5 была введена NFS 3.0. В последующих версиях Solaris, включая Solaris 9, в NFS были внесены существенные дополнения, но сам протокол остался совместимым с реализацияим NFS 3.0 в других системах. Начиная с NFS 3.0, поддерживается передача пакетов посредством TCP и UDP, ранее поддерживался только UDP.

    Будьте внимательны! В сети следует использовать клиентов и серверы NFS одной и той же версии. NFS 2.0 можно встретить в старых системах, например, в HP-UX 10.0. Совместная работа систем, использующих разные версии NFS, нежелательна.

    Совместимость NFS и других служб разделяемых каталогов

    NFS по смыслу и по организации работы похожа на разделяемые каталоги (shared folders) в системах Windows, но в этих службах используются совершенно разные протоколы работы и между собой они не совместимы. Однако, существует несколько программных продуктов, которые устанавливают поддержку NFS в системах Windows, поэтому применение NFS в сети с различными операционными системами не представляет проблемы, надо только помнить о необходимости использовать одинаковые версии NFS.

    Служба NFS предполагает работу модели клиент-сервер, причем на компьютерах-клиентах и компьютерах-серверах запускаются разные программы для обеспечения доступа к общим каталогам на сервере.

    Поскольку компьютеры на рабочих местах сотрудников в России обычно управляются Windows-системами, в качестве файловых серверов часто используются также Windows-системы. Однако, нередко возникает желание установить UNIX на файл-сервер, чтобы повысить надежность, сократить затраты на оборудование или использовать этот же сервер для ряда других корпоративных нужд: веб-сервера, сервера баз данных и т.п. Чтобы не устанавливать дополнительное ПО для поддержки NFS в таком случае, достаточно установить пакет samba на UNIX-машину. Он позволит ей "прикинуться" Windows NT сервером так, чтобы все клиентские компьютеры воспринимали его как самый обычный файл-сервер или принт-сервер Windows-сети. Пакет samba умеет обеспечивает поддержку "родного" для Windows-сетей протокола SMB.

    В тех случаях, когда в сети работают несколько UNIX-компьютеров и им нужно обращаться к одному файл-серверу, имеет смысл использовать механизм NFS (network file system).

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

    Терминология NFS

    После настройки NFS-сервера UNIX-компьютер будет предоставлять доступ внешним пользователям к некоторым каталогам своей файловой системы. Такое предоставление доступа называется "экспортом": говорят, что система экспортирует свои каталоги. Как именно каталоги будут экспортироваться, определяется списком, который задает системный администратор. В большинстве систем UNIX этот список содержится в файле /etc/exports, но в Solaris он находится в другом файле – /etc/dfs/dfstab.

    NFS работает посредством механизма удаленного вызова процедур (RPC – Remote Procedure Call).

    Что такое RPC

    Идеология RPC очень проста и привлекательна для программиста. Как обычно работает сетевое приложение? Оно следует некоему протоколу (например, HTTP): формирует пакет с запросом, вызывает системную функцию установления соединения, затем функцию отправки пакета, затем ждет ответного пакета и вызывает функцию закрытия соединения. Это значит, что вся работа с сетью является заботой программиста, который пишет приложение: он должен помнить о вызове функций сетевого API системы, думать о действиях в случае сбоев сети.

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

    Для того, чтобы обеспечить прозрачность пересылки данных через сеть, придумана двухступенчатая процедура. На сервере любое приложение, которое хочет предоставлять свой сервис через RPC, регистрируется в программе, которая называется транслятором портов (port mapper). Функция этой программы – устанавливать соответствие между номером процедуры RPC, которую запросил клиент, и номером TCP или UDP порта, на котором приложение сервера ждет запросов. Вообще говоря, RPC может работать не только с TCP или UDP, в Solaris как раз реализована работа на базе механизма TI (Transport-Independent), поэтому в Solaris транслятор портов называется rpcbind, а не portmap, как в Linux или FreeBSD.

    Приложение, которое регистрируется у транслятора портов, сообщает ему номер программы, номер версии и номера процедур, которые могут обрабатываться данной программой. Эти процедуры будут впоследствии вызываться клиентом по номеру. Кроме этого, приложение сообщает номера портов TCP и UDP, которые будут использоваться для приема запросов на выполнение процедур.

    Клиент, желающий вызвать выполнение процедуры на сервер, сначала отправляет запрос транслятору портов на сервер, чтобы узнать, на какой TCP или UDP порт надо отправить запрос. Транслятор портов запускается при старте системы и всегда работает на стандартном порте 111. Получив ответ от него, клиент отправляет запрос на тот порт, который соответствует требуемому приложению. Например, сервер NFS работает на порту 2049.

    Процедура монтирования общего каталога через NFS

    Прежде чем мы перейдем к описанию настроек сервера и клиентов NFS, следует понять, как осуществляется монтирование удаленных файловых систем в принципе.

    Клиент NFS посылает запрос на монтирование удаленному компьютеру, который предоставляет свою файловую систему (обычно – некоторую ее часть) для общего пользователя. При этом говорят, что сервер NFS "экспортирует" тот или иной каталог (подразумевается – с подкаталогами). Запрос от клиента NFS попадает на обработку демону mountd. Тот выдает клиенту NFS специальный ключ. Этот ключ является идентификатором, который однозначно идентифицирует каталог, смонтированный по сети.

    По NFS можно смонтировать как целые файловые системы, так и отдельные каталоги. Из соображений безопасности запрещено монтировать каталоги "через раздел". Это означает, что если каталог /var расположен на одном разделе диска, а каталог /var/adm – на другом, то при монтировании каталога /var каталог /var/adm не будет автоматически смонтирован. Если требуется монтировать те подкаталоги экспортируемого каталога, которые расположены в другой файловой системе (на другом разделе), следует экспортировать их отдельно и указывать в /etc/dfs/dfstab еще один разделяемый каталог – тот самый подкаталог с другого раздела.

    Ключ, выданный клиенту при монтировании и идентифицирующий сеанс работы с данным удаленным каталогом, сохраняется при перезагрузке NFS-сервера, чтобы после восстановления его работы клиенты, замершие в ожидании, продолжили работу с удаленным сервером как ни в чем ни бывало. При демонтировании и новом монтировании файловой системы через NFS ключ обычно изменяется. На практике перезагрузка NFS-сервера все-таки может привести к сбою в работе клиентского приложения, особенно, если приложение читает или записывает файл в удаленный каталог во время перезагрузки.

    После монтирования файловой системы через NFS клиент посылает серверу запросы на передачу и прием файлов, эти запросы обрабатывает демон nfsd.

    Демонтирование файловой системы выполняется также, как и демонтирование любой другой файловой системы – командой umount.

    Ниже будут обсуждены следующие аспекты настройки службы клиент-сервер в сети:

  • определение списка каталогов на сервере, которые должны быть общими;
  • определение прав доступа к этим каталогам;
  • аутентификация и назначение прав доступа в NFS;
  • настройка сервера NFS, запуск необходимых программ;
  • настройка клиентов NFS, монтирование удаленных каталогов.
  • Настройка NFS-сервера

    Для настройки NFS сервера нам потребуется выполнить настройку как минимум трех приложений: rpcbind, mountd и nfsd. Прежде всего, создадим файл /etc/dfs/dfstab, в котором опишем экспортируемые каталоги; в отличие от других систем UNIX, Solaris требует указать здесь не просто список каталогов с параметрами монтирования, а набор команд share, которые фактически и запускают экспорт каталогов. Таким образом, получается, что /etc/dfs/dfstab – это скрипт, который выполняется для того, чтобы сделать общие каталоги доступными для монтирования через сеть.

    rpcbind: объявление служб RPC

    Для начала следует запустить программу rpcbind, если она еще не запущена. Скорее всего, она запускается при старте вашей системы, если это действительно Solaris. Эта программа, как мы помним, преобразует номера вызовов процедур RPC в номера портов TCP и UDP. При запуске любого RPC-сервера, т.е. программы, работающей с протоколом RPC, программа rpcbind получает от этого RPC-сервера информацию о том, какие номера процедур RPC он намерен обслуживать и через какой порт TCP (UDP) ему следует направлять запросы.

    Когда клиент деалет RPC-вызов, сперва происходит выяснение требуемого номера порта на машине сервера у rpcbind.

    Поэтому rpcbind должен быть запущен до того, как будет запущен любой из RPC-серверов. При аварийном завершении rpcbind необходимо вначале перезапустить rpcbind, и затем перезапустить все RPC-серверы.

    Для проверки готовности всех служб NFS к работе через rpcbind используется команда rpcinfo -p:

    rpcinfo -p
    program vers proto port service
    100000 4 tcp 111 rpcbind
    100000 3 tcp 111 rpcbind
    100000 2 tcp 111 rpcbind
    100000 4 udp 111 rpcbind
    100000 3 udp 111 rpcbind
    100000 2 udp 111 rpcbind
    100232 10 udp 32772 sadmind
    100083 1 tcp 32771
    100221 1 tcp 32772
    100068 2 udp 32773
    100068 3 udp 32773
    100068 4 udp 32773
    100068 5 udp 32773
    100229 1 tcp 32773 metad
    100230 1 tcp 32774 metamhd
    100242 1 tcp 32775 metamedd
    100001 2 udp 32774 rstatd
    100001 3 udp 32774 rstatd
    100001 4 udp 32774 rstatd
    100002 2 udp 32775 rusersd
    100002 3 udp 32775 rusersd
    100002 2 tcp 32776 rusersd
    100002 3 tcp 32776 rusersd
    100008 1 udp 32776 walld
    100012 1 udp 32777 sprayd
    100011 1 udp 32778 rquotad
    100024 1 udp 32779 status
    100024 1 tcp 32777 status
    100133 1 udp 32779
    100133 1 tcp 32777
    100021 1 udp 4045 nlockmgr
    100021 2 udp 4045 nlockmgr
    100021 3 udp 4045 nlockmgr
    100021 4 udp 4045 nlockmgr
    100021 1 tcp 4045 nlockmgr
    100021 2 tcp 4045 nlockmgr
    100021 3 tcp 4045 nlockmgr
    100021 4 tcp 4045 nlockmgr
    300598 1 udp 32784
    300598 1 tcp 32781
    805306368 1 udp 32784
    805306368 1 tcp 32781
    100249 1 udp 32785
    100249 1 tcp 32782
    1289637086 5 tcp 32787
    1289637086 1 tcp 32787
    100005 1 udp 32814 mountd
    100005 2 udp 32814 mountd
    100005 3 udp 32814 mountd
    100005 1 tcp 33201 mountd
    100005 2 tcp 33201 mountd
    100005 3 tcp 33201 mountd
    100003 2 udp 2049 nfs
    100003 3 udp 2049 nfs
    100227 2 udp 2049 nfs_acl
    100227 3 udp 2049 nfs_acl
    100003 2 tcp 2049 nfs
    100003 3 tcp 2049 nfs
    100227 2 tcp 2049 nfs_acl
    100227 3 tcp 2049 nfs_acl

    При запуске системы в многопользовательском режиме 3 rpcbind запускается автоматически, а службы NFS – в случае, если существует файл /etc/dfs/dfstab.

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

    Сервис NFS предоставляется двумя программами, которые обрабатывают соответствующие RPC-запросы. Это программы mountd и nfsd.

    Программа mountd обрабатывает запросы на удаленное монтирование файловых систем. Для получения списка экспортируемых каталогов применяют команду showmount –e, которая обращается к mountd за информацией:

    showmount -e
    export list for sunny:
    /nfst (everyone)

    Для того, чтобы на сервере NFS узнать, какие системы подсоединили к себе разделяемые каталоги этого сервера, следует дать команду showmount без параметров:

    showmount
    www.eu.spb.ru

    Программа nfsd – это обработчик файлового запроса удаленного клиента NFS к файловой системе сервера NFS.

    Параметры службы NFS настраиваются в файле /etc/default/nfs, а запуск и остановка службы осуществляется, соответственно, командами

    /etc/init.d/nfs.server start

    и

    /etc/init.d/nfs.server stop

    В Solaris 10 служба NFS запускается и останавливается также, как и другие службы – командой svcadm enable nfs/server и svcadm disable nfs/server соответственно. О новом механизме работы со службами, появившемся в Solaris 10, более подробно рассказано в лекции 13.

    В файле /etc/default/nfs следует указать достаточное количество потоков, которые можно параллельно запускать для обслуживания одновременных запросов к файлам через NFS. За это отвечает параметр NFSD_SERVERS.

    Значение этого параметра не должно быть меньшим максимального количества одновременных обращений к разделяемым файловым системам NFS на сервере. Слишком маленькое число потоков вызовет задержки в работе клиентов, поскольку им придется становиться в очередь на обработку запросов. В то же время, излишне большое число приведет к нерациональному расходу памяти NFS-сервера. Оптимальное число определяется из опыта, и единственное, что можно сказать определенно: оно не должно быть больше удвоенного общего количества компьютеров сети, которые настроены для работы через NFS. По умолчанию это число равно 16, что для нагруженных серверов NFS очевидно мало.

    Если из-за слишком большого количества потоков nfsd загрузка процессора возрастет до 100%, имеет смысл уменьшить число этих потоков. С одной стороны, идеально иметь 2 потока на каждого активного клиента, постоянно обращающегося к ресурсам NFS, с другой – на один процессор рекомендуется запускать не более 16 потоков, если это достаточно медленный процессор типа тех, что установлены в системах SPARCstation 5, и не более.

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

    Перед запуском mountd и nfsd следует убедиться, что в /etc/dfs/dfstab указаны все каталоги, которые вы собираетесь экспортировать, а также разумно настроены параметры безопасности.

    Аутентичность пользователей NFS

    Работа с общим диском, разделяемым между многими пользователями сети, предполагает, что в пределах сети существует общее пространство имен пользователей, т.е. пользователь gregory на любом клиентском (в терминах NFS) компьютере имеет то же реальное имя и (что важнее) тот же идентификатор, что и пользователь gregory на сервере NFS. Это достигается использованием централизованной аутентификации (например, с помощью PAM и сервера аутентификации или с помощью NIS+). Кроме этого, важно ограничить права пользователя root при доступе через NFS, т.к. пользователь root на любом компьютере в любой системе UNIX имеет идентификатор 0, но от имени пользователя root на разных компьютерах могут работать разные люди.

    Для ограничения доступа пользователя root на сервере NFS любые файловые запросы от имени пользователей root клиентских компьютеров выполняются от имени nobody. Можно указать, пользователям root каких компьютеров мы предоставляем привилегированный доступ от имени root и через NFS.

    По умолчанию файловая система экспортируется с правами чтения и записи для тех, кто ее смонтирует. Однако, права доступа к конкретным каталогам могут запрещать запись в них; фактически права доступа к удаленной файловой системе определяются комбинацией прав, данными при монтировании системы и прав доступа к каталогам; силу имеют более строгие права (например, нельзя записать файл в каталог, если нет права записи в каталог ИЛИ если право есть, но файловая система экспортируется в режиме read-only – только для чтения).

    Рассмотрим для примера файл /etc/dfs/dfstab системы Solaris:

    share -F nfs -o rw=@212.231.110, ro=@192.168.4 /home
    share -F nfs -o ro=212.231.110@,root=212.231.110.112 /usr/share/man

    Файловая система /home экспортируется с возможностью чтения и записи для компьютеров сети 212.231.110, и только чтения – для компьютеров сети 192.168.4. Файловая система /usr/share/man экспортируется для чтения для компьютеров сети 212.231.110. Пользователю root с компьютера 212.231.110.112 разрешен доступ с правами суперпользователя к этой файловой системе.

    Полный список доступных режимов и настроек при указании экспортируемой файловой системы доступен в man share и man share_nfs, а некоторые из них обсуждаются ниже, в разделе "параметры экспорта в /etc/dfs/dfstab ".

    Сервер NFS и бездисковые станции

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

    Под "корневой файловой системой" мы здесь понимаем определенный заранее каталог на сервере NFS, играющий роль корневой файловой системы для бездисковой станции. Собственный корневой каталог сервера не следует экспортировать вообще.

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

    Табл. 7.1 демонстрирует соответствие экспортируемых на сервере каталогов и точек монтирования на бездисковых рабочих станциях.

    Обычным пользователям сервера доступ к каталогу /export, как правило, запрещают, ибо этот каталог предназначен только для монтирования его клиентами, и управление этим каталогом осуществляет администратор, работая от имени root.

    Каталог /export/root следует экспортировать с правами пользователей на чтение и запись.

    Параметр nosuid запрещает клиентам устанавливать бит setuid для файлов на смонтированной файловой системе NFS. Этот параметр может быть полезен для случаев, когда файл принадлежит пользователю root клиента или пользователю, чей uid совпадает с uid наделенного большими правами пользователя в какой-либо из систем сети (особенно – сервера NFS).

    Вместо того, чтобы использовать при монтировании каталога /export/root параметр nosuid, может быть достаточно запретить пользователям сервера NFS доступ к этому каталогу.

    Параметр ro обеспечивает монтирование каталога только для чтения для всех клиентов. Например, каталог с системными исполняемыми файлами пользователям менять незачем, и его рекомендуется экспортировать только для чтения.

    Соответствие каталогов сервера NFS и точек монтирования бездисковых рабочих станций
    Экспортируемые каталоги на сервереИмпортируемые каталоги на бездисковом компьютереПояснениеПараметры монтирования
    /export/root/<hostname> / Корневой каталог -o nosuid
    /export/exec/<platformname> /usr Каталог выполняемых файлов (Shared Product Object Tree – SPOT) Содержимое этого каталога зависит от аппаратной платформы, разным платформам должны монтироваться разные каталоги -o ro
    /export/home/<hostname> /home возможно, потребуется -o nosuid
    /export/share /usr/share -o ro
    /export/swap/<hostname> Применяется на бездисковых клиентах в качестве удаленного пространства подкачки

    При экспорте каталога /export/home можно пойти двумя путями:

  • экспортировать каталог /home сервера, так, чтобы дать возможность пользователям работать на сервере интерактивно в своем домашнем каталоге и монтировать этот же каталог по сети при работе на других компьютерах;
  • экспортировать каталог /export/home сервера с тем, чтобы пользователи на сервере не имели домашних каталогов (или же, что менее удобно, имели разные домашние каталоги при работе на сервере и при работе на остальных компьютерах сети).
  • В первом случае следует обязательно указать параметр nosuid для монтирования этого каталога через NFS.

    Проверка работоспособности служб NFS

    Теперь вы должны проверить, что mountd и nfsd запущены правильно. Сначала это делается с помощью команды rpcinfo -p. Вывод программы должен показать что-то похожее на следующее:

    100000 4 tcp 111 rpcbind
    100000 3 tcp 111 rpcbind
    100000 2 tcp 111 rpcbind
    100000 4 udp 111 rpcbind
    100000 3 udp 111 rpcbind
    100000 2 udp 111 rpcbind
    100003 2 udp 2049 nfs
    100003 3 udp 2049 nfs
    100005 3 udp 1023 mountd
    100005 3 tcp 1023 mountd
    100005 1 udp 1023 mountd
    100005 1 tcp 1023 mountd

    Как видно, rpcbind успешно анонсирует службы.

    Если в ответ на rpcinfo -p мы получили сообщение

    rpcinfo: can't contact
    rpcbind: RPC: Remote system error - Connection refused

    или

    RPC_PROG_NOT_REGISTERED

    или нечто похожее вместо ожидаемого – стало быть, rpcbind не доступен (отключен). Возможно, в файлах /etc/hosts.allow или /etc/hosts.deny есть настройки, запрещающие программе rpcbind отвечать нам.

    Для перезапуска служб NFS можно завершить выполнение демонов nfsd, mountd и rpcbind, запустить их вновь в следующем порядке: rpcbind, затем mountd и следом nfsd. Программе nfsd может быть передан числовой аргумент – число потоков, которые следует запустить при старте. Программа "распараллелится" в указанном количестве потоков.

    Более стандартным выходом является запуск скрипта /etc/init.d/nfs.server вначале с параметром stop, затем с параметром start.

    При штатной работе mountd и nfsd запускаются на сервере NFS при старте системы из стартовых скриптов. Это можно проверить командами

    ps -ef | grep mountd
    ps -ef | grep nfsd

    Программа rpcbind объявляет свои службы независимо от того, продолжают ли работать программы, ранее зарегистрировавшиеся и (возможно) прекратившие работу вследствие аварии.

    Следовательно, вышеприведенная проверка с помощью ps обязательна, если служба NFS перестала работать.

    Не забудьте перед настройкой сервера NFS изучить страницы руководства, рассказывающие о rpcbind, mountd, nfsd, dfstab.

    Блокировка файлов на NFS-сервере

    Для того, чтобы несколько процессов не конфликтовали при доступе к одному и тому же файлу, обычно используется механизм блокировки файла. Подробнее о блокировках следует читать в документации по системным фукнциям lockf() и flock(). В NFS механизм блокировки реализован посредством двух демонов: lockd и statd.

    Оба демона запускаются на сервере NFS после mountd и nfsd.

    Программа lockd устанавливает и снимает блокировку файлов по запросу, а демон statd следит за состоянием блокировок и работоспособностью NFS-сервера.

    В сети демон statd сервера NFS обменивается информацией с демонами statd на других компьютерах. Демон lockd посылает запросы демону statd для установления статуса компьютеров. взаимодействующих с ним.

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

    Дисковые квоты в NFS

    Если на сервере NFS установлены дисковые квоты для отдельных пользователей, то для того, чтобы пользователь "издалека" мог узнать свою дисковую квоту, запускается демон rquotad.

    Вообще говоря, установка дисковых квот (независимо от NFS) выполняется следующим образом:

  • в файле /etc/vfstab для файловой системы, для которой будет применяться квотирование, устанавливается параметр монтирования quota. Не забудьте демонтировать и снова смонтировать соответствующую файловую систему, если хотите, чтобы параметр оказал воздействие на работу файловой системы немедленно!
  • затем создается файл quotas в корне этой файловой системы (например, если речь идет о файловой системе /export/home, то файл будет называться /export/home/quotas );
  • затем с помощью команды edquota устанавливаются квоты для каждого из пользователей в отдельности;
  • выполняется команда quotaon.
  • Для выключения поддержки квот достаточно выполнить команду

    quotaoff

    Для проверки квот в файловых системах надо выполнить команду

    quota username

    Особенности NFS в системах Solaris

    В Solaris NFS организован иначе, нежели в других системах UNIX, и это следует иметь в виду при настройке систем в гетерогенных сетях:

  • файл /etc/dfs/dfstab в других системах называется /etc/exports ;
  • в других системах файл /etc/exports является файлом конфигурации, а не скриптом, вызывающим программу share ;
  • в Solaris после изменения параметров монтирования в файле /etc/dfs/dfstab нужно дать команду shareall для вступления изменений в силу; в других системах следует перезапустить mountd и nfsd, обычно для этого можно использовать сценарий, как и в Solaris;
  • Solaris автоматически становится NFS сервером при загрузке, если в файле /etc/dfs/dfstab указаны экспортированнные каталоги.
  • Помните, что команда shareall просто выполняет подряд все команды share, содержащиеся в файле /etc/dfs/dfstab. Если этот файл был модифицирован и некоторые команды экспорта каких-то файловых систем были удалены, действие старых команд share, запущенных до модификации файла, продолжится и после выполнения shareall.

    Поэтому следует перезапустить mountd для того, чтобы изменения возымели эффект. Внимание: нельзя перезапускать mountd, когда пользователи работают с файловой системой сервера NFS: это может вызвать потери данных и зависание систем – клиентов NFS.

    Если требуется ограничить доступ к разделяемой файловой системе только определенной группой машин, следует указать их список команде share:

    share -F nfs -o rw=host1:host2 /home/host12

    Параметры экспорта в /etc/dfs/dfstab

    При экспорте файловых систем можно передавать командам share ряд параметров, указывающих, в каком режиме следует экспортировать те или иные каталоги. Наиболее важные параметры сведены в табл. 7.2:

    Например, файл /etc/dfs/dfstab может иметь такой вид для экспорта двух файловых систем:

    share -F nfs -o rw=@212.231.110, ro=@192.168.4 /home
    share -F nfs -o ro=212.231.110@,root=212.231.110.112 /usr/share/man
    Парамеры экспорта файловых систем NFS
    ПараметрЗначение
    ro только для чтения – для всех
    ro=host1, host2 только для чтения и только указанным компьютерам
    rw для чтения и записи – для всех
    rw=host1, host2 для чтения и записи, но только указанным компьютерам
    root=host1, host2 с указанных компьютеров пользователь root получает доступ к файлам на сервере NFS от имени root (иначе – от имени nobody или указанного в параметре anon)
    anon=uid идентификатор пользователя, от имени которого сможет работать с файлами на сервере NFS пользователь root удаленного (клиентского) компьютера, по умолчанию – nobody
    nosub запрещается монтировать подкаталоги экспортируемого каталога
    nosuid запрещается создавать в экспортируемой файловой системе файлы с установленными битами suid и sgid

    Особенности NFS в Solaris версии 9 и новее

    В Solaris 9 были добавлены некоторые расширения поддержки NFS, которые улучшили ее производительность:

  • сняты ограничения на размер пакета; остались только ограничения, налагаемые транспортным протоколом, поэтому для NFS через UDP максимальный размер пакета составляет 32 Кб, а для TCP – 1 Мбайт;
  • клиент NFS больше не занимает большое количество портов UDP. Ранее NFS использовала отдельный порт UDP для каждого запроса. Начиная с Solaris 9 клиент NFS по умолчанию использует только один заранее определенный порт. Однако, эта функция настраивается: можно попытаться увеличить число портов, так как это может привести к увеличению производительности;
  • изменен алгоритм выполнения последовательных записей: ранее все запросы на запись выполнялись последовательно клиентом, затем сервером. Введена возможность (для клиента NFS) разрешить приложению выполнять одновременную запись (равно и одновременное чтение и запись) в один и тот же файл. Разрешить такое поведение можно с помощью параметра forcedirectio при монтировании файловой системы. Этот параметр распространяется на все файлы смонтированной файловой системы. Существует возможность разрешить такой режим работы с единственным файлом с помощью функции directio(). По умолчанию (без указания параметра при монтировании) запись в файл производится так же, как и раньше
  • Статистика сервера NFS

    Для получения статистики о работе сервера NFS следует использовать команду nfsstat на таком сервере:

    nfsstat -s
    Server rpc:
    Connection oriented:
    calls badcalls nullrecv badlen xdrcall dupchecks
    0 0 0 0 0 0
    dupreqs
    0
    Connectionless:
    calls badcalls nullrecv badlen xdrcall dupchecks
    33 0 0 0 0 3
    dupreqs
    0
    Server nfs:
    calls badcalls
    33 0
    Version 2: (0 calls)
    null getattr setattr root lookup readlink
    0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
    read wrcache write create remove rename
    0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
    link symlink mkdir rmdir readdir statfs
    0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
    Version 3: (33 calls)
    null getattr setattr lookup access readlink
    0 0% 5 15% 1 3% 4 12% 13 39% 0 0%
    read write create mkdir symlink mknod
    0 0% 1 3% 1 3% 0 0% 0 0% 0 0%
    remove rmdir rename link readdir readdirplus
    0 0% 0 0% 0 0% 0 0% 1 3% 0 0%
    fsstat fsinfo pathconf commit
    3 9% 3 9% 0 0% 1 3%
    Server nfs_acl:
    Version 2: (0 calls)
    null getacl setacl getattr access
    0 0% 0 0% 0 0% 0 0% 0 0%
    Version 3: (0 calls)
    null getacl setacl
    0 0% 0 0% 0 0%

    Кэширование файловой системы

    Для ускорения доступа к любой медленной файловой системе, такой, как удаленная система NFS или файловая система привода CD-ROM, может быть применено создание файловой системы кэша. Проще говоря, содержимое медленной файловой системы может быть закэшировано на локальном диске. Управление такой файловой системой кэша (cachefs) осуществляется утилитой cfsadmin.

    NFS. Настройка клиента

    Монтирование удаленных файловых систем

    Монтирование файловых систем NFS осуществляется очень похоже на монтирование файловой системы любого другого типа. Посмотрим, как смонтировать файловую систему с машины под управлением Linux, если роль файлового сервера выполняет Solaris (компьютер pxy работает под Linux, компьютер с адресом 192.168.5.33):

    root@pxy# mount -t nfs 192.168.5.33:/nfst ./nfst
    root@pxy# mount
    /dev/hda1 on / type ext2 (rw)
    none on /proc type proc (rw)
    none on /dev/pts type devpts (rw,mode=0620)
    /dev/hda3 on /usr type ext2 (rw)
    /dev/hda2 on /var type ext2 (rw)
    192.168.5.33:/nfst on /usr/home/filip/nfst type nfs
    (rw,addr=192.168.5.33)

    Удаленная файловая система успешно смонтирована, о чем говорит последняя строка вывода mount.

    Попробуем осуществить копирование файла:

    root@pxy# cp /etc/mail/aliases /usr/home/filip/nfst/
    root@pxy# ls /usr/home/filip/nfst/
    aliases
    root@pxy# ls -l /usr/home/filip/nfst/
    total 1
    -rw-r--r-- 1 root root 406 Jun 20 22:30 aliases

    Файл был записан, как видите, от имени пользователя root и группы root. На самом деле, в выводе команды ls таится подвох. Ведь команда ls на локальной машине использует для получения соответствия между идентификатором в файловой системе и именем пользователя (группы) локальный файл /etc/passwd. Потенциальная опасность состоит в том, что на удаленном сервере и на локальной машине файлы /etc/passwd окажутся разными. В случае пользователя root это не важно, если только на сервере NFS пользователю root нашей машины разрешено монтировать файловую систему от имени root. В противном случае все файлы, которые локальный root будет записывать на удаленный сервер, будут записываться от имени nobody (или иного имени, если так определено конфигурацией сервера).

    root@pxy# ls -ld /usr/home/filip/nfst/
    drwxrwxr-x 2 root bin 512 Jun 20 22:30 /usr/home/filip/nfst/

    Коль скоро в нашем примере файл был записан от имени root, следует предположить, что настройки сервера NFS это позволяют. Проверим это на компьютере 192.168.5.33:

    192.168.5.33# cat /etc/dfs/dfstab
    # Place share(1M) commands here for automatic execution
    # on entering init state 3.
    #
    # Issue the command '/etc/init.d/nfs.server start' to run the NFS
    # daemon processes and the share commands, after adding the very
    # first entry to this file.
    #
    # share [-F fstype] [ -o options] [-d "<text>"] <pathname> [resource]
    # .e.g,
    # share -F nfs -o rw=engineering -d "home dirs" /export/home2
    share -F nfs -o root=pxy.spb.ru /nfst

    Здесь, на компьютере 192.168.5.33, управляемом Solaris, разделяется общий каталог /nfst, а с компьютера pxy.spb.ru разрешено работать с этим каталогом от имени root. Следует осторожно раздавать подобные права и в большинстве случаев избегать разделения в сети каталогов с настроечной или секретной информацией.

    По команде showmount можно получить список компьютеров, подключенных к серверу NFS:

    192.168.5.33# showmount
    pxy.spb.ru
    www.spb.ru

    Как видно, на сервере NFS имя хозяина файла совпадает с тем, что мы видели с клиента NFS, а имя группы файла – нет, так как под одним и тем же идентификатором в файлах /etc/group на сервере и на клиенте значатся разные группы. На практике следует избегать подобных расхождений, чтобы не возникало ситуаций, компроментирующих безопасность системы файлов. Синхронизация файлов passwd и group на сервере и клиентах или использование общей базы NIS помогут миновать путаницу в именах групп и владельцев файлов на сервере и клиенте NFS.

    192.168.5.33# pwd
    /nfst
    192.168.5.33# ls -l
    total 2
    -rw-r--r-- 1 root root 406 Июн 20 22:30 aliases

    Обратите внимание на одинаковое время создания файла с точки зрения команды ls сервера и клиента. В поле времени указывается время создания, которое записывает туда сервер NFS. Следует синхронизировать не только файлы group и passwd, но и время на сервере NFS и его клиентах, чтобы не было расхождений между клиентом и сервером при выполнении резервного копирования или выяснения "свежести" файлов.

    Оптимизация производительности

    Для оптимизации производительности NFS используется несколько средств. Во-первых, чем быстрее работают диски сервера NFS, тем быстрее информация сможет быть переданной через сеть. Современные сети часто строятся на основе высокоскоростных (как минимум, 100-мегабитных) коммутаторов, поэтому диски даже чаще оказываются узким местом в производительности, чем сеть. Если говорить об архитектуре x86, то предпочтительнее использовать в серверах современные жесткие диски с поддержкой UltraDMA-100, которые позволяют отдавать данные приложению с диска со скоростью порядка 50 Мб/с.

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

    В-третьих, может использоваться локальное кэширование посредством создания кэширующей файловой системы cachefs, как рассказано выше.

    В SunOS 4.x для кэширования запросов к удаленной файловой системе NFS использовался процесс biod, но в SunOS 5.x (т.е. с самых ранних версий Solaris) применяется кэширование автоматическое всех операций чтения и записи, в том числе и для файлов, расположенных на удаленных серврах NFS. Поэтому в специальном процессе biod (в некоторых системах UNIX аналогичный по смыслу процесс называется nfsiod ) нет необходимости в Solaris.

    Соответствие версий SunOS и Solaris Operating Environment
    Версия SunOS Версия Solaris
    4.x 1.x
    5.6 2.6
    5.7 7
    5.8 8
    5.9 9
    5.10 10

    Выполним еще один эксперимент: сервером NFS будет компьютер pxy (Linux), клиентом – компьютер под управлением Solaris. Все команды даются на компьютере-клиенте:

    showmount -e ixy
    export list for ixy:
    /usr/home/filip/nfst (everyone)

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

    cd /
    ls
    devices lost+found opt TT_DB
    bin etc mnt platform tuition
    boot export named.run proc usr
    cdrom home net sbin var
    core kernel nfst test vol
    dev lib nsmail tmp xfn
    mkdir nfsc
    mount ixy:/usr/home/filip/nfst /nfsc

    Проверим, получилось ли:

    mount
    / on /dev/dsk/c0d0s0 read/write/setuid/intr/largefiles/xattr/
    onerror=panic/dev=1980000 on Сбт Июл 3 18:59:13 2004
    /boot on /dev/dsk/c0d0p0:boot read/write/setuid/nohidden/nofoldcase/
    dev=19a3010 on Сбт Июл 3 18:59:11 2004
    /proc on /proc read/write/setuid/dev=2d80000 on Сбт Июл 3 18:59:12 2004
    /etc/mnttab on mnttab read/write/setuid/dev=2e40000 on Сбт Июл 3
    18:59:12 2004
    /dev/fd on fd read/write/setuid/dev=2e80000 on Сбт Июл 3 18:59:14 2004
    /var/run on swap read/write/setuid/xattr/dev=1 on Сбт Июл 3 18:59:17 2004
    /tmp on swap read/write/setuid/xattr/dev=2 on Сбт Июл 3 18:59:18 2004
    /export/home on /dev/dsk/c0d0s7 read/write/setuid/intr/largefiles/xattr/
    onerror=panic/dev=1980007 on Сбт Июл 3 18:59:18 2004
    /nfsc on ixy:/usr/home/filip/nfst remote/read/write/setuid/xattr/
    dev=2fc0002 on Сбт Июл 3 21:23:45 2004

    Последняя строка вывода mount говорит о нашем успехе.

    Попобуем копировать файл на сервер NFS:

    cp /etc/dfs/dfstab /nfsc
    cp: cannot create /nfsc/dfstab: Read-only file system

    Это говорит о том, что данная файловая система экспортируется сервером NFS только для чтения. Демонтирование удаленной файловой системы производится аналогично демонтированию файловых систем других типов:

    umount /nfsc

    При экспорте файловых систем, если экспорт осуществляется компьютером под управлением Solaris, могут быть использованы параметры, указывающие, в каком режиме экспортируется файловая система. Подробнее об этих параметрах рассказывает руководство по dfstab(4) – см. man dfstab.

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

    Основные параметры монтирования приведены в табл. 7.4. Их следует указывать в файле /etc/dfs/dfstab в поле параметров монтирования (последнее поле строки dfstab ). Пример /etc/dfs/dfstab приведен выше в этой лекции, в разделе "Параметры экспорта в /etc/dfs/dfstab ".

    Параметры монтирования файловой системы NFS
    ПараметрЗначение
    rw смонтировать в режиме чтения и записи (действует только если сервер экспортирует указанный каталог в режиме чтения и записи)
    ro смонтировать только для чтения
    hard если сервер станет недоступен, повторять обращение к файлу на удаленной файловой системе до тех пор, пока сервер снова станет доступен; приводит к зависанию приложения, обращающегося к недоступной файловой системе
    soft если сервер станет недоступен, повторять обращение к файлу на удаленной файловой системе столько раз, сколько указано в параметре retrans ; обычно приводит к ошибке приложения, обращающегося к недоступной файловой системе (подобно тому, как будет вести себя приложение при попытке чтения с неисправного жесткого диска, например)
    retrans=n количество повторений запроса до принятии решения об ошибке, см. soft, тайм-аут задается параметром timeo
    timeo=n n – тайм-аут между запросами в десятых долях секунды
    intr позволяет прервать (послать сигнал INTR, Ctrl-C) обращение к недоступной файловой системе
    nointr не позволяет прерывать обращения к недоступной файловой системе
    proto=(tcp|udp) выбор протокола, по умолчанию – первый доступный из /etc/netconfig
    rsize=n размер буфера чтения в байтах
    wsize=n размер буфера записи в байтах

    Пример файла /etc/vfstab:

    #device device mount FS fsck mount mount
    #to mount to fsck point type pass at boot option
    /proc - /proc proc - no -
    fd - /dev/fd fd - no -
    swap - /tmp tmpfs - yes -
    pxy.gu.ru:/exprt - /home nfs - yes rw,noquota
    Вернуться к учебному плану