Очень давно тут не был и как увидел, кто-то даже отвечал в темы, мной созданные. Странно, что уведомлений я не получал. Ну да ладно, лирика.
Тут на днях упоролся и накидал 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 не сможет снова замапить директорию.
Поправлю этот баг

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