天天看點

RH436-2 udev

 udev

一、概述

1.   為什麼要使用udev

l  1. 系統通過卷标的功能來實作識别這個裝置。而在叢集的環境裡面,不可能再使用卷标來識别裝置的唯一性。應用程式不可能直接挂載卷标,而/etc/fstab可以通過卷标來挂載裝置。(有些應用程式也沒有辦法識别卷标)。

l  2. 為什麼要使用udev機制,因為當我們在做前方叢集,不同機器挂載後方的存儲,有可能不同的機器所識别出的名字不同,則造成裝置的不唯一性。

l  3. 當系統讀到rc.sysinit這個腳本的時候開始激活udev機制。

2.   udev監控:#<b>udevmonitor</b>

l  [root@localhost ~]#ls /dev/sdb    #未插入U盤時

ls: /dev/sdb: 沒有那個檔案或目錄

l  [root@localhost ~]#udevmonitor   #插入U盤,通過udevmonitor監控

udevmonitor prints the received event from the kernel [UEVENT]

and the event which udev sends out after rule processing [UDEV]

UEVENT[1316403060.858053] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1

UEVENT[1316403060.858856] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/usbdev1.4_ep00

UEVENT[1316403060.859400] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0

UEVENT[1316403060.860661] add@/class/scsi_host/host3

UEVENT[1316403060.862507] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/usbdev1.4_ep81

UEVENT[1316403060.862816] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/usbdev1.4_ep02

UEVENT[1316403060.863135] add@/class/usb_device/usbdev1.4

UDEV  [1316403060.864574] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1

UDEV  [1316403060.901102] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/usbdev1.4_ep00

UDEV  [1316403060.929950] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0

UDEV  [1316403060.949849] add@/class/scsi_host/host3

UDEV  [1316403060.965811] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/usbdev1.4_ep81

UDEV  [1316403060.976979] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/usbdev1.4_ep02

UDEV  [1316403060.991296] add@/class/usb_device/usbdev1.4

UEVENT[1316403067.887071] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0

UEVENT[1316403067.887106] add@/class/scsi_disk/3:0:0:0

UEVENT[1316403067.906185] add@/block/sdb

UEVENT[1316403067.906219] add@/block/sdb/sdb4

UEVENT[1316403067.906230] add@/class/scsi_device/3:0:0:0

UEVENT[1316403067.906239] add@/class/scsi_generic/sg1

UDEV  [1316403067.913648] add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0

UDEV  [1316403067.933016] add@/class/scsi_disk/3:0:0:0

UDEV  [1316403067.949991] add@/block/sdb

UDEV  [1316403067.992497] add@/class/scsi_device/3:0:0:0

UDEV  [1316403067.998881] add@/class/scsi_generic/sg1

UDEV  [1316403068.040513] add@/block/sdb/sdb4

l  [root@localhost ~]#ll /dev/sdb

brw-r----- 1 root disk 8, 16 09-19 11:31 /dev/sdb  

#找到U盤,當再次拔出:則裝置/dev/sdb也會消失。這就是udev機制。

3.   /sys/和/proc/目錄差別:

l  1. /sys/ :這個目錄就是用來顯示裝置的狀态的目錄(檔案類型),/sys/是根據不同裝置架構進行分類的,并且可以做一些調優

l  2. /proc/ :也能顯示裝置的狀态,/proc/一般隻是進行檢視。

4.   udev功能

l  1. 動态管理:當裝置添加/删除時,udev 的守護程序偵聽來自核心的 uevent,以此添加或者删除/dev下的裝置檔案,是以udev隻為已經連接配接的裝置産生裝置檔案,而不會在/dev下産生大量虛無的裝置檔案。

l  2. 提供裝置持續名稱不變的能力

l  3. 使用相關使用者程式來查詢裝置的名稱

l  4. 編輯裝置名稱政策到核心中

l  5. 即可遵循LSB裝置名稱标準也可自定義裝置名稱(LSB:linux裝置名稱标準化)

l  6. udev消耗系統資源小

l  7. udev不關心裝置主/輔裝置号

5.   udev工作過程

當一個裝置添加/移除的時候,這時候udev就會做一下事情:

l  1. 讀取/etc/udev/rules.d中政策檔案

l  2. 執行政策中的指令

l  3. 将資訊輸出到/sys/中

二、Udev配置

1.   udev的全局配置檔案(<b>/etc/udev/udev.conf</b>)

[root@station55 ~]# vim /etc/udev/udev.conf          

# 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: "udevcontrol log_priority=&lt;value&gt;".

udev_log="err"                           

#日志的級别

udev_root = "/dev"                       

#将裝置檔案存放位置,一般都是放在/dev下的

udev_rules  = "/etc/udev/rules.d/"       

#udev政策存放位置,預設/etc/udev/rules.d/

2.   udev政策檔案

l  1 .政策檔案格式:<b>/etc/udev/rules.d/&lt;rule_name&gt;.rules</b>

 eg:99-myusb.rules  

#必須".rules結尾";序号不能超過100,最好寫99,序号越大,udev讀取時間越晚,這樣序号大的會覆寫序号小的政策。

l  2. 政策格式:<b>&lt;match-key&gt;&lt;op&gt;value [, ...] &lt;assignment-key&gt;&lt;op&gt;value [, ...]</b>

<b></b>

 eg:BUS=="usb", SYSFS{serial}=="20043512321411d34721", NAME="usb_backup"

      #== 代表:如果是  

3.   查詢udev比對key value

l  1. <b>cat /proc/bus/{usb,pci,...}/devices</b>

l  2. <b>#udevinfo -a -p $(udevinfo -q path -n /dev/sda)</b>

   #-a:産看所有屬性,(/sys/下)

   #-p:路徑

eg:

[root@station5 ~]# udevinfo -a -p $(udevinfo -q path -n /dev/sdb)

Udevinfo 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':

    KERNEL=="sdb"

    SUBSYSTEM=="block"

    SYSFS{stat}=="      29      228      607       58        0        0        0        0        0       58       58"

    SYSFS{size}=="15701759"

    SYSFS{removable}=="1"

    SYSFS{range}=="16"

    SYSFS{dev}=="8:16"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host1/target1:0:0/1:0:0:0':

    ID=="1:0:0:0"

    BUS=="scsi"

    DRIVER=="sd"

    SYSFS{ioerr_cnt}=="0x0"

    SYSFS{iodone_cnt}=="0xd7"

    SYSFS{iorequest_cnt}=="0xd7"

    SYSFS{iocounterbits}=="32"

    SYSFS{timeout}=="180"

    SYSFS{state}=="running"

    SYSFS{rev}=="8.01"

    SYSFS{model}=="Cruzer          "

    SYSFS{vendor}=="SanDisk "

    SYSFS{scsi_level}=="3"

    SYSFS{type}=="0"

    SYSFS{queue_type}=="none"

    SYSFS{queue_depth}=="1"

    SYSFS{device_blocked}=="0"

    SYSFS{max_sectors}=="240"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host1/target1:0:0':

    ID=="target1:0:0"

    BUS==""

    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host1':

    ID=="host1"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0':

    ID=="1-1:1.0"

    BUS=="usb"

    DRIVER=="usb-storage"

    SYSFS{modalias}=="usb:v0781p5151d0200dc00dsc00dp00ic08isc06ip50"

    SYSFS{bInterfaceProtocol}=="50"

    SYSFS{bInterfaceSubClass}=="06"

    SYSFS{bInterfaceClass}=="08"

    SYSFS{bNumEndpoints}=="02"

    SYSFS{bAlternateSetting}==" 0"

    SYSFS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1':

    ID=="1-1"

    DRIVER=="usb"

    SYSFS{configuration}==""

    SYSFS{serial}=="026680028451965C"

    SYSFS{product}=="Cruzer Micro"

    SYSFS{manufacturer}=="SanDisk"

    SYSFS{maxchild}=="0"

    SYSFS{version}==" 2.00"

    SYSFS{devnum}=="2"

    SYSFS{speed}=="480"

    SYSFS{bMaxPacketSize0}=="64"

    SYSFS{bNumConfigurations}=="1"

    SYSFS{bDeviceProtocol}=="00"

    SYSFS{bDeviceSubClass}=="00"

    SYSFS{bDeviceClass}=="00"

    SYSFS{bcdDevice}=="0200"

    SYSFS{idProduct}=="5151"

    SYSFS{idVendor}=="0781"

    SYSFS{bMaxPower}=="200mA"

    SYSFS{bmAttributes}=="80"

    SYSFS{bConfigurationValue}=="1"

    SYSFS{bNumInterfaces}==" 1"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1':

    ID=="usb1"

    SYSFS{serial}=="0000:02:03.0"

    SYSFS{product}=="EHCI Host Controller"

    SYSFS{manufacturer}=="Linux 2.6.18-194.el5 ehci_hcd"

    SYSFS{maxchild}=="6"

    SYSFS{devnum}=="1"

    SYSFS{bDeviceProtocol}=="01"

    SYSFS{bDeviceClass}=="09"

    SYSFS{bcdDevice}=="0206"

    SYSFS{idProduct}=="0000"

    SYSFS{idVendor}=="0000"

    SYSFS{bMaxPower}=="  0mA"

    SYSFS{bmAttributes}=="e0"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:03.0':

    ID=="0000:02:03.0"

    BUS=="pci"

    DRIVER=="ehci_hcd"

    SYSFS{broken_parity_status}=="0"

    SYSFS{enable}=="1"

    SYSFS{modalias}=="pci:v000015ADd00000770sv000015ADsd00000770bc0Csc03i20"

    SYSFS{local_cpus}=="ffffffff"

    SYSFS{irq}=="51"

    SYSFS{class}=="0x0c0320"

    SYSFS{subsystem_device}=="0x0770"

    SYSFS{subsystem_vendor}=="0x15ad"

    SYSFS{device}=="0x0770"

    SYSFS{vendor}=="0x15ad"

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

    ID=="0000:00:11.0"

    SYSFS{modalias}=="pci:v000015ADd00000790sv00000000sd00000000bc06sc04i01"

    SYSFS{irq}=="0"

    SYSFS{class}=="0x060401"

    SYSFS{subsystem_device}=="0x0000"

    SYSFS{subsystem_vendor}=="0x0000"

    SYSFS{device}=="0x0790"

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

    ID=="pci0000:00"

DRIVER==""

[root@station5 ~]#vim /etc/udev/rules.d/99-myusb.rules

BUS=="usb",SYSFS{serial}=="026680028451965C",NAME="myusb"

#鍵值隻要是能代表這個裝置的唯一性就可以

[root@station5 ~]# ls /dev/myusb

/dev/myusb

#udev自動生成/dev/myusb裝置

l  3. <b>#</b><b>scsi_id -g -x -s /block/sdN</b>     #scsi_id scsi裝置資訊參看工具

[root@station3 ~]# scsi_id -g -x -s /block/sda

ID_VENDOR=SEAGATE

ID_MODEL=ST973402SSUN72G

ID_REVISION=0603

ID_SERIAL=35000c5000b9c626f

ID_TYPE=disk

ID_BUS=scsi

#U盤或其他硬體裝置使用udevinfo進行查詢,硬碟和存儲使用的scsi_id進行查詢。

[root@station3 ~]#vim /etc/udev/rules.d/99-myusb.rules

<b>PROGRAM==</b>"/lib/udev/scsi_id -g -x -s /block/sda",<b>RESULT==</b>"ID_MODEL=ST973402SSUN72G,ID_SERIAL=35000c5000b9c626f",<b>SYMLINK+=</b>"mydisk1"

#判斷運作程式及其結果是否比對,根據此結果給鍵指派。

三、政策中各鍵值說明

1. 比對鍵值

l  <b>==</b>  是否等于

l  <b>!=</b>  不等于

ACTION=="add"        #執行添加操作

KERNEL=="sa[a-z]1"     #系統識别辨別

BUS=="scsi"            #總線類型為scsi

DRIVER!="ide-cdrom"    #驅動不是ide-cdrom

SYSFS{serial}=="20043512321411d34721"  #系統辨別

PROGRAM=="custom_app.pl",RESULT=="some return string"  #執行某一腳本或程式并傳回值

#支援通配符*、?、[]、[a-z]、[!a]

2.給鍵配置設定鍵值

l  <b>= </b>   給鍵指派

l  <b>+=</b>   給鍵增加一個值,即給裝置檔案建立一個連結檔案

l  <b>:= </b>  無法改變的指派,後面的政策無法覆寫該值

NAME="usb_crypto"

SYMLINK+="data1"

OWNER="student"

MODE="0600"

LABEL="test_rules_end"

GOTO="test_rules_end"

RUN="myapp"

3. 執行個體

l  [root@station5 ~]# vim /etc/udev/rules.d/99-myusb.rules

BUS=="usb",SYSFS{serial}=="026680028451965C",OWNER="netsword",GROUP="netsword",MODE="0600",NAME="myusb",RUN+="/tmp/test.sh"

#建議将建立裝置改為建立軟連接配接,即将NAME="myusb"改為SYMLINK+="myusb"

l  [root@station5 ~]# vim /tmp/test.sh

#!/bin/bash

/usr/bin/wall hello

拔掉U盤,重新插入U盤

[root@station5 ~]#

Broadcast message from root (Wed Sep 21 10:37:41 2011):

hello

#出現以上資訊,說明插入U盤後立即運作腳本/tmp/test/sh了

l  [root@station5 ~]# ll /dev/myusb 

brw------- 1 netsword netsword 8, 20 09-21 10:37 /dev/myusb  

#U盤裝置名宿主、權限等均按政策生成

4.   udev rule example

egs:

l  BUS=="scsi",SYSFS{serial}=="123456789",NAME="byLocation/rack1-disk3"

 #在指定目錄下建立裝置檔案,在/dev/下再建立一個byLocation目錄

l  KERNEL=="sd*",BUS=="scsi",PROGRAM=="/lib/udev/scsi_id -g -s %p",RESULT=="SATA ST340014AS3JX*LVCA",NAME="backup%n"

 #PROGRAM中應用程式盡量使用絕對路徑,其中的%p是裝置号,和後面%n對應相同,如前面的p是1,那麼後面的n就是1

lKERNEL=="sd*",SYSFS{idVendor}=="0781",SYSFS{idProduct}=="5150",SYMLINK+="keycard",OWNER="student",GROUP="student",MODE="0600"

#為裝置建立軟連結裝置檔案,并設定其宿主、權限,

l  KERNEL=="sd?1",BUS=="scsi",SYSFS{model}=="DSCT10",SYMLINK+="camera"

l  ACTION=="add",KERNEL=="ppp0",RUN+="/usr/bin/wall ppp Interface Added"

#當系統新增加增加一個ppp0接口時,運作程式

l  KERNEL=="ttyUSB*",BUS="usb",SYSFS{product}=="Palm Handheld",SYMLINK+="pda"

本文轉自netsword 51CTO部落格,原文連結:http://blog.51cto.com/netsword/670421