Настройка общей папки в Ubuntu/Debian с помощью NFS

Как-то так исторически сложилось, что я не подружился с Samba. Ну, не могу настроить конфиг с первого раза, чтобы всё заработало. Бесит =) И как-то оно всегда у меня медленно работает и через «край земли»… Не нравится, в общем. Это субъективно.

Что такое NFS (Network File System)

NFS первых версия запили в компании Sun Microsystems ещё в 1984 году, когда современные буратины были ещё саженцами. Запилили они его чтобы обеспечить обмен, точнее общий достп к файлам, по сети. Версий было несколько, самая последняя — NFS4.

Есть мнение, что работает NFS следующим образом:

  1. Клиент NFS запрашивает у сервера NFS файл/папку через удалённый вызов RPC
  2. Сервак проверяет наличие файла и разрешение на доступ конкретному клиенту
  3. Сервер удалённо монтирует запрошенный файл/каталог на машине клиента
  4. Сервер предоставляет доступ через виртуальное соединение
  5. Клиент обращается к файлу как к локальному ресурсу

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

Чем NFS лучше Samba

В целом, те же яйца, только в профиль.

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

Но по моему субъективному мнению — проще, строже и не лагает. По крайней мере у меня. НАТИВНЕЕ! Ух! =)) Я же тут валю с Window понемногу, по крайне мере в области HomeLab сервера.

Что надо уметь чтобы настроить NFS

  1. Надо уметь править текстовые файлы. Возможно, из-под root’а.
  2. Печатать без ошибок
  3. Понимать, чего ты хочешь от Linux

Пора бы приступить к настройке

Точно, а то что-то я тут «растёкся мыслью по древу». Настроение поболтать, видимо.

Для простоты предположим, что входные данные у нас такие:

  1. Сервер у нас идёт с адресом 192.168.1.10
  2. Клиент с адресом 192.168.1.100
  3. Расшаривать будем папку «/home/serveradmin/share folder» (тут специально пробел, в методических целях. Так-то шлите пробел нахер, он всегда подкинет вам проблем)
  4. Монтировать папку на клиенте будем в /mnt/server_folder

Адреса сервера и клиента в любой уважающей себя сети должны и будут, конечно, статичными (гуглите и нагуглите)

Настроить сервер NFS

Для начала нужно на СЕРВЕРЕ отредактировать файл /etc/exports . В linux это можно сделать несколькими способами, в зависимости от версии оного и от установленных пакетов.

Но для начала нужно убедиться, чтобы этот файл у вас был. Его может не быть, и скорее всего, не будет. Убедиться в этом просто:

cat /etc/exports

Если выведет:

cat: /etc/exports: No such file or directory

Значит, файла у вас нет. Нужно выполнить несколько команд, понятных каждому:

sudo apt update
sudo apt install nfs-common
sudo apt install nfs-kernel-server

Файл /etc/exports должен появиться.

Важно! Есть мнение, что перед установкой nfs-kernel-server нужно создать папку для шаринга, но у меня и так всё работало всегда.

Итак, редактируем файл. Это можно сделать несколькими способами:

либо sudo nano /etc/exports
либо sudo vim /etc/exports
либо sudo mcedit /etc/exports

В сам файл (В КОНЕЦ файла!) записывает строку, которая и сделает нашу «шару» общедоступной папкой для клиента:

"/home/serveradmin/share folder" 192.168.1.100(rw,sync,no_subtree_check,root_squash)

Тут важны кавычки, как раз из-за пробела в названии папки. Если бы пробела не было в пути, то вавычки можно было бы не ставить. ip можно указывать как маску: 192.168.1.* тогда все машины из подсети смогут использовать шару. Но я люблю адресно указывать клиентов, например, вот так, просто через пробел в этой же строке:

«/home/serveradmin/share folder» 192.168.1.100(rw,sync,no_subtree_check,root_squash) 192.168.1.101(rw,sync,no_subtree_check,root_squash) 192.168.1.102(rw,sync,no_subtree_check,root_squash)

Параметры в скобках тоже очень важны:

  • rw (ro) — модификатор доступа. rw — чтение и запись. ro — только чтение.
  • sync (async) — не обрабатывать запрос на запись, пока предыдущая запись не будет зафиксирована на диске. Можно делать async, он быстрее. Но и менее безопасный с точки зрения стабильности и сохранности файла. Но async вроде более щадящий для SSD, т.к. не дёргает диск по каждому поводу. Но sync более медленный, особенно на HDD.
  • no_subtree_check(subtree_check) — отключение проверки наличия доступа ко всему поддереву. subtree_check медленнее, но безопаснее.
  • root_squash — это про безопасность. Чтобы админ Клиента не обладал админскими правами на Сервере. Установка no_root_squash наделит админа Клиента соответствующими правами на сервере, подменив его UID

Всё, считайте Шара готова. Осталось чуть-чуть:

sudo exportfs -rv
#на всякий случай можно перезапустить сервис NFS, но у меня и так на этом этапе всегода работало:
sudo systemctl restart nfs-kernel-server  #не обязательно =) 

После ввода этой команды, если всё прошло без ошибок, то ваша шара уже торчит наружу из вашего сервера.

Как использовать NFS на Клиенте

Конечно же нужно поставить NFS:

sudo apt update
sudo apt install nfs-common

Чтобы разово (до перезагрузки) примонтировать шару вводим команду (не помню, нужны ли кавычки в данном случае вокруг серверного пути. Пробуйте сами!) :

sudo mount -t nfs 192.168.1.10:/home/serveradmin/share folder /mnt/server_folder

Чтобы навсегда примонтировать шару на Клиенте есть два способа:

  1. Отредактировать /etc/fstab
  2. Создать демона, который будет монтировать шару сам

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

Итак, первый способ:

sudo nano /etc/fstabn

В файл дописываем строчку:

192.168.1.10:/home/serveradmin/share folder /mnt/server_folder nfs defaults 0 0

Сохраняем, закрываем, вводим команду:

sudo mount -a #так же, вроде, можно sudo mount /mnt/server_folder

Итак, второй способ:

Нужно создать текстовый файл в папке /etc/systemc/system/ с названием, отражающим точку монтирования ( это важно! ). В нашем случае будет mnt-server_folder.mount

cd /etc/systemd/system
sudo touch mnt-server_folder.mount

#открыть файл на запись:
sudo nano mnt-server_folder.mount

В файле записать следующие стоки:

[Unit]
Description=Mount nfs share
After=network.target

[Mount]
What=192.168.1.10:/home/serveradmin/share folder
Where=/mnt/server_folder
Type=nfs

[Install]
WantedBy=multi-user.target

Сохранить и закрыть файл. И заставить systemd перечитать всех демонов:

sudo systemctl daemon-reload

Затем, запустить нашего:

sudo systemctl start mnt-server_folder.mount

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

sudo systemctl enable mnt-server_folder.mount

Проверить успех сразу же можно командой:

ls -l /mnt/server_folder

Доступ к NFS папке с Windows

Запускаем PowerShell без повышения прав.

Для доступа к общей папке нужно будет выполнить команду:

New-PSdrive -PSProvider FileSystem -Name D -Root \\192.168.1.1\mnt\nfs\doc -Persist

Где, D — имя будущего сетевого диска (без двоеточия!), 192.168.1.1 — ip-адрес сервера, \mnt\nfs\doc — путь до папки(абсолютный)

Отключить диск можно как из GUI — просто отключить сетевой диск, так и командой в PowerShell без привелегий:

Remove-PSdrive -Name Z

Заключение

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

  • https://www.ev3dev.org/docs/tutorials/setting-up-an-nfs-file-share/
  • https://www.opennet.ru/docs/HOWTO-RU/NFS-HOWTO-6.html
  • https://bluexp.netapp.com/blog/azure-anf-blg-linux-nfs-server-how-to-set-up-server-and-client
  • https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-20-04-ru
  • https://redos.red-soft.ru/base/server-configuring/other-utilites/nfs/