Mdev

Linux在開機時,會花一點時間去建立『/dev/』底下的所有裝置節點,但是在嵌入式系統裏面,開機以後希望愈快進入穩定的前提之下,不太可能浪費太多資源。所以在busy box底下,有一個『mini udev』簡稱就mdev的系統就因應而生。

mdev有兩個主要的功能,『初始化所有的裝置』和『動態更新裝置檔』,兩個都需要kernel裏面sysfs的支持,且必須要先掛載到/sys上。如果你要使用動態更新裝置的話,還必須勾選kernel上面的「hotplugging」。

所以就是一定要先掛載『/sys』和『/proc』,然後告訴kernel去執行/sbin/mdev,這樣不管何時,只要一個裝置被新增或移除以後,相對應的裝置節點就會被建立或銷毀。所以你就會看到在系統開機時,所有的裝置節點都會出現在/dev底下了。

-MDEV Config

通常對於裝置節點,系統的預設都是660,但是Mdev可以使用選擇性的組態檔(/etc/mdev.conf)來控制裝置節點的權限和擁有者。組態的格式如下:

[-][envmatch]< device regex> < uid>:< gid> < permissions>
or
[envmatch]@< maj[,min1[-min2]]> < uid>:< gid> < permissions>
or
$envvar=< regex> < uid>:< gid> < permissions>

舉例來說:

hd[ a-z][0-9] * 0:3 660

上面的: hd代表 device
[a-z][0-9]*就是代表 regex
0代表 uid
3代表 gid
660 當然就是代表 permission

系統在分析組態檔,會停在第一個符合條件的那一行,如果沒有任何一行是符合條件的話,所有的裝置節點都會背設定成預設0:0 660。如果你不想要讓你的所有裝置節點預設是0:0 660的話,就只要加入底下這一行,就可以將所有裝置的預設都改變了:

.* 1:1 777


如果你想要移動裝置節點或是對其重新命名,就可以使用底下的語法:

< device regex> < uid>:< gid> < permissions> [=path]

如果你想要將你的裝置節點移到子目錄下(/dev/sub_folder/),則要確保背後加一個『/』,而如果你要改掉裝置節點的名字,就直接把要改的名字放到[=path]這邊。

ex.

hda 0:3 660 =drives/

上面這一行會將『hda』移到『drivers』底下去。

hdb 0:3 660 =cdrom

上面這一行則會將『hdb』改名成『cdrom』

如果是底下的語法:

< device regex> < uid>:< gid> < permissions> [>path]

他除了像上面一樣可以移動或改裝置節點的名字外,他還會建立一個裝置檔的連結在/dev/底下。


如果想要防止某些裝置節點背建立的話,可以在第四個欄位上加個「!」
ex.

tty[a-z]. 0:0 660 !
pty[a-z]. 0:0 660 !


如果你想要允許系統可以執行你專有的命令的話,可以使用以下格式:

< device regex> < uid>:< gid> < permissions>[=path] [@|$|*< command>]

or

< device regex> < uid>:< gid> < permissions> [>path] [@|$|*< command>]

or

< device regex> < uid>:< gid> < permissions> [!] [@|$|*< command>]

ex.

block devices
([hs]d[a-z]) root:disk 660 >disk/%1/0
([hs]d[a-z])([0-9]+) root:disk 660 >disk/%1/%2
mmcblk([0-9]+) root:disk 660 >disk/mmc/%1/0
mmcblk([0-9]+)p([0-9]+) root:disk 660 >disk/mmc/%1/%2

#etwork devices
(tun|tap) root:network 660 >net/%1

面那3個特殊符號『@』,『$』,『*』 的意思如下: 『@』 → 建立裝置以後在執行這命令。
『$』 → 移除這個裝置之前執行這個命命。
『*』 →建立時和刪除前執行這個命令。

這些命令都是經由system()函數去執行的(意思就是你是直接經由shell去下指令的),所以要確保在『/bin/sh』底下有安裝shell。

mdev會將『$MDEV』設定成裝置的名稱,所以就是如果你現在有一個裝置『hdc』符合的話,那『$MDEV』就會被設定成『hdc』


- 軔體

有些kernel的裝置驅動程式,需要在執行期時向軔體送出請求,才能初始化某些裝置。將所有類似的軔體放到『/lib/firmware/』底下。在執行期時,kernel將會呼叫mdev,然後mdev會在從『/lib/firmware』底下讀出所有的軔體檔名,並且經由『sysfs』介面送回kernel裏面。那些檔明都是寫死『hardcode』在kernel裏面的,所以如果你想知道如何在使用者空間裡面去命名這些檔案的話,可以去kernel裏面看一下。


- 開機列舉

在開機時,我們就要去列舉出所有的裝置,並且在「/dev」底下建立裝置節點。為了完成這些列舉,所以我們必須修改/etc/init.d/rcS底下的腳本(每個系統都不一樣,所以要注意一下你用的系統的init.d在哪裡),才能先掛載tmpfs檔案系統到「/dev/」底下。並且要記得在開機腳本底下去將usb的驅動程式給安裝進來:

modprobe usbstorage

這步驟完了以後,就要去執行
mdev -s


對於mdev,很簡單的規類底下幾個要點。

  1. 必須掛載「/proc」和「/sys」

  2. 必須允許偵測熱差拔。

    echo /sbin/mdev > /proc/sys/kernel/hotplug

  3. 必須將/dev掛載成tmpfs。

    mount -t tmpfs mdev /dev

  4. 透過mdev -s在開機時將所有裝置節點建立出來。

  5. 如果要客制化自己的組態,請修改「/etc/mdev.conf」。