Так уж сложилось, что протокол 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.
Если у вас Linux server и нужно запустить debug RPC, то делаем так:
rpcdebug -m nfsd -s all
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
10 коментарів “Установка и настройка NFS (клиент-сервер)”
Привет!
В 11й версии соляриса, как я понял, файл /etc/dfs/dfstab не используется? (по крайней мере так написано в самом файле) Как тогда шарить ресурсы автоматом после ребута? Еще интересно, можно ли расшарить директорию рекурсивно?
Теперь всё делается через свойства zfs – sharenfs. А смысл рекурсивно делать?
Немного не так выразился про рекурсию: имел в виду, что при монтировании не было поддиректорий внутри шары. Оказался какой-то глюк. Кстати, не подскажите, почему не получается дать права на запись шаре? Делаю так:
#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
Может владелец не тот? Под кем пытаетесь создать?
Под рутовской ролью
Посмотрите через mount -p на том сервере, где смонтирована NFS-шара, с каким правами. Может реально смонтирована в RO.
Действительно
rpool/nfs – /rpool/nfs zfs – no rw,devices,setuid,nonbmand,exec,rstchown,xattr,atime
Почему-то при перемонтировании не проходит
Первый комент относится к nfs-серверу. Хотя на клиенте тоже самое
172.17.0.199:/rpool/nfs – /mnt nfs – no rw,xattr
На сервере и на клиенте не совпадают uid/gid, для того чтобы работало с разными uid/gid надо настроить nfsmapid_domain, подробная инструкция тут http://docs.oracle.com/cd/E23824_01/html/821-1462/nfsmapid-1m.html
Спасибо, помогло