對正在移除並重新連接的裝置使用 USBIP

對正在移除並重新連接的裝置使用 USBIP

我正在使用 usbip 和樹莓派將無線鍵盤的範圍擴展到距離鍵盤單獨可靠工作有點遠的電腦。

有時鍵盤的USB接收器會重新連接並在其他地方使用,但是當它重新連接到樹莓派時,USBIP連接不會自動重新建立。

如何實現自動重連?

答案1

當遠端綁定和連接的設備被拔出時,該設備會自動在客戶端分離並在主機上解除綁定。此後,狀態就如同從未綁定或附加一樣。

用於綁定(在主機上)和附加(在客戶端上)的 usbip 命令可以使用相同的參數重複運行。雖然這會在已綁定或連接的裝置上發出錯誤訊息,但不會發生任何不良情況!因此,人們只需安裝後台腳本即可重複綁定和附加設備。下面提供了範例腳本和 systemd 單元。請務必根據您的需求變更主機名稱和連接埠 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

現在,您可以在需要時移除該設備,並且在將其重新插入 usbip 連接後最多 20 秒內即可重新建立。

答案2

我嘗試過這個,它有點工作......還有一些你必須做的事情。

第一的:

您必須使 scipts 在主機和用戶端上都可運行

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

相關內容