编写udev规则

编写udev规则

编写udev规则,实现以下目标:
当插入一个U盘时,该U盘自动出现一个链接称为udisk
U盘上的第1个分区名称为udisk1,以此类推
终端上出现提示信息”udisk plugged in”

问题:加载一个USB设备后,系统可能识别为sda也可能识别为sdb,能不能固定呢?
对于Linux kernel 2.6及更新的操作系统版本会将设备的相关信息动态写入/sys文件系统中,而udev程序可以通过读取这些设备系信息,并根据自己的udev规则进行设备管理器,实现如下功能:
处理设备命名
决定要创建哪些设备文件或链接
决定如何设置属性
决定触发哪些事件
udev默认规则存放在/etc/udev/rules.d目录下,通过修改此目录下的规则实现设备的命名、属性、链接文件等。

步骤一:编写udev规则

1)准备USB设备(如果使用真实机演示,下面为虚拟机添加USB设备可以忽略)
使用virt-manager为虚拟机添加USB设备,如图-5所示。注意添加设备时一定要选择正确的USB设备,图-9仅是参考案例,每个人的USB品牌与型号都有可能不一样!

udev的作用:
从内核收到添加/移除硬件事件时,udev将会分析:
/sys目录下信息
/etc/udev/rules.d目录中的规则

基于分析结果,udev会:
处理设备命名
决定要创建哪些设备文件或链接
决定如何设置属性
决定触发哪些事件
--------------------------------------------------------------------
真实机上操作:

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 200G 0 part /var/lib/libvirt/images
└─sda2 8:2 0 120G 0 part /
sdb 8:16 1 114.6G 0 disk
└─sdb1 8:17 1 114.6G 0 part /run/media/root/LIANG2 #这个是我的U盘/dev/sdb/sdb1
loop0 7:0 0 3.8G 0 loop /var/ftp/rhel7

先查看我U盘的所有具体信息
# udevadm info --query=all --attribute-walk --path=/block/sdb/sdb1

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 '/block/sdb/sdb1':
KERNEL=="sdb1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{ro}=="0"
ATTR{size}=="240254944"
ATTR{stat}==" 1552 25986 33812 2273 0 0 0 0 0 1374 2273"
ATTR{partition}=="1"
ATTR{start}=="32"
ATTR{discard_alignment}=="0"
ATTR{alignment_offset}=="0"
ATTR{inflight}==" 0 0"

looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.0/host10/target10:0:0/10:0:0:0/block/sdb':
KERNELS=="sdb"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{ro}=="0"
ATTRS{size}=="240254976"
ATTRS{stat}==" 1629 25986 38108 2521 0 0 0 0 0 1494 2521"
ATTRS{range}=="16"
ATTRS{discard_alignment}=="0"
ATTRS{events}=="media_change"
ATTRS{ext_range}=="256"
ATTRS{events_poll_msecs}=="-1"
ATTRS{alignment_offset}=="0"
ATTRS{inflight}==" 0 0"
ATTRS{removable}=="1"
ATTRS{capability}=="51"
ATTRS{events_async}==""

looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.0/host10/target10:0:0/10:0:0:0':
KERNELS=="10:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{rev}=="1.00"
ATTRS{type}=="0"
ATTRS{scsi_level}=="7"
ATTRS{model}=="Ultra USB 3.0 "
ATTRS{state}=="running"
ATTRS{unpriv_sgio}=="0"
ATTRS{queue_type}=="none"
ATTRS{iodone_cnt}=="0x724"
ATTRS{iorequest_cnt}=="0x724"
ATTRS{device_busy}=="0"
ATTRS{evt_capacity_change_reported}=="0"
ATTRS{timeout}=="30"
ATTRS{evt_media_change}=="0"
ATTRS{max_sectors}=="240"
ATTRS{ioerr_cnt}=="0x1"
ATTRS{queue_depth}=="1"
ATTRS{vendor}=="SanDisk "
ATTRS{evt_soft_threshold_reached}=="0"
ATTRS{device_blocked}=="0"
ATTRS{evt_mode_parameter_change_reported}=="0"
ATTRS{evt_lun_change_reported}=="0"
ATTRS{evt_inquiry_change_reported}=="0"
ATTRS{dh_state}=="detached"
ATTRS{iocounterbits}=="32"
ATTRS{eh_timeout}=="10"

looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.0/host10/target10:0:0':
KERNELS=="target10:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.0/host10':
KERNELS=="host10"
SUBSYSTEMS=="scsi"
DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.0':
KERNELS=="1-10:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{bNumEndpoints}=="02"
ATTRS{supports_autosuspend}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"

looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-10':
KERNELS=="1-10"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="10"
ATTRS{idVendor}=="0781"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{devnum}=="8"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="224mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0100"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="4C530001300701101285"
ATTRS{version}==" 2.10"
ATTRS{urbnum}=="5360"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="SanDisk"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="5591"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="Ultra USB 3.0"

looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{devpath}=="0"
ATTRS{idVendor}=="1d6b"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{authorized_default}=="1"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="10"
ATTRS{bcdDevice}=="0310"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="0000:00:14.0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="267"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 3.10.0-327.el7.x86_64 xhci-hcd"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="0002"
ATTRS{bDeviceClass}=="09"
ATTRS{product}=="xHCI Host Controller"

looking at parent device '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{irq}=="125"
ATTRS{subsystem_vendor}=="0x1028"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{driver_override}=="(null)"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{dma_mask_bits}=="64"
ATTRS{local_cpus}=="f"
ATTRS{device}=="0xa12f"
ATTRS{enable}=="1"
ATTRS{msi_bus}==""
ATTRS{local_cpulist}=="0-3"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x07c6"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="1"

looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""

 

 


先查看我U盘的具体信息
# udevadm info --query=property --path=/block/sdb/sdb1

页面显示
# udevadm info --query=property --path=/block/sdb/sdb1
DEVLINKS=/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C530001300701101285-0:0-part1 /dev/disk/by-label/LIANG2 /dev/disk/by-path/pci-0000:00:14.0-usb-0:9:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/7240-83ED
DEVNAME=/dev/sdb1
DEVPATH=/block/sdb/sdb1
DEVTYPE=partition
ID_BUS=usb
ID_FS_LABEL=LIANG2
ID_FS_LABEL_ENC=LIANG2
ID_FS_TYPE=vfat
ID_FS_USAGE=filesystem
ID_FS_UUID=7240-83ED
ID_FS_UUID_ENC=7240-83ED
ID_FS_VERSION=FAT32
ID_INSTANCE=0:0
ID_MODEL=Ultra_USB_3.0
ID_MODEL_ENC=Ultra\x20USB\x203.0\x20\x20\x20
ID_MODEL_ID=5591
ID_PART_ENTRY_DISK=8:16
ID_PART_ENTRY_NUMBER=1
ID_PART_ENTRY_OFFSET=32
ID_PART_ENTRY_SCHEME=dos
ID_PART_ENTRY_SIZE=240254944
ID_PART_ENTRY_TYPE=0xc
ID_PART_TABLE_TYPE=dos
ID_PATH=pci-0000:00:14.0-usb-0:9:1.0-scsi-0:0:0:0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_9_1_0-scsi-0_0_0_0
ID_REVISION=1.00
ID_SERIAL=SanDisk_Ultra_USB_3.0_4C530001300701101285-0:0
ID_SERIAL_SHORT=4C530001300701101285
ID_TYPE=disk
ID_USB_DRIVER=usb-storage
ID_USB_INTERFACES=:080650:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=SanDisk
ID_VENDOR_ENC=SanDisk\x20
ID_VENDOR_ID=0781
MAJOR=8
MINOR=17
SUBSYSTEM=block
TAGS=:systemd:
USEC_INITIALIZED=625949151

vim /etc/udev/rules.d/70-usb.rules
ENV{DEVTYPE}=="partition",ENV{ID_VENDOR}="SanDisk",ACTION=="add",SYMLINK+="usb%n"
#随即挑选几个条件,写入文件里面。

没有插入U盘时
# ls /dev/usb1
ls: 无法访问/dev/usb1: 没有那个文件或目录

插入U盘后
# ls /dev/usb1
/dev/usb1
# ls -l /dev/usb1
lrwxrwxrwx 1 root root 4 11月 9 17:06 /dev/usb1 -> sdb1

 


# vim /etc/udev/rules.d/70-usb.rules
SUBSYSTEMS=="usb",ATTRS{manufacturer}=="SanDisk",ACTION=="add",RUN+="/usr/bin/systemctl start httpd"

SUBSYSTEMS=="usb",ATTRS{manufacturer}=="SanDisk",ACTION=="remove",RUN+="/usr/bin/systemctl stop httpd"

当插入U盘时,httpd启动服务。(前提是当前80端口没有被nginx使用)
当拔出U盘时,httpd停止服务。

然后验证。
当插入U盘时,httpd启动服务。
# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since 五 2018-11-09 17:37:33 CST; 1s ago
#可以看到它是活跃的状态,Active: active (running)。

# ss -tunlp | grep 80
tcp LISTEN 0 128 :::80 :::* users:(("httpd",pid=17590,fd=4),("httpd",pid=17589,fd=4),("httpd",pid=17588,fd=4),("httpd",pid=17587,fd=4),("httpd",pid=17586,fd=4),("httpd",pid=17577,fd=4))
可以搜得到80端口正在被httpd使用。

当拔出U盘后
[root@room9pc01 rules.d]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: inactive (dead) since 五 2018-11-09 17:37:17 CST; 2s ago
#可以看到它是停止的状态,Active: inactive (dead)。

# ss -tunlp | grep 80
也搜不到80端口了

 

posted @ 2019-04-29 00:39  安于夏  阅读(437)  评论(0编辑  收藏  举报