如何為未命名/非設備掛載分配次要設備編號(主要編號 0)?
我通常會了解給定設備的整個主要/次要設備號是如何工作的(儘管如果我不在這裡,請糾正我),以及主要設備號本質上與一類設備的關係(即塊設備)或字元設備/特殊字元),而次要編號與該設備下的特定類型有關。從這個數字,核心能夠確定它需要使用什麼設備驅動程序來與該設備互動。在文件系統級別,設備編號儲存在 inode stat 結構中,因此當您以使用者身份統計文件時,它將以 2 字節值的形式返回設備 ID,其中高字節和低字節代表主要和次要號碼分別。stat 結構有 2 個用於以這種形式指定設備 ID 的成員 - st_dev 和 st_rdev,
但是,如果文件是非設備掛載、特殊字元或其他文件,則 st_dev 中的主要編號將設置為 0,次要編號將設置為某個值,而 st_rdev 可能會或可能不會填充設備類型(取決於各自的文件系統是否實現了這一點)。所以我的問題是,在這種情況下,次要設備號是由什麼填充的,它如何知道要使用什麼值/為什麼要使用它所做的值?
例如
stat /etc/passwd
=> Device: 801h, with no “Device Type” set – 這是預期的主要數字 8 與 SCSI 設備有關,次要數字 1 與此文件的第一個分區 (sda1) 有關
stat /dev/sda1
=> 設備:6h,設備類型:8,1 – 這裡設備 (st_dev) 的主編號為 0(這是預期的)和次編號為 6 - 為什麼是 6?
stat /dev/null
– 再次,次要版本 6
stat /proc/version
– 小版本 4我錯過了什麼?
我意識到我在這裡引用了結構,這個問題可能更好地放在堆棧溢出中,但我覺得它更像是一個低級別的 Linux 問題,而不是明確的開發問題 - 不過很高興重新定位它。
在我的系統上,
/proc
is6h
和/dev
is5h
。快速測試:
# for x in a b c d e f g h i j; do mkdir $x; mount -t tmpfs tmpfs $x; done # stat */.
33h
給數字3dh
加上35h
中間的缺失(它被 使用過/run/user/1000/gvfs
)。似乎只是在掛載時使用第一個空閒編號的動態分配。請注意,這些數字會被重用,因此至少在這種情況下,您不能可靠地使用它
st_dev
來檢測某個路徑上的文件系統是否發生了變化。