黎一毅
摘 要:隨著計算機技術和的發展應用的推廣,計算機掛載的設備越來越多,雖然linux依據設備類型分配了設備文件名, 比如eth0, eth1,sda,sdb, 但是人們不查看具體的設備信息,無法從這類名字上判斷那是哪一個硬件設備。在計算機維護中,如果有設備需要臨時裝載移除或者熱插拔,往往系統同類設備的編號就會混亂,比如人們插拔硬盤,往往sdb,sdc這些設備序號就會混亂。人們在實際工作中往往希望,linux能將連接的設備設定易于識別的設備文件,這樣不但區分識別,而且方便人們實習自動備份等一系列自動功能,在面向用戶的設備中提升用戶體驗。文章簡要介紹udev在linux系統的使用,在ubuntu 12.04 LTS中使用的實例。
關鍵詞:udev;linux;ubuntu
通過向內核中添加代碼也可以實現修改設備文件名稱的功能,但是很少人會這樣,一是內核升級維護不方便,每次升級內核都要插入代碼;二是容易干擾內核運行,每次都要仔細審查加入的代碼,同時也容易引入漏洞。udev,簡單,方便,成熟。udev是多個linux發行版默認的設備管理器,udev規則易于在不同的發行版之間移植。
1 Ubuntu 12.04.04 LTS中的udev
udev 是Linux kernel 2.6的默認設備管理器,它的目標是接替devfs和hotplug的功能。udev的守護進程通過偵聽內核發出來的 uevent 來管理 /dev 目錄下的設備文件。它在用戶模式下管理/dev目錄底下的設備節點,不會對內核的運行產生影響。因此,內核依然會產生設備文件如sda,sdb等,人們利用udev建立設備的軟連接一般不會干擾其他軟件的運行。通過編寫udev規則,人們就可以根據設備的不同屬性區分設備,用人們習慣的命名方式設置設備文件名。文章介紹ubuntu 12.04 LFS中udev的使用。2012年4月Udev已經和systemd項目合并,集成成為一體化的啟動及設備管理軟件。但在ubuntu12.04 LTS發行版中使用的是分離的udev 175版本,啟動管理(init)用的還是Ubuntu自己的upstart。系統的預設規則和輔助文件放在/lib/udev/中,用戶自定規則應當存在在/etc/udev/rules.d/目錄下,用戶規則優先級要高于系統預設規則。
2 獲取udev規則屬性
為編寫匹配規則,人們先要獲取設備屬性信息,在ubuntu12.04.04 LTS中可以通過查看/sys/下的設備屬性信息和使用udevadm info命令獲取設備屬性信息。
2.1 查看/sys/屬性文件
/sys目錄下將設備信息分類存放,比如,硬盤作為塊設備放置在/sys/block/下,人們執行cat /sys/block/sda/device/model查看設備 sda 的model號。執行該命令得到ST3160815AS,那么人們可以建立匹配規則 ATTR {model}=="ST3160815AS",規則表示:如設備model為ST3160815AS,匹配該設備。
2.2 通過udevadm info命令
udevadm info打印指定設備的所有sysfs記錄的屬性,以用來udev規則匹配特殊的設備。不同發行版中,具體命令不同。通過udevadm info獲取設備信息是最常用的方法,它可以將設備節點的信息一次獲取完,而且可以同時顯示設備的子節點和父節點信息,便于人們編寫規則。
可見udev規則的匹配是從母節點到子節點的次序,匹配中同時比較設備的母節點和子節點的屬性信息,可以看到人們執行test中,同一條規則多次命中,軟鏈接me_link的指向多次被改變。所以人們要在啟動時讓me_link指向sda1,要增加一個sda1的屬性,ATTR{start},分區1的起始扇區號。
ATTRS{model}=="ST3160815AS", ATTR{start}=="2048" ,SYMLINK+="me_link"
這樣計算機在啟動udev創建的me_link會指向sda1,即第一個硬盤的第一個分區。
參考文獻
[1]http://manpages.ubuntu.com/manpages/karmic/en/man7/udev.7.html.
[2]http://www.freedesktop.org/software/systemd/man/udev.html.
[3]http://en.wikipedia.org/wiki/Udev.
[4]http://hackaday.com/2009/09/18/how-to-write-udev-rules/.