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)
。