Linux
系统启动过程:
1、
主机开机后,就是硬件检测(
POST
),通过后再根据
BIOS
里面设置的启动顺序找到启动驱动器(如硬盘,光驱等),计算机启动都要经过这一步,没什么好说的啦。
2、
读取硬盘
MBR
,启动系统引导程序(如
grub
、
lilo
),再由系统引导程序加载
Linux
的核心(
kernel
)
系统引导程序引导并运行核心可以分两个阶段:
一阶段:即
BIOS
从
MBR
中读入
IPL
(
initial program loaderI
),就是启动系统引导程序如
grub
;
二阶段:加载
boot loader
的所有配置文件和相关的环境参数;由于
MBR
只有
512
字节,所以系统引导工具还要从其它地方读入数据
( /boot
目录下的文件
)
注:
MBR
(
Master Boot Record
512
字节,
0
头
0
道
1
扇区),前
446
字节
存放的是
stage1
,后面存放硬盘分区表信息;
3、
Kernel
会立即初始化系统中各种设备并做相关配置工作,其中包括
CPU
、
I/O
、存储设备等,也就是加载驱动程序啦。
4、
驱动加载后,会创建一个根设备,然后将根文件系统
/
以只读的方式挂载,结束后,执行
switchroot
,转到真正的根
/
上面去,同时运行
/sbin/init
程序,运行
linux
系统的第一号进程(
init
进程,也就是所有进程的父进程,
PID
为
1
)
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)
激活
RAID
和
LVM
设备
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
//
在启动菜单选择界面停停留时间,单位是秒;
splashimage=(hd0,0)/grub/splash.xpm.gz
//GRUB
启动背景画面,可以不写;
hiddenmenu
//
开机时是否显示启动菜单,如果要显示的话就要注释掉;
title Red Hat Enterprise Linux Server ( 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
文件在哪里,所以说会启动不了。会提示以下内容:
而这个时候我们可以通过下面的步聚来恢复;
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-bzImage
,
setup=0x1e00
,
size=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
文件;