Network File System (NFS) — протокол сетевого доступа к файловым системам, первоначально разработан Sun Microsystems в 1984 году. За основу взят протокол вызова удалённых процедур (ONC RPC[1]). Позволяет подключать (монтировать) удалённые файловые системы через сеть.
Thank you for reading this post, don't forget to subscribe!
Как правило, NFS уже установлен:
# chkconfig --list nfs
nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# yum list installed | grep nfs
nfs-utils.i686 1:1.2.3-39.el6_5.3 @updates
nfs-utils-lib.i686 1.1.5-6.el6_5 @updates
nfs4-acl-tools.i686 0.3.3-6.el6 @anaconda-CentOS-201311271240.i386/6.5
если не установлен, то поставим:
yum install nfs-utils nfs-utils-lib -y
Добавляем в автозагрузку:
chkconfig nfs on
Проверяем rpcbind:
chkconfig rpcbind on && service rpcbind start
# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Запускаем:
service nfs start
Редактируем файл /etc/exports, в который добавляем строку:
/share 192.168.10.0/24(rw,sync,no_root_squash,no_subtree_check)
Обратите внимание, что между адресом и списком параметров в скобках нет запятой.
При этом:
/share – расшариваемая директория
192.168.10.0/24 – IP адрес клиента (или, как в моем случае, возможность подключения для всей подсети)
rw – разрешение на запись
sync – синхронизация указанной директории
no_root_squash – включение root привилегий
no_all_squash — включение пользовательской авторизации
Выполняем в командной строке
exportfs -a
чтобы подключить этот каталог в список экспортируемых. В завершение настройки NFS сервера перезапускаем его:
Переходим к клиенту.
Настройка клиента NFS
если не установлен, то поставим:
yum install nfs-utils nfs-utils-lib -y
chkconfig nfs on && chkconfig rpcbind on
Создаём каталог, в который будем монтировать NFS:
mkdir -p /mnt/nfs/share
И монтируем в него новый раздел:
mount 192.168.10.107:/share /mnt/nfs/share
где 192.168.10.107 IP адрес сервера
Проверяем:
df -h
Filesystem Size Used Avail Use% Mounted on
192.168.10.107:/share 18G 2.3G 15G 14% /mnt/nfs/share
И добавим на клиенте запись в /etc/fstab, что бы раздел монтировался всегда:
192.168.10.107:/share /mnt/nfs/share nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1800 0 0
Проверяем, что всё без ошибок:
# mount -fav
mount: UUID=7cd000d8-7ad8-45a0-8b38-7232da34384d already mounted on /boot
mount: tmpfs already mounted on /dev/shm
mount: devpts already mounted on /dev/pts
mount: sysfs already mounted on /sys
mount: proc already mounted on /proc
mount: 192.168.10.107:/share already mounted on /mnt/nfs/share
===================================================
centos 7
Установим
yum install nfs-utils nfs-utils-lib -y
Добавим в автозапуск:
systemctl enable nfs
Запустим
systemctl start nfs
проверяем
systemctl status rpcbind
если не запущен - запускаем.
Редактируем файл /etc/exports, в который добавляем строку:
/share 192.168.10.0/24(rw,sync,no_root_squash,no_subtree_check)
Обратите внимание, что между адресом и списком параметров в скобках нет запятой.
При этом:
/share – расшариваемая директория
192.168.10.0/24 – IP адрес клиента (или, как в моем случае, возможность подключения для всей подсети)
rw – разрешение на запись
sync – синхронизация указанной директории
no_root_squash – включение root привилегий
no_all_squash — включение пользовательской авторизации
Выполняем в командной строке
exportfs -a
чтобы подключить этот каталог в список экспортируемых. В завершение настройки NFS сервера перезапускаем его:
========
если необходимо чтоб docker volume хранились по nfs то используем следующую конструкцию:
/var/nfs_for_docker 10.242.144.150(rw,sync,no_subtree_check) 10.242.144.155(rw,sync,no_subtree_check) 10.242.144.143(rw,sync,no_subtree_check) 10.242.144.133(rw,sync,no_subtree_check)
здесь 10.242.144.150 10.242.144.155 10.242.144.143 10.242.144.133 сервера и 1 виртуальный ip
Выполняем в командной строке
exportfs -a
службы которые должны быть в автозапуске и запущены:
systemctl enable rpcbind
systemctl enable nfs-server
systemctl enable nfs-lock
systemctl enable nfs-idmap
systemctl start rpcbind
systemctl start nfs-server
systemctl start nfs-lock
systemctl start nfs-idmap
___________________
Переходим к настройкам клиента.
если не установлен, то поставим:
yum install nfs-utils nfs-utils-lib -y
systemctl enable nfs && systemctl start nfs
Создаём каталог, в который будем монтировать NFS:
mkdir -p /var/nfs_for_docker/
И монтируем в него новый раздел:
mount -t nfs 10.242.144.155:/var/nfs_for_docker/ /var/nfs_for_docker/
где 10.242.144.155 виртуальный IP адрес сервера.
======================================
Как разрешить запись на NFS-сервере пользователям с NFS-клиента, у который отличается UID от UID пользователя, которому принадлежат файлы на NFS-сервере
Действия выполняются на NFS-сервере от пользователя root.
Редактируем /etc/exports:
nano /etc/exports
Вставляем или изменяем строку, которая говорит о том, какая директория будет доступна (экспортирована) по NFS:
/home/nfs 192.168.1.1/24(rw,async,no_subtree_check,all_squash,anonuid=1000,anongid=1000) |
где:
- /home/nfs — директория, которая будет доступна (экспортирована) NFS-клиенту;
- 192.168.1.1/24 — IP-адрес или, как в данном случае, диапазон адресов, с которых разрешено подключаться к NFS;
- rw — разрешение на чтение и запись;
- async — асинхронный режим работы, в котором ответы на запросы будут происходят сразу, не дожидаясь записи на диск. В этом случае надежность ниже, однако, производительность больше;
- no_subtree_check — при разрешение доступа к подкаталогу файловой системы, а не всей файловой системе, сервер проверяет, находится ли запрошенный файл в экспортированном подкаталоге или нет. no_subtree_check отключает эту проверку, что уменьшает безопасность, однако, увеличивает скорость передачи данных;
- all_squash — эта опция отвечает за то, что любые пользователи NFS-клиента будут считаться анонимными на NFS-сервере или же тем пользователеми NFS-сервера, чьи идентификаторы указаны в anonuid и anongid;
- anonuid — идентификатор пользователя ОС на NFS-сервере. Берётся из /etc/passwd . Например, если нужен первый несистемный пользователь (тот, логин которого указывался при установке ОС, в моём случае nfs) и в файле /etc/passwd есть строка «nfs:x:1000:1000:NFS:/home/nfs:/bin/bash» значение для anonuid будет первое число 1000;
- anongid — идентификатор группы ОС на NFS-сервере. Берётся из /etc/group . Например, если нужна группа www-data и в файле /etc/group есть строка «www-data:x:33:» значение для anongid будет 33;
Если нужно более точно указать какие пользователи на NFS-клиенте соответствуют пользователям на NFS-сервере, то можно включить маппинг пользователей, добавив опцию map_static=/etc/file_maps_users. Файл /etc/file_maps_users должен выглядеть следующим образом:
# Маппинг пользователей # remote local comment uid 0-33 1002 # сопоставление пользователей с удаленным UID 0-50 к локальному UID 1002 gid 0-33 1002 # сопоставление пользователей с удаленным GID 0-50 к локальному GID 1002 |
Перезапускаем демона nfs и на этом настройка сервера завершена:
/etc/init.d/nfs-kernel-server restart
Как разрешить обычному пользователю (regular user) подключать и отключать NFS-раздел
Авторизуемся как admuser.
Создаём директорию, в которую будем производить монтирование:
sudo mkdir /media/nfs
Добавляем в /etc/fstab правило монтирования. Открываем файл:
sudo nano /etc/fstab
Добавляем правило:
192.168.1.50:/home/nfs /media/nfs nfs rw,noauto,user 0 0
где:
- 192.168.1.50 — IP-адрес NFS-сервера;
- /home/nfs — каталог на NFS-сервере, который монтируем. Он должен быть в списке /etc/exports на NFS-сервере;
- /media/nfs — каталог на NFS-клиенте, в который монтируем NFS-раздел;
- nfs — тип файловой системы;
- rw — с правом на запись;
- noauto — опция, указывающая, что раздел не нужно монтировать автоматически при загрузке;
- user — опция, разрешающая монтировать и размонтировать этот раздел любому пользователю.
Теперь можно авторизоваться как reguser и создать в его домашнем каталоге два файла.
Для подключения NFS:
nano ~/nfs.mount
С кодом:
#!/bin/bash
mount /media/nfs
Для отключения NFS:
nano ~/nfs.umount
С кодом:
#!/bin/bash
umount /media/nfs
Разрешаем скриптам исполняться:
chmod ug+x ~/nfs.mount ~/nfs.umount
И, наконец, подключение NFS-ресурса:
~/nfs.mount
Отключение NFS-ресурса:
~/nfs.umount
==================================================
Обращаю внимание, что nfs наследует права, т.е. у нас есть 2 директории одна вложена в другую
/var/nfs
/var/nfs/test
Если необходимо подмонтировать директории с разным доступом:
/var/nfs только на чтение а
/var/nfs/test на запись
то вот такой вариант
cat /etc/exports
/var/nfs 192.168.10.0/24(ro,sync,no_root_squash,no_subtree_check)
/var/nfs/test 192.168.10.0/24(rw,sync,no_root_squash,no_subtree_check)
не прокатит, так как /var/nfs/test наследует права родительского каталога /var/nfs
поэтому в экспорт передаём следующим конфиг(всё с rw):
cat /etc/exports
/var/nfs 192.168.10.0/24(rw,sync,no_root_squash,no_subtree_check)
/var/nfs/test 192.168.10.0/24(rw,sync,no_root_squash,no_subtree_check)
а уже на клиентах монтируем с нужными нам правами:
mount -o rw -t nfs 192.168.10.5:/var/nfs/test /var/nfstest
mount -o ro -t nfs 192.168.10.5:/var/nfs/ /var/nfs
========================================================
Включить логирование NFS сервера
Мы можем использовать команду rpcdebug, чтобы установить и очистить флаги отладки клиента и сервера NFS ядра Linux. Установка этих флагов заставляет ядро записывать сообщения в системный журнал (в ответ на действия NFS.
1 2 3 4 5 6 7 8 9 10 |
# rpcdebug -vh usage: rpcdebug [-v] [-h] [-m module] [-s flags…|-c flags…] set or cancel debug flags. Module Valid flags rpc xprt call debug nfs auth bind sched trans svcsock svcdsp misc cache all nfs vfs dircache lookupcache pagecache proc xdr file root callback client mount fscache pnfs pnfs_ld state all nfsd sock fh export svc proc fileop auth repcache xdr lockd all nlm svc client clntlock svclock monitor clntsubs svcsubs hostcache xdr all |
-m : имя модуля для установки или сброса флагов отладки ядра
-s : установить доступный флаг отладки ядра для модуля
-c : сбросить флаги отладки ядра
1. Включите всю отладку NFS (на стороне клиента)
Чтобы включить отладку NFS на клиенте:
1 |
# rpcdebug -m nfs -s all |
2. Включите отладку NFSD на стороне сервера
Чтобы включить отладку NFSD на стороне сервера:
1 |
# rpcdebug -m nfsd -s lockd |
3. Включите отладку вызовов RPC
Чтобы включить отладку вызовов RPC:
1 |
# rpcdebug -m rpc -s call |
Отключить отладку
Чтобы отключить отладку, используйте параметр -c (очистить) , например:
1 2 |
# rpcdebug -m nfs -c all # rpcdebug -m nfsd -c all |