udev的使用-minicom没有权限打开串口,更改 ttyUSB0 的权限

使用minicom打开串口会提示没有权限,必需要用 sudo,怎样更改串口设备的权限能够让普通用户读写呢?

事实上仅仅要更改udev的规则, ttyUSB0 的权限为666。就可以实现让普通用户可读写。

加入udev规则:

/etc/udev/rules.d/50-usb-serial.rules

KERNEL=="ttyUSB0", GROUP="uucp",MODE="0666"

重新启动

Udev 的使用--linux系统创建设备节点

Linux 里都是以设备文件的形式存在。在早期的 Linux 版本号中,/dev文件夹包括了全部可能出现的设备的设备文件。

但由于这样 Linux 用户非常难在这些大量的设备文件里找到匹配条件的设备文件。

如今 udev 仅仅为那些连接到 Linux 操作系统的设备产生设备文件。而且 udev 能通过定义一个 udev 规则 (rule) 来产生匹配设备属性的设备文件,这些设备属性能够是内核设备名称、总线路径、厂商名称、型号、序列号或者磁盘大小等等。

动态自己主动管理设备信息:当有设备加入 / 删除时。udev 的守护进程侦听到来自内核的 uevent 的事件,用来加入或者删除 /dev下的设备文件,所以 udev 能够仅仅为已经连接的设备产生设备文件。而不会象 2.4 内核一样在 /dev下产生大量设备文件。另外能够使用这个功能 ,当有设备加入时执行外部的程序,比方鼠标加入时自己主动禁用触摸板之类

使用自己定义命名和管理设备:使用 Udev 规则文件,udev 在 /dev/ 里为全部的设备定义了内核设备名称,比方 /dev /sda、/dev/hda、/dev/fd等等。因为 udev 是在用户空间 (user space) 执行,Linux 用户能够接下来对这些信息进行操作,比方能够通过自己定义的规则文件,生成人性的设备标识。比方 /dev/my_disk、/dev/nameusb 等,还能对设置进行參数成员用户组权限之类的改动。

開始之类须要了解

  • sysfs:sysfs是 Linux 2.6 内核里的一个虚拟文件系统 (/sys)。它把设备和驱动的信息从内核的设备模块导出到用户空间 (userspace)。

从该文件系统中,Linux 用户能够获取非常多设备的属性。

  • devpath:本文的 devpath是指一个设备在 sysfs文件系统 (/sys)下的相对路径,该路径包括了该设备的属性文件。

udev 里的多数命令都是针对 devpath操作的。

比如:sda的 devpath是 /block/sda,sda2 的 devpath是 /block/sda/sda2。

  • 内核设备名称:设备在 sysfs里的名称,是 udev 默认使用的设备文件名称。

udev 主配置文件

基本的udev 主配置文件是 /etc/udev/udev.conf。这个文件通常非常短,他可能仅仅是包括几行#开头的凝视。然后有几行选项:

udev_root=/dev/  # 设置的绝对路径,相当于创建 chroot 的根。

udev_rules=/etc/udev/rules.d/    #规则的存放地址

udev_log=err      # 日志的输入级别

udev 的规则配置文件实例

 

默认的规则配置文件存放在 /etc/udev/rules.d/ 中,我们进入这个能够看到 RedHat 默认对设备建好的一些规则和一些硬件公司写好的规则。

进入文件夹,能够见到以二位数字开头的前缀的配置文件,能够使用 vi 进入配置文件里查看,一行是一条规则,默认是从小数字到大数字。这些表示生效的顺序。

我们在使用 udev 写规则前,先来看一个样例

KERNEL==sd*, PROGRAM=/lib/udev/scsi_id -g -s %p, RESULT==123456, SYMLINK=%k_%c

该规则的运行:假设有一个内核设备名称以 sd 开头,且 SCSI ID 为 123456,则为设备文件产生一个符号链接“sda_123456”.  %p %k %c 请看后面的“udev 的值和可调用的替换操作符 ”

udev 的规则配置文件

在规则文件中,除了以“#”开头的行(凝视)。全部的非空行都被视为一条规则。可是一条规则不能扩展到多行。规则都是由多个 键值对(key-value pairs)组成,并由逗号隔开,键值对能够分为 条件匹配键值对( 下面简称“匹配键 ”) 和 赋值键值对( 下面简称“赋值键 ”)。一条规则能够有多条匹配键和多条赋值键。匹配键是匹配一个设备属性的全部条件,当一个设备的属性匹配了该规则里全部的匹配键。就觉得这条规则生效,然后依照赋值键的内容,运行该规则的赋值。

规则文件中的规则有一系列的键/值对组成,键/值对之间用逗号(,)切割。

通过上面样例中也能看出,这些配置,但我想大家可能会产生疑惑,为什么 KERNEL 是匹配键,而 NAME 和 MODE 是赋值键呢?这由中间的操作符 (operator) 决定。

仅当操作符是“==”或者“!=”时,其为匹配键;若为其它操作符时。都是赋值键。



匹配键和赋值键操作符解释见下表:

操作符     匹配或赋值t                         解释

----------------------------------------

==            匹配              相等比較

!=            匹配             不等比較

=            赋值              分配一个特定的值给该键,他能够覆盖之前的赋值。

+=          赋值              追加特定的值给已经存在的键

:=            赋值                  分配一个特定的值给该键,后面的规则不可能覆盖它。

udev 规则的匹配键 :

键        含义

----------------------------------------

ACTION         事件 (uevent)的行为。比如:add( 加入设备 )、remove(删除设备 )。

KERNEL         在内核里看到的设备名字。比方sd*表示随意SCSI磁盘设备

DEVPATH       内核设备录进,比方/devices/*

SUBSYSTEM       子系统名字,比如:sda的子系统为 block。

BUS         总线的名字,比方IDE,USB

DRIVER         设备驱动的名字,比方ide-cdrom

ID           独立于内核名字的设备名字

SYSFS{ value}       sysfs属性值,他能够表示随意

ENV{ key}       环境变量。能够表示随意

值,该键则觉得为真(true)

RESULT         上一个PROGRAM调用返回的标准输出。

NAME         依据这个规则创建的设备文件的文件名称。

注意:只第一行的NAME描写叙述是有效的。后面的均忽略。

假设你想使用使用两个以上的名字来訪问一个设备的话。能够考虑SYMLINK键。

SYMLINK       为 /dev/下的设备文件产生符号链接。因为 udev仅仅能为某个设备产生一个设备文件。

所以为了不覆盖系统默认的 udev规则所产生的文件。推荐使用符号链接。

OWNER         设备文件的属组

GROUP         设备文件所在的组。

进制

RUN         为设备而运行的程序列表

LABEL         在配置文件中为内部控制而採用的名字标签(下以下的GOTO服务)

GOTO         跳到匹配的规则(通过LABEL来标识)。有点类似程序语言中的GOTO

IMPORT{ type}     导入一个文件或者一个程序运行后而生成的规则集到当前文件

WAIT_FOR_SYSFS   等待一个特定的设备文件的创建。

主要是用作时序和依赖问题。

PTIONS         特定的选项:

last_rule 对这类设备终端规则运行。

ignore_device 忽略当前规则。

ignore_remove 忽略接下来的并移走请求。

all_partitions 为全部的磁盘分区创建设备文件。

我们给出一个列子来解释怎样使用这些键。以下的样例来自Fedora Core 5系统的标准配置文件。

KERNEL==”*”, OWNER=”root” GROUP=”root”, MODE=”0600″

KERNEL==”tty”, NAME=”%k”, GROUP=”tty”, MODE=”0666″, OPTIONS=”last_rule”

KERNEL==”scd[0-9]*”, SYMLINK+=”cdrom cdrom-%k”

KERNEL==”hd[a-z]”, BUS==”ide”, SYSFS{removable}==”1″, SYSFS{device/media}==”cdrom”, SYMLINK+=”cdrom cdrom-%k”

ACTION==”add”, SUBSYSTEM==”scsi_device”, RUN+=”/sbin/modprobe sg”



上面的样例给出了5个规则。每个都是KERNEL或者ACTION键开头:



*第一个规则是缺省的,他匹配随意被内核识别到的设备,然后设定这些设备的属组是root。组是root。訪问权限模式是0600(-rw——-)。

这也是一个安全的缺省设置保证全部的设备在默认情况下仅仅有root能够读写。

*第二个规则也是比較典型的规则了。它匹配终端设备(tty)。然后设置新的权限为0600。所在的组是tty。

它也设置了一个特别的设备文件名称:%K。在这里样例里。%k代表设备的内核名字。那也就意味着内核识别出这些设备是什么名字,就创建什么样的设备文件名称。

*第三行開始的KERNEL==”scd[0-9]*”,表示 SCSI CD-ROM驱动. 它创建一对设备符号连接:cdrom和cdrom-%k。



*第四行,開始的 KERNEL==”hd[a-z]“,表示ATA CDROM驱动器。这个规则创建和上面的规则同样的符号连接。ATA
CDROM驱动器须要sysfs值以来差别别的ATA设备,由于SCSI CDROM能够被内核唯一识别。. 



*第五行以 ACTION==”add”開始,它告诉udev添加 /sbin/modprobe sg到命令列表,当随意SCSI设备添加到系统后。这些命令将运行。其效果就是计算机应该会添加sg内核模块来侦測新的SCSI设备。



当然,上面不过一小部分样例。假设你的系统採用了udev方式,那你应该能够看到很多其它的规则。假设你想改动设备的权限或者创建信的符号连接。那么你须要熟读这些规则,特别是要细致注意你改动的那些与之相关的设备。

udev 的值和可调用的替换操作符

在键值对中的键和操作符都介绍完了。最后是值 (value)。

Linux用户能够任意地定制 udev 规则文件的值。

比如:my_root_disk, my_printer。同一时候也能够引用以下的替换操作符:

----------------------------------------

$kernel, %k:设备的内核设备名称,比如:sda、cdrom。

$number, %n:设备的内核号码,比如:sda3的内核号码是 3。

$devpath, %p:设备的 devpath路径。

$id, %b:设备在 devpath里的 ID号。

$sysfs{file}, %s{file}:设备的 sysfs里 file 的内容。

事实上就是设备的属性值。

比如:$sysfs{size}表示该设备 ( 磁盘 )的大小。

$env{key}, %E{key}:一个环境变量的值。

$major, %M:设备的 major号。

$minor %m:设备的 minor号。

$result, %c:PROGRAM返回的结果

$parent, %P:父设备的设备文件名称。

$root, %r:udev_root的值。默认是 /dev/。

$tempnode, %N:暂时设备名。

%%:符号 %本身。

$$:符号 $本身。

udev 规则所须要信息的查询

经常使用的查上面匹配键信息的命令

udevinfo -a -p $(udevinfo  -q path -n /dev/sda1 )

上面的命令两次使用udevinfo:

第一次是返回sysfs设备路径(他通常和我们看到的Linux设备文件名称所在路径--/dev/hda--不同);

第二次才是查询这个设备路径,结果将是很常的syfs信息汇总

udevinfo -a -p /sys/class/net/eth0

scsi_id -g -s /block/sda

scsi_id -g -x -s /block/sda/sda3

ata_id /dev/hda

udev 信息的測试和生效

查出来后,依据上面文件里的内容写规则后,怎么測试

udevtest /block/sda

start_dev #命令重新启动 udev守护进程

本操作会对全部的设备又一次查询规则文件夹下全部的规则文件,然后运行所匹配的规则里的行为。

通常使用该命令让新的规则文件马上生效。

udev的使用-minicom没有权限打开串口,更改 ttyUSB0 的权限的更多相关文章

  1. Linux CentOS7 VMware 文件和目录权限chmod、更改所有者和所属组chown、umask、隐藏权限lsattr/chattr

    一.文件和目录权限chmod u User,即文件或目录的拥有者:g Group,即文件或目录的所属群组:o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围:a All,即全部 ...

  2. Linux下打开串口设置

    给出打开串口函数 int open_tty(char tty[]) { int fd; char tty_path[32]={0}; sprintf(tty_path,"/dev/%s&qu ...

  3. qt 打开串口 UI卡死

    imx6在qt中打开调试串口时,ui总是会卡死.调试串口已经被文件系统占用,而在qt的app中使用open函数却能够调用open函数,打开成功,造成ui卡死,并且调试串口也卡死.本文记录这个问题的解决 ...

  4. 在MacOSX下用管理员权限打开App应用程序

    最近但疼的事情比较多,特别是升级了10.9以后. 难怪10.9会免费,它喵的当我们所有人都是测试开发者,那我们做实验,到处都是BUG...虽然是这么吐槽了,但是实际上也没有特别大的,能够影响到我的生活 ...

  5. HTTP could not register URL http://+:86/. 设置VS默认以管理员权限打开

      在使用visual studio 2013启动self host webapi时候碰到下面的错误: 详细错误信息如下: HTTP could not register URL http://+:8 ...

  6. C/C++ 打开串口和关闭串口

    通常使用下列函数来通过Win系统来对外围设备进行通信处理: 0. 前言 做串口方面的程序,使用CreateFile打开串口通信端口.在对串口操作之前,需要首先打开串口.使用C++进行串口编程,如果采用 ...

  7. 让win7变成无线路由(需要用管理员权限打开)最后完善.rar

    让win7变成无线路由(需要用管理员权限打开)最后完善.bat @ECHO OFF CLS color 0a netsh wlan show drivers ECHO.★★★★★★★★★★★★★★★★ ...

  8. C#使用管理员权限打开cmd执行命令行

    最近遇到个棘手的问题,服务器远程连不上,但是ftp可以,可能远程连接的服务挂了或者防火墙入站规则有点问题,想要重启,得找机房工作人员,还是挺麻烦的 想了想可以上传个执行cmd命令的东西,然后远程访问触 ...

  9. unity+android权限--打开应用不弹权限,动态请求权限

    因为笔者之前的游戏需要分享图片,会请求外部储存,第一次打开游戏就会出现弹窗: 很多人对这个很敏感,怕你访问到他们的照片隐私,看到这个权限就拒绝,甚至卸载,实际上我们只是想截屏游戏内容分享给其他玩家,但 ...

随机推荐

  1. ROS-URDF-建立模型

    前言:建立一个简单的urdf模型 详解请参看教程http://wiki.ros.org/urdf/Tutorials/Building%20a%20Visual%20Robot%20Model%20w ...

  2. 题解报告:hdu 1848 Fibonacci again and again(尼姆博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 Problem Description 任何一个大学生对菲波那契数列(Fibonacci num ...

  3. jquery中的left和top

    left 和 top /*1. 获取元素基于定位容器的位置*/ /*返回的是对象 属性 left top */ var position = $('.inner').position(); conso ...

  4. CXF-JAX-WS开发(二)spring整合CXF-JAX-WS

    一.服务端 1.目录结构 2.创建maven工程[Packaging:war] 3.引入依赖 <dependencies> <!-- CXF(这里不需要引入cxf-rt-transp ...

  5. JSP_内置对象_out

    out对象是JspWriter类的实例,是向客户端输出内容的常用对象,常用方法如下: void println() 向客户端打印字符串 void clear() 清除缓冲区的内容,如果在flush之后 ...

  6. 微信小程序,时间戳和日期格式互相转化

    微信小程序,时间戳转为日期格式 通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils ...

  7. 查看占用某端口的进程——netstat、findstr 的使用

    netstat   检验本机各端口的网络连接情况 -a 显示所有连接和侦听端口(如Windows共享服务 的135,445端口) -n 不进行IP地址到主机名的解析 -o 显示拥有的与每个连接关联的进 ...

  8. BZOJ 4259: 残缺的字符串 FFT_多项式

    Code: #include<bits/stdc++.h> #define maxn 1200000 using namespace std; void setIO(string s) { ...

  9. Python笔记(29)----进程

    目录: 一.进程 多任务的概念 创建子进程----fork[Linux] 全局变量在多个进程中不共享 多次fork() 创建进程----multiprocessing[windows] 二.线程 一. ...

  10. laravel中ubuntu下执行php artisan migrate总是报错

    ubuntu14.0 + xampp + laravel5下 laravel中ubuntu下执行php artisan migrate总是报错: [PDOException] could not fi ...