web-dev-qa-db-ja.com

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

Lubuntu 16.04.3 LTSでHIDAPIを使用して、カスタムUSB HIDデバイスとそれに対応するデスクトップアプリを作成しています。ここでは、myappと呼びます。

どうやら、$ ./myappを実行すると、LIBUSB_ERROR_ACCESSlibusb_open()が失敗します。 (私のデバッガーでは-3として表示されます;列挙型があまりうまく文書化されていないようであるため、それを理解するのに時間がかかりました)
しかし、$ Sudo ./myappを実行すると成功します。
myappにroot権限を与えたくないので、USB機器なしでUSBデバイスと通信するにはどうすればよいですか?


私は答えを求めていました here ですが、まさにこの時点で放棄されたようです。それはユーザーの許可について何かを言っていますが、私のシステムでそれを見つけることができないようです。自分で追加できるusbまたはlibusbというグループが見つかるかもしれないと思ったが、そのような運はなかった。


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

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

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

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

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

私は/libの1つをいじり、どこにも行かなかった。 /etc one here が見つかりましたが、動作します:


SUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"を入れる

  • VIDは、問題のデバイスの SB-IFが割り当てたベンダーID です*
  • PIDは、問題のデバイスのベンダーが割り当てた製品IDです*
  • 0666は、この行に一致するすべてのものへの普遍的な読み取り/書き込みアクセスを提供します

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

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

  • xxは50を超える任意の数値です(デフォルトは50であり、数値が大きいほど優先されます)
  • my-ruleはあなたがそれを呼びたいものです
  • .rulesで終わる必要があります

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


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

6
AaronD

これに苦労している他の人のために-Ubuntu 18.04でudevルールにGROUP = "plugdev"を追加して機能させる必要がありました。

bTD-400アダプターの場合、ファイル/ etc/udev/rules.d/51-usb-device.rulesは次のようになります。

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