Я использую 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