linux服務之udevd


http://www.ibm.com/developerworks/cn/linux/l-cn-udev/
[root@localhost ~]# uname -r
2.6.32-431.el6.x86_64
udev-147-2.51.el6.x86_64
此版本的udev變動較大

什么是 udev?
udev 是 Linux2.6 內核里的一個功能,它替代了原來的 devfs,成為當前 Linux 默認的設備管理工具。udev 以守護進程的形式運行,通過偵聽內核發出來的 uevent 來管理 /dev目錄下的設備文件。不像之前的設備管理工具,udev 在用戶空間 (user space) 運行,而不在內核空間 (kernel space) 運行。
使用 udev 的好處
我們都知道,所有的設備在 Linux 里都是以設備文件的形式存在。在早期的 Linux 版本中,/dev目錄包含了所有可能出現的設備的設備文件。很難想象 Linux 用戶如何在這些大量的設備文件中找到匹配條件的設備文件。現在 udev 只為那些連接到 Linux 操作系統的設備產生設備文件。並且 udev 能通過定義一個 udev 規則 (rule) 來產生匹配設備屬性的設備文件,這些設備屬性可以是內核設備名稱、總線路徑、廠商名稱、型號、序列號或者磁盤大小等等。
    動態管理:當設備添加 / 刪除時,udev 的守護進程偵聽來自內核的 uevent,以此添加或者刪除 /dev下的設備文件,所以 udev 只為已經連接的設備產生設備文件,而不會在 /dev下產生大量虛無的設備文件。
    自定義命名規則:通過 Linux 默認的規則文件,udev 在 /dev/ 里為所有的設備定義了內核設備名稱,比如 /dev/sda、/dev/hda、/dev/fd等等。由於 udev 是在用戶空間 (user space) 運行,Linux 用戶可以通過自定義的規則文件,靈活地產生標識性強的設備文件名,比如 /dev/boot_disk、/dev/root_disk、/dev/color_printer等等。

udev 工作流程圖:

圖 1. udev 工作流程圖:

相關術語:
    設備文件:由於本文以較通俗的方式講解 udev,所以設備文件是泛指在 /dev/下,可被應用程序用來和設備驅動交互的文件。而不會特別地區分設備文件、設備節點或者設備特殊文件。
    devfs:devfs是 Linux 早期的設備管理工具,已經被 udev 取代。
    sysfs:sysfs是 Linux 2.6 內核里的一個虛擬文件系統 (/sys)。它把設備和驅動的信息從內核的設備模塊導出到用戶空間 (userspace)。從該文件系統中,Linux 用戶可以獲取很多設備的屬性。
    devpath:本文的 devpath是指一個設備在 sysfs文件系統 (/sys)下的相對路徑,該路徑包含了該設備的屬性文件。udev 里的多數命令都是針對 devpath操作的。例如:sda的 devpath是 /block/sda,sda2 的 devpath是 /block/sda/sda2。
    內核設備名稱:設備在 sysfs里的名稱,是 udev 默認使用的設備文件名。

udev 的配置和使用:

syslog默認會記錄 udev 的日志,Linux 用戶只能修改日志的級別 (err、info、degub 等 );設備的權限不能在 udev.conf 里設定,而是要在規則文件 (*.rules) 里設定。
udev 的規則和規則文件
規則文件是 udev 里最重要的部分,默認是存放在 /etc/udev/rules.d/下。所有的規則文件必須以“.rules”為后綴名。RHEL 有默認的規則文件,這些默認規則文件不僅為設備產生內核設備名稱,還會產生標識性強的符號鏈接。
udev 按照規則文件名的字母順序來查詢全部規則文件,然后為匹配規則的設備管理其設備文件或文件鏈接。雖然 udev 不會因為一個設備匹配了一條規則而停止解析后面的規則文件,但是解析的順序仍然很重要。通常情況下,建議讓自己想要的規則文件最先被解析。比如,創建一個名為 /etc/udev/rules.d/10-myrule.rules的文件,並把你的規則寫入該文件,這樣 udev 就會在解析系統默認的規則文件之前解析到你的文件。
在規則文件里,除了以“#”開頭的行(注釋),所有的非空行都被視為一條規則,但是一條規則不能擴展到多行。規則都是由多個 鍵值對(key-value pairs)組成,並由逗號隔開,鍵值對可以分為 條件匹配鍵值對( 以下簡稱“匹配鍵 ”) 和 賦值鍵值對( 以下簡稱“賦值鍵 ”),一條規則可以有多條匹配鍵和多條賦值鍵。匹配鍵是匹配一個設備屬性的所有條件,當一個設備的屬性匹配了該規則里所有的匹配鍵,就認為這條規則生效,然后按照賦值鍵的內容,執行該規則的賦值。
KERNEL=="sda", NAME="my_root_disk", MODE="0660"
KERNEL 是匹配鍵,NAME 和 MODE 是賦值鍵。這條規則的意思是:如果有一個設備的內核設備名稱為 sda,則該條件生效,執行后面的賦值:在 /dev下產生一個名為 my_root_disk的設備文件,並把設備文件的權限設為 0660。
僅當操作符是“==”或者“!=”時,其為匹配鍵;若為其他操作符時,都是賦值鍵。

制定 udev 規則和查詢設備信息的實例:
如何查找設備的信息 ( 屬性 ) 來制定 udev 規則:
當我們為指定的設備設定規則時,首先需要知道該設備的屬性,比如設備的序列號、磁盤大小、廠商 ID、設備路徑等等。通常我們可以通過以下的方法獲得:
    查詢sysfs文件系統:
    前面介紹過,sysfs 里包含了很多設備和驅動的信息。
    例如:設備 sda 的 SYSFS{size} 可以通過 cat /sys/block/sda/size得到;SYSFS{model} 信息可以通過 cat /sys/block/sda/device/model得到
    udevinfo命令:
    udevinfo 可以查詢 udev 數據庫里的設備信息。例如:用 udevinfo 查詢設備 sda 的 model 和 size 信息:
    其他外部命令:
清單 10. 產生網卡設備文件的規則
 SUBSYSTEM=="net", SYSFS{address}=="AA:BB:CC:DD:EE:FF", NAME="public_NIC"
該規則表示:如果存在設備的子系統為 net,並且地址 (MAC address) 為“AA:BB:CC:DD:EE:FF”,為該設備產生一個名為 public_NIC 的設備文件。
清單 11. 為指定大小的磁盤產生符號鏈接的規則
 SUBSYSTEM=="block", SYSFS{size}=="71096640", SYMLINK ="my_disk"
該規則表示:如果存在設備的子系統為 block,並且大小為 71096640(block),則為該設備的設備文件名產生一個名為 my_disk 的符號鏈接。

其中syspath都是指/sys下的路徑:如/block/sda
udevadm info --help
udevadm test /block/sda
udevadm info  --query=all --path=/block/sda
udevadm info  --query=all --name=/dev/sda   結果同上
udevadm info  --export-db  | less 查看udev database,輸出所有節點信息
[root@109-com1 scripts]# ps -ef|grep udevd  相關進程
root       431     1  0 Aug28 ?        00:00:00 /sbin/udevd -d
root      1199   431  0 Aug28 ?        00:00:00 /sbin/udevd -d
root     19382   431  0 Aug30 ?        00:00:00 /sbin/udevd -d
[root@localhost ~]# start_udev    使修改的配置文件生效,不用重啟系統
正在啟動 udev:                                            [確定]

udevd創建每一個節點的時候,都會fork出一個新的進程來單獨完成這個節點的創建工作。
Uevent_seqnum 用來標識當前的uevent事件的序號(已產生了多少uevent事件),您能夠通過如下操作來查看:
$ cat /sys/kernel/uevent_seqnum

 

12.eth0變為eth1的解決辦法

udev 會在系統引導的過程中識別網卡,將mac地址和網卡名稱對應起來記錄在udev的規則腳本中, 所以在workstation改虛擬機的mac地址,會發生此種情況。udev會自動將其命名為eth1(累加的原則),所以在你的系統啟動后,你使用 ifconfig看到的網卡名為eth1。
vi /etc/udev/rules.d/70-persistent-net.rules
改mac,改name,reboot

或者刪除此規則文件,然后reboot,系統會重新綁定。

很多Linux distribution使用udev動態管理設備文件,並根據設備的信息對其進行持久化命名。例如在Debian etch中,udev會在系統引導的過程中識別網卡,將mac地址和網卡名稱對應起來記錄在udev的規則腳本中。而VMware會自動生成虛擬機的 mac地址。這樣,由於基本系統的虛擬機已經記錄了該虛擬機的網卡mac地址對應於網卡eth0,在克隆出的虛擬機中由於mac地址發生改變,udev會 自動將該mac對應於網卡eth1。以此類推,udev會記錄所有已經識別的mac與網卡名的關系,所以每次克隆網卡名稱會自動加1,而其實kernel 僅僅只識別到一張網卡,跟網卡名相關的網絡配置也未發生任何變化。

簡單說就是esxi克隆一個虛擬機后,會產生一個新的mac地址,並生成一個新的eth1,但原ifcfg-eth0卻未改變,三個地方,
vi /etc/udev/rules.d/70-persistent-net.rules  刪掉原來的eth0的行,將eth1的行名字改為eth0
vi ifcfg-eth0  將新mac替換原來的mac,這時重啟服務service network restart,網絡已可以使用,用ifconfig查看時,仍是eth1,還沒有改回eth0
ifconfig  還是看不到eth0,這時需要重啟機器,才生效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM