linux下adb链接设备出错

1.udev简介

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

2.查看设备文件

设备链接到电脑后,经过命令lsusb查看设备的链接信息android

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

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

3.问题缘由

设备访问权限为664。非root用户没有写权限,因此非root用户使用adb会显示no permissions。这也是为何用root权限重启adb后正常的缘由了。测试

4.解决方案

1.以root权限重启adb 

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

2.修改设备文件权限

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

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

3.修改udev rules

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

1)开启udev rules

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

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

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

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

部分属性以下

附:udev rules相关资料

相关文章
相关标签/搜索