一、第一阶段:硬件引导启动
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