问题描述
我仅用于数据存储的硬盘驱动器仍然具有过去安装的 Ubuntu 中的 GRUB。
如何在不损害驱动器其余数据的情况下从中删除 GRUB?
背景
我偶尔会在具有不同启动顺序配置的计算机之间移动数据驱动器,因此我希望它是不可启动的,以避免必须在每台计算机的 BIOS 设置中适应它。
当我在只有数据驱动器连接的情况下打开计算机电源时,出现以下内容:
error: no such device: fdf38dd4-9e9d-479d-b830-2a6989958503.
grub rescue>
我可以从 /etc/fstab
的旧备份中确认这是我最近重新格式化的根分区的 UUID 和 no longer exists 。这是数据驱动器的 partition table 和原始 master boot record 。
请注意,我对不能回答我的主要问题的解决方法不感兴趣。我可以想出几种方法来解决这个问题,但原则上困扰我的是我不知道如何直接解决它。每个安装过程都应该有对应的卸载过程。
最佳答案
只需将磁盘的前几个字节设置为 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
处的分区表和 MBR 签名 55aa
,它出现在扇区的最末端,偏移量 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
是您在 hexdump 输出中看到 80
的地方,这也可以是 00
并且仍然有效。 (它是分区表中的 “bootable” 标志,你可以不管它,因为它被大多数现代 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
希望这可以帮助。