Создайте подобный сайт на WordPress.com
Начало работы

NFS: теория и практика

NFS (Network File System) — протокол, который позволяет пользователям совместно работать с файлами, расположенными на разных компьютерах.

У протокола NFS есть несколько версий:

  • NFSv2 — старая версия, работает только через UDP
  • NFSv3 — работает через TCP и UDP
  • NFSv4 — работает только через TCP

Рекомендуется использовать протокол NFS версии 3 и 4. Разные версии протокола не совместимы друг с другом, но серверы, поддерживающие протокол NFS обычно предоставляют сразу несколько версий протокола.

В NFS версии 2 и 3 нет контроля состояния файлов, после удачного монтирования клиенту выдаётся специальный ключ, который позволяет получить доступ содержимому каталога. Ключ сохраняется после перезагрузки

В NFSv4 нет ключей. Протокол сохраняет состояния файлов; и клиент и сервер сохраняют информацию об открытых файлах и блокировках.

Режимы аутентификации в NFS:

  • AUTH_NONE — без аутентификации
  • AUTH_SYS — работает в NFSv2 и v3, права на каталог ставятся на конкретный UID. При запросе доступа, сервер проверяет свой файл /etc/passwd на наличие UID и смотрит можно ли предоставить доступ.
  • RPCSEC_GSS — работает в NFSv4

Базовая настройка NFS сервера на CentOS 7

  1. Устанавливаем пакеты для работы NFS:
sudo yum install nfs-utils nfs-utils-lib

2. Запускаем службы и добавляем их в автозагрузку

systemctl start rpcbind
systemctl start nfs-server
systemctl start nfs-lock
systemctl start nfs-idmap
systemctl enable rpcbind
systemctl enable nfs-server
systemctl enable nfs-lock
systemctl enable nfs-idmap

3. Открываем порты в firewalld

sudo firewall-cmd --permanent --add-port=111/tcp
sudo firewall-cmd --permanent --add-port=54302/tcp
sudo firewall-cmd --permanent --add-port=20048/tcp
sudo firewall-cmd --permanent --add-port=2049/tcp
sudo firewall-cmd --permanent --add-port=46666/tcp
sudo firewall-cmd --permanent --add-port=42955/tcp
sudo firewall-cmd --permanent --add-port=875/tcp
sudo firewall-cmd reload

4. Создаём папку /nfs-share к которой будем предоставлять доступ

mkdir /nfs-share

5. Настройки доступа к NFS-серверу лежат в файле /etc/exports. Давайте настроим его: vi /etc/exports

Добавим в файл следующую строку:

/nfs-share 192.168.223.0/24(rw,sync,no_root_squash,no_all_squash)

Разберем параметры, указанные в этой строке:

  • /nfs-share — адрес папки, к которой будет предоставляться доступ
  • 192.168.223.0/24 — сеть. из которой будут приниматься запросы. Вместо адреса сети можно указать FQDN-клиента, @имя группы, имя пользователя.
  • rw — разрешение на чтение и запись (также можно указать ro — только чтение)
  • sync — синхронизация указанной директории (файлы не зависают в оперативной памяти, а сразу записываются на сервер)
  • no_root_squash — включение root-привилегий (По умолчанию, сервер NFS перехватывает входящие запросы, посланные от имени пользователя root (UID=0) и подменяет пользователя на nobody (UID=65534). Этот приём называется поражением в правах — squashing root. Если нужно, чтобы у root-пользователя были все права, то необходимо указать параметр no_root_squash)
  • no_all_squash — включение пользовательской авторизации

Дополнительные параметры можно найти на официальной MAN-страницы NFS — https://linux.die.net/man/5/nfs

6. После добавления информации в файл /etc/exports, необходимо назначить права на папку /nfs-share. Например: создадим пользователя bill и разрешим чтение и запись только для root и bill, остальным разрешим только чтение.

[root@centos ~]# useradd bill
[root@centos ~]# passwd bill
[root@centos ~]# passwd bill
Changing password for user bill.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@centos ~]# cat /etc/passwd | grep bill
bill:x:1001:1001::/home/bill:/bin/bash
[root@centos ~]# cat /etc/group | grep bill
bill:x:1001:
[root@centos ~]# chmod 775 /nfs-share
[root@centos ~]# ls -l / | grep nfs-share
drwxrwxr-x    2 root   root      6 Aug 30 18:52 nfs-share
[root@centos ~]# chown root:bill /nfs-share
[root@centos ~]# ls -l / | grep nfs-share
drwxrwxr-x    2 root   bill      6 Aug 30 18:52 nfs-share
[root@centos ~]#

7. Перезапускаем службу NFS: service nfs-server restart

На этом настройка NFS-сервера закончена.

Настройка NFS-клиента:

  1. Устанавливаем пакеты NFS-клиента:
yum install nfs-utils nfs-utils-lib

2. Создаём папку /mnt/nfs в которую будем монтировать папку /nfs-share

[root@vtl ~]# mkdir /mnt/nfs
[root@vtl ~]# mount -t nfs 192.168.223.204:/nfs-share /mnt/nfs
[root@vtl ~]# ls -l /mnt/nfs
total 8
-rw-r--r--. 1 root root  7 Aug 30 19:29 test
-rw-r--r--. 1 root root 10 Aug 30 19:30 test2
[root@vtl ~]# cd /mnt/nfs
[root@vtl nfs]# rm test2
rm: remove regular file ‘test2’? y
[root@vtl nfs]#

Монтирование прошло успешно. Мы даже смогли удалить файл, так как разрешили пользователям root и bill читать и изменять файлы. Давайте создадим пользователя ivan и попробуем подключиться от его имени.

[ivan@vtl root]$ cd /mnt/nfs
[ivan@vtl nfs]$ ls
test
[ivan@vtl nfs]$ rm test
rm: remove write-protected regular file ‘test’? y
[ivan@vtl nfs]$ ls
[ivan@vtl nfs]$ cd ..
[ivan@vtl mnt]$ ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 10 09:51 arctape
drwxr-xr-x. 2 root root 6 Sep 26  2019 hgfs
drwxrwxr--. 2 root ivan 6 Aug 30 19:37 nfs
[ivan@vtl mnt]$ cat /etc/passwd | grep ivan
ivan:x:1001:1001::/home/ivan:/bin/bash
[ivan@vtl mnt]$

Как мы видим, от пользователя ivan также получилось удалить файл. Проблема заключается в том, что во время проверки доступа проверяется не имя пользователя а его UID. Давайте поменяем UID пользователя ivan и попробуем ещё раз что-нибудь удалить:

[root@vtl ~]# vi /etc/passwd
[root@vtl ~]# vi /etc/group
[root@vtl ~]# cat /etc/passwd | grep ivan
ivan:x:1011:1011::/home/ivan:/bin/bash
[root@vtl ~]# cat /etc/group | grep ivan
ivan:x:1011:
[root@vtl ~]#
[root@vtl nfs]# su ivan
bash: /home/ivan/.bashrc: Permission denied
bash-4.2$ ls
test3
bash-4.2$ rm test3
rm: remove write-protected regular file ‘test3’? y
rm: cannot remove ‘test3’: Permission denied
bash-4.2$

Монтирование с помощью команды mount будет работать до перезагрузки системы. Если требуется, чтобы папка монтировалась автоматически во время старта системы, то необходимо добавить строку в файл /etc/fstab: vi /etc/fstab

192.168.223.204:/nfs-share /mnt/nfs nfs rw,sync,hard,intr 0 0

После перезагрузки системы папка должна автоматически примонтироваться. Если не получается перезагрузить сервер, а проверить изменения нужно, то можно ввести команду: sudo mount -fav

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

Команда для размонтирования папки: umount /mnt/nfs

Как решить проблемы с размонтированием папки?

Самая частая ошибка при размонтировании — это device is busy. Я часто забываю выйти из каталога, который хочу отмонтировать и мне достаточно перейти в другой каталог командой cd.

Если проблемы более серьёзные, то можно попробовать следующие варианты:

1) Размонтировать с параметром force: umount -f /mnt/nfs

2) Если предыдущая команда не помогла, то находим процесс, которым занята папка, а потом убиваем его:

[root@vtl ~]# ps aux | grep /mnt/data
root      11251  0.0  0.0 112712   968 pts/0    S+   20:00   0:00 /mnt/data
[root@vtl ~]# kill 11251 #или вводим kill -9 11251
[root@vtl ~]# umount -f /mnt/nfs

3) Если и данный вариант не помог, значит NFS-сессия на самом деле повисла и поможет только перезагрузка сервера. Перезагрузка службы обычно не помогает.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: