NFS сервер и клиент на FreeBSD

Комментарии ()

Что такое NFS?

NFS ( Network File System ) — протокол сетевого доступа к файловым системам. Основан на протоколе вызова удалённых процедур. Позволяет монтировать удалённые файловые системы через сеть.

NFS абстрагирована от типов файловых систем как сервера, так и клиента, существует множество реализаций NFS-серверов и клиентов для различных операционных систем и аппаратных архитектур. В настоящее время используется наиболее зрелая версия NFS v.4, поддерживающая различные средства аутентификации (в частности, Kerberos и LIPKEY с использованием протокола RPCSEC GSS) и списков контроля доступа (как POSIX, так и Windows-типов).

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

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

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

Настройка NFS-сервера на FreeBSD

Собираем ядро с опциями

options              NFSCLIENT      # Network Filesystem Client
options              NFSSERVER      # Network Filesystem Server
options              NFSLOCKD       # Network Lock Manager
options              NFS_ROOT       # NFS usable as /, requires NFSCLIENT

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

Добавляем в /etc/rc.conf

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

Некоторые флаги nfs_server_flags:
-t - Обслуживание TCP-клиентов.
-u - Обслуживание UDP-клиентов.
-n 'x' - Количество одновременных подключений.
-h - Указать какой интерфейс слушать (-h 192.168.1.11 или -h Raven2000.su) можно
указать несколько интерфейсов.

Некоторые флаги mountd_flags:
-r - Позволяет mountd обслуживать и рядовые файлы, а не только каталоги.
-n - Монтирование ресурсов NFS на удаленных системах, не разделяющих модели владения и полномочий принятых в UNIX. (Windows)
-l - Протоколирование все запросы на монтирование NFS. (FreeBSD)

Создаем файл экспорта /etc/exports, в котором описываются  файловые системы,  доступные для монтирования клиентами.  Каждая строка в файле задаёт файловую систему, которая будет экспортироваться и какие машины будут иметь к ней доступ. Например, я расшариваю папку /mnt/backup

/mnt/backup -alldirs -maproot=root 192.168.1.2

/mnt/backup - Директория для доступа.
-alldirs - Разрешает монтировать любой подкаталог; по умолчанию разрешение выдается
только для указанного каталога.
-maproot=юзер - Закрепляет идентификатор учетной записи root за указанным пользователем
(это может быть значение UID или имя). По умолчанию выбирается пользователь nobody
(UID -2). Чтобы разрешить привилегированный доступ, задайте -maproot=root.
-mapall=юзер - Закрепляет все значений UID за определенным пользователем; это удобно
при работе с персональными компьютерами и ненадежными однопользовательскими станциями.
-webnfs - Экспорт каталога в формате WebNFS; доступ только для чтения всем
пользователям, а все идентификаторы закрепляют за пользователем nobody.
192.168.1.2 - Хосты, которым разрешено подключатся.
-ro - Экспорт для чтения; по умолчанию экспорт предоставляет для чтения-записи.

Если была необходимость в повторном редактировании /etc/exports, то необходимо перезапустить NFS сервисы по очереди:

/etc/rc.d/rpcbind restart
/etc/rc.d/nfsclient restart
/etc/rc.d/nfsd restart
/etc/rc.d/nfslocking restart
/etc/rc.d/nfsserver restart
/etc/rc.d/mountd restart

Проверить, что все сервисы подхватились

/usr/bin/rpcinfo -p

Посмотреть, что росшарено

showmount -ae

Ограничение доступа

Штатного средства аутентификаци нету. Ограничить доступ к NFS-серверу можно на уровне фаервола. Необходимо закрыть следующие порты:

1] TCP/UDP 111 - RPC 4.0 portmapper

2] TCP/UDP 2049 - NFSD (nfs сервер)

NFS Клиент

Добавляем в /etc/rc.conf 

nfs_client_enable="YES"

Зарускаем

/etc/rc.d/nfsclient start

Для примера, мы хотим подмонтировать расшареные каталоги, на сервере 192.168.1.1. Смотрим, что доступно: 

# showmount -e 192.168.1.1
Exports list on 192.168.1.1:
/mnt/backup                        192.168.1.2

Видим расшареный ресурс  /mnt/backup для  192.168.1.2. Пробуем примонтировать в папку /tmp/backup

mount_nfs 192.168.1.1:/mnt/backup /tmp/backup

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

192.168.1.1:/mnt/backup /tmp/backup nfs rw,-b 0 0

-b - Заставляет при загрузке системы выполнить быструю попытку соединится с сервером если попытка не удалась система будет загружаться дальше. Но порождается дочерний процесс, продолжающий попытки.
-T - Принуждает использовать транспорт TCP вместо UTP.
-s -x 'x' - Позволяет примонтировать на строго определенное время (-x 60)
используя мягкое монтирование (-s).
-i - Это разрешает прерываемость комбинацией клавиш <Ctrl+C>.

Важный моменты:

1) В качестве hostname шары лучше указывать IP-адресс, иначе если во время загрузки интернет еще не доступен, не будет резолвится доменное имя. У меня сервер переставал грузится.

2) ключи писать без пробелов:  rw,-b,-i (для примера: если написатьз проблемо: "... rw,   -b" то опция -b не сработает, и gри отсутствии соединения  с NFS-сервером, FreeBSD не загрузится до конца, а будет выполнять попытки соединения  с NFS-сервером  до положительного результата)

Вы можете настроить количество процессов устанокой nfs_client_flags в /etc/rc.conf

nfs_client_flags="-n 4"

Или выполнив в консоли

nfsiod -n 4

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


Webit.in.ua 2013