Linux

如何為未命名/非設備掛載分配次要設備編號(主要編號 0)?

  • July 6, 2020

我通常會了解給定設備的整個主要/次要設備號是如何工作的(儘管如果我不在這裡,請糾正我),以及主要設備號本質上與一類設備的關係(即塊設備)或字元設備/特殊字元),而次要編號與該設備下的特定類型有關。從這個數字,核心能夠確定它需要使用什麼設備驅動程序來與該設備互動。在文件系統級別,設備編號儲存在 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 問題,而不是明確的開發問題 - 不過很高興重新定位它。

在我的系統上,/procis6h/devis 5h

快速測試:

# 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來檢測某個路徑上的文件系統是否發生了變化。

引用自:https://unix.stackexchange.com/questions/597020