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)
。
答え2
私が取ったアプローチは、これをデーモン用のサービスとバインディングテンプレート用のサービスに分けることでした。
したがって、デーモンの場合 - /etc/systemd/system/usbipd.service
[Unit]
Description=usbip host daemon
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Restart=always
ExecStartPre=/usr/sbin/modprobe usbip-core
ExecStartPre=/usr/sbin/modprobe usbip-host
ExecStart=/usr/sbin/usbipd
ExecStopPost=/usr/sbin/rmmod usbip-host
ExecStopPost=/usr/sbin/rmmod usbip-core
[Install]
WantedBy=multi-user.target
そしてバインドされたテンプレート - /etc/systemd/system/[Eメール保護]
[Unit]
Description=Bind USB device to usbipd
After=network-online.target usbipd.service
Wants=network-online.target usbipd.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/usbip bind --busid %i
ExecStop=/usr/sbin/usbip unbind --busid %i
[Install]
WantedBy=multi-user.target
デーモンを有効にして起動します。
systemctl enable usbipd
systemctl start usbuipd
次にバインディングを追加します。
systemctl enable [email protected]
systemctl start [email protected]
1-1.2.3を共有したいUSBデバイスのバインディングIDに置き換えます。共有するデバイスの数に関係なく使用でき、各デバイスを個別にバインドおよびバインド解除し、コンピュータの起動時にバインドまたはバインドしないことがあります。
バインディングIDを見つけるには、次のコマンドを使用します。
usbip list -l
約10分以内にリモートコンピュータを介して接続がないと、usbipバインディングが期限切れになるようです。あまり役に立ちません!
まだsystemdを使用せずにクライアント側の添付ファイルを処理する方法を決定していません。 usbipにインテリジェンスがあれば本当に役に立ちました。