CentOS(RHEL)系列操作系统的启动流程: Intel X86兼容架构
Linux的系统组成: 内核+应用程序(GNU/Linux): 单纯的指Linux内核
从硬盘存储和启动操作系统的角度:
+根文件系统(rootfs)
内核功能: 进程管理,文件系统管理内存管理网络协议驱动程序安全功能Linux系统的系统运行环境可以分为两部分内核空间: 内核代码(系统调用)
就是内核进程占用的cpu和内存资源的总和;
用户空间: 应用程序(进程或线程就是各种存储于文件系统中的应用程序在发起为进程或线程之后占据的操作系统内核的设计流派单内核设计所有的功能全部几种于同一个程序; 运行时表现为一个进程Linux就是单内核设计原因: 我们不需要Linux成为最先进的我们只是要使用它.)
微内核设计每种功能使用一个单独的子系统来实现Windows,Solaris都是微内核设计
Linux内核的特点单内核+模块化: 内核之中的功能+各个模块提供的功能之和为了能够提效会为速度比较慢的IO设备提供缓冲和缓存Linux内核的组成部分内核核心文件: /boot/vmlinux-VERSION-release
CentOS5: /boot/vmlinux-2.6.18-398.el5
CentOS6: /boot/vmlinux-2.6.32-573.el6.x86_64
CentOS7: /boot/vmlinux-3.10.0-327.el7.x86_64
最新的内核版本: 4.17
内核模块文件: /lib/modules/KERNEL_VERSION/kernel/
ramdisk:
CentOS5: /boot/initrd-2.6.18-398.el5.img
CentOS6: /boot/initramfs-2.6.32-573.el6.x86_64.img
ramfs:
CentOS7: /boot/initramfs-3.10.0-327.el7.x86_64.img
生成ramdisk的工具CentOS5/6:mkinitrd
CentOS7:dracutmkinitrd
ramdisk和ramfs的区别ramdisk:双缓冲和双缓存
ramfs:提效避免双缓冲和双缓存
CentOS系列操作系统的启动流程(2)
整个系统启动的流程基本可以分为POST-->MBR(GRUB)-->Kernel-->Init-->Runlevel
BIOS(BasicInput/Output System):
基本输入输出系统改系统存储于主板的ROM芯片上计算机在开机时会最先读取该系统然后会有一个加电自检过程这个过程其实就是检查cpu和内存计算机最基本的组成单元(控制器运算器和存储器),还会检查其他硬件若没有异常就开始加载BIOS程序到内存中. BIOS主要的一个功能就是存储了磁盘的启动顺序会按照启动顺序去查找第一个磁盘头的MBR信息并加载和执行MBR中的Bootloader程序若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS: 启动顺序可以在BIOS的界面中进行设置一旦BootLoader程序被检测并加载内存中就将控制权交给了BootLoader程序.
MBR(Master BootRecord):
主引导记录存储于磁盘的头部大小为512bytes,启动用于存储用于存储分区表信息最后2bytes用于MBR的有效行检查GRUB(GrandUnified Bootloader):
多系统启动程序其执行过程可分为三个步骤Stage1:这个其实就是它的主要工作就是查找并加载第二段(stage2),但系统在没启动时根本找不到文件系统也就找不到stage2所存放的位置因此就有了stage1_5
Stage1_5:该步骤就是为了识别文件系统
Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息然后开始加载Kernel程序当kernel程序被检测并加载到内存中就将控制权交给 PS:实际上这个步骤/boot还没被挂载直接识别grub所在磁盘的文件系统所以实际上应该是/grub/grub.conf文件改配置文件的信息如下:
grub.conf:
#boot=/dev/sda
default=0 #设定默认启动的title的编号,从0开始
timeout=5 #等待用户选择的超时时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景图片
hiddenmenu #隐藏菜单
title CentOS (2.6.18-194.el5PAE) #内核标题
root (hd0,0) #内核文件所在的设备
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #内核文件路径以及传递给内核的参数
initrd /initrd-2.6.18-194.el5PAE.img#ramdisk文件路径
Kernel
内核是Linux系统最主要的程序实际上的文件很小只保留了最基本的模块并以压缩的文件形式存储在硬盘中GRUB将Kernel读进内存内存开始解压内核文件. 将内核启动应该先讲下initrd这个文件initrd(InitialRAM Disk),它在stage2这个步骤就被拷贝到了内存中这个文件实在安装系统时产生的是一个临时的根文件(rootfs). 因为Kernel为了精简只保留最基本的模块上并没有各种硬件的驱动程序也就无法识别rootfs所在的设备故产生了该文件装载了必要的驱动模块Kernel启动时可以从initrd文件中装载驱动模块直到挂载真正的rootfs,然后将initrd从内存中移除Kernel会以只读方式挂载根文件系统当根文件系统被挂载后开始装载第一个进程(用户空间的进程执行/sbin/init之后就将控制权交给init程序Init
初始化该程序就是进行OS初始化操作实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本简单讲下这个脚本的任务1.激活udev和selinux;
2.根据/etc/sysctl.conf文件来设定内核参数3.设定系统时钟4.装载硬盘映射 5.启动交换分区6.设置主机名7.根文件系统检测并以读写方式重新挂载根文件系统8.激活RAID和LVM设备9.启动磁盘配额 10.根据/etc/fstab,检查并挂载其他文件系统11.清理过期的锁和PID文件执行完后根据配置的启动级别执行对应目录底下的脚本最后执行/etc/rc.d/rc.local这个脚本至此系统启动完成Runlevel
runlevel,运行级别不同的级别会启动的服务不一样会根据定义的级别去执行相应目录下的脚本的启动级别分为以下几种0:关机
1:单一用户模式(直接以管理员身份进入2:多用户模式(无网络3:多用户模式(命令行4:保留
5:多用户模式(图形界面 6: 重启
在不同的运行级别下这个脚本会分别执行不同目录下的脚本
Runlevel 0 - /etc/rc.d/rc0.d/
Runlevel 1 - /etc/rc.d/rc1.d/
Runlevel 2 - /etc/rc.d/rc2.d/
Runlevel 3 - /etc/rc.d/rc3.d/
Runlevel 4 - /etc/rc.d/rc4.d/
Runlevel 5 - /etc/rc.d/rc5.d/
Runlevel 6 - /etc/rc.d/rc6.d/
这写目录下的脚本只有K*和S*开头的文件开头的文件为开机需要执行关闭的服务开头的文件为开机需要执行开启的服务CentOS 5的SysV Init的工作过程CentOS 5 SysVInit:
运行级别(run level): 为了系统的运行或维护等目的而设置的管理机制0-6:七个运行级别#0 - 关机 # 1 - 单用户模式(Single user mode),root,无需验证; 维护模式#2 - 多用户模式(Multiuser),会启动网络功能; 但不会启动NFS,维护模式#3 - 多用户模式(Full multiuser mode),完全的功能模式仅使用CLI,不激活GUI;
#4 - 预留级别目前无特别使用的目的; 但是习惯上认为与3运行级别相同#5 - 多用户模式默认激活GUI和默认使用的是#6 - 重启通常会使用3,5运行级别作为此次系统启动的默认运行级别查看当前系统的运行级别who-r
runlevel
切换运行级别init[0-6]
Init的配置文件: /etc/inittab,此配置文件有如下功能1.在整个系统初始化的过程中要做哪些任务启动或关闭哪些后台服务如何进行系统初始化在验证用户的身份无误之后如何为用户提供登陆提示符还要区分是图形界面还是文件界面当备用电源失效或重新生效时如何指挥系统操作定义了按下"Ctrl+Alt+Del"组合键时系统将采取什么行为2.所有规定的任务如何执行每一行定义一种操作格式如下id:runlevels:action:process
id:一种操作的唯一标识符1#,id,pf,pr,#,x,
runlevels:指定任务执行所依赖的运行级别####,留空
action: 在何种条件下启动此任务wait:等待切换至此任务所在的运行级别时运行一次respawn:一旦此任务结束就自动重新启动此任务initdefault:用于设定默认的运行级别通常后面的process省略
sysinit:设置系统初始化的方式一般情况下此处运行/etc/rc.d/rc.sysinit脚本
此文件的功能如下1.设置主机名称2.设置启动的欢迎信息3.激活SELinux
4.挂载/etc/fstab文件中定义的所有有效文件5.激活各个swap设备6.检测并且以读写的方式重新挂载rootfs;
7.设置系统时间8.根据/etc/sysctl.conf文件设置内核参数9.激活lvm和软RAID等高级逻辑设备10.加载额外的设备的驱动程序11.完成清理工作/etc/rc.d/rc,sans-serif;">根据特定的运行级别启动或关闭/etc/rc.d/rd$runlevel.d/*
K*:要停止的服务; K字母后面的两位数字表示优先级; 数字越小优先级越高; 依赖其他服务的服务应该优先关闭被其他服务依赖的服务应该稍后关闭S*:要启动的服务; S字母后面的两位数字表示优先级; 被其他服务依赖的服务应该优先启动依赖其他服务的服务应该稍后启动rc脚本可以接受一个运行级别作为其参数运行内容的 其脚本框架:
foriin/etc/rc.d/rc#.d/K*;do $istop done foriin/etc/rc.d/rc#.d/S*;do $istart done
所有由rc脚本关闭或启动的链接文件的源文件都存在于/etc/rc.d/init.d,系统为了方便使用为此目录创建了链接/etc/init.d
所有/etc/init.d(/etc/rc.d/init.d)目录中的脚本执行方式#/etc/init.d/SRV_SCRIPT {start|stop|restart|status}
#service SRV_SCRIPT {start|stop|restart|status}
chkconfig命令: 查看系统服务相关运行级别下的运行状态格式: chkconfig --list [name]
管理系统服务在/etc/rc.d/rc#.d/目录下的服务脚本的链接chkconfig--add name
chkconfig--del name
为了能够让chkconfig命令管理系统服务的脚本的链接每个脚本中都必须有这样的格式#chkconfig: 2345 90 60
2345:在哪个运行级别下此服务是自动启动状态; 也就是说在对应的运行级别的rc#.d目录中是以S开头的文件; 如果该位置为"-",则表示所有运行级别都为K开头的90:如果在某个运行级别下为开启状态该数字为S后面的优先级数字60:如果在某个运行级别下为停止状态K后面的优先级数字#description: 对于此系统服务的摘要性描述信息单独设置指定运行级别下系统服务的自动启动或关闭的状态chkconfig[--level levels] name <on|off|reset>
/etc/rc.d/rc.local脚本的功能它是init程序在引导用户空间进程启动的过程中所执行的最后一个脚本; 因此以便于或不需要写在系统服务相关的脚本中的内容但又期望可以开机即运行的功能可以直接卸载此脚本中 /etc/inittab的文件的第二部分#Run gettys in standard runlevels
1:2345:respawn:/sbin/mingettytty1
2:2345:respawn:/sbin/mingettytty2
3:2345:respawn:/sbin/mingettytty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingettytty5
6:2345:respawn:/sbin/mingettytty6
mingetty会调用login程序打开虚拟终端; 除了mingetty之外诸如getty之类的程序也可以生成虚拟终端控制台如果默认的运行级别是5,则我们需要/etc/x11/prefdm脚本打开图形界面终端; 操作如下X6R11- X Version 6 Release 11
小结:(用户空间的启动流程/sbin/init--> /etc/inittab --> 设置默认运行级别 --> /etc/rc.d/rc.sysinit脚本完成系统初始化 -->关闭那些对应运行级别下需要停止的服务启动那些对应运行级别下需要开启的服务 --> Ctrl+Alt+Del热键功能 --> UPS电源的失效与恢复之后的操作 --> 生成终端[启动图形界面]
CentOS 6:
Init程序: uupstart,其应用程序依然是/sbin/init,其配置文件/etc/inittab:仅仅只是用于定义默认运行级别/etc/init/*.conf:
rcS.conf:执行系统初始化脚本的任务rc.conf:执行根据运行级别关闭或开启系统服务的任务start-ttys.conf:执行打开终端相关的任务prefdm.conf:执行打开图形界面的任务upstart机制: 基于事件驱动的程序管理模型: Driven-envet
系统的启动流程POST--> BootSequence(BIOS) --> Bootloader --> kernel [--> ramfs] -->rootfs(ro) --> /sbin/init --> 设定默认运行级别 --> 系统初始化 --> 可以并行执行Ctrl+Alt+del热键功能定义系统服务的开启和关闭电源管理管理等 --> 登陆提示符
CentOS 7:
: Systemd,与经典的Init程序完全不同: 其配置文件/etc/systemd/system/*
/usr/lib/systemd/system/*:systemd的UNIT文件 /etc/inittab: 已废除systemd完全兼容SysV分格的Init程序及其脚本类的命令在CentOS7中依然可用; 但是建议使用CentOS 7标配的systemctl命令来控制和管理系统服务systemctl命令:该系统和服务系统的管理控制
: systemctl [OPTIONS...] COMMAND [NAME...]
使用systemctl管理服务的一般方式~]#systemctl {start|stop|restart|status} name[.service]
设置CentOS 7的默认运行级别~]#systemctl set-default {multi-user.target | graphical.target}
查看~]#systemctl get-default
Bootloader:
GRUB: GRandUniform Bootloader,通用统一引导加载器grub0.x: grub legacy
grub1.x: grub2
grub legacy:
1ststage: stage1,MBR的前446Bytes;
1.5stage: stage1_5,MBR之后的若干个扇区中; 让stage1中的bootloader程序能够识别stage2所在额分区的文件系统2ndstage: stage2,磁盘的启动分区注意: stage2及内核核心文件必须放置在同一个基本磁盘分区上stage2提供的功能1.加载操作系统内核核心文件2.提供一个菜单和交互接口3.允许用户编辑菜单内容 4.命令行接口操作模式5.身份认证机制以保证菜单编辑和内核启动的安全grub的命令行界面提示符: grub>
grub的命令行界面中的常用命令help:获取所有的grub命令的名称列表和简要使用方法helpGRUB_CMD: 显示特定命令的详细帮助信息root(hd#,#): 将指定磁盘的指定分区作为grub程序的根设备hd#:磁盘编号一般是从0开始的数字; 如hd0表示第一块磁盘#:分区编号一般也是从如0拜师第一个分区 示例: (hd0,0): 当前计算机上的第一块磁盘的第一个分区find(hd#,#): 从指定的分区中搜索文件并显示出文件所在位置kernel/PATH/TO/KERNEL_CORE_FILE: 设定本次启动时用到的内核文件的绝对路径; 额外还可以在kernel 命令中为内核启动添加更多的内核参数roroot=/dev/sda3 selinux=0 init=/sbin/init(/bin/bash) quiet rhgb {1|s|S|single}
initrd/PATH/TO/initramfs-VERSION-release.img
grub的配置文件/boot/grub/grub.conf
/etc/grub.conf:链接文件链接到其文件内容default=0 #设定默认菜单项;整个菜单中的所有的title是从0开始编号的;
timeout=5 #等待用户做出选择的时间;若用户不做选择,grub会自动引导默认菜单项;
splashimage=(hd0,0)/grub/splash.xpm.gz#grub的背景图片对应的路径;
hiddenmenu #隐藏grub的启动菜单
passwordd --md5 CRYPTED_PASSWOED #为保护菜单设置的密码,通常用于防止随意进入单用户模式;
title CentOS 6 (2.6.32-573.el6.x86_64)#菜单项中的"标题"
root (hd0,0) #指定grub的根设备,通常是用来安装grub的那个分区;
kernel/vmlinuz-2.6.32-573.el6.x86_64.img #内核所对应的ramdisk(ramfs)文件
password --md5 CRYPTED_PASSWORD #保护操作系统内核的启动;
Systemd:
Systemd的新特性1.在系统引导的时候可以实现服务的并行启动2.能够实现按需激活进程; 在系统启动时需要随系统启动服务其服务进程并没有启动但是Systemd为每一个此类服务进程都注册了对应的套接字; 我们称这种服务处理方式为"半激活状态";
3.能够对当前系统的用户空间的每个进程进行状态快照; 以后如果进程出现问题或故障可以迅速恢复进程状态至过去的某一时刻4.systemd内部有一种基于依赖关系来定义的服务控制逻辑核心管理概念: unit文件
由systemd相关的配置文件进行标识识别和配置功能的实现的基础unit的文件分类: 系统服务类 socket 目标类快照类 ......
其配置文件/usr/lib/systemd/system/*:主要的配置文件
/etc/systemd/system/*:符号链接文件/usr/lib/systemd/system/*
/run/systemd/system/*:非配置关键项
Unit文件的常见类型Serviceunit: 文件的扩展名为.service,用于定义系统服务一般.service扩展名可以省略Targetunit: 文件的扩展名为.target,用于模拟实现"init程序的运行级别Deviceunit: 文件的扩展名为.device,用于定义内核识别出来的各设备Mountunit: 文件的扩展名为.mount,用于定义可以被systemd管理的文件系统的挂载点Automountunit: 文件的扩展名为.automount,用于定义文件系统自动挂载点的位置Socketunit: 文件的扩展名为.socket,用于标识进程间通信所用到的socket文件Swapunit: 文件的扩展名为.swap,用于标识Pathunit: 文件的扩展名为.path,用于监控指定目录中的一个文件或一个子目录; 如果被监控的文件或目录不存在则systemd可以自动创建systemd特性的实现方式1.基于socket unit的方式实现进程激活机制2.基于device unit的方式实现设备的自动识别挂载3.基于bus的激活机制 4.基于path的激活机制systemd的兼容和不兼容兼容: SysV init的脚本不兼容: 不许使用systemctl命令来管理系统命令的格式是固定不变的; 所有不经由systemd启动的系统服务或系统功能命令无法与之直接通信也就以为此类服务或功能无法通过systemctl来控制:系统和服务系统的管理控制
管理服务类的操作启动: service NAME start ==> systemctlstart NAME[.service]
停止: service NAME stop ==> systemctl stopNAME[.service]
重启: service NAME restart ==> systemctlrestart NAME[.service]
状态: service NAME status ==> systemctlstatus NAME[.service]
设置服务的开机自启: chkconfig --level runlevels NAME on==> systemctl enable NAME[.service]
禁止服务的开机自启: chkconfig --level runlevels NAME off==> systemctl disable NAME[.service]
查看某服务是否开机自启: chkconfig --list NAME ==> systemctlis-enabled NAME.service
条件式重启: service NAME condrestart ==>systemctl try-restart NAME.service
重载或重启: systemctl reload-or-restartNAME[.service]
重载或条件式重启: systemctl reload-or-try-restartNAME[.service]
查看某服务当前是否处于激活状态: systemctl is-active NAME[.service]
查看所有已处于激活状态的服务: systemctl list-units
--type=UNITTYPE: 查看指定unit类型和处于活跃状态的服务--all:显示所有包括处于活跃状态和处于非活跃状态的各服务 查看依赖指定服务的其他服服务: systemctl list-dependencies NAME[.service]
禁止某服务被设定为开机自启: systemctl mask NAME[.service]
取消禁止某服务被设定为开机自启: systemctl unmask NAME[.service]
管理target unit:
为兼容init的运行级别中模拟了运行级别0==> runlevel0.target,poweroff.target
1==> runlevel1.target,rescue.target
2==> runlevel2.target,multi-user.target
3==> runlevel3.target,sans-serif;">4==> runlevel4.target,sans-serif;">5==> runlevel5.target,graphical.target
6==> runlevel6.target,shutdown.target
运行级别间切换: init # ==> systemctl isolateNAME.tartet
: 不是所有的target都能使用上述命令进行级别切换的; 只有那些在对应的unit文件中包含了AllowIsolate=yes的语法的target才能用于切换修改了unit文件之后需要通过命令才能使之生效: # systemctl daemon-reload
查看运行级别: runlevel ==> systemctl list-units--type=target --all
查看默认运行级别: /etc/inittab(id:3:initdefault:) ==>systemctl get-default
修改默认运行级别: /etc/inittab(id:3:initdefault:) ==>systemctl set-default NAME.target
rescue.target:紧急救援模式
切换命令: systemctl isolate rescue.target
systemctlrescue
emergency.target:紧急调试模式
切换模式: systemctl emergency
rescue模式相当于安全模式在切换到此模式时操作系统会运行最底层的驱动程序以保证服务器可以运行起来emergency模式: 一般来说通常是硬件故障或者硬件不可识别或者硬件可识别但不可用等关乎于计算机设施的问题通常系统会启动除上述模式之外传统的init命令命令命令命令命令其实都是systemctl的符号链接可以使用systemctl命令来直接实现上述功能关机: systemctl halt,systemctl poweroff
: systemctl reboot
挂起: systemctl suspend
休眠(进程快照): systemctl hibernate
挂起并休眠: systemctl hybrid-sleep
Service unit file的基本文件格式/etc/systemd/system:存放的都是各个unit file的符号链接/usr/lib/systemd/system:主要的存放路径
如果自行编写unit file,可以直接将文件放置于/etc/systemd/system目录中; 也可以将其放在/usr/bib/systemd/system目录中但是需要为其提供一个符号链接文件放置于Serviceunit file文件的基本格式此类unit file通常分为三段[Unit]:定义与Unit类型无关的通用选项; 用于提供当前unit的描述信息的行为信息的依赖关系相关帮助文档信息等常用的选项语句Description:定义了相关服务的描述信息; 意义性的介绍性的描述After:定义了此服务在启动前必须依赖的其他服务Before:定义了依赖此服务启动的其他服务Wants:指明依赖关系说明该服务依赖于哪些其他的unit; 弱依赖即使被依赖的服务并没有被正确激活也不会影响当前服务是否可以被激活Requires:指明依赖关系unit; 强依赖关系只要被依赖的unit无法被正确激活则当前服务一定无法激活Conflict:定义了各unit之间可能存在冲突Documentation:定义了跟当前unit相关的管理命令的文档所在[Service]:定义与系统服务相关的专用的选项语句Type:用于定义影响ExecStart即相关参数的功能的unit进程的启动类型simple:默认值表示由ExecStart语句指明的应用程序启动的进程就是主进程forking:复制自身表示有ExecStart语句指明的应用程序所启动的进程中众多的子进程中一个将成为主进程而一旦启动完成父进程会退出oneshot:一次性进程功能类似于simple,在启动后续的unit之前主进程会退出notify:功能类似于但是其后续的unit仅在通过sd_notifu()函数发送通知之后才会运行ExecStart所指明的应用程序EnvironmentFile:环境配置文件此文件一般用于在ExecStart之前被读取并为ExecStart执行后面的应用程序提供必要的变量以及其他自定义功能等ExecStart:指明启动服务所需要运行的命令或脚本ExecReload:指明重载配置文件所需要运行的命令或脚本ExecStop:指明停止服务所需要运行的命令或脚本ExecStartPre:指明在执行ExecStart指明的命令之前需要运行的命令或脚本ExecStartPost:指明在执行ExecStart指明的命令之后需要运行的命令或脚本Restart:表示如果服务遭遇有意外而终止则会自动重启该服务[Install]:定义由"systemctlenable"和"systemctl disable"命令在实现服务启动或禁用时用到的专用选项语句WantedBy:弱依赖关系指的是该服务被哪些其他units所依赖requiredBy:强依赖关系CentOS 7系统引导过程1.POST
2.选择启动设备读取引导程序
3.装载引导程序(CentOS 7使用的grub2)
4.装载引导程序的配置文件: /etc/grub.d/,/etc/default/grub,/boot/grub2/grub.cfg
5.加载initramfs驱动模块
6.加载内核
7.内核以只读方式挂载systemd进程8.执行initrd-*.target所有的unit,包括挂载/etc/fstab文件中所有有效的文件系统9.根切换
10.systemd执行默认的target
原文链接:https://www.f2er.com/centos/376463.html