为什么在文件上执行 mkfs.vfat 后再将 dd 放入磁盘映像不起作用?

为什么在文件上执行 mkfs.vfat 后再将 dd 放入磁盘映像不起作用?

我创建了一个 100M 的磁盘 img 并用它进行分区以sgdisk创建 BIOS 启动和 ESP 分区。

dd if=/dev/zero of=file.img bs=1M count=100
sgdisk --clear -n 1:2048:4095 -t 1:ef02 -c 1:'BIOS Boot' -n 2:4096:17983 -t 2:ef00 -c 2:'EFI System Partition'

然后我创建一个分区并将其格式化为 FAT:

losetup -f file.img -P
mkfs.vfat /dev/loop0p2
  1. 如果我安装/dev/loop0p2,就没问题。
  2. 如果我复制分割取出磁盘img并挂载,没问题:

    dd if=file.img of=part2.img bs=512 count=13888 skip=4095

现在,part2.img可以直接安装。当然,如果dd后退进入图像,它仍然可以安装

dd if=part2.img of=file.img bs=512 count=13888 seek=4095 conv=notrunc

安装/dev/loop0p2工作正常。

但是,如果我创建一个大小相同的分区 img:

mkfs.vfat -C directpart.img 13888
dd if=directpart.img of=file.img bs=512 count=13888 seek=4095 conv=notrunc

该文件directpart.img可以挂载,就像part2.img(从磁盘映像中提取的)一样。但是,挂载/dev/loop0p2不再有效。

mkfs.vfat应用于分割在磁盘 img 文件(或真实块设备)中独立文件?

有趣的是,如果我使用losetup获取全磁盘映像,则可以dd if=<new_file> of=/dev/loop0p2使用两个都直接mkfs.vfat -C <new_file> 创建的文件dd磁盘上创建的文件。

答案1

您应该对 seek= 和 skip= 使用 4096,因为第二个分区从 LBA 4096 开始,这意味着它之前有 4096 个块,即 LBA 0 - 4095。

相关内容