警告:极其危险

警告:极其危险

我仅用于存储数据的硬盘上仍然保留着以前安装的 Ubuntu 的 GRUB。

我怎样才能从中删除 GRUB 而不损害驱动器的其余数据?

背景

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

当我打开计算机且仅连接了数据驱动器时,出现以下内容:

error: no such device: fdf38dd4-9e9d-479d-b830-2a6989958503.
grub rescue> 

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

请注意,我对那些不能回答我的主要问题的解决方法不感兴趣。我可以想出几种解决这个问题的方法,但原则上困扰我的是我不知道如何直接解决这个问题。每个安装程序都应该有一个对应的卸载程序。

答案1

只需将磁盘的前几个字节设为 0x00,即可使设备无法启动。

通常(对于 grub、grub2 和 ntldr 来说都是如此,如果我没记错的话)驱动器的第一个字节将是 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 分区表,那么它只需要存在两样东西,位于偏移处的分区表和位于偏移处扇区最末端的0x1beMBR 签名。 是十进制的 446。55aa0x1fe0x1be

以下操作(当然)会使设备无法启动。但这正是您想要的。如果您不想让您的设备无法启动,那么就不要这样做,好吗?我假设您的设备是/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

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

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

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

希望这可以帮助。

答案2

警告:极其危险

您可以使用 Linux 本身的 dd 命令(它会删除分区表):

 # dd if=/dev/null of=/dev/sdX bs=512 count=1

只需删除 MBR,不删除分区表(参见下面的注释):

# dd if=/dev/null of=/dev/sdX bs=446 count=1

替换/dev/hdX为您的实际设备名称,例如/dev/hda。使用fdisk -l命令找出设备名称:

# fdisk -l

来源

  1. http://www.cyberciti.biz/faq/linux-how-to-uninstall-grub/

答案3

我的经验

sudo install-mbr -i n -p D -t 0 /dev/sda

是,它成功从(安装我的 Windows 7 的地方)卸载了 grub2 /dev/sda,因此问题“如何从 /dev/sda 中删除 grub?”的第一部分已得到解答。

但是,问题的第二部分,即“如何恢复 /dev/sda 的 MBR?”尚未得到解答,因为命令install-mbr无法恢复 MBR。因此,Windows 无法再启动,Windows 启动管理器报告有关 MBR 损坏的错误,并要求用户使用 Windows 修复 CD 进行修复。

答案4

另一个更简单的解决方案。

就我而言,我使用的是 Debian Linux,但想使用 Mandriva,其他系统也适用

关闭你的电脑,然后移除你不想启动的启动盘(有 grub)

简单地放入一个由 mandriva iso 或其他您想要安装的变体制作的可启动 usb,有工具可以从 iso 文件制作可启动 usb 棒,使用谷歌(或者您可以使用从 cd rom 刻录的安装程序)

现在大多数 Linux 安装程序都为您提供了操作选择,试用/用于评估或便携式 Linux 或运行安装程序进行安装。此时我们只需等待(上下移动光标,这样屏幕就会等待,但不要按 Enter 或用鼠标单击)。

此时只需提醒您的 USB / 或 / CDRom 已启动并正在运行。现在是时候将我们暂时移除的硬盘插回去了,请稍等片刻(某些 BIOS 确实需要稍等片刻就足够了)

继续安装过程,因为大多数安装程序都包含分区工具,您可以做任何您想做的事情。这是一个简单的解决方案,我作为一个初学者摆脱了一个旧的 linux 设置

相关内容