Gentoo udev 指南

tonykorn97發表於2006-11-06

內容:

1. 什麼是 udev?

2. Gentoo 使用 udev

3. 已知問題

4. 資源 & 感謝

http://www.gentoo.org/doc/zh_tw/udev-guide.xml


1. 什麼是 udev?

/dev 目錄

Linux 使用者談到他們系統上的硬體時,對周圍那些認為 Linux 是一種病毒或是一種咖啡的牌子的人,'斜線 dev 斜線 某個東西'的用法他們一定會投給您一個奇怪的眼光。但是對於那些幸運的使用者(包括您),使用 /dev/hda1 就是一種快速的表達方法,而不用說第一個 IDE 插槽上主硬碟的第一個分割區,不是嗎?

我們都知道什麼是裝置檔案。一些人更瞭解為什麼我們在 /dev 中輸入 ls -l 仔細檢視時那些裝置檔案會有特別的數字。但是我們一直認為 /dev/hda 代表第一個 IDE 插槽上主硬碟是理所當然的。您或許並不知道,但這只是設計上一個瑕疵。

考慮一下可熱插拔的裝置,例如說 USBIEEE1394,可抽換的 PCI...什麼是第一個裝置?他會維持多久?當第一個裝置消失後其它的裝置要如何命名?這會不會影響進行中的傳輸工作?如果說因為您媽媽決定插上鐳射印表機使它變成第一臺印表機,而讓您的列印工作從爆新的鐳射印表機變成快壞的矩陣印表機在列印,這會很有趣嗎?

進入 udevudev 計劃的目標有趣而且迫切需要:

userspace 中執行

動態建立/移除裝置檔案

提供固定的名稱

提供 user-space API

為了提供這些功能,udev 以三個分割的子計劃發展: namedevlibsysfs,還有不用說就是udev

namedev

Namedev 允許您從 udev 之外自行定義裝置的名稱。這讓您輸入多個段落來設定有彈性的命名規則以及方案。這個裝置命名子系統提供 udev 可以使用的標準介面。

目前 namedev 只有提供一個命名方案,由 LANANA 提供。目前這被大部分的 Linux 系統使用,因此適合大多數的 Linux 使用者。

Namedev 使用下面五個步驟來決定指定裝置的名稱。如果債這些步驟的其中一個找到了這個裝置的名稱,就會使用它。這五個步驟是: are:

標籤或序號

匯流排裝置編號

匯流排拓樸

靜態指定名稱

核心提供的名稱

卷標或序號 這一步檢查裝置是否有唯一的識別記號。例如說 USB 裝置有唯一的 USB 序號。SCSI 有唯一的 UUID。如果 namedev 找到與這種唯一編號相對應的設定檔,他將或使用設定檔提供的名稱。

匯流排裝置編號 這一步會檢查匯流排裝置編號,對於不可熱抽換的環境,這一步足以辨識裝置。例如說 PCI 匯流排編號在系統的使用期限內很少變更。同樣的,如果 namedev 找到相對應的設定檔,設定檔中的名稱就會被使用。

類似的,匯流排拓樸 相對來說也是夠穩定而可以辨識裝置,只要使用者不抽換裝置。當裝置的位置滿足使用者提供的設定,就會使用指定的名稱。

第四個步驟,靜態指定名稱,是一個簡單的字串取代。當核心提供的名稱(預設名稱)符合指定的取代字串,就會使用取代後的名稱。

最後一步(核心提供的名稱)一定會找到符合的:由核心提供的預設名稱。在大部份的情況下這足以在目前的 Linux 系統中找到對應的名稱。

libsysfs

udev 使用虛擬的 sysfs 檔案系統和核心溝通。libsysfs 計劃提供通用的 API 以一般方式取得 sysfs 提供的資訊。這讓查詢任何硬體時不用先知道他們是哪種硬體。

udev

每當核心注意到硬體結構有更新時,他會呼叫 /sbin/hotplug 這個程式。 Hotplug 會執行連結到 /etc/hotplug.d/default 目錄下的程式。在哪裡面您也會找到 udev 程式的連結。Hotplug 送出核心提供的資訊給 udev 程式,以便執行必要的動作修改 /dev 結構(建立或刪除裝置檔案)

2. Gentoo 使用 udev

需求

udev 需要與 2.6 核心共同使用(例如 vanilla-sources 2005.0 profile 預設的 gentoo-sources)。如果您已經用這類核心,您只要確定您的 sys-apps/baselayout 是最新的。這就是所有您需要的。

原始碼 2.1: 安裝 udev

# emerge udev

udev 會安裝 hotplug-base,因為這是他的相依套件其中之一。如果你想要在裝置插入時自動載入模組,你才要安裝 hotplughotplug 也會處理網路裝置自動啟動及軔體下載。

原始碼 2.2: 自由選擇:安裝 hotplug

# emerge hotplug

如果你想要在開機完成之前就載入已插入的硬體裝置,使用 coldplug 套件。

原始碼 2.3: 安裝 coldplug 套件

# emerge coldplug

不要忘了把 coldplug 加到開機 runlevel

原始碼 2.4: coldplug 加到開機 runlevel

# rc-update add coldplug boot

核心方面,確定你有選了下列選項:

原始碼 2.5: 需要的核心設定

General setup ---&gt

[*] Support for hot-pluggable devices

File systems ---&gt

Pseudo filesystems ---&gt

[*] /proc file system support

[*] Virtual memory file system support (former shm fs)

如果你使用 genkernel,不要忘記執行時加上 --udev 引數來啟動所有需要的核心選項。genkernel 預設使用的選項就足夠了。

如果您想的話,也可以啟動 /dev file system support (OBSOLETE)。但是你要確定關閉 "Automatically mount at boot"

原始碼 2.6: 不要自動掛載 devfsd

File systems ---&gt

Pseudo Filesystems ---&gt

[*] /dev file system support (OBSOLETE)

[ ] Automatically mount at boot

設定

如果您像要在 Gentoo 使用調整過的 udev 讓您的生活更加快樂,那您讀到這就可以了。 Gentoo 會使用 udev 但保持靜態的 /dev 讓你不會遺失任何裝置結點。 Gentoo init scripts 不會執行 devfsd 服務,而且當您開機時會關閉 devfs

但如果您是頑固的傢伙,想要執行只使用 udev,未經調整過的系統,就如同 udev 發展過程中所做的事(包括一些困難,像是因為 udev 不支援而遺失的裝置),那就讀下去吧 :)

我們會停止裝置檔案節點的儲存規則:編輯 /etc/conf.d/rc 中的 RC_DEVICE_TARBALL 變數,把他設成 no no:

原始碼 2.7: /etc/conf.d/rc

RC_DEVICE_TARBALL="no"

如果您的核心包含 devfs 支援,您可以在開機管理員選單設定中停止他:在核心引數中加入 devfs=nodevfs。如果您想要用 devfs 並且停止 udev,在核心引數中加入 gentoo=noudev

3. 已知問題

開機時遺失裝置節點檔案

如果您因為一個找不到 /dev/null 的錯誤而不能開機,或者是遺失 initial console,這是因為您缺少一些需要在 udev 掛載及處理 /dev 之前就要存在的檔案。在使用舊的媒體安裝的 Gentoo 機器上很常見。

如果您是用 sys-apps/baselayout-1.8.12 或之後的版本,因為開機程式會繼續完成開機,所以這訊息不那麼嚴重了。然而,如果想要移除這個惱人的警告訊息,您應該依以下的方法來建立遺失的裝置節點。

要檢視哪些裝置在 /dev 掛載前就存在了,執行底下的指令:

原始碼 3.1: 列出開機時存在的裝置節點

# mkdir test

# mount --bind / test

# cd test/dev

# ls

要成功開機所需要的裝置是 /dev/null /dev/console,如果他們沒有在前面的測試中顯示,您需要手動建立他們,在 test/dev/ 目錄中輸入下列指令:

原始碼 3.2: 建立必要的裝置節點

# mknod -m 660 console c 5 1

# mknod -m 660 null c 1 3

完成後,不要忘了解除安裝 test/ 目錄。

原始碼 3.3: 解除安裝 test/ 目錄

# cd ../..

# umount test

# rmdir test

udev nvidia

如果您使用 nVidia 提供的驅動程式,但是 X server 沒辦法在只使用 udev 的系統啟動,確定您有:

nvidia 模組有列在 /etc/modules.autoload.d/kernel-2.6

nvidia-kernel 的版本大於或等於 media-video/nvidia-kernel-1.0.5336-r2

baselayout 的版本大於或等於 sys-apps/baselayout-1.8.12

LVM2 名稱消失

當你同時使用 udev LVM2,你可能會發現你建立的容量群組和邏輯分割區消失了。不過呢,他們並沒有消失,但是他們不幸的被命名為 /dev/dm-## 代表 01 ...

要修正他,編輯 /etc/udev/rules.d/50-udev.rules 然後取消這幾行的註解:

原始碼 3.4: 取消 /etc/udev/rules.d/50-udev.rules 中這幾行的註解

KERNEL="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK="%c"

DevFS udev 之間沒有固定的命名

雖然我們想要對這兩種動態裝置管理解決方案都用相同的命名規則,有時候還是會發生名稱不同的情況。

一個回報的衝突是使用 HP Smart Array 5i RAID 控制器(精確的說, cciss 核心模組)。使用 udev 時,裝置被命名成 /dev/cciss/cXdYpZXY Z 是固定的號碼。而使用 devfs 時,裝置是 /dev/hostX/targetY/partZ 或是 /dev/cciss/cXdY 的符號連結。

如果這樣的話,不要忘記正確的更新 /etc/fstab 和開機管理員設定檔。

這也發生在 /dev 中通用的符號連結,像是 /dev/mouse udev 並不會去建立他。記得確認 X 設定檔有沒有將你的滑鼠設定指向實際的裝置檔案。

其它問題

如果當 /etc/modules.autoload.d/kernel-2.6 裡面的模組載入時,裝置節點並沒有建立,但是當您用 modprobe 手動載入時他又有出現,您應該是是升級到 sys-apps/baselayout-1.8.12 或之後的版本。

framebuffer 裝置(/dev/fb/*)的支援包含在核心 2.6.6-rc2 之後的版本。

2.6.4 之前的核心您需要加入 /dev/pts 檔案系統的支援。

原始碼 3.5: 啟動 /dev/pts 檔案系統

File systems ---&gt

Pseudo filesystems ---&gt

[*] /dev/pts file system for Unix98 PTYs

4. 資源 & 感謝

Linux Symposium (Ottawa, Ontario Canada - 2003) 中由 Greg Kroah-Hartman (IBM Corporation) 發表的 udev 演講提供了關於 udev 程式完整的瞭解。

Decibel's UDEV Primer 是一份關於 udev Gentoo 的深度檔案。

Gentoo 開發員 Daniel Drake 寫的 撰寫 udev 規則是一個學習如何自訂 udev 的傑出文章。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245511/,如需轉載,請註明出處,否則將追究法律責任。

相關文章