Linux系统启动过程:
1、  主机开机后,就是硬件检测(POST),通过后再根据BIOS里面设置的启动顺序找到启动驱动器(如硬盘,光驱等),计算机启动都要经过这一步,没什么好说的啦。
2、  读取硬盘MBR,启动系统引导程序(如grublilo),再由系统引导程序加载Linux的核心(kernel
系统引导程序引导并运行核心可以分两个阶段:
一阶段:即BIOSMBR中读入IPLinitial program loaderI),就是启动系统引导程序如grub
二阶段:加载boot loader的所有配置文件和相关的环境参数;由于MBR只有512字节,所以系统引导工具还要从其它地方读入数据( /boot目录下的文件)
    注:MBRMaster Boot Record 512 字节,001扇区),前446字节存放的是 stage1,后面存放硬盘分区表信息;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

3、  Kernel会立即初始化系统中各种设备并做相关配置工作,其中包括CPUI/O、存储设备等,也就是加载驱动程序啦。

4、  驱动加载后,会创建一个根设备,然后将根文件系统 / 以只读的方式挂载,结束后,执行 switchroot,转到真正的根 / 上面去,同时运行 /sbin/init 程序,运行linux系统的第一号进程(init进程,也就是所有进程的父进程,PID1

init初始化过和参考:http://blog.chinaunix.net/u1/48373/showart_416908.html

5、  读取 /etc/inittab 配置文件

6、  执行系统初始化脚本 /etc/rc.d/rc.sysinit )对系统进行基本配置,以读写方式挂载根文件系统及其其它文件系统;
主要工作有:
a)
取得网络环境与主机类型(/etc/sysconfig/network)、
b)
挂载 /proc /sys
c)
配置selinux

d)
系统时钟,
e)
内核参数(/etc/sysctl.conf),
f)
加载用户自定义的模块( /etc/sysconfig/modules/*.modules)

g)hostname
h)
使能swap分区,
I
)根文件系统的检查和二次挂载(读写),

j)
激活RAIDLVM设备
k)
使能磁盘 quota
l)
检查并挂载其它文件系统

等等。

根据运行级别启动相应服务,具体的每个运行级别的服务状态是放在 /etc/rc.d/rcX.d (X= 0 ~ 6)目录下,所有的文件均链接到 /etc/init.d下的相应文件
/etc/rc.d/rcX.d/
里面的文件介绍:(里面的文件都是链接文件,都是指向 /etc/init.d底下)
l         S 为开头的文件,为开机时需要启动的服务;

l         K 为开头的文件,为关机时需要关闭的服务的档案连结;

l         S K 后面接的数字,代表该档案被执行的顺序。

7、  读取 /etc/rc.d/rc.local 文件,就是启动用户自定义的一些脚本程序,所以说如果你有什么东西需要在系统启动时启的的话就往这个文件里面写就可以了。

8、  执行 /bin/login 程序,并等待用户登入

9、  系统启动完成。

 

参考文章:http://blog.chinaunix.net/u1/48373/showart_418407.html

 

 

知道了Linux系统的开机流程,下面再了解一下GRUB的配置文件,以RHEL5.0做参考:
该文件位置保存在 /boot/grub/grub.conf,还有一个链接文件是 /boot/grub/menu.lst 也是指向/boot/grub/grub.conf

 

[root@rhel5 ~]# vi /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,0)

#          kernel /vmlinuz-version ro root=/dev/hda2

#          initrd /initrd-version.img

#boot=/dev/had

 

default=0    // 默认启动第一个系统,以 title 分隔;

timeout=5    // 在启动菜单选择界面停停留时间,单位是秒;

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz   //GRUB 启动背景画面,可以不写;

hiddenmenu    // 开机时是否显示启动菜单,如果要显示的话就要注释掉;

title Red Hat Enterprise Linux Server (<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2.6.18-53.el5)   // 启动菜单显示的标题

        root (hd0,0)    // root 启动文件所在置

        kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet  //kernel 内核所在位置和名字

        initrd /initrd-2.6.18-53.el5.img    // initrd 内核镜象的名字

title windows  XP    //第二个操作系统的标题
rootnoverify (hd0,1)   
//操作系统存放在hd0,1上,不要在grub里挂载
chainloader +1    
// 加载 boot loader 的定义值, 那个 +1 代表的是第一

sector ,也可以说成 Super block

注意: kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
rhgb 表示 redhat graphics boot ,就是会看到图片来代替启动过程中显示的文本信息,这些信息在启动后用 dmesg 也可以看到
quiet
表示在启动过程中只有重要信息显示,类似硬件自检的消息不回显示

 

当你的grub.conf 配置文件出错,或者是丢失的时候,你就会发现进不了系统了。为什么?

因为Linux系统启动时,找不到Kernel 文件在哪里,所以说会启动不了。会提示以下内容:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

而这个时候我们可以通过下面的步聚来恢复;

1)        先找到 vmlinuz 所在的分区,也就是  /boot所在分区


grub > root
 (hd0,0)
Filesystem type is ext2fs , partition type 0x83
或者是
grub > find /vmlinuz-2.6.18-53el5 (
这里可以用TAB来补全 )
  (hd0
0)
grub >

 

2)执行kernel /vmlinuz-2.6.18-53.el5  ro  root=LABEL=/rhgb quiet (用来指定linux内核)

grub > kernel  /vmlinuz-2.6.18-53.el5  ro  root=LABEL=/  rhgb quiet (可以用TAB补全)

[Linux-bzImagesetup=0x1e00size=0x1b3654]

 

3) 执行initrd /initrd-2.6.18-53.el5.img(用来指定initrd文件)

grub > initrd   /initrd-2.6.18-53.el5.img   (这里可以用TAB来补全)

     [Linux-initrd @ 0xfc9d000 0x242073  bytes ]

 

4) 执行boot

grub > boot

后看到底下的 Hed Hat这几个红字时就是OK的意思了。再下去就是启动系统啦。

登录系统时就可以在里面修改 /boot/grub/grub.conf 配置文件错误的地方了,最方便的就是把你备份出来的grub.conf文件直接COPY一份到 /boot/grub/ 下面;所以说要注意备份这些文件,要是没有备份的话只能手工写一个了,内容就是前面所说的grub.conf 文件内容啦。

注意:关于不同的发行版的 kernel 核心那里可能不一样,你可以ls /boot 查看一下kernel文件的位置和名称以及指定initrd 文件;