udev(四) 裝置的命名問題

2021-05-23 11:58:10 字數 2140 閱讀 5831

二、裝置的命名問題

我們來看下系統對裝置的命名有什麼問題。舉個大家經常遇到的問題來說,例如你有

2個usb行動硬碟,那麼當你插入第

1個usb行動硬碟時,這個行動硬碟就有可能命名了

/dev/sdb(假設你的

/dev/sda是系統裡的

sata硬碟)。當你再插入第

2個usb行動硬碟時,這個行動硬碟就有可能命名為

/dev/sdc了。但是,當你重啟系統的時候,你可以保證

/dev/sdb就是你前面的第乙個行動硬碟嗎,這個很難說,這個有時候是,有時候不是,這要看你插在哪個

usb介面。

一般,當我們將乙個裝置加入系統的時候,我們的系統就會為這個裝置所屬的型別找到下乙個可用的主次裝置號(這個主次裝置號是有對應的固定的名稱的,前面已經看到)。例如我們的第乙個

usb行動硬碟的主次裝置號是

8:16(

/dev/sdb),那麼我們再插入第二個

usb行動硬碟時,那麼就會分配下個可用的主次裝置號即是

8:32(

/dev/sdc)給第二個

usb行動硬碟。

對於其它的可以熱插拔的裝置來說,也存在這些類似的情況。 在

linux的

2.5核心後,增加進來了

sysfs,使得我們可以容易辨別哪個裝置名(或主次裝置號)對應的是哪個裝置。對於硬碟,你可以執行:

sudo hdparm -i /dev/sda

下面使我的電腦的輸出:

可以看到我的是

maxtor生產的,序列號是

5ry0g1pt。根據上面的資訊,我們可以確定乙個裝置。

三、主次裝置號的限制

在linux系統中,是用

8位(即乙個位元組)來表示主裝置號和次裝置號的,即是說主次裝置號的範圍都是

0到255。隨著新裝置的增加,可用的主裝置號就會變得越來越少(塊裝置和字裝置可共用乙個主裝置號,系統會區別對待它們)。

但是,如有人需要大量的裝置,那麼這些裝置號就有可能不夠用了。舉例來說,有乙個廠商,他的系統需要

4000個硬碟。而系統呢,我們前面看到過那個定義表,系統只為每個硬碟保留

16個次裝置號,這就限制了每個硬碟只有

16個分割槽。如果

4000個硬碟,每個硬碟

16個分割槽的話,那麼就有

64000個分割槽,而系統裡只保留

16個硬碟每個硬碟

16個分割槽,總共也只能表示

16*16=

256個分割槽,即是說

64000個分割槽就得需要

64000/256=

250個主裝置號。如果我們不算其它的裝置,那麼乙個位元組(

8位)可以表示

256個主裝置號,那麼應該是夠用的,但是前面也說過了,其它的裝置號都是有保留的,都是保留給其它的裝置使用了,我們的磁碟系統不能夠去占用其它系統的主裝置號。如果我們非得要占用,那麼使用者空間必須要知道被保留的主裝置號被當前的磁碟系統給占用了。

由於這個限制呢,很多人都要求擴大表示主次裝置號的位元組數,這樣就可以表示更多的裝置。然而最大的問題仍然是:怎麼通知使用者空間,哪個主次裝置號已經被使用了。

即 使擴充了主次裝置號的表示數量,要求為不同的系統保留乙個範圍的主次裝置號仍然存在,以後仍然會要求擴大主次裝置號的表示數量。這就要求我們必須有一種外 部的命名機制,即使將來我們用完了這些主次裝置號。就是這樣,如果我們的核心可以只為那些連線到系統裡的裝置動態的分配主次裝置號,那麼我們要求的固定的 主次裝置號也不是必需的,因而我們的主次裝置號也不會用完。但這又是剛才我在上面提到的那個問題,就是使用者空間根本不知道哪個裝置被分配了哪個主次裝置號 (就是

sdb和

sdc到底代表的是哪個裝置)。

很少核心會去分配次裝置號的,在

2.2核心後,

usb的子系統會為

usb裝置分配次裝置號,但最大的問題還是哪個裝置被分配了哪個裝置號,乙個方案是檢視系統的核心日誌來確定。在

2.5核心加入

sysfs後,這個問題就變得容易了。

參考文章:《udev – a userspace implementation of devfs》

ROS下的相同ID裝置udev配置問題

首先說一下當裝置id不同時,怎麼配置rules。在ubuntu下繫結usb串列埠的幾種方式 udev規則檔案的寫法 特別指出 在下面的rules中 kernel ttyusb attrs 0403 attrs 6001 mode 0666 symlink laser 結尾的symlink laser...

利用UDEV機制固定儲存裝置的名稱

什麼是udev udev為一些實際的裝置提供了乙個動態的裝置目錄,這些目錄裡包含這些實際裝置所對應的檔案。它建立或移除在 dev目錄裡的裝置節點檔案,或者重新命名網路介面。通常udev執行udevd,如果乙個裝置增加進系統或者從系統中移除,它就會直接從核心中接受到這個udev的事件。如果udev接受...

udev(九) 寫個程式檢測我們的裝置插拔

在這個教程裡我將寫乙個程式,其作用是檢測系統的裝置插拔事件,當有裝置插入 系統時,就可以檢測到這個裝置並把裝置的資訊顯示出來,如果裝置從系統裡移除,也同樣可以檢測出來,並移除裝置。這個 是參考了udev 139的原始碼 的,如果讀者有興趣也可以參考udev的原始碼。其中在udev 139 中有個小小...