私は、USBIP と Raspberry Pi を使用して、ワイヤレス キーボードの範囲を、キーボード単体では確実に動作させるには少し遠すぎるコンピューターまで拡張しています。
キーボードの 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
Systemdユニット/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
Systemdユニット/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