udev原理分析

轉自 http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=system:udev%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90

udev原理分析


一.udev簡介

在linux系統中,/dev目錄用來保存設備文件的.每個文件指向一個系統設備.用戶的程序可以通過使用這些設備文件,對真實的硬件的設備進行操作.如: hda是第1個IDE硬盤,sda是第1個SCSI硬盤. 
在2.4內核時代,在/dev下保存了所有kernel可以支持的硬件設備的設備文件,將近有1萬個.而這些設備中,大多數是沒有連接的設備.這樣就大大的浪費了系統資源,而且/dev目錄也顯得非常混亂.
udev就是用瞭解決這些問題的.在2.6內核中,採用udev方式來管理/dev目錄.它可以動態的建立/刪除設備文件(設備連接到系統時,它會自動建立相應的設備文件,設備斷開連接後,它會自動刪除相應的設備文件).這樣使/dev目錄簡化了許多.而且,udev還可以允許用戶編寫命名規則,爲不同設備指定設備文件名.這樣,對設備的管理也方便了許多.
例如:你有2個U盤,1個容量是1G的,1個容量是2G的.一般情況下,你先接上的U盤會是sdb,後接上的U盤會是sdc.
這樣對使用很不方便.每次U盤的設備名可能不一樣.但通過udev命名規則,你可以自己指定的設備命名,可以將1G的U盤命名爲1g,將2G的U盤命名爲2g.設備名不會再變化.使用和管理都會很方便.

二.udev安裝

1.Turbolinux發行版
在Turbolinux 10,10.5和11等版本中,都已集成了udev包.你也可以手動安裝udev的rpm包.

# rpm -ivh udev-<版本號>.rpm

2.從源碼包安裝
你可以從官方網站下載源碼包:

http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html

我們下載0.39版的udev.然後進行安裝:

#tar jxf udev-039.tar.bz2
# cd udev-039
# make
# make install

三.udev命名規則

1.查看硬件信息

當你將一個硬件連接到系統時,會在/sys下生成這個設備的相應信息.U盤信息會保存在/sys/block下,USB打印機則會保存在
/sys/class/usb下.使用udevinfo命令可以查看硬件的相關信息.

# udevinfo -a -p /sys/block/sda/sda1
  looking at class device '/sys/block/sda/sda1':
    SYSFS{dev}="8:1"
    SYSFS{size}="2045147"
    SYSFS{start}="61"
    SYSFS{stat}="       0        0        0        0"

follow the class device's "device"
  looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6:1.0/host2/target2:0:0/2:0:0:0':
    BUS="scsi"
    ID="2:0:0:0"
    SYSFS{detach_state}="0"
    SYSFS{device_blocked}="0"
    SYSFS{max_sectors}="240"
    SYSFS{model}="Flash Disk      "
    SYSFS{queue_depth}="1"
    SYSFS{rev}="4.00"
    SYSFS{scsi_level}="3"
    SYSFS{state}="running"
    SYSFS{timeout}="30"
    SYSFS{type}="0"
    SYSFS{vendor}="        "


輸出信息包括硬件的產品類型,廠商信息,序列號等,依據這些信息,你就可以編寫命名規則了.


2.命名規則

udev的命名規則保存在/etc/udev/rules.d中,腳本按照文件的編號順序,由小到大執行.當規則匹配時,將不再繼續向下執行.
下面以Turbolinux 10爲例,編寫一個U盤命名規則.

# vi /etc/udev/rules.d/05-users.rules

根據硬件的序列號(serial)編寫規則.在文件中添加下面內容:

BUS="usb", SYSFS{serial}="033446747503", KERNEL="sd?1", NAME="bruce-%k", SYMLINK="bruce3-%n"

BUS 表示設備使用的總線.
SYSFS 表示指定硬件信息中,我們需要使用的哪一項值,這裏我們使用U盤的序列號作爲識別.
KERNEL 表示內核對這個設備進行的命名.內核對U盤的命名爲sda1,sdb1…,所以這裏我們使用”sd?1”.
NAME 設備名,即我們要改變的設備名稱.我們使用bruce-%k.%k代表內核對這個設備的命名.
SYMLINK 表示建立一個連接,連接到這個設備上.這個連接的名稱是”bruce3-%n”.%n代表kernel號,即設備名後面的數字.

現在將U盤拔出,然後再重新連接到計算機上.

# ls /dev/sd* -hl
brw-rw----  1 root disk 8, 0 Aug 17 20:11 /dev/sda

# ls /dev/bruce* -hl
lrwxrwxrwx  1 root root   10 Aug 17 20:11 /dev/bruce3-1 -> bruce-sda1
brw-------  1 root root 8, 1 Aug 17 20:11 /dev/bruce-sda1

可以看到,U盤設備名變成了bruce-sda1,並且有一個bruce3-1的連接指向它.

四.udev工作原理

當系統添加設備時,/sys目錄下會生成設備的相應信息.udev就是通過讀取/sys下的信息來識別硬件設備的.

udev有3部分組成: namedev,libsysfs,udev
namedev 負責解析/etc/udev/rules.d中的命名規則,遇到匹配規則後,會返回一個設備名.
libsysfs 負責讀取/sys下的硬件信息.
udev程序負責協調namedev和libsysfs,來完成指定的命名策略.

當有設備添加或移出時,/sbin/hotplug由內核調用.提供相應設備的特徵信息.如:設備類型,sysfs中的哪個設備等.
udev獲得這些信息,然後調用namedev,爲設備指定一個名稱.如果這是一個已經增加的新設備,則udev使用libsysfs來獲得設備的主從設備號,然後在/dev下建立設備文件.如果這個設備已經移出,則將從/dev下刪除它的設備文件.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章