udev詳解

ewelamb發表於2013-09-04
http://www.askmaclean.com/archives/tag/udev
http://www.cnblogs.com/jimeper/archive/2012/12/09/2809724.html
http://www.tianqingbo.com/oracle-linux-5-udev-scsi-rules-asm.html
http://www.oracledatabase12g.com/archives/utilize-udev-resolve-11gr2-rac-asm-device-name.html

udevinfo -a -p /sys/block/sda
KERNEL=="sd*", BUS=="scsi",SYSFS{dev}=="8:16", NAME="asm-disk1", WNER="grid",  GROUP="oinstall", MODE="0660"
KERNEL=="sd*", BUS=="scsi",SYSFS{dev}=="8:32", NAME="asm-disk2", WNER="grid",  GROUP="oinstall", MODE="0660"
 

如果你使用Linux比較長時間了,那你就知道,在對待裝置檔案這塊,Linux改變了幾次策略。在Linux早期,裝置檔案僅僅是是一些帶有適當的屬性集的普通檔案,它由mknod命令建立,檔案存放在/dev目錄下。後來,採用了devfs,一個基於核心的動態裝置檔案系統,他首次出現在2.3.46 核心中。Mandrake,Gentoo等Linux分發版本採用了這種方式。devfs建立的裝置檔案是動態的。但是devfs有一些嚴重的限制,從 2.6.13版本後移走了。目前取代他的便是文字要提到的udev--一個使用者空間程式。

    目前很多的Linux分發版本採納了udev的方式,因為它在Linux裝置訪問,特別是那些對裝置有極端需求的站點(比如需要控制上千個硬碟)和熱插拔裝置(比如USB攝像頭和MP3播放器)上解決了幾個問題。下面我我們來看看如何管理udev裝置。

    實際上,對於那些為磁碟,終端裝置等準備的標準配置檔案而言,你不需要修改什麼。但是,你需要了解udev配置來使用新的或者外來裝置,如果不修改配置,這些裝置可能無法訪問,或者說Linux可能會採用不恰當的名字,屬組或許可權來建立這些裝置檔案。你可能也想知道如何修改RS-232串列埠,音訊裝置等檔案的屬組或者許可權。這點在實際的Linux實施中是會遇到的。

    為什麼使用udev

    在此之前的裝置檔案管理方法(靜態檔案和devfs)有幾個缺點:

    * 不確定的裝置對映。特別是那些動態裝置,比如USB裝置,裝置檔案到實際裝置的對映並不可靠和確定。舉一個例子:如果你有兩個USB印表機。一個可能稱為 /dev/usb/lp0,另外一個便是/dev/usb/lp1。但是到底哪個是哪個並不清楚,lp0,lp1和實際的裝置沒有一一對應的關係,因為他可能因為發現裝置的順序,印表機本身關閉等原因而導致這種對映並不確定。理想的方式應該是:兩個印表機應該採用基於他們的序列號或者其他標識資訊的唯一裝置檔案來對映。但是靜態檔案和devfs都無法做到這點。

    *沒有足夠的主/輔裝置號。我們知道,每一個裝置檔案是有兩個8位的數字:一個是主裝置號 ,另外一個是輔裝置號來分配的。這兩個8位的數字加上裝置型別(塊裝置或者字元裝置)來唯一標識一個裝置。不幸的是,關聯這些身邊的的數字並不足夠。

    */dev目錄下檔案太多。一個系統採用靜態裝置檔案關聯的方式,那麼這個目錄下的檔案必然是足夠多。而同時你又不知道在你的系統上到底有那些裝置檔案是啟用的。

    *命名不夠靈活。儘管devfs解決了以前的一些問題,但是它自身又帶來了一些問題。其中一個就是命名不夠靈活;你別想非常簡單的就能修改裝置檔案的名字。預設的devfs命令機制本身也很奇怪,他需要修改大量的配置檔案和程式。;

    *核心記憶體使用,devfs特有的另外一個問題是,作為核心驅動模組,devfs需要消耗大量的記憶體,特別當系統上有大量的裝置時(比如上面我們提到的系統一個上有好幾千磁碟時)

    udev的目標是想解決上面提到的這些問題,他通採用使用者空間(user-space)工具來管理/dev/目錄樹,他和檔案系統分開。知道如何改變預設配置能讓你之大如何定製自己的系統,比如建立裝置字元連線,改變裝置檔案屬組,許可權等。

    udev配置檔案

    主要的udev配置檔案是/etc/udev/udev.conf。這個檔案通常很短,他可能只是包含幾行#開頭的註釋,然後有幾行選項:

    udev_root="/dev/"

    udev_rules="/etc/udev/rules.d/"

    udev_log="err"

    上面的第二行非常重要,因為他表示udev規則儲存的目錄,這個目錄儲存的是以.rules結束的檔案。每一個檔案處理一系列規則來幫助udev分配名字給裝置檔案以保證能被核心識別。

    你的/etc/udev/rules.d下面可能有好幾個udev規則檔案,這些檔案一部分是udev包安裝的,另外一部分則是可能是別的硬體或者軟體包生成的。比如在Fedora Core 5系統上,sane-backends包就會安裝60-libsane.rules檔案,另外initscripts包會安裝60-net.rules檔案。這些規則檔案的檔名通常是兩個數字開頭,它表示系統應用該規則的順序。

    規則檔案裡的規則有一系列的鍵/值對組成,鍵/值對之間用逗號(,)分割。每一個鍵或者是使用者匹配鍵,或者是一個賦值鍵。匹配鍵確定規則是否被應用,而賦值鍵表示分配某值給該鍵。這些值將影響udev建立的裝置檔案。賦值鍵可以處理一個多值列表。匹配鍵和賦值鍵運算子解釋見下表:

     udev 鍵/值對運算子

    運算子 匹配或賦值t 解釋

    ----------------------------------------

     == 匹配 相等比較

     != 匹配 不等比較

     = 賦值 分配一個特定的值給該鍵,他可以覆蓋之前的賦值。

     += 賦值 追加特定的值給已經存在的鍵

     := 賦值 分配一個特定的值給該鍵,後面的規則不可能覆蓋它。

    這有點類似我們常見的程式語言,比如C語言。只是這裡的鍵一次可以處理多個值。有一些鍵在udev規則檔案裡經常出現,這些鍵的值可以使用萬用字元(*,?,甚至範圍,比如[0-9]),這些常用鍵列舉如下:

    常用udev鍵

    鍵 含義

    ACTION 一個時間活動的名字,比如add,當裝置增加的時候

    KERNEL 在核心裡看到的裝置名字,比如sd*表示任意SCSI磁碟裝置

    DEVPATH 核心裝置錄進,比如/devices/*

    SUBSYSTEM 子系統名字,比如sound,net

    BUS 匯流排的名字,比如IDE,USB

    DRIVER 裝置驅動的名字,比如ide-cdrom

    ID 獨立於核心名字的裝置名字

    SYSFS{ value} sysfs屬性值,他可以表示任意

    ENV{ key} 環境變數,可以表示任意

    PROGRAM 可執行的外部程式,如果程式返回0值,該鍵則認為為真(true)

    RESULT 上一個PROGRAM呼叫返回的標準輸出。

    NAME 根據這個規則建立的裝置檔案的檔名。注意:僅僅第一行的NAME描述是有效的,後面的均忽略。

     如果你想使用使用兩個以上的名字來訪問一個裝置的話,可以考慮SYMLINK鍵。

    SYMLINK 根據規則建立的字元連線名

    OWNER 裝置檔案的屬組

    GROUP 裝置檔案所在的組。

    MODE 裝置檔案的許可權,採用8進位制

    RUN 為裝置而執行的程式列表

    LABEL 在配置檔案裡為內部控制而採用的名字標籤(下下面的GOTO服務)

    GOTO 跳到匹配的規則(透過LABEL來標識),有點類似程式語言中的GOTO

    IMPORT{ type} 匯入一個檔案或者一個程式執行後而生成的規則集到當前檔案

    WAIT_FOR_SYSFS 等待一個特定的裝置檔案的建立。主要是用作時序和依賴問題。

    PTIONS 特定的選項: last_rule 對這類裝置終端規則執行; ignore_device 忽略當前規則; ignore_remove 忽略接下來的並移走請求。

     all_partitions 為所有的磁碟分割槽建立裝置檔案。

    我們給出一個列子來解釋如何使用這些鍵。下面的例子來自Fedora Core 5系統的標準配置檔案。

    KERNEL=="*", WNER="root" GROUP="root", MODE="0600"

    KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", PTIONS="last_rule"

    KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"

    KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"

    ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

    上面的例子給出了5個規則,每一個都是KERNEL或者ACTION鍵開頭:

    *第一個規則是預設的,他匹配任意被核心識別到的裝置,然後設定這些裝置的屬組是root,組是root,訪問許可權模式是0600(-rw-------)。這也是一個安全的預設設定保證所有的裝置在預設情況下只有root可以讀寫。

    *第二個規則也是比較典型的規則了。它匹配終端裝置(tty),然後設定新的許可權為0600,所在的組是tty。它也設定了一個特別的裝置檔名:%K。在這裡例子裡,%k代表裝置的核心名字。那也就意味著核心識別出這些裝置是什麼名字,就建立什麼樣的裝置檔名。

    *第三行開始的KERNEL=="scd[0-9]*",表示 SCSI CD-ROM 驅動. 它建立一對裝置符號連線:cdrom和cdrom-%k。

    *第四行,開始的 KERNEL=="hd[a-z]", 表示ATA CDROM驅動器。這個規則建立和上面的規則相同的符號連線。ATA CDROM驅動器需要sysfs值以來區別別的ATA裝置,因為SCSI CDROM可以被核心唯一識別。.

    *第五行以 ACTION=="add"開始,它告訴udev增加 /sbin/modprobe sg 到命令列表,當任意SCSI裝置增加到系統後,這些命令將執行。其效果就是計算機應該會增加sg核心模組來偵測新的SCSI裝置。

    當然,上面僅僅是一小部分例子,如果你的系統採用了udev方式,那你應該可以看到更多的規則。如果你想修改裝置的許可權或者建立信的符號連線,那麼你需要熟讀這些規則,特別是要仔細注意你修改的那些與之相關的裝置。

    修改你的udev配置

    在修改udev配置之前,我們一定要仔細,通常的考慮是:你最好不要修改系統預置的那些規則,特別不要指定影響非常廣泛的配置,比如上面例子中的第一行。不正確的配置可能會導致嚴重的系統問題或者系統根本就無法這個正確的訪問裝置。

    而我們正確的做法應該是在/etc/udev/rules.d/下建立一個信的規則檔案。確定你給出的檔案的字尾是rules檔名給出的數字序列應該比標準配置檔案高。比如,你可以建立一個名為99-my-udev.rules的規則檔案。在你的規則檔案中,你可以指定任何你想修改的配置,比如,假設你修改修改floppy裝置的所在組,還準備建立一個信的符號連線/dev/floppy,那你可以這麼寫:

    KERNEL=="fd[0-9]*", GROUP="users", SYMLINK+="floppy"

    有些發行版本,比如Fedora,採用了外部指令碼來修改某些特定裝置的屬組,組關係和許可權。因此上面的改動可能並不見得生效。如果你遇到了這個問題,你就需要跟蹤和修改這個指令碼來達到你的目的。或者你可以修改PROGRAM或RUN鍵的值來做到這點。

    某些規則的修改可能需要更深的挖掘。比如,你可能想在一個裝置上使用sysfs資訊來唯一標識一個裝置。這些資訊最好透過udevinfo命令來獲取。

    $ udevinfo –a –p $(udevinfo –q path –n /dev/hda)

    上面的命令兩次使用udevinfo:一次是返回sysfs裝置路徑(他通常和我們看到的Linux裝置檔名所在路徑--/dev/hda--不同);第二次才是查詢這個裝置路徑,結果將是非常常的syfs資訊彙總。你可以找到最夠的資訊來唯一標誌你的裝置,你可以採用適當的替換udev配置檔案中的 SYSFS選項。下面的結果就是上面的命令輸出

    [root@localhost rules.d]# udevinfo -a -p $(udevinfo -q path -n /dev/hda1)

    Udevinfo starts with the device specified by the devpath and then

    walks up the chain of parent devices. It prints for every device

    found, all possible attributes in the udev rules key format.

    A rule to match, can be composed by the attributes of the device

    and the attributes from one single parent device.

     looking at device '/block/hda/hda1':

     KERNEL=="hda1"

     SUBSYSTEM=="block"

     DRIVER==""

     ATTR{stat}==" 1133 2268 2 4"

     ATTR{size}=="208782"

     ATTR{start}=="63"

     ATTR{dev}=="3:1"

     looking at parent device '/block/hda':

     KERNELS=="hda"

     SUBSYSTEMS=="block"

     DRIVERS==""

     ATTRS{stat}==" 28905 18814 1234781 302540 34087 133247 849708 981336 0 218340 1283968"

     ATTRS{size}=="117210240"

     ATTRS{removable}=="0"

     ATTRS{range}=="64"

     ATTRS{dev}=="3:0"

     looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0/0.0':

     KERNELS=="0.0"

     SUBSYSTEMS=="ide"

     DRIVERS=="ide-disk"

     ATTRS{modalias}=="ide:m-disk"

     ATTRS{drivename}=="hda"

     ATTRS{media}=="disk"

     looking at parent device '/devices/pci0000:00/0000:00:1f.1/ide0':

     KERNELS=="ide0"

     SUBSYSTEMS==""

     DRIVERS==""

     looking at parent device '/devices/pci0000:00/0000:00:1f.1':

     KERNELS=="0000:00:1f.1"

     SUBSYSTEMS=="pci"

     DRIVERS=="PIIX_IDE"

     ATTRS{broken_parity_status}=="0"

     ATTRS{enable}=="1"

     ATTRS{modalias}=="pci:v00008086d000024CAsv0000144Dsd0000C009bc01sc01i8a"

     ATTRS{local_cpus}=="1"

     ATTRS{irq}=="11"

     ATTRS{class}=="0x01018a"

     ATTRS{subsystem_device}=="0xc009"

     ATTRS{subsystem_vendor}=="0x144d"

     ATTRS{device}=="0x24ca"

     ATTRS{vendor}=="0x8086"

     looking at parent device '/devices/pci0000:00':

     KERNELS=="pci0000:00"

     SUBSYSTEMS==""

     DRIVERS==""

    舉一個例子:假設你想修改USB掃描器的配置。透過一系列的嘗試,你已經為這個掃描器標識了Linux裝置檔案(每次開啟掃描器時,名字都會變)。你可以使用上面的命令替換這個正確的Linux裝置檔名,然後定位輸出的採用SYSFS{idVendor}行和SYSFS{idProduct}行。最後你可以使用這些資訊來為這個掃描器建立新的選項。

    SYSFS{idVendor}=="0686", \

    SYSFS{idProduct}=="400e", \

    SYMLINK+="scanner", MODE="0664", \

    group="scanner"

    上面的例子表示將掃描器的組設定為scanner,訪問許可權設定為0664,同時建立一個/dev/scanner的符號連線。

    ---------------------------------------------------------------------------------

    理解和認識udev

    因為本身從事儲存行業,在工作中多次碰到使用者有這樣的要求:我的linux系統中原來有一塊SCSI硬碟,系統分配的裝置檔案是/dev/sda。現在新增加了一個外接的磁碟陣列,透過SCSI卡連線。但接上這個磁碟陣列後,/dev/sda變成了磁碟陣列的硬碟了,原來內建的SCSI硬碟變成了 /dev/sdb,我希望將裝置檔案固定下來。

     過去,我總是對使用者說,這個比較麻煩,因為/dev/sda等檔案都是linux核心自動分配的。很難固定下來,除非你更改載入SCSI卡驅動程式的順序,讓內建硬碟連線的SCSI卡比外接磁碟陣列連線的SCSI卡的驅動模組先載入到核心,這樣就能保證/dev/sda總是指向內建的硬碟。但這種解決方法畢竟不太完美,而且對於其他的即插即用裝置,如USB裝置等都不適用。

     近來,透過安裝和升級linux-2.6核心,發現這個問題已經可以透過2.6核心新的sysfs檔案系統和udev程式得到解決。下面就是我在學習了udev配置後的一點心得。我喜歡用FAQ的形式來說明。

    問:什麼是udev?

    答:udev是一種工具,它能夠根據系統中的硬體裝置的狀態動態更新裝置檔案,包括裝置檔案的建立,刪除等。裝置檔案通常放在/dev目錄下。使用udev後,在/dev目錄下就只包含系統中真正存在的裝置。

    問:udev支援什麼核心?

    答:udev只支援linux-2.6核心,因為udev嚴重依賴於sysfs檔案系統提供的資訊,而sysfs檔案系統只在linux-2.6核心中才有。

    問:udev是一個核心程式還是使用者程式?

    答:udev是一個使用者程式(user-mode daemon)。

    問:udev和devfs有什麼差別?

    答:udev能夠實現所有devfs實現的功能。但udev執行在使用者模式中,而devfs執行在核心中。據稱:devfs具有一些不太容易解決的先天缺陷。

    問:udev的配置檔案放在哪裡?

    答:udev是一個使用者模式程式。它的配置檔案是/etc/udev/udev.conf。這個檔案一般預設有這樣幾項:

    udev_root="/dev" ; udev產生的裝置檔案的根目錄是/dev

    udev_db="/dev/.udevdb" ; 透過udev產生的裝置檔案形成的資料庫

    udev_rules="/etc/udev/rules.d" ;用於指導udev工作的規則所在目錄。

    udev_log="err" ;當出現錯誤時,用syslog記錄錯誤資訊。

    問:udev的工作過程是怎樣的?

    答:由於沒有研究過udev的源程式,不敢貿然就說udev的工作過程。我只是透過一些網上的資料和udev的說明文件,大致猜測它的工作過程可能是這樣的。

     1. 當核心檢測到在系統中出現了新裝置後,核心會在sysfs檔案系統中為該新裝置生成一項新的記錄,一般sysfs檔案系統會被 mount到 /sys目錄中。新記錄是以一個或多個檔案或目錄的方式來表示。每個檔案都包含有特定的資訊。(資訊是如何表述的,還要另外研究?)

     2. udev在系統中是以守護程式的方式udevd在執行,它透過某種途徑(到底什麼途徑,目前還沒搞懂。)檢測到新裝置的出現,透過查詢裝置對應的sysfs中的記錄得到裝置的一些資訊。

     3. udev 會根據/etc/udev/udev.conf檔案中的udev_rules指定的目錄,逐個檢查該目錄下的檔案,這個目錄下的檔案都是針對某類或某個裝置應該施行什麼措施的規則檔案。udev讀取檔案是按照檔名的ASCII字母順序來讀取的,如果udev一旦找到了與新加入的裝置匹配的規則,udev 就會根據規則定義的措施對新裝置進行配置。同時不再讀後續的規則檔案。

    問:udev的規則檔案的語法是怎樣的?

    答:udev的規則檔案以行為單位,以"#"開頭的行代表註釋行。其餘的每一行代表一個規則。每個規則分成一個或多個“匹配”和“賦值”部分。“匹配”部分用“匹配“專用的關鍵字來表示,相應的“賦值”部分用“賦值”專用的關鍵字來表示。“匹配”關鍵字包括:ACTION,KERNEL,BUS, SYSFS等等,“賦值”關鍵字包括:NAME,SYMLINK,OWNER等等。具體詳細的描述可以閱讀udev的man文件。

     下面舉個例子來說明一下,有這樣一條規則:

    SUBSYSTEM=="net", ACTION=="add", SYSFS{address}=="00:0d:87:f6:59:f3", IMPORT="/sbin/rename_netiface %k eth0"

     這個規則中的“匹配”部分有三項,分別是SUBSYSTEM,ACTION和SYSFS。而"賦值"部分有一項,是IMPORT。這個規則就是說,當系統中出現的新硬體屬於net子系統範疇,系統對該硬體採取的動作是加入這個硬體,且這個硬體在SYSFS檔案系統中的“address”資訊等於“00: 0d..."時,對這個硬體在udev層次施行的動作是呼叫外部程式/sbin/rename_netiface,傳遞的引數有兩個,一個是“%k”,代表核心對該新裝置定義的名稱。另一個是”eth0“。

     從上面這個例子中可以看出,udev的規則的寫法比較靈活的,尤其在“匹配”部分中,可以透過諸如”*“, ”?“,[a-c],[1-9]等shell萬用字元來靈活匹配多個匹配項。具體的語法可以參考udev的man文件。

    問:udev怎樣做到不管裝置連線的順序而維持一個統一的裝置名?

    答:實際上,udev是透過對核心產生的裝置名增加別名的方式來達到上述目的的。前面說過,udev是使用者模式程式,不會更改核心的行為。因此,核心依然會我行我素地產生裝置名如sda,sdb等。但是,udev可以根據裝置的其他資訊如匯流排(bus),生產商(vendor)等不同來區分不同的裝置,併產生裝置檔案。udev只要為這個裝置檔案取一個固定的檔名就可以解決這個問題。在後續對裝置的操作中,只要引用新的裝置名就可以了。但為了保證最大限度的相容,一般來說,新裝置名總是作為一個對核心自動產生的裝置名的符號連結(link)來使用的。

     例如:核心產生了sda裝置名,而根據資訊,這個裝置對應於是我的內建硬碟,那我就可以制定udev規則,讓udev除了產生/dev/sda裝置檔案外,另外建立一個符號連結叫/dev/internalHD。這樣,我在fstab檔案中,就可以用/dev/internalHD來代替原來的 /dev/sda了。下次,由於某些原因,這個硬碟在核心中變成了sdb裝置名了,那也不用著急,udev還會自動產生/dev/internalHD這個連結,並指向正確的/dev/sdb裝置。所有其他的檔案像fstab等都不用修改。

    問:怎樣才能找到這些裝置資訊,並把他們放到udev的規則檔案中來匹配呢?

    答:這個問題比較難,網上資料不多,我只找到一篇文章來介紹如何寫udev的規則。他的基本方法是透過udevinfo這個實用程式來找到那些可以作為規則檔案裡的匹配項的專案。有這樣兩種情況可以使用這個工具:

     第一種情況是,當你把裝置插入系統後,系統為裝置產生了裝置名(如/dev/sda)。那樣的話,你先用udevinfo -q path -n /dev/sda,命令會產生一個該裝置名對應的在sysfs下的路徑,如/block/sda。然後,你再用udevinfo -a -p /sys/block/sda,這個命令會顯示一堆資訊,資訊分成很多塊。這些資訊實際來自於作業系統維護的sysfs連結串列,不同的塊對應不同的路徑。你就可以用這些資訊來作為udev規則檔案中的匹配項。但需要注意的是,同一個規則只能使用同一塊中顯示的資訊,不能跨塊書寫規則。

     第二種情況是,不知道系統產生的裝置名,那就只有到/sys目錄下去逐個目錄查詢了,反覆用udevinfo -a -p /sys/path...這個命令看資訊,如果對應的資訊是這個裝置的,那就恭喜你。否則就再換個目錄。當然,在這種情況下,成功的可能性比較小。

    ----------------------------------------------------------------------------------

    Udev (簡體中文)

    From ArchWiki

    Jump to: navigation, search

    i18n

    English

    Русский

    繁體中文

    簡體中文

    注意: 如果您是從DevFS升級到Udev, 請檢視 DevFS to Udev.

    這篇文件將介紹udev的一些新的變化。從084版開始,udev能夠代替hotplug和coldplug的所有功能。正因為這樣,hotplug包已經從Arch倉庫中去掉了。

    Contents

    [hide]

     * 1 重要提示

     * 2 基本需求

     * 3 最近更新

     * 4 模組禁用列表

     * 5 load_modules: 有用的啟動引數

     * 6 已知的硬體問題

     * 7 自動載入帶來的一些問題

     o 7.1 CPUFreq模組

     o 7.2 聲音問題和一些不能自動載入的模組

     o 7.3 多個同型別裝置(網路卡,音效卡)每次啟動的都不同

     * 8 自己編譯核心造成的一些已知問題

     o 8.1 Udev無法啟動

     o 8.2 CD/DVD符號和許可權錯誤

     * 9 Udev小竅門

     o 9.1 自動載入usb裝置

    重要提示

    ...切記,在使用udev載入任何modules(核心模組)之前(無論是否是啟動時自動載入),您必須在/etc/rc.conf將MOD_AUTOLOAD選項設定為yes ,否則您必須手動載入這些modules。您可以修改rc.conf中的MODULES或者使用modprobe命令來手動載入您所需要的modules。另一種方法是用hwdetect --modules生成系統硬體的modules列表,然後將這個列表新增到rc.conf中讓系統啟動時自動載入這些modules。

    基本需求

     * 核心: 2.6.15或更高版本。

     * 您將無法在fstab和bootloader設定中再使用DevFS格式的裝置名稱! 更多相關內容請檢視DevFS to Udev。

    最近更新

     * startudev程式被取出。如果需要重新載入udev規則請使用 /etc/start_udev。

     * Udev代替了hotplug和hwdetect的功能。同時我們儲存了hwdetect,並且只在 mkinitrd程式生成initrd的時候用到。

     * Udev可以同時載入多個模組,這樣可以加快啟動速度,然而,這樣做的結果是她不能保證每次載入的順序,所以當你使用多音效卡或網路卡的時候就會出現問題,這個問題下面將會再討論。

    模組禁用列表

    udev也會犯錯或載入錯誤的模組。為了防止錯誤的發生,你可以使用模組禁用列表 。一旦加入該列表的模組,無論是啟動時,或者時執行時(如usb硬碟等)udev都不會載入這些模組。

    只需在您在 rc.conf的MODULES中對應模組前加上感嘆號(!)就可禁用該模組。

    例如,

    MODULES=(!moduleA !moduleB)

    load_modules: 有用的啟動引數

    如果您在核心啟動引數中加入load_modules=off,那麼udev會停止任何自動載入工作. 如果系統出現問題時,這個功能會十分有用。如果udev載入了有問題的模組導致系統掛起或者其它嚴重的問題時,你可以使用這個引數來禁用自動載入,以此來防止載入有問題的模組。

    已知的硬體問題

    - BusLogic裝置被損壞而且導致啟動時當機。

     這是一個核心的Bug目前還沒有修正。

    - PCMCIA讀卡器被認為是可移除裝置.

     把它們加入到/etc/pmount.allow中,使用hal的pmount來讀取

    自動載入帶來的一些問題

     CPUFreq模組

    我門還沒有找到一個很好的方法載入不同的CPUFreq控制器,所以我們把從自動載入程式裡把它去掉了。如果您需要測量CPU頻率,你必須在rc.conf的MODULES佇列中顯式的加入合適的模組。

     聲音問題和一些不能自動載入的模組

    一些使用者跟蹤發現問題出在/etc/modprobe.conf中一些舊的部分,試著去掉這些舊的部分再試試看。

     多個同型別裝置(網路卡,音效卡)每次啟動的都不同

    因為udev同時載入所有模組,所以一些裝置可能初始化順序不同。例如同時有兩個網路卡時,它們總是在eth0和eth1之間變來變去。

    常用的解決辦法是在您的rc.conf檔案中透過修改MODULES佇列來指明順序。這個佇列裡的模組將在udev自動載入之前由系統載入,因此您可以控制模組在啟動時載入順序。

    # 在e100之前載入8139too

    MODULES=(8139too e100)

    另一個解決網路卡的方法是使用udev-sanctified方法為每個網路卡靜態命名。建立檔案/etc/udev/rules.d/10-network.rules然後將不同的網路卡透過MAC地址繫結到不同的名字上:

    SUBSYSTEM=="net", SYSFS{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0"

    SUBSYSTEM=="net", SYSFS{address}=="ff:ee:dd:cc:bb:aa", NAME="wlan0"

    同時,您需要注意以下內容:

     * 您可以透過下面的命令獲得網路卡的MAC地址:: udevinfo -a -p /sys/class/net/

     * 注意在udev規則檔案中使用小寫的16進位制MAC地址,因為udev無法識別大寫的MAC地址。

     * 一些使用者在使用舊的命名方式時出現問題,例如: eth0, eth1, 等等. 如果出現這個問題,試試使用 "lan"或者"wlan"之類的名字.

    注意不要忘記修改您的/dec/rc.conf和其它使用ethX命名的配置檔案。

    

    自己編譯核心造成的一些已知問題

     Udev無法啟動

    請確定您的核心版本大於或等於2.6.15。較早的核心沒有udev自動裝載所需要的uevent功能。

     CD/DVD符號和許可權錯誤

    如果您使用2.6.15的核心的話,您需要安裝ABS的uevent補丁(它從2.6.16核心中抽取了一些uevent功能)。您可以使用abs命令來同步ABS樹,然後您就可以在/var/abs/kernels/kernel26/下找到abs補丁。

    Udev小竅門

    自動載入usb裝置

    KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usb%m", GROUP="users", PTIONS="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 -o rw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /mnt/usb%n", PTIONS="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", PTIONS="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", PTIONS="last_rule"

    把這些udev規則放到/etc/udev/rules.d/下任何一個檔名以.rules結尾的檔案中,例如/etc/udev/rules.d/sda.rules。

    如果想同時建立/media到/mnt符號連線,可以使用下面的版本:

    KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usbhd-%k", GROUP="users", PTIONS="last_rule"

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

    ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /media/usbhd-%k"

    ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/ln -s /media/usbhd-%k /mnt/usbhd-%k"

    ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /media/usbhd-%k", PTIONS="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 /media/usbhd-%k", PTIONS="last_rule"

    ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rm -f /mnt/usbhd-%k"

    ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /media/usbhd-%k"

    ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /media/usbhd-%k", PTIONS="last_rule"

    注意!如果你是用的其它的固定裝置(例如SA他的硬碟,您可以從/etc/fstab中檢視)被識別為/dev/sdX,您必須從sd[a-z] 中去掉你的那個sdX。例如,如果您的SATA硬碟被是識別為/dev/sda,您就需要把所有的“sd[a-z]”替換成“sd[b-z]”。在規則檔案的檔名前加上數字(如:010.udev.rules)是個很好的主意,這樣udev在讀取標準規則前,將會讀取這個規則檔案。這些規則設定後不需要修改/etc/fstab檔案。請檢視mount命令的引數來修改許可權等特性(您可以從論壇搜尋檢視mount命令的引數,然後根據您的需要修改它們)。

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

相關文章