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, чтобы обеспечить защиту данных.