标签:linux 系统启动流程
一、Linux系统简介
⒈ Linux组成: kernel+rootfs
①kernel主要功能: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
②rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)
过程调用: procedure,无返回值
函数调用: function
程序:二进制执行文件
⒉内核设计流派:
单内核(monolithic kernel): Linux
把所有功能集成于同一个程序
微内核(micro kernel): Windows, Solaris
每种功能使用一个单独子系统实现
⒊Linux内核特点:
①支持模块化: .ko(内核对象)
如:文件系统,硬件驱动,网络协议等
②支持内核模块的动态装载和卸载
③组成部分:
核心文件: /boot/vmlinuz-VERSION-release
ramdisk:辅助的伪根系统
CentOS 5: /boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img
模块文件: /lib/modules/VERSION-release
二、CentOS 6 启动流程
CentOS6启动简要流程框架:
1.加载BIOS的硬件信息,获取第一个启动设备
2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4.核心执行init程序,并获取默认的运行信息
5.init程序执行/etc/rc.d/rc.sysinit文件
6.启动核心的外挂模块
7.init执行运行的各个批处理文件(scripts)
8.init执行/etc/rc.d/rc.local
9.执行/bin/login程序,等待用户登录
10.登录之后开始以Shell控制主机
启动流程介绍:
POST加电自检:是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、 串并行接口、键盘、 CD-ROM光驱等硬件情况的检测。
ROM: BIOS, Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、 开机加电自检程序和系统启动自举程序等。
RAM: CMOS互补金属氧化物半导体,保存各项参数的设定
按次序查找引导设备,第一个有引导程序的设备为本次启动设备。
加载MBR,MBR组成:446: bootloader, 64: 分区表, 2: 55AA,bootloader(引导加载器)提供具有菜单功能,加直接载操作系统中的内核信息,以及相关控制权转交功能。
Bootloader(CentOS 5、6采用的是GRUB)程序运行与配置项加载分三个阶段(stage)来运行
①stage1、安装bootloader最小主程序,并没有安装相关配置文件。
②stage1_5、在MBR随后的扇区中存放,用于与stage2所在分区的文件系统进行交互。
③stage2、加载所有配置文件及相关环境参数信息(这些信息都存放在磁盘分区的的/boot目录下),当读取了这些文件系统所定义的数据后,就能识别文件系统并读取在该文件系统上的内核文件了。
kernel自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序: /sbin/init
ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动。
ramdisk --> ramfs 提高速度
CentOS 5: initrd
工具程序: mkinitrd
CentOS 6, 7: initramfs
工具程序: mkinitrd, dracut
ramdisk文件的制作:
(1) mkinitrd命令
为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2) dracut命令
为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
/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文件中。
系统初始化:
POST --> BootSequence (BIOS) -->Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --
> init(systemd)
三、配置文件
⒈init程序的类型:
SysV: init, CentOS 5之前
配置文件: /etc/inittab
Upstart: init,CentOS 6
配置文件: /etc/inittab, /etc/init/*.conf
Systemd: systemd, CentOS 7
配置文件: /usr/lib/systemd/system
/etc/systemd/system
2、init处理流程
以Centos 5 系统启动为例,init通过自上而下读取inittab文件来依次执行(各处理过程相似)
①去系统默认的运行级别(runlevel)
示例:id:3:initdefault:
②使用/etc/rc.d/rc.sysinit进行系统初始化
③完成初始化脚本后,系统还会启动对应级别下设定为要启动的服务,关闭那些设定为要停止的 服务,由于采用的是3级别,因此只进行13:3:wait:/etc/rc.d/rc 3其他忽略。
④配置好[ctrl]+[alt]+[del]组合键的功能
⑤配置不间断电源系统(UPS)pf、pr两种机制
⑥启动mingetty6个终端
⑦如果是5级别,则会以/etc/X11/prefdm-nodaemon启动图形化界面
3、/etc/rc.d/rc.sysinit: 系统初始化脚本
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作
四、总结系统启动流程
加电自检-->
根据在BIOS(基本输入输出系统)中定义的Boot Sequence(启动次序)逐一去搜索拥有启动功能的设备-->
搜索到后加载存放于MBR中的该设备的Boot Loader(引导加载器),Boot Loader加载完后会显示一个菜单让用户区选择要启动的操作系统或内核版本-->
加载用户选择的Kernel(内核),此外可能还要加载initrd或initramfs(ramdisk的具体实现),因为Kernel有可能要借助ramdisk(虚拟内存盘,临时根文件系统)提供的真正根文件系统的所在的设备的驱动去识别该设备 -->
kernel加载并以只读方式挂载rootfs(真正的根文件系统)-->
kernel进行switchroot(根切换)-->
kernel运行真正根文件系统上的/sbin/init程序-->
/sbin/init程序根据其配置文件/etc/inittab和/etc/init/*.conf设定默认运行级别-->
/sbin/init程序运行系统初始化脚本完成系统初始化-->
/sbin/init程序关闭或启动对应级别下的服务-->
/sbin/init程序启动终端并打印登录提示符或登录界面;
本文出自 “linux运维” 博客,请务必保留此出处http://arm2012.blog.51cto.com/2418467/1961008
标签:linux 系统启动流程
原文地址:http://arm2012.blog.51cto.com/2418467/1961008