admin 管理员组

文章数量: 1086019


2024年12月24日发(作者:动态页面的文件扩展名可以是)

LINUX中GRUB故障排除

在Linux系统进行安装系统、更新软件等操作时,系统经常会出现安装故障和更新故障。本章主要针

对开机后无法引导系统的故障,专门介绍了GRUB系统引导软件的安装和使用,以及在紧急状况下如何进

入救援模式并恢复系统设置。

9.1 Linux启动安装进程故障排除

机器启动时若GRUB配置文件出错,则无法顺利进入操作系统。GRUB在Linux系统中的作用日益重

要。本节就GRUB软件的安装和使用过程中经常出现的故障的排除方法进行了详细的介绍。

9.1.1 故障001开机启动后GRUB失败

开机后启动GRUB失败。

GRUB(Grand Unified Boot Loader)是Linux环境下常用的引导程序,经常会由于配置被更改或者重新安

装系统而失效。当我们启动系统,在自检结束后没有进入GRUB选项菜单,而只是出现"grub>命令提示符"

时,表示系统启动GRUB失败了。系统无法通过GRUB的设置进入Windows或Linux系统。

用户在更改GRUB配置文件后没有及时修复。

根据是否将/boot单独分区,分两种情况进行说明。

1.没有将/boot单独分区的情况

在grub提示符下输入命令:

grub>install (hd0,1)/boot/Grub/stage1 d (hd0)

(hd0,1)/boot/grub/stage2

p (hd0,1)/boot/grub/

GRUB的安装分为两个主要的步骤:stage1和stage2。stage1是一段嵌入MBR的迷你代码。

stage2是主要部分,在stage1把控制权传递给它后,就由它来接管所有事情。

install后面必须指定stage1的位置,这里假设Fedora Core7安装在/dev/sda2,则其分区位置为(hd0,6),

因为GRUB能读取文件系统,所以还指定了分区上目录位置:/boot/grub/stage1,参数d表示stage1将寻找

stage2所在的磁盘。接着就是GRUB的安装位置:(hd0),这里就是指安装在MBR(主引导记录)。后

面的参数指定stage2的位置:

(hd0,1)。参数p指定文件的位置。

在GRUB的分区表示中,第一块可读取的硬盘驱动器是hd0,第二块可读取的硬盘驱动器(即使它被

连接在第三、第四或更高的IDE端口上)是hd1,以此类推。在GRUB的分区表中,分区号从0开始。因

此,/dev/hda1在GRUB表里表示为(hd0,0),/dev/hda7在GRUB表里表示为(hd0,6)。

注意:GRUB里面不区分硬盘类型hda和sda,即/dev/hda1和/dev/sda1同样表示为(hd0,0)。

2.将/boot单独分区的情况

对于以/boot作为单独分区的情况,在GRUB提示符下输入命令:

grub>install (hd0,1)/grub/stage1 d (hd0)

(hd0,1)/grub/stage2 p (hd0,1)/grub/

上例假设/boot位于(hd0,1)(也就是hda2),而/位于(hd0,2)(也就是hda3),我们不能用"(hd0,2)

/boot/grub/stage1",因为GRUB不知道(hd0,1)是/boot,所以必须首先指向挂接为/boot的分区,然后把目

录指向那里。

重新启动系统以后,就可以看到GRUB菜单了。

另外还有一种方法可以恢复GRUB到MBR,步骤如下。

(1)查找/boot/grub/文件,如果命令执行成功,会返回对应分区,如(hd0,6)。

grub>find/boot/grub/

(hd0,6)

(2)挂载分区(hd0,6),命令返回对应分区的文件系统格式。

grub>root(hd0,6)

the type of (hd0,6) is ext2

如果是Linux系统,则为ext2fs文件系统格式;若是Windows XP系统,则为NTFS文件系统格式,

其他还有FAT32等格式。

(3)安装GRUB到MBR,(hd0)指第一个硬盘。

grub>setup(hd0)

(4)重新启动后就可以看见以下菜单。

grub>reboot

.1.2 故障002使用GRUB引导Windows系统失败

开机后GRUB启动Windows系统失败。

GRUB是一个功能强大的引导软件,可以同时支持Linux和Windows系统,当机器安装的Windows系统无

法成功在GRUB引导下启动,而只是出现"grub>命令提示符"时,GRUB启动Windows系统失败。

用户在重装Windows系统后更改了GRUB配置文件记录。

系统启动后只出现"grub>",而没有别的提示。在这种情况下有两种方法可以引导Windows系统。

(1)使用GRUB命令引导。

grub>root(hd0,0)

grub>chainloader+1

grub>boot

这里只有第一个命令需要说明一下,root命令挂载分区,当Windows系统安装在第一个分区(C盘),

即hda1或sda1时,使用(hd0,0)。如果不知道Windows系统安装在哪个分区,可以使用grub>root(hd0,n)

尝试,n=1,2,3…9。

(2)使用GRUB菜单选项引导。

当GRUB菜单出现后,手动选择Windows选项。如果点击选项但无法引导,可以按"e"进入编辑模式,

查看对应的语句。保证语句的正确,特别是分区号必须正确。正确的语句格式如下:

root(hd0,0)

chainloader+1

9.1.3 故障003使用GRUB引导Linux系统失败

开机后GRUB启动Linux系统失败。

GRUB是一个功能强大的引导软件,可以同时支持Linux和Windows系统,当机器安装的Linux系统无法

成功在GRUB引导下启动,而只是出现"grub>命令提示符"时,GRUB引导Linux系统失败。

用户更改了GRUB配置文件或重装系统后GRUB配置文件中引导记录被更改。

要想在GRUB里引导Linux系统,必须知道Linux系统内核的版本号。下面根据是否将/boot单独分区,分

两种情况进行说明。

1.系统将/boot单独分区的情况

假设一台系统将/dev/sda1挂载为/boot,将/dev/sda7挂载为/。在/boot目录中,内核的文件名是

7。这种情况下,要引导系统,应当在grub提示符后面输入下面的命令:

grub>root(hd0,0)

grub>kernel/7

root=/dev/sda7

grub>boot

这里root语句给出了包含内核的分区。kernel语句描述了分区中内核文件的路径和文件名。参数"root="

给出了包含/sbin/init的分区,即系统的根分区。

2.没有将/boot单独分区的情况

假设系统没有将/boot单独分区,而是将系统全部安装在/dev/sda1下,则使用的命令稍有不同。

grub>root(hd0,0)

grub>kernel/boot/7

root=/dev/sda1

grub>boot

9.1.4 故障004使用GRUB引导多系统失败

使用GRUB引导多系统失败。

GRUB是一个功能强大的引导软件,可以同时支持Linux和Windows系统,当机器中同时安装的Windows

或Linux系统无法成功在GRUB引导下启动,而只是出现"grub>命令提示符"时,表明GRUB引导多系统

失败。

用户更改了GRUB配置文件或重装系统后GRUB配置文件中引导记录被更改。

当使用GRUB来引导多系统时,可以在GRUB菜单通过选项选择引导的系统。如果无法引导,则要查看相

关的配置文件/boot/grub/。事实上该文件是/boot/grub/文件的一个软连接。

使用vi文本编辑器打开/boot/grub/配置文件,内容如下:

# generated by anaconda

#NOTICE:You have a /boot means that

#all kernel and initrd paths are relative to

/boot/,eg.

#root(hd0,7)

#kernel/vmlinuz-version ro

root=/dev/VolGroup00/LogVol00

#initrd/

#boot=/dev/sda

default=2

timeout=5

splashimage=(hd0,7)/grub/

hiddenmenu

titleFedora(7xen)

root(hd0,7)

kernel/7

module/7xen

roroot=/dev/VolGroup00/LogVol00 rhgb quiet

module/

titleFedora-base(7)

root(hd0,7)

kernel/7

roroot=/dev/VolGroup00/LogVol00 rhgb quiet

initrd/

titleWindowsXP

rootnoverify(hd0,0)

chainloader+1

其中

boot=/dev/sda

说明硬盘是sda类型,即SCSI接口的硬盘。

default=2

定义系统默认的启动入口,这里是2,代表第3个入口,即Windows系统。

timeout=5

缺省入口的显示延迟时间(s)。

splashimage=(hd0,7)/Grub/

用于GRUB的启动界面。

hiddenmenu

隐藏菜单界面。

titleFedora(7xen)

启动入口,每一个入口都以一个"title"的关键字开始,后面跟上对该启动入口的描述。这也是显示在

菜单上的选项。

root(hd0,7)

kernel/7

module/7xen ro

root=/dev/VolGroup00/LogVol00 rhgb quiet

module/

这是对应入口Fedora(7xen)的具体引导命令,包括挂载根目录命令root,加载内核

命令kernel,还有加载模块命令module。

titleFedora-base(7)

root(hd0,7)

kernel/7roroot=/dev/VolGroup00/LogVol00rhgbqu

iet

initrd/

这是第2个启动入口Fedora-base(7)的描述和具体的引导命令,注意其与第1个入口

的引导命令差别。

当GRUB无法引导多系统时,需要修改配置文件中不同启动入口的具体命令设置。

9.2 求援模式

本节主要讲解Linux修复以及救援模式。很多用户现在都是安装Windows和Linux双系统进行学习和

研究,在重装Windows或者是执行了一些误操作的时候,导致Linux启动失败。最简单的修复方法是重装

Linux系统,但是花费时间较长。以下给出进入Linux救援模式的方法,以帮助读者对损坏系统进行相关的

修复操作。

9.2.1 故障005无法进入救援模式

无法进入救援模式。

系统连单用户模式都无法进入时或出现GRUB命令行也不能解决的引导问题。

系统找不到启动文件或启动文件被更改。

当系统连单用户模式都无法进入时或出现GRUB命令行也不能解决的引导问题,需要使用Linux救援模式

来进行故障排除。此方法可分为4步骤进行。

(1)将Linux安装光盘(如果使用CD光盘,则放入第一张引导光盘)放入光驱,设置固件CMOS/BIOS

为光盘引导,当Linux安装画面出现后,选择"Rescue installed system",按"Tab"键进行编辑,出现以下语句:

>vmlinuz initrd= rescue

回车进入救援模式。

(2)系统会检测硬件,引导光盘上的Linux环境,依次提示选择救援模式下使用的语言(建议选择

默认的英文即可,因为部分Linux系统选择中文会出现乱码);键盘设置用默认的"us"就好;网络设置可以

根据需要,大部分故障修复不需要网络连接,可不进行此项设置,选择"No"。

(3)接下来系统将试图查找根分区。

默认在救援模式,硬盘的根分区将挂载到光盘Linux环境的/mnt/sysimage目录下,默认选项"continue"

表示挂载权限为读写;"Read-only"为只读,如果出现检测失败,可以选择"skip"跳过。

此处,因为要对系统进行修复,所以需要有读写权限,一般选择默认选项"continue"。进入下一步后,

系统提示执行"chroot /mnt/sysimage"命令,可以将根目录挂载到硬盘系统的根目录中去。

(4)出现"sh-3.2#"提示符。

执行以上步骤就可以进入到救援模式,此时可进行相关操作修复损坏的Linux系统。

9.2.2 故障006配置文件丢失

配置文件丢失。

系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默

认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。

误删除或修改错误配置文件。

此时,只有通过救援模式才可以解决此类问题,有以下两种情况。

1.有备份文件的恢复办法

进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议对系统中的重要数据目录,如/etc、

/boot等进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的

/boot/grub/及/etc/passwd的文件修改错误,也可以直接修正恢复。

假设有备份文件/etc/,则在救援模式下在终端中输入命令:

sh-3.2#chroot /mnt/sysimage

sh-3.2#cp /etc/ /etc/inittab

重新启动电脑,系统恢复完毕。

2.没有备份文件的恢复办法

此方法可分为两个步骤。

(1)如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找

/etc/inittab属于哪一个RPM包(即便文件丢失,因为存在RPM数据库,一样可以查找到结果),在终端

中输入命令:

sh-3.2#chroot /mnt/sysimage

sh-3.2#rpm -qf /etc/inittab

initscripts-8.54-1

退出chroot模式,在终端中输入命令:

sh-3.2#exit

(2)挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下),在终

端中输入命令:

sh-3.2#mount /dev/hdc /mnt/source

Fedora系统的RPM包存放在光盘Fedora/RPMS目录下,另外,因为要修复的硬盘系统的根目录在

/mnt/sysimage下,需要使用"-root"选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包,在终端中输

入命令:

sh-3.2#rpm -ivh --replacepkgs --root /mnt/sysimage

/mnt/source/Fedora/RPMS/

其中的rpm命令选项"replacepkgs"表示覆盖安装,执行完成后,即已经恢复了此文件。如果想只提取

RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,在终端中输入命令:

sh-3.2#rpm2cpio

mnt/source/Fedora/RPMS/|cpio-idv ./etc/ini

ttab

sh-3.2#cp etc/inittab /mnt/sysimage/etc

重新启动电脑,系统恢复完毕。

此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径

要写完整的绝对路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可。

9.3 重装Windows后无法进入Linux系统的故障排除

当安装双系统环境,先安装Linux再安装Windows;或者已经安装好双系统环境的Windows损坏,在

重新安装Windows后,保存 GRUB的MBR(Master Boot Record,主引导记录)会被Windows系统的自

举程序NTLDR所覆盖,造成Linux系统无法引导。

9.3.1 故障007无法进入Linux系统

无法进入Linux系统。

启动Linux失败。

系统找不到启动文件或是启动文件被更改。

此方法可分为3个步骤。

(1)如果要恢复双系统引导,首先用上述方法进入救援模式,在终端中重新输入命令:

sh-3.2#chroot /mnt/sysimage

(2)将根目录切换到硬盘系统的根目录中,然后在终端中输入命令grub-install重新安装GRUB。

sh-3.2#grub-install /dev/hda

"/dev/had"为硬盘名称,如使用SCSI硬盘或Linux安装在第二块IDE硬盘,此项设置要做相应调整。

(3)然后依次执行exit命令,退出chroot模式及救援模式(执行两次exit命令),在终端中重新输

入命令:

sh-3.2#exit

sh-3.2#exit

系统重启后,将恢复GRUB引导的双系统启动。

9.3.2 故障008 MBR损坏无法进入GRUB引导系统

MBR损坏无法进入GRUB引导系统。

系统连单用户模式都无法进入时或出现GRUB命令行也不能解决的引导问题。

重装。

此方法可分为3个步骤。

(1)从/projects/grub4dos主页下载grub4dos- ,解压后将grub4dos-0.4.3

目录下文件grldr复制到C盘根目录下(假如C盘是系统盘);修改文件C:。

通常是隐藏、只读的系统文件,所以需要将其的"隐藏"、"只读"属性去掉,才可以编辑。

在"我的电脑"工具菜单"文件夹选项"下的"查看"栏中取消"隐藏受保护的操作系统文件"和"隐藏已知文

件类型的扩展名",并选择"显示所有文件和文件夹",就可以看到C盘根目录下的文件了,在文件

最后加入一行:

c:grldr="grub"

重启系统,当出现选择系统列表时选择GRUB进入,这时原来GRUB的菜单就可见了,选择Linux

系统对应的菜单项进入Linux系统。

(2)进入后,在终端中输入命令:

#grub

将显示GRUB提示符,在终端中输入命令:

grub>find /boot/vmlinuz

该命令将显示/boot/vmlinuz所在的磁盘分区,就是Linux的引导分区,例如系统的显示结果:

grub> (hd0,X)

(3)然后在终端中输入命令:

grub>root (hd0,X)

grub>setup (hd0)

上面最后一条将GRUB重新写入MBR中,重启系统,启动菜单又可见了。

其中hd0表示第一块硬盘,X表Linux所在分区,可以在输入hd0,后按"Tab"键可以选择Linux所在

分区,还有一个强调的是在root和setup后面都有空格。如果成功将提示successful。

9.3.3 故障009无法进入GRUB界面

故障009无法进入GRUB界面。

GRUB无法引导系统。

GRUB配置文件错误。

这种方法并不修复MBR,完全靠Grub for dos引导Linux。

此方法可分为3个步骤。

(1)下载Grub for dos,解压缩,会生成Grub_for_dos文件夹,将该文件夹中的grldr文件复制到Windows

系统分区的根目录下,还要将该文件夹的子目录boot目录的子目录Grub目录下的文件也复制到

Windows系统分区的根目录下。

(2)到Windows系统分区的根目录下修改文件,假如Linux装在分区hda6(在Grub里表

示为(hd0,5))上,在该文件里添加下面一段:

title Linux

kernel (hd0,5)/boot/vmlinuz root=/dev/hda6

initrd (hd0,5)/boot/

(3)编辑系统文件,在该文件的最后添加一行:

C:grldr="grub"

保存,重启系统会发现在选择启动的操作系统时多出了一行Grub,选择这个选项,引导程序Grub将

自动读取C盘下刚才编辑的文件,此时将显示一个列表,每行代表一个要引导的系统。选择上面

添加的Linux这一行,之后将引导Linux操作系统,系统修复完毕。

系统分区(如C盘)下的那两个文件grldr和千万不要删除,如果删除就无法引导Linux了。

在使用linux过程中经常碰到Linux启动直接进入GRUB界面但没有启动选单(只剩下一个

“grub>”提示符)的状况,这时就认定系统已经没救,开始重新安装,甚至包括一些接触

Linux已久的人也是如此。其实出现此种状况,只要了解Linux系统引导过程中GRUB的作

用以及工作流程,就非常容易解决。

Linux系统在启动过程中,首先是硬件(PC上大多是CMOS/BIOS)的物理检测,诸如检测

系统的显卡、CPU和硬盘等,可从系统按下电源后看到此检测信息;检测无问题,将读取

硬盘的MBR(主引导分区)中的引导程序,Linux中常用的引程序如LILO和GRUB。引导

程序GRUB在系统启动期间只有一个作用,就是载入内核;内核在引导期间有两个主要的

作用,一个是驱动系统硬件,另一个将启动系统进程init;init进程将读取其配置文件

/etc/inittab完成后续所有的引导。

所以其实GRUB在引导期间只有一个最重要的作用,就是载入系统内核。那么GRUB在引

导期间到底是如何执行引导的呢?让我们来看以下的GRUB配置文件/boot/grub/

(一定要注意/etc/只是此文件的一个软链接)片断示例:

default=0

timeout=5

splashimage=(hd0,0)/grub/

hiddenmenu

title CentOS (5PAE)

root (hd0,0)

kernel /5PAE ro root=LABEL=/ rhgb quiet

initrd /

此段是加载GRUB的最重要的设置段,其中“title”段指定了GRUB引导界面系统的标题;

“root”段指定了/boot分区所在的位置;“kernel”段指定了内核所在位置

(5PAE ro root=LABEL=/ rhgb quiet),内核加载时权限属性为只读

(“ro”),以及指定根分区所在位置(root=LABEL=/);initrd指定了Linux镜像文件所在位

置。

当Linux系统中GRUB配置文件/boot/grub/内容修改错误或损坏时,系统启动后会

自动进入GRUB命令行模式(“grub>”),最常见的原因无外乎两个,一是GRUB配置文件

中此三段修改错误;二是GRUB配置文件丢失。(还有少数原因,如内核文件或镜像文件损

坏、丢失,/boot目录误删除等)此时可以使用如下几种方法进行恢复。

存在GRUB配置文件备份

如果存在GRUB配置文件备份,那么比较省事的办法就是对其进行备份恢复,可以按如下

方法进行:

◆ 把安装盘的第一张放到光驱,然后重新启动机器,在BOIS中设定系统用光驱引导;

◆ 等安装界面出来后,按F2键(不同Linux版本此快捷键可能稍有不同,如即时Linux是

按F5键盘),进入进入模式列表的界面,输入“linux rescue”,进入Linux维护模式;

◆ 一系列键盘以及几项简单的配制(如设置键盘等),这里不多做介绍,然后会出现如下字

符:

桌面应用

sh#

此时就可以在此命令行下执行操作了:

sh#cp /backup/ /mnt/sysimage/boot/grub/

或者 dd if=/dev/hda of=/root/mbr bs=512 count=1(要在linux下恢复mbr,必须得备份mbr

再用dd写才可以)

假设备份文件为/backup/ ,因绝大多数Linux光盘修复模式中会将硬盘系统的

“/”分区chroot到“/mnt/sysimage”处(在之前的配制中可以看到提示),所以拷贝的目标

为“/mnt/sysimage/boot/grub/”而非“/boot/grub/”

◆ 退出此模式,重启即可。

内核文件、镜像文件、/boot目录等文件损害或丢失,也可以使用此种方法修复。

如果没有GRUB配置文件备份

如果没有备份GRUB配置文件,或者想通过此试验更多了解GRUB的引导过程,可以利用

GRUB强大的交互功能,采用如下方法:

在“grub>”命令行下可以进行如下操作:

◆ 查找/boot/grub/分区所在目录可用如下命令:

grub> find /boot/grub/ (hd0,5)

需要注意的是,将得到配置文件所在系统的分区,(hd0,5)即表示它在分区hda6。

◆ 查看文件错误可用如下命令:

GRUB>cat (hd0,5)/boot/grub/

需要注意的是,可以查看到配置文件到底什么地方出现了错误,以便进入后修改。

◆ 指定/boot分区可用如下命令:

root (hd0,5)

需要注意的是,从此步骤开始,即为本文前面所提到的GRUB配置文件中的主要引导步骤,

只是一般都是系统读取GRUB配置文件引导,出现问题时我们可以手工指定引导。

◆ 指定内核加载可用如下命令:

kernel /boot/vmlinuz ro root=LABEL=/

◆ 指定镜像文件所在位置可用如下命令:

initrd /

◆ 从/boot分区启动可用如下命令:

boot (hd0,5)

此时,即可正常启动,实际上,以上步骤就是执行了GRUB引导期间加载文件的

步骤,当系统正常引导后将GRUB配置文件修改正确后即可。以上这个方法也可以用于测

试新编译的内核。对此故障排除的了解可以加深对GRUB引导以及Linxu系统引导的了解。

此外,还有一种情况是在安装Windwos时,把GRUB从MBR上清除,启动后根本连GRUB

的影子都看不到。如出现此问题,可以进入Linux维护模式,执行如下命令:

sh#grub-install /dev/sda

之后退出重新启动系统即可


本文标签: 系统 引导 文件 启动 进入