centos系统启动流程
本篇仅仅讲解centos5和6
centos7并不适用
Linux系统的组成部分:内核+根文件系统
内核功能:
-
进程管理
-
内存管理
-
网络管理
-
驱动程序
-
文件系统
-
安全功能
有以下目录结构的文件系统可以被识别为根文件系统,但根文件系统本身不存在
rootfs:/bin/ /sbin /etc/ /sys/ /proc/ /lib /dev/ /sys /tmp /boot/...
内核:
Linux内核特点:
支持模块化:.ko(内核对象) 如:文件系统、硬件驱动、网络协议等 支持内核模块的动态装载和卸载
组成部分:
核心文件:/boot/vmlinuz-VERSION-release ramdisk:辅助的伪根文件系统 centos 5:/boot/initrd-Vsersion-release.img centos 6:/boot/initramfs-Version-release.img 模块文件:/lib/modules/VSERSION-release
centos6启动流程
1.加载BIOS的硬件信息,获取第一个启动设备。 2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息 3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备。 4.核型执行init程序并获取运行信息。 5.Init执行/etc/rc.d/rc.sysinit文件。 6.Init执行运行的各个批处理文件(scripts). 7.Init执行/etc/rc.d/rc.local. 8.执行/bin/login程序,等待用户登录。 9.登录之后开始以Shell控制主机。
下面我们来分别介绍上述的步骤
1、POST
power-on-self-test,加电自检,是BIOS功能的一个主要部分,负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、等硬件情况的检测 ROM:BIOS,,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。 RAM::CMOS互补金属氧化物半导体,保存各项参数的设定 按次序查找引导设备,第一个有引导程序的设备为本次启动设备
2、bootloader: 引导加载器,引导程序
windows: ntloader,仅是启动OS Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核 LILO:LInuxLOader GRUB: GRandUnified Bootloader GRUB 0.X: GRUB Legacy,GRUB2 1st stage:位于MBR中,为了引导2nd stage 1.5 stage:位于mbr之后的扇区,不属于任何分区,为识别内核文件所在的文件系统提供文件识别扩展 2nd stage:位于boot基本磁盘分区中,GRUB的引导程序
3、kernel阶段
自身初始化 探测可识别到的所有硬件设备 加载硬件驱动程序( 有可能会借助于ramdisk加载 ) 以只读方式挂载根文件系统 运行用户空间的第一个应用程序:/sbin/init ramdisk: 内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问 ramdisk--> ramfs提高速度 CentOS 5: initrd, 工具程序:mkinitrd CentOS 6: initramfs,工具程序:mkinitrd, dracut
4、init程序类型:
centos 5:sysV init 配置文件:/etc/inittab centos 6:upstart 配置文件:/etc/inittab /etc/init/*.conf 运行级别:为了系统的运行或维护等目的而设定的机制 0-6:7个级别 0:关机,shutdown # init 0 1:单用户模式(signal user),root用户,无须认证;维护模式 2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式 3:多用户模式(multi user),完全功能模式;文本界面 4:预留级别:目前无特别适用目的,但习惯以同3级别功能使用 5:多用户模式(multi user),完全功能模式,图形界面 6:重启,reboot 默认级别:3,5 级别切换:# init # 级别查看: # who -r # runlevel init初始化 init读取其初始化文件:/etc/inittab 初始运行级别(RUN LEVEL) 系统初始化脚本 对应运行级别的脚本目录 捕获某个关键字顺序 定义UPS电源终端/恢复脚本 在虚拟控制台生成getty 在运行级别5初始化X /etc/inittab文件: 每行定义一种action以及与之对应的process id:runlevels:action:process id:一个任务的标识符 runlevels:在那些级别启动此任务;#,###,标识所有级别 action:在什么条件下启动此任务 process:任务 action: wait:等待切换至此任务所在的级别时执行一次; respawn:一旦此任务终止时,就自动重新启动之 initdefault:设定默认运行级别;此时,process省略 sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本
5、系统初始化脚本:/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)清理操作
6、关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务
l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 ... l6:6:wait:/etc/rc.d/rc 6 意味着去启动或关闭/etc/rc.d/rc#.d/目录下的服务脚本所控制的服务 K*:要停止的服务;K##,优先级,数字越小,越是先关闭,依赖的服务先关闭,而后关闭被依赖的 S*:要启动的服务;S##;优先级;数字越小,越是优先启动,被依赖的服务先启动,而依赖的服务后启动 rc脚本:接受一个运行级别数字为参数 脚本框架: for srv in /etc/rc.d/rc#.d/K*; do $srv stop done for srv in /etc/rc.d/rc#.d/S*; do $srv start done /etc/init.d/* (/etc/rc.d/init.d/*)脚本执行方式: # /etc/init.d/SRV_SCRIPT { start | stop restart | status } # service SRV_SCRIPT { start | stop restart | status }
7、/etc/rc.d/rc.local
注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本 不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中 /etc/rc.d/rc.local在指定运行级别脚本后运行 可以根据情况,进行自定义修改
8、执行/bin/login程序,等待用户登录。
9、登录
用户输入正确的用户名和密码后便可以以shell控制主机
下面来进行下简单的总结:
内核级别的初始化流程:
POST --> bootsequence(BIOS) --> bootloader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> /sbin/init
(用户空间的启动流程):/sbin/init(/etc/inittab)
设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 --> 设置登录终端 --> [ 启动图形终端(如果设定的话) ]
原创文章,作者:sixijie,如若转载,请注明出处:http://www.178linux.com/45128