操作系統:rhel6.4
udev,在系統啓動時是由rc.sysinit開啓的,在系統中用來維護一個設備節點的機制。負責創建系統中所有硬件的設備節點。同時,使用硬式編碼主要設備號和次要設備號來跟蹤系統中關於一個設備的類型、屬性、信息。當前,udev通過udevd進程以及系統中已被定義的規則來操作管理系統中的設備節點。使用規則,可以管理系統中設備節點的建立和屬性,以及設備文件的名稱創建。可以通過udev管理某些設備的所屬人、所屬組,權限,命名,軟連接等等其他選項。
udev創建一個兼容設備參考,udev無論類型和連接總線創建一個附屬的CD符號鏈接,例如/dev/cdrom。/dev/cdrom是由udev參考附屬的CD兼容驅動器創建的一個符號鏈接,CD兼容驅動器可以是CD-ROM,DVD-ROM,DVD-RW等等,驅動器可以是通過PATA,SATA,SCSI,USB連接到系統的。參考CD兼容驅動器所有這些設備的不同可以影響設備的文件名,不過還好有udev規則,無論類型、連接總線、CD兼容驅動器的類型,udev都可以參考設備爲其創建/dev/cdrom,提供一個如一的文件名。
ex:
#ls -l /dev/cdrom
lrwxrwxrwx. 1 root root 3 11 Nov 23 03:30 /dev/cdrom -> sr0
/sys是內核維護的文件系統在內存中的表現,類似/proc。當設備附屬系統時,/sys爲內核提供主要的組成信息,例如/sys/block列出所有的被系統認可的附屬塊設備:/sys/block/sda有第一個附屬的SCSI吸盤設備的信息和設置。
/sys中的一些文件信息,例如/sys/block/sda/device/model或/sys/block/sda/size具有隻讀的權限。另外一些文件,例如像/sys/block/sda/queue是可寫的,可以改變設備在內核中的工作方式,一個例子是/sys/block/sda/queue/schaduler可以控制讀寫sda磁盤設備時的I/O調度策略。
ex:
#cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
/sys文件系統和udev有什麼關係?
udev可以使用/sys中儲存的信息決定/dev中目前相關的設備文件。還有在/sys內有一個特定的文件uevent,uevent文件包含了當設備被內核認可後,udev通過的信息
ex:
#cat /sys/block/sda/uevent
MAJOR=8
MINOR=0
DEVNAME=sda
DEVTYPE=disk
監控udev
當一個設備被內核認可後,將會產生一個事件
1.內核在/sys目錄中填充結構
2.內核發送一個uevent由udev提取
3.接收到uevent後,udev給新設備創建設備節點,或者解析在/etc/udev/rules.d中的udev規則文件,決定udev追尋的行爲
ex:
#udevadm monitor
#udevadm info --attribute-walk --name=sda
#udevadm info --query=all --attribute-walk --path=/sys/block/sda
在/etc/udev/rules.d/目錄下可以添加自定義規則,udevd進程將解析這些文件(包括/lib/udev/rules.d)標準的命名格式是:<2位數字>-<名字>.rules
udev將監控這些文件,文件一旦發生變化將自動應用。
ex:
SUBSYSTEM=="block", KERNEL=="sd*", SYMLINK+="mydisks/%k"
SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sda", RESULT=="1ATA_ST1000LM024_HN-M101MBB_S2U5J9DCB65347", SYMLINK+="customdisk/customlink%n"
SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sda", RESULT=="1ATA_ST1000LM024_HN-M101MBB_S2U5J9DCB65347", RUN+="/usr/bin/wall New disk %k"
SUBSYSTEM=="block", KERNEL=="sdd*", OWNER="hulk", GROUP="disk", MODE="0640"
#udevadm info --query=all --attribute-walk --path=/sys/block/vda
#cat /etc/udev/rules.d/50-test.rules
ACTION=="add", SUBSYSTEM=="block", DRIVERS=="virtio_blk", SYMLINK+="virio/%k", RUN+="/usr/bin/logger -i -p daemon.info -t CUSTOMUDEV Added %k"
#udevadm trigger --sysname-match=vda
#tail -f /var/log/messages