Монтирование NFS с помощью блочного хранилища

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

Блочное хранилище — это общий термин, который используют для описания сетевых томов хранения данных, которые предлагаются хостинг-провайдерами. В отличии от объектного хранилища, блочное хранилище обычно не предоставляет собственного API для прямого доступа. Вместо этого его нужно подключить к существующему серверу и дать общий доступ с этого сервера.

Читайте также: Сервисы хранения объектов и блочные сервисы хранения: краткий обзор

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

Требования

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

  • Два сервера Ubuntu. Последние версии Ubuntu или Debian. У каждого сервера должен быть пользователь с sudo, брандмауэр, настроенный с помощью UFW, и частная сеть (если она доступна).
    • Если вам нужна помощь в настройке пользователя с sudo и брандмауэра, следуйте этому туториалу.
    • Исходный сервер называется хостом; сервер, на котором монтируется файловая система, называется клиентом. К хосту должен быть подключен блочный том хранения данных. Также нужно знать IP обоих серверов. Кроме случаев первоначального подключения через SSH, обязательно используйте адрес частной сети, если он доступен.

В этом мануале эти IP-адреса условно называются host_ip и client_ip. Заменяйте их своими данными, когда будет нужно.

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

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

Хост

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

sudo apt update
sudo apt install nfs-kernel-server

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

Клиент

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

sudo apt update
sudo apt install nfs-common

Примечание: С помощью встроенных функций ОС можно подключиться к общим ресурсам NFS и на других платформах (Windows или macOS). Например, nfs-common предназначен для серверов Ubuntu.

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

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

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

Например, блочное хранилище смонтировано на хосте по пути /mnt/volume-nyc3-01, и нам нужно создать каталог для общего доступа в этом томе с именем nfs.

Сначала создайте общий каталог:

sudo mkdir -p /mnt/volume-nyc3-01/nfs

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

ls -dl /mnt/volume-nyc3-01/nfs/

Вы получите:

drwxr-xr-x 2 root root 4096 Sep 27 16:19 /mnt/volume-nyc3-01/nfs/

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

sudo chown nobody:nogroup /mnt/volume-nyc3-01/nfs/

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

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

Далее мы разберём файл конфигурации NFS, чтобы настроить расшаривание.

На хосте откройте с правами root файл /etc/exports в nano или любом другом текстовом редакторе:

sudo nano /etc/exports

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

directory_to_share    client(share_option1,...,share_optionN)

Теперь создадим строку для каждого каталога, который нужно расшарить. Обязательно замените client_ip IP-адресом своего клиента:

/mnt/volume-nyc3-01/nfs/    client_ip(rw,sync,no_subtree_check)

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

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

Внеся все изменения, сохраните и закройте файл. Затем с помощью следующей команды перезапустите 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 нужно добавить в список правил.

Многие приложения уже есть в списке брандмауэра. С помощью команды sudo ufw app list можно добавить их в настройки, просто указав имя. К сожалению, nfs не входит в этот список. Но ufw читает файл /etc/services, чтобы найти порт и протокол приложения, и в этот файл можно добавить NFS. Правила брандмауэра должны блокировать весь ненужный трафик, разрешая только необходимые соединения.

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

sudo ufw allow from client_ip to any port nfs

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

sudo ufw status

В выводе показан разрешенный трафик с порта 2049:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                 
2049                       ALLOW       203.0.113.24        
OpenSSH (v6)               ALLOW       Anywhere (v6)

UFW поддерживает трафик клиента NFS по порту 2049 с клиентского компьютера.

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

Итак, хост настроен и подготовлен к совместному использованию каталогов с клиентом. 

Чтобы сделать удаленный ресурс доступным на клиенте, необходимо смонтировать удаленные каталоги на хосте, к которому нужно открыть доступ.

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

Создайте каталог для маунтов:

sudo mkdir -p /nfs/general

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

sudo mount host_ip:/mnt/volume-nyc3-01/nfs/ /nfs/general

Эта команда выполнит монтирование каталогов серверов. С помощью команды mount или findmnt можно убедиться, что монтирование прошло успешно, но df -h сделает вывод удобнее:

df -h

Filesystem                            Size  Used Avail Use% Mounted on
tmpfs                                 198M  972K  197M   1% /run
/dev/vda1                              50G  3.5G   47G   7% /
tmpfs                                 989M     0  989M   0% /dev/shm
tmpfs                                 5.0M     0  5.0M   0% /run/lock
/dev/vda15                            105M  5.3M  100M   5% /boot/efi
tmpfs                                 198M  4.0K  198M   1% /run/user/1000
10.124.0.3:/mnt/volume-nyc3-01/nfs/    25G  5.9G   19G  24% /nfs/general

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

Например:

du -sh /nfs/general
4.0K    /nfs/general

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

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

Запишите что-нибудь в расшаренный каталог, чтобы убедится, что всё работает.

Сначала создайте тестовый файл в /mnt/volume-nyc3-01/nfs/:

sudo touch /nfs/general/test

Затем проверьте права на него:

ls -l /nfs/general/test

-rw-r--r-- 1 nobody nogroup 0 Sep 28 18:05 /nfs/general/test

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

7: Монтирование NFS при загрузке

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

В текстовом редакторе откройте этот файл с правами root:

sudo nano /etc/fstab

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


host_ip:/mnt/volume-nyc3-01/nfs/    /nfs/general   nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Примечание. Подробную информацию о используемых опциях можно найти в справке NFS. Для этого выполните следующую команду:

man nfs

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

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

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

cd ~
sudo umount /nfs/general

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

Это удалит смонтированные каталоги и оставит доступным только локальное хранилище:

df -h

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           198M  972K  197M   1% /run
/dev/vda1        50G  3.5G   47G   7% /
tmpfs           989M     0  989M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/vda15      105M  5.3M  100M   5% /boot/efi
tmpfs           198M  4.0K  198M   1% /run/user/1000

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

Подводим итоги

В этой статье мы создали NFS хост и разобрали его основные функции: смонтировали NFS, к которому предоставили доступ клиенту NFS.

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

Tags:

Добавить комментарий