如何卸载GRUB?

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

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

背景

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

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

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

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

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

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

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

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

 00000000 eb 63 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.c....|.PP...|| 

第一部分是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位于扇区末端偏移量0x1fe0x1be是十进制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是你在hexdumped输出上看到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 

比较backup.mbr.test最多0x200 ,以确保它是你想要的。

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

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

希望这可以帮助。

警告:非常危险

您可以使用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/

我的经历

 sudo install-mbr -in -p D -t 0 /dev/sda 

是,它成功地从/dev/sda (安装我的Windows 7)中安装了grub2,所以问题的第一部分“如何从/ dev / sda删除grub?” 已经回答了。

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

在阅读维基百科有关该主题的文章后 ,我想提出一些额外的解决方案:

  1. 更改BIOS中的启动顺序:)

  2. 最好和最安全的:使用fdisk从该驱动器上的任何分区中删除“可引导”标志。 大多数MBR寻找一个“可引导”的分区来进行链式加载,所以如果没有这样的分区,我希望GRUB什么都不做。 虽然没有测试过。

    如果上述方法无效,请尝试安装标准MBR代码的免费克隆:

  3. 安装mbr包并使用install-mbr命令,如下所示:

     sudo apt-get install mbr sudo install-mbr -in -p D -t 0 /dev/sda 

致谢: 如何:使用Ubuntu LIVE CD恢复Windows MBR

从阅读维基百科文章,我的印象是,唯一能识别MBR的是它的签名,它位于扇区的最末端(字节510和511)。 MBR的前446个字节应该包含机器指令。 如果存在MBR签名,BIOS应该将控制权转移到引导加载程序,而不管前446字节的实际内容如何:

在与IBM PC兼容的计算机上,ROM BIOS中包含的引导固件加载并执行主引导记录。[14] ……因此,MBR的开头应包含实模式机器语言指令。[14] BIOS将MBR从存储设备读入物理内存,然后将微处理器指向启动代码的开头。

由于MBR代码段的大小有限,它通常只包含一个小程序,可以将其他代码(例如引导加载程序)从存储设备复制到内存中。 然后将控制传递给此代码,该代码负责加载实际的操作系统。

BIOS中的引导序列会将它找到的第一个有效MBR加载到地址0x7C00的计算机物理内存中。 BIOS代码中执行的最后一条指令将“跳转”到该地址,以指示执行到MBR副本的开头。 大多数BIOS的主要validation是最终的0xAA55签名,尽管BIOS实现者可以选择包括其他检查,例如validationMBR包含有效分区表而没有引用超出报告的磁盘容量的扇区的条目。

所以我的理解是MBR 总是应该包含一个引导加载程序,并且将它的前446个字节归零不会阻止BIOS尝试从磁盘引导 – 但是它可能会在尝试执行无效代码时使计算机挂起。

更新:此外, 本文建议,要使磁盘看起来“不可启动”的BIOS,你应该实际编辑扇区和部门的MBR签名(使用任何磁盘编辑器)。 我不确定它是否会影响操作系统看到磁盘上的分区表…但至少你可以随时修改这些字节…

另一个更简单的解决方

在我的情况下,我有Debian linux,但想使用Mandriva,也将为其他人工作

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

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

现在,大多数Linux安装程序都可以让您选择要做什么,尝试播放/使用评估或便携式Linux或运行安装程序来安装它。 此时我们只是等待(向上移动光标使屏幕等待,但不要按回车或用鼠标点击)。

此时只需提醒您的USB /或/ CDRom已启动并正在运行。 现在是时候把我们暂时删除的硬盘插回来等待一分钟(一些BIOS需要一分钟的小等待就足够了)

继续设置过程,因为大多数安装程序都包含您可以随意执行的分区工具。 这是一个简单的解决方案,我只是作为一个初学者摆脱旧的Linux设置

老问题,但正如昨天发生在我身上的那样,我解决了这样的问题:我关闭了计算机,物理断开了被控制的硬盘驱动器,再次启动计算机,然后

 ~ $ sudo update-grub 

做完这个,我关闭了计算机,重新连接了硬盘和旧的Windows 7分区,从2年前就不再存在,最终没有出现。

我知道这是一个脚踏实地的解决方案,但它确实有效。 有一天,我会彻底擦拭那个硬盘,任何剩下的GRUB痕迹都会消失。