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目录中,主要用于加载内核文件以及

    ramdisk这个临时根文件系

    4.kernel自身初始化

    功能:

  • 检测可识别到的所有硬件设备

  • 加载硬件驱动程序
  • 以只读的方式挂载根文件系统
  • 运行用户空间的一个应用程序:/sbin/init(进程号为0)

    5.init管理用户空间服务进程

    内核空间派来去管理用户空间的使用进程

  • init初始化程序会根据配置文件执行一系列操作

(centos5、6、7关于init的配置文件不同,但是总体的启动流程是不变的)

  • 根据init配置文件设置默认的运行级别

centos7:init初始程序是systemd,
配置为文件:

  1. - /usr/lib/system/systemd/*
  2. - /etc/systemd/system/*

note:centos6\7 Init管理程序的变化

  • 缺点:
    1. 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
    2. 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长

Note:
加电自检 -> 选择bootSequence(选择启动设备)-> 加载BootLoader(启动程序)-> 内核初始化(启动Init程序) -> Init管理的服务(开机自启相关服务)
image.png

Centos 7 Systemd特性

字母d是守护进程(daemon)的缩写,守护整个系统
使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反”keep simple, keep stupid”的Unix 哲学;但是现在的Centos 7 已经将它作为系统的守护进程组件了

特性

     - 系统引导时实现服务并启动
     - 按需激活进程
     - 系统服务状态快照
     - 基于依赖关系定义服务控制逻辑

Centos 7 启动流程 与  Centos 7 Systemd特性 - 图2

相关命令

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中,称为引导分区。
image.png

GRUB 2的启动菜单界面

image.png
第一个为正常启动系统的选项,第二个为启动系统的救援模式。

GRUB2的命令行界面

当GRUB引导系统失败的时候,GRUB就会自动进入命令行界面,以“grub>”作为提示符
常用命令

命令 作用
ls 列出设备或文件列表
set 设置环境变量
insmod 插入模块
reboot 重启计算机
file 检查文件类型
date 显示当前计算机的时间
module 载入指定的模块
initrd 载入内容映像盘
linux 引导操作系统内核
chainloader 加载另一个引导程序
boot 按设置引导操作系统

GRUB的配置文件

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