我正在尝试进行操作系统开发,我从引导加载程序开始,其中阶段 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 映像进行分区,您有多种选择:
对每个分区使用线性模式下的循环或设备映射器。您不需要同时进行这些设置来进行格式化;
部分/克帕特克斯告诉内核它应该在循环/设备映射器设备甚至常规文件上考虑哪些分区:
kpartx -av /path/to/file
或者
losetup /dev/loopX /path/to/file kpartx -av /dev/loopX
这些设备是设备映射器设备(即
/dev/mapper
默认链接到 from)。使用
partprobe
losetup /dev/loopX /path/to/file partprobe /dev/loopX
这将指示内核检查分区,从而创建
/dev/loopXpY
.在虚拟机中启动实时 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版本。