Gentoo udev 指南
1.
什麼是 udev?
/dev 目錄
當 Linux 使用者談到他們系統上的硬體時,對周圍那些認為 Linux 是一種病毒或是一種
咖啡的牌子的人,'斜線 dev 斜線 某個東西'的用法他們一定會投給您一個奇怪的眼光。
但是對於那些幸運的使用者(包括您),使用 /dev/hda1 就是一種快速的表
達方法,而不用說第一個 IDE 插槽上主硬碟的第一個分割區,不是嗎?
我們都知道什麼是裝置檔。一些人更了解為什麼我們在 /dev 中輸入
ls -l 仔細查看時那些裝置檔會有特別的數字。但是我們一直認為
/dev/hda 代表第一個 IDE 插槽上主硬碟是理所當然的。您或許並不知道,
但這只是設計上一個瑕疵。
考慮一下可熱插拔的裝置,例如說 USB,IEEE1394,可抽換的 PCI,...什麼是第一個裝置
?他會維持多久?當第一個裝置消失後其他的裝置要如何命名?這會不會影響進行中的傳
輸工作?如果說因為您媽媽決定插上雷射印表機使它變成第一台印表機,而讓您的列印工作
從爆新的雷射印表機變成快壞的矩陣印表機在列印,這會很有趣嗎?
進入 udev。udev 計畫的目標有趣而且迫切需要:
- 在 userspace 中執行
- 動態建立/移除裝置檔
- 提供固定的名稱
- 提供 user-space API
為了提供這些功能,udev 以三個分割的子計畫發展:
namedev,libsysfs,還有不用說就是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,因為這是他的相依套件其中之一。如果你想要在裝置
插入時自動載入模組,你才要安裝 hotplug。hotplug 也會處理網路裝置自
動啟動及軔體下載。
原始碼 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 --->
[*] Support for hot-pluggable devices
File systems --->
Pseudo filesystems --->
[*] /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 --->
Pseudo Filesystems --->
[*] /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-#,# 代
表 0,1, ...
要修正他,編輯 /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/cXdYpZ,X,Y 和 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 --->
Pseudo filesystems --->
[*] /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 的傑出文章。
這份文件是以
Creative Commons - 姓名標示-相同方式分享 授權條款發布
|