Установка и настройка NFS (клиент-сервер)

Так уж сложилось, что протокол NFS разработала компания SUN и поэтому, этот протокол включён в базовый набор сервисов на ОС Solaris. Подробнее о самом протоколе можно прочесть на википедии.

Тестовый стенд: Solaris 10/11 (сервер), Kubuntu Linux,  kernel 3.0.0-12-generic-pae (клиент)

1) Настройка сервера.

Сразу скажу, что начиная с 11 версии NFS сервер уже можно настраивать и не в глобальной зоне. До этого это возможно было только в глобальной. В противном случае вы бы получили сообщение:

share_nfs: Cannot share filesystems in non-global zones: /export/home2

Файлы NFS-сервера

/etc/dfs/dfstab — содержит список ресурсов, разделяемых во время загрузки.
/etc/nfs/nfslogd.conf – определяет расположение журнальных файлов, используемым NFS.
/etc/dfs/sharetab – содержит список ресурсов, разделяемых NFS-сервером в настоящее время.
/etc/rmtab – содержит список файловых систем, подключенных NFS-клиентами. НЕ редактируйте этот файл вручную!
/etc/nfs/nfslog.conf – содержит список информации, определяющих расположение журнальных файлов, используемым NFS.

По умолчанию сервер nfs присутствует в системе, но он отключён. Что бы он запустился нужно выполнить 2 вещи:

— добавить запись хотя бы об одном расшаренном ресурсе в файл /etc/dfs/dfstab
— выполнить enable для сервиса nfs

Примечание.

В 11 версии нужно сначала расшарить NFS ресур вручную, а потом уже запускать NFS-сервер, иначе он не запуститься. Так же нужно

Добавим ресурс и запустим демон:

#echo 'share  -F nfs  -o ro  -d "home dirs"  /export/home' >> /etc/dfs/dfstab
#svcadm -v enable -rs svc:/network/nfs/server:default
svc:/network/nfs/server:default enabled.
svc:/milestone/network enabled.
svc:/network/loopback enabled.
svc:/network/ip-interface-management enabled.
svc:/network/socket-config enabled.
svc:/system/name-service/upgrade enabled.
svc:/network/physical:default enabled.
svc:/network/physical:upgrade enabled.
svc:/network/netcfg enabled.
svc:/network/datalink-management enabled.
svc:/network/nfs/nlockmgr enabled.
svc:/network/rpc/bind enabled.
svc:/system/filesystem/minimal enabled.
svc:/system/filesystem/usr enabled.
svc:/system/boot-archive enabled.
svc:/system/filesystem/root enabled.
svc:/system/device/local enabled.
svc:/system/identity:node enabled.
svc:/network/nfs/status enabled.
svc:/system/filesystem/local enabled.
svc:/milestone/single-user enabled.
svc:/milestone/config enabled.
svc:/system/filesystem/minimal:default enabled.
svc:/system/device/local:default enabled.
svc:/milestone/unconfig:default enabled.
svc:/system/utmp:default enabled.
svc:/network/ip-interface-management:default enabled.
svc:/network/netcfg:default enabled.
svc:/milestone/devices enabled.
svc:/system/manifest-import enabled.
svc:/milestone/unconfig enabled.
svc:/system/config-user enabled.

Посмотреть список доступных шар можно такими способами:

# share
-               /export/home   rw   ""
# dfshares
RESOURCE                                  SERVER ACCESS    TRANSPORT
  sol10new:/export/home                 sol10new  -         -

Наживую расшарить ресурс можно так:

#share -F nfs -o ro -d "home dirs" /export/home2

Примечание.

В 11.1 версии расшаривание ресурса происходит через свойства zfs — share.nfs:

# zfs set share.nfs=on rpool/test

Так же, через share.nfs.parm можно выставлять нужные свойства:

# zfs set share.nfs.nosuid=on rpool/test

— конец примечания —

Расшарить для записи для конкретных хостов (разрешили для 1.1.1.1 и 2.2.2.2, при этом папка должна иметь права для записи = 777):

#share -F nfs -o rw=1.1.1.1:2.2.2.2 -d "home dirs" /export/home2

Дать права рута для хоста 3.3.3.3 (достаточно дать права на папку для root)

#share -F nfs -o rw,root=3.3.3.3 /export/home

Если требуется изменить шары, то можно отредактировать файл /etc/dfs/dfstab и дать команду shareall

Примечание.

Помните, что команда shareall просто выполняет подряд все команды share, содержащиеся в файле /etc/dfs/dfstab. Если этот файл был модифицирован и некоторые команды экспорта каких-то файловых систем были удалены, действие старых команд share, запущенных до модификации файла, продолжится и после выполнения shareall.

2) Установка и настройка клиента.

Установим поддержку nfs

#apt-get install nfs-common

Смотрим список расшаренных ресурсов:

#showmount -e 10.5.5.130
Export list for 10.5.5.130:
/export/home (everyone)

Что бы избежать странных uid:gid (они будут такими 4294967294:4294967294) при монтировании ресурса устанавливаем переменную NEED_IDMAPD=yes (файл /etc/default/nfs-common) и запускаем сервис idmapd:

#service idmapd start

После этого монтируем ресурс:

#mount 10.5.5.130:/export/home /mnt/nfs/
# ls -la /mnt/nfs/
итого 9
drwxr-xr-x 4 777 nogroup 4 2011-11-29 13:43 .
drwxr-xr-x 3 root root 4096 2011-11-29 13:23 ..
drwxr-xr-x 2 nobody nogroup 2 2011-11-29 13:43 dsasd
drwxrwxrwx 2 nobody nogroup 2 2011-11-29 13:20 qqq

Что работал mapid, нужно :

  • прописать в /etc/resolv.conf

search domain.com

  • прописать в /etc/idmapd.conf

Domain=domain.com

После этого сбросить кеш:

# nfsidmap -c

и перезапустить сервис.

Примечание.

Для принудительного отмонтирования ресурса используем следующую команду

#umount.nfs /mnt/nfs -fl

Примечание 2.

Если у вас mapid так и не заработал, возможно это баг. И исправляется он так:

1) пробуем запускать idmap вручную:

# rpc.idmapd -c /etc/idmapd.conf -f
rpc.idmapd: main: open(/run/rpc_pipefs/nfs): No such file or directory

2) создаём нужную папку:

# mkdir /run/rpc_pipefs

3) монтируем rpc_pipefs:

# mount -t rpc_pipefs rpc_pipefs /run/rpc_pipefs

4) запускаем idmap:

# rpc.idmapd -c /etc/idmapd.conf

После этого, оно хоть как-то начинает работать, но мапит всех юзеров в Nobody-User:Nobody-Group из файла /etc/idmapd.conf.

Дополнение.

При использовании БД Oracle можно использовать Direct NFS http://www.orafaq.com/wiki/Direct_NFS

3) Низкая скорость.

Если при работе с NFS получаем низкую скорость, то возможно следует подтюнить размер блока. Подробнее можно прочесть здесь и здесь . Вот пару рекомендаций для увеличения скорости:

— увеличение MTU до 9000

— тюнинг NFS/etc/system добавляем такие стоки, добавляем как на клиенте, так и на сервере):

set nfs:nfs4_nra=16
set nfs:nfs4_bsize=1048576
set nfs:nfs4_max_transfer_size=1048576
set rpcmod:clnt_max_conns=8

Налету изменить значения так:

# echo nfs4_nra/W0t16 | mdb -kw
# echo nfs4_bsize/W0t1048576 | mdb -kw
# echo nfs4_max_transfer_size/W0t1048576 | mdb -kw
# echo clnt_max_conns/W0t8 | mdb -kw

Посмотреть текущее значение:

# echo nfs4_nra/D | mdb -k
nfs4_nra:
nfs4_nra: 16

Пояснение:

nfs:nfs4_nra — Controls the number of read-ahead operations that are queued by the NFS version 4 client when sequential access to a file is discovered. These read-ahead operations increase concurrency and read throughput. Each read-ahead request is generally for one logical block of file data. Default 4.

nfs:nfs4_bsize — Controls the logical block size used by the NFS version 4 client. This block size represents the amount of data that the client attempts to read from or write to the server when it needs to do an I/O. Default 32768 (32 Kbytes).

nfs:nfs4_max_transfer_size — Controls the maximum size of the data portion of an NFS version 4 READ, WRITE, READDIR, or READDIRPLUS request. This parameter controls both the maximum size of the request that the server returns as well as the maximum size of the request that the client generates. Default 32768 (32 Kbytes).

rpcmod:clnt_max_conns — Controls the number of TCP connections that the NFS client uses when communicating with each NFS server. The kernel RPC is constructed so that it can multiplex RPCs over a single connection, but multiple connections can be used if desired. Default 1.

— подключение с нужным размером блока (строка из /etc/auto_direct):

/data/share       -rw,rsize=1048576,wsize=1048576 server.com:/data/share

Установка и настройка NFS (клиент-сервер): 10 комментариев

  1. Sebor

    Привет!
    В 11й версии соляриса, как я понял, файл /etc/dfs/dfstab не используется? (по крайней мере так написано в самом файле) Как тогда шарить ресурсы автоматом после ребута? Еще интересно, можно ли расшарить директорию рекурсивно?

    1. skeletor Автор записи

      Теперь всё делается через свойства zfs — sharenfs. А смысл рекурсивно делать?

      1. Sebor

        Немного не так выразился про рекурсию: имел в виду, что при монтировании не было поддиректорий внутри шары. Оказался какой-то глюк. Кстати, не подскажите, почему не получается дать права на запись шаре? Делаю так:
        #sudo zfs set share=name=nfs,path=/rpool/nfs,prot=nfs,rw=* rpool/nfs
        #cat /etc/dfs/sharetab
        /rpool/nfs nfs nfs sec=sys,rw
        но после монтирования все равно нет прав на запись:
        mkdir: Failed to make directory «test»; Permission denied

          1. skeletor Автор записи

            Посмотрите через mount -p на том сервере, где смонтирована NFS-шара, с каким правами. Может реально смонтирована в RO.

          2. Sebor

            Действительно
            rpool/nfs — /rpool/nfs zfs — no rw,devices,setuid,nonbmand,exec,rstchown,xattr,atime
            Почему-то при перемонтировании не проходит

          3. Sebor

            Первый комент относится к nfs-серверу. Хотя на клиенте тоже самое
            172.17.0.199:/rpool/nfs — /mnt nfs — no rw,xattr

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *