Создание общих сетевых ресурсов внутри кластера является неотъемлемой частью работы сетевых Администраторов. Для конфигурирования таких кластеров может быть использован ряд программных средств, например, таких как NCP (NetWare Core Protocol), SMB (Server Message Block) и некоторые другие. Однако для Linux-подобных систем наиболее распространён сетевой протокол NFS (Network File System), ориентированный на работу с разными типами файловых систем. В отличие, например, от FTP он обеспечивает прозрачный доступ к удалённым файлам, когда работа с ними ничем не отличается от работы с локальными файлами. Рассмотрим особенности протокола и примеры его практического применения.
Характеристики протокола NFS
Протокол разработан компанией Sun Microsystems на базе открытого сетевого протокола вызова удалённых процедур RPC (Open Network Computing Remote Procedure Call). NFS имеет клиентскую и серверную части, независимо устанавливаемые на сетевых узлах. Клиенты получают доступ к серверным ресурсам путём отправки серверу запросов в формате RPC.
Приведём некоторые из наиболее значимых характеристик NFS:
- Независимость от аппаратной конфигурации узлов;
- Поддержка большинства известных операционных систем (ОС) – Windows, Mac OS, IBM i и др.
- Восстанавливаемость после сбоя клиента или сервера;
- Прозрачный доступ к удалённым ресурсам без перекомпиляции, использования путей и библиотек;
- Производительность сравнима с производительностью дисковых накопителей;
- Для клиента удалённые и локальные файлы представляются одинаково;
- Возможность использования для транспорта стека протоколов TCP/IP;
- Сервер принимает запросы от клиента на фиксированный порт 2049;
- Повышенная производительность за счёт использования множества NFS-серверов или пользовательских nfsd-процессов в зависимости от конфигурации системы;
- Каждый из узлов кластера может выполнять функции как сервера, так и клиента.
На данный момент последней версией программного продукта является версия 4.2, в которую, в частности, добавлены операции клонирования и копирования на стороне сервера, блок данных приложения, средства резервирования, разреженные файлы и другие новшества.
NFS, в зависимости от реализации, может включать ряд дополнительных модулей, расширяющих его возможности. Например, это может быть менеджер блокировок NLM и сервис NSM, обеспечивающий мониторинг состояния сети. Их совместное использование позволяет оптимизировать работу системы.
Практическое использование NFS
На практике наиболее часто используется два подхода к организации кластера на базе NFS:
- Использование общего хранилища на сервере;
- Использование удалённых домашних каталогов пользователей вместо локальных.
Оба варианта позволяют значительно экономить дисковые ресурсы клиентских машин и оптимизировать работу пользователей внутри кластера.
Рассмотрим пути реализации каждого из подходов в случае, когда кластер состоит из двух узлов под управлением Ubuntu 22.04.
Настройка общего хранилища
В этом случае нет необходимости в предоставлении root-доступа к серверным ресурсам со стороны клиентов, а значит сервер не будет подвергаться опасности. Разработчики предусмотрели способ реализации такой архитектуры. По умолчанию протокол настроен таким образом, что все root-команды клиента автоматически преобразуются в команды учётной записи nobody:nogroup. Администратору необходимо лишь изменить владельца общего ресурса на сервере для соответствия параметрам указанной учётной записи.
Обновление системы
Перед установкой серверной части программы необходимо обновить программную среду сервера. Для этого необходимо воспользоваться следующими командами:
$ sudo apt update
$ sudo apt list --upgradable
Установка и активация NFS-сервера
После успешно выполненного обновления можно приступать к установке программы:
$ sudo apt install nfs-kernel-server
После запуска команды в терминале начинается процесс развёртывания приложения. В последнем окне выхода команды появится сообщение: «Setting up nfs-kernel-server 1:2.6.1 ... », что будет говорить об успешном завершении процесса установки.
После этого необходимо запустить NFS-сервер:
$ sudo systemctl start nfs-kernel-server.service
Создание общего ресурса на сервере
Создадим общий каталог на сервере с именем all_users:
$ sudo mkdir /var/nfs/all_users -p
Владельцем созданного каталога будет root-пользователь. Изменим владельца, чтобы NFS блокировал администраторские запросы, о чём уже говорилось выше:
$ sudo chown nobody:nogroup /var/nfs/all_users
Теперь общий ресурс настроен и практически готов к экспорту. Остаётся лишь установить параметры экспорта, определяющие права доступа и некоторые другие характеристики.
Для этого воспользуемся системным файлом /etc/exports. Откроем его с помощью редактора nano:
$ sudo nano /etc/exports
В открывшийся файл вставим следующую строку:
/var/nfs/all_users 178.21.139.65(rw,sync,no_subtree_check)
Указанные в скобках опции имеют следующие значения:
- rw – разрешает запись и считывание данных;
- sync – обеспечивает фиксацию текущего состояния каталога перед каждым ответом клиенту;
- no_subtree_check – отключает проверку вложенного дерева сервером во время проверки доступности файла.
Настройка UFW
Для возможности беспрепятственного доступа клиента к общему ресурсу через порт сервера 2049 необходимо внести изменения в настройки брандмауэра. Для начала активируем его:
$ sudo ufw enable
На выходе должна появиться фраза: «Firewall is active and enabled ... ».
Просмотрим действующие на данный момент правила:
$ sudo ufw status
На выходе появится что-то похожее на следующее:
To | Action | From |
80/tcp | ALLOW | Anywhere |
22/tcp | ALLOW | Anywhere |
80/tcp (v6) | ALLOW | Anywhere (v6) |
22/tcp (v6) | ALLOW | Anywhere (v6) |
Добавим правило:
$ sudo ufw allow from 178.21.139.65 to any port nfs
Где 178.21.139.65 – IP-адрес нашей клиентской машины.
На выходе команды должно появиться сообщение: «Rule added», что будет признаком успешности выполненной операции.
После проверки действующих правил брандмауэра к приведённым выше записям добавится следующая строка:
To | Action | From |
2049 | ALLOW | 178.21.139.65 |
Это будет означать, что доступ к серверу со стороны клиента теперь открыт.
Настройка клиента
На клиентской машине также необходимо выполнить обновление программной среды, как мы сделали ранее для сервера, после чего установить клиентскую часть программы с помощью следующей команды:
$ sudo apt install nfs-common
После успешной установки на выходе получаем сообщение вида: «Setting up nfs-common 1:2.6.1...».
Настройка удалённого домашнего каталога пользователя
При конфигурировании такого кластера многие действия совпадают с действиями, выполненными нами на стороне сервера при настройке общего ресурса. Отличия заключаются в отсутствии необходимости менять владельца каталога, а также в наличии разных записей в конфигурационном файле /etc/exports.
Для конфигурирования кластера будем использовать имеющийся на сервере каталог home.
Внесём нужные изменения в файл /etc/exports:
$ sudo nano /etc/exports
В открывшийся файл вставим следующую строку:
/home 178.21.139.65(rw,sync,no_root_squash,no_subtree_check)
Здесь параметр no_root_squash отключает установленные по умолчанию настройки протокола NFS, что даёт возможность клиенту получить root-доступ к домашнему каталогу. Значения остальных параметров нами были рассмотрены выше.
Монтирование серверных ресурсов на клиентской машине
Независимо от вида конфигурации кластера используются одни и те же операции монтирования общих ресурсов. Приведём последовательность действий по монтированию каталогов для обоих рассмотренных нами ранее случаев.
Создадим одноимённые с серверными ресурсами пустые каталоги на клиенте:
$ sudo mkdir -p /nfs/all_users
$ sudo mkdir -p /nfs/home
Команды монтирования будут иметь следующий вид:
$ sudo mount 178.21.139.66:/var/nfs/all_users /nfs/all_users
$ sudo mount 178.21.139.66:/home /nfs/home
Где 178.21.139.66 – IP-адрес сервера.
Проверим результат выполнения приведённых команд:
$ df -h
На выходе команды мы должны получить примерно следующие данные:
Filesystem | Size | Used | Avail | Use% | Mounted on |
tmpfs | 192M | 2.4M | 190M | 2% | /run |
/dev/vda2 | 24G | 8.6G | 15G | 38% | / |
tmpfs | 958M | 0 | 958M | 0% | /dev/shm |
178.21.139.66:/var/nfs/all_users | 24G | 18G | 5.8G | 75% | /nfs/all_users |
178.21.139.66:/home | 24G | 18G | 5.8G | 75% | /nfs/home |
Можно убедиться, что в нашем случае общие ресурсы успешно смонтированы на клиентской машине.
Проверка доступа
Проверим доступность серверных ресурсов. Для этого в общем каталоге all_users создадим проверочный файл с именем all_users.new:
$ sudo touch /nfs/all_users/ all_users.new
Проверим права владельца:
$ ls -l /nfs/all_users/all_users.new
Результат должен быть примерно таким:
-rw-r--r-- 1 nobody nogroup 0 Mar 12 11:06 /nfs/all_users/all_users.new
Такой результат говорит о том, что общий ресурс настроен верно, поскольку его владельцем является nobody nogroup, а не root-пользователь. Это означает, что клиент не сможет выполнить здесь действий, требующих права Администратора.
Таким же образом создадим проверочный файл с именем home.new в удалённом домашнем каталоге:
$ sudo touch /nfs/home/home.new
Проверим права владельца:
$ ls -l /nfs/home/home.new
Выход команды:
-rw-r--r-- 1 root root 0 Mar 12 11:12 /nfs/home/home.new
Можно убедиться, что владельцем файла является root-пользователь. Это означает, что администраторские действия клиента здесь разрешены, что вполне согласуется с нашими изначальными установками.
Автоматизация операции монтирования
После каждой перезагрузки клиентской машины происходит сброс смонтированных общих ресурсов, если они не прописаны в файле /etc/fstab. Если же они там прописаны, то монтирование происходит в автоматическом режиме. Внести в файл нужные записи можно с помощью следующей команды:
$ sudo nano /etc/fstab
Вставим в файл следующие строки:
178.21.139.66:/var/nfs/all_users /nfs/all_users nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
178.21.139.66:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
После сохранения внесённых изменений монтирование ресурсов будет происходить в автоматическом режиме.
При необходимости отключить автоматическое монтирование, достаточно закомментировать указанные выше записи или удалить параметр «auto».