Настройка монтажа NFS в Ubuntu 20.04

Введение

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

В этом обучающем модуле мы узнаем об установке необходимого программного обеспечения для использования NFS в Ubuntu 20.04, настроим два монтируемых тома NFS на сервере и клиенте и попробуем смонтировать и демонтировать удаленные общие тома.

Предварительные требования

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

  • Два сервера Ubuntu 20.04. На каждом из них должен быть настроен пользователь без прав root с привилегиями sudo, брандмауэр UFW и частные сети, если они вам доступны.

    • Указания по настройке пользователя без прав root с привилегиями sudo и брандмауэра можно найти в руководстве «Начальная настройка сервера Ubuntu 20.04».
    • Если вы используете для своих сервера и клиента дроплеты DigitalOcean, вы можете узнать больше о настройке частной сети в нашей документации по созданию VPC.

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

В этом обучающем модуле мы будем замещать эти IP-адреса сокращениями host_ip и client_ip. Замените эти сокращения необходимыми 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

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

Шаг 2 — Создание общих каталогов на хосте

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

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

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

Пример 1: Экспорт смонтированного ресурса общего назначения

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

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

  • sudo mkdir /var/nfs/general -p

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

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

Для безопасности NFS преобразует любые операции root на клиенте в операции с учетными данными nobody:nogroup. В связи с этим, нам необходимо изменить владельца каталога для соответствия этим учетным данным.

  • sudo chown nobody:nogroup /var/nfs/general

Теперь мы готовы к экспорту каталога.

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

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

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

Шаг 3 — Настройка экспорта NFS на хосте

Теперь рассмотрим подробнее файл конфигурации NFS и настроим общий доступ к этим ресурсам.

Откройте на хосте файл /etc/exports в текстовом редакторе с привилегиями root.

  • sudo nano /etc/exports

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

/etc/exports

directory_to_share    client(share_option1,...,share_optionN) 

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

/etc/exports

/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. Опция no_root_squash отключает такое поведение для определенных общих ресурсов.

Когда вы закончите внесение изменений, сохраните и закройте файл. Чтобы сделать общие ресурсы доступными для настроенных клиентов, перезапустите сервер NFS с помощью следующей команды:

  • sudo systemctl restart nfs-kernel-server

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

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

Для начала проверим статус брандмауэра, чтобы посмотреть, включен ли он. Если он включен, проверьте текущие разрешения:

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

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

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

Используйте следующую команду, чтобы открыть порт 2049 на хосте. Обязательно укажите IP-адрес вашей клиентской системы:

  • sudo ufw allow from client_ip to any port nfs

Для проверки изменений введите:

  • sudo ufw status

На экране вы увидите, что трафик порта 2049 разрешен:

OutputStatus: 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
  • sudo mkdir -p /nfs/home

Теперь у нас есть место для размещения удаленных общих ресурсов, и мы открыли брандмауэр, так что сейчас настало время монтировать общие ресурсы, используя IP-адрес сервера хоста:

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

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

  • df -h
OutputFilesystem                       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
Output36K /nfs/home 

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

Шаг 6 — Тестирование доступа NFS

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

Пример 1: общий ресурс общего назначения

Запишем тестовый файл в общий ресурс /var/nfs/general:

  • sudo touch /nfs/general/general.test

Проверим его права владения:

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

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

Пример 2: Общий домашний каталог

Чтобы сравнить разрешения общего каталога общего назначения и общего домашнего каталога, создайте файл в каталоге /nfs/home аналогичным образом:

  • sudo touch /nfs/home/home.test

Проверьте владельца файла:

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

Мы создали home.test от имени пользователя root с помощью команды sudo, точно так же, как мы создавали файл general.test. Однако в этом случае его владельцем является пользователь, поскольку мы заменили поведение по умолчанию, указав опцию no_root_squash option на этом смонтированном ресурсе. Это позволит пользователям root на клиентской системе выступать в качестве пользователей root и делает управление учетными записями пользователей намного удобнее. При этом нам не нужно предоставлять этим пользователям доступ root к хосту.

Шаг 7 — Монтирование удаленных каталогов NFS при загрузке

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

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

  • sudo nano /etc/fstab

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

/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  

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

  • man nfs

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

Шаг 8 — Демонтирование удаленного общего ресурса NFS

Если вы больше не хотите использовать удаленный каталог в своей системе, вы можете демонтировать его, переместив его из структуры общих каталогов:

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

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

При этом удаляются общие удаленные ресурсы и доступным остается только локальное хранилище:

  • df -h
OutputFilesystem                       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 и сделав их доступными на клиенте NFS.

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