LINUX中GRUB故障排除.docx
《LINUX中GRUB故障排除.docx》由会员分享,可在线阅读,更多相关《LINUX中GRUB故障排除.docx(17页珍藏版)》请在冰豆网上搜索。
LINUX中GRUB故障排除
LINUX中GRUB故障排除
在Linux系统进行安装系统、更新软件等操作时,系统经常会出现安装故障和更新故障。
本章主要针对开机后无法引导系统的故障,专门介绍了GRUB系统引导软件的安装和使用,以及在紧急状况下如何进入救援模式并恢复系统设置。
9.1 Linux启动安装进程故障排除
机器启动时若GRUB配置文件出错,则无法顺利进入操作系统。
GRUB在Linux系统中的作用日益重要。
本节就GRUB软件的安装和使用过程中经常出现的故障的排除方法进行了详细的介绍。
9.1.1 故障001开机启动后GRUB失败
开机后启动GRUB失败。
GRUB(GrandUnifiedBootLoader)是Linux环境下常用的引导程序,经常会由于配置被更改或者重新安装系统而失效。
当我们启动系统,在自检结束后没有进入GRUB选项菜单,而只是出现"grub>命令提示符"时,表示系统启动GRUB失败了。
系统无法通过GRUB的设置进入Windows或Linux系统。
用户在更改GRUB配置文件后没有及时修复。
根据是否将/boot单独分区,分两种情况进行说明。
1.没有将/boot单独分区的情况
在grub提示符下输入命令:
grub>install(hd0,1)/boot/Grub/stage1d(hd0)(hd0,1)/boot/grub/stage2
p(hd0,1)/boot/grub/menu.lst
GRUB的安装分为两个主要的步骤:
stage1和stage2。
stage1是一段嵌入MBR的迷你代码。
stage2是主要部分,在stage1把控制权传递给它后,就由它来接管所有事情。
install后面必须指定stage1的位置,这里假设FedoraCore7安装在/dev/sda2,则其分区位置为(hd0,6),因为GRUB能读取文件系统,所以还指定了分区上目录位置:
/boot/grub/stage1,参数d表示stage1将寻找stage2所在的磁盘。
接着就是GRUB的安装位置:
(hd0),这里就是指安装在MBR(主引导记录)。
后面的参数指定stage2的位置:
(hd0,1)。
参数p指定menu.lst文件的位置。
在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/stage1d(hd0)(hd0,1)/grub/stage2p(hd0,1)/grub/menu.lst
上例假设/boot位于(hd0,1)(也就是hda2),而/位于(hd0,2)(也就是hda3),我们不能用"(hd0,2)/boot/grub/stage1",因为GRUB不知道(hd0,1)是/boot,所以必须首先指向挂接为/boot的分区,然后把目录指向那里。
重新启动系统以后,就可以看到GRUB菜单了。
另外还有一种方法可以恢复GRUB到MBR,步骤如下。
(1)查找/boot/grub/grub.conf文件,如果命令执行成功,会返回对应分区,如(hd0,6)。
grub>find/boot/grub/grub.conf
(hd0,6)
(2)挂载分区(hd0,6),命令返回对应分区的文件系统格式。
grub>root(hd0,6)
thetypeof(hd0,6)isext2
如果是Linux系统,则为ext2fs文件系统格式;若是WindowsXP系统,则为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目录中,内核的文件名是vmlinuz-2.6.21-1.3194.fc7。
这种情况下,要引导系统,应当在grub提示符后面输入下面的命令:
grub>root(hd0,0)
grub>kernel/vmlinuz-2.6.21-1.3194.fc7root=/dev/sda7
grub>boot
这里root语句给出了包含内核的分区。
kernel语句描述了分区中内核文件的路径和文件名。
参数"root="给出了包含/sbin/init的分区,即系统的根分区。
2.没有将/boot单独分区的情况
假设系统没有将/boot单独分区,而是将系统全部安装在/dev/sda1下,则使用的命令稍有不同。
grub>root(hd0,0)
grub>kernel/boot/vmlinuz-2.6.21-1.3194.fc7root=/dev/sda1
grub>boot
9.1.4 故障004使用GRUB引导多系统失败
使用GRUB引导多系统失败。
GRUB是一个功能强大的引导软件,可以同时支持Linux和Windows系统,当机器中同时安装的Windows或Linux系统无法成功在GRUB引导下启动,而只是出现"grub>命令提示符"时,表明GRUB引导多系统失败。
用户更改了GRUB配置文件或重装系统后GRUB配置文件中引导记录被更改。
当使用GRUB来引导多系统时,可以在GRUB菜单通过选项选择引导的系统。
如果无法引导,则要查看相关的配置文件/boot/grub/menu.lst。
事实上该文件是/boot/grub/grub.conf文件的一个软连接。
使用vi文本编辑器打开/boot/grub/menu.lst配置文件,内容如下:
#Grub.confgeneratedbyanaconda
#NOTICE:
Youhavea/bootpartition.Thismeansthat
#allkernelandinitrdpathsarerelativeto/boot/,eg.
#root(hd0,7)
#kernel/vmlinuz-versionroroot=/dev/VolGroup00/LogVol00
#initrd/initrd-version.img
#boot=/dev/sda
default=2
timeout=5
splashimage=(hd0,7)/grub/splash.xpm.gz
hiddenmenu
titleFedora(2.6.20-2925.9.fc7xen)
root(hd0,7)
kernel/xen.gz-2.6.20-2925.9.fc7
module/vmlinuz-2.6.20-2925.9.fc7xenroroot=/dev/VolGroup00/LogVol00rhgbquiet
module/initrd-2.6.20-2925.9.fc7xen.img
titleFedora-base(2.6.21-1.3194.fc7)
root(hd0,7)
kernel/vmlinuz-2.6.21-1.3194.fc7roroot=/dev/VolGroup00/LogVol00rhgbquiet
initrd/initrd-2.6.21-1.3194.fc7.img
titleWindowsXP
rootnoverify(hd0,0)
chainloader+1
其中
boot=/dev/sda
说明硬盘是sda类型,即SCSI接口的硬盘。
default=2
定义系统默认的启动入口,这里是2,代表第3个入口,即Windows系统。
timeout=5
缺省入口的显示延迟时间(s)。
splashimage=(hd0,7)/Grub/splash.xpm.gz
用于GRUB的启动界面。
hiddenmenu
隐藏菜单界面。
titleFedora(2.6.20-2925.9.fc7xen)
启动入口,每一个入口都以一个"title"的关键字开始,后面跟上对该启动入口的描述。
这也是显示在菜单上的选项。
root(hd0,7)
kernel/xen.gz-2.6.20-2925.9.fc7
module/vmlinuz-2.6.20-2925.9.fc7xenroroot=/dev/VolGroup00/LogVol00rhgbquiet
module/initrd-2.6.20-2925.9.fc7xen.img
这是对应入口Fedora(2.6.20-2925.9.fc7xen)的具体引导命令,包括挂载根目录命令root,加载内核命令kernel,还有加载模块命令module。
titleFedora-base(2.6.21-1.3194.fc7)
root(hd0,7)
kernel/vmlinuz-2.6.21-1.3194.fc7roroot=/dev/VolGroup00/LogVol00rhgbquiet
initrd/initrd-2.6.21-1.3194.fc7.img
这是第2个启动入口Fedora-base(2.6.21-1.3194.fc7)的描述和具体的引导命令,注意其与第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安装画面出现后,选择"Rescueinstalledsystem",按"Tab"键进行编辑,出现以下语句:
>vmlinuzinitrd=initrd.imgrescue
回车进入救援模式。
(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/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。
假设有备份文件/etc/inittab.bak,则在救援模式下在终端中输入命令:
sh-3.2#chroot/mnt/sysimage
sh-3.2#cp/etc/inittab.bak/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/
initscripts-8.54-1.i386.rpm
其中的rpm命令选项"replacepkgs"表示覆盖安装,执行完成后,即已经恢复了此文件。
如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,在终端中输入命令:
sh-3.2#rpm2cpiomnt/source/Fedora/RPMS/initscripts-8.54-1.i386.rpm|cpio-idv./etc/inittab
sh-3.2#cpetc/inittab/mnt/sysimage/etc
重新启动电脑,系统恢复完毕。
此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的绝对路径。
提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可。
9.3 重装Windows后无法进入Linux系统的故障排除
当安装双系统环境,先安装Linux再安装Windows;或者已经安装好双系统环境的Windows损坏,在重新安装Windows后,保存GRUB的MBR(MasterBootRecord,主引导记录)会被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 故障008MBR损坏无法进入GRUB引导系统
MBR损坏无法进入GRUB引导系统。
系统连单用户模式都无法进入时或出现GRUB命令行也不能解决的引导问题。
重装。
此方法可分为3个步骤。
(1)从0.4.3.zip,解压后将grub4dos-0.4.3目录下文件grldr复制到C盘根目录下(假如C盘是系统盘);修改文件C:
\boot.ini。
boot.ini通常是隐藏、只读的系统文件,所以需要将其的"隐藏"、"只读"属性去掉,才可以编辑。
在"我的电脑"工具菜单"文件夹选项"下的"查看"栏中取消"隐藏受保护的操作系统文件"和"隐藏已知文件类型的扩展名",并选择"显示所有文件和文件夹",就可以看到C盘根目录下的boot.ini文件了,在文件最后加入一行:
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,完全靠Grubfordos引导Linux。
此方法可分为3个步骤。
(1)下载Grubfordos,解压缩,会生成Grub_for_dos文件夹,将该文件夹中的grldr文件复制到Windows系统分区的根目录下,还要将该文件夹的子目录boot目录的子目录Grub目录下的menu.lst文件也复制到Windows系统分区的根目录下。
(2)到Windows系统分区的根目录下修改menu.lst文件,假如Linux装在分区hda6(在Grub里表示为(hd0,5))上,在该文件里添加下面一段:
titleLinux
kernel(hd0,5)/boot/vmlinuzroot=/dev/hda6
initrd(hd0,5)/boot/initrd.img
(3)编辑系统文件boot.ini,在该文件的最后添加一行:
C:
\grldr="grub"
保存,重启系统会发现在选择启动的操作系统时多出了一行Grub,选择这个选项,引导程序Grub将自动读取C盘下刚才编辑的文件menu.lst,此时将显示一个列表,每行代表一个要引导的系统。
选择上面添加的Linux这一行,之后将引导Linux操作系统,系统修复完毕。
系统分区(如C盘)下的那两个文件grldr和menu.lst千万不要删除,如果删除就无法引导Linux了。
在使用linux过程中经常碰到Linux启动直接进入GRUB界面但没有启动选单(只剩下一个“grub>”提示符)的状况,这时就认定系统已经没救,开始重新安装,甚至包括一些接触Linux已久的人也是如此。
其实出现此种状况,只要了解Linux系统引导过程中GRUB的作用以及工作流程,就非常容易解决。
Linux系统在启动过程中,首先是硬件(PC上大多是CMOS/BIOS)的物理检测,诸如检测系统的显卡、CPU和硬盘等,可从系统按下电源后看到此检测信息;检测无问题,将读取硬盘的MBR(主引导分区)中的引导程序,Linux中常用的引程序如LILO和GRUB。
引导程序GRUB在系统启动期间只有一个作用,就是载入内核;内核在引导期间有两个主要的作用,一个是驱动系统硬件,另一个将启动系统进程init;init进程将读取其配置文件/etc/inittab完成后续所有的引导。
所以其实GRUB在引导期间只有一个最重要的作用,就是载入系统内核。
那么GRUB在引导期间到底是如何执行引导的呢?
让我们来