下面介绍的是基于Intel x86架构的CentOS系列操作系统的启动流程。
1、Linux系统基础简介
(1)、Linux【系统组成】:内核+应用程序 或 内核+rootfs
(2)、Linux的【运行环境】:内核空间 --------内核进程占用CPU和内存资源总和
用户空间 --------应用程序占用CPU和内存资源总和
(3)、【内核】主要具有6个【功能】:进程管理、文件系统管理、内存管理、网络协议管理、驱动管理、内存功能。
对于内核,有两种设计:单内核、微内核。单内核,是所有功能聚集于一个程序,表现为一个进程。微内核,是所有功能都有单独的子系统。对于Linux系统,采用的是单内核、模块化设计。
(4)、Linux内核的三部分:内核核心文件、内核对象文件、ramdisk
Linux的【核心文件】 ----------/boot/vmlinuz
内核【模块文件】 --------/lib/moduls/2.6.32-573.el6.x86_64/kernel
ramdisk ------------/boot/initramfs-2.6.32-573.el6.x86_64.img (其以.img结尾)
centos5的ramdisk 为 /boot/initrd -----------用mkinitrd 工具生成
centos6/7的ramdisk 为 /boot/initramfs -------用dacut 工具生成(限于7使用),但也兼容mkinitrd
ramdisk 是双缓冲和双缓存。
2、CentOS6 操作系统启动流程
(1)、POST加电自检
加电自检中,运用ROM中的BIOS程序。主板上ROM中存储的BIOS程序,被主板芯片映射入内存,从而协助CPU完成。
(2)、Bootsequence启动程序
据BIOS找启动程序,找第一个引导程序。根据BIOS的启动顺序,一次访问各个存储设备,检查其MBR中是否有引导程序,如果有则将引导程序加载至内存,并且将硬件的管理权移交给引导程序。
(3)、引导加载器BootLoader
一般使用MBR中的grub,应用grub加载文件系统,grub能提供一个用户菜单,命令行接口交互操作。-----------应用grub legacy。
引导程序grub,开始加载stage1.5,以驱动根文件系统,然后从根设备加载stage2至内存,stage2的代码将会从同一磁盘分区加载kernel至内存,同时将硬件的管理权移交给kernel
(4)、加载内核kernel ----------------内核核心文件放在【基本分区】上
对内核进行初始化,加载硬件的驱动程序。
kernel试图挂载根文件系统,如果其内部有直接编译成内核的文件系统驱动程序,则无需其他辅助直接以只读方式挂载根文件系统即可,否则,必须依赖于ramdisk提供的临时根文件系统作为过渡,待根文件系统驱动成功以后,完成切换的工作,以只读方式挂载真正的文件系统。
(5)、加载根文件系统rootfs -----以只读的方式挂载根文件系统。
如果没有驱动,借助于ramdisk加载驱动。
(6)、运行用户空间的第一个应用程序: /sbin/init。
CentOS 6的Init程序为:upstart(基于事务驱动)。
配置文件:/etc/inittab ----------仅定义默认运行级别
/etc/init/*.conf --------rcS.conf(系统初始化脚本); rc.conf(运行级别关闭或开启系统服务的任务); start-ttys.conf(终端相关的任务); prefdm.conf(图形界面的任务)。
(7)、设定默认运行级别 ----------/etc/inittab
(8)、系统初始化 ------------/etc/init/*.conf
(9)、并行执行任务:定义ctrl+alt+del热键功能;关闭对应级别下应停止的服务,开启对应级别下应开启的服务;电源管理;dbus管理等。根据运行级别,选择打开的终端数量及位置。
(10)、登录提示符
使用mingetty命令来调用login命令,来为用户打印登录提示符。
3、CentOS5基础
(1)、CentOS基础
CentOS5的7个运行级别为0-6,0为关机、6为重启、1为单用户模式、2-5为多用户模式,3为多用户的命令行界面,5为多用户的图形化界面。
查看运行级别:# who -r 或 # runlevel
切换运行级别:# init 0-6
CentOS5的第一个引用程序为Init,其配置文件为/etc/inittab。配置文件指明系统初始化的任务
执行【规定的任务】,格式为:id:runlevels:action:process。 action表示启动此任务,通常为sysinit,一般是运行/etc/rc.d/rc.sysinit脚本。所有由rc脚本关闭或启动的链接文件的源文件都在/etc/rc.d/init.d,该目录创建了链接/etc/init.d。
在init引导启动用户空间进程时,不需要写在系统服务中的内容,写在/etc/rc.d/rc.local脚本中。
(2)、chkconfig命令
chkconfig命令 ------------查看和管理系统服务的运行状态。
# chkconfig --list [name]
# chkconfig --add name
# chkconfig --del name
修改/etc/rc.d/rc#.d/,管理系统服务。例如:# chkconfig: 2345 90 60 (其中,2345为运行级别,90为开启的优先级,60为关闭的优先级。)
单独制定系统服务开启或关闭:# chkconfig [--level levels] name <on|off|reset>
在init引导启动用户空间进程时,不需要写在系统服务中的内容,写在/etc/rc.d/rc.local脚本中。
(3)CentOS5操作系统的启动流程
1)、POST加电自检
加电自检中,运用ROM中的BIOS程序。主板上ROM中存储的BIOS程序,被主板芯片映射入内存,从而协助CPU完成。
2)、Bootsequence启动程序
据BIOS找启动程序,找第一个引导程序。根据BIOS的启动顺序,一次访问各个存储设备,检查其MBR中是否有引导程序,如果有则将引导程序加载至内存,并且将硬件的管理权移交给引导程序。
3)、引导加载器BootLoader
一般使用MBR中的grub,应用grub加载文件系统,grub能提供一个用户菜单,命令行接口交互操作。-----------应用grub legacy。
引导程序grub,开始加载stage1.5,以驱动根文件系统,然后从根设备加载stage2至内存,stage2的代码将会从同一磁盘分区加载kernel至内存,同时将硬件的管理权移交给kernel
4)、加载内核kernel ----------------内核核心文件放在【基本分区】上
对内核进行初始化,加载硬件的驱动程序。
kernel试图挂载根文件系统,如果其内部有直接编译成内核的文件系统驱动程序,则无需其他辅助直接以只读方式挂载根文件系统即可,否则,必须依赖于ramdisk提供的临时根文件系统作为过渡,待根文件系统驱动成功以后,完成切换的工作,以只读方式挂载真正的文件系统。
5)、加载根文件系统rootfs -----以只读的方式挂载根文件系统。
如果没有驱动,借助于ramdisk加载驱动。
6)、运行用户空间的第一个应用程序: /sbin/init。
kernel试图启动第一个进程:/sbin/init,而后kernel转入后台,将用户空间的进程管理任务交给init进程来完成
配置文件:/etc/inittab /etc/init/*.conf /etc/rc.d/rc.sysinit /etc/rc.d/rc
7)、执行/sbin/init 和 /etc/inittab文件
8)、设置默认的运行级别
9)、执行/etc/rc.d/rc.sysinit脚本,完成系统初始化
10)、执行/etc/rc.d/rc脚本,关闭对应级别下应停止的服务,开启对应级别下应开启的服务
11)、设置热键,如:Ctrl+Alt+Del热键功能
12)、UPS电源的失效与恢复
13)、生成终端,默认启动图形界面。
4、Bootloader
grub通用统一加载器有两种,即grub legacy和grub2。
grub legacy分为三个阶段,分别是第一阶段、第二阶段和中间的1.5阶段。中间阶段的作用是,让第一阶段的引导程序识别第二阶段分区的文件系统。stage2提供了很多功能,其中最重要的是加载操作系统的内核核心文件,还可以提供菜单和交互接口、允许用户编辑菜单、命令行操作模式、具身份验证机制。
grub命令行常用的6个命令如下:
1)、help:获得grub命令的名称列表
2)、help GRUB_CMD:特定命令的详细帮助信息
3)、root (hd#,#):指定grub程序的根设备(磁盘的指定分区)。hd# 为磁盘编号,# 为分区编号,# 一般是从0开始的数字,如0表示第一个分区,如 (hd0,0),表示当前计算机上的第一块磁盘的第一个分区。
4)、find (hd#,#):指定分区中搜索文件,显示出文件所在的位置
5)、kernel /PATH/TO/KERNEL_CORE_FILE:本次启动的内核文件的绝对路径。额外内核参数:ro root=/dev/sda3 selinux=0 init=/sbin/init quiet rhgb {1|s|S|single}
6)、initrd /PATH/TO/initramfs-VERSION-release.img:内核所对应的ramdisk(ramfs)文件
grub的配置文件为 /boot/grub/grub.conf 和 /etc/grub.conf(链接)。配置文件里的内容如下:
default=0 ------默认启动菜单项,title是从0开始编号
timeout=5 ------倒计时
splashimage=(hd0,0)/grub/splash.xpm.gz -----图片背景
hiddenmenu ------------(是否)隐藏grub的启动菜单
password --md5 CRYPTED_PASSWORD ------------菜单的保护密码
title CentOS 6 (2.6.32-573.el6.x86_64) ------菜单标题,可多个title
root (hd0,0)
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-573.el6.x86_64.img
password --md5 CRYPTED_PASSWORD
5、CentSO7 操作系统启动流程
(1)、POST加电自检
加电自检中,运用ROM中的BIOS程序。主板上ROM中存储的BIOS程序,被主板芯片映射入内存,从而协助CPU完成。
(2)、Bootsequence启动程序
据BIOS找启动程序,找第一个引导程序。根据BIOS的启动顺序,一次访问各个存储设备,检查其MBR中是否有引导程序,如果有则将引导程序加载至内存,并且将硬件的管理权移交给引导程序。
(3)、引导加载器BootLoader
一般使用MBR中的grub2,应用grub2加载文件系统,grub2能提供一个用户菜单,命令行接口交互操作。
(4)、装载引导程序的配置文件:/etc/grub.d /etc/default/grub /boot/grub2/grub.cfg
(5)、加载initramfs驱动模块
(6)、加载内核kernel ----------------内核核心文件放在【基本分区】上
对内核进行初始化,加载硬件的驱动程序。
(7)、内核以只读方式挂载rootfs,启动systemd进程。
(8)、执行initrd.*.target所有的unit,包括挂载/etc/fstab所有有效的文件系统
(9)、根切换
(10)、systemd执行默认的target
6、centos7基础
centos7的init程序采用systemd风格,systemctl命令,使用兼容以前的版本,所以也可以使用service类的命令。
Systemd具有许多centos6里面没有的四个特点:(1)、并行开启,即在系统引导的时候可以实现服务的并行开启;(2)、按需激活,即能够实现按需激活进程,即在系统启动时,需要随系统启动服务,其服务进程并没有启动,但是Ststemd为每一个此类服务进程都注册了套接字,我们称这种服务处理方式为“半激活状态”。(3)、快照功能,即能够对当前系统的用户空间的每个进程进行状态快照,以后如果进程出现问题或故障,可以迅速恢复进程状态至过去的某一时候。(4)、服务控制逻辑,systemd内部有一种基于基于依赖关系来定义的服务控制逻辑。
# systemctl {start|stop|restart|status} name[.service] ----------管理服务
# systemctl set-default {multi-user.target | graphical.target} ----------设置运行级别
# systemctl get-default -----------设置默认运行级别
# systemctl set-default muti-user.target ------改回命令行界面
centos7采用unit文件进行核心管理,由Systemd相关的配置文件进行各种标识、识别、和配置功能的实现。unit文件分为 系统服务类、socket、目标类、快照类等几类。这些配置文件主要保存在以下三个文件中:
/etc/lib/systemd/system/*
/etc/systemd/system/* ---------符号链接
/run/systemd/system/* ---------非配置关键项
unit常见的8种类型如下:
Service unit:扩展名为.service ----------用于定义系统服务,可省
Target unit:扩展名为.target ------------init程序的运行级别
Decvice unit:扩展名为.device --------内核识别的设备
Mount unit:扩展名为.mount ------------systemd管理的文件系统的挂载点
automount unit:扩展名为.automount --------------挂载点的位置
Socket:扩展名为.socket -------------标识进程间通信的socket文件
Swap unit:扩展名为.swap ------------标识swap设备
Path unit:扩展名为.path ------------监控指定目录中的一个文件或一个子目录,没有则自动创建。
target unit模拟6中的运行级别:
级别0:runlevel0.target,poweroff.target
级别1:runlevel1.target,rescue.target
级别2:runlevel2.target,multi-user.target:
级别3:runlevel3.target,multi-user.target
级别4:runlevel4.target,multi-user.target
systemd的四种实现方式如下:
(1)、基于socket unit的方式实现进程激活机制
(2)、基于device unit的方式实现设备的自动识别,挂载
(3)、基于bus的激活机制
(4)、基于path的激活机制
如果自行编写unit file,可以直接将文件放置于/etc/systemd/syetem目录中,也可以将其放在/usr/lib/systemd/system/目录中。unit file通常分为三段,分别为 [Unit]、[Service]、[Install],各部分解释如下:
(1)、[Unit]:定义域Unit类型无关的通用选项。
常用的选项语句:
Description ------相关服务描述
After -------服务启动前依赖的内容
before ------------依赖此服务启动的服务
Wants --------指明依赖关系
Requires -----------指明依赖关系
Conflict -----------各unit之间可能存在的冲突
Documentation ---------------管理命令的文档所在位置
(2)、[Service]:定义与系统服务相关的专用的选项语句。
常用的选项语句:
Type ----------定义影响ExecStart及相关参数的功能:simple、forking、oneshot、notify
EnvironmentFile ------------------环境配置文件
ExecStart ----------启动此服务所需要运行的命令或脚本
ExecReload -------------指明重载配置文件所需要运行的命令或脚本
ExecStop --------------指明停止此服务所需要运行的命令或脚本
ExecStartPre -----------指明启动ExecStart所指明的命令【之前】所需要运行的命令或脚本
ExecStartPost -----------指明启动ExecStart所指明的命令【之后】所需要运行的命令或脚本
Restart ------------表示如果服务遇到意外而终止,则会自动重启该服务
(3)、[Install]:服务启动或禁用时用到的专用选项语句
WantedBy ------弱依赖关系
RequiredBy ---------强依赖关系
systemctl命令 ---------------控制系统和服务管理
以下是centos6和centos7实现相同功能,所使用的不同的命令行,及其区别:
(1)、启动:
centos6:service NAME start
centos7:systemctl start NMAE[.service]
(2)、停止:
centos6:service NAME stop
centos7:systemctl stop NMAE[.service]
(3)、重启:
centos6:service NAME restart
centos7:systemctl restart NMAE[.service]
(4)、状态:
centos6:service NAME status
centos7:systemctl status NMAE[.service]
(5)、服务开机自启:
centos6:chkconfig --level runlevels NAME on
centos7:systemctl enable NAME.service
(6)、禁止服务的开机自启:
centos6:chkconfig --level runlevels NAME off
centos7:systemctl disable NAME.service
(7)、查看是否开机自启:
centos6:chkconfig --list NAME
centos7:systemctl is-enabled NAME.service
(8)、条件式重启:
centos6:service NAME condrestart
centos7:systemctl try-restart NAME.service
(9)、重载或重启:
systemctl reload-or-restart NAME.service
(10)、重载或条件式重启:
systemctl reload-or-try-restart NAME.service
(11)、查看是否激活
systemctl is-active NAME.service
(12)、查看所有激活:
systemctl list-units
systemctl list-units --type=NUIT_TYPE:查看指定unit类型的处于活跃状态的服务
systemctl list-units --all:显示所有包括处于活跃状态和处于非活跃状态的各服务
(13)、查看服务的依赖关系:
systemctl list-dependencies NAME.service
(14)、禁止开机自启:
systemctl mask NAME.service
(15)、取消禁止的开机自启:
systemctl unmask NAME.service、
(16)、运行级别之间的切换:
centos6:init #
centos7:systemctl isolate NAME.target
(17)、查看运行级别:
centos6:runlevel :
centos7:systemctl list-units --type=target --all
systemctl get-default
(18)、修改默认运行级别:
systemctl set-default NAME.target
# systemctl halt,systemctl poweroff ------关机
# systemctl reboot ------重启
# systemctl suspend ------挂起
# systemctl hibernate --------休眠
# systemctl hybrid-sleep ----------挂起并休眠