NFS сервер (файловая шара)

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.

 

-m : имя моду­ля для уста­нов­ки или сбро­са фла­гов отлад­ки ядра
-s : уста­но­вить доступ­ный флаг отлад­ки ядра для модуля
-c : сбро­сить фла­ги отлад­ки ядра

 

1. Вклю­чи­те всю отлад­ку NFS (на сто­роне клиента)
Что­бы вклю­чить отлад­ку NFS на клиенте:

2. Вклю­чи­те отлад­ку NFSD на сто­роне сер­ве­ра
Что­бы вклю­чить отлад­ку NFSD на сто­роне сервера:

3. Вклю­чи­те отлад­ку вызо­вов RPC
Что­бы вклю­чить отлад­ку вызо­вов RPC:

Отключить отладку

Что­бы отклю­чить отлад­ку, исполь­зуй­те пара­метр -c (очи­стить) , например:

При­ме­ча­ние. Обя­за­тель­но отклю­чи­те отлад­ку после завер­ше­ния отлад­ки. При вклю­че­нии отлад­ка созда­ет огром­ное коли­че­ство выход­ных дан­ных в жур­на­лах, что потен­ци­аль­но вли­я­ет на про­из­во­ди­тель­ность системы.