usbipはsystemdを使用して開始されます。

usbipはsystemdを使用して開始されます。

usbipを実行しているホストが欲しいです。

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

[Service]
ExecStartPre=/usr/sbin/usbipd -D
ExecStart=/usr/sbin/usbip bind --busid 1-1.5
ExecStop=/usr/sbin/usbip unbind --busid 1-1.5
Restart=on-failure  

[Install]
WantedBy=default.target

エラーなしで正しく起動しているようですが、クライアントに移動してサーバーを一覧表示すると、usbipの実行は表示されません。

USBIP経由ですべてのUSBデバイスを共有するスクリプトを知っている人はいますか?

ご協力ありがとうございます。

ベストアンサー1

に基づいてコメントにOPが投稿したリンク、問題はここにあるようです。

ExecStartPre=/usr/sbin/usbipd -D
ExecStart=/usr/sbin/usbip bind --busid 1-1.5

systemdサービスにオプションを指定しないと、Type=サービスは次のように見なされますType=simple。この場合、ExecStart=すべてがうまくいくと、systemdはこのオプションで開始されたプロセスが永久に実行されると仮定します。ただし、このコマンドはプロセスにサービスを引き継ぎ、終了するように指示するusbip bindだけです。usbipdその後、systemdは「ああ、サービスがクラッシュしました!」と思い、サービスもクラッシュしたので、Restart=on-failureサービスを再起動し続けます。

機能させるには、公開リンクで提案されているように、Type=forking実際のusbipdプロセスを1ExecStart=行で指定してusbip bind作成できます。ただし、このソリューションは、新しいsystemdユーザーの間でよく見られる間違いによって困難になります。つまり、systemdは簡単にこれを行うことができますが、自分がデーモンになる必要があるとしますExecStartPost=usbipd

-D最善の解決策は、コマンドラインからオプションを削除してusbipd省略することですType=forking(またはType=simple明示的に使用すること)。このようにして、systemdはデーモンプロセスを処理し、PIDファイルや任意のコマンドを使用せずにサービスプロセスを監視および停止できますkillall usbipd ExecPost=

だから私の提案は次のとおりです。

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

[Service]
Type=simple
ExecStart=/usr/sbin/usbipd
ExecStartPost=/usr/sbin/usbip bind --busid 1-1.5
ExecStop=/usr/sbin/usbip unbind --busid 1-1.5  

[Install]
WantedBy=multi-user.target

これらの設定を使用すると、systemdはプロセスが永久に実行されることを期待し、usbipdプロセスが予期せず終了したときにサービスが実際に失敗したとマークします。Restart=on-failureこの場合、systemdが自動的にサービスを再起動するようにするには、を追加できます。

サービスを終了すると、このExecStopコマンドはUSBデバイスから完全にバインドを解除するように求めます。usbipd正常に完了すると、systemdはサーバープロセスがまだ実行中であることを確認し、明示的なコマンドなしで終了します。

使用するたびにAfter=network-online.target常に使用する必要がありますWants=network-online.target。そうしないと、期待どおりに動作しない可能性があります。バラよりネットワークがオンラインになった後のサービスの実行systemdのドキュメントでは、systemdの特殊ターゲットを扱うマニュアルページにも記載されていますsystemd.special(7)

おすすめ記事