Монтирование NFS на сервере Ubuntu 20.04

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

Этот мануал поможет выполнить монтирование NFS на сервере Ubuntu 20.04 с помощью сервера и клиента, а также расскажет вам о базовых командах NFS.

Требования

Для выполнения мануала нужно два сервера Ubuntu 20.04 (настроенные по этому мануалу), которые будут совместно использовать одну файловую систему.

Исходный сервер называется хостом; сервер, на котором монтируется файловая система, называется клиентом. Их условные IP-адреса:

  • хост: host_ip
  • клиент: client_ip

Вместо них вам нужно указать адреса вашего хоста и клиента соответственно.

1: Загрузка и установка компонентов

Сначала нужно установить все компоненты на хост и на клиента.

Хост

На хост нужно установить пакет nfs-kernel-server, который позволяет настраивать совместное использование каталогов. Обновите индекс пакетов и установите nfs-kernel-server:

sudo apt update
sudo apt install nfs-kernel-server

После этого перейдите на клиентскую машину.

Клиент

На клиентском сервере нужно установить пакет nfs-common, который предоставляет клиентские функции NFS. Обновите индекс пакетов и установите его:

sudo apt update
sudo apt install nfs-common

Теперь обе машины готовы к работе.

2: Создание расшаренных каталогов на хосте

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

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

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

Пример 1: Общее монтирование

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

Создайте каталог nfs:

sudo mkdir /var/nfs/general -p

Поскольку каталог создан с помощью команды sudo, он принадлежит пользователю root хоста:

ls -la /var/nfs/general
drwxr-xr-x 2 root root 4096 May 14 18:36 .

NFS переведёт все операции root клиента в nobody:nogroup в целях безопасности. Во избежание конфликта нужно изменить права на каталог:

sudo chown nobody:nogroup /var/nfs/general

Теперь этот каталог можно экспортировать.

Пример 2: Экспорт домашнего каталога

Во втором примере мы посмотрим, как сделать домашний каталог, хранящийся на хосте, доступным на клиентском сервере. При этом доверенные пользователи сервера client будут иметь права суперпользователя.

Для этого экспортируйте каталог /home. Такой каталог уже существует, потому не нужно его создавать. Также не нужно менять привилегии. Если вы измените привилегии, это вызовет ряд ошибок на хосте.

3: Настройка экспорта NFS на хосте

Каталоги полностью готовы, теперь нужно открыть конфигурационный каталог NFS и расшарить их.

sudo nano /etc/exports

Файл содержит ряд комментариев, объясняющих функции и общую структуру каждой строки. Базовый синтаксис файла имеет такой вид:

directory_to_share    client(share_option1,...,share_optionN)

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

Примечание: Замените client_ip IP-адресом своего клиента.

/var/nfs/general    client_ip(rw,sync,no_subtree_check)
/home               client_ip(rw,sync,no_root_squash,no_subtree_check)

Параметры обоих каталогов почти одинаковы, за исключением параметра no_root_squash, который присутствует только в настройках домашнего каталога.

Рассмотрим параметры подробнее:

  • rw: устанавливает права клиента на чтение и изменение каталога.
  • sync: синхронизирует каталоги по NFS, что обеспечивает надёжное и согласованное окружение (с другой стороны, это может замедлить скорость выполнения операций).
  • no_subtree_check: предотвращает проверку поддерева (процесс проверки хост-сервером доступности файла в экспортируемом дереве для каждого запроса). Это может вызвать много проблем в совместном использовании, например, если открытый на клиенте файл был переименован на сервере. Проверку поддерева рекомендуется отключить в большинстве случаев.
  • no_root_squash: по умолчанию NFS транслирует запросы от root-пользователя клиента не-root пользователю сервера, благодаря чему root-пользователь клиента не может использовать файловую систему хоста с теми же привилегиями. Данная директива блокирует эту функцию безопасности для некоторых совместно используемых ресурсов.

Внеся все изменения, сохраните и закройте файл.

Перезапустите NFS, чтобы клиенты получили доступ к расшаренному каталогу.

sudo systemctl restart nfs-kernel-server

Теперь нужно убедиться, что трафик к расшаренным каталогам не блокируется брандмауэром.

4: Настройка брандмауэра на хосте

Проверьте состояние брандмауэра:

sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

В данной системе поддерживается только трафик SSH. Добавьте NFS в список правил.

Многие приложения есть в списке брандмауэра ufw. Их можно добавить в настройки, просто указав имя. К сожалению, nfs не входит в этот список. Брандмауэр ufw читает файл /etc/services, чтобы найти порт и протокол приложения. В этот файл можно добавить NFS.

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

Чтобы открыть порт 2049 на сервере host, введите на хосте эту команду, указав IP клиента:

sudo ufw allow from client_ip to any port nfs

Проверьте изменения:

sudo ufw status

В списке появится новый сервис.

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
2049                       ALLOW       client_ip
OpenSSH (v6)               ALLOW       Anywhere (v6)

UFW поддерживает трафик клиента NFS по порту 2049.

5: Создание точек монтирования

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

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

На клиенте создайте два каталога:

sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home

Теперь на клиенте есть место для хранения совместно используемых данных. Смонтируйте эти каталоги:

sudo mount host_ip:/var/nfs/general /nfs/general
sudo mount host_ip:/home /nfs/home

Эти команды выполнят монтирование каталогов серверов. Чтобы убедиться, что монтирование прошло успешно, проверьте дисковое пространство на клиенте.

df -h
Filesystem                       Size  Used Avail Use% Mounted on
udev                             474M     0  474M   0% /dev
tmpfs                             99M  936K   98M   1% /run
/dev/vda1                         25G  1.8G   23G   8% /
tmpfs                            491M     0  491M   0% /dev/shm
tmpfs                            5.0M     0  5.0M   0% /run/lock
tmpfs                            491M     0  491M   0% /sys/fs/cgroup
/dev/vda15                       105M  3.9M  101M   4% /boot/efi
tmpfs                             99M     0   99M   0% /run/user/1000
10.132.212.247:/var/nfs/general   25G  1.8G   23G   8% /nfs/general
10.132.212.247:/home              25G  1.8G   23G   8% /nfs/home

Оба смонтированных каталога появятся в конце списка. Оба каталога находятся в одной файловой системе на удалённом сервере, потому они показывают одинаковое использование дискового пространства. Чтобы узнать, сколько места на самом деле использует каждая точка монтирования, введите команду du и укажите путь к точке монтирования. Флаг -s предоставит общие данные об использовании диска; флаг -h вернёт данные в удобочитаемом формате.

du -sh /nfs/home
36K /nfs/home

Это значит, что контент домашнего каталога занимает 36K доступного пространства.

6: Тестирование доступа NFS

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

Пример 1: Общий каталог

Создайте тестовый файл в /var/nfs/general:

sudo touch /nfs/general/general.test

Проверьте права на него:

ls -l /nfs/general/general.test
-rw-r--r-- 1 nobody nogroup 0 Aug  1 13:31 /nfs/general/general.test

Поскольку этот каталог был смонтирован со стандартным поведением NFS, а тестовый файл принадлежит пользователю root, В расшаренном каталоге права на файл изменятся (nobody:nogroup). Суперпользователь клиента не сможет выполнять задачи администратора (изменять привилегии, создавать каталоги для пользователей и групп и т.п.).

Пример 2: Домашний каталог

Создайте такой же файл в домашнем каталоге:

sudo touch /nfs/home/home.test

Проверьте права на него:

ls -l /nfs/home/home.test
-rw-r--r-- 1 root root 0 Aug  1 13:32 /nfs/home/home.test

Файл home.test также принадлежит пользователю root, однако при монтировании этого каталога поведение NFS по умолчанию было изменено (параметр no_root_squash). Благодаря этому root-пользователи клиента сохраняют свои привилегии и им не нужно предоставлять root права на хосте.

7: Автоматическое монтирование NFS

Чтобы настроить автоматическое монтирование каталогов, добавьте их в файл /etc/fstab на клиенте.

Откройте этот файл:

sudo nano /etc/fstab

В конец файла внесите записи для каждого смонтированного каталога:

. . .
host_ip:/var/nfs/general    /nfs/general   nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home               /nfs/home      nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Примечание: Все использованные здесь опции можно найти на в справке fstab:

man nfs

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

8: Демонтирование удалённых каталогов NFS

Если файловая система больше не нуждается в удалённых каталогах, их можно демонтировать. Для этого нужно открыть смонтированный каталог и выполнить команду:

cd ~
sudo umount /nfs/home
sudo umount /nfs/general

Обратите внимание, команда называется umount, а не unmount, как вы могли бы ожидать.

Это удалит смонтированные каталоги из файловой системы.

df - df -h
Filesystem                       Size  Used Avail Use% Mounted on
udev                             474M     0  474M   0% /dev
tmpfs                             99M  936K   98M   1% /run
/dev/vda1                         25G  1.8G   23G   8% /
tmpfs                            491M     0  491M   0% /dev/shm
tmpfs                            5.0M     0  5.0M   0% /run/lock
tmpfs                            491M     0  491M   0% /sys/fs/cgroup
/dev/vda15                       105M  3.9M  101M   4% /boot/efi
tmpfs                             99M     0   99M   0% /run/user/1000

Как видите, теперь доступных удалённых каталогов в файловой системе больше нет.

Чтобы отключить автоматическое монтирование каталогов, закомментируйте их в файле /etc/fstab с помощью символа #. Также можно остановить автозагрузку, удалив опцию auto (это позволит вам монтировать каталоги вручную).

Заключение

NFS предоставляет быстрый и простой способ настройки сетевого доступа к удалённым каталогам. Однако имейте в виду: сам протокол не шифруется. При использовании NFS в производственной среде стоит рассмотреть варианты маршрутизации NFS через соединения SSH или VPN, чтобы обеспечить защиту данных.

Читайте также: Монтирование удаленных файловых систем при помощи SSHFS

Tags: , ,