Jump to content
zyxmon

Ядерный nfs сервер на кинетике

Recommended Posts

Репозиторий entware включает в себя два nfs сервера - userspace сервер unfs3 и ядерный. В связи с возможностью установки дополнительных модулей ядра - viewtopic.php?f=3&t=471

расширились и возможности кинетика. В этом сообщении я покажу как поднять ядерный nfs сервер.

Первое, что нужно сделать, это установить нужные модули. См. скриншот:

nfs.png

В момент написания данной заметки все установленные модули автоматически загружаются. Делать insmod или modprobe не нужно.
Второе- установим и запустим pormap

opkg install portmap
/opt/etc/init.d/S55portmap start


(После перезагрузок pormap будет автоматически запускаться)
Третье - установим сервер

opkg install nfs-kernel-server


Четвертое - отредактируем файл /opt/etc/exports 

 # cat /opt/etc/exports
/opt    *(rw,no_root_squash,insecure,sync,no_subtree_check)


Я в этом примере расшариваю всем всю директорию /opt на запись 
Пятое - удалим скрипт запуска и заменим его другим

rm /opt/etc/init.d/S57nfs-kernel-server
wget http://pkg.entware-keenetic.ru/binaries/S20nfsd -O /opt/etc/init.d/S20nfsd
chmod +x /opt/etc/init.d/S20nfsd


Шестое. Запустим скрипт запуска

/opt/etc/init.d/S20nfsd start


Седьмое - профит!  :D

PS Лучше переименовать скрипты запуска portmap и nfsd, чтобы portmap запускался первым.
PPS. Содержимое S20nfsd:

 # cat /opt/etc/init.d/S20nfsd
#!/bin/sh
# Copyright (C) 2006 OpenWrt.org
	PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NFS_D=/opt/var/lib/nfs
LOCK_D=/opt/var/lib/nfs/sm
	start() {
        grep -q /proc/fs/nfsd /proc/mounts || \
                mount -t nfsd nfsd /proc/fs/nfsd
        mkdir -p $LOCK_D
        touch $NFS_D/rmtab
        sysctl -w fs.nfs.nlm_tcpport=32777 fs.nfs.nlm_udpport=32777 > /dev/null
        rpc.statd -p 32778 -o 32779
        exportfs -r
        rpc.nfsd
        rpc.mountd -p 32780
}
	stop() {
        killall rpc.mountd 2> /dev/null
        rpc.nfsd 0 2> /dev/null
        exportfs -au
        killall rpc.statd 2> /dev/null
        grep -q /proc/fs/nfsd /proc/mounts && \
                umount /proc/fs/nfsd
}
	reload() {
        exportfs -r
}

case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            stop
            start
            ;;
        reload)
                reload
            ;;
        link_up)
                ;;
        ppp_up)
            ;;
        link_down)
            ;;
        ppp_down)
            ;;
        *)
            echo "Usage: $0 {start|stop|restart|reload|link_up|link_down|ppp_up|ppp_down}"
            ;;
esac

Share this post


Link to post
Share on other sites

Проверка быстродействия.

Сразу отмазка - в качестве носителя использовалась далеко не самая быстрая флешка с ext2. Роутер Extra.

Монтировалось на НАСе с Intel Atom (-o vers=3,udp)

Запись

dd if=/dev/zero of=tempfile bs=100k count=10240
10240+0 records in
10240+0 records out
1048576000 bytes (1.0 GB) copied, 349.182 s, 3.0 MB/s

CPU загружен в районе 30%.

Чтение этого же файла

 dd if=./tempfile  of=/dev/null bs=100k
10240+0 records in
10240+0 records out
1048576000 bytes (1.0 GB) copied, 82.6796 s, 12.7 MB/s

CPU загружен в районе 60%. Данные привожу для сравнения с неядерным unfs3

Share this post


Link to post
Share on other sites

Несколько слов о userspace nfs сервере unfs3.

Устанавливается он командой `opkg install unfs3`. Для работы так же нужен запущенный portmap.

Файл /opt/etc/exports можно такой (расшариваем на запись /opt)

 # cat /opt/etc/exports
/opt    (rw,no_root_squash,insecure)

Скрипт запуска `/opt/etc/init.d/S56unfsd`

Быстродействие (условия из сообщения выше)

Скорость записи печальная

# dd if=/dev/zero of=tempfile bs=100k count=10240
10240+0 records in
10240+0 records out
1048576000 bytes (1.0 GB) copied, 1209.39 s, 867 kB/s

Загрузка CPU не выше, чем для ядерного сервера.

Скорее всего виновник таких низких скоростей - флешка. Измерения скорости несколько лет назад с hdd показывало превосходство unfs3 над samba и заметно более высокие скорости записи.

А вот чтение - быстрее !!!

# dd if=./tempfile  of=/dev/null bs=100k
10240+0 records in
10240+0 records out
1048576000 bytes (1.0 GB) copied, 64.5975 s, 16.2 MB/s

При загрузке CPU около 90%.

Вывод - если nfs сервер нужен для предоставления контента мультимедиа плееру (transmission на кинетике, плеер берет скачанное по nfs), unfs3 вполне подойдет.

Edited by Guest

Share this post


Link to post
Share on other sites

Для nfs-kernel-server, сыпит

Jun 19 11:25:29ndmkernel: RPC: fragment too large: 0x7f010000
Jun 19 11:25:35ndmkernel: RPC: fragment too large: 0x7f010000
Jun 19 11:25:41ndmkernel: RPC: fragment too large: 0x7f010000
Jun 19 11:25:41ndmCore::Syslog: last message repeated 2 times.

Share this post


Link to post
Share on other sites
Для nfs-kernel-server, сыпит

А у меня не сыпЕт. Для начала спросите тут - http://obninsk.name/tele/

Главное в п.3.

Какое устройство, прошивка, клиент, с какими опциями монтируется на клиенте? Чему равно

cat /proc/fs/nfsd/max_block_size

А что если у клиента при монтировании уменьшить wsize до этого значения?

Учитесь искать решение самостоятельно. Потом делиться найденным!

Много лет назад я слышал такое сравнение - Windows - это пельмени в пачке из магазина. Linux - это мука, мясо, соль, специи, мясорубка и поваренная книга. Если постараться, выйдет вкусно, если нет - хуже чем из магазина. Но поваренную книгу читать нужно и поработать придется, чтобы было вкусно.

Share this post


Link to post
Share on other sites

На клиенте невозможно ничего сделать, китайцы защитились от ковыряния девайса.

Документации на сервер все равно что нет, все что есть очень скудно.

cat /proc/fs/nfsd/max_block_size возвращает 8192

Видел что кто-то пробовал менять, но как делал не пишет

Соответственно вопрос, параметр может быть изменен на сервере или нет?

омни v2.07(AAKU.10)B0

клиент - ip камера, трогать можно, но опасно, могу только методом тыка попробовать подобрать настройки сервера

Share this post


Link to post
Share on other sites
...

Соответственно вопрос, параметр может быть изменен на сервере или нет?

...

Клиент позволяет запустить команду mount без параметров, чтобы узнать размер буферов чтения и записи?

Гугл говорит, что начиная с ядра 3.4 значение max_block_size вычисляется автоматически в зависимости от размера RAM. У меня на Extra RAM в два раза больше и max_block_size в 2 раза больше.

Можно попробовать через echo увеличить это значение, посмотрев, что клиент запрашивает.

Вот в этом месте

....
grep -q /proc/fs/nfsd /proc/mounts || \
               mount -t nfsd nfsd /proc/fs/nfsd

echo 32768 >  /proc/fs/nfsd/max_block_size

       mkdir -p $LOCK_D
.....        

Может поможет, но не уверен.

Share this post


Link to post
Share on other sites

Помогло, хоть я цели не достиг, но удалось увеличить буфер до 32к, более не поднимается

Share this post


Link to post
Share on other sites

Еще чуть помучил, максимально поднял до 1048576 (1024к), но пришлось править строчку

rpc.statd -p 1048576 -o 1048577

ну вот, сгустились тучи над камерой...

Share this post


Link to post
Share on other sites

rpc.statd -p 1048576 -o 1048577

это номера портов

usage: rpc.statd [options]
     -h, -?, --help       Print this help screen.
     -F, --foreground     Foreground (no-daemon mode)
     -d, --no-syslog      Verbose logging to stderr.  Foreground mode only.
     -p, --port           Port to listen on
     -o, --outgoing-port  Port for outgoing connections
     -V, -v, --version    Display version information and exit.
     -n, --name           Specify a local hostname.
     -P                   State directory path.
     -N                   Run in notify only mode.
     -L, --no-notify      Do not perform any notification.
     -H                   Specify a high-availability callout program.

У меня с буфером 16k и нормальным клиентом проблем нет. Если nfs нужен для чтения с кинетика - имеет смысл попробовать unfs3.

Share this post


Link to post
Share on other sites
На клиенте невозможно ничего сделать, китайцы защитились от ковыряния девайса.

....

Первое, что стоит сделать - проверить сервер с нормального клиента. Может и не китайцы виноваты.

Дополнение 1. Насколько понял - значение /proc/fs/nfsd/max_block_size играет роль только для tcp. Подключился клиентом по tcp. Он поставил буферы в 32k (у меня max_block_size=16k) скопировал несколько файлов туда-сюда. Ошибки нет. На всякий пожарный (если копаем в правильном направлении). Размер 8k минимальный и задается тут

https://github.com/ndmsystems/linux-3.4 ... svc.c#L308

Так он задавался всегда. А ядерный nfs сервер заводили еще на белых кинетиках без проблем (по tcp).

Дополнение 2. Вот оно сообщение об ошибке - https://github.com/ndmsystems/linux-3.4 ... ck.c#L1018

Только для tcp. Нужно проверить работу сервера по tcp с нормального некитайского клиента и делать выводы. У меня на Extra - работает. Может нужна особая ситуация, когда ошибка возникает?

Share this post


Link to post
Share on other sites

OmniII v2.07(AAUS.10)B0 + *nix (Ubuntu/FreeBSD/Debian)

размер по дефолту - 8k

~ # cat /proc/fs/nfsd/max_block_size
8192

монтирование по udp/tcp

mount -t nfs 192.168.1.7:/opt /media/nfs/ -o vers=3,udp
mount -t nfs 192.168.1.7:/opt /media/nfs/ -o vers=3,tcp

копирование файла туды-суды (пример)

~$ cp /home/thebb/zyxel/kng_rb_draft_2.06.B.3.0-4.bin /media/nfs/tmp/
~$ cp -rf /media/nfs/tmp/kng_rb_draft_2.06.B.3.0-4.bin /home/thebb/zyxel/

часть сислога

[i] Jun 20 13:51:35 rpc.mountd[3350]: Caught signal 15, un-registering and exiting.
[W] Jun 20 13:51:35 ndm: kernel: nfsd: last server has exited, flushing export cache
[i] Jun 20 13:51:35 rpc.statd[3850]: Version 1.3.3 starting
[W] Jun 20 13:51:35 rpc.statd[3850]: Running as root.  chown /opt/var/lib/nfs to choose different user
[W] Jun 20 13:51:35 ndm: kernel: svc: failed to register lockdv1 RPC service (errno 124).
[i] Jun 20 13:51:35 rpc.mountd[3864]: Version 1.3.3 starting
[i] Jun 20 14:18:49 rpc.mountd[3864]: authenticated mount request from 192.168.1.5:814 for /opt (/opt)
[i] Jun 20 14:23:22 rpc.mountd[3864]: authenticated unmount request from 192.168.1.5:723 for /opt (/opt)
[W] Jun 20 14:32:25 ndm: kernel: svc: 192.168.1.50, port=719: unknown version (4 for prog 100003, nfsd)
[i] Jun 20 14:32:25 rpc.mountd[3864]: authenticated mount request from 192.168.1.50:991 for /opt (/opt)
[i] Jun 20 14:33:06 rpc.mountd[3864]: authenticated unmount request from 192.168.1.50:722 for /opt (/opt)
[i] Jun 20 14:35:27 rpc.mountd[3864]: authenticated mount request from 192.168.1.50:849 for /opt (/opt)
[i] Jun 20 14:43:15 rpc.mountd[3864]: authenticated unmount request from 192.168.1.50:961 for /opt (/opt)
[i] Jun 20 14:43:39 rpc.mountd[3864]: authenticated mount request from 192.168.1.50:1022 for /opt (/opt)

как говорят умные люди со светлыми головами, это "svc: failed to register lockdv1 RPC service (errno 124)" - нормально, при наличии ipv6

Share this post


Link to post
Share on other sites

Если что нужно подкрутить в дефолтах - агрментировано пишите в тему про модули, сделаем.

Share this post


Link to post
Share on other sites
В 18.06.2016 в 12:22, zyxmon сказал:

Первое, что нужно сделать, это установить нужные модули. См. скриншот:

Прошу уточнить второе: как настраивать и как отлаживать, логи в журнале кинетика молчат, сам сервер молчит, никому не отвечает. Появился файл exports-opkg...

Share this post


Link to post
Share on other sites
24 минуты назад, Дмитрий сказал:

Прошу уточнить второе: как настраивать и как отлаживать

Вам слова из инструкции непонятны? Какие. Настраивать нужно по инструкции. Отлаживать по логам из журнала.

Share this post


Link to post
Share on other sites
28 минут назад, zyxmon сказал:

Настраивать нужно по инструкции. 

Если имеете ввиду свой первый пост, то там описана установка.

После установки и перезапуска роутера в логах ничего нет похожего на nfs start.

Сервер на 2049 порту молчит.

Edited by Дмитрий

Share this post


Link to post
Share on other sites
27 минут назад, Дмитрий сказал:

Если имеете ввиду свой первый пост, то там описана установка.

К сожалению описание установки исчезло из первого сообщения. По крайней мере мне инструкция не видна. Желания восстанавливать инструкцию у меня нет. Может снова пропасть.

В третьем сообщении этого топика осталась инструкция об unfs - можете ее попробовать.

Наверное пора завязывать с публикацией пропадающих инструкций.

Share this post


Link to post
Share on other sites
1 минуту назад, jino сказал:

Нету этого файла, подскажите где взять?

Листинг файла есть в теме.

Share this post


Link to post
Share on other sites
В 2017-5-19 в 15:53, zyxmon сказал:

Листинг файла есть в теме.

Спасибо нашел :)

Теперь такая проблема хочу расшарить по NFS диск с файловой системой HFS+ примонтирован автоматически в /tmp/mnt/KINO

для этого пишу в файле /opt/etc/exports

/tmp/mnt/KINO *(rw,no_subtree_check,all_squash,insecure,sync)

и после этого команда exportfs -arv

выдает 

exporting *:/tmp/mnt/KINO

exportfs: /tmp/mnt/KINO does not support NFS export

И я не могу смонтировать диск, хотя  showmount на компьютере показывает, а при подсоединении пишет что нет прав на подключение.

showmount -e  192.168.2.1

Exports list on 192.168.2.1:

/tmp/mnt/KINO                       *

 

Share this post


Link to post
Share on other sites

А у кого-то получилось расшарить HFS+ по NFS?

Share this post


Link to post
Share on other sites

Всем доброго времени суток!

Подскажите, это особенность NFS в целом, или конкретной сборки:

если я запускаю portmap с параметром -i 127.0.0.1 (тоже, что и -l) или -i 0.0.0.0/0, или не указываю этот параметр вовсе, то запуск остальных компонентов происходит нормально. Но, если я пытаюсь привязать portmap к ip-адресу vlan'а домашней сети, то rpc.nfsd при запуске вываливает в лог

Цитата

rpc.nfsd: Created AF_INET TCP socket.
rpc.nfsd: writing fd to kernel failed: errno 146 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd

rpc.mountd и rpc.statd выдают

Цитата

Cannot register service: RPC: Unable to receive; errno = Connection refused

А rpc.statd еще и sm-notify не в том месте ищет:

Цитата

rpc.statd: failed to run /usr/sbin/sm-notify

в то время как sm-notify лежит здесь: /opt/sbin/sm-notify. Симлинк создать нет возможности, по причине того, что /usr/sbin только для чтения.

Хотя, отсутствие sm-notify на запуск не влияет (при "правильно" запущенном portmap).

 

И сразу еще вопрос до кучи:

я правильно понимаю из вывода

Цитата

cat /proc/fs/nfsd/versions
-2 +3

что ядерный модуль не умеет четвертую версию NFS, и nfsd бесполезно запускать с поддержкой оной?

 

Keenetic Giga II, 2.09.C.1.0-0, Entware-3x

Share this post


Link to post
Share on other sites
23 минуты назад, Egor Staver сказал:

А rpc.statd еще и sm-notify не в том месте ищет:

Скорее всего это баг Entware.

23 минуты назад, Egor Staver сказал:

что ядерный модуль не умеет четвертую версию NFS, и nfsd бесполезно запускать с поддержкой оной?

Причина скорее не в модуле, а тут - https://github.com/Entware-for-kernel-3x/entware-packages-3x/blob/master/net/nfs-kernel-server/Makefile#L75

Share this post


Link to post
Share on other sites

Ну да, я неправильно выразился - модуль не "не умеет", а собран без поддержки.

Кстати, нет предположений, по каким причинам потребовалось отключать версии 4 и 4.1?

Share this post


Link to post
Share on other sites
3 минуты назад, Egor Staver сказал:

по каким причинам потребовалось отключать версии 4 и 4.1?

С этим к openwrt. Взято у них - https://github.com/openwrt/packages/blob/master/net/nfs-kernel-server/Makefile#L78

@TheBB можно попросить собрать без этих опций и исправить баг (проверил, имеется) с путями. Но тогда с Вас тестирование.....

Share this post


Link to post
Share on other sites

На тестирование согласен =)

А ведь Entware берет исходники OpenWrt и собирает их в чистом виде (с учетом патчей, которые в репозитории Entware-for-kernel-3x на гитхабе)? Или я ошибаюсь?

То есть, если разбираться с биндингом portmap'a к конкретному адресу и невозможности запуска nfsd после этого, то смотреть надо эти исходники: https://github.com/openwrt/ ?

Share this post


Link to post
Share on other sites
17 минут назад, Egor Staver сказал:

Или я ошибаюсь?

Entware использует некую модификацию buildroot от openwrt (самое вахжное - изменение пути по умолчанию, добавления префикса /opt). Модифицирует аналогичным образом Makefile для пакетов, добавляет патчи для пакетов. Исходники пакетов - общие от авторов пакета.

Нужно смотреть Makefile пакета тут - https://github.com/openwrt/packages (для других фидов рядом) и исходники самого пакета.

Есть и свои фиды у Entware. См - https://github.com/Entware-for-kernel-3x

Share this post


Link to post
Share on other sites

К слову поддержка nfs v4 зависит и от ядра, того как собраны модули. В Openwrt/lede такой поддержки нет. Не факт, что есть в кинетиках. С этим к разработчикам прошивок.

Share this post


Link to post
Share on other sites
9 часов назад, Egor Staver сказал:

Ну да, я неправильно выразился - модуль не "не умеет", а собран без поддержки.

Кстати, нет предположений, по каким причинам потребовалось отключать версии 4 и 4.1?

Да, собрано без NFSv4 и 4.1.

Это сделано специально, потому что 3.4 ядро уже достаточно древнее и v4 там реализован очень криво.

В современных ядрах ситуация лучше, как будем переходить на них (рано или поздно) - тогда и включим v4.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...