Служба W: [Network File System] изначально разрабатывалась для прозрачного сетевого использования файловых систем сервера так, как будто они были непосредственно примонтированы в дерево каталогов клиента.
В отличие от FTPransfer-протоколa, предназначенного для скачивания (transfer) файлов, протокол NFS является ретранслятором системных вызовов open, close, read, write, seek и пр. с клиента на сервер.
Это позволяет клиенту выполнять операции чтения/записи с любой частью файла, без его передачи целиком.
Содержимое
NFS-клиент
Клиент протокола NFS непосредственно реализован в ядре Linux при помощи модулей nfs, nfsv2/nfsv3/nfsv4 и используется посредством штатной операции монтирования mount, тем самым делая доступными серверные файлы любым клиентским программам.
В примере из листинга ниже показана процедура монтирования файловой системы /Qmultimedia NFS-сервера NVR.local в каталог /mnt/network/nvr/Qmm при помощи протокола NFS v3 (-t nfs -о vers=3). Для получения списка экспортируемых (-e, export) сервером файловых систем используется команда showmount, которая также является специализированным NFS-клиентом.
Монтирование NFS
lumpy@ubuntu:~$ showmount -e NVR.local
Export list for NVR.local:
/Qweb *
/Qusb *
/Qrecordings *
/Qmultimedia *
/Qdownload *
/Public *
/Network Recycle Bin 1 *
lumpy@ubuntu: ~$ sudo mkdir -p /mnt/network/nvr/Qmm
lumpy@ubuntu:~$ sudo mount -t nfs -o vers=3 NVR. local: /Qmultimedia /mnt/network/nvr/Qmm
lunpy@ubuntu:~$ findmnt -t nfs
TARGET SOURCE STYPE OPTIONS
/mnt/network/nvr/Qmn NVR.local:/Qmultimedia nfs w,relatime,vers=3,…
lumpy@ubuntu:~$ ls /mnt/network/nvr/Qmm
-rw-r—r— 1 toothy users 678696 авг. 20 2018 IMG_20180719_125651.jpg
-rw-r—r— 1 toothy users 649685 авг. 20 2018 IMG_20140719_125713.jpg
-rw-r—f— 1 toothy users 814607 авг. 20 2018 IMG_20180820_111355.jpg
lumpy@ubuntu:~$ id toothy
uid=1010( toothy) gid=1012( toothy) группы=1012( toothy)
Необходимо отметить, что права доступа и идентификаторы UID/GID владельцев файлов передаются NFS-протоколом в неизменном виде, поэтому базы пользовательских учетных записей всех клиентов (и сервера), должны быть согласованы, например, при помощи их централизованного хранения в каталоге LDAP.
NFS-сервер
Функционирование NFS-сервера имеет свою специфику, связанную с использованием NFS-протоколом принципа RPC (remote procedure call, удаленного вызова процедур) в реализации W: [SUN RPC].
Серверы, использующие SUNRPC, не имеют «зафиксированного» (как, например, порт 22 закреплен за службой SSH, порт 25 за SMTP, а порт 80 — за HTTP-протоколом службы WWW) номера порта TCP/UDP, а используют произвольный, случайно выбираемый порт.
Вместо этого, в SUNRPC закрепляются номера «программ» (program), предоставляющих определенные «услуги» (service), & соответствующий порт регистрируется в служебной RPC-программе portmapper2, что проиллюстрировано в листинге ниже при помощи утилиты rpcinfo. Порт самой RPC-программы portmapper все же закреплен за номером 111 TCP/UDP, что позволяет клиентам обращаться portmapper сервера и находить порты других RPC-программ по их номерам.
Удаленный вызов процедур RPC динамические номера портов и portmapper
lumpy@ubuntu:~$ rpcinfo -p NVR.local
program vers proto port service
100000 3 tcp 111 service
100000 3 tcp 111 portmapper
100000 3 udp 111 portmapper
100003 3 tcp 2049 nfs
100003 3 udp 2649 nfs
100005 3 udp 53964 mountd
100005 3 tcp 39635 mountd
При помощи portmapper организуется обнаружение NFS-серверов в локальной сети посредством широковещательного (-b, broadcast) поиска зарегистрированных RPC-программ NFS v3.
Кроме этого, некоторые серверы NFS (например, сетевые устройства хранения данных W: [NAS] или сетевые видеорегистраторы W:[NVR]) регистрируются в службе mDNS/DNS-SD, что обнаруживается в при помощи avahi-browse.
Обнаружение NFS-серверов
lumpy@ubuntu:~$ rpcinfo -b nfs 3
192.168.17.90.8.1 NVR.local
lumpy@ubuntu:~$ avahi-browse -rcl _nfs._tcp
+ eth0 IPv4 NVR(NFS) Network File System local
= eth0 IPv4 NVR(NFS) Network File System local
hostname = [NVR.local]
address = [192.168.17.90]
port = [2049]
txt = []
Сервер NFS предоставляет клиентам некоторое количество RPC-услуг (-s, services), показанных в примере ниже, при помощи rpcinfo. Выделяют базовые RPC-программы mountd и nfs, позволяющие монтировать файловые системы NFS и обращаться к их файлам, и дополнительные RPC-программы nlockngr и status, реализующие механизм блокировки файлов W:[NLM], network lock manager и W:[NSM], network status monitor).
RPC-программы службы NFS
lumpy@ubuntu:~$ rpcinfo -s NVR.local
program verslon(s) netid(s) service owner
100000 4,3,2 tcp6,tcp,udp,udp6 portmapper superuser
100003 4,3,2 udp6,tcp6,udp,tcp nfs superuser
100005 3,2,1 tcp6,udp6,tcp,udp mountd superuser
100021 4,3,2,1 tcp6,udp6,tcp,udp nlockmgr superuser
100024 1 tcp6,udp6,tcp,udp status superuser