我生成一个包含最小 Debian 文件系统的 ext4 分区映像,然后将该分区映像写入完整磁盘映像。我正在寻找最快的写入方法。
考虑一个最小的测试用例:
truncate -s 30GB disk.img
parted -s disk.img mklabel gpt
parted -s disk.img mkpart small ext4 1MiB 301MiB
parted -s disk.img mkpart root ext4 301MiB 100%
truncate -s 20GB rootfs.img
truncate -s 300MB small.img
mkfs.ext4 rootfs.img
mkfs.ext4 small.img
# In reality, here we might put something on the partitions, like:
# mount rootfs.img /mnt/root; debootstrap /mnt/root
# The part we want to optimize:
dd if=small.img of=disk.img seek=1 bs=1M conv=notrunc
dd if=rootfs.img of=disk.img seek=301 bs=1M conv=notrunc
上述代码中生成的rootfs.img
和文件仅包含一个空的 ext4 文件系统,因此非常小(对于 5G 文件系统,约为 67MB,对于 30G 文件系统,约为 120MB)。尽管如此,即使使用,也需要很长时间才能复制它们。据推测这是因为查看了完整的 20GB,而不仅仅是打印的已使用区域。此外,如果目标未归零,则使用是一个错误。small.img
dd
conv=sparse
dd
du -sh
conv=sparse
将稀疏分区映像复制到磁盘映像中间的最快方法是什么?仅 ext4 解决方案就足够了,但独立于文件系统的方法甚至更好。
答案1
用于losetup
创建指向大图像文件中的分区的循环设备。
losetup -P loop9 disk.img
创建
- /dev/loop9 代表整个文件
- /dev/loop9p1 代表第一个分区
- /dev/loop9p2 代表第二个分区
然后使用将partclone.ext4
数据从小图像文件复制到环回设备。(为了实现延伸目标,partclone 的其他版本可用于其他文件系统)
或者您可以直接格式化环回设备、安装它们并安装您想要的文件。