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 分区卷?
路途遥远。但为了它的乐趣:
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)
美好的。
归档时间: |
|
查看次数: |
2115 次 |
最近记录: |