如何在不循环的情况下对常规文件中的卷进行分区?

如何在不循环的情况下对常规文件中的卷进行分区?

我正在尝试进行操作系统开发,我从引导加载程序开始,其中阶段 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. 在虚拟机中启动实时 CD/USB 映像(可以是安装程序)并从内部进行分区。这具有明显的优势,即使对于以特殊格式存储的虚拟机映像(例如 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版本。

相关内容