Настройка NFS на Ubuntu Trusty

Posted by

В рамках изучения участвуют две системы: Ubuntu Trusty Server amd64

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

NFS (Network File System) полезна когда нужно раздать файлы/директории всем внутри сети.

Cоздаю инструкцию по установке и настройке NFS (Network File System).

NFS – это сетевая файловая система, с помощью которой можно обращаться к файлам и каталогам удалённого компьютера (сервера), как будто эти файлы и каталоги были локальными.

For Server Host: 10.9.9.164

ekzorchik@srv-mail:~$ sudo rm -Rf /var/lib/apt/lists

ekzorchik@srv-mail:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install nfs-kernel-server -y

LC_ALL, Apparmor uninstall, TimeZone & NTP, IPv6 Disable.

For Client Host

ekzorchik@srv-client:~$ sudo rm -Rf /var/lib/apt/lists/

ekzorchik@srv-client:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install nfs-common -y

ekzorchik@server:~$ cat /etc/services | grep nfs

nfs 2049/tcp # Network File System

nfs 2049/udp # Network File System

Теперь как говорится во многих руководствах настал черед практики, т. е. Чтобы понять как работает расшаренная файловая система на хосте который выступает в роли сервера нужно создать расшаренный каталог:

ekzorchik@srv-mail:~$ sudo mkdir /var/nfs

ekzorchik@srv-mail:~$ sudo chown nobody:nogroup /var/nfs

ekzorchik@srv-mail:~$ sudo nano /etc/exports

/var/nfs srv-client(rw,sync,no_subtree_check,no_root_squash)

На заметку: в роли srv-client может выступать также символ звездочки обозначающий что мы расшариваем каталог /var/nfs для всех кто подключит его себе.

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

ekzorchik@srv-mail:~$ sudo service nfs-kernel-server status

nfsd not running

ekzorchik@srv-mail:~$ sudo service nfs-kernel-server restart

Либо же без перезапуска сервиса вот так:

ekzorchik@srv-mail:~$ sudo exportfs -a

должно быть без ошибок

Чтобы отобразить какие ресурсы и для кого расшарены:

ekzorchik@srv-mail:~$ sudo showmount -e

Export list for srv-mail:

/var/nfs 10.9.9.250/255.255.254.0

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

ekzorchik@srv-client:~$ sudo mkdir -p /media/var/nfs

ekzorchik@srv-client:~$ sudo mount 10.9.9.164:/var/nfs /media/var/nfs

mount.nfs: access denied by server while mounting 10.9.9.164:/var/nfs

нашел ошибку, просто на сервере (в дальнейшем сервер это хост: srv-mail где расшаривается каталог) в конфигурационном файле /etc/exports я указал srv-client, но в моем файле /etc/hosts нет сопоставления что это за хост (и DNS в сети отсутствует), а потому добавляю в /etc/hosts сопоставление:

ekzorchik@srv-mail:~$ sudo nano /etc/hosts

10.9.9.164 srv-mail

10.9.9.250 srv-client

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

/var/nfs 10.9.9.164/255.255.254.0(rw,sync,no_subtree_check,no_root_squash)

ekzorchik@srv-mail:~$ sudo service nfs-kernel-server restart

После пробую подключить на клиентской системе общий ресурс, и он успешно подключился:

ekzorchik@srv-client:~$ sudo mount 10.9.9.250:/var/nfs /media/var/nfs

ekzorchik@srv-client:~$ df -h | grep /media

10.9.9.164:/var/nfs 45G 2.1G 41G 5% /media/var/nfs

Чтобы отобразить все подмонтированные расшаренные каталоги с помощью технологии nfs нужно использовать вот такую вот команду:

ekzorchik@srv-client:~$ sudo mount -t nfs

10.9.9.164:/var/nfs on /media/var/nfs type nfs (rw,vers=4,addr=10.9.9.164,clientaddr=10.9.9.250)

Проверяю, могу ли я в него записать что-нибудь:

ekzorchik@srv-client:~$ touch /media/var/nfs/test

touch: cannot touch '/media/var/nfs/test': Permission denied

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

Данная ошибка говорит, что Вы поменяли права на каталог /media/var/nts на какие либо еще, потому как они должны быть вида: root:root, либо же в файле /etc/exports на сервере не добавлена опция no_root_squash), если права правильные, то:

ekzorchik@srv-client:~$ touch /media/var/nfs/test

touch: cannot touch '/media/var/nfs/test': Permission denied

ekzorchik@srv-client:~$ sudo touch /media/var/nfs/test | ls -l /media/var/nfs/

total 0

-rw-r--r-- 1 root root 0 Apr 12 07:07 test

Чтобы расшаренные каталоги не монтировать вручную на помощь приходит файл /etc/fstab, где синтаксис подключения будет выглядеть следующим образом:

ekzorchik@srv-client:~$ sudo umount /media/var/nfs

ekzorchik@srv-client:~$ sudo nano /etc/fstab

10.9.9.164:/var/nfs /media/var/nfs nfs auto,noatime,nolock,bg,nfsvers=4 0 0

ekzorchik@srv-client:~$ sudo mount -a | df -h | grep /media/

10.9.9.164:/var/nfs 45G 2.1G 41G 5% /media/var/nfs

Также можно и по другому отобразить информацию какие удаленные ресурсы смонтированы в системе:

ekzorchik@srv-client:~$ sudo nfsstat -m

/media/var/nfs from 10.9.9.164:/var/nfs

Flags:

rw,noatime,vers=4.0,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.9.9.250,local_lock=none,addr=10.9.9.164

Отлично удаленный ресурс смонтирован и будет монтироваться каждый раз при загрузке системы.

На заметку: работа через протокол nfs не поддерживает шифрования.

Дополнительная конфигурация NFS сервера

  • secure: — опция включена по умолчанию и позволяет серверу использовать порты меньше 1024, что бы подключаться к серверу могли только клиенты, работающие от root. insecure  — соответственно отключает эту опцию
  • rw: — разрешает не только чтение файлов, но и запись. По умолчанию работает только для чтения.
  • async: — включение данной опции может положительно сказаться на производительности NFS, но возможна потеря данных, если перезагрузить сервер без остановки NFS демона. По умолчанию стоит sync
  • no_wdelay: — выключает задержку записи. Если включена опция async, no_wdelay игнорируется
  • nohide: — если монтировать директорию поверх другой, старая директория становится пустой или невидимой. Данная опция устраняет этот эффект
  • no_subtree_check: — опция выключает проверку поддиректорий, которая сделана для безопасности. По умолчанию проверка включена и лучше ее такой и оставить.
  • no_auth_nlm: — тоже что и insecure_locks — заставляет NFS сервер не выполнять блокировки запросов. Если вы беспокоитесь о безопасности сервера, лучше не трогать эти опции, по умолчанию стоит auth_nlm или secure_locks.
  • root_squash: —  не позволяет пользователю root иметь доступ к примонтированному тому NFS
  • no_root_squash: — позволяет пользователю root иметь доступ к примонтированному тому NFS
  • all_squash: — опция будет полезна для публичных NFS томов, позволяя затирать все UID и GID. По умолчанию no_all_squash
  • anonuid and anongid: — меняет анонимные UID и GID на назначенные.

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

Что еще Важно для серверной части где предоставляются расшаренные ресурсы, так это правильная настройка брандмауэера:

ekzorchik@srv-mail:~$ sudo apt-get install iptables-persistent -y

Save current IPv4 rules? Yes

Save current IPv6 rules? No

ekzorchik@srv-mail:~$ sudo service iptables-persistent flush

ekzorchik@srv-mail:~$ sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

ekzorchik@srv-mail:~$ sudo iptables -A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

ekzorchik@srv-mail:~$ sudo iptables -A INPUT -s 10.7.8.0/23 -m state --state NEW -p tcp --dport 2049 -j ACCEPT

Если в процессе сохранения правил на консоль выдается вот такая вот ошибка:

ekzorchik@srv-mail:~$ sudo service iptables-persistent save

* Saving rules... * IPv4... * IPv6... ip6tables-save v1.4.21: Cannot initialize: Address family not supported by protocol

то это значит, что брандмауэр задействует IPv6, можно либо включить во всей системе использование IPv6 отменив настройку по блокировке или же:

ekzorchik@srv-mail:~$ sudo nano /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv6.conf.lo.disable_ipv6 = 1

ekzorchik@srv-mail:~$ sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

ekzorchik@srv-mail:~$ sudo update-grub

ekzorchik@srv-mail:~$ sudo reboot

После перезагрузки проверяю, какие сейчас правила iptables держит в системе:

ekzorchik@srv-mail:~$ sudo iptables -S

[sudo] password for ekzorchik:

-P INPUT ACCEPT

-P FORWARD ACCEPT

-P OUTPUT ACCEPT

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -s 10.9.9.0/23 -p tcp -m state --state NEW -m tcp --dport 2049 -j ACCEPT

Итого команда сохранения все же отработала

ekzorchik@srv-mail:~$ sudo service iptables-persistent save

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

Вот собственно и всё, пока все, в дальнейшем я покажу что-нибудь еще что узнаю сам на основании поставленных самому себе задач. С уважением автор блога Олло Александр aka ekzorchik.