Linux

在 RAM 中創建塊設備

  • September 5, 2021

我的日常任務之一是使用我們的軟體創建 USB 筆式驅動器的可啟動映像。映像必須包含兩個分區,第一個使用 FAT32 格式化,第二個使用 EXT3。首先,我們將 Linux 核心和一個小的啟動腳本,引導載入程序放在我們要啟動的設備上,並在啟動時讀取。

在第二個分區上,我們放置了我們的 rootfs。

現在,我是這樣做的:

  1. 將 USB pendrive 插入我的 Linux comp。找出它的設備文件(這裡假設 /dev/sdx)
  2. 將它的前 600 MB 清零: dd if=/dev/zero of=/dev/sdx bs=1M count=600
  3. 創建兩個分區,第一個 10 MB 和第二個 500 MB: sfdisk /dev/sdx –unit S << EOF ,20000,c ,1000000,83 EOF

mkfs.vfat/dev/sdx1 mkfs.ext3/dev/sdx2

(假設扇區大小為 512 字節!)

  1. 將核心和啟動腳本複製到 /dev/sdx1
  2. 將預編譯的 RootFS 解壓到 /dev/sdx2
  3. 將現成的映像從 USB pendrive 複製回我們的 HDD:dd if=/dev/sdx of=usb.img bs=1M count=520
  4. 將其壓縮並發送給測試此軟體的人。
  5. 然後人們解壓縮,用 dd if=usb.img of=/dev/sdx 快閃記憶體他們的 USB 磁碟插入他們的設備並進行測試。

現在,所有這些都有效。明顯的改進是創建一個可以自動完成這一切的腳本。這也可以完成,但仍然需要一個手動步驟:插入 USB 隨身碟。

我在想,我們可以在 RAM 中使用塊設備,而不是實際的 USB 磁碟。這樣不僅省去了手動插入U盤的步驟,而且速度也更快。

所以我需要的是 RAM 中的普通塊設備。一個可以像物理 USB pendrive 一樣分成多個分區的分區。

我剛剛研究了這個話題,似乎唯一的選擇是

  1. tmpfs 和 ramfs,這顯然不適合我
  2. ramdisk 和“brd”核心模組,在載入時會創建許多“分區”:/dev/ram$$ 0-15 $$

並且它們中的每一個都可以單獨格式化和使用,但就像我說的 - 我想要一個普通的塊設備在 RAM 中,然後我自己將它分成 10MB 和 500MB 的兩個分區,然後我可以從那裡 dd 圖像到我的硬碟上的文件。

我有哪些選擇?

只需使用 brd 並創建一個 brd 設備 (ram0)。使用該設備代替您的 USB 驅動器。您可以使用 sfdisk 對其進行分區,使用分區,然後使用 dd 將其內容轉儲到文件中。

無需為每個 brd 設備使用一個文件系統。

或者(雖然有點 hacky)你可以使用 tmpfs,創建圖像文件並將其用作循環設備。這可能是完成你想要的最簡單的方法。作為獎勵,您已準備好該圖像並可以立即上傳。不需要dd。

# Create mountpoint for tmpfs
mkdir /tmp/tmpfs
# Mount tmpfs there
mount -t tmpfs none /tmp/tmpfs
# Create empty file of 600MB 
# (it creates 599MB hole, so it does not 
#  consume more memory than needed)
dd if=/dev/zero of=/tmp/tmpfs/img.bin bs=1M seek=599 count=1
# Partition the image file
cfdisk /tmp/tmpfs/img.bin 
# Create loop block device of it (-P makes kernel look for partitions)
losetup -P /dev/loop0 /tmp/tmpfs/img.bin 
# Create filesystems
mkfs.vfat /dev/loop0p1 
mkfs.ext4 /dev/loop0p2
# Now it's your turn:
#   mount loop0p1 and loop0p2 and copy whatever you want and unmount it
# detach the loop device
losetup -d /dev/loop0
# May i present you with your image ... 
ls -al /tmp/tmpfs/img.bin

修改以滿足您的需求。

引用自:https://serverfault.com/questions/714690