Centos 7 启动流程
1.POST加电自检
功能
主要实现的功能检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的 ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS会检测CPU、Memory以及 I/O设备是否能够正常运行,如果是个人计算机的话可能还会检测一下显示器。只要一通电,CPU就会自动去加载 ROM芯片上的BIOS程序,是这样来实现的。而检测完成之后就进行硬件设备的初始化。
2.BOOT Sequence
(选择启动设备以加载MBR)
选择需要启动的硬件设备,位于mbr上的bootloader(引导程序)
3.加载Bootloader
- BIOS通过读取并执行启动设备中的BootLoader
- BootLoader会提供一个菜单给用户,让用户去选择要启动的系统或者不同的内核版本
用户去将内核版本加载至MBR中的特定程序,接着将在RAM中解压展开,将系统控制权
交由给内核grub阶段
是BootLoader中的一种,主要功能是实现加载内核
stage1: 用于加载stage1.5阶段,目的是为了识别驱动stage2 (/boot/)所在分区的文件系统
stage1.5 :加载stage2阶段所在分区的文件系统驱动,让stage1中BootLoader能识别stage2
所在分区的文件系统
stage2: 存放在磁盘分区上,具体存放在/boot/grub目录中,主要用于加载内核文件以及
4.kernel自身初始化
功能:
检测可识别到的所有硬件设备
- 加载硬件驱动程序
- 以只读的方式挂载根文件系统
运行用户空间的一个应用程序:/sbin/init(进程号为0)
5.init管理用户空间服务进程
内核空间派来去管理用户空间的使用进程
init初始化程序会根据配置文件执行一系列操作
(centos5、6、7关于init的配置文件不同,但是总体的启动流程是不变的)
- 根据init配置文件设置默认的运行级别
centos7:init初始程序是systemd,
配置为文件:
- /usr/lib/system/systemd/*- /etc/systemd/system/*
note:centos6\7 Init管理程序的变化
- 缺点:
- 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
- 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长
Note:
加电自检 -> 选择bootSequence(选择启动设备)-> 加载BootLoader(启动程序)-> 内核初始化(启动Init程序) -> Init管理的服务(开机自启相关服务)
Centos 7 Systemd特性
字母d是守护进程(daemon)的缩写,守护整个系统
使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反”keep simple, keep stupid”的Unix 哲学;但是现在的Centos 7 已经将它作为系统的守护进程组件了
特性
- 系统引导时实现服务并启动
- 按需激活进程
- 系统服务状态快照
- 基于依赖关系定义服务控制逻辑
相关命令
systemd-analyzse
用户查看启动耗时,默认显示启动是内核和用户空间的消耗时间
| systemd-analyze | 查看详细的每个服务消耗的启动时间 [root@localhost ~]# systemd-analyze Startup finished in 1.375s (kernel) + 4.406s (initrd) + 22.908s (userspace) = 28.690s |
|---|---|
| systemd-analyze blame | 查看每个服务的启动耗时 [root@localhost ~]# systemd-analyze blame 5.879s NetworkManager-wait-online.service 4.177s dev-mapper-centos\x2droot.device 3.651s kdump.service 3.436s lvm2-monitor.service 2.505s lvm2-pvscan@8:2.service 2.413s firewalld.service 2.295s tuned.service 2.133s network.service 1.840s systemd-tmpfiles-clean.service 1.687s postfix.service |
| systemd-analyze critical-chain | 查看严重消耗时间的服务树状表 |
打印严重消耗时间的服务树状表,按照启动消耗的时间进行排序,消耗时间越多,越靠后。
@之后是从系统引导到服务启动起来的时间
+之后是服务启动消耗的时间
[root@localhost ~]# systemd-analyze critical-chain
The time after the unit is active or started is printed after th
The time the unit takes to start is printed after the “+” charac
multi-user.target @21.391s
└─tuned.service @19.095s +2.295s
└─network.target @19.090s
└─network.service @16.953s +2.133s
└─NetworkManager-wait-online.service @11.061s +5.879s
└─NetworkManager.service @10.657s +395ms
└─network-pre.target @10.650s
└─firewalld.service @8.233s +2.413s
└─polkit.service @7.450s +771ms |
| systemd-analyze critical-chain vsftpd.service | 查看指定服务的启动流 |
| systemd-analyzeplot | 打印分析图及其他命令 |
hostnametcl
用于查看当前主机的信息
| hostnametcl | 显示当前主机的信息 [root@localhost ~]# hostnametcl -bash: hostnametcl: command not found [root@localhost ~]# hostnamectl Static hostname: localhost.localdomain Icon name: computer-vm Chassis: vm Machine ID: 673851f7d2b944eb953a56c56bcd37ac Boot ID: 5a804f12f6d248ab8e05533bb4acabf6 Virtualization: vmware Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-957.el7.x86_64 Architecture: x86-64 |
|---|---|
| hostnametcl set-hostname [ 用户名 ] | 设置主机名 之后输入bash 主机名就显示修改 [root@localhost ~]# hostnamectl set-hostname NAT [root@localhost ~]# bash [root@nat ~]# |
localectl
| localectl status | 查看当前区域配置 [root@nat ~]# localectl status System Locale: LANG=en_US.UTF-8 VC Keymap: us X11 Layout: us |
|---|---|
| locale | 查看当前区域当前相关变量配置 [root@nat ~]# locale LANG=en_US.UTF-8 LC_CTYPE=”en_US.UTF-8” LC_NUMERIC=”en_US.UTF-8” LC_TIME=”en_US.UTF-8” LC_COLLATE=”en_US.UTF-8” LC_MONETARY=”en_US.UTF-8” LC_MESSAGES=”en_US.UTF-8” LC_PAPER=”en_US.UTF-8” LC_NAME=”en_US.UTF-8” LC_ADDRESS=”en_US.UTF-8” LC_TELEPHONE=”en_US.UTF-8” LC_MEASUREMENT=”en_US.UTF-8” LC_IDENTIFICATION=”en_US.UTF-8” LC_ALL= |
| localetcl list-locales | 查看可用语言及编码 [root@nat ~]# localectl list-locales aa_DJ aa_DJ.iso88591 aa_DJ.utf8 aa_ER aa_ER.utf8 aa_ER.utf8@saaho aa_ER@saaho aa_ET aa_ET.utf8 af_ZA af_ZA.iso88591 af_ZA.utf8 am_ET am_ET.utf8 |
| localetcl set-locale [区域和语言] | 设置区域和语言 |
timedatectl
用于查看当前的时区设置
| timedatectl | 查看当前时区设置 [root@nat ~]# timedatectl Local time: Thu 2020-02-27 08:15:30 EST Universal time: Thu 2020-02-27 13:15:30 UTC RTC time: Thu 2020-02-27 13:37:00 Time zone: America/New_York (EST, -0500) NTP enabled: yes NTP synchronized: no RTC in local TZ: no DST active: no Last DST change: DST ended at Sun 2019-11-03 01:59:59 EDT Sun 2019-11-03 01:00:00 EST Next DST change: DST begins (the clock jumps one hour forward) at Sun 2020-03-08 01:59:59 EST Sun 2020-03-08 03:00:00 EDT |
|---|---|
| timedatectl list-timezones | 显示所有可用的时区 |
| timedatectl set-timezone America/New_York timedatectl set-time YYYY-MM-DD timedatectl set-time HH:MM:SS |
设置当前时区 |
loginctl
用于查看当前登录的用户
| loginctl list-sessions | 列出当前的session(会话控制) [root@nat ~]# loginctl list-sessions SESSION UID USER SEAT 4 0 root 2 0 root 1 0 root seat0 3 sessions listed. |
|---|---|
| loginctl list-users | 列出当前登录用户 [root@nat ~]# loginctl list-users UID USER 0 root 1 users listed. |
| loginctl show-user [用户名] | 列出显示指定用户的信息 [root@nat ~]# loginctl show-user root UID=0 GID=0 Name=root Timestamp=Thu 2020-02-27 06:52:23 EST TimestampMonotonic=153510596 RuntimePath=/run/user/0 Slice=user-0.slice Display=1 State=active Sessions=4 2 1 IdleHint=no IdleSinceHint=0 IdleSinceHintMonotonic=0 Linger=no |
核心概念 Unit
配置文件中进行标识和配置,文件中主要包括系统服务 /监听socket/保存的系统快照已经其他与init相关信息,保存至:
- /usr/lib/systemd/system/
- /run/systemd/system/
- /etc/systemd/system/
Unit类型:
| 1 | service unit | 文件拓展为:.service | 用于定义系统服务(程序做管理) |
|---|---|---|---|
| 2 | target unit | 文件拓展名为.target | 用于模拟实现“运行级别” |
| 3 | device unit | 文件拓展名为.divice | 用于定义内核识别的设备 |
| 4 | mount unit | 文件拓展名为.mount | 用于定义文件系统挂载 |
| 5 | socket unit | 文件拓展名为.socket | 用于标识进程间通信的socket文件 |
| 6 | snapshot unit | 文件拓展名为.snapshot | 用于管理系统快照 |
| 7 | swap unit | 文件拓展名为.swap | 用于标识swap设备 |
| 8 | antomount unit | 文件拓展名为.automount | 用于文件系统的自动挂载 |
| 9 | path unit | 文件拓展名为.path | 用户定义文件系统的一个目录或文件 |
关键特性:
- 基于socket的激活机制,socket与服务程序分离
- 基于path的激活机制
- 基于device的激活机制
- 基于path的激活机制
- 系统快照,保存各个unit的当前状态信息于持久化存储设备之中
- 向后兼容 sysv init 脚本
- 不兼容:
- systemctl 命令固定不变
- 非由systemd启动的服务,systemctl无法通信,systemctl无法进行管理
运行级别 一共有7个
- 配置文件:.target为文件拓展名
- 运行级别:
- 0 :中断模式,关机
- 1:单机用户
- 2:多用户,无网络连接
- 3:多用户,无图形界面,并且可以通过终端和网络进行登录
- 4:用户自定义
- 5:多用户,有图形界面,网络连接
- 6:重启
- 救援模式
运行级别相关命令
- 查看级别:
- runlevel == systemctl list-units --type target
- 查看默认级别:
- systemctl get-default
- 切换级别:
- init N |==systemctl isolate name.target
- 修改默认级别:
- systemctl set-default name.target
- 切换至紧急救援模式:
- sysemctl emergency | rescue
- 其他常用命令:
| 重启系统 | systemctl reboot | init 6 |
|---|---|
| 关闭系统,切断电源 | systemctl poweroff |
| CPU停止工作 | systemctl halt |
| 关机 | init 0 |
| 暂停系统,挂起 | systemctl suspend |
| 让系统进入冬眠状态,快照 | systemctl hibernate |
| 让系统进入交互式冬眠状态,快照并挂起 | sudo systemctl hybrid-sleep |
| sudo 所执行的指令就好像是 root 亲自执行 使用权限:在 /etc/sudoers 中有出现的使用者 |
systemctl 管理系统服务
[root@tenor ~]# systemctl -h
systemctl [OPTIONS…] {COMMAND} …
| 启动服务 | systemctl start name.service |
|---|---|
| 停止服务 | systemctl stop name.service |
| 重启服务 | systemctl restart name.service |
| 查看服务状态 | systemctl status name.service |
| 重载或者重启服务 | systemctl daemon-reload |
| 开机自启 | systemctl enable name.service |
| 开机禁止自启 | systemctl disable name .service |
| 某个服务是否被激活 | systemctl is-active name .service |
| 查看某个服务是否开机自启 | systemctl is-enable name.service |
| 查看已经激活的服务 | systemctl list-units —type service |
| 查看所有服务 | systemctl list-units —type service —all |
| 查看运行失败的单元 | systemctl —failed |
| 查看系统中安装的服务 | systemctl list-unit-files |
系统引导程序GRUB
介绍
GRUB(GRand Unified Bootloader)的全称为GNU GRUB,是一个来自GNU计划的多操作系统引导程序。它可以让用户在安装的多个不同操作系统之间选择启动的操作系统,同时还可以向操作系统内核传递参数。
RHEL8默认使用GRUB2作为系统引导程序,GRUB2引导系统使用的分区位于/boot中,称为引导分区。
GRUB 2的启动菜单界面
GRUB2的命令行界面
当GRUB引导系统失败的时候,GRUB就会自动进入命令行界面,以“grub>”作为提示符
常用命令
| 命令 | 作用 |
|---|---|
| ls | 列出设备或文件列表 |
| set | 设置环境变量 |
| insmod | 插入模块 |
| reboot | 重启计算机 |
| file | 检查文件类型 |
| date | 显示当前计算机的时间 |
| module | 载入指定的模块 |
| initrd | 载入内容映像盘 |
| linux | 引导操作系统内核 |
| chainloader | 加载另一个引导程序 |
| boot | 按设置引导操作系统 |
GRUB的配置文件

每一个文件代表grub.cfg引导条目中的一条内容,前面的数字代表优先级,数字越小,优先级越高,表示该条目在引导界面中选项列表的位置越靠前。
除了40_custom之外,每一个文件就是shell脚本,用户可以自行添加条目,或者直接修改40_custom添加条目

