Страница 1 из 1

[RPC][fuse][linux] Цепляем v2r к fuse

СообщениеДобавлено: 02 июл 2016, 02:39
nwnclv
И снова всех приветствую.

Очень давно тут не был и как увидел, кто-то даже отвечал в темы, мной созданные. Странно, что уведомлений я не получал. Ну да ладно, лирика.
Тут на днях упоролся и накидал fuse клинета для ferro_remote. Зачем? А просто так. Про sshfs знаю. Писал, скорее, для себя, да и вообще интересно было.
Сразу исходники тут.
Собранные бинари для v2r/RPi тут. Бинарей там 2. Агент и клиент. Собраны статически, так что проблем быть не должно.

Чоэта?
Это fuse-клинет, который позволяет в системе linux подключить удаленную fs, как локальную.

Азачем, если есть вот_такой_вот_везде_распространенный_сервер_клиент?
А просо так. Самбу было ставить влом, по ssh копировать надоело. Да и вообще just for fun увеличил энтропию вселенной.

========
Состоит это все из клиента и сервера. Сервер - это агент ferro_remote, а клиент это второй бинарник, который связывается с подсистемой fuse и маунтит удаленный девайс в указанную директорию. Агент и клиент могут запускаться на любой linux-машине в том числе и на v2r. Можно сделать mount одной v2r в другую. Можно сделать mount v2r на рабочую машину (ну, если там linux, да), можно наоборот замапить директорию с рабочей машины на v2r.

Как работает?
*тут стоить отметить, что моя v2r сейчас героически управляет парником жены моего товарища (биолог она), так что все эксперименты провожу на Raspbery Pi, но проблем с v2r быть не должно*

Возьмем 2 хоста. Допустим, A - это будет девайс v2r, а B это рабочий ноут.
На хосте А запустим агента:
Код: Выделить всё
./ferro_remote_agent -s 0.0.0.0:12345 -l- -Ldebug
2015-Nov-28 22:42:26.681147 [INF] [log] Started.
2015-Nov-28 22:42:26.682098 [INF] [lua] Started.
2015-Nov-28 22:42:26.683017 [INF] [os] Started.
2015-Nov-28 22:42:26.690560 [INF] [fs] Started.
2015-Nov-28 22:42:26.696789 [INF] [i2c] Started.
2015-Nov-28 22:42:26.699777 [INF] [spi] Started.
2015-Nov-28 22:42:26.703792 [INF] [gpio] Started
2015-Nov-28 22:42:26.705917 [INF] [listener] tcp://0.0.0.0:12345 started
2015-Nov-28 22:42:26.706009 [INF] [listener] Started.
2015-Nov-28 22:42:26.706086 [INF] [main] Agent started.
.......

тут:
-s - имя точки, которую нужно открыть. 0.0.0.0:12345 - tcp порт 12345 для любого интерфейса
-l - имя файла, в который писать лог. "-" это stdout
-L - уровень логов. тут debug

на рабочей машине (то есть B) создадим директрию, куда будем мапить устройство. Например /home/data/fuse
Теперь просто сделаем mount.
Код: Выделить всё
./frfuse_client -s 192.168.1.11:12345 -m /home/data/fuse/

192.168.1.11:12345 это адрес того самого девайса А.
-m /home/data/fuse/ - локальный mountpoint

frfuse_client соединится с удаленной машиной уже будучи в демоне.

Теперь
Код: Выделить всё
> ls -la /home/data/fuse/
drwxr-xr-x   2 root root  4096 сент. 14  2015 bin/
drwxr-xr-x   3 root root 16384 янв.   1  1970 boot/
drwxr-xr-x   3 root root  4096 сент.  9  2015 boot.bak/
drwxr-xr-x  14 root root  3280 нояб. 29  2015 dev/
drwxr-xr-x 120 root root 12288 нояб. 29  2015 etc/
drwxr-xr-x   3 root root  4096 мая    7  2015 home/
drwxr-xr-x  19 root root  4096 сент. 14  2015 lib/
drwx------   2 root root 16384 мая    7  2015 lost+found/
drwxr-xr-x   2 root root  4096 мая    7  2015 media/
drwxr-xr-x   2 root root  4096 сент. 13  2015 mnt/
drwxr-xr-x   5 root root  4096 сент. 13  2015 opt/
dr-xr-xr-x  92 root root     0 янв.   1  1970 proc/
drwx------   2 root root  4096 сент. 13  2015 root/
drwxr-xr-x  19 root root   700 нояб. 29  2015 run/
drwxr-xr-x   2 root root  4096 сент. 14  2015 sbin/
drwxr-xr-x   2 root root  4096 мая    7  2015 srv/
dr-xr-xr-x  11 root root     0 янв.   1  1970 sys/
drwxrwxrwt   8 root root  4096 нояб. 29  2015 tmp/
drwxr-xr-x  10 root root  4096 мая    7  2015 usr/
drwxr-xr-x  11 root root  4096 мая    7  2015 var

Все, устройство подключено. Это его корень. Можно походить по директориям.


Поддержка
Клиент поддерживает практически все нужные для создания, удаления, записи, чтения файлов и директорий операции.
Не поддерживается смена времени (touch работать не будет). Не поддерживается смена режима, владения (chown, chmod тоже пролетают). Они просто не предусмотрены протоколом ferro_remote.
Все остальное (создание, удаление, переименование директорий/файлов, запись, чтение файла ) работает.

Параметры клиента
Клиент требует два обязательных параметра -s и -m, которые скажут ему откуда и куда подключить.

Демона-клиента можно остановить вызвав
Код: Выделить всё
> fusermount -u /home/data/fuse/

Это остановит процесс и размапит дирекотрию.

Клиента можно запустить в foreground (ключ -f). тогда он не будет уходить в демона и прибить его можно будет Ctrl+C
Клиента можно попросить писать дебажный вывод (ключ -d) и тогда он будет спамить на консоль много инфы. Работает вкупе с -f

Агент и клиент поддерживают базовую аутентификацию. параметр --key (как у agent, так и у client) скажет, что нужно использовать данный ключ для соединения. И никто, кому этот ключ неизвестен, подключиться не сможет.
Код: Выделить всё
>
./frfuse_client -s 192.168.1.11:12345 -m /home/data/fuse/ -f -d --key=1234
FUSE library version: 2.9.4
nullpath_ok: 0
nopath: 0
utime_omit_ok: 0
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0
INIT: 7.23
flags=0x0003f7fb
max_readahead=0x00020000
   INIT: 7.19
   flags=0x00000010
   max_readahead=0x00020000
   max_write=0x00020000
   max_background=0
   congestion_threshold=0
   unique: 1, success, outsize: 40
unique: 2, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 1781
   unique: 2, error: -38 (Function not implemented), outsize: 16
unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47, pid: 1781
LOOKUP /.Trash
getattr /.Trash
   unique: 3, error: -2 (No such file or directory), outsize: 16
unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 52, pid: 1781
LOOKUP /.Trash-1000
getattr /.Trash-1000
   unique: 4, error: -2 (No such file or directory), outsize: 16


А, да. Писал клиента дня два, так что возможно куча багов и падений, например
Код: Выделить всё
terminate called after throwing an instance of 'vtrc::common::exception'
  what():  Operation canceled
fish: “./frfuse_client -s 192.168.1.11…” terminated by signal SIGABRT (Abort)

Бага проявляется, когда клиент читает директорию, а агент завершается по ctrl+c. Просто необработанное исключение осталось. После подобного нужно сделать fusermount -u /home/data/fuse/ иначе fuse не сможет снова замапить директорию.
Поправлю этот баг :oops: .

PS: не слудует, однако, мапить хост сам в себя и вот почему: клиент ограничен 2 потоками и если он пойдет в директорию, в которую замплен сам, то попадает в банальный дедлок и вылетит по timeout. Не надо так.

PPS: написал все довольно сумбурно, но чукча не писатель ... особенно в 2 часа ночи.

Засим все. Надеюсь пригодится кому. На вопросы, если появятся, отвечу.
¡Saludos!

Re: [RPC][fuse][linux] Цепляем v2r к fuse

СообщениеДобавлено: 06 июл 2016, 00:50
nwnclv
Поправил вылет по исключению, добавил фейковые chmod, chown, utime. Теперь можно делать touch (создает файл, но время не выставляет правильно) и редакторы типа gedit сохраняет файлы, открытые с устройства и не ругаются на "not implemented".

Сборка fuse client и agent для virt2real тут как обычно. Статическая, как обычно, сборка.

Re: [RPC][fuse][linux] Цепляем v2r к fuse

СообщениеДобавлено: 08 июл 2016, 12:46
pek
а где живете?
может виртурилку подогнать для отлаживания?

Re: [RPC][fuse][linux] Цепляем v2r к fuse

СообщениеДобавлено: 08 июл 2016, 15:50
nwnclv
pek писал(а):а где живете?
может виртурилку подогнать для отлаживания?


Спасибо, уже отжал виртурилку. =) Агент на ней работает, могу ее зацепить и работать с файлами, директориями. Даже музыка играет и rhythmbox может теги файлам править.
fuse_client тоже мапит нормально с девайса.

Re: [RPC][fuse][linux] Цепляем v2r к fuse

СообщениеДобавлено: 09 июл 2016, 18:29
pek
может сделать так. чтобы было доступно через opkg-cl install ?

Re: [RPC][fuse][linux] Цепляем v2r к fuse

СообщениеДобавлено: 09 июл 2016, 21:53
nwnclv
pek писал(а):может сделать так. чтобы было доступно через opkg-cl install ?


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

Re: [RPC][fuse][linux] Цепляем v2r к fuse

СообщениеДобавлено: 14 июл 2016, 13:51
nwnclv
Доделал пару вызов. Протащил chmod, utime и truncate в протокол.

Теперь можно моргать диодом виртурилки (!!!) прям с локальной машины.
Код: Выделить всё
 fuse $ pwd
/home/data/fuse
 fuse $ echo "1" > proc/v2r_gpio/pwctr3
 fuse $ echo "0" > proc/v2r_gpio/pwctr3
 fuse $ la proc/v2r_gpio/pwctr3
-r--r--r-- 1 root root 0 янв  1  2000 proc/v2r_gpio/pwctr3


Плохая новость в том, что в /dev писать fuse клинет отказывается. И это странно, потому как с lua_client и qml_client файл вполне пишут. Но, видимо, какая-то особенность fuse.

Работают так же способы, описанные тут