Ubuntu下USB权限问题以及udev规则文件笔记

在ubuntu系统下使用传感器的时候,通常会遇到一些权限上的问题。比如我使用ROS驱动包来启动bluefox摄像头,如果没有任何关于权限上的处理就会提示权限问题导致无法正常启动该摄像头,如下图:


解决以上传感器权限问题的方法有很多,常用的有以下几种:


1. 解决的其中一个办法就是在终端中输入chmod指令,指定在当前终端下某个传感器挂载点的权限,指令如下:

$ sudo chmod 777 /dev/bus/usb/001/005

其中在输入该指令之前需要先弄清楚所开权限的传感器挂载点的位置,一般都在/dev/目录下面。有的是在/dev/目录的/bus/目录下,有的则是在/dev/目录下会直接出现。比如某些不需要驱动的usb摄像头,就位于/dev/目录位置名字为Video0。具体有两种方法可以查看传感器挂载点位置,一种是lsusb指令,如下图。


还有一种方法是直接进入/dev/目录下面,在里面可以查看USB摄像头的一些信息,如下图。


另外也可以不需要进入/dev/目录来列出挂载的传感器,如下:

$ ls /dev/ttyUSB*
$ ls /dev/ttyACM*


2. 上面的方式有个缺点就是每次关闭重新打开一个终端就会使得权限赋值失效并回归默认的权限状态。因此,每次使用传感器都需要提前采取赋权限操作,导致十分繁琐。所以可以采用以下的几种方式直接给传感器赋值永久的权限,这样每次使用就不需要再单独启动某个传感器的权限了。

一般默认情况下,只有root用户和dialout组的用户会有读写的权限,所以可以将用户加入到dialout组中获取串口读取权限。

$ sudo usermod -a -G dialout your_user_name
或者

$ sudo gpasswd -a your_user_name dialout
重启计算机,就可以使得配置生效。

3. 在udev下的添加用户自定义的设备挂载规则,这是本篇笔记中最为推荐的一种方式。因为手动编写规则一方面比较灵活,另一方面可以对多个传感器的情况下比较合理地实现映射挂载点。关于udev的规则原理在这里不在叙述,详细可以见我的另一篇专门介绍该设备管理器的博客,而具体的实现方式如下:

(1)进入/etc/udev/rules.d/目录下。

$ cd /etc/udev/rules.d/

(2)在该目录下创建对应传感器的规则文件,后缀为.rules,名字自己取。以rplidar为例子,创建rplidar.rules文件。

$ sudo touch rplidar.rules

(3)采用gedit打开新建的规则文件。

$ sudo gedit rplidar.rules
(4)规则文件下需要输入以下几个信息:KERNEL,SUBSYSTEMS,ATTRS{idVendor},ATTRS{idProduct},MODE和SYMLINK。他们分别表示内核设备名称、子系统、设备的VID、设备的PID、权限模式和符号链接。以上的几个配置参数表示传感器的内核设备名为KERNEL,而其设备的PID和VID为对应的值,然后会在/dev的目录下面产生一个符号链接设备并命名为SYMLINK对应的值,最后为该设备赋予MODE值对应的权限。

一般来说如果设备对应内核设备为ttyUSBx,那么KERNEL可以赋值为"ttyUSB*";ATTRS{idVendor}和ATTRS{idProduct}的值可以通过lsusb指令查看,如下图所示。


而MODE的值我们选择0777,该数值对应的权限为最高权限。而SYMLINK可以取rqlidar。当然除了这种方式查看设备对应的信息外,还有一种指令可以更详细地查看设备信息(推荐使用),具体方法如下:

udevadm info --attribute-walk --name=/dev/ttyUSB0
--attribute-walk表示指定设备的所有sysfs记录的属性,所以执行该指令会出现如下图一推信息。


然后通过lsusb显示的VID或者PID找到对应设备的信息。比如rplidar为10c4,那么找到该关键词所在的那一块就是rplidar对应的信息,如下图。


综上,如果是ttyUSB类型的设备,那么我们需要在规则文件中输入以下信息:

KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
如果是Video类型的,那么我们就在规则文件下输入以下信息:
KERNEL=="video*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="07c7", ATTRS{idProduct}=="b1a2", SYMLINK+="pinhole"
KERNEL=="video*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="07c7", ATTRS{idProduct}=="b1a2", SYMLINK+="fisheye"

(5)保存,退出规则文件。然后重启udev服务并重新插拔传感器的USB。

$ sudo service udev reload
$ sudo service udev restart
(6)如果要删除该rules也很简单,直接采用rm指令即可。但是删除对应的rules文件就会导致会到默认设置,即权限需要重新赋值,如下图。
$ sudo rm /etc/udev/rules.d/rplidar.rules
$
sudo service udev reload
$ sudo service udev restart

(7)当规则文件创建成功,可以通过ls指令查看创建的指向挂载点ttyUSB0的链接符号rplidar,如下。

$ ls -l /dev/rplidar

(8)当我们使用的传感器变多以后会出现多个传感器的VID和PID相同的情况。这时候我们需要采用另一种方式来区别传感器的类型,即增加新的匹配键来区分,具体处理方式如下。

在规则文件中,需要新加KERNELS匹配键,该属性可以区分相同设备ID的设备。具体的信息获取用上面已经提到过的指令打开系统属性信息列表,如下所示。

udevadm info --attribute-walk --name=/dev/ttyUSB0

将该信息添加到rules文件中即可,如下图。

(9)使用(8)中的方法来区分相同ID的传感器需要注意的KERNELS的值与现实物理USB接口有关,所以采用该方法以后不要随意更换传感器的USB接口。一旦更换USB接口,那么KERNELS的值会发现改变而导致无法找到该设备。所以更换USB接口以后要重新更新rules文件中的KERNELS的值。只要USB接口不变,那么不同顺序的插入都不影响Ubuntu识别传感器设备。

(10)根据udev规则来定义设备挂载点的其中一个好处就是可以将连接符应用到程序中。我们都知道一般计算机会根据插入先后顺序来分配设备的名字,比如ttyUSB通常是先插入的是0,然后是1、2和3等等。这样我们每次不同顺序插传感器都会使得设备名不相同,这会导致要对应这某种传感器去程序修改设备名非常麻烦。而利用规则文件就能够直接将连接符作为设备名写到程序中,这样即使下一次先插的传感器后插,设备名由ttyUSB0变成ttyUSB1都没有关系(udev会将对应的连接符映射到对应的设备名)。比如下面rplidar的ros驱动包。




参考博客

http://blog.csdn.net/linczone/article/details/48342419

微信公众号:ROS小课堂,微信号:ROS_Tutorials




  • 19
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值