如何拯救一台GRUB 2启动失败的Linux电脑

如何拯救一台GRUB 2启动失败的Linux电脑

Figure 1: GRUB 2 menu with cool Apollo 17 background.

旧版GRUB我们使用了一段时间了,这个重要的Linux通用引导器的版本已经到了0.97。尽管旧版GRUB有很多的优点,但是它已经有点陈旧了,并且它的开发者也希望添加更多的功能,于是,GRUB 2 时代就要来了。

GRUB 2 做了几个明显的改进。它可以从移动存储设备上启动,并且可以通过配置一个选项来进入系统BIOS。相对于将所有的配置都放到一个配置文件/boot/grub/menu.lst中 (现在默认是/boot/grub/grub.cfg),使用各种脚本来配置会更复杂。你不要直接编辑这个文件,那不是人干的事,太复杂了,我们需要使用其它的脚本来改变。我们卑微的人类可以编辑修改/etc/default/grub文件,它主要是控制Grub菜单的外观。我们还可以修改/etc/grub.d/下的脚本,这些脚本用于启动操作系统、控制外部应用程序,如memtest 、os_prober和theming等等 。./boot/grub/grub.cfg是由/etc/default/grub和/etc/grub.d/*生成的。当你修改了某个地方,你必须要运行update-grub命令来生成它。

好消息是,update-grub脚本可以可靠的检测内核、启动文件,并添加所有的操作系统,自动生成你的启动菜单,所以你不必手动的修改他们。

我们还要学习如何解决两个常见的故障。当启动系统时,它会停在grub>提示上,这是一个完整的GRUB 2命令界面,所以不要惊慌。这意味着GRUB 2依旧可以正常启动和加载normal.mod模块(它和其他模块分别位于/boot/grub/[架构]/ 下),但没有找到你的grub.cfg文件。如果你看到grub rescue> 这意味着它无法找到normal.mod,因此它有可能找不到你的启动文件。

这是如何发生的?因为内核可能改变驱动器分区号码的分配,或者您移动了您的硬盘驱动器,或者你手动改变一些分区,也有可能是安装一个新的操作系统或者移动一些文件。在这些情况下你的启动文件仍然存在,但GRUB不能找到他们。所以你可以在GRUB提示符中找到启动文件,设置它们的位置,然后启动您的系统并修复GRUB配置。

GRUB 2 命令行

GRUB 2 的命令界面和上一代GRUB中的一样强大。你可以用它来找到引导镜像,内核和根文件系统。事实上,它可以让你避开权限和其它访问控制,完全访问本地计算机上的所有文件。有些人可能会认为这是一个安全漏洞,但是你知道古老的UNIX的名言:有物理访问机器权限的人,就是拥有它的人。

当你在grub >提示时,你有许多类似命令行界面的功能,如命令历史和tab补全。但是grub rescue>模式是受限的,没有命令历史,没有tab补全。

如果你是在一个正常运作的系统上练习,那就当GRUB菜单出现时,可以按下C来打开GRUB命令行界面。你可以通过向上和向下光标键滚动你的菜单条目来停止启动倒计时。在GRUB命令行下做实验是安全的,因为做不了永久的修改,一切都是暂时的。如果你已经看到grub >或grub rescue>提示符,那就说明你的表现时刻到了。

接下来的几个命令可以在grub>和grub rescue模式下运行。你应该运行的第一个命令是设置一个分页器,将长的命令分页。如下:


  1. grub> set pager=1

等号两侧必须不能出现空格。现在让我们做一点探索。输入ls来列出的GRUB识别的所有分区:


  1. grub> ls
  2. (hd0) (hd0,msdos2) (hd0,msdos1)

msdos是什么?这意味着该系统具有老式的MS-DOS分区表,而不是全新的全局唯一标识符的分区表(GPT)。参见“在Linux下使用新的GUID分区表,和古老的MBR说再见!”。如果你正在运行的GPT,它会出现(hd0,GPT1)。现在让我们看看,使用ls命令查看你的系统里面有什么文件:


  1. grub> ls (hd0,1)/
  2. lost+found/ bin/ boot/ cdrom/ dev/ etc/ home/ lib/
  3. lib64/ media/ mnt/ opt/ proc/ root/ run/ sbin/
  4. srv/ sys/ tmp/ usr/ var/ vmlinuz vmlinuz.old
  5. initrd.img initrd.img.old

太好了,我们已经找到了根文件系统。你可以省略msdos和GPT的标签。如果没有加分区后面的斜杠/,则只会列出分区的信息。你可以用cat命令显示文件系统上的任何文件:


  1. grub> cat (hd0,1)/etc/issue
  2. Ubuntu 14.04 LTS \n \l

在一个多引导系统上,通过/etc/issue文件可以知道这是哪个Linux系统。

从 grub> 中启动

下面讲述如何设置启动文件并从grub >提示下启动系统。我们已经知道如何从Linux根文件系统(hd0,1)下运行ls命令,你可以一直寻找直到找到你的/boot/grub所在位置。然后运行以下命令,记得使用您自己的根分区,内核和initrd映像等参数:


  1. grub> set root=(hd0,1)
  2. grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
  3. grub> initrd /boot/initrd.img-3.13.0-29-generic
  4. grub> boot

第一行设置分区的根文件系统。第二行告诉GRUB您想要使用的内核位置。开始输入/boot/vmli,然后使用tab补完填写。输入root= /dev/sdX设置根文件系统位置。是的,这似乎是多余的,但如果你忘记了输入,你会得到一个kernel panic。你知道怎么找到正确的分区吗?hd0,1 即 /dev/sda1,hd1,1 即 /dev/sdb1,hd3,2 即 /dev/ sdd2。我想你可以自己推算剩下的了。

第三行设置initrd文件,必须是和内核相同的版本号。

最后一行启动系统。

在一些Linux系统上,内核和initrd是被符号链接到当前的根文件系统的根目录,就像:


  1. $ ls -l /
  2. vmlinuz -> boot/vmlinuz-3.13.0-29-generic
  3. initrd.img -> boot/initrd.img-3.13.0-29-generic

所以,你也可以这样输入命令:


  1. grub> set root=(hd0,1)
  2. grub> linux /vmlinuz root=/dev/sda1
  3. grub> initrd /initrd.img
  4. grub> boot

从grub rescue> 中启动

如果你处在grub rescue> 命令界面下,命令有所不同,你必须要先加载两个模块normal.mod 和 linux.mod。


  1. grub rescue> set prefix=(hd0,1)/boot/grub
  2. grub rescue> set root=(hd0,1)
  3. grub rescue> insmod normal
  4. grub rescue> normal
  5. grub rescue> insmod linux
  6. grub rescue> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
  7. grub rescue> initrd /boot/initrd.img-3.13.0-29-generic
  8. grub rescue> boot

在你加载了这两个模块之后tab补完的功能就可以用了。

永久性的修复

当你成功地启动你的系统,运行这些命令来永久修复GRUB:


  1. # update-grub
  2. Generating grub configuration file ...
  3. Found background: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
  4. Found background image: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
  5. Found linux image: /boot/vmlinuz-3.13.0-29-generic
  6. Found initrd image: /boot/initrd.img-3.13.0-29-generic
  7. Found linux image: /boot/vmlinuz-3.13.0-27-generic
  8. Found initrd image: /boot/initrd.img-3.13.0-27-generic
  9. Found linux image: /boot/vmlinuz-3.13.0-24-generic
  10. Found initrd image: /boot/initrd.img-3.13.0-24-generic
  11. Found memtest86+ image: /boot/memtest86+.elf
  12. Found memtest86+ image: /boot/memtest86+.bin
  13. done
  14. # grub-install /dev/sda
  15. Installing for i386-pc platform.
  16. Installation finished. No error reported.

当你运行 grub-install 时,记得GRUB是安装到整个硬盘驱动器的主引导扇区而不是到一个具体分区,所以不要加上像/dev/sda1一样的分区号。

如果还是不能使用

如果你的系统是如此的倒霉,而且这个方式没有能起作用,那就尝试超级GRUB2现场救援磁盘吧。官方GNU GRUB手册也应该有所帮助。

原文发布时间:2014-07-23

本文来自云栖合作伙伴“linux中国”

时间: 2024-12-27 22:58:55

如何拯救一台GRUB 2启动失败的Linux电脑的相关文章

英国官方启动98英镑Linux电脑计划

Race http://www.aliyun.com/zixun/aggregation/16846.html">Online 2012是英国政府主导的一个2012奥运会前国民互联网普及计划,最近该计划发起了一个可能涉及到920万从未涉及互联网的英国人Linux PC普及计划.一种价格只有98英镑的翻新电脑即将发布,英国政府还通过Race Online 2012计划为这种电脑带来了每月合14美元的超低Internet租约价格,这种电脑包括一台平板显示器,键盘,鼠标,保修,送货和一个技术服务

lamp-mysql service mysql restart 启动失败

问题描述 mysql service mysql restart 启动失败 kali linux 64位,通过一键安装包安装了LAMP mysql安装的位置在/web/server/mysql ,系统启动后,所有服务运行正常 但是通过service mysql restart 启动失败 提示:/etc/init.d/mysql:WARING:/etc/mysql/my.cnf cannot be read See README.warnn.gz... 而/etc/ 下根本没有mysql文件夹,只

openstack计算节点启动失败。分开安装,全放一台都不能启动

问题描述 求助,本人python很菜,所以解决不了了...其他服务都正常,原来是一台控制,一台计算,计算启动失败后,打算用控制节点来启这个nova-comput,单也报相同的错误nova-compute--config-file=/etc/nova/nova.conf错误日志usr/lib/python2.6/site-packages/stevedore/extension.py:4:UserWarning:ModuleOpenSSLwasalreadyimportedfrom/usr/lib

图文详解Win8.1 Update启动失败问题

  图文详解Win8.1 Update启动失败问题: 要解决windows8.1 update无法启动问题,其实只要使用Win8.1安装镜像+应急命令来修复,例如最经典的sfc /scannow命令.该修复命令可以扫描所有保护的系统文件的完整性,同时使用正确的微软版本替换受损或者异常的版本文件. 具体操作步骤: 1.下载Win8.1系统镜像,刻录DVD安装光盘或者制作U盘启动工具; 下载ISO后,可以用魔方电脑大师中的魔方文件校验来获取SHA1.MD5.CRC等校验值,确保下载的是官方纯净版,不

服务器重启后SQL Server Agent由于"The EventLog service has not been started" 启动失败

案例环境:     操作系统   : Microsoft Windows Server 2003 Standard Edtion SP2     数据库版本 : SQL Server 2005 Standard Edition SP4   案例描述:     服务器重启过后,MSSQLSERVER服务自动重启了,但是SQLSERVERAGENT服务启动失败(当然SQL Agent服务的启动类型为自动启动(Automatic)),在这台服务器第二次遇到这种情况,第一次遇到时没太注意,以为只是特殊案

hive-萌芽求救 HIVE启动失败

问题描述 萌芽求救 HIVE启动失败 IT届 萌芽求救 [root@h1 ~]# hiveLogging initialized using configuration in jar:file:/usr/local/apache-hive-0.13.0-bin/lib/hive-common-0.13.0.jar!/hive-log4j.propertiesJava HotSpot(TM) Client VM warning: You have loaded library /usr/local

解决windows2012因吊销服务器脱机造成的证书服务启动失败

例行域控制器检查时发现一则ID48的警告日志,来源为CertificationAuthority.警告如下:    代码如下 复制代码 日志名称: Application 来源: Microsoft-Windows-CertificationAuthority 日期: 2015/3/20 9:44:56 事件 ID: 48 任务类别: 无 级别: 警告 关键字: 用户: SYSTEM 计算机: MDC.XXXXXX.cn 描述: 无法验证 XXXXXX-MDC-CA 的 CA 证书 0 的证书链

无COM接口Windows服务启动失败的原因及解决方案

将VS创建的Windows服务项目编译生成的程序,通过命令行 "服务.exe -Service"注册为Windows服务后,就可以通过服务管理器进行管理了. 问题 通过服务管理器进行启动的时候,发现服务无法启动,提示错误 由于程序代码是由VS的项目模板生成的,生成后直接编译为Debug版,然后通过命令行进行注册,期间并没有修改过任何代码. 难道是只有Release版本才能通过服务管理器启动吗.于是将Release版注册为服务,通过服务管理器启动,仍然会报同样的错误. 由于服务比较特殊,

防火墙导致的NodeManager启动失败

Hadoop环境CDH4.4 今天年后第一天上班(实习中),还过一个月,实习第一份实习合同就到期了~ Hadoop集群的虚拟环境看上去太乱,所以就将3个节点(1master + 2Slaves)重启,结果NodeManager启动失败.查看日志,记录错误如下: 2014-02-10 18:24:07,635 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager org.apa