Linux

使用 /dev/ramX 作為它們對應的特殊設備?

  • January 7, 2018

使用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 和可以無限寫入它。

然後我嘗試了其他rams,但更令人驚訝的是,它們的行為都相同。/dev/ram8不會像/dev/randomdo 那樣生成隨機的東西,/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 文件需要包含幾個特定於您的系統的設置。)

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