一个操作系统要完整启动起来需要哪些步骤呢?今天以CentOS为例探索一下linux的启动流程;

一、Linux系统的组成--kernel+rootfs(根文件系统)

kernel: 内核,进行进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等等

rootfs: 根文件系统

1.内核设计流派:

            单内核(monolithic kernel): Linux

                把所有功能集成于同一个程序

            微内核(micro kernel): Windows, Solaris

                每种功能使用一个单独子系统实现

2. Linux内核特点:

                支持模块化: .ko(内核对象)

                如:文件系统,硬件驱动,网络协议等

                支持内核模块的动态装载和卸载

     组成部分:

核心文件:放置在/boot/分区下的vmlinuz-VERSION-release.el[567].X86_64

模块文件:/lib/modules/VERSION/kernel目录下

ramdisk:辅助的伪根系统,用于内核不能驱动文件系统时临时驱动;

5:/boot/initrd-2.6.18-398.el5.img

6/7:

/boot/initramfs-2.16.32-573.el6.x86_64.img

/boot/initramfs-3.10.0-327.el7.x86_64.img

二、启动流程详解:

linux系统启动流程(CentOS5/6/7为例)_第1张图片

第一部分针对的是内核空间的系统初始化:

Step1.POST:Power-On Self Test 加电自检

 那么谁来执行此次检测操作--答案是只有cpu可以进行运算当然是由它来进行

 由于刚接通电源时,内存是没有数据的。因此,x86架构的主板上的ROM就可以供应这样的数据;

 主板上的芯片:南桥北桥芯片。就可以把ROM存储器里的内容直接映射到内存;从而能够让CPU读取和加载指令和数据;

 因此我们可以说,X86架构的CPU可以线性寻址的物理存储空间:ROM + RAM;

Step2.BootSequence:可以理解为启动顺序;

 第一步自检成功,可以正常运行之后。系统应该去寻找包含操作系统的硬件设备,完成系统启动;

 而BootSequence的作用就是:决定到何种硬件设备上去加载操作系统;是Removable Device?还是    Hard Drive、CD-ROMS?亦或是网络启动?

 而加载方式是:按照指定的次序查找各个引导设备,第一个被找出具有引导程序的设备即成为本次启动所用到的设备;

Bootloader:引导加载器,也是一个程序;存在于硬盘的0磁道0扇区共512字节,其中

446B bootloader

64B  FAT 分区表

其余2字节 55AA 是结束标记

那么Bootloader有哪些呢:

  在Windows里是NTLDR,全称是NT Loader,是系统加载程序;

  Linux:

   1.LILO(Linux Loader): 早期引导程序,到目前位置也是使用非常广泛的一种引导程序。但是在我们 计算机里不常用,因为不支持大硬盘启动(不超过1024柱面);安卓手机一般用的就是这个;

   2.GRUB(GRand Uniform Bootloader): 一般架构在服务器和普通PC上;还可以引导unix甚至是Windows(8之前);


GRUB提供的功能:

1.为用户提供一个菜单,菜单中列举的是各个可以启动的操作系统的内核;

2.可以将用户选定的内核的核心文件装载到内存中去,解压缩并且展开,grub将系统控制权移交给内核;

3.提供一个交互式的命令行接口;

4.提供菜单和内核启动的安全保障;

Step3.内核自身初始化:

1) 探测能够识别到的所有的硬件设备

2) 加载硬件的驱动程序;有可能需要用到ramdisk

3) 以只读的方式挂载根文件系统

4) 运行用户空间的第一个应用程序 /sbin/init

Step4.init程序的类型

CentOS 5及之前,SysV Init - Classic Init;配置文件:/etc/inittab只有这一个

CentOS 6 :upstart init 配置文件:有/etc/inittab 但几乎被废弃!唯一的功能是设置启动级别,会在后面说到,其余的配置文件都在 /etc/init/*.conf

CentOS 7 : 完全废弃了inittab文件,但依然存在,只是简单说明了CentOS 7已经不使用这个文件而是使用全新的Systemd方式;其配置文件/usr/lib/systemd/system/*

/etc/systemd/system/*


第二部分是用户空间的开启:

kernel加载了第一个程序Init程序后,转入后台,init进程接管进程管理的任务

Step1:设置系统的运行级别--runlevel

表示process的action要在哪个级别下运行,该段中可以定义多个运行级别,

0:表示关机

1:表示单用户模式,在这个模式中,用户登录不需要密码,默认网卡驱动是不被加载,一些服务不能用2:表示多用户模式,NFS服务不开启

3,表示命令行模式

4,这个模式保留未用

5,表示图形用户模式

6,表示重启系统

其中常用的是3和5,0和6慎用,1的单用户模式是个对系统来说及其危险的模式,所以也只有在像root用户密码忘记后使用该模式;


centos 5 –/etc/inittab内容示例:

            id:3:initdefault:                     # 定义默认运行级别

            si::sysinit:/etc/rc.d/rc.sysinit   # 系统初始化脚本

            l0:0:wait:/etc/rc.d/rc 0        #  对应不同运行级别的启动脚本

            l1:1:wait:/etc/rc.d/rc 1…

            l6:6:wait:/etc/rc.d/rc 6

            ca::ctrlaltdel:/sbin/shutdown -t3 -r now  #定义快捷键操作

            # 按下快捷键3秒后重启系统

CentOS6中,已经不再定义其他内容,进有默认开机启动流程,转用下列脚本来完成原有执行操作

Step2:执行/etc/rc.d/rc.sysinit脚本,实施系统初始化;

 /etc/rc.d/rc.sysinit: 在所有运行级别下,init 依赖/rc.sysinit 进行系统初始化

作用:

 (1) 设置主机名

 (2) 设置欢迎信息

 (3) 激活udev和selinux

 (4) 挂载/etc/fstab文件中定义的文件系统

 (5) 检测根文件系统,并以读写方式重新挂载根文件系统

 (6) 设置系统时钟

 (7) 激活swap设备

 (8) 根据/etc/sysctl.conf文件设置内核参数

 (9) 激活lvm及software raid设备

 (10) 加载额外设备的驱动程序

 (11) 清理操作

Step3.rc 脚本--对应/etc/rc.d/rc$runlevel.d/目录下的所有服务的链接--所有以K开头的服务停掉,S开头的服务开启

说明: rc$runlevel.d –> 意味着读取/etc/rc.d/rc#.d/下脚本 

 (目录下全部文件均为软链接,源为init.d下的对应脚本)

 K*: K##*: ##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

S*: S##*: ##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

Step4.使用mingetty命令调用login程序,为用户打印登陆提示符;