如何在不循環的情況下對常規文件中的磁碟區進行分區?

如何在不循環的情況下對常規文件中的磁碟區進行分區?

我正在嘗試進行作業系統開發,我從引導程式開始,其中階段 0 從 ext4 分割區(由第一個 LBA 指定)上的檔案(由 inode 指定)載入階段 1。當然,我需要一些東西來啟動,所以我抓住了 QEMU。怎麼辦?

到目前為止效果很好的是:

truncate -s64M /tmp/SomeVolume
/sbin/mke2fs -t ext4 -F /tmp/SomeVolume
yasm phase0.asm
dd if=phase0 of=/tmp/SomeVolume conv=notrunc

我製作了大約 64 MB 的捲,將其格式化為 ext4,並用 Phase0 覆蓋前 1024 個八位元組(其大小始終為 1024 位元組)。這很好用。

但現在我想製作一個正確分區的文件,以測試它是否適用於更現實的場景。我知道我可以使用/sbin/cfdisk我的捲文件,但mke2fs沒有參數可以讓我在文件中選擇跨度。

現在我知道了使用循環的解決方案,但不幸的是,它似乎對我不起作用(似乎我無法max_part在 Debian jessie 中進行更改)。似乎有另一個模組稱為nbd,但我沒有安裝該模組的伺服器和客戶端。而且我需要 root 權限來完成一些顯然可以在使用者空間中完成的事情,這有點荒謬。

作為用戶我該如何執行此操作?或者我應該圍繞我創建的 ext4 格式的文件建立 MBR/GPT 分區卷?

答案1

路途遙遠。但為了它的樂趣:

1.建立臨時映像:

    $ truncate -s64MiB tmp.img

2.使用以下命令建立兩個分區fdisk

比較詳細,但是還可以。

$ fdisk tmp.img

第一個分區:

: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>

第二個分區:

: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)

列印我們要寫的內容:

: x
: p
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 00  32  33    0  57  52    5       2048      81920 83
 2 00  57  53    5  40  32    8      83968      47104 83

寫入並退出:

:w (Dont! forget ;-) )

我們有兩個 40 MiB 和 23 MiB 的分區:

81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB

3.建立兩個檔案系統:

truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img

4.將它們全部縫合在一起:

2048*512從臨時圖像中提取第一個位元組:

dd if=tmp.img of=disk.img bs=512 count=2048

將它們結合起來:

cat ext4.img ext3.img >> disk.img

美好的。

答案2

我不太確定我是否正確理解了你的問題。如果您嘗試對 VM 映像進行分割區,您有多種選擇:

  1. 對每個分區使用線性模式下的循環或裝置映射器。您不需要同時進行這些設定來進行格式化;

  2. 部分/克帕特克斯告訴內核它應該在循環/設備映射器設備甚至常規文件上考慮哪些分區:

    kpartx -av /path/to/file
    

    或者

    losetup /dev/loopX /path/to/file
    kpartx -av /dev/loopX
    

    這些設備是設備映射器設備(即/dev/mapper預設連結到 from)。

  3. 使用partprobe

    losetup /dev/loopX /path/to/file
    partprobe /dev/loopX
    

    這將指示內核檢查分區,從而創建/dev/loopXpY.

  4. 在虛擬機器中啟動 Live CD/USB 映像(可以是安裝程式)並從內部進行分割。這具有明顯的優勢,即使對於以特殊格式儲存的 VM 映像(例如 QEMU 的 qcow2)也能夠對虛擬磁碟機進行分割。

答案3

http://blog.lifebloodnetworks.com/?p=934

好像有這方面的一些資料。看起來您可以將原始磁碟安裝為環回設備:

將原始磁碟映像掛載為環回裝置:losetup /dev/loop0 [path to image]

運行 kpartx 並:kpartx -va /dev/loop0

這會將您的分割區新增至 /dev/mapper/loop0pX,其中每個 X 都是不同的分割區

現在您可以掛載每個分割區:mount /dev/mapper/loop0pX /media/partition

如果您想確保不將備份寫入任何內容,只需將其掛載為唯讀即可:mount -o ro /dev/mapper/loop0pX /media/partition

完成後,您需要進行清理。

卸載:umount /media/partition 刪除映射器設備:kpartx -d /dev/loop0 刪除環回設備:losetup -d /dev/loop0

這些命令可能都需要以 root 身分執行。如果loop0報告它正忙,只需選擇另一個循環設備(/dev/loop1等)。

-編輯:我看到你想在非 root 的情況下執行此操作,因此上述內容可能對你沒有用。

答案4

你不需要搞亂 max_part。用於parted在循環設備上建立分區,或partprobe啟動它們(如果它們已存在)。您可能需要升級到測試/不穩定的parted版本。

相關內容