udev 是Linux kernel 2.6(及以上)系列的设备管理器,主要用来管理/dev目录底下的设备节点。USB设备链接到内核后会将设备映射成/dev/bus目录下的一个文件。经过udev能够在设备链接到电脑时根据用户的配置(也就是udev rules)来设置设备的某些信息和属性。html
设备链接到电脑后,经过命令lsusb查看设备的链接信息android
其中倒数第三行是我刚链接的设备(小米1s),它是usb设备,被链接到总线1上,分配的设备号是12(这个值是动态的,每次链接新设备这个值会加一),这样它最终被映射到的文件就是/dev/bus/usb/001/012。shell
经过ls -alF查看这个文件的权限会发现它的权限值是664,即“crw-rw-r--", 这样问题的缘由就找到了ubuntu
设备访问权限为664。非root用户没有写权限,因此非root用户使用adb会显示no permissions。这也是为何用root权限重启adb后正常的缘由了。测试
adb kill-server 关闭adb后以root方式启动adb (ubuntu下sudo adb start-server)。ui
sudo chmod 666 /dev/bus/usb/001/012
这样非root用户也具备了写权限,跟方法1)相似。spa
以上两个方法都太麻烦,但用这个方法就能够一劳永逸了。这个方法的原理是使用udev在内核检测到设备时设置设备的访问权限.net
打开udev规则:cat /etc/udev/udev.conf查看udev配置文件,若是没有udev_rules就添加上这行
unix
udev_rules="/etc/udev/rules.d/"
其中udev_rules指明规则文件所在的位置。rest
在上一步中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
部分属性以下