linux下adb连接设备出错

1.udev简介

udev 是Linux kernel 2.6(及以上)系列的设备管理器,主要用来管理/dev目录底下的设备节点。USB设备连接到内核后会将设备映射成/dev/bus目录下的一个文件。通过udev可以在设备连接到电脑时根据用户的配置(也就是udev rules)来设置设备的某些信息和属性。

2.查看设备文件

设备连接到电脑后,通过命令lsusb查看设备的连接信息

linux下adb连接设备出错_第1张图片

其中倒数第三行是我刚连接的设备(小米1s),它是usb设备,被连接到总线1上,分配的设备号是12(这个值是动态的,每次连接新设备这个值会加一),这样它最终被映射到的文件就是/dev/bus/usb/001/012。

通过ls -alF查看这个文件的权限会发现它的权限值是664,即“crw-rw-r--", 这样问题的原因就找到了

3.问题原因

设备访问权限为664。非root用户没有写权限,所以非root用户使用adb会显示no permissions。这也是为什么用root权限重启adb后正常的原因了。

4.解决方案

1.以root权限重启adb 

adb kill-server 关闭adb后以root方式启动adb (ubuntu下sudo adb start-server)。

2.修改设备文件权限

sudo chmod 666 /dev/bus/usb/001/012

这样非root用户也具有了写权限,跟方法1)类似。

3.修改udev rules

以上两个方法都太麻烦,但用这个方法就可以一劳永逸了。这个方法的原理是使用udev在内核检测到设备时设置设备的访问权限

1)开启udev rules

打开udev规则:cat /etc/udev/udev.conf查看udev配置文件,如果没有udev_rules就添加上这行

udev_rules="/etc/udev/rules.d/"

其中udev_rules指明规则文件所在的位置。

2)添加设备规则

在上一步中udev_rules指定的文件夹中新建一个规则文件android-mi.rules,添加内容

SUBSYSTEM=="usb",ATTR{idVendor}=="18d1",ATTR{idProduct}=="9025",MODE="0666"

其中ATTR{属性名称}是取设备的属性值,==是属性匹配测试,=是赋值;上面这段代码的意思是“如果检测到的设备是usb设备,其idVendor属性等于18d1, idProduct属性等于9025,就把这个设备的访问权限设置为666,也就是所有用户都具有读写权限"。

注意:规则文件命名时可以"数字-名称.rules"命名。这样数字大的配置会覆盖数字小的配置,比如51-android.rules会覆盖50-android.rules;如果规则是非数字命名的,即"描述-名称.rules",这种规则总是会在其他数字标记的规则之后运行,也就是说这种非数字命名的规则有最高的优先级。

保存后关闭adb并重启udev(可选)

sudo service udev restart

设备的属性可以通过lsub查看

lsusb -v -d 18d1:9025

部分属性如下

linux下adb连接设备出错_第2张图片

附:udev rules相关资料

你可能感兴趣的:(linux,rules,adb,adb,udev,permissions,No,linux连接设备)