NFS или сетевая файловая система – это протокол распределенной файловой системы, который позволяет вам совместно использовать каталоги по сети. С помощью NFS вы можете монтировать удаленные каталоги в своей системе и работать с файлами на удаленном компьютере, как если бы они были локальными файлами.
По умолчанию протокол NFS не зашифрован и не обеспечивает аутентификацию пользователя. Доступ к серверу ограничен IP-адресами или именами хостов клиента.
В этой статье объясняется, как настроить сервер NFSv4 в Ubuntu 20.04. Мы также покажем вам, как смонтировать файловую систему NFS на клиентском компьютере.
Мы будем использовать две машины: одна с Ubuntu 20.04, которая будет действовать как сервер NFS, а другая с любым другим дистрибутивом Linux, на котором мы будем монтировать общий ресурс. Сервер и клиенты должны иметь возможность общаться друг с другом по частной сети. Вы можете использовать общедоступные IP-адреса и настроить брандмауэр сервера, чтобы разрешить трафик на порт 2049только из надежных источников.
Машины в этом примере имеют следующие IP-адреса:
NFS Server IP: 192.168.33.10 NFS Clients IPs: From the 192.168.33.0/24 range
Первым шагом является настройка сервера NFS. Мы установим необходимые пакеты, создадим и экспортируем каталоги NFS и настроим брандмауэр.
Пакет сервера NFS обеспечивает поддержку пространства пользователя, необходимую для запуска сервера ядра NFS. Чтобы установить пакет, запустите:
sudo apt update sudo apt install nfs-kernel-server
После завершения установки службы NFS запустятся автоматически.
В Ubuntu 20.04 NFS версии 2 отключена. Версии 3 и 4 включены. Вы можете убедиться в этом, выполнив команду cat:
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
NFSv2 сейчас довольно старый, и нет причин для его включения.
Конфигурация сервера NFS определяется файлы /etc/default/nfs-kernel-server и /etc/default/nfs-common. Для большинства ситуаций достаточно настроек по умолчанию.
Сервер NFSv4 использует глобальный корневой каталог, и экспортируемые каталоги относятся к этому каталогу. Вы можете связать точку монтирования общего ресурса с каталогами, которые хотите экспортировать, с помощью привязки монтирования.
В этом примере мы установим каталог /srv/nfs4 как корень NFS. Чтобы лучше объяснить, как можно настроить монтирование NFS, мы собираемся поделиться двумя каталогами (/var/www и /opt/backups) с разными настройками конфигурации. Объект /var/www/ принадлежит пользователю www-data, а /opt/backups принадлежит root.
Сначала создайте корневой каталог и точки монтирования общего ресурса:
sudo mkdir -p /srv/nfs4/backups sudo mkdir -p /srv/nfs4/www
Привязать монтирование каталогов к точкам монтирования общего ресурса:
sudo mount --bind /opt/backups /srv/nfs4/backups sudo mount --bind /var/www /srv/nfs4/www
Чтобы сделать привязку монтирования постоянным после перезагрузки, откройте файл /etc/fstab:
sudo nano /etc/fstab
и добавьте следующие строки:
/opt/backups /srv/nfs4/backups none bind 0 0 /var/www /srv/nfs4/www none bind 0 0
Следующим шагом является добавление файловых систем, которые будут экспортированы, и клиентов, которым разрешен доступ к этим общим папкам в файл /etc/exports.
Каждая строка для экспортированной файловой системы имеет следующий вид:
export host(options)
Где export находится экспортированный каталог, host это имя хоста или IP-адрес/диапазон, которые могут получить доступ к экспорту, и options являются параметрами хоста.
Откройте файл /etc/exports и добавьте следующие строки:
sudo nano /etc/exports
/srv/nfs4 192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0) /srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check) /srv/nfs4/www 192.168.33.20(rw,sync,no_subtree_check)
Первая строка содержит параметр fsid=0, определяющий корневой каталог NFS (/srv/nfs4). Доступ к этому тому NFS разрешен только клиентам из подсети 192.168.33.0/24. Опция crossmnt требуется для совместного использования каталогов, которые являются подкаталогами экспортированного каталога.
Вторая строка показывает, как указать несколько правил экспорта для одной файловой системы. Доступ для чтения разрешен для всего диапазона 192.168.33.0/24, а доступ для чтения и записи только для IP-адреса 192.168.33.3. Опция sync указывает NFS записывать изменения на диск перед ответом.
Последняя строка не требует пояснений. Для получения дополнительной информации обо всех доступных опциях введите man exportsв вашем терминале.
Сохраните файл и экспортируйте акции:
sudo exportfs -ar
Вам нужно запускать указанную выше команду каждый раз, когда вы изменяете файл /etc/exports. Если есть какие-либо ошибки или предупреждения, они будут отображаться на терминале.
Чтобы просмотреть текущий активный экспорт и его состояние, используйте:
sudo exportfs -v
В вывод будут включены все акции с их опционами. Как видите, есть также параметры, которые мы не определили в файле /etc/exports. Это параметры по умолчанию, и если вы хотите их изменить, вам необходимо явно установить эти параметры.
/srv/nfs4/backups 192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash) /srv/nfs4/www 192.168.33.20(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash) /srv/nfs4 192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash) /srv/nfs4/backups 192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
В Ubuntu root_squash включен по умолчанию. Это один из наиболее важных параметров безопасности NFS. Он запрещает пользователям root, подключенным с клиентов, иметь привилегии root на подключенных общих ресурсах путем сопоставления root UID и GID с nobody/nogroup UID/GID.
Чтобы пользователи на клиентских машинах имели доступ, NFS ожидает, что идентификаторы пользователя и группы клиента совпадают с идентификаторами на сервере. Другой вариант – использовать функцию отображения идентификаторов NFSv4, которая переводит идентификаторы пользователей и групп в имена и наоборот.
Вот и все. На этом этапе вы настроили сервер NFS на своем сервере Ubuntu. Теперь вы можете перейти к следующему шагу и настроить клиентов и подключиться к серверу NFS.
Если вы устанавливаете Jenkins на удаленный сервер Ubuntu, защищенный брандмауэром , вам необходимо включить трафик на порт NFS:
sudo ufw allow from 192.168.33.0/24 to any port nfs
Проверьте изменение:
sudo ufw status
Вывод должен показать, что трафик на порт 2049 разрешен:
To Action From -- ------ ---- 2049 ALLOW 192.168.33.0/24 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6)
Теперь, когда сервер NFS настроен и общие ресурсы экспортированы, следующим шагом является настройка клиентов и монтирование удаленных файловых систем.
Мы сосредоточимся на системах Linux, но вы также можете подключить общий ресурс NFS на компьютерах с macOS и Windows.
На клиентских машинах нам нужно установить только инструменты, необходимые для монтирования удаленной файловой системы NFS.
sudo apt update sudo apt install nfs-common
sudo yum install nfs-utils
Мы будем работать на клиентской машине с IP 192.168.33.20, которая имеет доступ для чтения и записи к файловой системе /srv/nfs4/www и доступ только для чтения к файловой системе /srv/nfs4/backups.
Создайте два новых каталога для точек монтирования:
sudo mkdir -p /backups sudo mkdir -p /srv/www
Вы можете создавать каталоги в любом месте, где захотите.
Смонтируйте экспортированные файловые системы с помощью команды mount:
sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www
Где 192.168.33.10IP сервера NFS. Вы также можете использовать имя хоста вместо IP-адреса, но оно должно быть разрешено клиентским компьютером. Обычно это делается путем сопоставления имени хоста с IP-адресом в файле /etc/hosts.
При монтировании файловой системы NFSv4 опускайте корневой каталог NFS. Используйте /backups вместо /srv/nfs4/backups.
Убедитесь, что удаленные файловые системы успешно смонтированы, используя команду mount или команду df:
df -h
Команда распечатает все смонтированные файловые системы. Последние две строки – это смонтированные совместные ресурсы:
Filesystem Size Used Avail Use% Mounted on udev 951M 0 951M 0% /dev tmpfs 199M 676K 199M 1% /run /dev/sda3 124G 2.8G 115G 3% / tmpfs 994M 0 994M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 994M 0 994M 0% /sys/fs/cgroup /dev/sda1 456M 197M 226M 47% /boot tmpfs 199M 0 199M 0% /run/user/1000 192.168.33.10:/backups 124G 2.8G 115G 3% /backups 192.168.33.10:/www 124G 2.8G 115G 3% /srv/www
Чтобы сделать монтирование постоянным при перезагрузке, откройте файл /etc/fstab и добавьте следующие строки:
sudo nano /etc/fstab
192.168.33.10:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev 0 0 192.168.33.10:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev 0 0
Для получения информации о доступных параметрах монтирования файловой системы NFS введите man nfs в свой терминал.
Другой вариант монтировать удаленные файловые системы – использовать инструмент autofs или создать модуль systemd.
Давайте протестируем доступ к общим ресурсам, создав для каждой из них новый файл.
Сначала попробуйте создать в каталоге тестовый файл /backups с помощью команды touch:
sudo touch /backups/test.txt
Файловая система /backup экспортируется как только для чтения, и, как ожидается, вы увидите сообщение об ошибке Permission denied:
touch: cannot touch ‘/backups/test’: Permission denied
Затем попробуйте создать тестовый файл в каталоге /srv/www в качестве корневого с помощью команды sudo:
sudo touch /srv/www/test.txt
Вы снова увидите сообщение Permission denied.
touch: cannot touch ‘/srv/www’: Permission denied
Если вы помните, каталог /var/www принадлежит к пользователю www-data, и эта доля имеет опцию root_squash, которая отображает набор корневого пользователя к пользователю nobody и группе nogroup, которая не имеет права на запись на удаленном ресурсе.
Предполагая, что у вас есть www-data на клиентском компьютере с тем же, что UID и GID на удаленном сервере (что должно быть, если, например, вы установили nginx на обеих машинах), вы можете попытаться создать файл как пользователь www-data:
sudo -u www-data touch /srv/www/test.txt
Команда не покажет никаких выходных данных, что означает, что файл был успешно создан.
Чтобы проверить это, перечислите файлы в каталоге /srv/www:
ls -la /srv/www
На выходе должен отобразиться только что созданный файл:
drwxr-xr-x 3 www-data www-data 4096 Apr 10 22:18 . drwxr-xr-x 3 root root 4096 Apr 10 22:29 .. -rw-r--r-- 1 www-data www-data 0 Apr 10 21:58 index.html -rw-r--r-- 1 www-data www-data 0 Apr 10 22:18 test.txt
Если удаленный общий ресурс NFS больше не нужен, вы можете размонтировать его, как и любую другую подключенную файловую систему, с помощью команды umount.
Например, чтобы отключить общий ресурс /backup, вы должны запустить:
sudo umount /backups
Если точка монтирования определена в файле /etc/fstab, убедитесь, что вы удалили строку или закомментировали ее, добавив # в начале строки.
Мы показали вам, как настроить сервер NFS и как смонтировать удаленные файловые системы на клиентских машинах. Если вы внедряете NFS в производство и обмениваетесь разумными данными, рекомендуется включить аутентификацию Kerberos.
В качестве альтернативы NFS вы можете использовать SSHFS для монтирования удаленных каталогов через SSH-соединение. SSHFS по умолчанию зашифрован, и его гораздо проще настроить и использовать.
Не стесняйтесь оставлять комментарии, если у вас есть вопросы.