10.4. NFS

Этот раздел написал Bill Swingle , 4 марта 2000.

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

Использование NFS имеет несколько преимуществ:

10.4.1. Как это работает

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

На сервере работают следующие даемоны:

  • nfsd - NFS Daemon, обслуживающий запросы от клиентов NFS.

  • mountd - NFS Mount Daemon, который выполняет запросы, передаваемые ему от nfsd.

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

  • nfsiod - NFS async I/O Daemon (даемон асинхронного ввода/вывода), обслуживающий запросы от своего NFS-сервера.

10.4.2. Настройка NFS

К счастью для нас, на системах FreeBSD эта настройка проста. Процессы, которые должны быть запущены, все могут быть запущены во время загрузки ценой нескольких модификаций в вашем файле /etc/rc.conf.

Проверьте, что на NFS-сервере у вас есть такие строки:

    nfs_server_enable="YES"
    nfs_server_flags="-u -t -n 4"
    mountd_flags="-r"
        

mountd запускается автоматически, если включен сервер NFS. Флаги -u и -t в команде nfsd указывают на обслуживание клиентов, работающих по протоколам UDP и TCP. Параметр -n 4 указывает команде nfsd на запуск 4 своих копий.

На клиентской строне убедитесь в наличии таких строк:

    nfs_client_enable="YES"
    nfs_client_flags="-n 4"
        

Как и в случае nfsd, параметр -n 4 указывает nfsiod на запуск 4 своих копий.

Последний этап настройки требует создания файла с именем /etc/exports. Файл экспортирования перечисляет, какие файловые системы на вашем сервере будут использоваться совместно с другими машинами (или "экспортироваться"), и с какими именно. Каждая строка в файле описывает файловую систему, которая будет предоставляться на доступ. Имеется полный набор параметров, который можно использовать, но я коснусь только некоторых. Описания остальных параметров можно найти в Справочнике по exports(5).

Вот несколько примерных строк из файла /etc/exports:

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

    /cdrom -ro moe larry curly

В следующей строке экспортируется файловая система /home, которая становится доступной трем хостам, указанным по их IP-адресам. Это полезно, если у вас есть собственная сеть, но сервис DNS не используется. Флаг -alldirs позволяет также экспортировать все каталоги, находящиеся ниже в указанной файловой системе.

    /home  -alldirs  10.0.0.2 10.0.0.3 10.0.0.4

В строке, приведенной ниже, файловая система /a экспортируется для двух машин, которые находятся в различных, не совпадающих с серверным, доменах. Флаг -maproot=0 позволяет пользователю root удаленной системы осуществлять запись на совместно используемую файловую систему как пользователь root. Без флага -maproot=0 даже если кто-то имеет права доступа root на удаленной системе, он не сможет модифицировать файлы на совместно используемой файловой системе.

          /a  -maproot=0  host.domain.com box.example.com
        

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

Теперь, после того, как вы сделали все эти изменения, вы можете просто перезагрузиться, а FreeBSD запустит все во время загрузки, либо последовательно запустить следующие команды, работая как пользователь root:

На сервере NFS:

    # nfsd -u -t -n 4
    # mountd -r
        

На клиенте NFS:

    # nfsiod -n 4
        

Теперь вы готовы к реальному монтированию удаленной файловой системы. Это может быть сделано двумя способами. В приводимых примерах сервер будет носить имя server, а клиент будет носить имя client. Если вы просто хотите временно смонтировать удаленную файловую систему, или всего лишь протестировать ваши настройки, то вы можете запустить команды, подобные приводимым здесь, работая как пользователь root на клиентской машине:

    # mount server:/home /mnt
        

По этой команде файловая система /home на сервере будет смонтирована в каталог /mnt на клиенте. Если все настроено правильно, вы сможете перейти в каталог /mnt на клиенте и увидеть файлы, находящиеся на сервере.

Если вы хотите иметь удаленную файловую систему смонтированной постоянно (каждый раз при загрузке), то добавьте ее в ваш файл /etc/fstab. Вот примерная строка:

    server:/home	  /mnt	  nfs	  rw	  0	  0
        

Read the fstab(5) man page for more options.

10.4.3. Практическое использование

Имеется много способов использовать NFS в работе. Я достаточно часто использую ее в локальной сети, которую администрирую. Вот несколько способов ее полезного применения.

В моей сети имеется несколько машин, но всего лишь на одной из них имеется привод компакт-дисков. Почему? Потому что этот единственный привод используется совместно всеми другими машинами через NFS. То же самое может быть сделано с приводами НГМД.

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

Когда вы переустанавливаете FreeBSD на одной из ваших машин, это можно делать через NFS. Просто поместите компакт-диск с дистрибутивом на файловый сервер.

Каталог /usr/ports/distfiles у меня является общим для всех машин. Таким образом, когда я устанавливаю порт, который уже устанавливался ранее на другой машине, мне не нужно снова скачивать архив с исходным кодом.

10.4.4. Проблемы взаимодействия с другими системами

Предоставил John Lind .

Некоторые сетевые адаптеры для систем PC с шиной ISA имеют ограничения, которые могут привести к серьезным проблемам в сети, в частности, с NFS. Эти проблемы не специфичны для FreeBSD, однако эту систему они затрагивают.

Проблема, которая возникает практически всегда при работе по сети систем PC (FreeBSD) с высокопроизводительными рабочими станциями, выпущенными такими производителями, как Silicon Graphics, Inc. и Sun Microsystems, Inc. Монтирование по протоколу NFS будет работать нормально, и некоторые операции также будут выполняться успешно, но неожиданно сервер окажется недоступным для клиент, хотя запросы к и от других систем будут продолжаться обрабатываться. Такое встречается с клиентскими системами, не зависимо от того, является ли клиент машиной с FreeBSD или рабочей станцией. Во многих системах при возникновении этой проблемы нет способа корректно завершить работу клиента. Единственным выходом зачастую является холодная перезагрузка клиента, потому что ситуация с NFS не может быть разрешена.

Хотя "правильным" решением является установка более производительного и скоростного сетевого адаптера на систему FreeBSD, имеется простое решение, приводящее к удовлетворительным результатам. Если система FreeBSD является сервером, укажите параметр -w=1024 на клиенте при монтировании. Если система FreeBSD является клиентом, то смонтируйте файловую систему NFS с параметром -r=1024. Эти параметры могут быть заданы в четвертом поле записи в файле fstab клиента при автоматическом монтировании, или при помощи параметра -o в команде mount при монтировании вручную.

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

В следующих примерах fastws является именем хоста (интерфейса) высокопроизводительной рабочей станции, а freebox является именем хоста (интерфейса) системы FreeBSD со слабым сетевым адаптером. Кроме того, /sharedfs будет являться экспортируемой через NFS файловой системой (смотри команду man exports), а /project будет точкой монтирования экспортируемой файловой системы на клиенте. В любом случае, отметьте, что для вашего приложения могут понадобиться дополнительные параметры, такие, как hard, soft или bg.

Примеры для системы FreeBSD (freebox) является клиентом: в файле /etc/fstab на машине freebox:

    fastws:/sharedfs /project nfs rw,-r=1024 0 0
        

Команда, выдаваемая вручную на машине freebox:

    # mount -t nfs -o -r=1024 fastws:/sharedfs /project
        

Примеры для системы FreeBSD в качестве сервера: в файле /etc/fstab на машине fastws:

    freebox:/sharedfs /project nfs rw,-w=1024 0 0
        

Команда, выдаваемая вручную на машине fastws:

    # mount -t nfs -o -w=1024 freebox:/sharedfs /project
        

Практически все 16-разрядные сетевые адаптеры позволят работать без указанных выше ограничений на размер блоков при чтении и записи.

Для тех, кто интересуется, ниже описывается, что же происходит в при появлении этой ошибки, и объясняется, почему ее невозможно устранить. Как правило, NFS работает с "блоками" размером 8 килобайт (хотя отдельные фрагменты могут иметь меньшие размеры). Так пакет Ethernet имеет максимальный размер около 1500 байт, то "блок" NFS разбивается на несколько пакетов Ethernet, хотя на более высоком уровне это все тот же единый блок, который должен быть принят, собран и подтвержден как один блок. Высокопроизводительные рабочие станции могут посылать пакеты, которые соответствуют одному блоку NFS, сразу друг за другом, насколько это позволяет делать стандарт. На слабых, низкопроизводительных адаптерах пакеты, пришедшие позже, накладываются поверх ранее пришедших пакетов того же самого блока до того, как они могут быть переданы хосту и блок как единое целое не может быть собран или подтвержден. В результате рабочая станция входит в ситуацию таймаута и пытается повторить передачу, но уже с полным блоком в 8КБ, и процесс будет повторяться снова, до бесконечности.

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

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