LoveUnix » 其他UNIX & Linux » Linux下GRUB引导单用户模式三种方式
让LU留住您的每

一天 让LU博客留住您的每一天
2007-2-8 11:14 蓝色虫
Linux下GRUB引导单用户模式三种方式

作为一个Linux系统管理员,你可能会把Linux 超级用户密码遗忘了,把/etc/inittab或/etc/rc.d/rc.sysinit之类文件误编辑,导致系统不能正常启动的恼人错误?

而为了解决以上问题,你就需要进到linux根文件系统处于可读写状态的单用户模式下。

下面介绍在GRUB引导下进入Linux单用户模式的三种方式:

(1) 硬件环境:

intel P4 / 1G RAM / sata 80G

(2) 软件环境:

1)Fedora Core 3(以下简称为FC3)和Windows2000 advance server双系统。

2)LVM管理Linux分区。

3)/boot/grub/grub.conf文件内容:

# grub.conf generated by anaconda
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,2)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda

default=1
timeout=1000
splashimage=(hd0,2)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.9-1.667)
root (hd0,2)
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.9-1.667.img title
windows 2000 adv rootnoverify (hd0,0)
chainloader +1


首先,启动电脑,屏幕出现如下提示:
Press any key to enter the menu Booting windows 2000 adv in 999 seconds…


按任一键跳过计时,进入下一步:
  GNU GRUB version 0.95 (639K lower/103924K upper memory)
  Fedora Core (2.6.9-1.667)
  Windows 2000 adv
 

下面是GRUB的提示:

‘e’ 在booting前编辑启动命令行。
‘a’ 在booting前编辑kernel的参数。
‘c’进入grub命令行。

由此按‘e’、a‘、’c‘三个不同的键,进入三种不同的操作:

1.快速法:
选择Fedora Core (2.6.9-1.667)菜单,按a键:
  grub append>ro root=/dev/VolGroup00/LogVol00 rhgb quiet
 
修改成:  
  grub append>ro root=/dev/VolGroup00/LogVol00 single quiet
 

按ENTER键完成修改并booting进入Linux单用户模式:   
  sh-3.00#
  

2.简便法:

选择Fedora Core (2.6.9-1.667)菜单,按e键:
  root (hd0,2)

kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.9-1.667.img
选择kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet

命令行

按e键:
grub edit>kernel /vmlinuz-2.6.9-1.667 ro
root=/dev/VolGroup00/LogVol00 rhgb quiet
  

修改成:
grub edit>kernel /vmlinuz-2.6.9-1.667 ro
root=/dev/VolGroup00/LogVol00 single quiet


按ENTER键完成修改。按b键booting进入Linux单用户模式:
  sh-3.00#
  

3.手动法:

按c键进入grub命令行:(在grub命令行下按TAB键可得到grub命令帮助与grub命令的可能选项)
  
  grub>fstest (grub>filesystem tracing is now on grub>root (hd0,2)

 
(指定保存有Linux 内核的分区为第一个硬盘的第三个分区)
 
grub>filesystem type is ext2fs,partition
type 0x83
grub>kernel /vmlinuz-2.6.9-1.667
ro root=/dev/VolGroup00/LogVol00 single quiet

(指定内核文件为/boot/vmlinuz-2.6.9-1.667,内核参数为ro—readonly, 根分区为/dev/VolGroup00/LogVol00,rhgb—图形方式启动,quiet—不输出启动信息)
 
  grub>initrd /initrd-2.6.9-1.667.img


(在内核启动前加载支持系统硬件设备的内核模块——initrd镜像文件——/boot/initrd-2.6.9-1.667.img,并初始化RAM disk)
 
  grub>boot

如果系统的配置与脚本文件正确,以上三种方式在Booting command-list中都会出现:
 
  remounting root filesystem in read-write mode:[OK]
 
表示此时linux单用户模式下的根文件系统处于可读可写状态。如果系统的配置与脚本文件出现错误,linux单用户模式下的根文件系统进入“read-only file system”既只读状态,此时,打入:
  
  sh-3.00#mount –o remount rw –t ext3 / 

让根文件系统重新mount成可读写,你就可以自由编辑出现错误的系统文件了。

[[i] 本帖最后由 蓝色虫 于 2007-2-8 12:29 编辑 [/i]]

2007-2-8 12:09 蓝色虫
GRUB的配置文件menu.lst的写法

menu.lst位于/boot/grub/menu.lst,而/boot/grub/grub.conf相当于是menu.lst在windows下的快捷方式(重装系统有时破坏GRUB后,menu.lst丢失而无法启动GRUB菜单时就需要在/boot下建立menu.lst后再和grub.conf建立链接来修复,建立链接是:ln -s menu.lst grub.conf (注意两文件的前后关系)),我们来学习如何编写GRUB的配置文件menu.lst.

首先来看一下/boot/grub/menu.lst中的内容:
default=0
timeout=5
#splashimage=(hd0,6)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.11-1.1369_FC4)
root (hd0,6)
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
initrd /boot/initrd-2.6.11-1.1369_FC4.img
title Windows XP
rootnoverify (hd0,0)
chainloader +1
其中:
a,default=0
表示默认启动的第0号的操作系统,在GRUB中,title定义了启动的操作系统,从第1个开始,GRUB中是0,而第2个是1,依次类推...
b,timeout=5
表示的是出现GRUB界面后,无操作情况下进入default设定的操作系统的时间,如果上下移动选择,则该选项无效
c,splashimage=(hd0,6)/boot/grub/splah.xpm.gz
表示的是允许出现的GRUB背景的path,显然(hd0,6)指定了分区(不知能否这么解释,呵呵),而后边的则是正常的path(在例子中,用#把它注释,为一可选项)
d,hiddenmenu
表示隐藏GRUB的启动菜单,直接进入由default庙宇的操作系统中去,为一可选项.

linux类
其格式一般为:
title  (......)
root   (hd[0-n],x)
kernel (......)
initrd (......)
其中:
title行,是定义一个启动操作系统,而后边可以自己随便写上喜欢的名字,呵,当然最起码你得写得要自己能认出来,没必要把linux写成windows吧?!

root行,指定相应的linux所有的/boot,如果在写分区和挂载时没有单独挂载,那么就和/在同一个分区中,hd[0-n]表示的是第几个硬盘,而x则表示的是[第几个分区-1],即x比分区号小1,特别要注意.

kernel行,在这里以kernel 起始,指定Linux的内核的文件所处的绝对路径(通过在终端输入命令:ls /boot/vmlinuz*来看内核的全名);因为内核是处在/boot目录中的,而如果/boot是独立的一个分区,则需要把boot省略,因为/boot所在的分区在root (hd[0-n],x)中指定了,所以就无需要再指明内核处在哪个分区了;ro 表示只读;root=LABEL=/ 来表示Linux的根所处的分区。LABEL=/ 这是硬盘分区格式化为相应文件系统后所加的标签;如果您不了解什么是标签,也可以直接以/dev/hd[a-z]X 或者/dev/sd[a-z]X来表示;就看您的Linux是根分区是在哪个分区了。比如我的是在/dev/hda3, 那这里就可以写成root=/dev/hda3;

initrd行,如果是/boot独立一个分区,initrd 一行要把/boot中省略;如果/boot不是处于一个分区,而是和Linux的/分区处于同一分区,不应该省略;我们通过查看/boot中的initrd的文件名到底是什么来写这一行代码,在终端输入:ls /boot/initrd*
很容易能得到initrd文件名,然后写入.

在了解了以上情况之后,我们就很容易地理解另一种写法了:
title (......)
kernel (hd[0-n],y)(/boot)...... ro root=......
initrd (hd[0-n],y)(/boot)......
其实只是省略的root很实在地写在了kernel和initrd行中去了而已

附:
其实在GRUB启动菜单不能工作的时候,进入GRUB命令行(可按CTRL+C键)后,我们同样可以一步一步地把系统启动起来,其实在menu.lst中,除title不是指令外,其余的都是GRUB指令,我们只要一步步地输入它们(错了要从新开始),中间输入关于kernel和 initrd要利用
TAB键补齐写好,最后只要boot一下就行了.

用GRUB指令引导windows:
GRUB> rootnoverify (hd0,0)
GRUB> chainloader +1
GRUB> boot

用GRUB指令引导linux:
略,读者可参考本文中的一些知识自己试验.

2007-3-3 13:37 luweinet
hoho~~写的很详细了
如果遇到多硬盘的时候需要考虑
如windows在 hdd1
----------------------------------------
title Luweinet@Windows2003
        root (hd2,0)
        chainloader (hd2,0)+1
        makeative
        map (hd0) (hd2)
        map (hd2) (hd0)
        boot
--------------------------------------

2007-3-4 14:43 hong123
收藏了!

2007-8-7 14:53 myciciy
收藏了

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.