udev

udev介绍及两个小场景应用


说明:本实验内容基于RHEL6.0,内核版本是2.6.32-71.el6.x86_64,udev软件版本是147-2.29.el6.x86_64。


目录

一、udev概念

二、工作原理

三、相关术语、命令、文件

四、/etc/udev/rules.d/*.rules文件语法

五、udev实验


一、udev概念

概念:udev即user-space device的意思,用户层的管理设备的程序,是2.6内核的功能。它能够根据系统中硬件设备的动态更新(创建、删除等)设备文件。其依赖于sysfs(/sys/目录)文件系统。配置文件位于/etc/udev/目录。早期管理设备的是mknod以及devfs。

功能:udev可以管理/dev目录的设备文件,它并不关心设备的major/minor编号,能够给予用户查询和命名的权力,同时它遵循了LSB的命名规范,由于从kernel层移到了user层,所以管理更加方便。

优点:动态管理和支持自定义命名规则。


二、工作原理

当有设备添加时,首先kernel侦测到设备并输出设备的状态信息到sysfs(如usb设备位于/sys/block/,网卡设备位于/sys/class/net/等),接着通过netlinksocket通告udevd守护进程udev event的到来,然后udev创建设备节点并且(或者)运行一些程序(存在于rules文件,/etc/udev/rules.d/*.rules),接着udev通过socket通告hald守护进程,HAL侦测设备信息并广播(D-Bus)。


三、相关术语、命令、文件

sysfs: 2.6内核的虚拟文件系统/sys,可以将设备和驱动信息从内核导出到用户空间,udev使用sysfs来侦测设备。

devpath:设备在sysfs下的相对路径,udev使用该方式表达。如devpath的路径/block/sdc/sdc2指的是一般情况下的/dev/sdc2。

udevmonitor,udevinfo是RHEL5下的命令,在RHEL6(udev 147)中统一用udevadm [option]来管理。

/lib/udev:此目录下的命令可以为书写udev的rules文件提供一些有用的信息,例如scsi_id, usb_id等。

/etc/udev/udev.conf:udev的配置文件。

udev_root="/dev"; udev产生的设备文件的根目录是/dev

udev_db="/dev/.udevdb"; 通过udev产生的设备文件形成的数据库

udev_rules="/etc/udev/rules.d";用于指导udev工作的规则所在目录。

udev_log="err"; 当出现错误时,用syslog记录错误信息。包括err、info、debug。

ludev相关命令

1. udevinfo命令可以查询udev数据库的设备信息。例如:

[root@fileserver  ~]# udevadm info -a -p /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:1f.2/host0/target0:0:0/0: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}=="312581808"

   ATTR{alignment_offset}=="0"

   ATTR{discard_alignment}=="0"

   ATTR{capability}=="52"

   ATTR{stat}=="   51890     54775  2887525   360870     21519    15246   237328    480672        0   196197    841455"

   ATTR{inflight}=="       0        0"


 looking at parent device  '/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0':

   KERNELS=="0:0:0:0"

   SUBSYSTEMS=="scsi"

   DRIVERS=="sd"

   ATTRS{device_blocked}=="0"

   ATTRS{type}=="0"

   ATTRS{scsi_level}=="6"

   ATTRS{vendor}=="ATA     "

   ATTRS{model}=="WDC  WD1600AAJS-0"

   ATTRS{rev}=="01.0"

   ATTRS{state}=="running"

   ATTRS{timeout}=="30"

   ATTRS{iocounterbits}=="32"

   ATTRS{iorequest_cnt}=="0x11f3e"

   ATTRS{iodone_cnt}=="0x11f3e"

   ATTRS{ioerr_cnt}=="0x44"

   ATTRS{modalias}=="scsi:t-0x00"

   ATTRS{evt_media_change}=="0"

   ATTRS{dh_state}=="detached"

   ATTRS{queue_depth}=="1"

   ATTRS{queue_type}=="none"


 looking at parent device  '/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0':

   KERNELS=="target0:0:0"

   SUBSYSTEMS=="scsi"

   DRIVERS==""


 looking at parent device  '/devices/pci0000:00/0000:00:1f.2/host0':

   KERNELS=="host0"

   SUBSYSTEMS=="scsi"

   DRIVERS==""


 looking at parent device  '/devices/pci0000:00/0000:00:1f.2':

   KERNELS=="0000:00:1f.2"

   SUBSYSTEMS=="pci"

   DRIVERS=="ata_piix"

   ATTRS{vendor}=="0x8086"

   ATTRS{device}=="0x27c0"

   ATTRS{subsystem_vendor}=="0x8086"

   ATTRS{subsystem_device}=="0x27c0"

   ATTRS{class}=="0x010180"

   ATTRS{irq}=="19"

   ATTRS{local_cpus}=="3"

   ATTRS{local_cpulist}=="0-1"

   ATTRS{modalias}=="pci:v00008086d000027C0sv00008086sd000027C0bc01sc01i80"

   ATTRS{numa_node}=="-1"

   ATTRS{enable}=="1"

   ATTRS{broken_parity_status}=="0"

   ATTRS{msi_bus}==""

   ATTRS{resource1}=="P"


 looking at parent device  '/devices/pci0000:00':

   KERNELS=="pci0000:00"

   SUBSYSTEMS==""

   DRIVERS==""

在上面的输出中,颜色绿色的如KERNEL=="sda"表示的是标准的匹配键match-key,例如KERNEL和ATTR,颜色是蓝色的如SUBSYSTEMS=="scsi"和颜色是梅红的如ATTRS{irq}=="19"则是parent设备的内容,例如SUBSYSTEMS和ATTRS。

2.udevadm test会针对一个设备,在不需要 uevent 触发的情况下模拟一次udev的运行,并输出查询规则文件的过程、所执行的行为、规则文件的执行结果。通常使用来调试规则文件。

[root@fileserver  ~]# more /etc/udev/rules.d/99-usbadd-mount.rules

#  import FS information from blkid

KERNEL=="sd*",  DRIVERS=="usb", SUBSYSTEMS=="usb",\

IMPORT{program}="/sbin/blkid -o udev -p  $tempnode"


[root@fileserver  ~]# udevadm test /class/net/eth0

由于输出过于冗长,只摘取与rules文件中的IMPORT{program}相关部分。

udev_rules_apply_to_event:  IMPORT '/sbin/blkid -o udev -p /dev/sdb'  /etc/udev/rules.d/99-usbadd-mount.rules:2

util_run_program:  '/sbin/blkid -o udev -p /dev/sdb' started

util_run_program:  '/sbin/blkid' (stdout) 'ID_PART_TABLE_TYPE=dos'

util_run_program:  '/sbin/blkid -o udev -p /dev/sdb' returned with exitcode 0

……

3. udevadmmonitor用于调试,监控udev的事件过程。

[root@fileserver  ~]# udevadm monitor

monitor  will print the received events for:

UDEV -  the event which udev sends out after rule processing

KERNEL  - the kernel uevent

以下内容是usb存储插入的过程,有省略。

KERNEL[1371278379.089991]  add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1 (usb)

KERNEL[1371278379.090641]  add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6 (scsi)

KERNEL[1371278379.090654]  add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/scsi_host/host6  (scsi_host)

KERNEL[1371278384.093203]  add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0  (scsi)

KERNEL[1371278384.093215]  add      /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0  (scsi_disk)

UDEV  [1371278384.095808] add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0  (scsi_disk)

KERNEL[1371278384.097207]  add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg1  (scsi_generic)

UDEV  [1371278384.103092] add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0  (bsg)

KERNEL[1371278384.105542]  change    /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0  (scsi)

UDEV  [1371278384.111680] add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0  (scsi_device)

UDEV  [1371278384.271680] add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb  (block)

UDEV  [1371278385.102256] add       /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/sdb1  (block)

lsysfs文件系统相关:/sys/目录

比如通过udevadm info -a -p /block/sda输出的ATTR{size}=="312581808",也可以通过sysfs查看:cat/sys/block/sda/size,ATTRS{vendor}可以通过/sys/block/sda/device/vendor查看到。

l其它指令

通常位于/lib/udev目录下,如scsi_id,usb_id,path_id等。

[root@instructor  ~]# /lib/udev/path_id /class/net/eth0

ID_PATH=pci-0000:01:00.0

[root@instructor  ~]# /lib/udev/usb_id /block/sdb

SanDisk_Cruzer_Fit_4C532000021223101393-0:0


四、/etc/udev/rules.d/*.rules文件语法

1. 所有非空行(除#开头)都是一条rule。

2. 每条rule包含多个键值对,可以分成两个部分构成:match-key(条件匹配键值对)、assignment-key(赋值键值对)。任意一条rule可以有多条match-key和多条assignment-key。匹配键是匹配一个设备属性的所有条件,当一个设备的属性匹配了该规则里所有的匹配键,就认为这条规则生效,然后按照赋值键的内容,执行该规则的赋值。udev读取文件是按照文件名的ASCII字母顺序来读取的

3.

通配符

操作符

匹配键


* 任意零个及多个字符


?任意一个字符


[] 中括号内指定的字符中的任意一个


[!a] 匹配除了a之外的所有单个字符


[a-z] 匹配a到z中的任意一个字符


== 等于


!= 不等于

ACTION

表示udev的事件动作(包括add添加设备及remove移除设备)

KERNEL

内核设备名称。如sdc,cdrom等。

DEVPATH

设备的devpath路径,相对于/sys目录,如sdb在/block/sdb。

SUBSYSTEM

设备的子系统名称。例如sdc的子系统为block,eth0的子系统为net。

BUS

设备在devpath的总线名称。例如usb

DRIVER

设备在devpath的驱动名称。如usb-storage、ata。

ID

设备在devpath的识别号。

SYSFS{filename}

在devpath下的设备文件“filename”的sysfs属性值。每条rule最多指定5个SYSFS键,所有的属性必须匹配同一个设备。

ENV{key}

环境变量,每条rule最多指定5个ENV键。ENV键也可以用作输出环境变量。

PROGRAM

调用外部程序,并且会返回true给udev(前提是该程序exit为0)。程序的输出到STDOUT,并且可以给后面的RESULT做匹配来用。

RESULT

匹配最后面一个PROGRAM的返回字符串。例如:

PROGRAM==”/lib/udev/scsi_id �gus %p”,\

RESULT==” SATA_WDC_WD1600AAJS\

-_WD-WCAS28550741”

调用/lib/udev/usb_id程序查询设备的ID,如果返回结果为RESULT指定的值,则该设备匹配该匹配键。

由于udev是一个用户空间程序,所以匹配键值可以通过udev的命令来查询到,例如:

RHEL5.5(udev版本是095):

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

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

# scsi_id�gus /block/sdb

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

RHEL6中udev的版本是147,类似udevinfo、udevmonitor、udevcontrol、udevtest、udevtrigger、udevsettle指令替换成了udevadm命令,含有info、 monitor、control、test、trigger、settle等选项了,例如udevadm info �a �p /class/net/eth0。

4. assignment-key赋值键的操作符包括:

操作符

匹配键

= 为一个键赋值


+= 为一个键添加一个值


:= 为一个键赋值并拒绝之后对该键的改动。

NAME

给设备在/dev下的赋值名称或者网卡的重命名,只有第一次的NAME赋值行为是有效的,后面匹配的规则再对该设备进行NAME赋值会被忽略。

SYNLINK

为设备在/dev/下产生的符号链接。由于上面的NAME赋值只能一次,所以为了多次命名,建议使用SYMLINK做符号链接。

OWNER, GROUP, MODE

为设备设定权限。

ENV{key}

输出一个环境变量,可以同匹配键ENV的key名,也可以自定义key名。

RUN

为设备添加运行一个程序,建议不要运行过多命令。

LABEL

在配置文件里为内部控制而采用的名字标签(为下面的GOTO服务)。

GOTO

跳到匹配的LABEL。

IMPORT{type}

导入一个文件或程序去执行,其结果会返回到当前环境。

type包括file和program,program可以执行一个外部程序并读取其输出,file可以输入一个文本文件的内容。

如果没有给定type,则udev会判断文件的执行位(x)。

5. udev的值和可调用的替换操作符(Rule Substitutions)

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

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

$devpath,%p:设备的devpath路径。例如/block/sdb/sdb1,而不是/sys/block/sdb/sdb1。

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

$sysfs{file},%s{file}:设备的sysfs里file的内容。其实就是设备的属性值。

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

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

$minor,%m:设备的minor号。

$result,%c:PROGRAM 返回的结果。如果返回结果是包含空格的多part值的话,可以用%c{N}或%c{N+}来指定第几个part。

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

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

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

%%:符号%本身。

$$:符号$本身。

另外,udev还支持%5s{file}这种写法,表示只取sysfs属性的前5个字符。

举例:KERNEL=="sdb*", SYMLINK+="scsi%n",表示kernel识别出的sdb设备(如sdb3)将会使得udev创建一个符号链接指向该设备的同分区号,如scsi3指向sdb3。

6. udev规则举例

KERNEL==”hdc”,SYMLINK+=”cdrom cdrom0”

表示创建两个符号链接/dev/cdrom和/dev/cdrom0指向同一个设备即/dev/hdc。

SUBSYSTEM==”block”, ATTR{size}==”234441873”,SYMLINK+=”mydisk”

表示识别sysfs属性,子系统是block,同时该设备的size为234441873,将为该设备创建符号链接mydisk。ATTR{size}可以通过cat /sys/block/<device>/size查看,SUBSYSTEM可以通过udevinfo -a-p %p(RHEL6的udev 147版本是udevadm info �a �p %p)查看。

KERNEL==”sd[b-z]”,RUN+=”/usr/local/bin/myprogram %k”

表示识别出sdb、sdc…sdz设备的时候,运行外部程序/usr/local/bin/myprogram,并将%k这个udev的操作符作为一个环境变量传给该程序作为一个选项。要注意的是udev不会在任何活动的terminal下运行这些外部程序,并且不会在shell上下文环境去执行(也就是说既有shell环境的变量如PATH、HOME等不会传递给该程序文件),所以你的程序必须是具有可执行权限(chmod +x),如果是一个shell脚本,那么必须具有shebang标示(如#!/bin/sh),并且不要指望标准输出会到你的terminal上去。(此段文字翻译自/usr/shaer/doc/udev-<version>/writing_udev_rules/index.html,这个文档非常好,值得一读。)


五、udev实验

场景一:

你的笔记本电脑经常使用usb移动存储设备,如U盘、移动硬盘等,你希望插入后能够自动挂载到/mnt/udisk目录下,如果该设备分区有文件系统LABEL的话则挂接到/mnt/udisk/<LABEL>目录下,没有的话则挂接到/mnt/udisk/%k(%k代表kernel识别出来的设备,如sdb1)。

考虑问题如下:

1)usb移动存储设备的驱动都是usb,内核识别出来的应该是sd*,子系统也应该是usb,当然这些最好通过udev相关指令先识别出来;

2)通常都是vfat或者fat文件系统,也有ntfs;

3)当usb移动存储设备被拔掉的时候,需要umount该设备。

实施如下:

udev rules文件内容说明

[root@fileserver  ~]# cat /etc/udev/rules.d/99-usbadd-mount.rules

#  import FS information from blkid

#通过IMPORT导入blkid对设备在文件系统的LABEL的识别。

KERNEL=="sd*",  DRIVERS=="usb", SUBSYSTEMS=="usb",\

IMPORT{program}="/sbin/blkid -o udev -p  $tempnode"

# mount  vfat/fat 挂载vfat和fat

#当有设备插入时,如果ENV{ID_FS_LABEL}的值非空(即有LABEL,如FUN),则定义一个ENV{mnt_dir}用来创建目录使用,在RUN段被%E{mnt_dir}来引用,则创建挂载点为/mnt/udisk/FUN。

ACTION=="add",  ENV{ID_FS_LABEL}!="",\

ENV{mnt_dir}="%E{ID_FS_LABEL}",  ENV{ID_FS_TYPE}=="vfat|fat",\

RUN+="/bin/mkdir -p  /mnt/udisk/%E{mnt_dir}", RUN+="/bin/mount\

LABEL=%E{ID_FS_LABEL}  /mnt/udisk/%E{mnt_dir}"

#如果设备分区没有LABEL,则用%k来代替,如sdb1,此时会创建目录/mnt/udisk/sdb1

ACTION=="add",  ENV{ID_FS_LABEL}=="", ENV{mnt_dir}="%k",\

ENV{ID_FS_TYPE}=="vfat|fat",  RUN+="/bin/mkdir �p\

/mnt/udisk/%E{mnt_dir}", RUN+="/bin/mount\

/dev/%k  /mnt/udisk/%E{mnt_dir}"

# mount  ntfs 挂载ntfs

#同vfat,有LABEL的情况

ACTION=="add",  ENV{ID_FS_LABEL}!="",\

ENV{mnt_dir}="%E{ID_FS_LABEL}",  ENV{ID_FS_TYPE}=="ntfs",\

RUN+="/bin/mkdir -p  /mnt/udisk/%E{mnt_dir}", RUN+="/bin/mount\

-t ntfs  LABEL=%E{ID_FS_LABEL} /mnt/udisk/%E{mnt_dir}"

#同vfat,无LABEL的情况

ACTION=="add",  ENV{ID_FS_LABEL}=="", ENV{mnt_dir}="%k",\

ENV{ID_FS_TYPE}=="ntfs",  RUN+="/bin/mkdir �p\
  /mnt/udisk/%E{mnt_dir}",  RUN+="/bin/mount -t ntfs \

/dev/%k  /mnt/udisk/%E{mnt_dir}"

#  remove usbkey and umount it移除设备时umount

KERNEL=="sd*",  ACTION=="remove", DRIVERS=="usb",  SUBSYSTEMS=="usb", RUN+="/bin/umount /dev/%k"

设备插入之前

[root@fileserver  ~]# ls /mnt

d  iso   usb  vfat

[root@fileserver  ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/mapper/vg0-root  13299696    4535960   8094552  36% /

tmpfs                   509924         0     509924   0% /dev/shm

/dev/sda1                99150     25799      68231  28% /boot

/dev/mapper/vg0-home   2015824      38920   1874504   3% /home

/dev/mapper/vg0-tmp     806288     37904     727424   5% /tmp

/dev/mapper/vg0-usr   15118728    2763788  11586940  20% /usr

/dev/mapper/vg0-var    7178360    5098424   1717912  75% /var

/dev/mapper/vg0-backup

                     10321208   4459580    5337340  46% /backup

有LABEL为KINGSTON的u盘设备插入之后

[root@fileserver  ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/mapper/vg0-root  13299696    4535968   8094544  36% /

tmpfs                   509924         0     509924   0% /dev/shm

/dev/sda1                99150     25799      68231  28% /boot

/dev/mapper/vg0-home   2015824      38920   1874504   3% /home

/dev/mapper/vg0-tmp     806288     37904     727424   5% /tmp

/dev/mapper/vg0-usr   15118728    2763788  11586940  20% /usr

/dev/mapper/vg0-var    7178360    5098436   1717900  75% /var

/dev/mapper/vg0-backup

                     10321208   4459580    5337340  46% /backup

/dev/sdb1               3789520   1759968   2029552   47% /mnt/udisk/KINGSTON

[root@fileserver ~]# ls /mnt/udisk/KINGSTON/

??1.doc                   drivethelife2012_net_setup.exe

……

有LABEL为KINGSTON的u盘设备拔除之后

[root@fileserver  ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/mapper/vg0-root  13299696    4535968   8094544  36% /

tmpfs                   509924         0     509924   0% /dev/shm

/dev/sda1                99150     25799      68231  28% /boot

/dev/mapper/vg0-home   2015824      38920   1874504   3% /home

/dev/mapper/vg0-tmp     806288     37904     727424   5% /tmp

/dev/mapper/vg0-usr   15118728    2763788  11586940  20% /usr

/dev/mapper/vg0-var    7178360    5098440   1717896  75% /var

/dev/mapper/vg0-backup

                     10321208   4459580    5337340  46% /backup

[root@fileserver  ~]# ls /mnt/udisk/KINGSTON/

[root@fileserver  ~]#

无LABEL的u盘设备插入之后

[root@fileserver  ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/mapper/vg0-root  13299696    4535972   8094540  36% /

tmpfs                   509924         0     509924   0% /dev/shm

/dev/sda1                99150     25799      68231  28% /boot

/dev/mapper/vg0-home   2015824      38920   1874504   3% /home

/dev/mapper/vg0-tmp     806288     37904     727424   5% /tmp

/dev/mapper/vg0-usr   15118728    2763788  11586940  20% /usr

/dev/mapper/vg0-var    7178360    5098444   1717892  75% /var

/dev/mapper/vg0-backup

                     10321208   4459580    5337340  46% /backup

/dev/sdb1              15625744   8548800   7076944   55% /mnt/udisk/sdb1

[root@fileserver  ~]# ls /mnt/udisk/sdb1/

20120815??                      rhel-compare.pdf

BOOTEX.LOG                      RunClubSanDisk.exe

CentOS-6.3-i386-bin-DVD1.iso    RunSanDiskSecureAccess_Win.exe

club_application                SanDiskSecureAccess

Daemon_tools_lite_4.41.3cn.rar  winxp-ghost-deepin-201209.iso

Js_GhostWin7Sp1_x86_v11.5.iso   x.txt

rhca-certs                      

有LABEL的移动硬盘(ntfs分区)设备插入之后

[root@fileserver  ~]# udevadm test /block/sdb

#输出内容有省略,只复制了rule文件中的IMPORT部分的对应内容。

……

udev_rules_apply_to_event:  RUN 'socket:@/org/freedesktop/hal/udev_event'  /etc/udev/rules.d/90-hal.rules:2

udev_rules_apply_to_event: IMPORT '/sbin/blkid -o udev -p  /dev/sdb' /etc/udev/rules.d/99-usbadd-mount.rules:2

util_run_program: '/sbin/blkid -o udev -p /dev/sdb' started

util_run_program: '/sbin/blkid' (stdout) 'ID_PART_TABLE_TYPE=dos'

util_run_program: '/sbin/blkid -o udev -p /dev/sdb' returned with  exitcode 0

udev_event_execute_rules:  no node name set, will use kernel supplied name 'sdb'

udev_device_update_db:  created db file for '/devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host7/target7:0:0/7:0:0:0/block/sdb'  in '/dev/.udev/db/block:sdb'

……

[root@fileserver  ~]# mount

……

/dev/sdb2  on /mnt/udisk/Software type fuseblk (rw,allow_other,blksize=512)

/dev/sdb3  on /mnt/udisk/Documents type fuseblk (rw,allow_other,blksize=4096)

/dev/sdb1  on /mnt/udisk/Working type fuseblk (rw,allow_other,blksize=4096)

[root@fileserver  ~]#blkid /dev/sdb*

/dev/sdb1:  LABEL="Working" UUID="F4F04EFEF04EC698" TYPE="ntfs"

/dev/sdb2:  LABEL="Software" UUID="E44C886B4C8839F6"  TYPE="ntfs"

/dev/sdb3:  LABEL="Documents" UUID="72181C3E181C03AF"  TYPE="ntfs"

[root@fileserver  ~]# ls /mnt/udisk/Documents/

Certificatiion  $RECYCLE.BIN  System Volume Information  Win2003模拟安装.rar

Documents       RECYCLER      Tools

iso             RHCA          Training

ppsds.pgf       rhca视频      VM

[root@fileserver  ~]# blkid -o udev -p /dev/sdb*

ID_PART_TABLE_TYPE=dos


ID_FS_LABEL=Working

ID_FS_LABEL_ENC=Working

ID_FS_UUID=F4F04EFEF04EC698

ID_FS_UUID_ENC=F4F04EFEF04EC698

ID_FS_TYPE=ntfs

ID_FS_USAGE=filesystem


ID_FS_LABEL=Software

ID_FS_LABEL_ENC=Software

ID_FS_UUID=E44C886B4C8839F6

ID_FS_UUID_ENC=E44C886B4C8839F6

ID_FS_TYPE=ntfs

ID_FS_USAGE=filesystem


ID_FS_LABEL=Documents

ID_FS_LABEL_ENC=Documents

ID_FS_UUID=72181C3E181C03AF

ID_FS_UUID_ENC=72181C3E181C03AF

ID_FS_TYPE=ntfs

ID_FS_USAGE=filesystem


场景二:

你的服务器需要严格安全保护的,即使usb存储设备也不允许插入,如果有插入行为则自动重启机器并发送邮件给root账户。

设计步骤

1)udev发现设备后执行一个外部脚本,并将设备信息传递给脚本;

2)脚本尽量简短,记录信息并发送邮件后reboot

实施如下:

udev rules文件内容说明

[root@fileserver  ~]# cat /etc/udev/rules.d/99-usbadd-reboot.rules

KERNEL=="sd*",  ACTION=="add", DRIVERS=="usb",  SUBSYSTEMS=="usb", RUN+="/root/bin/usbadd-reboot.sh  %E{ID_SERIAL} %E{DEVNAME}"

# 上面内容表示:当udev守护进程发现usb存储设备插入系统时,即运行外部脚本/root/bin/usbadd-reboot.sh,  并将%E{ID_SERIAL}和%E{DEVNAME}传入该脚本。%E{ID_SERIAL}可以通过/lib/udev/usb_id  -x %p查看到,%E{DEVNAME}可以通过udevadm  test /block/sdb查看到。

#脚本内容如下

[root@fileserver  ~]# cat /root/bin/usbadd-reboot.sh

#!/bin/sh

PATH=/bin:/usr/bin:/root/bin:/usr/sbin:/sbin

#下面的变量vendor_serial和DEVNAME是通过读取rule文件传入的udev的变量%E{ID_SERIAL}和%E{DEVNAME}获取的。

vendor_serial=$1  # The usb storage disk vendor infomation from udev.

DEVNAME=$2  # The name in kernel, such as sdb, sdc...

DATE=$(/bin/date  +%Y%m%d-%H:%M:%S)

msg() {

 /bin/echo "WARNING: The usb storage  disk plug into system is detected by udev, see the following lines for  detail:"

 /bin/echo --------------------------------

 /bin/echo "Device: $DEVNAME in  kernel"

 /bin/echo "Vendor:  $vendor_serial"

 /bin/echo "Time: $DATE"

 /bin/echo '!!!REBOOT SYSTEM NOW!!!'

 /bin/echo --------------------------------

}

msg  >/tmp/usbadd.msg

/bin/mail  -s 'WARNING: USB DISK ADDED' root@localhost \

</tmp/usbadd.msg

/bin/sleep  5 # wait for send mail.

/sbin/reboot

U盘插入时

[root@fileserver  ~]# date

Fri Jun  14 14:02:48 CST 2013

[root@fileserver  ~]#

Broadcast  message from root@fileserver.example.com

       (unknown) at 14:03 ...


The  system is going down for reboot NOW!

系统重启后,验证:

[root@fileserver  ~]# last |head -n3

root     pts/0        192.168.1.58     Fri Jun 14 14:04   still logged in

reboot   system boot  2.6.32-71.el6.x8  Fri Jun 14 14:03 - 14:08  (00:04)

root     pts/0        192.168.1.58     Fri Jun 14 13:59 - down   (00:03)

[root@fileserver  ~]#

[root@fileserver  ~]# cat /var/spool/mail/root

From  root@fileserver.example.com  Fri Jun 14  14:07:28 2013

Return-Path:  <root@fileserver.example.com>

X-Original-To:  root@localhost

Delivered-To:  root@localhost.example.com

Received:  by fileserver.example.com (Postfix, from userid 0)

       id 4B66F2841; Fri, 14 Jun 2013 13:58:20 +0800 (CST)

Date:  Fri, 14 Jun 2013 13:58:20 +0800

To:  root@localhost.example.com

Subject:  WARNING: USB DISK ADDED

User-Agent:  Heirloom mailx 12.4 7/29/08

MIME-Version:  1.0

Content-Type:  text/plain; charset=us-ascii

Content-Transfer-Encoding:  7bit

Message-Id:  <20130614055821.4B66F2841@fileserver.example.com>

From: root@fileserver.example.com  (root)

Status:  O


WARNING:  The usb storage disk plug into system is detected by udev, the following  lines are the details:

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

Device:  /dev/sdb in kernel

Vendor:  Kingston_DT_101_G2_0019E06B4A07BBB05734001F-0:0

Time:  20130614-13:58:20

!!!REBOOT  SYSTEM NOW!!!

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值