Используйте USBIP для устройств, которые удаляются и подключаются повторно.

Используйте USBIP для устройств, которые удаляются и подключаются повторно.

Я использую usbip и Raspberry Pi, чтобы расширить диапазон беспроводной клавиатуры до компьютера, который находится слишком далеко для того, чтобы клавиатура работала надежно сама по себе.

Иногда USB-приемник клавиатуры повторно подключается и используется в другом месте, но при повторном подключении к Raspberry Pi соединение USBIP не восстанавливается автоматически.

Как добиться автоматического переподключения?

решение1

Когда устройство, привязанное и подключенное удаленно, отключается, устройство автоматически отключается на клиенте и отвязывается на хосте. После этого состояние такое же, как если бы оно никогда не было привязано или подключено.

Команды usbip для привязки (на хосте) и присоединения (на клиенте) можно запускать повторно с теми же аргументами. Хотя это выдает сообщение об ошибке на уже привязанных или присоединенных устройствах, ничего плохого не происходит! Поэтому можно просто установить фоновые скрипты, которые будут повторно привязывать и прикреплять устройства. Примеры скриптов и модулей systemd приведены ниже. Обязательно измените Hostname и Port ID в соответствии с вашими потребностями.

Хозяин

Скрипт /opt/usbip/usbip-bind:

#!/bin/bash

SPOOL=/var/spool/usbip/bind

if [[ $1 == "-q" ]]
then
    exec &>/dev/null
fi

touch $SPOOL

while [[ -e $SPOOL ]]
do
  /usr/bin/usbip bind -b 1-1.2.1
  /usr/bin/usbip bind -b 1-1.2.2
  sleep 10
done

/usr/bin/usbip unbind -b 1-1.2.1
/usr/bin/usbip unbind -b 1-1.2.2

exit 0

Системный блок /etc/systemd/system/usbip-bind.service:

[Unit]
Description=USB-IP Bindings

[Service]
ExecStart=/opt/usbip/usbip-bind -q
ExecStop=/bin/rm /var/spool/usbip/bind  ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Обязательно создайте каталог /var/spool/usbip. Затем включите и запустите устройство:

systemctl daemon-reload
systemctl enable usbip-bind
systemctl start usbip-bind

Клиент

Скрипт /opt/usbip/usbip-attach:

#!/bin/bash

SPOOL=/var/spool/usbip/attach

if [[ $1 == "-q" ]]
then
    exec &>/dev/null
fi

touch $SPOOL

while [[ -e $SPOOL ]]
do
    /usr/bin/usbip attach -r pi -b 1-1.2.1
    /usr/bin/usbip attach -r pi -b 1-1.2.2
    sleep 10
done

/usr/bin/usbip detach -p 0
/usr/bin/usbip detach -p 1

exit 0

Системный блок /etc/systemd/system/usbip-attach.service:

[Unit]
Description=USB-IP Attach
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/opt/usbip/usbip-attach -q
ExecStop=/bin/rm /var/spool/usbip/attach  ;  /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Обязательно создайте каталог /var/spool/usbip. Затем включите и запустите устройство:

systemctl daemon-reload
systemctl enable usbip-attach
systemctl start usbip-attach

Теперь вы можете извлекать устройство в любое время, а через 20 секунд после его повторного подключения соединение USBIP будет восстановлено.

решение2

Я попробовал это, и это вроде как сработало. Осталось сделать еще кое-что.

Первый:

Вам необходимо сделать скрипты работающими как на хосте, так и на клиенте.

sudo chmod +x /opt/usbip/usbip-attach
sudo chmod +x /opt/usbip/usbip-bind

В моем случае usbip не был установлен /opt/usbip, мне пришлось просто прописать его usbipв файле хоста и клиента.

Мне также пришлось запустить usbipdслужбу. Поэтому на хосте я использовал этот файл:

[Unit]
Description=USB-IP Bindings

[Service]
ExecStartPre=/usr/sbin/usbipd -D
ExecStart=/opt/usbip/usbip-bind -q
ExecStop=/bin/rm /var/spool/usbip/bind  ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Сначала запускается сервер usbipd.

и в файлах хоста и клиента мне пришлось удалить/usr/bin/

После этих изменений все заработало нормально на моем хосте Raspberry Pi и клиенте Ubuntu 19.10.

решение3

Хоть мой ответ и запоздал, но, возможно, он будет полезен другим:https://github.com/alpertsev/usbip-service-shell

Связанный контент