当前位置: 首页>>技术教程>>正文


grub2 – 如何卸载 GRUB?

,

问题描述

我仅用于数据存储的硬盘驱动器仍然具有过去安装的 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

0x200backup.mbr.test 进行比较,以确保它是您想要的。

最后,如果由于某种原因出现任何问题,您可以通过以下方式简单地将 MBR 的备份复制回驱动器:

sudo dd if=backup.mbr of=/dev/sdz

希望这可以帮助。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13545.html,未经允许,请勿转载。