Как настроить NFS монтирование на Ubuntu 18.04

Введение

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

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

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

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

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

    • Для помощи в создании не-root пользователя с привилегиями sudo и настройке брандмауэра следуйте нашему руководству Начальная настройка сервера с Ubuntu 18.04.

    • Если вы используете виртуальные машины DigitalOcean для своего сервера и клиента, прочтите Как создать VPC, чтобы настроить частную сеть.

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

  • Хост: 203.0.113.0
  • Клиент: 203.0.113.24

Когда эти IP-адреса появляются в командах и конфигурационных файлах, замените их на ваши собственные соответствующие IP-адреса хоста и клиента.

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

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

На хосте

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

  1. sudo apt update

Затем установите пакет:

  1. sudo apt install nfs-kernel-server

После установки этих пакетов переключитесь на сервер клиента.

На клиенте

На сервере клиента установите пакет под названием nfs-common, который предоставляет функциональность NFS без включения серверных компонентов. Снова обновите локальный индекс пакетов перед установкой, чтобы убедиться, что у вас есть актуальная информация:

  1. sudo apt update

Затем установите пакет:

  1. sudo apt install nfs-common

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

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

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

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

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

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

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

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

  1. sudo mkdir /var/nfs/general -p

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

  1. ls -la /var/nfs/general
Output
total 8 drwxr-xr-x 2 root root 4096 Feb 7 23:21 . drwxr-xr-x 3 root root 4096 Feb 7 23:21 ..

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

  1. sudo chown nobody:nogroup /var/nfs/general

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

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

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

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

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

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

На хост-машине откройте файл /etc/exports в выбранном вами текстовом редакторе с привилегиями root. Здесь мы будем использовать nano:

  1. sudo nano /etc/exports

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

/etc/exports
directory_to_share    client(share_option1,...,share_optionN)

Вам нужно создать строку для каждого из каталогов, которые вы планируете совместно использовать. Поскольку нашему примеру клиента присвоен IP-адрес 203.0.113.24, наши строки будут выглядеть следующим образом. Обязательно измените IP-адрес на IP-адрес вашего клиента:

/etc/exports
/var/nfs/general    203.0.113.24(rw,sync,no_subtree_check)
/home       203.0.113.24(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 отключает это поведение для определенных ресурсов.

После завершения внесения изменений сохраните и закройте файл. Если вы используете nano, вы можете сделать это, нажав CTRL + X, затем Y и ENTER. Затем, чтобы сделать ресурсы доступными для настроенных клиентов, перезапустите сервер NFS следующей командой:

  1. sudo systemctl restart nfs-kernel-server

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

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

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

  1. sudo ufw status
Output
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 на хосте, убедившись, что замените ваш IP-адрес клиента:

  1. sudo ufw allow from 203.0.113.24 to any port nfs

Вы можете проверить изменение, выполнив следующее:

  1. sudo ufw status

Вы должны получить список разрешенного трафика с порта 2049 в выводе:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 2049 ALLOW 203.0.113.24 OpenSSH (v6) ALLOW Anywhere (v6)

Это подтверждает, что UFW разрешит только трафик NFS на порту 2049 с вашей клиентской машины.

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

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

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

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

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

  1. sudo mkdir -p /nfs/general

Затем выполните эту команду, чтобы создать второй::

  1. sudo mkdir -p /nfs/home

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

  1. sudo mount 203.0.113.0:/var/nfs/general /nfs/general
  2. sudo mount 203.0.113.0:/home /nfs/home

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

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.6M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000 203.0.113.0:/var/nfs/general 25G 1.3G 23G 6% /nfs/general 203.0.113.0:/home 25G 1.3G 23G 6% /nfs/home

Оба смонтированных вами раздела отображаются внизу. Поскольку они были смонтированы из одной файловой системы, они показывают одно и то же использование диска. Чтобы проверить, сколько места фактически используется под каждой точкой монтирования, используйте команду использования диска du и путь к монтированию. Флаг -s предоставляет сводку использования вместо отображения использования для каждого файла. Флаг -h выводит человекочитаемый вывод:

  1. du -sh /nfs/home
Output
44K /nfs/home

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

Шаг 6 — Проверка доступа к NFS

Затем протестируйте доступ к общим ресурсам, записав что-то в каждый из них.

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

Сначала создайте тестовый файл в общем ресурсе /var/nfs/general:

  1. sudo touch /nfs/general/general.test

Затем проверьте его владельца:

  1. ls -l /nfs/general/general.test
Output
-rw-r--r-- 1 nobody nogroup 0 Feb 7 23:53 /nfs/general/general.test

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

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

Для сравнения разрешений общего ресурса общего назначения с общим ресурсом домашнего каталога создайте файл в /nfs/home таким же образом:

  1. sudo touch /nfs/home/home.test

Затем проверьте владение файлом:

  1. ls -l /nfs/home/home.test
Output
-rw-r--r-- 1 root root 0 Feb 7 23:56 /nfs/home/home.test

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

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

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

Откройте следующий файл с правами администратора в вашем предпочитаемом текстовом редакторе:

  1. sudo nano /etc/fstab

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

/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 man. Для этого выполните следующую команду:

  1. man nfs

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

Шаг 8 — Отключение удаленного NFS-раздела

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

Сначала перейдите в домашний каталог:

  1. cd ~

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

  1. sudo umount /nfs/home

Затем снимите монтирование с /nfs/general:

  1. sudo umount /nfs/general

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

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.5M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000

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

Заключение

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-18-04