*****************************》start《**********************************
Linux的启动过程大致可以分为5各部分
1、BOIS加电自检
2、加载主引导程序(MBR)
3、加载次引导程序(GRUB)
4、加载linux内核镜像
5、加载init进程
Linux启动的总揽图:
这5个部分具体是怎么协同工作的呢??
一、首先,计算机启动后进行各种硬件设备,然后按照CMOS设置的启动顺序搜索处于活动状态并可以引导的设备。
一般主要以硬盘做引导,硬盘中得主引导记录(master boot record)中保存有引导加载程序。
MBR是一个512字节的扇区,位于硬盘的第一个扇区中。
可以用命令dd查看:
[root@Bruse ~]# dd if=/dev/sda of=mbr.dmp bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000104006 seconds, 4.9 MB/s
[root@Bruse ~]# od -xa mbr.dmp
0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e
k H dle dle so P < nul 0 8 nul nul so X so @
0000020 befb 7c00 00bf b906 0200 a4f3 21ea 0006
{ > nul | ? nul ack 9 nul stx s $ j ! ack nul
0000040 be00 07be 0438 0b75 c683 8110 fefe 7507
nul > > bel 8 eot u vt etx F dle soh ~ ~ bel u
0000060 ebf3 b416 b002 bb01 7c00 80b2 748a 0203
s k syn 4 stx 0 soh ; nul | 2 nul nl t etx stx
0000100 0080 8000 d441 0000 0800 90fa f690 80c2
nul nul nul nul A T nul nul nul bs z dle dle v B nul
0000120 0275 80b2 59ea 007c 3100 8ec0 8ed8 bcd0
… …
其中dd命令可以读取MBR的内容,然后将读取到的内容写入mbr.dmp文件中。然后以ASCII和十六进制显示文件的内容。
BIOS会把MBR中的引导加载程序加载到内存中去,然后把控制权交给引导加载程序继续启动。
二、加载引导程序
Redhat默认的引导程序是GRUB,其引导过程可以分为2各阶段:1、保存在MBR中的主引导加载程序的加载(MBR是一个512字节的映像,其中包括机器的二进制代码和一个小分区表。MBR的任务就是查找并加载保存在硬盘分区上的次引导加载程序。它是通过分区表来查找活动分区,然后将活动分区的次引导加载程序从设备读入到内存中并运行),2、次引导加载程序(也叫内核加载程序),这个阶段只要是加载linux的内核。一旦内核加载成功就会出现下面的界面:
这个界面中可以用上下左右的方向键选择你想启动的系统或者内核。不选择的话,默认过5秒会进入到grub.conf中设置的系统,GRUB确定启动的系统后,他就会定位相应的内核映像所在的/boot/目录。
内核映像文件的格式:/boot/vmlinuz-。例如centOS5.5的内核映像文件就是:/boot/vmlinuz-2.6.18-194.el5
接着GRUB会把内核的映像加载到内存中去。内核映像不是一个可以执行的内核,而是一个压缩的内核映像。GRUB会把这个内核的映像解压,加载到内存中并执行,至此GRUB的任务完成了。
接着我们看一下GRUB的配置:
GRUB的配置是通过/boot/grub/grub.conf来完成的,我们看看grub.conf
#vim /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/VolGroup00/LogVol00
#initrd /initrd-version.img
#boot=/dev/sda//位置
default=0
//启动默认的操作系统,0是title中设置的第一个操作系统,即CentOS
timeout=5//timeout设置超时时间,超过5秒后自动启动default设置的系统
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz// splashp_w_picpath设置GRUB的背景图片
hiddenmenu// hiddenmenu可以隐藏启动菜单,超时后进入默认的系统
title CentOS (2.6.18-194.el5)//定义GRUB菜单中的第一个操作系统
root (hd0,0)
kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.18-194.el5.img
title other//定义GRUB中的第二个操作系统
rootnoverify (hd0,5)
chainoader +1
* GRUB中计数是以0开始的,0表示第一个。所以配置文件中的(hd0,0)表示的就是第一块硬盘的第一个主分区
三、内核映像
GRUB把内核映像加入到内存中后,并把控制权交给linux内核后,Linux内核获取控制权后,会按照下面的步骤继续引导操作系统
1、内核映像先检测系统中的硬件设备,包括CPU、内存、硬盘,并对这些设备进行初始化。
2、内核映像对自身解压,同时加载设备驱动。
3、初始化文件系统相关的虚拟设备,如LVM\RAID等
4、装载/文件系统,把根文件系统挂载到根目录下
5、完成引导后,linux内核会在其进程空间加载init进程,并把控制权交给init进程
内核映像引导过程:
四、init进程加载
(1)什么是init进程
Init进程是linux系统中进程的起点,内核完成引导后便会加载init进程,进程号永远是1.init进程启动后,首先会初始化操作系统,并启动特定的运行级别(Runlevel)下的自动运行程序。Init进程对应的执行文件是/sbin/init.init进程是系统中进程的发起者和控制着,其他的进程都是由init进程衍生出来的。
(2)init进程的作用
Init进程一般有两个作用:1、作为所有进程的父进程的参考对象。2、运行不同级别的程序
由于init进程永远不会被终止,所以,系统会在必要的时候把他作为父进程进行参考。
除过init进程以外所有进程都有父进程。当某个进程在他衍生出来的所有子进程结束之前就被终止了,就会出现以init进程作为父进程。
[root@Bruse ~]# ps -ef | more
UIDPID PPID C STIME TTY TIME CMD
root1 0 0 23:18 ? 00:00:01 init [5] //init进程
root2 1 0 23:18 ? 00:00:00 [migration/0] // init作为父进程的进程
root3 1 0 23:18 ? 00:00:00 [ksoftirqd/0]
root4 1 0 23:18 ? 00:00:00 [watchdog/0]
root5 1 0 23:18 ? 00:00:00 [events/0]
root6 1 0 23:18 ? 00:00:00 [khelper]
root7 1 0 23:18 ? 00:00:00 [kthread]
root10 7 0 23:18 ? 00:00:00 [kblockd/0]
root11 7 0 23:18 ? 00:00:00 [kacpid]
root175 7 0 23:18 ? 00:00:00 [cqueue/0]
这些进程中PPID=1的进程有的是由init进程派生出来的,有的是由于原父进程被终止了。
运行不同级别的程序:init的另一个作用就是初始化操作系统,进入特定的运行级别运行相应的程序,对各个程序进行管理。
(3)init进程的引导过程
Init进程取得控制权后,首先会执行/etc/rc.d/rc.sysinit脚本,根据脚本中的代码配置环境变量、网络、启用swap、检查并挂载文件系统、执行其他初始化所必须得步骤。
#cat /etc/rc.d/rc.sysinit | more
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#
HOSTNAME=`/bin/hostname`//设置主机名
HOSTTYPE=`uname -m`//设置系统类型
unamer=`uname -r`//用unamer保存uname –r的结果
set -m
if [ -f /etc/sysconfig/network ]; then//初始化网络配置
. /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then //设置主机名,如果没有,就以//calhost作为主机名
HOSTNAME=localhost
fi
if [ ! -e /proc/mounts ]; then //挂载系统文件
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
--More—
接下来init进程会执行/etc/inittab脚本中的代码,这个脚本中定义了linux的运行级别。以及每个级别对应的引导步骤。
[root@Bruse ~]# cat /etc/inittab | more
#
# inittabThis file describes how the INIT process should set up
#the system in a certain run-level. // init文件描述
#
# Author:Miquel van Smoorenburg,
#Modified for RHS Linux by Marc Ewing and Donnie Barnes
#//作者说明
# Default runlevel. The runlevels used by RHS are:
#0 - halt (Do NOT set initdefault to this) //关闭系统
#1 - Single user mode //单用户模式
#2 - Multiuser, without NFS (The same as 3, if you do not have networking)
//多用户模式,没nfs
#3 - Full multiuser mode //完全多用户模式
#4 – unused //未使用
#5 - X11 //图形环境
#6 - reboot (Do NOT set initdefault to this) //重启系统
#
id:3:initdefault://默认启动级别为3
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit //调用sysinit:/etc/rc.d/rc.sysinit脚本
l0:0:wait:/etc/rc.d/rc 0//处于0级的操作
l1:1:wait:/etc/rc.d/rc 1//处于1级的操作
l2:2:wait:/etc/rc.d/rc 2//处于2级的操作
l3:3:wait:/etc/rc.d/rc 3//处于3级的操作
l4:4:wait:/etc/rc.d/rc 4//处于4级的操作
l5:5:wait:/etc/rc.d/rc 5//处于5级的操作
l6:6:wait:/etc/rc.d/rc 6//处于6级的操作
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now//允许使用CTRL-ALT-DELETE组合键
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
// 当收到来自UPS的断电警告2分钟后关机
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
。。。。。。。
每个系统运行的级别都不一样,他们各自的脚本在
l0:0:wait:/etc/rc.d/rc 0//处于0级的操作
l1:1:wait:/etc/rc.d/rc 1//处于1级的操作
l2:2:wait:/etc/rc.d/rc 2//处于2级的操作
l3:3:wait:/etc/rc.d/rc 3//处于3级的操作
l4:4:wait:/etc/rc.d/rc 4//处于4级的操作
l5:5:wait:/etc/rc.d/rc 5//处于5级的操作
l6:6:wait:/etc/rc.d/rc 6//处于6级的操作
这些脚本下的文件都是连接文件,指向/etc/init.d/…
这是init 5下的一些东东:
[root@Bruse ~]# cd /etc/rc.d/rc5.d/
[root@Bruse rc5.d]# ls -l
总计 316
lrwxrwxrwx 1 root root 17 04-10 07:53 K01dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root 24 04-10 07:56 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd
lrwxrwxrwx 1 root root 24 04-10 08:00 K02NetworkManager -> ../init.d/NetworkManager
lrwxrwxrwx 1 root root 17 04-10 07:57 K02oddjobd -> ../init.d/oddjobd
lrwxrwxrwx 1 root root 16 04-10 07:54 K05conman -> ../init.d/conman
lrwxrwxrwx 1 root root 19 04-10 07:53 K05saslauthd -> ../init.d/saslauthd
lrwxrwxrwx 1 root root 17 04-10 07:53 K05wdaemon -> ../init.d/wdaemon
lrwxrwxrwx 1 root root 16 04-10 07:54 K10psacct -> ../init.d/psacct
lrwxrwxrwx 1 root root 14 04-10 07:52 K10tcsd -> ../init.d/tcsd
lrwxrwxrwx 1 root root 13 04-10 07:56 K20nfs -> ../init.d/nfs
lrwxrwxrwx 1 root root 15 04-10 07:47 K20rwhod -> ../init.d/rwhod
lrwxrwxrwx 1 root root 14 04-10 07:59 K24irda -> ../init.d/irda
lrwxrwxrwx 1 root root 18 04-24 01:16 K30sendmail -> ../init.d/sendmail
lrwxrwxrwx 1 root root 13 04-10 07:53 K35smb -> ../init.d/smb
oot
lrwxrwxrwx 1 root root 19 04-10 07:59 S25bluetooth -> ../init.d/bluetooth
lrwxrwxrwx 1 root root 15 04-10 07:53 S25netfs -> ../init.d/netfs
lrwxrwxrwx 1 root root 15 04-10 07:56 S25pcscd -> ../init.d/pcscd
lrwxrwxrwx 1 root root 15 04-10 07:53 S26acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 14 04-10 08:02 S26apmd -> ../init.d/apmd
lrwxrwxrwx 1 root root 19 04-10 07:59 S26haldaemon -> ../init.d/haldaemon
lrwxrwxrwx 1 root root 14 04-10 07:59 S26hidd -> ../init.d/hidd
lrwxrwxrwx 1 root root 20 04-10 07:46 S26lm_sensors -> ../init.d/lm_sensors
lrwxrwxrwx 1 root root 16 04-10 07:54 S28autofs -> ../init.d/autofs
lrwxrwxrwx 1 root root 15 04-10 07:54 S50hplip -> ../init.d/hplip
这些文件的命名都是以Snn服务名或者Knn服务名命名的,对S开头的文件,系统会启动加载这些服务,nn表是执行脚本的顺序(有小到大)。而K开头的文件,系统会终止这些服务。
nn表是执行脚本的顺序(由大到小)。
加载完成这些程序后linux在init5级别上启动完成 。。。
*******************************》done《**********************************