Вступление
NFS, или Сетевая файловая система, является протоколом распределенной файловой системы, который позволяет вам монтировать удаленные каталоги на вашем сервере. Это позволяет вам управлять пространством хранения в другом месте и записывать в него пространство от нескольких клиентов. NFS обеспечивает относительно быстрый и простой способ доступа к удаленным системам по сети и хорошо работает в ситуациях, когда к общим ресурсам будет обращаться регулярно.
В этом руководстве мы рассмотрим, как настроить монтирование NFS.
Предпосылки
В этом руководстве мы будем использовать два сервера: один будет совместно использовать часть своей файловой системы с другим.
Для продолжения вам потребуется:
-
Two Ubuntu 16.04 servers, each with a non-root user with
sudo
privileges и частные сети включены.-
Для получения помощи в настройке пользователя с этими привилегиями следуйте нашему руководствуInitial Server Setup with Ubuntu 16.04.
-
Для получения помощи в настройке частной сети см.How To Set Up And Use DigitalOcean Private Networking.
-
На протяжении всего руководства мы называем сервер, который разделяет свои каталоги,host, а сервер, который монтирует эти каталоги, -client. Чтобы сохранить их четкость, мы будем использовать следующие IP-адреса в качестве резервных для значений хоста и клиента:
-
Host: 203.0.113.0
-
Clientс: 203.0.113.256
Вы должны заменить эти значения своими IP-адресами хоста и клиента.
[[шаг-1 -—- загрузка-и-установка-компонентов]] == Шаг 1. Загрузка и установка компонентов
Начнем с установки необходимых компонентов на каждом сервере.
На хосте
На хост-сервере мы установим пакетnfs-kernel-server
, который позволит нам совместно использовать наши каталоги. Поскольку это первая операция, которую мы выполняем сapt
в этом сеансе, мы обновим наш локальный индекс пакета перед установкой:
sudo apt-get update
sudo apt-get install nfs-kernel-server
Как только эти пакеты установлены, переключитесь на клиентский сервер.
На клиенте
На клиентском сервере нам нужно установить пакет под названиемnfs-common
, который обеспечивает функциональность NFS без включения ненужных серверных компонентов. Опять же, мы обновим локальный индекс пакета перед установкой, чтобы у нас была актуальная информация:
sudo apt-get update
sudo apt-get install nfs-common
Теперь, когда на обоих серверах есть необходимые пакеты, мы можем приступить к их настройке.
[[шаг-2 -—- создание-общие-каталоги-на-хосте]] == Шаг 2 - Создание общих каталогов на хосте
Мы собираемся совместно использовать два отдельных каталога с различными настройками конфигурации, чтобы проиллюстрировать два ключевых способа настройки монтирования NFS в отношении доступа суперпользователя.
Суперпользователи могут делать что угодно в своей системе. Однако смонтированные NFS каталоги не являются частью системы, в которой они смонтированы, поэтому по умолчанию сервер NFS отказывается выполнять операции, требующие привилегий суперпользователя. Это ограничение по умолчанию означает, что суперпользователи на клиенте не могут записывать файлы в качестве пользователя root, переназначать владельца или выполнять любые другие задачи суперпользователя при монтировании NFS.
Однако иногда в клиентской системе есть доверенные пользователи, которым необходимо выполнять эти действия в смонтированной файловой системе, но которым не нужен суперпользовательский доступ на хосте. Сервер NFS может быть настроен таким образом, чтобы это позволяло, хотя это вносит элемент риска, поскольку пользовательcould получает root-доступ ко всей хост-системе.
Пример 1. Экспорт универсального монтирования
В первом примере мы создадим универсальное монтирование NFS, которое использует поведение NFS по умолчанию, чтобы затруднить взаимодействие пользователя с привилегиями root на клиентском компьютере с хостом с использованием этих привилегий суперпользователя клиента. Вы можете использовать что-то подобное для хранения файлов, загруженных с помощью системы управления контентом, или для предоставления пользователям свободного пространства для совместного доступа к файлам проекта.
Сначала создайте общий каталог с именемnfs
:
sudo mkdir /var/nfs/general -p
Поскольку мы создаем его с помощьюsudo
, каталог принадлежит пользователю root на хосте.
ls -la /var/nfs/general
Output4 drwxr-xr-x 2 root root 4096 Jul 25 15:26 .
NFS преобразует любые операцииroot
на клиенте в учетные данныеnobody:nogroup
в качестве меры безопасности. Поэтому нам нужно изменить владельца каталога, чтобы он соответствовал этим учетным данным.
sudo chown nobody:nogroup /var/nfs/general
Этот каталог теперь готов к экспорту.
Пример 2. Экспорт домашнего каталога
Во втором примере цель состоит в том, чтобы сделать домашние каталоги пользователей, хранящиеся на хосте, доступными на клиентских серверах, предоставляя доверенным администраторам этих клиентских серверов доступ, необходимый им для удобного управления пользователями.
Для этого мы экспортируем каталог/home
. Поскольку он уже существует, нам не нужно его создавать. Мы также не будем менять разрешения. Если мыdid, это вызовет всевозможные проблемы для любого, у кого есть домашний каталог на хост-машине.
[[step-3 -—- configuring-the-nfs-exports-on-the-host-server]] == Шаг 3. Настройка экспорта NFS на хост-сервере
Далее мы углубимся в файл конфигурации NFS, чтобы настроить совместное использование этих ресурсов.
Откройте файл/etc/exports
в текстовом редакторе с правами root:
sudo nano /etc/exports
В файле есть комментарии, показывающие общую структуру каждой строки конфигурации. Синтаксис в основном:
/etc/exports
directory_to_share client(share_option1,...,share_optionN)
Нам нужно создать строку для каждого из каталогов, которые мы планируем использовать. Поскольку у нашего примера клиента IP-адрес203.0.113.256
, наши строки будут выглядеть следующим образом. Обязательно измените IP-адреса в соответствии с вашим клиентом:
/etc/exports
/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: эта опция предотвращает проверку поддерева, то есть процесс, при котором хост должен проверять, действительно ли файл все еще доступен в экспортированном дереве для каждого запроса. Это может вызвать много проблем, когда файл переименовывается, когда клиент его открыл. Почти во всех случаях лучше отключить проверку поддерева.
-
no_root_squash: по умолчанию NFS переводит запросы от пользователя root удаленно к непривилегированному пользователю на сервере. Это было задумано как средство безопасности, чтобы предотвратить использование учетной записи root на клиентском компьютере файловой системы хоста в качестве root.
no_root_squash
отключает это поведение для определенных акций.
Когда вы закончите вносить изменения, сохраните и закройте файл. Затем, чтобы сделать общие ресурсы доступными для настроенных клиентов, перезапустите сервер NFS с помощью следующей команды:
sudo systemctl restart nfs-kernel-server
Однако прежде чем вы сможете использовать новые общие ресурсы, вы должны убедиться, что трафик к общим ресурсам разрешен правилами брандмауэра.
[[step-4 -—- adjusting-the-firewall-on-the-host]] == Шаг 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 203.0.113.256 to any port nfs
Вы можете проверить изменение, набрав:
sudo ufw status
Вы должны увидеть трафик, разрешенный через порт 2049 в выходных данных:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.256
OpenSSH (v6) ALLOW Anywhere (v6)
Это подтверждает, что UFW будет разрешать только трафик NFS через порт 2049 с нашего клиентского компьютера.
[[step-5 -—- create-the-mount-points-on-the-client]] == Шаг 5. Создание точек монтирования на клиенте
Теперь, когда хост-сервер настроен и обслуживает его общие ресурсы, мы подготовим нашего клиента.
Чтобы сделать удаленные общие ресурсы доступными на клиенте, нам нужно смонтировать каталог хоста в пустой каталог клиента.
[.note] #Note: Если в вашей точке монтирования есть файлы и каталоги, как только вы подключите общий ресурс NFS, они будут скрыты. Если вы монтируете уже существующий каталог, убедитесь, что он пуст.
#
Мы создадим две директории для наших монтировок:
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
[[шаг-6 -—- монтирование-каталоги-на-клиенте]] == Шаг 6. Монтирование каталогов на клиенте
Теперь, когда у нас есть место для размещения удаленных общих ресурсов и мы открыли брандмауэр, мы можем смонтировать общие ресурсы, обратившись к нашему хост-серверу, который в этом руководстве -203.0.113.0
, например:
sudo mount 203.0.113.0:/var/nfs/general /nfs/general
sudo mount 203.0.113.0:/home /nfs/home
Эти команды должны монтировать общие ресурсы с хост-компьютера на клиентский компьютер. Вы можете перепроверить, что они успешно смонтированы несколькими способами. Вы можете проверить это с помощью простой командыmount
илиfindmnt
, ноdf -h
даст вам более удобочитаемый вывод, иллюстрирующий, как по-разному отображается использование диска для общих ресурсов nfs:
df -h
OutputFilesystem 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
Output36K /nfs/home
Это показывает нам, что содержимое всего домашнего каталога использует только 20 КБ доступного пространства.
[[step-7 -—- testing-nfs-access]] == Шаг 7. Тестирование доступа по 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
, владельцем файла по умолчанию является none: nogroup. Суперпользователи клиента не смогут выполнять типичные административные действия, такие как смена владельца файла или создание нового каталога для группы пользователей, в этом смонтированном NFS-ресурсе.
Пример 2: Домашний каталог Share
Чтобы сравнить разрешения общего ресурса общего доступа с общим каталогом домашнего каталога, создайте файл домашнего каталога таким же образом:
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
. Однако в этом случае он принадлежит пользователю root, потому что мы переопределили поведение по умолчанию, когда указали параметрno_root_squash
для этого монтирования. Это позволяет нашим корневым пользователям на клиентском компьютере выступать в роли root и делает администрирование учетных записей пользователей намного более удобным. В то же время это означает, что нам не нужно предоставлять этим пользователям root-доступ на хосте.
[[шаг-8 -—- монтирование-удаленных-nfs-каталогов-при загрузке]] == Шаг 8 - Монтирование удаленных каталогов NFS при загрузке
Мы можем смонтировать удаленные общие ресурсы NFS автоматически при загрузке, добавив их в файл/etc/fstab
на клиенте.
Откройте этот файл с правами root в вашем текстовом редакторе:
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
[.note] #Note: Более подробную информацию о параметрах, которые мы здесь указываем, можно найти на странице руководства, которая описывает монтирование NFS вfstab
с помощью командыman nfs
.
#
Клиентский сервер автоматически подключит удаленные разделы при загрузке, хотя может потребоваться несколько минут для установления соединения и доступности общих ресурсов.
[[step-9 -—- unmounting-an-nfs-remote-share]] == Шаг 9 - Отключение удаленного общего ресурса NFS
Если вы больше не хотите, чтобы удаленный каталог монтировался в вашей системе, вы можете размонтировать его, выйдя из структуры каталогов общего ресурса и размонтировав его следующим образом:
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
Это удалит удаленные общие ресурсы, оставляя доступным только ваше локальное хранилище:
df -h
Output
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
Если вы также хотите предотвратить их повторную установку при следующей перезагрузке, отредактируйте/etc/fstab
и либо удалите строку, либо закомментируйте ее, поместив символ # в начало строки. Вы также можете предотвратить автоматическое монтирование, удалив опциюauto
, которая позволит вам монтировать его вручную.
Заключение
В этом руководстве мы создали хост NFS и проиллюстрировали некоторые ключевые поведения NFS, создав два разных монтирования NFS, которыми мы поделились с нашим клиентом NFS. Если вы хотите внедрить NFS в производство, важно отметить, что сам протокол не зашифрован. В случаях, когда вы делитесь файлами, предназначенными для публичного доступа, это не вызывает серьезных проблем.
Однако если вы используете NFS для личных данных, вам нужно решить, как вы хотите защитить эти данные. Возможно, вам удастся направить NFS через SSH или VPN-соединение, чтобы создать более безопасный интерфейс, но это часто приводит к серьезной потере производительности. Если производительность является проблемой, рассмотритеSSHFS. Это немного медленнее, чем незашифрованный трафик NFS, но обычно намного быстрее, чем туннельный NFS. Аутентифицированное шифрование Kerberos для NFS является еще одним вариантом для изучения.