1. 程式人生 > >編寫udev規則

編寫udev規則

fat32 fse ger time listen chain 系統版本 symlink support

編寫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盤後
[[email protected] 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端口了

編寫udev規則