The Сетевая файловая система (NFS) — это распределенное решение для хранения данных. Это протокол файловой системы, который позволяет монтировать удаленные каталоги на локальном сервере и использовать их так, как будто это локальное хранилище. NFS позволяет нескольким клиентам совместно использовать удаленное хранилище. Он хорошо подходит для сред, в которых регулярно требуются общие ресурсы. NFS построен на системе ONC RPC (Open Network Computing Remote Procedure Call). Это открытый стандарт, определенный в RFC (Request for Comments). Это позволяет любому желающему реализовать этот протокол.
В этом руководстве мы рассмотрим шаги по установке и настройке монтирования NFS на Ubuntu 20.04.
Предварительные требования
Как следует из описания NFS, конфигурация NFS состоит из двух частей:
-
Хост: Физически хранит данные и предоставляет доступ к хранилищу «клиентским» системам.
-
Клиент: Система, которая подключается к «хосту» и использует удаленное хранилище так, как будто оно локальное.
Для нашей демонстрации мы будем использовать два сервера, оба под управлением Ubuntu 20.04. Вот простое руководство по том, как настроить сервер Ubuntu. На протяжении всего руководства эти серверы будут называться хостом и клиентом. Обратите внимание, что действия для клиента будут одинаковыми, даже если их несколько.
Серверам назначены следующие IP-адреса. Эти серверы размещены на CloudSigma:
-
хост: 31.171.240.79
-
клиент: 31.171.250.109
Обязательно замените их соответствующими IP-адресами.
Установка NFS
NFS легко доступен в официальных репозиториях Ubuntu. Существуют различные пакеты программного обеспечения для систем хоста и клиента .
-
Установка NFS на хосте
На хосте нам нужны компоненты, которые позволяют машине работать в качестве NFS- хоста. Они поставляются в виде пакета nfs-kernel-server. Ubuntu использует APT в качестве менеджера пакетов. Сначала запустите терминал и обновите базу данных пакетов APT :
|
1 |
host$ sudo apt update |

Next, install the nfs-kernel-server package. If necessary, APT will take care of any additional dependencies:
|
1 |
host$ sudo apt install nfs-kernel-server |

-
Установка NFS на клиенте
На системе client нам нужна функция подключения к каталогам host по сети. Ей не требуется функциональность сервера NFS. В Ubuntu она поставляется в пакете nfs-common. Обновите базу данных пакетов APT :
|
1 |
client$ sudo apt update |

Затем установите пакет nfs-common :
|
1 |
$ sudo apt install nfs-common |

Общие каталоги на хосте
Далее мы собираемся открыть общий доступ к двум отдельным каталогам, каждый из которых имеет свою конфигурацию. Мы продемонстрируем два основных способа работы монтирования NFS в отношении доступа суперпользователя. По умолчанию суперпользователи имеют право выполнять любые действия во всей системе. Однако каталоги, смонтированные по NFS, не являются частью системы, в которой они смонтированы. Сервер NFS откажется выполнять любую операцию, требующую привилегий суперпользователя. Это ограничение означает, что клиенты не имеют полномочий на запись, переназначение прав собственности и другие задачи суперпользователя на смонтированных ресурсах NFS.
Можно разрешить определенным доверенным пользователям выполнять эти задачи на смонтированных файловых системах. Однако это связано с определенным риском, поскольку такой client потенциально может получить полный доступ к host. Этот риск можно снизить с помощью правильного управления правами пользователей. В Linux файл sudoers управляет всеми привилегиями пользователей в системе. Для получения дополнительной информации вы можете ознакомиться с нашим руководством по настройке файла sudoers в Linux.
-
Монтирование общего назначения
Первым примером будет монтирование NFS общего назначения с поведением NFS по умолчанию. При таком подходе клиенту крайне сложно выполнять действия суперпользователя на смонтированных ресурсах. Этот тип монтирования NFS обычно развертывается для хранения файлов, загрузки с использованием CMS (системы управления контентом), совместного использования файлов проектов и т. д.
Следующие шаги должны быть выполнены на системе host. Сначала создайте каталог для общего доступа с именем nfs:
|
1 |
host$ sudo mkdir -pv /var/nfs/general |

Поскольку директория была создана с sudo привилегиями, владельцем будет root:
|
1 |
$ ls -la /var/nfs/general |

По умолчанию NFS будет преобразовывать любые операции root со стороны клиента в nobody:nogroup учетные данные в целях безопасности. Для согласованности измените владельца директории в соответствии с этими учетными данными:
|
1 |
host$ sudo chown nobody:nogroup /var/nfs/general |
![]()
-
Домашняя директория
Второй пример — сделать домашнюю директорию пользователя host доступной для клиентов. Доверенные администраторы с выбранных клиентов могут получить доступ для удобного управления пользователями. /home директория существует по умолчанию, поэтому создавать ее не нужно. Что касается прав доступа к директории, нет необходимости вносить какие-либо изменения, так как это принесет больше проблем, чем пользы.
Настройка экспорта NFS
Директории для совместного использования созданы. Далее необходимо настроить NFS, чтобы сделать их доступными для клиентов. NFS использует конфигурационный файл для отслеживания того, какими директориями делиться. Откройте следующий конфигурационный файл NFS в текстовом редакторе по вашему выбору:
|
1 |
host$ sudo nano /etc/exports |

Раздел комментариев в файле описывает общую структуру синтаксиса конфигурации. Вкратце, любая директория должна быть объявлена в следующем формате:
|
1 |
$ <directory> <client>(<option_1>,<option_2>,...,<option_N>) |
Для двух директорий, которыми мы решили поделиться, конфигурация будет выглядеть следующим образом. Обе директории имеют практически одинаковые параметры конфигурации:
|
1 2 3 |
host$/var/nfs/general 31.171.250.221(rw,sync,no_subtree_check) host$ /home 31.171.250.221(rw,sync,no_root_squash,no_subtree_check) |

Вот краткое описание параметров конфигурации:
-
rw: Клиенту предоставляются права как на чтение, так и на запись тома.
-
sync: Заставляет NFS записывать изменения на диск перед ответом. Это обеспечивает более стабильную и согласованную работу. Ответ будет отражать фактическое состояние удаленного тома. Однако операции с файлами будут выполняться медленнее.
-
no_subtree_check: Отключает проверку поддерева. Если ее не отключить, хосты будут вынуждены проверять существование файла в экспортированном дереве при каждом запросе от клиента. Это может привести ко многим проблемам, например, к переименованию файла во время его использования клиентом. В большинстве случаев отключение проверки поддерева является оптимальным решением.
-
no_root_squash: Как упоминалось ранее, NFS будет преобразовывать любой запрос от удаленного пользователя root в запрос от непривилегированного пользователя. Это предусмотренная функция безопасности для предотвращения нежелательного доступа к хост-системе. Однако использование этой опции отключит данное поведение.
Сохраните конфигурационный файл и выйдите из редактора. Чтобы изменения вступили в силу, перезапустите сервер NFS:
|
1 |
host$ sudo systemctl restart nfs-kernel-server |
![]()
Настройка брандмауэра
Для любого сервера правильная настройка брандмауэра является обязательной. Предполагая, что вы соответствующим образом настроили свой сервер Ubuntu 20.04, брандмауэр UFW должен быть активен. Это простой, но мощный брандмауэр, который поставляется с большинством дистрибутивов Linux. Для начинающих вот краткое руководство, объясняющее UFW, принцип его работы и распространенные примеры использования UFW.
По умолчанию брандмауэр блокирует весь входящий и исходящий трафик. Чтобы сервер NFS мог правильно подключаться и обмениваться трафиком, нам нужно добавить исключение для протокола NFS. Сначала проверьте статус брандмауэра. Он также выведет все текущие правила:
|
1 |
host$ sudo ufw status |

Как мы видим, в систему разрешен только SSH-трафик. Нам нужно добавить исключение, чтобы разрешить трафик NFS.
В большинстве случаев настоятельно рекомендуется использовать наиболее строгое правило, которое при этом разрешает необходимый трафик. Таким образом, мы разрешим подключение к хосту только определенным клиентам:
|
1 |
host$ sudo ufw allow from 31.171.250.221 to any port nfs |

После этого снова проверьте статус брандмауэра:
|
1 |
host$ sudo ufw status |

Создание точки монтирования
Теперь сервер готов разрешить клиентской системе подключиться по протоколу NFS. Далее нам нужно подготовить клиента. Чтобы получить доступ к удаленному тому, его необходимо смонтировать локально на клиенте. Что касается точки монтирования, рекомендуется использовать выделенный пустой каталог.
Для двух удаленных томов создайте две отдельные точки монтирования:
|
1 |
client$ sudo mkdir -pv /nfs/general |

|
1 |
client$ sudo mkdir -pv /nfs/home |

Теперь, когда точки монтирования готовы, вам нужно смонтировать удаленные тома:
|
1 |
client$ sudo mount 31.171.240.236:/var/nfs/general /nfs/general |
![]()
|
1 |
client$ sudo mount 31.171.240.236:/home /nfs/home |
![]()
Мы можем проверить, было ли монтирование успешным. Проверьте список всех смонтированных томов:
|
1 |
client$ df -h |

Вуаля! Удаленные тома успешно смонтированы. Мы также можем проверить использование пространства с помощью следующей команды:
|
1 |
client$ du -sh /nfs/home |

Тестирование доступа к NFS
На данный момент удаленные тома смонтированы правильно. Однако в этом не будет никакого смысла, если клиент не сможет читать/записывать данные на удаленном томе. Для проверки создайте тестовый файл на смонтированном(ых) томе(ах) NFS. Здесь файл будет создан с привилегиями root для проверки правильности работы конфигураций, специфичных для root:
|
1 |
client$ sudo touch /nfs/general/write_test.txt |
![]()
Затем проверьте владельца файла:
|
1 |
client$ ls -l /nfs/general/write_test.txt |

Как мы видим, NFS транслирует владельца файла в nobody:nogroup. Каталог /var/nfs/ general принадлежит nobody:nogroup, поэтому NFS транслирует владельца файла. Время протестировать другую точку монтирования NFS:
|
1 |
client$ sudo touch /nfs/home/test_home.txt |
![]()
Проверьте существование и владельца файла:
|
1 |
Client $ ls -l /nfs/home/test_home.txt |

В этом случае NFS не транслировала владельца файла. Этот клиент был настроен на возможность выполнения административных действий. Более того, оригинальный каталог host directory /home не принадлежит nobody:nogroup.
Дополнительные хитрости
-
Монтирование при загрузке
До сих пор нам приходилось вручную монтировать том NFS в локальный каталог. Если их не размонтировать, монтирования NFS будут сохраняться до перезагрузки системы. Если том NFS используется регулярно, то ручное монтирование становится крайне утомительным. В случае нескольких монтирований NFS монтировать их вручную одно за другим непрактично.
Используя файл /etc/fstab кода, мы можем автоматизировать этот процесс. Во время загрузки этот скрипт автоматически смонтирует тома NFS в целевые точки монтирования. Откройте файл в текстовом редакторе:
|
1 |
client$ sudo nano /etc/fstab |

Добавьте следующие строки для монтирования удаленных томов хост-системы:
|
1 2 3 |
client$ 31.171.240.236:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 client$31.171.240.236:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 |

Сохраните скрипт и закройте текстовый редактор. При следующей загрузке Linux автоматически смонтирует удаленные тома. Обратите внимание, что загрузка системы может занять некоторое время, так как она подключается и монтирует тома.
-
Размонтирование тома NFS
Если удаленный том больше не нужен, размонтирование томов удалит их из клиентской системы. Однако перед размонтированием убедитесь, что ни одно приложение или скрипт не использует удаленный том. Размонтирование томов NFS аналогично размонтированию любых других томов. В данном случае размонтируйте /nfs/home и /nfs/general:
|
1 2 3 |
client$ sudo umount /nfs/home client$ sudo umount /nfs/общее |

Затем проверьте действие:
|
1 |
клиент$ df -h |

Заключение
В этом руководстве мы создали NFS-сервер и продемонстрировали некоторые основы удаленного совместного доступа по NFS. Если вы планируете использовать NFS в рабочей среде, помните, что протокол NFS не шифруется. Это может создать определенные проблемы с безопасностью, например, атаки типа «человек посередине» (man-in-the-middle).
Приятной работы!
Комментарии
Комментариев пока нет. Будьте первым.