Решил рассмотреть вопрос с настройкой простого NFS-сервера на Centos 7. Перед началом небольшое вступление. Network File System применяется обычно для шасшаривания файлов между Linux или Unix систем. Протокол разработан компанией Sun.
Для настройки NFS, в ОС должны быть установлены и запущены следующие сервисы:
- nfs-server – предоставляет доступ для клиентов;
- nfs-idmap – преобразовывает uid & gid в имена и наоборот;
- rpcbind – преобразует номера программ RPC в универсальные адреса; работает на 111 порту; необходим для совершения вызовов удаленных процедур (Remote Procedures Calls); Динамически назначает порты;
- nfs-lock / rpc-stat – служит для восстановления блокировки файлов при сбое сервера с NFS.
Пакеты ставятся со всеми вышеописанными зависимостями и запускаются сразу благодаря тому, что в одном юните /usr/lib/systemd/system/nfs-server.service всё уже прописано из коробки:
yum install nfs-utils nfs-utils-lib
Для Debian: nfs-kernel-server и nfs-common для клиента
После установки запустить и включить автозагрузку:
systemctl enable nfs-server rpcbind --now
Создать будущую шару:
mkdir /home/share
Отредактировать конфигурационный файл NFS /etc/exports:
/home/share 192.168.99.1(rw,sync,no_root_squash)
Небольшие пояснения по конфигурации:
- первый параметр – путь до шары;
- вместо IP можеть быть подсеть или звездочка (* – любой хост);
- rw – разрешения на запись в шару;
- sync – для немедленной записи всех изменений клиентом на диск;
- no_root_squash – для того, чтобы root на клиенте имел аналогичные права, что и root на сервере. По дефолту root на клиенте имеет уровень доступа как nobody на сервере.
Есть много ещё различных параметров, подробное описание для конкретной задачи можно посмотреть в оригинальном мануале.
После правки файла, надо применить изменения командой:
exportfs -r
Тут также можно посмотреть доп. флаги, которые ещё существуют.
После этого поправить параметры штатного firewalld, открыв порты для сервисов:
rpc-bind – 111/tcp
nfs – 2049/tcp
mountd – 20048/tcp, 20049/udp
Для служб RPC в конфиге /etc/sysconfig/nfs можно настроить статические порты (которые по дефолту назначаются автоматически):
MOUNTD_PORT=892
STATD_PORT=662
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
Применить изменения:
systemctl restart nfs-server rpcbind && rpcinfo -p
Для rpc.statd есть отдельный юнит с другим названием – nfs-lock.service /usr/lib/systemd/system/nfs-lock.service, который также надо перезагрузить:
/usr/lib/systemd/system/nfs-lock.service # полный путь
systemctl restart nfs-lock.service
Перед внесением правил для firewall, нужно проверить, что все сервисы слушают на указанных портах в /etc/sysconfig/nfs
И прописать в firewalld:
firewall-cmd --permanent --add-service mountd
firewall-cmd --permanent --add-service rpc-bind
firewall-cmd --permanent --add-service nfs
firewall-cmd --reload
Итоговый список портов и протоколов для работы NFS:
111, 2049, 20048, 20049, 892, 662, 32803, 32769 TCP, UDP
После применения всех настроек, можно проверить на сервере, какая шара нам доступна:
showmount -e
Export list for localhost.localdomain:
/home/share 192.168.10.161
Проверка на клиенте:
showmount -e <client_ip>
И теперь осталось только подмонтировать доступную по NFS директорию:
mount <server_ip>:/home/share /mnt
Для наглядности, можно посмотреть доп. параметры монтирования. Как видно, используется NFS 4 версии:
mount | grep nfs
192.168.10.176:/home/share on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.10.161,local_lock=none,addr=192.168.10.176)
Или посмотреть так:
df -hT
192.168.10.176:/home/share nfs4 9.1G 3.9G 5.2G 43% /mnt
Для автоматического монтирования, прописать в /etc/fstab:
<server_ip>:/home/share /mnt nfs nosuid,rw,sync,hard,intr 0 0
На этом настойка завершена. В завершении хочу сказать, что нужно помнить о том, что NFS – протокол без шифрования, а потому лучше использовать его как минимум через VPN.