NFS: различия между версиями

Материал из ALT Linux Wiki
(→‎Автомонтирование: Добавлен способ монтирования через Systemd)
Строка 235: Строка 235:
либо собрать в бранчи autofs с поддержкой ipv6.
либо собрать в бранчи autofs с поддержкой ipv6.
Патчи для старых версий см. [https://bugzilla.redhat.com/show_bug.cgi?id=711844 RH#711844].
Патчи для старых версий см. [https://bugzilla.redhat.com/show_bug.cgi?id=711844 RH#711844].
==== systemd ====
Есть возможность использовать systemd, чтобы выполнять авто-монтирование конкретного ресурса при загрузке. Этот вариант имеет одно преимущество по сравнению с монтированием через fstab: если NFS-сервер по какой-либо причине будет недоступен, то клиент всё равно загрузится без ошибок.
1. Создаём на клиенте файл {{path|/lib/systemd/system/nfs-shared.service}} следующего содержания:
<source>
[Unit]
Description=Mount NFS share
Requires=network-online.target
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/mount 192.168.1.1:/home/data /mnt/shared -o fsc,hard
ExecStop=/bin/umount /mnt/shared
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target
</source>
Не забываем создать папку, в которую будет смонтирован NFS-ресурс:
<pre>mkdir -p /mnt/shared</pre>
После этого включаем сервис и запускаем его:
<pre>systemctl enable nfs-shared</pre>
<pre>systemctl start nfs-shared</pre>
Проверяем, смонтировался ли ресурс:
<pre>ls /mnt/shared</pre>
Последняя команда должна выдать содержимое NFS-ресурса.


==== subfs (для p5 и ранее, устарело) ====
==== subfs (для p5 и ранее, устарело) ====

Версия от 07:53, 3 февраля 2023

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


NFS

Важной особенностью NFS является то, что она рассчитана на использование внутри безопасной сети, рабочим станциям в которой можно доверять, поскольку авторизация доступа к файлам, смонтированным на NFS осуществляется на основании идентификатора пользователя, а подлинность пользователя каждая машина в сети проверяет самостоятельно. Вытекающим отсюда требованием является то, что пользователь должен быть зарегистрирован и на клиенте и на сервере NFS и иметь там одно и то же входное имя (login) и идентификатор. Это достигается использованием централизованной аутентификации (например, с помощью PAM и сервера аутентификации или NIS).

Для запуска nfs требуется, чтобы в системе были установлены следующие пакеты:

  • nfs-server или unfs3 (в OpenVZ VE ядерный NFS-сервер не работает)
  • rpcbind (с шестой платформы; ранее нужен был portmap)
  • nfs-clients (содержит в себе nfslock)

(в некоторых системах вместо nfs-server и nfs-clients имеется пакет nfs-utils)


Настройка сервера NFS

1. В файле /etc/exports указываются каталоги, которые мы экспортируем (разрешаем монтировать с других машин) (см. man exports).

По соображениям безопасности не рекомендуется экспортировать каталоги по протоколу NFS 3. Рекомендуется использовать NFS 4.

синтаксис для экспорта через NFS 3

/mysharedir ipaddr1(rw)  ipaddr2(ro)

Например

/mysharedir 192.168.0.1/24(rw)

В скобочках указываются дополнительные параметры:

rw — разрешены чтение и запись
ro — разрешено только чтение
no_root_squash — отключение ограничения прав root

По умолчанию пользователь root имеет на смонтированных ресурсах права пользователя nobody.

Можно указывать разрешение экспорта сразу для подсети. Например разрешение для машин из подсети 192.168.0.X строка будет выглядеть так:

/mysharedir 192.168.0.1/24(rw)

Подробную информацию о формате файла можно посмотреть командой man exports

синтаксис для экспорта через NFS 4

экспортируемые по NFS 4 каталоги имеют тот же синтаксис, что и через NFS3, за исключением того, что все они должны быть в одном подкаталоге (chroot для безопасности). Пусть это каталог /exports. Тогда необходимо подмонтировать остальные экспортированные каталоги внутрь /exports с помощью mount --bind (mount --bind /mysharedir /exports/mysharedir), прописать в fstab:

/mysharedir     /exports/mysharedir   none    bind  0  0

и прописать в /etc/exports: отличие от NFS3 в том, что нужно будет добавить nohide к mysharedir и явно обьявить корневой каталог экспорта с fsid=0.

/exports        192.168.0.1/24(fsid=0,ro,insecure,all_squash)
/exports/mysharedir    192.168.0.1/24(nohide,ro,insecure,all_squash)

настройка nfs на устаревших системах, до p8

Дополнительная настройка:

Настройка portmap (для p5 и ранее, устарело с p6)

Для работы nfs необходим сервис portmap. По умолчанию, сервис portmap запущен только на loopback (lo) интерфейсе в целях безопасности. Этого достаточно для раздачи сетевых ресурсов через nfs4.

Однако при этом не будет работать монтирование каталогов по nfs3. Если это действительно нужно, то нехотя коментируем в файле /etc/sysconfig/portmap строку PORTMAP_ARGS="-l", прописываем в /etc/hosts.allow сеть, в которую раздаем:

portmap mountd nfsd statd lockd rquotad : 192.168.ххх.0/255.255.255.0

и в /etc/hosts.deny:

portmap mountd nfsd statd lockd rquotad : ALL

после этого еще раз вдумчиво читаем http://tldp.org/HOWTO/NFS-HOWTO/security.html. и глубоко размышляем над глубокой небезопасностью запуска portmap без PORTMAP_ARGS="-l" и использования nfs3.

Настройка rpcbind для шестой платформы

Начиная с шестой платформы portmap заменен на rpcbind. Настраивается аналогично portmap. Конфигурационный файл /etc/sysconfig/rpcbind, для использования nfs 3, нужно закомментировать в этом файле строчку CONTROL_ARGS="-l"; это можно сделать не вручную, а просто дав команду:

control rpcbind server

Настройка kerberos

Для rw каталогов желательно настроить kerberos.

TODO

Для read-only можно просто закоментировать в файле /etc/sysconfig/nfs строку

SECURE_NFS=yes

Запуск NFS

Запуск NFS под systemd (p8+)

# service nfs start
systemctl status nfs.service

Если все команды прошли успешно и не выдавали ошибок, то сервер можно считать работающим. Дополнительно можно запустить команду exportfs, которая выведет текущие настройки на данный момент. В случае нормальной работы она должна вывести на экран записи из файла /etc/exports

Для запуска сервисов при старте системы:

systemctl enable nfs.service

Запуск NFS на устаревших системах до p8

1. После настройки файла необходимо запустить сервис rpcbind (для p6,portmap для p5) командой:

(p5)# service portmap start
(p6)# service rpcbind start

2. Запустить непосредственно nfs-server командой:

# service nfs start

3. Запустить сервис блокировок командой:

# service nfslock start

Если все команды прошли успешно и не выдавали ошибок, то сервер можно считать работающим. Дополнительно можно запустить команду exportfs, которая выведет текущие настройки на данный момент. В случае нормальной работы она должна вывести на экран записи из файла /etc/exports

Для запуска сервисов при старте системы:

chkconfig rpcbind on (chkconfig portmap on)
chkconfig nfs on
chkconfig nfslock on

проблемы с запуском nfs на p8

Симптомы:

# systemctl start nfs.service   
Job for nfs-server.service failed because the control process exited with error code.
See "systemctl status nfs-server.service" and "journalctl -xe" for details.
#systemctl status nfs-server.service
● nfs-server.service - NFS server and services
  Active: failed (Result: exit-code) since Сб 2016-11-12 14:10:48 EET; 3s ago
 Process: 4812 ExecStart=/usr/sbin/rpc.nfsd $NFSD_OPTIONS $NFSDCOUNT (code=exited, status=1/FAILURE)
 Process: 4810 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 4812 (code=exited, status=1/FAILURE)
ноя 12 14:10:48 birthday.localdomain systemd[1]: Starting NFS server and services...
ноя 12 14:10:48 birthday.localdomain rpc.nfsd[4812]: rpc.nfsd: unable to set any sockets for nfsd
ноя 12 14:10:48 birthday.localdomain systemd[1]: nfs-server.service: Main process exited, status=1/FAILURE
ноя 12 14:10:48 birthday.localdomain systemd[1]: Failed to start NFS server and services.
ноя 12 14:10:48 birthday.localdomain systemd[1]: nfs-server.service: Unit entered failed state.

отлаживаем rpc.nfsd (опция -d):

# rpc.nfsd -d 8
rpc.nfsd: knfsd is currently down
rpc.nfsd: Writing version string to kernel: -2 +3 +4 
rpc.nfsd: Created AF_INET TCP socket.
rpc.nfsd: Created AF_INET UDP socket.
rpc.nfsd: Created AF_INET6 TCP socket.
rpc.nfsd: writing fd to kernel failed: errno 97 (Address family not supported by protocol)
rpc.nfsd: unable to set any sockets for nfsd

Оказывается, включен ipv6 и включен протокол v.3 (см. version string to kernel: -2 +3 +4) который не получается повесить на ipv6 адрес.

  • Решение1 (если nfs3 не нужен): выключить v.3 (опция -N3) в $NFSD_OPTIONS: прописываем в /etc/sysconfig/nfs
 NFSD_OPTIONS=-N3

после чего nfs нормально запускается.

  • Решение2 (если нужен nfs3, не тестировал):

в /etc/netconfig закомментировать

#udp6       tpi_clts      v     inet6    udp     -       -
#tcp6       tpi_cots_ord  v     inet6    tcp     -       -

см. How to disable ipv6 in Debian

Использование NFS

Подключение к nfs-серверу можно производить вручную, а можно настроить автоматическое подключение при загрузке.

Допустим машина где запущен nfs-server называется server, и нам необходимо смонтировать с сервера каталог /myshare Тогда, для ручного способа достаточно (из под пользователя root) выполнить команду:

mount -t nfs4 -o proto=tcp,port=2049 server:/myshare /mnt/myshare

или (NFS3)

mount -t nfs server:/myshare /mnt/myshare

где, /mnt/myshare — локальный каталог куда монтируется удалённый каталог.

Внимание: так nfs4 монтироваться не будет! myshare стоит убрать. Подробнее про nfs4 тут: http://www.altlinux.org/NFSv4#Монтирование клиентом(замечание неверно/устарело, с указанием каталога все монтируется под p8, p9, p10).

Для автоматического монтирования к nfs-серверу при загрузке необходимо добавить следующую строку в файл /etc/fstab:

server:/myshare  /mnt/myshare   nfs4   proto=tcp,port=2049,intr,soft,lock,_netdev 0 0

или (NFS3)

server:/myshare  /mnt/myshare   nfs   intr,soft,lock,_netdev

где, intr — позволяет прервать процесс при необходимости soft — предотвращает от зависания в случае недоступности удалённой машины.

Кроме того, стоит убедиться, что сервис netfs запускается при старте системы.

Прежде чем изменять /etc/fstab, попробуйте смонтировать вручную и убедитесь, что всё работает.

Автомонтирование

Осуществляется при помощи automount, autofs или subfs.

autofs + avahi

Использование avahi. Установите пакет avahi-service-nfs или вручную создайте на сервере файл /etc/avahi/services/nfs.service, используется nfs4:

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
       <type>_nfs._tcp</type>
       <port>2049</port>
</service>
</service-group>

и запустите на сервере nfs сервис avahi-daemon. Проверьте с машин-клиентов, что сервер nfs виден с этих машин с помощью команды

avahi-browse -tkrp _nfs._tcp

Установите на машины-клиенты autofs. С настройками по умолчанию, ресурсы nfs будут монтироваться как /mnt/net/servername/netshare.

Для домашней локальной сети, когда nfs раздается не с сервера, а с другой рабочей станции, которую могут выключить в любой момент, рекомендуется прописывать у клиентов в /etc/sysconfig/autofs timeout поменьше (например, 5 сек):

OPTIONS="-t5"

autofs + avahi, проблемы на p8 и p9

при включенном ipv6 команда avahi-browse -tkrp _nfs._tcp кроме IPv4 _nfs сервиса

=;eth0;IPv4;hostname;_nfs._tcp;local;hostname.local;192.168.1.xxx;2049;

выдаст и IPv6 _nfs сервис

=;eth0;IPv6;hostname;_nfs._tcp;local;hostname.local;fe80::xxxx:xxxx:xxxx:xxxx;2049;

который не поддерживается autofs-5.1.5-alt1 из p9, что приведет к неработоспособности автомонтирования NFS. До исправления autofs можно отключить ipv6

sysctl -o net.ipv6.conf.all.disable_ipv6=1
sudo service nfs restart

проверяем и если заработало, то вносим изменения на постоянной основе либо собрать в бранчи autofs с поддержкой ipv6. Патчи для старых версий см. RH#711844.

systemd

Есть возможность использовать systemd, чтобы выполнять авто-монтирование конкретного ресурса при загрузке. Этот вариант имеет одно преимущество по сравнению с монтированием через fstab: если NFS-сервер по какой-либо причине будет недоступен, то клиент всё равно загрузится без ошибок.

1. Создаём на клиенте файл /lib/systemd/system/nfs-shared.service следующего содержания:

[Unit]
Description=Mount NFS share
Requires=network-online.target
After=network-online.target


[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/mount 192.168.1.1:/home/data /mnt/shared -o fsc,hard
ExecStop=/bin/umount /mnt/shared
TimeoutStopSec=5


[Install]
WantedBy=multi-user.target

Не забываем создать папку, в которую будет смонтирован NFS-ресурс:

mkdir -p /mnt/shared

После этого включаем сервис и запускаем его:

systemctl enable nfs-shared
systemctl start nfs-shared

Проверяем, смонтировался ли ресурс:

ls /mnt/shared

Последняя команда должна выдать содержимое NFS-ресурса.

subfs (для p5 и ранее, устарело)

Рецепт mike@ для subfs (фрагмент /etc/fstab), NFS4

server:/var/ftp/pub /pub subfs fs=nfs4,program=/sbin/net-submountd,interval=5,proto=tcp,port=2049,soft,_netdev 0 0

или NFS3

server:/var/ftp/pub /pub subfs fs=nfs,program=/sbin/net-submountd,interval=5,soft,_netdev 0 0

Ссылки