流程图:
系统初始化流程:
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init
用户空间初始化流程:
/sbin/init [/etc/inittab或/etc/init/*.conf]--> /etc/rc.d/rc.sysinit --> /etc/rc.d/rc0-9.d --> /etc/rc.local
设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 --> 设置登录终端 --> 启动图形终端
概述启动流程:
一:post加电自检,将BIOS映射进CPU可以查找的线性地址空间,使得cpu可以读取主板上rom设备中的BIOS程序,通过rom加载内存(ram)并检查当前设备硬件是否存在
二:BootSequence按次序查找各引导设备,根据BIOS中设置的启动次序去加载对应设备的MBR
三:bootloader根据MBR的分区表,查找操作系统所在的分区,并通过grub加载操作系统的内核,此时将内核装载入内存,在内存中解压缩
四:kernel进行自身初始化,探测可识别的硬件设备,并借助ramdisk加载boot目录下的initrd或initramfs文件中装载驱动模块(ramdisk中包含着initrd或initramfs)
五:以只读方式挂载根文件系统
六:运行/etc/inittab中的程序设定默认运行级别
七:运行/etc/rc.d/rc.sysinit系统初始化脚本
八:运行/etc/rc.d/rc0-9.d 关闭或启动对应级别下的服务
九:运行/etc/rc.local系统初始化完成以后,程序自动加载的最后一个脚本
详细剖析:
一:POST加电自检将BIOS映射进CPU可以查找的线性地址空间,使得cpu可以读取主板上rom设备中的程序BIOS,通过rom加载内存(ram)并检查当前设备硬件是否存在
二:BootSequence按次序查找各引导设备,根据BIOS中设置的启动次序去加载对应设备的MBR
MBR:Master Boot Record (512bytes)
446bytes:存放bootloader
64bytes:存放分区表
2byte:判断MBR是否有效的标识55AA为有效
三: bootloader:引导加载器,程序
提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;
(1)Windows上引导加载器:ntloader
(2)Linux上引导加载器:
LILO:古老的linux加载器,1024柱面之后无法加载,继而被grub所取代,现在多用于安卓手机启动
grub:提供一个菜单,允许用户选择要启动的系统或不同的内核版本, 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;
stage1:grub第一阶段存在MBR中,用于引导stage2
stage1_5:在MBR之后的扇区中,识别常见的不同的文件系统的
stage2:位于/boot/grub目录下,配置文件是/etc/grub.conf,功用:向上看
四:内核初始化:
当stage2被载入系统执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核,内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等,并且以读写的方式挂载根文件系统,此时涉及到一个"先有鸡还是先有蛋的问题"
要想访问根文件系统(rootfs),首先就得加载根文件系统中的驱动程序,而加载驱动程序需要先挂载根文件系统。为了解决这个问题:Linux设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分则是以模块的形式存放在initrd(ramdisk)中。内核启动被分成了两个阶段,第一阶段先执行initrd文件系统中的init,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的/sbin/init进程
五:/etc/inittab:设定默认运行级别
init程序在不同CentOS版本上的类型:
CentOS-5 SysV init 配置文件:/etc/inittab
CentOS-6 Upstart 配置文件:/etc/inittab /etc/init/*.conf
CentOS-7 Systemd 配置文件:/usr/lib/systemd/system, /etc/systemd/system/
六:运行系统初始化脚本,完成系统初始化
运行/etc/rc.d/rc.sysinit
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的所有文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 根据/etc/sysctl.conf文件来设置内核参数;
(8) 激活lvm及软raid设备;
(9) 激活swap设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;
七:关闭或启动对应级别下的服务/etc/rc.d/rc#.d
0-6:共7个级别;
0:关机, shutdown
1:单用户模式(single user),root用户,无须认证;维护模式;
2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式(mutli user),完全功能模式;文本界面;
4:预留级别:目前无特别使用目的,但习惯以同3级别功能使用;
5:多用户模式(multi user), 完全功能模式,图形界面;
6:重启,reboot
1) 默认级别:3, 5
2) 级别切换:init #
3) 级别查看命令:who -r ; runlevel
八:运行/etc/rc.local系统初始化完成以后,程序自动加载的脚本
系统启动最后执行的一个脚本
九:启动终端
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
(1)mingetty会调用login程序;
(2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等;