我创建了一个 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
- 如果我安装
/dev/loop0p2
,就没问题。 如果我复制分割取出磁盘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。