Udev

Udev管理設備

一、udev特點

   1、udev是一種工具,它能夠根據系統中的硬件設備的狀態動態更新設備文件,包括設備文件的創建,刪除等。

   2、使用udev後,在/dev/目錄下就只包含系統中真正存在的設備

   3、與設備主/從編號無關

   4、提供持續的設備命名

   5、Udev是硬件平臺無關的,屬於user space 的進程,它脫離驅動層的關聯而建立在操作系統之上。

   6、遵循linux Standard Base (LSB) 設備命名方法,但也可以自定義命名。

   7、非常輕量級

       Udev只支持linux-2.6以上的內核,因爲udev嚴重依賴於sysfs文件系統提供的信息,而sysfs文件系統只在linux-2.6以上的內核纔有。Udev運行在用戶模式中是一個用戶程序,而devfs運行在內核是一個內核模塊。Udev能夠實現所有devfs實現功能。Udev通過對內核產生的設備名增加別名的方式來達到不管設備連接順序而維持一個統一的設備名的目的。Udev是用戶模式程序,不會更改內核的行爲。內核依然會我行我素地產生設備名,但udev可以根據設備的期它信息如總線(BUS),生產商(vendor)等不同來區分不同的設備,併產生設備文件。

二、udev原理和結構

   1、當udev從kernel收到設備add/remove事件後,udev將解析:

  • /etc/udev/rules.d/目錄中的用戶自定義規則文件。

  • 使用自定義規則輸出(可選)。

  • 從/sys中查詢相應的信息。

   2、據解析的信息,udev彙集了:

  • 處理設備命名

  • 確定將創建什麼設備文件(device file)或符號鏈接(symlink)

  • 確定如何設備文件屬性。

  • 確定後續操作  

       傳統上Linux系統使用創建靜態設備文件的方法來管理系統硬件,因此在/dev 目錄下創建了大量的設備文件(有時會有數千個文件),而不管對應的硬件設備實際上是否存在。這些操作通常是由 MAKEDEV腳本完成的,這個腳本包含許多調用mknod 程序的命令,爲這個世界上可能存在的每個設備創建相應的主設備號和次設備號。而使用 udev 方式的時候,只有被內核檢測到的設備才爲其創建設備文件。因爲每次系統啓動的時候都要重新創建這些設備節點,所以它們被存儲在tmpfs 文件系統(一種完全存在於內存裏,不佔用任何磁盤空間的文件系統)上,設備文件不需要很多磁盤空間,所佔用的內存可以忽略不計。

      devfs 存在的主要的問題是它處理設備檢測、創建和命名的方式,其中設備節點的命名可能是最嚴重的問題。一般可接受的方式是,如果設備名是可配置的,那麼設備命名策略應該由系統管理員決定,而不是由某些開發者強制規定。devfs 文件系統還存在競爭條件(raceconditions)的問題,這是它天生的設計缺陷,不對內核做徹底的修改就無法修正這個問題。因爲近來缺乏維護,它已經被標記爲deprecated(反對的)。

對於已經編入內核的驅動程序,當被內核檢測到的時候,會直接在 sysfs 中註冊其對象;對於編譯成模塊的驅動程序,當模塊載入的時候纔會這樣做。一旦掛載了 sysfs 文件系統(掛載到 /sys), 內建的驅動程序在 sysfs 註冊的數據就可以被用戶空間的進程使用,並提供給 udev 以創建設備節點。udev通過系統調用函數libsysfs得到設備的相應信息比如本地名、設備主/從號等等。

      udev初始化腳本負責在 Linux 啓動的時候創建設備節點(RedHatLinux 中該腳本爲/sbin/start_udev),該腳本首先將註冊一個熱插拔事件處理程序(Redhat Linux 中該程序爲 /sbin/udevd)。熱插拔事件本不應該在這個階段發生,註冊 udev 只是爲了以防萬一。然後 udev初始化腳本遍歷 /sys 文件系統,並在 /dev目錄下創建符合描述的設備。例如/sys/class/tty/tty1/dev 裏含有"4:1"字符串,udev初始化腳本就根據這個字符串創建主設備號爲 4 、次設備號爲 1 的 /dev/tty1設備。創建的每個設備的名字和權限由/etc/udev/rules.d/ 目錄下的文件指定的規則來設置,這些文件以類似於 LFS 啓動腳本風格的編號。如果 udev找不到所創建設備的權限文件,就將其權限設置爲缺省的660 ,所有者爲 root:root。在RedHat Linux系統中略有不同,具體請參看/sbin/start_udev腳本。

三、配置udev

       150934351.png

四、udev規則

       1、文件名位置及命名方法

               默認放置在/etc/udev/rules.d目錄下

               臨時規則/dev/.udev/rules.d/

                   144020207.png

               命名爲<rule_name>.rules

       2、規則結構

               ACTION=="add",SUBSYSTEM=="mmc", RUN+="modprobe mmc_block"

               ACTION=="add",KERNEL=="sda", RUN+="/bin/raw/dev/raw/raw1 %N"

       3、規則文件將在第一次預讀後緩衝

               當規則文件被修改後時間戳的更新會強制udev從讀規則文件,如果想強制重讀可以使用touch命令更新時間戳。

       4、Udev不會因爲找到匹配的規則而停止運行,它會繼續尋找並嘗試應用每一條它所能識別的規則。

五、udev關鍵字

       1、運算符

               == 比較以判斷相等

               != 比較以判斷不符

       2、關鍵字示例

               ACTION==”add”

               KERNEL==”sd[a-z]1”

               BUS==”scsi”

               DRIVER!=”ide-cdrom”

               SYSFS{prod_id1}==”IBM”

               PROGRAM==”check-cdrom.sh%k CD-R”

               SYSLINK+=”cdwriter cdwriter-%k cdrw cdrw-%k”

       3、udev 關鍵字文檔

               man 7 udev

               /usr/share/doc/udev-095/writing_udev_rules/index.html

               常用關鍵字

                   145045824.png

               大多領域支持的模式匹配形式

                   145132686.png

六、查詢udev匹配鍵值

      1、網卡

           145217749.png

      2、硬盤信息

           145401595.png

      3、硬盤大小

           145629787.png

      4、查看設備信息

            145708155.png

           如果是查看硬盤設置目錄爲/sys/block/下,

七、udev規則賦值

       1、運算符

           =             給一個鍵賦值,它將覆蓋之前的賦值

           +=          給一個鍵追加值

           :=           最後賦值給鍵;禁止其後任何變動,也就是防止之後的規則改動這個鍵值。

       2、關鍵字

           150028436.png

八、udev規則置換

       1、udev 具有類似printf的字符轉換功能

       2、能簡化和省略規則

       3、支持NAME、SYSMLINK、PROGRAM、OWNER、GROUP和RUN關鍵。

           150352786.png

九、實驗

       1、BUS=="usb", ATTRS{serial}=="AA00000000001786",ATTRS{product}=="Lovely Attache", NAME="myusb%n",RUN+="/usr/bin/wall 1234"

       2、BUS=="usb", ATTRS{serial}=="AA00000000001786",ATTRS{product}=="Lovely Attache", NAME="myusb%n",RUN="/bin/sh /root/hello.sh"

       3、自動加載usb設備

               KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usb%m",GROUP="users", OPTIONS="last_rule"

               ACTION=="add", KERNEL=="sd[a-z][0-9]",SYMLINK+="usb%n", GROUP="users", NAME="%k"

               ACTION=="add", KERNEL=="sd[a-z][0-9]",RUN+="/bin/mkdir -p /mnt/usb%n"

               ACTION=="add", KERNEL=="sd[a-z][0-9]",PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat",

                           RUN+="/bin/mount -t vfat -orw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,

                           fmask=111 /dev/%k/mnt/usb%n", OPTIONS="last_rule"

               ACTION=="add", KERNEL=="sd[a-z][0-9]",RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,

                           noexec,nodev,noatime/dev/%k /mnt/usb%n", OPTIONS="last_rule"

               ACTION=="remove", KERNEL=="sd[a-z][0-9]",RUN+="/bin/umount -l /mnt/usb%n"

               ACTION=="remove", KERNEL=="sd[a-z][0-9]",RUN+="/bin/rmdir /mnt/usb%n", OPTIONS="last_rule"


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