块设备和字符设备管理


 

设备简介

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

 

 

3lsblk

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:本栏显示设备是否可移动设备。注意,在本例中设备sdbsr0RM值等于1,这说明他们是可移动设备。

SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB

RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。

TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sdasdb是磁盘,而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:创建(有缓冲的)块设备文件

cu:创建(没有缓冲的)字符设备文件

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的好处:

Ø 动态管理

Ø 自定义命名规则

Ø 设置设备的权限和所有者

 

3udev相关术语

(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产生事件时以哪一种等级将事件记录到日志中,可以是errinfo、或debug,默认err

 

udev_root=/dev

udev产生的设备文件的根目录

 

udev_db=/dev/.udevdb

udev产生的设备文件形成的数据库

 

udev_rules=/dev/udev/rules.d

指定udev规则文件所在的目录

 

5udev规则文件

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 1112 2010 60-fprint-autosuspend.rules

-rw-r--r--. 1 root root 1060 1112 2010 60-pcmcia.rules

-rw-r--r--. 1 root root  316 1122 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 1111 2010 97-bluetooth-serial.rules

-rw-r--r--. 1 root root  308 1123 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 驱动. 它创建一对设备符号连接:cdromcdrom-%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