您只需将磁盘的前几个字节设为0x00,就可以使设备无法启动。
通常(对于grub,grub2和ntldr iirc都是如此),驱动器的第一个字节将是x86 jmp指令。这甚至发生在disklabel之前,因为将执行传递给设备进行引导时,它只是将CPU设置为将设备信息作为代码吸收。如果代码无效,它将触发中断,BIOS处理该异常并转到下一个可引导设备。
例如,磁盘的开头以:
00000000 eb 63 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.c....|.P.P....||
第一部分是eb 63
跳转到当前IP的偏移量0x63(因此偏移到0x65)。
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p|
00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......|
从这里继续执行。
该部门的末端如下所示:
000001b0 cd 10 ac 3c 00 75 f4 c3 ed db 96 d6 00 00 80 01 |...<.u..........|
000001c0 01 00 83 fe ff ff 3f 00 00 00 c1 07 a6 0e 00 fe |......?.........|
000001d0 ff ff 83 fe ff ff 00 60 00 11 00 00 38 29 00 fe |.......`....8)..|
000001e0 ff ff 82 fe ff ff 00 08 a6 0e 00 58 5a 02 00 00 |...........XZ...|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
如果将磁盘格式化为MBR分区表,则只需要显示两件事:位于偏移处的分区表0x1be
和55aa
位于扇区末尾处偏移处的MBR签名0x1fe
。 0x1be
是十进制446。
以下内容(当然)会使设备无法启动。但这就是您想要的。如果您不想使设备无法启动,那么不要这样做,mmm-kay?我假设您的设备是/dev/sdz
,仅仅是因为没有多少人拥有/dev/sdz
,这降低了一些白痴新手盲目的复制粘贴命令的风险。
首先,将MBR复制到文件以进行备份。
sudo dd if=/dev/sdz of=/some/where/safe/preferably/not/on/dev/sdz/backup.mbr bs=512 count=1
接下来,制作该文件的副本:
cp backup.mbr backup.mbr.test
接下来,我们必须创建一个回送设备(这样内容就不会被截断。)并将更改应用于伪扇区0作为测试:
sudo losetup /dev/loop7 backup.mbr.test
sudo dd if=/dev/zero of=/dev/loop7 bs=446 count=1
sudo losetup -d /dev/loop7
hexdump
文件,并确保整个分区表是完整的:
sudo hexdump -C backup.mbr.test
您应该看到类似以下内容:
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 00 00 00 00 00 00 80 01 |................|
000001c0 01 00 83 fe ff ff 3f 00 00 00 c1 07 a6 0e 00 fe |......?.........|
000001d0 ff ff 83 fe ff ff 00 60 00 11 00 00 38 29 00 fe |.......`....8)..|
000001e0 ff ff 82 fe ff ff 00 08 a6 0e 00 58 5a 02 00 00 |...........XZ...|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
现在,在十六进制转储的输出上0x1be
可以看到80
,这也可以00
并且仍然有效。(这是在分区表中的“启动”标志,你可以不要管它,因为它是完全通过最现代的BIOS忽略...)字节的0x1bf
,虽然几乎从来没有被0x00
(这是最常见的0x01
,但它可以采取其他值),您可以将其与您backup.mbr
进行比较,以确保过去的一切都没有0x1be
改变。
一旦对正确应用更改感到满意,则可以直接将文件复制到磁盘的第一部分。之所以要执行该文件而不是/dev/zero
再次执行该文件,是为了防止错别字。如果您不小心忽略了count=1
自己的工作时间,那么复制文件永远不会超过EOF。这样更安全。
sudo dd if=backup.mbr.test of=/dev/sdz
接下来hexdump
,确保磁盘更改符合预期。
hexdump -C /dev/sdz | head
最多可比较0x200
对backup.mbr.test
,以确保它就是你想要的。
最后,如果由于某种原因导致任何问题,您可以通过以下方式简单地将MBR的备份复制回驱动器:
sudo dd if=backup.mbr of=/dev/sdz
希望这可以帮助。