udev學習總結

來源:互聯網
上載者:User

udev 動態裝置管理

 

看了不少前人總結的東西,是時候自己來做個總結了,來表達下我眼中的udev。

udev是什嗎?

udev是產生裝置檔案節點的一個方法,為了替代2.6核心之前的devfs而產生,最大的不同在於,udev是一個使用者空間程式,因此是

硬體平台無關的。udev可以在系統發現一個新的硬體時,根據靈活的udev規則,在/dev下為該硬體產生相應的裝置檔案。

 

udev產生的需求是什嗎?

udev產生的需求是固定硬體裝置的名稱,方便使用者的訪問;比如:有兩個usb裝置:usb儲存和usb相機;由於核心的處理機制,如果先插入usb存放裝置,則被識別為sda,後插入的usb相機被識別為sdb;如果先插入usb相機,則被識別為sda;因此使用者會感到困惑,不知道哪個是自己的裝置。通過udev,指定規則之後,不管usb存放裝置和相機何時被插入,都可以被識別為諸如/dev/usbstorage和/dev/usbcamera的裝置節點,方便使用者的識別。

 

udev規則

udev中最重要的是構建udev規則,正是通過指定規則,裝置才能有序的規律的出現在/dev下面;

 

規則中包含兩個要素:匹配項和賦值項,udev規則可以用一句話來概括:

if(A&B&C...) then (D&E&F...)

匹配項包括:KERNEL(裝置被核心識別的名稱),ACTION(裝置發生特定的行為)等,匹配項通過“==”指定;賦值項包括:NAME(指定裝置在/dev下的名稱)

學習規則,最好的方法是通過例子:

KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"
#核心中任何裝置載入後,設定root擁有者,root使用者組,存取權限為0600

KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"

#發現tty裝置,命名為%k(%kernel裝置在核心預設名稱),設定為tty使用者組,0666存取權限,之後所有作用於tty的規則都失效
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"

#KERNEL=="scd[0-9]*",表示 SCSI CD-ROM 驅動. 它建立一對裝置符號串連:cdrom和cdrom-%k。
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"

#開始的 KERNEL=="hd[a-z]", 表示ATA CDROM磁碟機。這個規則建立和上面的規則相同的符號串連。ATA CDROM磁碟機需要sysfs值以來區別別的ATA裝置,因為SCSI CDROM可以被核心唯一識別。
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

#以 ACTION=="add"開始,它告訴udev增加 /sbin/modprobe sg 到命令列表,當任意SCSI裝置增加到系統後,這些命令將執行。其效果就是電腦應該會增加sg核心模組來偵測新的SCSI裝置。

 

如何添加udev規則 舉一個例子:

udev規則的匹配項,是唯一標識目標裝置的資訊,由於udev是從sysfs獲得裝置資訊的,為了擷取這些資訊,可以通過udevinfo指令來查詢已載入裝置的特徵資訊;

通常的情形是在為裝置A建立udev規則之前,該裝置可以先載入到系統中,然後運行

udevinfo -a -p $(udevinfo -q path -n /dev/A)

即可獲得裝置A及其父裝置的相關特徵資訊;

然後可以從中挑選能夠唯一標識裝置A的資訊,作為匹配項;

為了標識系統中的一個硬碟sda,

可以運行

udevinfo -a -p $(udevinfo -q path -n /dev/sda)

 

 結果如下:

 [root@localhost rules.d]# udevinfo -a -p $(udevinfo -q path -n /dev/sda)

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/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{capability}=="12"
    ATTR{stat}=="  112812    30568  3171292   589470   137364   398132  4287050  2593137        0   567749  3182822"
    ATTR{size}=="104857600"
    ATTR{removable}=="0"
    ATTR{range}=="16"
    ATTR{dev}=="8:0"

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{ioerr_cnt}=="0xc"
    ATTRS{iodone_cnt}=="0x3d15f"
    ATTRS{iorequest_cnt}=="0x3d15f"
    ATTRS{iocounterbits}=="32"
    ATTRS{timeout}=="60"
    ATTRS{state}=="running"
    ATTRS{rev}=="1.0 "
    ATTRS{model}=="VMware Virtual S"
    ATTRS{vendor}=="VMware, "
    ATTRS{scsi_level}=="3"
    ATTRS{type}=="0"
    ATTRS{queue_type}=="simple"
    ATTRS{queue_depth}=="32"
    ATTRS{device_blocked}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{uevent}==""

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host0':
    KERNELS=="host0"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{uevent}==""

  looking at parent device '/devices/pci0000:00/0000:00:10.0':
    KERNELS=="0000:00:10.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="mptspi"
    ATTRS{msi_bus}==""
    ATTRS{broken_parity_status}=="0"
    ATTRS{enable}=="1"
    ATTRS{modalias}=="pci:v00001000d00000030sv00000000sd00000000bc01sc00i00"
    ATTRS{local_cpus}=="ffffffff"
    ATTRS{irq}=="19"
    ATTRS{class}=="0x010000"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{subsystem_vendor}=="0x0000"
    ATTRS{device}=="0x0030"
    ATTRS{vendor}=="0x1000"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{uevent}==""

 

 

 

 

 

 

 在嵌入式系統中如何加入udev支援

 

 

 

 

 

 

udev相關的官方資源:

man udev :在shell中即可輕鬆查看,除了沒有例子之外,涉及了udev的方方面面,適合遺忘的時候查詢;

udev primer:主要包含如何引導你的系統啟動udev和簡單的udev rules;

udev官方首頁:在這裡你可以獲得udev的源碼和相關的文檔;

Writing udev rules:詳細介紹如何構建udev規則,中文翻譯見本部落格轉載的博文《udev晉級(專業人士提供)》

其中,A,B,C叫做匹配項,即條件;D,E,F叫做賦值項,即條件符合之後,執行相應的操作;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.