块设备和字符设备管理
一:设备简介
1:块设备
应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
常见的块设备文件:
/dev/hd[a-t]:IDE设备
/dev/sd[a-z]:SCSI设备
/dev/fd[0-7]:标准软盘
/dev/md[0-3]:软raid设备
loop[0-15]:本地回还设备
ram[0-19]:内存
2:字符设备
提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。
常见的字符设备文件:
/dev/null:无限数据接收设备
/dev/zero:无限零资源
/dev/tty[0-31]:虚拟中断
/dev/ttyS[0-9]:串口
/dev/lp[0-3]:并口
/dev/console:控制台
/dev/fb[0-31]:帧缓冲设备
二:查看设备信息
1:查看设备号每一个设备都具有一个主设备号和一个次设备号,主设备号被Linux系统用来确定驱动程序,告诉内核使用哪一个驱动程序为该设备服务,而次设备号被驱动程序用来确定具体的设备。
例:查看光驱的设备号
[root@localhost ~]# ls -l /dev/cdrom
lrwxrwxrwx. 1 root root 3 7月 1 2016 /dev/cdrom -> sr0
[root@localhost ~]# ls -l /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 7月 1 2016 /dev/sr0
注释:
主设备号为11,次设备号为0
例:查看帧缓冲设备的设备号
[root@localhost ~]# ls -l /dev/fb
lrwxrwxrwx. 1 root root 3 7月 1 2016 /dev/fb -> fb0
[root@localhost ~]# ls -l /dev/fb0
crw-rw----. 1 root root 29, 0 7月 1 2016 /dev/fb0
2:/proc/devices文件详解
/proc/devices文件列出字符设备和块设备的主设备号,以及分配到这些设备号的设备名称。
[root@localhost ~]# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
21 sg
29 fb
116 alsa
128 ptm
136 pts
162 raw
180 usb
189 usb_device
202 cpu/msr
203 cpu/cpuid
249 hidraw
250 usbmon
251 bsg
252 pcmcia
253 watchdog
254 rtc
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
9 md
11 sr
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
3:lsblk
lsblk命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,cd-ROM等等。lsblk命令包含在util-linux-ng包中,现在该包改名为util-linux。这个包带了几个其它工具,如dmesg。要安装lsblk,请在此处下载util-linux包。Fedora用户可以通过命令sudo yum install util-linux-ng来安装该包。
lsblk命令选项含义:
-a, --all 显示所有设备。
-b, --bytes 以bytes方式显示设备大小。
-d, --nodeps 不显示 slaves 或 holders。
-D, --discard print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs 显示文件系统信息。
-h, --help 显示帮助信息。
-i, --ascii use ascii characters only。
-m, --perms 显示权限信息。
-l, --list 使用列表格式显示。
-n, --noheadings 不显示标题。
-o, --output <list> 输出列。
-P, --pairs 使用key="value"格式显示。
-r, --raw 使用原始格式显示。
-t, --topology 显示拓扑结构信息。
例:列出块设备
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.2G 0 rom /media/cdrom
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 49.5G 0 part
├─VolGroup-lv_root (dm-0) 253:0 0 47.6G 0 lvm /
└─VolGroup-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]
各字段含义:
NAME:这是块设备名。
MAJ:MIN:本栏显示主要和次要设备号。
RM:本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
MOUNTPOINT:本栏指出设备挂载的挂载点。
例:列出块设备,并且显示有关文件系统的信息
[root@localhost ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sr0 iso9660 CentOS_6.5_Final
/media/cdr
sda
├─sda1 ext4 294ad562-2483-41ce-b5c8-22feb620a766 /boot
└─sda2 LVM2_mem sPD7DF-cTL5-R8XK-fl0y-9Hlr-8uic-LDgOpH
├─VolGroup-lv_root (dm-0)
ext4 95161875-59c2-4777-a7ba-599f1cc1fffc /
└─VolGroup-lv_swap (dm-1)
swap 17981850-c0ec-4b36-8f93-5c4e36165af5 [SWAP]
例:列出块设备,并显示有关权限的信息
[root@localhost ~]# lsblk -m
NAME SIZE OWNER GROUP MODE
sr0 4.2G root cdrom brw-rw----
sda 50G root disk brw-rw----
├─sda1 500M root disk brw-rw----
└─sda2 49.5G root disk brw-rw----
├─VolGroup-lv_root (dm-0) 47.6G root disk brw-rw----
└─VolGroup-lv_swap (dm-1) 2G root disk brw-rw----
例:以拓扑的形式列出块设备
[root@localhost ~]# lsblk -t
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA
sr0 0 2048 0 2048 2048 1 cfq 128 128
sda 0 512 0 512 512 1 cfq 128 128
├─sda1 0 512 0 512 512 1 cfq 128 128
└─sda2 0 512 0 512 512 1 cfq 128 128
├─VolGroup-lv_root (dm-0)
0 512 0 512 512 1 128 128
└─VolGroup-lv_swap (dm-1)
0 512 0 512 512 1 128 128
例:以键=值的输出
[root@localhost ~]# lsblk -P
NAME="sr0" MAJ:MIN="11:0" RM="1" SIZE="4.2G" RO="0" TYPE="rom" MOUNTPOINT="/media/cdrom"
NAME="sda" MAJ:MIN="8:0" RM="0" SIZE="50G" RO="0" TYPE="disk" MOUNTPOINT=""
NAME="sda1" MAJ:MIN="8:1" RM="0" SIZE="500M" RO="0" TYPE="part" MOUNTPOINT="/boot"
NAME="sda2" MAJ:MIN="8:2" RM="0" SIZE="49.5G" RO="0" TYPE="part" MOUNTPOINT=""
NAME="VolGroup-lv_root" MAJ:MIN="253:0" RM="0" SIZE="47.6G" RO="0" TYPE="lvm" MOUNTPOINT="/"
NAME="VolGroup-lv_swap" MAJ:MIN="253:1" RM="0" SIZE="2G" RO="0" TYPE="lvm" MOUNTPOINT="[SWAP]"格式列出块设备
三:创建设备文件
1:手动创建设备文件
mknod命令用于创建Linux中的字符设备文件和块设备文件。当文件类型为P时(FIFO文件)可以不需指定主设备号,其他文件类型必须指定。
mknod命令可以指定的文件类型:
b:创建(有缓冲的)块设备文件
c或u:创建(没有缓冲的)字符设备文件
p:创建先进先出(FIFO)设备文件
mknod命令的选项含义:
-Z:设置安全的上下文;
-m:设置权限模式;
-help:显示帮助信息;
--version:显示版本信息。
例:手动创建/dev/sda设备文件
[root@localhost ~]# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
[root@localhost ~]# rm -rf /dev/sda
[root@localhost ~]# ls -l /dev/sda
ls: 无法访问/dev/sda: 没有那个文件或目录
[root@localhost ~]# mknod /dev/sda b 8 0
[root@localhost ~]# ls -l /dev/sda
brw-r--r--. 1 root root 8, 0 3月 24 21:24 /dev/sda
注释:
b指块设备文件
8指主设备号
0指次设备号
例:为/dev/sda设备手动创建/tmp/Disk设备文件
[root@localhost ~]# ls -l /dev/sda
brw-r--r--. 1 root root 8, 0 3月 24 21:24 /dev/sda
[root@localhost ~]# fdisk -l /dev/sda
Disk /dev/sda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000807fb
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 6528 51915776 8e Linux LVM
[root@localhost ~]# mknod /tmp/Disk b 8 0
[root@localhost ~]# fdisk -l /tmp/Disk
Disk /tmp/Disk: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000807fb
Device Boot Start End Blocks Id System
/tmp/Disk1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/tmp/Disk2 64 6528 51915776 8e Linux LVM
[root@localhost ~]# ls -l /tmp/Disk
brw-r--r--. 1 root root 8, 0 3月 24 21:26 /tmp/Disk
2:自动创建设备文件
MAKEDEV是一个脚本程序,用于在 /dev 目录下建立设备,通过这些设备文件可以访问位于 内核 的 驱动程序。
MAKEDEV命令选项含义:
-a:即使设备已经存在,始终创建设备,并有适当的权限和文件上下文
-d <目录>:指定目录,创建的设备不再默认的目录下
-D <目录>:如果目录指定-d选项,计算设备创建的上下文
-m <最大设备数>:创建不超过在配置文件中规定的指定数量的设备
-n:不更新设备,只需显示将被执行的操作
-M:创建属于当前用户的符号链接、目录和socket,并显示设备列表
-S:不更新设备,只是显示格式,可以将执行动作输出到一个sehll
-i:忽略错误解析配置文件
-u:显示设备的所有权和权限,而不是创建
-v:显示详细信息
例:使用MAKEDEV命令自动创建/dev/sda设备文件
[root@localhost ~]# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
[root@localhost ~]# rm -rf /dev/sda
[root@localhost ~]# ls -l /dev/sda
ls: 无法访问/dev/sda: 没有那个文件或目录
[root@localhost ~]# MAKEDEV sda
[root@localhost ~]# ls -l /dev/sda
brw-r-----. 1 root disk 8, 0 3月 25 08:30 /dev/sda
四:udev简介
1:什么是udev
在对待设备文件这块,Linux改变了几次策略。在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev目录下。后来,采用了devfs, 一个基于内核的动态设备文件系统,他首次出现在2.3.46内核中。Mandrake,Gentoo等Linux分发版本采用了这种方式。devfs创建 的设备文件是动态的。但是devfs有一些严重的限制,从2.6.13版本后移走了。目前取代他的便是文本要提到的udev--一个用户空间程序。
目前很多的Linux分发版本采纳了udev的方式,因为它在Linux设备访问,特别是那些对设备有极端需求的站点(比如需要控制上千个硬盘)和热插拔设备(比如USB摄像头和MP3播放器)上解决了几个问题。下面我我们来看看如何管理udev设备。
实际上,对于那些为磁盘,终端设备等准备的标准配置文件而言,你不需要修改什么。但是,你需要了解udev配置来使用新的或者外来设备,如果不修改配置, 这些设备可能无法访问,或者说Linux可能会采用不恰当的名字,属组或权限来创建这些设备文件。你可能也想知道如何修改RS-232串口,音频设备等文件的属组或者权限。这点在实际的Linux实施中是会遇到的。
2:使用udev的好处
为什么使用udev
在此之前的设备文件管理方法(静态文件和devfs)有几个缺点:
Ø 不确定的设备映射。特别是那些动态设备,比如USB设备,设备文件到实际设备的映射并不可靠和确定。举一个例子:如果你有两个USB打印机。一个可能称 为/dev/usb/lp0,另外一个便是/dev/usb/lp1。但是到底哪个是哪个并不清楚,lp0,lp1和实际的设备没有一一对应的关系,因为 他可能因为发现设备的顺序,打印机本身关闭等原因而导致这种映射并不确定。理想的方式应该是:两个打印机应该采用基于他们的序列号或者其他标识信息的唯一 设备文件来映射。但是静态文件和devfs都无法做到这点。
Ø 没有足够的主/辅设备号。我们知道,每一个设备文件是有两个8位的数字:一个是主设备号 ,另外一个是辅设备号来分配的。这两个8位的数字加上设备类型(块设备或者字符设备)来唯一标识一个设备。不幸的是,关联这些身边的的数字并不足够。
Ø /dev目录下文件太多。一个系统采用静态设备文件关联的方式,那么这个目录下的文件必然是足够多。而同时你又不知道在你的系统上到底有那些设备文件是激活的。
Ø 命名不够灵活。尽管devfs解决了以前的一些问题,但是它自身又带来了一些问题。其中一个就是命名不够灵活;你别想非常简单的就能修改设备文件的名字。缺省的devfs命令机制本身也很奇怪,他需要修改大量的配置文件和程序。
Ø 内核内存使用。devfs特有的另外一个问题是,作为内核驱动模块,devfs需要消耗大量的内存,特别当系统上有大量的设备时(比如上面我们提到的系统一个上有好几千磁盘时)
udev的目标是想解决上面提到的这些问题,他通采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你之大如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。
使用udev的好处:
Ø 动态管理
Ø 自定义命名规则
Ø 设置设备的权限和所有者
3:udev相关术语
(1) 设备文件
是指在/dev目录下,可以被应用程序用来和设备驱动交互的文件。而不会特别地区分设备文件、设备节点或者设备特殊文件
(2) devfs
是Linux系统早期的设备管理工具,已经被udev取代
(3) sysfs
是Linux2.6的内核里的一个虚拟文件系统(/sys)。他把设备和驱动的信息从内核的设备模块到处到用户空间,从该文件系统中,Linux用户可以获取很多设备的属性
(4) devpath
是指一个设备在sysfs文件系统(/sys)下的相对路径,该路径包含了该设备的属性文件。udev里的多数命令都是针对devpath操作的。
(5) 内核设备名称
设备在sysfs里的名称,是udev默认使用的设备文件
4:/etc/udev/udev.conf文件详解
[root@localhost ~]# cat /etc/udev/udev.conf
# The initial syslog(3) priority: "err", "info", "debug" or its
# numerical equivalent. For runtime debugging, the daemons internal
# state can be changed with: "udevadm control --log-priority=<value>".
udev_log="err"
在该文件中可以添加的常用主要参数:
udev_log=”err”
设置当udev产生事件时以哪一种等级将事件记录到日志中,可以是err、info、或debug,默认err
udev_root=”/dev”
udev产生的设备文件的根目录
udev_db=”/dev/.udevdb”
udev产生的设备文件形成的数据库
udev_rules=”/dev/udev/rules.d”
指定udev规则文件所在的目录
5:udev规则文件
udev规则文件都保存在/etc/udev/rules.d目录中,在该目录下有好几个udev规则文件,这些文件一部分是udev软件包生成的,另外一部分可能是别的硬件或者软件包生成的,这些规则文件的文件名通常是两个数字开头的,他表示系统应用该规则的顺序。
这个目录存储的是以.rules结束的文件。每一个文件处理一系列规则来帮助udev分配名字给设备文件以保证能被内核识别。
[root@localhost ~]# ls -l /etc/udev/rules.d/
总用量 44
-rw-r--r--. 1 root root 1652 11月 12 2010 60-fprint-autosuspend.rules
-rw-r--r--. 1 root root 1060 11月 12 2010 60-pcmcia.rules
-rw-r--r--. 1 root root 316 11月 22 2013 60-raw.rules
-rw-r--r--. 1 root root 789 7月 1 2016 70-persistent-cd.rules
-rw-r--r--. 1 root root 420 7月 1 2016 70-persistent-net.rules
-rw-r--r--. 1 root root 320 9月 12 2012 90-alsa.rules
-rw-r--r--. 1 root root 83 7月 20 2011 90-hal.rules
-rw-r--r--. 1 root root 2486 11月 11 2010 97-bluetooth-serial.rules
-rw-r--r--. 1 root root 308 11月 23 2013 98-kexec.rules
-rw-r--r--. 1 root root 54 12月 8 2011 99-fuse.rules
-rw-r--r--. 1 root root 341 7月 1 2016 99-vmware-scsi-udev.rules
(1) 键/值对操作符
规则文件里的规则有一系列的键/值对组成,键/值对之间用逗号(,)分割。每一个键或者是用户匹配键,或者是一个赋值键。匹配键确定规则是否被应用,而赋 值键表示分配某值给该键。这些值将影响udev创建的设备文件。赋值键可以处理一个多值列表。
匹配键和赋值键操作符解释见下表:
操作符 匹配或赋值 解释
-------------------------------------
== 匹配 相等比较
!= 匹配 不等比较
= 赋值 分配一个特定的值给该键,他可以覆盖之前的赋值。
+= 赋值 追加特定的值给已经存在的键
:= 赋值 分配一个特定的值给该键,后面的规则不可能覆盖它。
(2) 常用键
有一些键在udev规则文件里经常出现,这些键的值可以使用通配符(*,?,甚至范围,比如[0-9]),这些常用键列举如下:
常用udev键
ACTION :一个时间活动的名字,比如add,当设备增加的时候
KERNEL:在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备
DEVPATH:内核设备录进,比如/devices/*
SUBSYSTEM :子系统名字,比如sound,net
BUS :总线的名字,比如IDE,USB
DRIVER :设备驱动的名字,比如ide-cdrom
ID :独立于内核名字的设备名字
SYSFS{ value} :sysfs属性值,他可以表示任意
ATTRS:匹配设备的sysfs属性值
ENV{ key} :环境变量,可以表示任意
PROGRAM :可执行的外部程序,如果程序返回0值,该键则认为为真(true)
RESULT :上一个PROGRAM调用返回的标准输出。
(3) 可以赋值的键
NAME:根据这个规则创建的设备文件的文件名。注意:仅仅第一行的NAME描述是有效 的,后面的均忽略。 如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。
SYMLINK:根据规则创建的字符连接名
OWNER :设备文件的属组
GROUP :设备文件所在的组。
MODE :设备文件的权限,采用8进制
ATTR:应写入设备sysfs属性的值
RUN :为设备而执行的程序列表
LABEL :在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务)
GOTO :跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO
IMPORT{ type}:导入一个文件或者一个程序执行后而生成的规则集到当前文件
WAIT_FOR_SYSFS:等待一个特定的设备文件的创建。主要是用作时序和依赖问题。
PTIONS:特定的选项: last_rule 对这类设备终端规则执行; ignore_device 忽略当前规则;
ignore_remove 忽略接下来的并移走请求。all_partitions 为所有的磁盘分区创建设备文件。
(4) 替换操作符
(5) udev规则配置
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设备。
(6) 网卡设备udev规则文件以及修改实例
例:修改网卡设备的名称:
[root@localhost ~]# cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:39:97:18", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
6:查询udev数据库中的设备信息
使用udevadm info命令可以查询udev数据库中的设备信息,也可以从sysfs文件系统中查询到设备的属性以辅助创建udev规则。
udevadm info命令选项含义:
-q:查询指定类型的设备信息。可以指定以下类型进行查询
name—设备节点的名称
symlink—符号链接文件
path—系统设备路径
property—设备属性
all—所有的值
-p:查询系统设备的路径
-n:查询设备节点或链接名
-r:前置dev目录路径名
-a:显示指定设备的所有sysfs记录的属性,使用udev规则匹配特殊的设备
-d:显示主设备号和次设备号
-e:导出udev数据库中的内容
例:查询/dev/sda设备的系统设备路径
[root@localhost ~]# udevadm info -q path -n /dev/sda
/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
例:查询/dev/sda设备的符号链接文件
[root@localhost ~]# udevadm info -q symlink -n /dev/sda
block/8:0 disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
例:查询/dev/sda设备的所有值
[root@localhost ~]# udevadm info -q all -n /dev/sda
P: /devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
N: sda
W: 27
S: block/8:0
S: disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
E: MAJOR=8
E: MINOR=0
E: DEVNAME=/dev/sda
E: DEVTYPE=disk
E: SUBSYSTEM=block
E: ID_SCSI=1
E: ID_VENDOR=VMware_
E: ID_VENDOR_ENC=VMware\x2c\x20
E: ID_MODEL=VMware_Virtual_S
E: ID_MODEL_ENC=VMware\x20Virtual\x20S
E: ID_REVISION=1.0
E: ID_TYPE=disk
E: ID_BUS=scsi
E: ID_PATH=pci-0000:00:10.0-scsi-0:0:0:0
E: ID_PART_TABLE_TYPE=dos
E: LVM_SBIN_PATH=/sbin
E: DEVLINKS=/dev/block/8:0 /dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: UDISKS_PRESENTATION_NOPOLICY=0
E: UDISKS_PARTITION_TABLE=1
E: UDISKS_PARTITION_TABLE_SCHEME=mbr
E: UDISKS_PARTITION_TABLE_COUNT=2
例:查询系统指定设备路径的信息
[root@localhost ~]# udevadm info -a -p /sys/block/sda
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda':
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="0"
ATTR{ro}=="0"
ATTR{size}=="104857600"
ATTR{alignment_offset}=="0"
ATTR{discard_alignment}=="0"
ATTR{capability}=="52"
ATTR{stat}==" 40863 7088 2184128 31130 8589 184619 1443208 40651 0 37765 71671"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0':
KERNELS=="2:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}=="VMware, "
ATTRS{model}=="VMware Virtual S"
ATTRS{rev}=="1.0 "
ATTRS{state}=="running"
ATTRS{timeout}=="180"
ATTRS{eh_timeout}=="10"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0xc14b"
ATTRS{iodone_cnt}=="0xc14b"
ATTRS{ioerr_cnt}=="0x5"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{dh_state}=="detached"
ATTRS{queue_depth}=="32"
ATTRS{queue_ramp_up_period}=="120000"
ATTRS{queue_type}=="simple"
looking at parent device '/devices/pci0000:00/0000:00:10.0/host2/target2:0:0':
KERNELS=="target2:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:10.0/host2':
KERNELS=="host2"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:10.0':
KERNELS=="0000:00:10.0"
SUBSYSTEMS=="pci"
DRIVERS=="mptspi"
ATTRS{vendor}=="0x1000"
ATTRS{device}=="0x0030"
ATTRS{subsystem_vendor}=="0x15ad"
ATTRS{subsystem_device}=="0x1976"
ATTRS{class}=="0x010000"
ATTRS{irq}=="17"
ATTRS{local_cpus}=="00000000,00000000,00000000,00000001"
ATTRS{local_cpulist}=="0"
ATTRS{modalias}=="pci:v00001000d00000030sv000015ADsd00001976bc01sc00i00"
ATTRS{numa_node}=="-1"
ATTRS{enable}=="1"
ATTRS{broken_parity_status}=="0"
ATTRS{msi_bus}==""
ATTRS{config}==""
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
7:重启udev守护进程
例:让新的udev规则立即生效
[root@localhost ~]# start_udev
例:查看udev进程是否存在
[root@localhost ~]# ps -ef | grep udev
root 42737 1 1 12:20 ? 00:00:00 /sbin/udevd -d
root 43263 12851 0 12:20 pts/0 00:00:00 grep udev
转载于:https://blog.51cto.com/72756/2366774