NFS предоставляет клиентам прозрачный доступ к файлам и файловой системе сервера. Это означает, что любое приложение клиента, которое может работать с локальным файлом, с таким же успехом может работать и с NFS-файлом. NFS работает с UNUX правами на основе UID/GID и не использует аутентификацию. В основном, NFS применяется между серверами, например, чтобы на нескольких серверах были одни и теже настройки и данные или же при создании бэкапов.
Устанавливать и настраивать будем на примере Debian Bullseye.
Установка сервера:
Существует две основные реализации сервера NFS, одна реализована в пространстве пользователя (медленнее, но проще в отладке), другая в ядре (быстрее).
# apt install nfs-kernel-server portmap
Пакет portmap необходим, если будут использоваться NFSv2 или NFSv3.
Подготовка сервера перед настройкой:
Проверить поддержку NFS в ядре:
# grep NFSD /boot/config-`uname -r`
# cat /proc/filesystems | grep nfs
Проверка настроек:
- Проверить прослушивваемый порт: 2049(tcp)
# ss -l4tn
- Отобразить карту портов:
# rpcinfo -p | grep nfs
- Проверить поддерживаемые сервером версии NFS:
При подключении к неподдерживаемой версии у клиента будет ошибка.
# cat /proc/fs/nfsd/versions
- Список файловых систем, экспортированных файловым сервером NFS:
# cat /proc/fs/nfs/exports
NFSv4 only:
Чтобы включить только NFSv4.
# /etc/default/nfs-common
NEED_STATD="no"
NEED_IDMAPD="yes"
# nano /etc/default/nfs-kernel-server
- RPCNFSDOPTS отсутствует по умолчанию, и его необходимо добавить;
RPCNFSDOPTS="-N 2 -N 3"
RPCMOUNTDOPTS="--manage-gids -N 2 -N 3"
- Также rpcbind не требуется для NFSv4, но будет запущен в качестве предварительного условия nfs-server.service;
# systemctl mask rpcbind.service
# systemctl mask rpcbind.socket
Для NFSv4 требуется только один порт (TCP/UDP 2049) и не требуется установка службы portmap.
Сервер работает только на заданном ip-адресе:
По умолчанию NFS прослушивает соединения на всех ethernet портах. Чтобы прослушивать соединения NFS(v4) только с определенного IP-адреса, необходимо добавить параметр -H к RPCNFSDOPTS;
# nano /etc/default/nfs-kernel-server
RPCNFSDOPTS="-N 2 -N 3 -H 172.16.5.74"
В качестве альтернативы вместо IP-адреса может быть указано имя хоста. Параметр -H может быть передан несколько раз для прослушивания нескольких разных IP-адресов.
Создаем пользователя: +домашняя директория
C отключенным шелом, одноименной группой, указанной одноименной домашней директорией и с произвольными UID, GID.
# useradd n-mtv -b /mnt/nas/nfs -m -U -u 2500 -s /bin/false
# id n-mtv
# deluser n-mtv --remove-all-files | userdel n-mtv -r
В идеале, нужно, чтобы со стороны сервера и клиента у пользователей были одинаковые UID/GID.
Настройка списка раздаваемых директорий:
Список основных опций.
- rw - read write;
- ro - read only;
- no_subtree_check - запретить проверку подкаталогов;
- sync - сервер должен отвечать на запросы только после записи на диск изменений, выполненных этими запросами;
- root_squash - по умолчанию, запрещает пользователю root писать в чужие файлы;
- no_root_squash - разрешить работать с файлами и директориями от root пользователя, также подойдет для бездисковых систем;
- all_squash - любые пользователи для nfs-server со стороны nfs-client будут считаться анонимными, далее явно указываем какой anonuid/anongid;
- anonuid/anongid - пользователи с данными uid/gid для nfs-server со стороны nfs-client будут считаться анонимными;
# nano /etc/exports
# NFSv4
/mnt/nas/nfs/n-mtv ws.int.lan(rw,sync)
- или (с хоста ws может подключаться root пользователь и UID=2500/GID=2500 пользователь, с сети 172.16.5.8/29 UID=2500/GID=2500 пользователь)
/mnt/nas/nfs/n-mtv ws.int.lan(rw,no_root_squash,sync) 172.16.5.8/29(rw,sync)
- или (на сервере создается пользователь с UID/GID 2500, со стороны клиета с IP 172.16.5.13 cможем подключаться от имени любого пользователя т.к. его UID/GID заменятся на 2500)
/mnt/nas/nfs/n-mtv 172.16.5.13(rw,sync,all_squash,anonuid=2500,anongid=2500)
Применить/перечитать настройки:
# exportfs -av (apply) | exportfs -rv (reread) | -v - verbose
Просмотреть что раздается и параметры шар:
# exportfs -s
- Просмотреть то что раздается:
# exportfs
# man exports
# nfsstat
Клиенты:
Создаем пользователя:
# useradd nas-nfs -b /home -m -U -u 2500 -s /bin/bash
# passwd nas-nfs
# id nas-nfs
Установка пакета:
# apt install nfs-common
Переходим в оболочку пользователя:
# su - nas-nfs
$ pwd
$ mkdir data
$ sudo mount -t nfs4 nas.int.lan:/mnt/nas/nfs/n-mtv /home/nas-nfs/data
$ sudo umount /home/nas-nfs/data
Автомонтирование:
# nano /etc/fstab:
- _netdev - уже не обязателен, ФС будет монтироваться только после того как заработает сеть;
- nofail - когда сеть недоступна, предотвратить ошибку монтирования ФС при запуска ОС;
nas.int.lan:/mnt/nas/nfs/n-mtv /home/nas-nfs/data nfs defaults,nofail 0 0
Маппинг пользователей: [bindfs]
# nano /etc/idmapd.conf
# bindfs --map=@601/@599 --create-for-group=601 --create-for-user=600 --create-with-perms='u=rwD:g=rwD:o=' $FS_ROOT $MOUNT_ROOT/view601
Изменение UID и GID пользователя и группы:
# groupmod -g 1001 mtv
# usermod -u 1001 -g 1001 mtv
# find / -uid 1001 -exec chown -v -h 1001 '{}' \;
# find / -gid 1001 -exec chgrp -v 1001 '{}' \;
Разное:
# stat /mnt/nas/nfs/n-mtv
- RPC bind (package: rpcbind)
# showmount nas
# showmount -e nas
# mount | grep "nas.int.lan:/mnt/nas/nfs"
Ссылки по теме:
- Debian NFSServerSetup [link];
- Arch NFS [link];
- Ubuntu NFS [link];
- Network File System (NFS) на Linux [link];