【Linux】编写COM口和USB口的规则文件(.rules)

一、遇到的问题

        当外接存储设备(如:U盘、机械硬盘等)时,由于路径/dev下并没有存储新设备的设备节点、规则文件等,udev会给新的存储设备按照内核的分配规则分配设备节点诸如:/dev/sda(如U盘)、/dev/sdb(如机械硬盘)等临时设备节点,这些临时设备节点是按照外接设备的插入顺序决定的,也就是说下次如果是先插机械硬盘、再插U盘就可能会分配临时名字:/dev/sdb(如U盘)、/dev/sda(如机械硬盘),又或者是其他诸如/dev/sdc、/dev/sda2等等。

        所以问题就来了:连接方式为com口、usb口的新设备,系统都是分配临时的设备节点,导致每次系统重启后都会重置设备节点(如上一次开机时候使用ttys1连接com1口,下一次就变成了ttys5连接com1口了),导致需要使用到对应com口、usb口的软件、程序等无法正常调用。所以,给新设备进行永久性符号连接命名,是解决设备节点被频繁更改的其中一个好办法。

        第一次连接:

        重启后: 

 

         PS:udev在/dev/disk目录下保存在一些永久性命名的符号连接:

        如:/dev/sr0被赋予了ata-VBOX_CD-ROM_VB2-01700376这个名字,但是这些名字对于我们来实在是过于超前了,所以最好还是自己自定义名称好些。

二、规则文件的命名

        在目录/etc/udev/rules.d下可以发现这样一些规则文件:

        可以发现,规则文件的命名规则为:数字-XXX.rules,其中“数字”项可以理解为规则文件被解析的顺序,按照0-99的顺序来进行规则解析,所以如果您希望自己的规则在默认值之前被解析,建议在把数字写到一些比较靠前的数字(10-XXX.rules之类的)。但需要注意的是,如果对同一设备在不同规则进行多次命名,则会生成多个符号连接,如以下例子:

        但如果不同规则进行同一命名,则会被覆盖,如以下例子:

三、基本规则(难点)

        规则编写的格式有很多,以下仅列举部分需要用的字段,udev 提供了几种不同的匹配键,可用于准确地编写匹配设备的规则,详细的匹配键可以参考udev使用手册:

        使用匹配键仅能找到对应的父设备,我们仍需要再进一步精确地找到我们需要的编写规则的设备,也就是以内核为父节点的树状结构下寻找到对应的子设备,常用的相关设备对应的键以下: 

         通过使用分配键对该设备进行一系列的规则操作,常用的分配键如下:

        udev还为环境变量分配了一个ENV键,用于匹配环境变量和赋值: 

四、USB口规则编写

       在linux下插入USB口的硬件设备(如摄像头、打印机等)时,有时会因权限问题导致部分硬件设备(如摄像头、打印机等)无法正常工作,这时可以通过使用规则文件,通过硬件设备的PID(idProduct)以及VID(idVendor)进行授权绑定,实现指定设备授权的操作,具体方法如下:

  •  使用”lsusb”指令查看需要授权的设备:

        举个例子:Bus 002 Device 001:ID 1d6b:0003 Linux Foundation 3.0 root hub,其中PID/VID为:1d6b:0003,确定需要绑定的USB设备ID。 

  • 编写规则文件,在目录/etc/udev/rules.d下新建一个格式为”数字-XXX.rules”的规则文件,匹配键使用” SUBSYSTEMS”匹配设备子系统中的”USB”系统:

         确定好对应的父设备后,再通过USB设备的PID/VID绑定设备:

        随后,对该设备进行一系列的操作,本次演示为该设备进行授权、符号连接:

        这样,一条完整的USB口设备权限赋予、重命名操作规则就完成了:

    编写完成后,保存重启系统后生效,在/dev/目录下会发现多出一条设备节点(名称为ttyCamera),使用指令”ll”就可以查看到对应的符号连接:

 

         后续要调用该设备可以直接调用/dev/ttyCamera即可。

五、COM口规则编写     

        回到开头问题,为了解决COM口每次重启都被重新分配设备节点的问题,我们也可以按照USB的规则文件方式对COM进行符号连接,下面介绍另外一种绑定COM 的方式,通过绑定COM的DEVPATH进行符号连接。

        使用指令”udevadm info /dev/XXX(COM口号)”可以查看到COM口的基本信息,如以下例子:

         我们需要关注的是关键字”DEVPATH”的内容:

         DEVPATH你可以简单理解为该COM 口的物理ID,具体规则可以这样编写:

        于USB口的规则文件编写类似,在编写完成COM口文件后,重启系统使其生效,在/dev/目录下就可以发现新增了一项符号连接,后续使用COM口设备都可以使用该命名,不用再担心重启后会被重新分配。

六、规则文件自动编写程序

        对于以上例子,本人编写了一个自动编写的程序(C++版本,连接为:规则文件编写程序),该程序仅需输入对应的参数,如想要把一个COM口设备ttyCOM1重命名为ttyCamera,则可以使用以下指令:

 

        若果想添加一个USB设备,则将PID/VID输入即可:

 

        全部绑定完成后将会生成一个规则文件:10- rules_writing.rules。拉到/etc/udev/rules.d重启系统后即可使用。

猜你喜欢

转载自blog.csdn.net/qq_41884002/article/details/126952049