Linux串口权限与udev理解

Linux串口权限与udev理解

本文不是很深入的探讨权限和udev问题,只是分析在日常使用中有关的一些概念、理解和解决方式。

串口的问题

在现场开发的同事反映UOS工控机没有配置串口,每次都需要sudo才能使用。(明明在家里你们都会自己配置好环境与权限,为什么到了现场反而不会了需要我提供协助呢?)

我之前没考虑过这个问题,认为串口就是得root权限操作才安全。但是既然提出了需求,就赶紧百度并测试一下吧(可能2会了,Google上不去)。

赋予普通用户串口权限的两种方法

在百度上,给普通用户串口权限有两种主流方法,一种是将用户放入特殊的用户组,从而获得权限。另一种是加入udev规则,在串口插入时自动更改权限。

我个人更倾向于使用第二种方案,因为公司中不同的人装系统就可能起不同的名字,之后进入生产环境可能又会起新的名字,所以采用第二种设置规则的办法,便于之后制作恢复镜像和一键部署。

xxx.rules

sudo vi /etc/udev/rules.d/70-tty-usb-rules,写入以下内容:

KERNEL=="ttyS*",MODE="0666"
KERNEL=="ttyUSB*",MODE="0666"

这一段的意思是匹配所有ttyS和ttyUSB,插入时都赋予0666的权限,即所有用户都可读可写。重新加载一下设备,就可以按规则配置权限进行操作了。

udev规则

udev是什么?udev是Linux下的设备文件管理方式,运行在用户侧(devfs在内核侧管理设备文件)。有了udev,/dev目录下的文件就都是真实存在的已连接的设备了。

udev的规则都保存在/etc/udev/rules.d目录下,文件名的格式为数字-名称.rules,数字表示加载顺序,一般是从小往大加载,后加载的会覆盖前面的;名称按功能自定义,最后以.rules结尾。这些规则会在设备接入时生效。

规则文件按行执行,每行分为两个部分:匹配和赋值,每个参数使用逗号,分割。

(这段复制自引用[2],仅供参考)。
1、udev 规则的所有操作符
==  比较键、值,若等于,则该条件满足;
!=  比较键、值,若不等于,则该条件满足;
=   对一个键赋值;
+=  为一个表示多个条目的键赋值。
:=  对一个键赋值,并拒绝之后所有对该键的改动,防止后面的规则文件对该键重赋值。

2、udev 规则的匹配键
ACTION        事件 (uevent) 的行为,例如:add、remove。
KERNEL         内核设备名称,例如:sda, cdrom。
DEVPATH        设备的 devpath 路径。
SUBSYSTEM       设备的子系统名称,例如:sda 的子系统为 block。
BUS           设备在 devpath 里的总线名称,例如:usb。
DRIVER         设备在 devpath 里的设备驱动名称,例如:ide-cdrom。
ID            设备在 devpath 里的识别号。
SYSFS{filename}    设备的 devpath 路径下,设备的属性文件“filename”里的内容。
ENV{key}       环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。
PROGRAM        调用外部命令。
RESULT         外部命令 PROGRAM 的返回结果。

3、udev 的重要赋值键
NAME           /dev目录下显示的文件名重命名
SYMLINK          为 /dev下文件进行符号链接,防止覆盖系统默认产生的文件
OWNER, GROUP, MODE  为设备设定权限。
ENV{key}         导入一个环境变量。

4、udev 的值和可调用的替换操作符
Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:
k e r n e l , ∗ ∗ kernel, %k**        设备的内核设备名称,例如:sda、cdrom。 ** kernel,number, %n        设备的内核号码,例如:sda3 的内核号码是 3。
d e v p a t h , ∗ ∗ devpath, %p**       设备的 devpath路径。 ** devpath,id, %b          设备在 devpath里的 ID 号。
s y s f s f i l e , ∗ ∗ sysfs{file}, %s{file}**   设备的 sysfs里 file 的内容。其实就是设备的属性值。 ** sysfsfile,env{key}, %E{key}   一个环境变量的值。
m a j o r , ∗ ∗ major, %M**        设备的 major 号。 ** major,minor %m        设备的 minor 号。
r e s u l t , ∗ ∗ result, %c**        PROGRAM 返回的结果。 ** result,parent, %P       父设备的设备文件名。
r o o t , ∗ ∗ root, %r**         udev_root的值,默认是 /dev/。 ** root,tempnode, %N      临时设备名。
%%            符号 % 本身。
$$             符号 $ 本身。

比如前面更改串口的规则,就是匹配所有设备名为ttyS和ttyUSB的设备,将其权限修改为0666。

参考

[1]https://www.cnblogs.com/qixianyu/p/6869744.html
[2]https://www.cnblogs.com/cslunatic/p/3171837.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值