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
部分屬性以下