使用 /dev/ramX 作為它們對應的特殊設備?
使用
ls -l
,我發現了一系列設備ram0
,例如ram1
等。我仔細查看了輸出並(例如)brw------- 1 root root 1, 3 Jan 6 11:34 /dev/ram3 crw-rw-rw- 1 root root 1, 3 Jul 15 1970 /dev/null
嗯,它們僅因設備類型(塊和字元)而異。我嘗試讀取和寫入
ram3
,但令我驚訝的是,我可以從中讀取一個 8 MiB 的零字節塊,並且我不能寫入超過 8 MiB 的內容,因為我認為我可以在讀取時立即收到 EOF 和可以無限寫入它。然後我嘗試了其他
ram
s,但更令人驚訝的是,它們的行為都相同。/dev/ram8
不會像/dev/random
do 那樣生成隨機的東西,/dev/ram7
不會像/dev/full
…一樣報告“磁碟已滿”然後我嘗試
mknod
了工作目錄中的所有內容(掛載類型:ext4),結果相同:字元設備的行為/dev/null,full,zero,random
與塊設備相同/dev/ramX
於是我開始疑惑:
- 與使用相同的設備編號有何
/dev/ramX
不同?/dev/<device>
- 如何解釋這些塊設備的讀取時 8 MiB 空的東西(全為零)和 8 MiB 寫入限制?
我想答案應該適用於所有 Linux 核心系統。
(旁注:8 MB = 8,000,000 字節,8 MiB = 8,388,608 字節)
塊設備與字元設備完全分開。設備主要/次要編號相等的事實根本沒有任何意義:您可以將塊/字元設備位視為設備編號中額外的最高有效位。
從概念上講,設備號是核心設備大表的索引。從歷史上看,曾經有一個表用於字元設備,而另一個表用於塊設備。我認為 Linus Torvalds 認為這種劃分只是一個歷史產物,最終可能希望將塊/字元設備位視為設備號的額外二進制數字。但就目前而言,一些舊軟體假定任何類 Unix 系統都有塊設備和字元設備,並且它們的性質根本不同,因此這種舊設計的一些表象將保留下來。
這些
/dev/ram*
設備是在核心配置中使用CONFIG_BLK_DEV_RAM*
編譯時選項定義的:
- CONFIG_BLK_DEV_RAM 確定這些設備是內置在核心中、編譯為模組 (
brd.ko
) 還是完全省略。Debian 9 將其作為一個模組。- CONFIG_BLK_DEV_RAM_COUNT 確定要創建的 /dev/ram* 設備的數量。核心“出廠預設值”是 16 個設備。
- CONFIG_BLK_DEV_RAM_SIZE 將定義每個 /dev/ram* 設備的大小:核心“出廠預設值”是每個設備 4 MiB,Debian 9 使用 16 MiB。您的發行版顯然使用了 8 MiB。
如果 RAM 盤驅動程序編譯為核心模組,則可以
/dev/ram*
通過模組參數修改設備的數量和大小。這些
/dev/ram*
設備通常由 Linux 安裝程序等使用,以允許在沒有可用的真實磁碟時設置與正常系統相當相似的東西。它們是基於 RAM 的塊設備,因此它們的行為通常類似於磁碟:它們的大小是有限的,您可以在它們上創建文件系統。您可以在它們上創建一個分區表,但沒有為 RAM 磁碟分區分配標准設備號。如果您需要一個已分區的 RAM 磁碟,您可以使用該
kpartx
命令輕鬆解決此問題:生成的分區設備/dev/ramX
通常命名為/dev/mapper/ramXpY
. 顯然,您儲存在/dev/ram*
設備上的任何內容都會在重新啟動或斷電時失去 - 或者在您解除安裝brd.ko
模組時(如果適用)。我認為某些發行版(曾經?)
/dev/ram*
在創建 initramfs/initrd 時會使用這些設備。(每當安裝新的核心包時,通常會自動為其創建一個新的 initramfs 文件。它不能預先打包,因為 initramfs 文件需要包含幾個特定於您的系統的設置。)