libusb を非ルートとして動作させるにはどうすればよいですか?

libusb を非ルートとして動作させるにはどうすればよいですか?

私は、Lubuntu 16.04.3 LTS の HIDAPI を使用して、カスタム USB HID デバイスとそれに付随するデスクトップ アプリを作成しています。myappとりあえず、これを呼び出します。

どうやら、 を実行すると$ ./myapplibusb_open()で失敗しますLIBUSB_ERROR_ACCESS(デバッガーでは と表示されますが-3、列挙型が十分に文書化されていないため、これを理解するまでに時間がかかりました)
しかし、 を実行すると$ sudo ./myapp、成功します。ルート権限を
持ちたくないのでmyapp、ルート権限なしで USB デバイスと通信するにはどうすればよいでしょうか?


答えを期待していたここですが、この時点で放棄されたようです。ユーザー権限について何か書かれていますが、私のシステムではそれを見つけることができません。 または というグループを見つけて自分を追加できるかもしれないと思いましたusblibusb、残念ながら見つかりませんでした。


別のSEサイトでのこの質問いくつかの厳格なテキスト ファイルを使用して、グローバル (おそらく悪い考え) または特定のデバイスのアクセス許可を変更するという回答がありますが、次のようになります。

  1. それは私が探していた「マグルの工夫」ではありません。
  2. これらのファイルのほとんどは自動生成されるため、直接変更しないように警告が出されます。では、ランダムなパッケージ更新によって変更が消去され、壊れてしまうことがないようにするにはどうすればよいでしょうかmyapp?
  3. とにかく何も起こらないようです。指示に従って再起動しましたが、myappユーザー権限では USB と通信できません。

答え1

これはまだ私が本当に求めている「マグルの調整」ではありませんが、少なくともこれは機能します。

どうやら udev には 2 つのディレクトリがあるようです (理由はわかりません)。

  • /etc/udev/rules.d
  • /lib/udev/rules.d

私は1つをいじっていた/libが、どこにも行き着かなかった。私は/etc1つを見つけたここそしてそれは動作します:


置くSUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"

  • VIDそれはUSB-IF が割り当てたベンダー ID問題のデバイスの*

  • PID問題のデバイスのベンダーが割り当てた製品IDです*

  • 0666この行に一致するものすべてにユニバーサル読み取り/書き込みアクセスを許可します

    *$ lsusb接続されているすべての USB デバイスとその ID を表示します。

/etc/udev/rules.d/xx-my-rule.rules(root/sudo権限が必要な場合があります)

  • xx50 より大きい数値です (デフォルトは 50 で、それより大きい数値が優先されます)
  • my-rule何と呼ぼうと
  • で終わる必要があります.rules

その後udevadm control --reload-rules(root/sudo 権限も必要になる場合があります)、特定の VID/PID ペアに対して「そのまま機能する」はずです。


権限をもう少し厳しくする別のオプションは、TAG+="uaccess"の代わりにを使用することですMODE="0666"。これにより、すべてのユーザーではなく、現在ログインしている (物理) ユーザーのみにアクセスが制限されます。@Lekensteyn さん、ありがとうございます!

答え2

これに苦しんでいる他の人のために - 私は追加する必要がありましたグループ="plugdev"Ubuntu 18.04 の udev ルールに追加して動作させました。

私のBTD-400アダプタの場合、ファイル/etc/udev/rules.d/51-usb-device.rules読みます:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="21e8", GROUP="plugdev", TAG+="uaccess"

関連情報