NFS позволяет системе предоставлять в общее пользование каталоги и файлы другим системам через сеть. С помощью NFS пользователи и программы могут получить доступ к файлам на удаленной системе так же, как если бы они были локальными файлами.
Нам потребуются две виртуальные машины:
nfs-client, ip-адрес 192.168.30.20 — которая будет клиентом
nfs-server, ip-адрес 192.168.30.21 — которая будет сервером
Установка компонентов
На виртуальную машину nfs-server устанавливаем пакет nfs-kernel-server:
$ sudo apt install nfs-kernel-server
На виртуальную машину nfs-client устанавливаем пакет nfs-common:
$ sudo apt install nfs-common
Создание каталога на сервере
На виртуальной машине nfs-server создаем каталог:
$ sudo mkdir -p /srv/nfs/common
Поскольку каталог создан с помощью команды sudo, он принадлежит пользователю root. Но NFS переведёт все операции root клиента в nobody:nogroup в целях безопасности. Во избежание конфликта нужно изменить права на каталог:
$ sudo chown nobody:nogroup /srv/nfs/common
Предоставим всем право записи в этот каталог:
$ sudo chmod a+w /srv/nfs/common
Суперпользователи могут выполнять в системе любые задачи. Однако каталоги, смонтированные через NFS, технически не являются частью системы, так что по умолчанию сервер NFS не будет выполнять операции, требующие привилегий суперпользователя. Это ограничение по умолчанию означает, что суперпользователь клиента не может записывать файлы в корневом каталоге, изменять привилегии и выполнять любые другие задачи суперпользователя в NFS.
Экспорт каталога на сервере
Каталог готов, теперь можно его экспортировать
$ sudo nano /etc/exports
Добавляем в файл:
/srv/nfs/common 192.168.30.20(rw,sync,no_subtree_check)
/home 192.168.30.20(rw,sync,no_root_squash,no_subtree_check)
После перезапускаем сервер
$ sudo systemctl restart nfs-kernel-server
Параметры обоих каталогов почти одинаковы, за исключением no_root_squash, который присутствует только в настройках домашнего каталога. Домашний каталог добавлен с целью посмотреть, как доверенные пользователи nfs-client могут получить права суперпользователя.
Параметр rw устанавливает права клиента на чтение и изменение каталога.
Параметр sync синхронизирует каталоги по NFS, что обеспечивает согласовние содержимого, но замедляет скорость выполнения операций.
Параметр no_subtree_check предотвращает проверку поддерева, это рекомендуется сделать в большинстве случаев.
Параметр no_root_squash — по умолчанию NFS транслирует запросы от пользователя root клиента пользователю noboby сервера, благодаря чему пользователь root клиента не может использовать файловую систему хоста с теми же привилегиями. Данная директива блокирует эту функцию безопасности.
Правила для файервола на сервере
Теперь проверим состояние файервола:
$ sudo ufw status
Status: active
Разрешим соединения с хоста 192.168.30.20 на порту 2049:
$ sudo ufw allow in from 192.168.30.20 to any port nfs
$ sudo ufw status
Status: active
To Action From
----------------------------------------------------
2049 ALLOW 192.168.30.20
Создание точек монтирования на клиенте
Итак, сервер настроен и подготовлен к совместному использованию каталогов с клиентом. Теперь нужно создать несколько точек монтирования и смонтировать удалённые каталоги.
Создаем каталоги, куда будем монтировать:
$ sudo mkdir /mnt/nfs
$ sudo mkdir /mnt/nfs/common
$ sudo mkdir /mnt/nfs/home
Монтирование удаленных каталогов на клиенте
Монтируем удаленные каталоги:
$ sudo mount 192.168.30.21:/srv/nfs/common /mnt/nfs/common
$ sudo mount 192.168.30.21:/home /mnt/nfs/home
Доступ к каталогу common
Давайте на клиенте от имени root создадим файл test.txt в директории /mnt/nfs/common:
$ sudo nano /mnt/nfs/common/test.txt
some content
И посмотрим права на этот файл:
$ ls -la /mnt/nfs/common
total 12
drwxrwxrwx 2 nobody nogroup 4096 мар 4 13:55 .
drwxr-xr-x 4 root root 4096 мар 4 12:37 ..
-rw-r--r-- 1 nobody nogroup 13 мар 4 13:54 test.txt
Поскольку этот каталог был смонтирован со стандартным поведением NFS, а тестовый файл принадлежит пользователю root, в расшаренном каталоге права на файл изменятся на nobody:nogroup. Суперпользователь клиента не сможет выполнять задачи администратора (изменять привилегии, создавать каталоги для пользователей и групп и т.п.).
Доступ к каталогу home
Теперь на клиенте от имени root создадим файл test.txt в директории /mnt/nfs/home:
$ sudo nano /mnt/nfs/home/test.txt
some content
И посмотрим права на этот файл:
$ ls -la /mnt/nfs/home
total 16
drwxr-xr-x 3 root root 4096 мар 4 14:01 .
drwxr-xr-x 4 root root 4096 мар 4 12:37 ..
drwxr-xr-x 9 evgeniy evgeniy 4096 мар 2 10:59 evgeniy
-rw-r--r-- 1 root root 13 мар 4 14:01 test.txt
При монтировании этого каталога поведение NFS по умолчанию было изменено с помощью параметра no_root_squash. Благодаря этому суперпользователь клиента сохраняет свои привилегии.
Размонтирование удаленных каталогов на клиенте
Для этого достаточно выполнить команды:
$ cd ~
$ sudo umount /mnt/nfs/common
$ sudo umount /mnt/nfs/home
Монтирование NFS при загрузке клиента
Если удаленные каталоги на клиенте нужны постоянно, удобно монтировать их сразу при загрузке системы:
$ sudo nano /etc/fstab
192.168.30.21:/srv/nfs/common /mnt/nfs/common nfs auto,nofail,noatime,intr,tcp,actimeo=3600 0 0
192.168.30.21:/home /mnt/nfs/home nfs auto,nofail,noatime,intr,tcp,actimeo=3600 0 0
Опции монтирования:
auto — файловая система будет смонтирована автоматически при загрузке
nofail — предотвращает появление ошибок, если NFS-сервер недоступен
noatime — не обновлять информацию о времени доступа к файловой системе
intr — прерывать файловые операции, если NFS-сервер долго не отвечает
tcp — для монтирования использовать протокол TCP, а не стандартный UDP
actimeo — время кэширования атрибутов файлов и каталогов в секундах
Ну вот, теперь вы можете пользоваться NFS клинет-серверным файлообменником. Ура, товарищи, ура!