Ubuntu: adbでno permissionsでデバイスに接続できない

Xperiaでadbで接続は正常に行ってたのに、うちのXOOMで接続したら

ohno@localhost:~$ adb devices
 List of devices attached
 ???????????? no permissions

と出てしまってadbで認識出来ませんでしたので、その解決方法。

 そもそもこのエラーが表示される時はadbのdaemonの持っている権限が不足してusbデバイスのデバイスファイルを開けない事によります。
対処方法は二通り考えられます。

対処方法その1
root permissionでdaemonを動かす。

  1. USBケーブルを抜く
  2. sudo adb kill-server
    ※ sudoした状態でadbのpathが解決できない場合 sudo `which adb` kill-server
  3. sudo adb start-server
    ※ sudoした状態でadbのpathが解決できない場合 sudo `which adb` start-server
  4. USBケーブルを刺す

上記の操作でroot permissionでdaemonが動きますので一応問題解決できます。
ただ、Xperiaで出来ているのにXOOMでできないのは何だか腑に落ちませんので、もう少し調べてみました。

Xperiaで認識出来ている状態は以下。ポイントはgroup idとacl設定を示す+。

Bus 002 Device 008: ID 0fce:5166 Sony Ericsson Mobile Communications AB
crw-rw-r--+ 1 root plugdev 189, 136 2012-01-23 22:28 009

一方XOOMを接続した時のデバイスは以下。

Bus 002 Device 007: ID 22b8:70a9 Motorola PCS
crw-rw-r-- 1 root root 189, 137 2012-01-23 22:35 010

Xperiaの方はgroup idがplugdevでaclが追加(+)されています。

ここでplugdevというgroupですが、これはユーザ権限のうち「自動的に外部ディスク接続時にアクセスできる」という権限に対応したグループになります。

詳細設定-ユーザの権限

詳細設定のユーザ権限

XperiaはMTPモードにしていますが、この場合以下の様にPhoto Deviceとして認識しています。

Bus 002 Device 011: ID 0fce:5166 Sony Ericsson Mobile Communications AB
Device Descriptor:
  idVendor           0x0fce Sony Ericsson Mobile Communications AB
  idProduct          0x5166 
  iManufacturer           1 SEMC
  iProduct                2 SEMC HSUSB Device
  Configuration Descriptor:
    Interface Descriptor:
      bInterfaceClass         6 Imaging
      bInterfaceSubClass      1 Still Image Capture
      bInterfaceProtocol      1 Picture Transfer Protocol (PIMA 15470)
      iInterface              0 
    Interface Descriptor:
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     66 
      bInterfaceProtocol      1 
      iInterface              0 

このためudevの認識行及び関係する行は、以下になります。

/lib/udev/rules.d/40-libgphoto2-2.rules
ENV{ID_USB_INTERFACES}=="*:060101:*", ENV{ID_GPHOTO2}="1", ENV{GPHOTO2_DRIVER}="PTP", MODE="0664", GROUP="plugdev"
/lib/udev/rules.d/70-acl.rules
SUBSYSTEM=="usb", ENV{ID_USB_INTERFACES}=="*:060101:*", ENV{ACL_MANAGE}="1"

これに対してXOOMは特にアクセス可能なデバイスとして認識されていません。

Bus 002 Device 010: ID 22b8:70a9 Motorola PCS 
Device Descriptor:
  idVendor           0x22b8 Motorola PCS
  idProduct          0x70a9 
  iManufacturer           1 Motorola
  iProduct                2 MZ604
  Configuration Descriptor:
    Interface Descriptor:
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol      0 
      iInterface              8 MTP
    Interface Descriptor:
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass     66 
      bInterfaceProtocol      1 
      iInterface              0 

というわけで、対応策としてはgroup idを変更するか、aclを設定してやることになりそうです。
今回は以下のファイルを/etc/udev/rules.dに作成してやることで対応が出来ました。これでroot権限がなくてもXOOMに対してadbで接続することが可能になりました。

/etc/udev/rules.d/45-xoom.rules
# Motorola XOOM MZ604 for adb.
SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="70a9", MODE="0664", ENV{ACL_MANAGE}="1"

実はGROUP=”plugdev”も試してみたのですが、それだけではNGでした。ENV{ACL_MANAGE}=”1″がある場合、デバイスファイルのaclにログイン中のユーザを追加する動作が行われるため、この設定で良さそうです。

adb start-serverはeclipse中で起動される事が多いと思います。このためserverはloginしたuser権限で動作しています。
もしかするとdaemonスタート後にlogoutして別ユーザでloginした場合、daemonのkill-server/start-serverが必要になるかもしれません。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.