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

Rhy*_*oid 5 partition ext4 loop-device

我正在尝试进行操作系统开发,我从引导加载程序开始,其中阶段 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
Run Code Online (Sandbox Code Playgroud)

我制作了一个大约 64 MB 的卷,将其格式化为 ext4,并用 phase0(大小始终为 1024 字节)覆盖前 1024 个八位字节。这工作正常。

但是现在我想制作一个正确分区的文件,以针对更现实的场景对其进行测试。我知道我可以使用/sbin/cfdisk我的卷文件,但mke2fs没有一个参数可以让我在文件中选择一个跨度。

现在我知道使用 loop解决方案,但不幸的是,它似乎对我不起作用(似乎我无法max_part在 Debian jessie 中进行更改)。似乎还有另一个名为 的模块nbd,但我没有安装该模块的服务器和客户端。我需要 root 权限才能在用户空间中明确完成某些事情,这有点荒谬。

作为用户,我该如何做到这一点?或者我应该围绕我创建的 ext4 格式文件构建 MBR/GPT 分区卷?

Run*_*ium 3

路途遥远。但为了它的乐趣:

1.创建临时图像:

    $ truncate -s64MiB tmp.img
Run Code Online (Sandbox Code Playgroud)

2.使用以下命令创建两个分区fdisk

比较详细,但是还可以。

$ fdisk tmp.img
Run Code Online (Sandbox Code Playgroud)

第一个分区:

: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>
Run Code Online (Sandbox Code Playgroud)

第二个分区:

: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)
Run Code Online (Sandbox Code Playgroud)

打印我们要写的内容:

: 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
Run Code Online (Sandbox Code Playgroud)

写入并退出:

:w (Dont! forget ;-) )
Run Code Online (Sandbox Code Playgroud)

我们有两个 40 MiB 和 23 MiB 的分区:

81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

4.将它们全部缝合在一起:

2048*512从临时图像中提取第一个字节:

dd if=tmp.img of=disk.img bs=512 count=2048
Run Code Online (Sandbox Code Playgroud)

将它们结合起来:

cat ext4.img ext3.img >> disk.img
Run Code Online (Sandbox Code Playgroud)

美好的。