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-адресами.
Вначале установим на каждом сервере необходимые компоненты.
Установите на хосте пакет nfs-kernel-server
, которы позволит вам предоставлять доступ к вашим каталогам. Поскольку это первая операция, которую вы выполняете с помощью apt
в этом сеансе, обновите индекс локальных пакетов перед установкой:
- sudo apt update
- sudo apt install nfs-kernel-server
После установки пакетов переключитесь на клиентский сервер.
На клиенте необходимо установить пакет nfs-common
, обеспечивающий функции NFS без добавления каких-либо серверных компонентов. Обновите индекс локальных пакетов перед установкой, чтобы гарантированно использовать актуальную информацию:
- sudo apt update
- sudo apt install nfs-common
Теперь на обоих серверах установлены необходимые пакеты, и мы можем приступить к их настройке.
Мы откроем доступ к двум отдельным каталогам с разными параметрами конфигурации, чтобы продемонстрировать два способа настройки монтажа NFS с доступом суперпользователя.
Суперпользователи могут выполнять в своей системе абсолютно любые действия. Однако смонтированные каталоги NFS не являются частью системы, на которую они смонтированы, и поэтому по умолчанию сервер NFS отказывается выполнять операции, для которых нужны права суперпользователя. Это установленное по умолчанию ограничение означает, что суперпользователи клиента не могут записывать файлы от имени root, переназначать владение или выполнять любые другие задачи суперпользователя на смонтированном каталоге или томе NFS.
Инлгда доверенным пользователям клиентской системы бывает необходимо выполнить эти действия в смонтированной файловой системе, но им не нужен доступ суперпользователя к хосту. Вы можете настроить сервер NFS соответствующим образом, хотя это сопряжено с определенным риском и возможностью получения пользователем доступа root ко всей системе хоста.
В первом примере мы создадим монтируемый ресурс 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
Теперь мы готовы к экспорту каталога.
Во втором примере мы делаем домашние каталоги пользователей, хранящиеся на хосте, доступными на клиентских серверах, что даст доверенным администраторам этих клиентских серверов необходимый доступ для удобства управления пользователями.
Для этого мы экспортируем каталог /home
. Поскольку он уже существует, нам не нужно его создавать. Разрешения мы тоже менять не будем. Если бы мы сделали это, это повлекло бы множество проблем для всех пользователей, имеющих домашний каталог на хосте.
Теперь рассмотрим подробнее файл конфигурации NFS и настроим общий доступ к этим ресурсам.
Откройте на хосте файл /etc/exports
в текстовом редакторе с привилегиями root.
- sudo nano /etc/exports
Файл содержит комментарии, показывающие общую структуру каждой строки конфигурации. Синтаксис выглядит следующим образом:
directory_to_share client(share_option1,...,share_optionN)
Нам нужно создать строку для каждого каталога, к которым мы планируем предоставить общий доступ. Обязательно замените сокращение client_ip
своим реальным IP-адресом:
/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
Прежде чем вы сможете использовать новые общие ресурсы, вам нужно будет убедиться, что правила брандмауэра разрешают трафик этих общих ресурсов.
Для начала проверим статус брандмауэра, чтобы посмотреть, включен ли он. Если он включен, проверьте текущие разрешения:
- 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
на нашей клиентской системе.
Теперь сервер хоста настроен и обслуживает общие ресурсы, и мы можем приступить к подготовке клиента.
Чтобы сделать удаленные общие ресурсы доступными на клиенте, нам нужно смонтировать каталоги хоста, к которым мы хотим предоставить доступ, в пустые каталоги клиента.
Примечание. Если точка монтажа содержит файлы или каталоги, они будут скрыты при монтировании общего ресурса 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 КБ доступного пространства.
Теперь мы протестируем доступ к общим ресурсам, для чего выполним запись в каждый из них.
Запишем тестовый файл в общий ресурс /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 административные действия, такие как изменение владельца файла или создание нового каталога для группы пользователей.
Чтобы сравнить разрешения общего каталога общего назначения и общего домашнего каталога, создайте файл в каталоге /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 к хосту.
Удаленные общие ресурсы NFS можно автоматически монтировать при загрузке, для чего их нужно добавить в файл /etc/fstab
на клиентской системе.
Откройте этот файл в текстовом редакторе с привилегиями root:
- sudo nano /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
Клиент будет автоматически монтировать удаленные разделы при загрузке, хотя установка соединения и доступ к ресурсам могут требовать определенного времени.
Если вы больше не хотите использовать удаленный каталог в своей системе, вы можете демонтировать его, переместив его из структуры общих каталогов:
- 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 или другой туннель с шифрованием.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.