创建新分区(使用类似 的磁盘实用程序fdisk
)究竟有什么作用?它只创建分区表还是也创建 MBR 引导代码?
答案1
根据Unix 哲学程序应该只做一件事,并做好它。如果某个工具应该修改分区表,那么它就不应该费心修改引导代码(或创建文件系统等)。
当然,有些工具功能臃肿,功能齐全,fdisk
但这不是其中之一。下面是我对它行为的分析。这证明了完全有可能在保持 MBR 引导代码不变的情况下创建新分区。
我不知道每个平台上的所有磁盘实用程序。本回答仅涵盖 Linuxfdisk
实用程序。
的情况下fdisk
测试平台:Ubuntu 16.04.2 LTS,fdisk
来自util-linux 2.27.1
。
1. 零文件
我创建了一个空文件
dd if=/dev/zero of=mydisk bs=1M count=1
然后我运行fdisk mydisk
并从扇区中添加了一个单个分区63
到2047
,我编写了分区表。
输出hexdump -C mydisk
:
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 bb 50 d8 1d 00 00 00 01 |.........P......|
000001c0 01 00 83 20 20 00 3f 00 00 00 c1 07 00 00 00 00 |... .?.........|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00100000
如您所见,第一个非零字节位于0x1b8
;最后一个非零字节位于0x1ff
。将其与现代标准 MBR 的结构你会发现这是来自磁盘签名到启动签名。之后我也设置了可启动标志,但这对引导代码没有影响。没有出现有意义的引导代码,它无法启动。
2. MBR 包含垃圾、无效签名
有了同样的文件,我用垃圾覆盖了它的 MBR:
dd if=/dev/urandom of=mydisk bs=512 count=1 conv=notrunc
并且我确保没有启动签名(正确的签名应该是0xAA55
小端序,我使用了0x1234
):
echo -ne "\x34\x12" | dd of=mydisk bs=1 count=2 seek=510 conv=notrunc
然后我像以前一样创建了一个分区。所有垃圾都被覆盖了fdisk
,输出hexdump -C mydisk
与以前完全一样。引导代码区域已清零,因此无法启动。
3. 包含垃圾、有效签名的 MBR
同一个文件。再次写入垃圾信息:
dd if=/dev/urandom of=mydisk bs=512 count=1 conv=notrunc
这次我设置了正确的启动签名(0xAA55
小端序):
echo -ne "\x55\xAA" | dd of=mydisk bs=1 count=2 seek=510 conv=notrunc
然后fdisk mydisk
让我检查一下半有效分区表。我删除了所有分区,只新建了一个和之前一模一样的分区。运行hexdump -C mydisk
后发现,虽然分区表区域被修改了,但引导区中的垃圾仍然存在。引导代码区域没有变化。
我还没有测试过fdisk
包含非垃圾、完全合理的引导代码的 MBR。我坚信该工具不会分析代码。在这种情况下,它允许垃圾存在,因此它应该对任何数据执行相同的操作。
结论
该fdisk
行为取决于启动签名0xAA55
–在 512 字节 MBR 的最末端以小端格式写入的值。
当
fdisk
找到签名时,它会认为已经存在有效的 MBR。即使分区表中发生了一些更改,它也不会触及引导代码区域。当
fdisk
找不到有效签名时,它会认为没有有效的 MBR,因此它会在写入新分区表时创建一个。在这种情况下,引导代码区域将被清零(无法启动)。
在任何一种情况下,都不会fdisk
创建自己的实际启动的引导代码。