使用 qemu-img 创建 raw 格式的磁盘文件,为什么前 4KB 要用 0 填充?

16 天前
 wniming

例如:

root@f42-vm:~# qemu-img create -f raw disk.raw 1G
Formatting 'disk.raw', fmt=raw size=1073741824
root@f42-vm:~# 
root@f42-vm:~# ls -ls disk.raw 
4 -rw-r--r-- 1 root root 1073741824 Oct 14 11:01 disk.raw
root@f42-vm:~# 
root@f42-vm:~# qemu-img info --output=json disk.raw | jq
{
  "children": [
    {
      "name": "file",
      "info": {
        "children": [],
        "virtual-size": 1073741824,
        "filename": "disk.raw",
        "format": "file",
        "actual-size": 4096,
        "format-specific": {
          "type": "file",
          "data": {}
        },
        "dirty-flag": false
      }
    }
  ],
  "virtual-size": 1073741824,
  "filename": "disk.raw",
  "format": "raw",
  "actual-size": 4096,
  "dirty-flag": false
}
root@f42-vm:~# 

我觉得既然创建的磁盘文件是稀疏文件,那应该可以不用 0 填充前 4KB ,找了半天没找到原因,希望有兴趣的 v 友能一起研究一下。

2022 次点击
所在节点    Linux
12 条回复
wniming
16 天前
在 macos 上也是一样的行为,只不过在 macos 上是向前 16KB 写了 0
wniming
16 天前
不管是在 linux 还是在 macos 上,直接用

truncate -s 1G disk.raw

分配磁盘文件也是能达到同样的效果,还不需要在文件开头写 0 。
busier
16 天前
反正 4K 和 4K 以下 都是至少要占用一个簇(通常默认 4K) ,弄小了也不能节省空间 纠结这干啥
ysc3839
16 天前
raw 是直接使用系统的稀疏文件吧?那个 actual-size 应该是系统报告的。
BenHunDun
15 天前
我在 Ubuntu 24 下执行对应的命令
```
ben@BenPC:/home/tmp/lfs/img$ qemu-img create -f raw disk.raw 1G
Formatting 'disk.raw', fmt=raw size=1073741824
ben@BenPC:/home/tmp/lfs/img$ qemu-img info --output=json disk.raw | jq
{
"virtual-size": 1073741824,
"filename": "disk.raw",
"format": "raw",
"actual-size": 0,
"dirty-flag": false
}

```
创建 10M 大小的也是, 但没有挂载过这个 raw
BenHunDun
15 天前
补充: 版本 qemu-system-x86_64 --version
QEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.10)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
loading
15 天前
因为真实的磁盘的前 4kb 是 boot sector ,mbr ,pbr 等信息,不是直接就放文件?
iseki
15 天前
我猜是某种兼容,因为很多系统上对 0 长度文件做内存映射会报错
kokutou
15 天前
防止装系统的时候解析磁盘分区表出问题,全 0 就被当作新硬盘。
可能以前不填 0 的时候,里面会有随机数据?
eb0c6551
15 天前
牛蛙, 谢谢楼主分享调试过程
kiraskyler
15 天前
@loading 赞同,看过 ext4 内核代码,里面注释内容就是前面一点点空间给分区表 boot 之类的使用,ext4 前
1024 字节不使用

ref: https://www.kernel.org/doc/html/v4.19/filesystems/ext4/ondisk/index.html#layout

对于块组 0 的特殊情况,前 1024 个字节未使用,以允许安装 x86 引导扇区和其他奇怪的东西。
超级块将从偏移量 1024 字节开始,无论是哪个块(通常是 0 )。
但是,如果由于某种原因块大小 = 1024 ,则块 0 被标记为正在使用,并且超级块位于块 1 中。
iceecream
15 天前
对楼书的分析过程很感兴趣,能否分享一下相关资料?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1165202

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX