一、第一阶段:硬件引导启动

1、Bios上电自检, 初始化硬件:显卡,内存,磁盘

2、根据Bios设置找到启动介质,初次安装linux系统一般是CD-ROM或者U盘启动,已安装Linux系统选择本地HDD硬盘启动

3、 如果使用已经安装系统的硬盘启动,正常启动在本地第一块硬盘的第一个分区的第一个扇区中找到512字节的MBR启动引导程序,MBR包括三个部分:Bootloader(Grub程序安装在bootloader)、分区表Partition tables、校验位Magic Number


二、GRUB启动引导阶段

1、既然找到了MBR,就找到了grub,由GRUB的配置文件/boot/grub/grub.conf找到需要启动的系统以及内核和内核镜像文件

注:grub可以设置默认启动的系统顺序(双系统情况下)

[root@rs1 ~]# cat /boot/grub/grub.conf

#boot=/dev/sda

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS 6 (2.6.32-573.el6.i686) #grub找到即将启动的系统

root (hd0,0)   #grub找到内核位置:第一块磁盘的第一个分区下的vmlinuz-2.6.32

kernel /vmlinuz-2.6.32-573.el6.i686 ro root=UUID=4cb5c3c6-6d8f-41fb-b3d9                                                       -55898e0be726 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto                                                       LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet

 initrd /initramfs-2.6.32-573.el6.i686.img  #grub找到内核镜像位置:第一块磁盘第一个分区下 /initramfs-2.6.32


运行在MBR中stage1,通过stage1_5识别ext4类型文件系统,找到磁盘中的stage2并启动在stage2中的内核并启动

[root@rs1 ~]# ls /boot/grub

stage1   jfs_stage1_5   stage2 


三、内核引导阶段


1、内核和内核映像(initrd)找到之后,内核接管控制权,但只能识别最基本的硬件驱动,内核将内核镜像(initrd)解压到内存中运行,临时构成一个只读的文件系统,在这个只读的文件系统中,内核去执行临时文件系统中的init进程,把硬件驱动运行起来(磁盘、声卡、网卡等关键驱动的加载),之后内核再去挂载真正的根文件系统,内核把控制器交给了/sbin/init进程


四、系统初始化

内核启动后,初始化init进程(linux最核心的进程,/sbin/init),可以看到在init进程基础上派生出很多子进程,这是在init进程基础上开启的一些服务,首先读取/etc/inittab配置,执行脚本并进行初始化,如配置键盘、字体、设置网络等,包括以下三个步骤:

[root@rs1 ~]# pstree

init─┬─NetworkManager

       ├─auditd───{auditd}

       ├─crond

       ├─cupsd

       ├─dbus-daemon

       ├─hald─┬─hald-runner─┬─hald-addon-acpi

                     │                       ├─hald-addon-inpu

                     │                       └─hald-addon-rfki

                     └─{hald}

(1)根据配置文件/etc/init/rcS.conf执行初始化脚本(/etc/rc.sysinit)下的脚本,以读写方式挂载根文件系统和其他文件系统,到此系统算是基本运行起来了,初始化内容把包括:网络设置,加载USB,设置raid和LVM,进行磁盘配额等等

[root@rs1 ~]# cat /etc/init/rcS.conf

exec /etc/rc.d/rc.sysinit

(2)确定运行级别,再根据配置文件/etc/init/rc.conf执行/etc/rc.d/rc3.d下的启动服务和脚本(与etc/rc3.d/下相同,是一个软链接)加载该级别下的服务,

[root@rs1 ~]# cat /etc/inittab

id:3:initdefault:   #(3 - Full multiuser mode,多用户命令行) 3是默认的启动级别

[root@rs1 ~]# ls -l /etc

lrwxrwxrwx.  1 root      root       10 10月  8 04:59 rc3.d -> rc.d/rc3.d

[root@rs1 ~]# cat  /etc/rc.d/rc

# Now run the START scripts.

for i in /etc/rc$runlevel.d/S* ;

[root@rs1 ~]# ls -l /etc/rc3.d/   #/etc/rc.d/rc3.d下多链接文件链接到对应的启动服务,

总用量 0  #K表示kill,S(start)表示启动,这是级别3对应需要启动和不启动的服务

lrwxrwxrwx  1 root root 17 11月 21 12:10 K05wdaemon -> ../init.d/wdaemon

lrwxrwxrwx  1 root root 15 11月 21 12:10 K100kdump -> ../init.d/kdump

lrwxrwxrwx  1 root root 14 11月 21 12:10 S58ntpd -> ../init.d/ntpd

lrwxrwxrwx  1 root root 19 1月  14 15:06 S75heartbeat -> ../init.d/heartbeat

lrwxrwxrwx  1 root root 18 1月  25 20:34 S80sendmail -> ../init.d/sendmail

lrwxrwxrwx  1 root root 15 11月 21 12:10 S90crond -> ../init.d/crond

lrwxrwxrwx. 1 root root 11 10月  8 04:59 S99local -> ../rc.local

(3)运行/etc/rc.d/rc.local,系统会运行脚本/etc/rc.d/rc.local(用户可以自定义开机脚本到这里),等到服务和进程启动完成后,系统启动完成

[root@rs1 ~]# cat /etc/rc.d/rc.local

#!/bin/sh

# This script will be executed *after* all the other init scripts

# You can put your own initialization stuff in here if you don't

# want to do the full Sys V style init stuff

touch /var/lock/subsys/local

mount /dev/sdb1 /home/daixuan/123