Linux系统(Centos 5、6)启动流程
一、POST加电自检
Power-On-Self-Test
按下电源键以后,系统调用存储在ROM中的BIOS和存储在RAM中的CMOS(用来保存各项参数的设定)完成系统硬件状态的检查,如果硬件有问题则提示用户问题严重无法开机的会发出警报声音;硬件自检完成后进入下一步。
二、Boot Sequence与MBR
加电自检完成后,系统会读取BIOS中的Boot Sequence中设置的引导顺序按次序检查。第一个有引导程序的设备既为本次启动需要用到的设备。
寻找到启动需要的设备后,寻找存储与该设备MBR前446个字节中的bootloader引导加载器进入下一阶段。
三、GRUB阶段
1st 、 运行bootloader,由于只有446个字节这里是用来加载下一步进程而不是内核。
1.5st、加载识别文件系统,如果此步骤无法运行就无法正常识别/boot所在分区。
2nd、 读取/boot/grub/grub.conf配置文件加载内核。
[root@CentOS6 ~]# cat /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/sda2
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #系统默认
timeout=5 #超时时间
splashimage=(hd0,0)/grub/splash.xpm.gz #grub启动壁纸
hiddenmenu
title CentOS 6 (2.6.32-642.el6.x86_64) #grub标题
root (hd0,0) #指定根所在的位置
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=55ce0d77-cab0-4da4-bb2b-0af5adebf8d6 rd_NO_LUKS rd_NO_LVMLANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #指定内核位置并只读挂载
initrd /initramfs-2.6.32-642.el6.x86_64.img #指定init位置
四、Kernel阶段
探测可识别的所有硬件设备;
加载硬件驱动程序;(有可能会借助于randdisk加载驱动)
以只读方式挂载根文件系统;
运行用户空间的第一个应用程序:/sbin/init
五、init初始化
(1)设置默认运行级别(配置文件:/etc/inittab)
运行级别:为了系统的运行或维护等墓地而设定的机制;
[root@C6red ~]# cat /etc/inittab
# Default runlevel. The runlevels used 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)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
id:3:initdefault:
这里默认级别是3 、 配置文件中的格式是:id:runlevel:action:process。
0-6级别定义
0:关机,shutdown
1:单用户模式(single user),root用户,无需认证;维护模式;
2;多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式
3;多用户模式(multi user),完全功能模式;文本界面;
4:预留级别;目前无特别使用目的;同3
5:多用户模式(multi user),完全功能模式,图形界面;
6:重启模式,reboot;
默认级别:3、5
级别切换:init #
[root@C6red ~]# init 4
[root@C6red ~]# who -r
run-level 4 2016-11-22 21:25 last=3
级别查看: who -r runlevel
[root@C6red ~]# who -r
run-level 3 2016-11-22 10:05
[root@C6red ~]# runlevel
N 3
[root@C6red ~]#
(2) 运行系统初始化脚本,完成系统初始化 (/etc/rc.d/rc.sysinit)
[root@CentOS6 ~]# cat /etc/rc.d/rc.sysinit
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#
HOSTNAME=$(/bin/hostname)
set -m
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
if [ ! -e /proc/mounts ]; then
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi
#remount /dev/shm to set attributes from fstab #669700
mount -n -o remount /dev/shm >/dev/null 2>&1
#remount /proc to set attributes from fstab #984003
mount -n -o remount /proc >/dev/null 2>&1
#####脚本过长以下省略######
主要执行了以下操作
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev 和selinux
(4) 挂载/etc/fstab 文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap 设备
(8) 根据/etc/sysctl.conf 文件设置内核参数
(9) 激活lvm 及software raid 设备
(10) 加载额外设备的驱动程序
(11) 执行清理操作
(3) 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务;
(4) 设置登陆终端[5级别启动图形界面]
至此Centos6系统启动完成
原创文章,作者:M21-13-王振中,如若转载,请注明出处:http://www.178linux.com/60614