NFS, или Network File System – это распределённый протокол файловой системы, позволяющий монтировать удалённые каталоги и использовать их как локальные. Таким образом можно использовать отдельное пространство для хранения файлов и обращаться к нему с нескольких удалённых серверов.
Данное руководство поможет выполнить монтирование NFS на сервере Ubuntu 16.04.
Требования
В руководстве используется два сервера, которые будут совместно использовать одну файловую систему. Исходный сервер называется host; сервер, на котором монтируется файловая система, называется client. Их условные IP-адреса:
- Host: 203.0.113.0
- Client: 203.0.113.256
Замените эти адреса IP-адресами своих серверов. Также для работы вам понадобится:
- Два настроенных сервера Ubuntu 16.04 (руководство по начальной настройке можно найти здесь).
- Пользователь с доступом sudo на каждом сервере.
- Частная сеть.
1: Загрузка и установка компонентов
Сначала нужно установить все компоненты на каждый сервер.
Сервер host
На сервер host нужно установить пакет nfs-kernel-server, который позволяет настраивать совместное использование каталогов. Обновите индекс пакетов и установите nfs-kernel-server:
sudo apt update
sudo apt install nfs-kernel-server
После этого перейдите на сервер client.
Сервер client
На сервере client нужно установить пакет nfs-common, который предоставляет клиентские функции NFS. Обновите индекс пакетов и установите его:
sudo apt update
sudo apt install nfs-common
Теперь оба сервера готовы к работе.
2: Создание расшаренных каталогов на сервере host
Теперь попробуйте расшарить два отдельных каталога между двумя серверами.
Суперпользователи могут выполнять в системе любые задачи. Однако каталоги, смонтированные через NFS, технически не являются частью системы, так что по умолчанию сервер NFS не будет выполнять операции, требующие привилегий суперпользователя. Это ограничение по умолчанию означает, что суперпользователь клиента не может записывать файлы в корневом каталоге, изменять привилегии и выполнять любые другие задачи суперпользователя в NFS.
Однако на клиенте бывают доверенные пользователи, которым необходимо иметь возможность выполнять подобные задачи в смонтированной системе на хосте. Это довольно рискованно, но NFS предоставляет root-доступ некоторым пользователям.
Общее монтирование
В первом примере показано, как создать NFS монтирование общего назначения, которое использует поведение по умолчанию NFS (то есть, не предоставляет клиенту прав суперпользователя). Такую модель можно использовать для хранения файлов, загруженных с помощью системы управления контентом, или как пространство для обмена файлами между пользователями.
Создайте каталог nfs:
sudo mkdir /var/nfs/general -p
Поскольку каталог создан с помощью команды sudo, он принадлежит пользователю root:
ls -la /var/nfs/general
4 drwxr-xr-x 2 root root 4096 Jul 25 15:26 .
NFS переведёт все операции root хоста в nobody:nogroup в целях безопасности. Во избежание конфликта нужно изменить права на каталог:
sudo chown nobody:nogroup /var/nfs/general
Теперь этот каталог можно экспортировать.
Экспорт домашнего каталога
Второй пример продемонстрирует, как сделать домашний каталог, хранящийся на host, доступным на сервере client. При этом доверенные пользователи сервера client будут иметь права суперпользователя.
Для этого экспортируйте каталог /home. Такой каталог уже существует, потому не нужно его создавать. Также не нужно менять привилегии. Если вы измените привилегии, это вызовет ошибку.
3: Экспортирование NFS
Каталоги полностью готовы, теперь нужно открыть конфигурационный каталог NFS и расшарить их.
sudo nano /etc/exports
Файл содержит ряд комментариев, объясняющих функции и общую структуру каждой строки. Базовый синтаксис файла имеет такой вид:
directory_to_share client(share_option1,...,share_optionN)
Добавьте настройки для каждого каталога, который нужно расшарить.
Примечание: Замените условный IP 203.0.113.256 IP-адресом своего клиента.
/var/nfs/general 203.0.113.256(rw,sync,no_subtree_check)
/home 203.0.113.256(rw,sync,no_root_squash,no_subtree_check)
Параметры обоих каталогов почти одинаковы, за исключением no_root_squash, который присутствует только в настройках домашнего каталога.
Рассмотрим параметры подробнее:
- rw: устанавливает права клиента на чтение и изменение каталога.
- sync: синхронизирует каталоги по NFS, что обеспечивает надёжное и согласованное окружение (с другой стороны, это может замедлить скорость выполнения операций).
- no_subtree_check: предотвращает проверку поддерева (процесс проверки host-сервером доступности файла в экспортируемом дереве для каждого запроса). Это может вызвать много проблем в совместном использовании, например, если открытый на клиенте файл был переименован на сервере. Проверку поддерева рекомендуется отключить в большинстве случаев.
- 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, введите:
sudo ufw allow from 203.0.113.0 to any port nfs
Примечание: Укажите ip своего клиента.
Проверьте изменения:
sudo ufw status
В списке появится новый порт.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.256
OpenSSH (v6) ALLOW Anywhere (v6)
UFW пропускает трафик клиента NFS на порт 2049.
5: Создание точек монтирования
Итак, сервер host настроен и подготовлен к совместному использованию каталогов с клиентом. Теперь нужно смонтировать удалённые каталоги и создать несколько точек монтирования.
Примечание: Если в точке монтирования хранятся другие файлы или каталоги, после монтирования они будут скрыты. В качестве точки монтирования рекомендуется использовать пустой каталог.
Создайте два каталога:
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
6: Монтирование удаленных каталогов
Теперь на клиенте есть место для хранения совместно используемых данных. Смонтируйте эти каталоги:
sudo mount 203.0.113.0:/var/nfs/general /nfs/general
sudo mount 203.0.113.0:/home /nfs/home
Эти команды выполнят монтирование каталогов серверов host и client. Чтобы убедиться, что монтирование прошло успешно, проверьте дисковое пространство на клиенте.
df -h
Filesystem Size Used Avail Use% Mounted on
udev 238M 0 238M 0% /dev
tmpfs 49M 628K 49M 2% /run
/dev/vda1 20G 1.2G 18G 7% /
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
203.0.113.0:/home 20G 1.2G 18G 7% /nfs/home
203.0.113.0:/var/nfs/general 20G 1.2G 18G 7% /nfs/general
Оба смонтированных каталога появятся в конце списка. Оба каталога находятся в одной файловой системе на удалённом сервере, потому они показывают одинаковое использование дискового пространства. Чтобы узнать, сколько места на самом деле использует каждая точка монтирования, введите команду du и укажите путь к точке монтирования. Флаг -s предоставит общие данные об использовании диска; флаг -h вернёт данные в удобочитаемом формате.
. du -sh /nfs/home
36K /nfs/home
Это значит, что контент домашнего каталога занимает 20K доступного пространства.
7: Тестирование доступа 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
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-пользователи клиента сохраняют свои привилегии.
8: Автоматическое монтирование NFS
Чтобы настроить автоматическое монтирование каталогов, добавьте их в файл fstab на клиенте.
Откройте этот файл:
sudo nano /etc/fstab
В конец файла внесите записи для каждого смонтированного каталога:
. . .
203.0.113.0:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
203.0.113.0:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
Примечание: Все использованные здесь опции можно найти на страницах мануала NFS, посвящённых файлу fstab:
man nfs
Теперь каталоги будут монтироваться автоматически при каждом запуске системы. Подключение может занять некоторое время.
9: Демонтирование удалённых каталогов
Если файловая система больше не нуждается в удалённых каталогах, их можно демонтировать. Для этого нужно открыть смонтированный каталог и выполнить команду:
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
Это удалит смонтированные каталоги из файловой системы.
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda 59G 1.3G 55G 3% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 2.0G 12K 2.0G 1% /dev
tmpfs 396M 320K 396M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
none 100M 0 100M 0% /run/user
Как видите, теперь доступных удалённых каталогов в файловой системе больше нет.
Заключение
NFS предоставляет быстрый и простой способ настройки сетевого доступа к удалённым каталогам. Однако имейте в виду: сам протокол не шифруется. При использовании NFS в производственной среде стоит рассмотреть варианты маршрутизации NFS через соединения SSH или VPN, чтобы обеспечить защиту данных.