libusbのudevルールと権限の理解

libusbのudevルールと権限の理解

スキャナーに問題があります。 Xsaneはrootとしてのみ実行されます。通常のユーザーとして使用すると、デバイスが見つかりません。ユーザーをグループに追加しても役に立ちませsanedscanner

最後に変更して問題を解決しました。

# 'libusb' device nodes
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664"

到着

# 'libusb' device nodes
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"

存在する/lib/udev/rules.d/50-udev-default.rules

しかし、これがなぜ機能するのか、否定的な副作用があるのか​​理解していません。私はこれがすべてのUSBデバイスのすべてのユーザーに書き込みアクセス権を与えると思いますが、これが正しいのか、なぜそれがスキャナの問題を解決するのかわかりません。

なぜそれが機能するのか、どの副作用があるのか​​を詳しく説明できる人はいますか?

私のシステムはです。ubuntu 12.04スキャナーはリポジトリからインストールされたデバイスですHP PSC 1200 all in onehplip

答え1

libusbUSBデバイスを許可するように設計されたユーザースペースドライバです。つまり、アプリケーションがlibusb理解できないデバイスにコマンドを送信できるようにします。

したがって、libusbコンピュータからUSBデバイスに転送されたすべてのデータは書き込み操作と見なされる必要があります。これには、スキャン機能を記述するコマンドをスキャナに送信するなどのマイナーな書き込みも含まれます。

デバイスへの読み取り専用アクセスは、libusbキーボードやマウスなど、コンピュータに自発的にデータを転送するデバイスにのみ適用されます。

答え2

Udev(man内)は、USBデバイスなどのダイナミックデバイスが接続されていると管理しているようです。次に/ devのどこかにインスタンス化します。 (私の例では、/dev/bus/usb/002と同じです。)この/devノードにはいくつかの権限が必要です。権限を取得します。アイテムに。

この場合、usbサブシステムのusb_deviceタイプのすべてのファイルは指定されたファイルモードを持ちます。 (標準権限、664はrw-rw-r--、666はrw-rw-rw-です。)したがって、すべてのUSBデバイスにさまざまな書き込み権限を付与します。すべてのユーザーを信頼していない場合、これは良いことではないようです。あなたが唯一のユーザーなら、おそらくあなた自身を信頼できるでしょう。 Libusb はタスクを実行するために USB デバイスノードへの書き込みアクセスが必要であるように見え、必要でない場合はタスクの実行を拒否します。ちょうどデバイスから読みたいので、これは正しくないようです。

権限はより具体的であり、USBベンダー(VID)や製品ID(PID)などでデバイスを指定できます。これにより、スキャナにのみ適用されるファイルを作成し、他のすべてのUSBデバイスに対するデフォルトの権限を維持できます。 Udevに関するページがあります:https://wiki.archlinux.org/index.php/udevこれはすべて役に立つようです。 「60-my-usb-scanner.rules」(大きな数字から)など、より高い数字で始まり、次のようにスキャナを一覧表示するルールを含むファイルを作成する場合:

SUBSYSTEM=="usb", ATTRS{idVendor}=="f1e2", ATTRS{idProduct}=="1f2e", MODE="0666"

これは、指定されたデバイスの権限のみを設定する必要があります(VID = 0xF1E2、PID = 0x1F2E、注:udevには小文字の16進数を使用)。その後、次を実行してUdevにこの変更を通知するように指示できます。

udevadm control --reload-rules

答え3

私に役立つ回答を共有してください。

オペレーティングシステム:ウブドヌート20.04

デバイスをフィルタリングするために使用できる適切な属性を見つけるには、まずデバイスのlsusb検索を使用します/dev/bus/usb

....
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 13d3:56d5 IMC Networks Integrated Camera
Bus 003 Device 002: ID 0fc5:b080 Delcom Engineering USB FS IO # <-- My device
...

udevadm info -a -n /dev/bus/usb/<bus_num>/<device_num>次に(私の場合は)コマンドを使用してudevadm info -a -n /dev/bus/usb/003/002udevルールのkeytabを取得します。テーブルは親デバイスに対して繰り返されるので、最初のデバイスは必要なデバイスでなければなりません。

looking at device '/devices/pci0000:00/0000:00:08.1/0000:04:00.4/usb3/3-2':
KERNEL=="3-2"
SUBSYSTEM=="usb"
DRIVER=="usb"
ATTR{product}=="USB FS IO"
ATTR{bNumInterfaces}==" 1"
ATTR{bDeviceProtocol}=="00"
ATTR{configuration}==""
ATTR{bMaxPower}=="250mA"
ATTR{version}==" 2.00"
ATTR{bmAttributes}=="a0"
ATTR{maxchild}=="0"
ATTR{idVendor}=="0fc5"
ATTR{avoid_reset_quirk}=="0"
ATTR{idProduct}=="b080"
ATTR{devpath}=="2"
ATTR{tx_lanes}=="1"
ATTR{manufacturer}=="Delcom Products Inc."   # <--- help me id the device
...

ルールを設定するには、ここで提供されている正確な形式を使用する必要があることに注意してください。言い換えれば、およびである場合とSUBSYSTEM=="usb"そうでないATTR{idVendor}ファイルの形式でなければなりません。.rulesSUBSYSTEMS=="usb"ATTRS{idVendor}

最後にsudo <editor_you_like> /etc/udev/rules.d/<order_to_be_executed>-<hint_name>.rules99-Delcom_dev.rules私はこのルールを他のルールより後で実行し、このルールが何であるかを簡単に思い出させたいので、これを使用します。ルールファイルに次の内容を作成します。

SUBSYSTEM=="usb", ATTR{idVendor}=="0fc5", ATTR{idProduct}=="b080", MODE="0666"

関連情報