如何卸载 GRUB?

ænd*_*rük 19 uninstall grub2

我仅用于数据存储的硬盘驱动器仍然具有来自过去 Ubuntu 安装的 GRUB。

如何在不损害驱动器其余数据的情况下从中删除 GRUB?

背景

我偶尔会在具有各种引导顺序配置的计算机之间移动数据驱动器,所以我希望它是不可引导的,以避免必须在每台计算机的 BIOS 设置中容纳它。

当我在仅连接数据驱动器的情况下打开计算机电源时,会出现以下内容:

error: no such device: fdf38dd4-9e9d-479d-b830-2a6989958503.
grub rescue> 
Run Code Online (Sandbox Code Playgroud)

我可以从旧备份中/etc/fstab确认这是我最近重新格式化的根分区的 UUID,它不再存在。这是数据驱动器的分区表和原始主引导记录

请注意,我对不回答我的主要问题的解决方法不感兴趣。我可以想到几种方法来解决这个问题,但原则上让我烦恼的是我不知道如何直接解决它。每个安装过程都应该有一个对应的卸载过程。

Omn*_*ity 25

您可以通过将磁盘的前几个字节设置为 0x00 来使设备无法启动。

通常(对于 grub、grub2 和 ntldr iirc 都是如此)驱动器的第一个字节将是 x86 jmp 指令。这甚至发生在磁盘标签之前,因为在将执行传递给设备以引导它时,它只是设置 CPU 将设备信息作为代码吸入。如果它有无效代码,它会触发一个中断,BIOS 处理异常并转到下一个可引导设备。

例如,我的磁盘的开头以:

00000000  eb 63 90 d0 bc 00 7c fb  50 07 50 1f fc be 1b 7c  |.c....|.P.P....||
Run Code Online (Sandbox Code Playgroud)

第一部分是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......|
Run Code Online (Sandbox Code Playgroud)

执行从这里继续。

扇区的结尾看起来像这样:

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.|
Run Code Online (Sandbox Code Playgroud)

如果您的磁盘被格式化为 MBR 分区表,那么它只需要存在两件事,位于 offset 的分区表0x1be和 MBR 签名,55aa它出现在 offset 扇区的最后0x1fe0x1be是十进制 446。

以下内容(当然)会使设备无法启动。但这就是你想要的。如果您不想让您的设备无法启动,请不要这样做,嗯?我假设您的设备是/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
Run Code Online (Sandbox Code Playgroud)

接下来,复制该文件:

cp backup.mbr backup.mbr.test
Run Code Online (Sandbox Code Playgroud)

接下来,我们必须创建一个环回设备(以便内容不会被截断。)并将更改应用于我们的假扇区 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
Run Code Online (Sandbox Code Playgroud)

hexdump 文件并确保整个分区表完好无损:

sudo hexdump -C backup.mbr.test
Run Code Online (Sandbox Code Playgroud)

你应该看到类似的东西:

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
Run Code Online (Sandbox Code Playgroud)

现在,0x1be是您80在 hexdumped 输出中看到的位置,这也可以00并且仍然有效。(它是分区表中的“可引导”标志,您可以不理会它,因为大多数现代 BIOS 完全忽略了它......)0x1bf尽管字节几乎永远不会0x00(它最常见,0x01但它可以采用其他值)你可以将其与您的backup.mbr进行比较,以确保过去没有任何0x1be改变。

一旦您对正确应用更改感到满意,您就可以直接将文件复制到磁盘的第一部分。你想要做这个文件而不是/dev/zero再次做的原因是为了防止打字错误。如果您不小心遗漏了,count=1您会很不愉快,另一方面,复制文件永远不会超过 EOF,永远。所以更安全。

sudo dd if=backup.mbr.test of=/dev/sdz
Run Code Online (Sandbox Code Playgroud)

接下来是hexdump您的磁盘,以确保更改按预期进行。

hexdump -C /dev/sdz | head
Run Code Online (Sandbox Code Playgroud)

最多可比较0x200backup.mbr.test,以确保它就是你想要的。

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

sudo dd if=backup.mbr of=/dev/sdz
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。