取り外して再接続するデバイスにはUSBIPを使用する

取り外して再接続するデバイスにはUSBIPを使用する

私は、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

関連情報