NFS: раздача файлов по сети под Arch Linux / Ubuntu

Для раздачи файлов внутри локальной сети можно выделить такие технологии (рассматриваются системы на базе Linux):

  • Network File System (NFS) - протокол сетевого доступа к файловым системам;
  • Files transferred over Shell protocol (FISH) - сетевой протокол, который использует SSH или RSH для передачи файлов между компьютерами;
  • Secure SHell FileSystem (SSHFS) - клиент файловой системы для монтирования дисковых устройств на удаленных системах, для взаимодействия с удаленной системой используется SFTP;
  • Samba - пакет программ, которые позволяют обращаться к сетевым дискам и принтерам на различных операционных системах по протоколу SMB/CIFS;

В данной заметке речь пойдет про NFS.

NFS (Network File System) полезна когда нужно раздать файлы/директории всем внутри сети. Прозрачность доступа с помощью NFS позволяет клиентам подключить удаленную файловую систему как локальную директорию, причем файловые системы могут быть разных типов. Это означает, что любое приложение клиента, которое может работать с локальным файлом, с таким же успехом может работать и с файлом подключенным по NFS, без каких либо модификаций самой программы.

К преимуществам NFS можно отнести:

  • равномерная загрузка сети;
  • уменьшение нагрузки на процессор;
  • отображение совместно используемых ресурсов как обычных директорий в системе;

На данный момент доступна NFS v4.1, в которой ввели новую возможность pNFS позволяющей распараллелить реализацию общего доступа к файлам. Также есть расширение для NFS 2 и 3 - WebNFS, которое позволяют легче интегрироваться в веб-браузеры и дает возможность работать через брандмауэр.

NFS базируется на RPC.

Схема работы NFS протокола.

NFS

Установка и настройка NFS-сервер под Linux

Проверим поддерживает ли система NFS

cat /proc/filesystems | grep nfs

Под Arch Linux сервер и клиент находиться в одном пакете

yaourt -S nfs-utils 

Для установки сервера (nfs-kernel-server) и клиента (nfs-common) под Ubuntu необходимы пакеты

sudo apt-get install nfs-kernel-server nfs-common portmap

Дальше в заметке для сервера будет использоваться IP 192.168.1.100. Для того что бы за сервером всегда был закреплен один и тот же IP необходимо в DHCP-сервере (чаще всего роутер) указать раздачу конкретного IP конкретному MAC-адресу. Или поднять свой локальный DNS-сервер. Например dnsmasq или bind.

MAC-адрес можно узнать с помощью ifconfig (поле ether в Arch Linux).

NFSv4 предполагает что есть корневая директория, внутри которой уже расположены файлы для раздачи. Например, /srv/nfs - корень, /srv/nfs/audio - директория для раздачи музыки. Если не следовать этому новому указанию в версии 4, то можно получить ошибку при подключении клиентом:

mount.nfs: access denied by server while mounting 192.168.1.100:/home/proft/torrents

Если все же хочется использовать на сервере подход без корневой-директории для NFS, то при монтировании клиентом надо явно указать версию 3

# для команды mount
mount -o 'vers=3' 192.168.1.100:/home/proft/torrents /home/proft/nfs/torrents

# для fstab
192.168.1.100:/home/proft/torrents /home/proft/nfs/torrents nfs soft,nfsvers=3 0 0

Я буду использовать NFSv4 с root-директорией в /srv/nfs/ и монтированием вложенных директорий с помощью mount --bind.

Предположим, что мы хотим

  • раздавать директорию ~/torrents с rw доступом для всех внутри локальной сети;
  • раздавать директорию ~/photos с ro доступом для хоста с IP 192.168.1.101;

Для начала создадим корневую директорию и необходимые вложенные.

sudo mkdir -p /srv/nfs/{torrents,photos}

Примонтируем существующие директории torrents, photos в /srv/nfs.

# sudo vim /etc/fstab

/home/proft/torrents /srv/nfs/torrents none bind 0 0
/home/proft/photos /srv/nfs/photos none bind 0 0

Отредактируем /etc/exports, в котором описываются все директории для совместного доступа

# sudo vim /etc/exports
# формат файла: directory allowed-hosts(options)

/srv/nfs/torrents 192.168.1.1/24(rw,async)
/srv/nfs/photos 192.168.1.101(ro,async)

Обратите внимание на отсутствие пробела между allowed-hosts и (options). Наличие пробела вводит другую трактовку правил.

Доступные опции:

  • ro (rw) - разрешить доступ только на чтение (чтение/запись);
  • subtree_check (no_subtree_check)- в некоторых случаях приходится экспортировать не весь раздел, а лишь его часть. При этом сервер NFS должен выполнять дополнительную проверку обращений клиентов, чтобы убедиться в том, что они предпринимают попытку доступа лишь к файлам, находящимся в соответствующих подкаталогах. Такой контроль поддерева (subtree checks) несколько замедляет взаимодействие с клиентами, но если отказаться от него, могут возникнуть проблемы с безопасностью системы. Отменить контроль поддерева можно с помощью опции no_subtree_check. Опция subtree_check, включающая такой контроль, предполагается по умолчанию. Контроль поддерева можно не выполнять в том случае, если экспортируемый каталог совпадает с разделом диска;
  • sync (async) - указывает, что сервер должен отвечать на запросы только после записи на диск изменений, выполненных этими запросами. Опция async указывает серверу не ждать записи информации на диск, что повышает производительность, но понижает надежность, т.к. в случае обрыва соединения или отказа оборудования возможна потеря данных;
  • noaccess — запрещает доступ к указанной директории. Может быть полезной, если перед этим был задан доступ всем пользователям сети к определенной директории, и теперь хотите ограничить доступ в поддиректории лишь некоторым пользователям;
  • no_root_squash – по умолчанию пользователь root на клиентской машине не будет обладать теми же правами к директории на сервера. Эта опция снимает это ограничение;
  • nohide - NFS автоматически не показывает нелокальные ресурсы (например, примонтированые с помощью mount --bind), эта опция включает отображение таких ресурсов;
  • insecure - использование непривилегированных портов (> 1024);

Запускаем NFS-сервер

# под archlinux
sudo systemctl start rpc-idmapd.service rpc-mountd.service

# под ubuntu
sudo /etc/init.d/nfs-kernel-server start

В дальнейшем при изменении конфигурационного файла достаточно его перечитать командой:

sudo exportfs -rav

Команда rpcinfo -p | grep nfs позволяет проверить успешность запуска сервера.

Клиент под Linux

Установка

# под archlinux
yaourt -S nfs-utils

# под ubuntu
sudo apt-get install portmap nfs-common

Создадим директории для монтирования сетевых ресурсов torrents и photos

mkdir -p ~/nfs/{torrents,photos}

Для ручного монтирования выполним

sudo mount -t nfs -o rw,soft 192.168.1.100:/srv/nfs/torrents /home/proft/nfs/torrents
sudo mount -t nfs -o rw,soft 192.168.1.100:/srv/nfs/photos /home/proft/nfs/photos

Опция soft указывает тихо отменить попытки подключить шару после определенного количества времени (время задается опцией retrans). Подробнее в man nfs.

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

Для автоматического монтирования редактируем файл /etc/fstab

# sudo vim /etc/fstab
192.168.1.100:/srv/nfs/torrents /home/proft/net/torrents nfs rw,soft 0 0
192.168.1.100:/srv/nfs/photos /home/proft/net/photos nfs ro,soft 0 0

Но и у этого способа есть свои недостатки, например, если сервер не доступен то загрузка клиента может подвиснуть из-за попыток подключиться к NFS-серверу. Для исправления этого см. ниже про AutoFS.

AutoFS - автоматическое подключение сетевых ресурсов

Есть возможность монтировать удаленный ресурс с помощью AutoFS при первом обращении и автоматически отмонтировать при отсутствии активности.

AutoFS использует для настройки шаблоны, расположенные в /etc/autofs. Основной шаблон называется auto.master, он может указывать на один или несколько других шаблонов для конкретных типов носителей.

Установка

# под archlinux
yaourt -S autofs

# под ubuntu
sudo apt-get install autofs

Существует несколько способов указать способы автомонтирования. Я использую такой: в /home/proft/nfs автоматически создается директория с именем NFS-сервера, в которой автоматически создаются доступные директории на сервере.

# sudo vim /etc/autofs/auto.master

/home/proft/nfs /etc/autofs/auto.nfs --timeout=60

Дополнительный параметр timeout устанавливает количество секунд после которых устройство будет размонтировано. Параметр ghost указывает что сконфигурированные ресурсы будут отображаться всегда, а не только тогда, когда они доступны (эта опция включена по умолчанию в AutoFS 5)

Опишем в /etc/autofs/auto.nfs NFS-сервер и root-директорию.

# sudo vim /etc/autofs/auto.nfs

nfsserver 192.168.1.100:/srv/nfs

Теперь при первом обращении /home/proft/nfs/torrents произойдет автоматическое монтирование NFS-ресурса.

Перезапустим службу autofs:

# под archlinux
sudo systemctl restart autofs

# под ubuntu
sudo /etc/init.d/autofs restart

Еще можно указать время ожидания доступности NFS-ресурса. Для этого необходимо изменить значения MOUNT_WAIT.

# под archlinux
# sudo vim /etc/conf.d/autofs
MOUNT_WAIT=5

# под ubuntu
sudo /etc/default/autofs
MOUNT_WAIT=5

Форсирование использования NFS v3

В некоторых случаях NFSv4 может работать медленно. Для исправления этого можно принудительно указать использовать третью версию.

#sduo vim /etc/nfsmount.conf

Defaultvers=3
Nfsvers=3

На клиенте, если используется AutoFS тоже надо указать NFSv3

# sudo vim /etc/conf.d/autofs

MOUNT_NFS_DEFAULT_PROTOCOL=3

После этого надо перезапустить сервер NFS и AutoFS.

Мониторинг ресурсов NFS

nfsstat -s (на сервере) - выводит полезную статистику, например, если badcalls больше 0 то есть проблемы с передачей файлов.

showmount -e (на сервере) - выводит список расшариваемых ресурсов.

showmount -e 192.168.1.100 (на клиенте) - выводит список расшариваемых ресурсов на сервере 192.168.1.100.

nfsstat -c (на клиенте) - выводит полезную статистику.

nfsstat -m (на клиенте) - выводит информацию о подключенных NFS-ресурсах.

Клиент под Windows

А вот тут начинаются приключения :). NFS-клиент под Windows 7 есть, но по-умолчанию не установлен.

Для включения NFS-клиента идем в Панель управления > Программы и компоненты > Установка и удаление программ > Включение или отключение компонентов Windows > Службы для NFS и выбираем Клиент для NFS и Администрирование.

Если окно пустое, как в моем случаи было, читаем "Windows Features" dialog box is empty ... или Fix for Blank or Empty Windows Features List in Vista and 7.

Если получилось включить NFS-клиент выше описанным способом то теперь осталось подключить шары с помощью команды mount.

mount 192.168.1.100:/srv/nfs/torrents z:

где

  • 192.168.1.100 – адрес NFS-сервера;
  • /srv/nfs/torrents – общий ресурс на сервере;
  • z: – незанятая буква диска в Windows, к которой будет подключен ресурс;

Если выше описанный способ не заработал то воспользуемся nekodrive. Для этого установим:

Запускаем NekoDrive, вводим IP сервера, монтируем ресурс.

Дополнительное чтиво

blog comments powered by Disqus