linux-系统启动-8
linux启动流程
系统启动流程:整体框架上遵循 Linux 标准的 BIOS/UEFI → GRUB → 内核加载 → systemd 初始化
启动流程
-
硬件启动阶段
- 加电自检(POST)
- 主板BIOS/UEFI初始化硬件,检测CPU、内存、硬盘等关键组件。
- 故障处理:严重错误停机;非严重错误提示报警
- 选择启动设备
- BIOS/UEFI按配置顺序(硬盘>U盘>网络)扫描设备,加载首个含引导程序的设备
- 加电自检(POST)
-
引导加载阶段(GRUB2)
- MBR引导(CentOS 7/8通用)
- 读取硬盘首个扇区的MBR(主引导记录),加载GRUB2的 stage1(446字节)
- GRUB2阶段
- Stage 1.5:加载文件系统驱动(如ext4/XFS),识别
/boot分区 - Stage 2:解析配置文件(
/boot/grub2/grub.cfg),显示内核选择菜单 - 加载内核(
vmlinuz)和初始化内存盘(initramfs)到内存
- Stage 1.5:加载文件系统驱动(如ext4/XFS),识别
- MBR引导(CentOS 7/8通用)
-
内核初始化阶段
-
内核解压与探测硬件
- 解压
vmlinuz,探测所有硬件并加载驱动(依赖initramfs中的临时驱动模块)
- 解压
-
挂载根文件系统
- 以只读方式挂载真正的根文件系统(避免内核缺陷损坏数据)
-
启动第一个用户进程
- 移交控制权给
/usr/lib/systemd/systemd(PID=1)
- 移交控制权给
-
centos 7 跟 8 关键差异
阶段 CentOS 7 CentOS 8 引导支持 仅BIOS BIOS + UEFI(支持GPT分区) 默认内核 3.10.x 4.18.x(支持新硬件) 服务单元路径 /usr/lib/systemd/system同左,增加 /etc/systemd/system优先级initramfs生成 dracut同左,配置文件位于 /etc/dracut.conf.d⚠️: 如果用国产化内核4.1,研究好久用/usr/systemd/system
-
-
systemd初始化阶段(核心差异点)
内核初始化,centos7使用systemd代替init
-
执行initrd.target所有单元
- 挂载
/etc/fstab中的文件系统(如/sysroot) - 加载必要驱动(如LVM/RAID),为根切换做准备
- 挂载
-
从 initramfs 根文件系统切换到磁盘根目录 (/sysroot)
-
执行 default.target ,配置文件/etc/systemd/system/default.target
-
CentOS 7/8默认目标:
- 字符界面:
multi-user.target(相当于runlevel 3) - 图形界面:
graphical.target(相当于runlevel 5)
- 字符界面:
-
依赖链顺序:
sysinit.target → basic.target → multi-user.target → graphical.target
-
-
关键target的作用
- sysinit.target :初始化系统环境(挂载文件系统、设主机名等)
- basic.target :准备基础服务(如套接字、定时器)
- multi-user.target:
- 启动网络服务、
sshd等后台进程。 - 执行用户自定义脚本(
/etc/rc.d/rc.local)
- 启动网络服务、
- graphical.target (可选):启动X Window、桌面环境
传统运行级别 systemd目标 说明 3(多用户) multi-user.target文本界面,启动服务器服务 5(图形) graphical.target加载X Window及桌面环境 0(关机) poweroff.target终止所有服务并关闭电源
-
-
登录阶段
- 启动登录服务
systemd激活getty.target,生成终端(tty1~tty6)等待用户登录
- 用户登录
- 启动
login进程,验证用户身份后加载Shell
- 启动
- 启动登录服务
启动流程阶段与差异对比
-
阶段对比
阶段 CentOS 7 CentOS 8 1. 固件引导 BIOS/UEFI 初始化硬件,加载 MBR/GPT 分区表,执行引导程序(GRUB 2)。 同 CentOS 7,支持 UEFI 安全启动,硬件兼容性因内核升级略有提升 2. GRUB 引导 加载 GRUB 配置文件( /boot/grub2/grub.cfg),选择内核版本。同 CentOS 7,配置文件路径一致,但内核版本默认升级为 4.18.0-x 3. 内核初始化 加载内核(3.10.0-x)及 initramfs,挂载根文件系统(XFS)。 加载内核(4.18.0-x),支持更大的文件系统(1PB vs 500TB)和内存(24TB vs 12TB)。 4. 初始化进程 启动 systemd(PID 1),加载默认 target(如multi-user.target)。同 CentOS 7, systemd作为初始化进程,默认安装 Cockpit 管理工具。 -
关键差异点说明
- 内核版本与硬件支持
- CentOS 7 使用 3.10.0-x 内核,CentOS 8 升级为 4.18.0-x,支持 64-bit ARM 架构、更大的文件系统(1PB)和内存(24TB),硬件兼容性更强 。
- 文件系统与存储
- 两者默认文件系统均为 XFS,但 CentOS 8 支持更大的单个文件(8EB vs 500TB)和文件系统容量 。
- 时间同步服务
- CentOS 7 支持 NTP 和 Chronyd,CentOS 8 仅支持 Chronyd,不再支持 NTP 部署 。
- 网络与管理工具
- CentOS 8 默认安装 Cockpit(Web 管理界面),CentOS 7 需手动安装
- 内核版本与硬件支持
systemD
- systemd 旨在解决传统 SysVinit 的串行启动慢、依赖管理复杂等问题,核心特点包括:
- 并行启动:通过 Socket/D-Bus 激活技术,让服务并行启动,缩短开机时间。
- 按需激活:服务仅在被访问时启动(如打印服务),减少资源占用。
- 进程追踪:用 cgroups 替代 PID 管理进程,避免守护进程脱离控制。
- 依赖自检:自动启动服务依赖项(如启动 NFS 时先激活网络)。
unit
-
核心概念
- unit表示不同类型的systemd对象,通过配置文件进行标识和配置;
- 文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
-
类型说明
Unit类型 文件扩展名 用途描述 Service .service管理系统服务,定义服务的启动、停止、重启等生命周期,如 sshd.service、nginx.service。Target .target类似传统运行级别,用于分组和激活其他Unit,如 multi-user.target(多用户命令行模式)、graphical.target(图形界面模式)。Socket .socket定义进程间通信的套接字,支持按需启动服务(Socket激活),如 dbus.socket、cups.socket。Mount .mount管理文件系统挂载点,定义挂载选项和依赖,如 /home.mount、tmp.mount。Path .path监控文件或目录变化,触发关联服务,如监控配置文件变更后重启服务( nginx.path)。Slice .slice用于进程资源管理(CPU、内存等),按层级划分资源,如 system.slice(系统服务)、user.slice(用户进程)。 -
配置文件
- /usr/lib/systemd/system: 每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/
- /run/systemd/system: 系统执行过程中所产生的服务脚本,比上面目录优先运行
- /etc/systemd/system: 管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行
systemctl服务管理
7.6版本之后就不兼容systemV风格脚本
| 说明 | 命令 |
|---|---|
| 启动 | systemctl start name.service |
| 停止 | systemctl stop name.service |
| 重启 | systemctl restart name.service |
| 状态 | systemctl status name.service |
服务查看
| 说明 | 命令 |
|---|---|
| 查看某服务当前激活与否的状态 | systemctl is-active name.service |
| 查看所有已经激活的服务 | systemctl list-units --type|-t service |
| 查看所有服务的开机自启状态 | systemctl list-unit-files --type service |
| 设定某服务开机自启 | systemctl enable name.service |
| 查看服务是否开机自启 | systemctl is-enabled name.service |
| 重新加载配置 | systemctl reload sshd.service |
| 设定某服务开机禁止启动 | systemctl disable name.service |
service unit文件格式
- 以 “#” 开头的行后面的内容会被认为是注释
- 相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
- 时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明
- service unit file文件通常由三部分组成:
-
[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
-
[Service]:与特定类型相关的专用选项;此处为Service类型
-
[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
-
Unit文件配置规则表
Unit段的常用选项
| 选项 | 说明 |
|---|---|
| Description | 描述信息 |
| After | 定义服务的启动顺序,当前服务需在所列服务/目标之后启动(如:After=network.target mysql.service ,表示在网络和MySQL启动后启动)。与Before(反向依赖)配合使用可控制依赖顺序。 |
| Requires | 强依赖关系:若当前服务启动,所列服务必须同时启动;若依赖服务停止,当前服务也会被停止(如:Requires=mysql.service )。建议优先使用Wants(弱依赖)以提高灵活性。 |
| Wants | 弱依赖关系:当前服务启动时会尝试启动所列服务,但依赖服务启动失败不会影响当前服务(如:Wants=logging.service ),是推荐的依赖配置方式。 |
| Conflicts | 冲突关系:若所列服务启动,当前服务会被停止;反之亦然(如:Conflicts=apache2.service ,避免Nginx与Apache同时运行)。 |
Service段的常用选项
-
参数
选项 说明 Type 定义影响ExecStart及相关参数的功能的unit进程启动类型 PIDFile 若服务类型为 forking,需指定PID文件路径(如:PIDFile=/run/nginx.pid),systemd通过该文件跟踪进程ID。EnvironmentFile 设置环境变量(如: Environment="PATH=/usr/local/bin" "LOG_LEVEL=info"),多行配置可使用EnvironmentFile引入外部文件(如:EnvironmentFile=/etc/nginx/env.conf)。User / Group 服务进程的运行用户/组(如: User=nginx Group=nginx),建议使用非root用户以增强安全性。ExecStart 启动服务时执行的命令,绝对路径+参数(如: ExecStart=/usr/sbin/nginx -g "daemon off;")。仅允许配置一条,若需多命令可通过脚本或ExecStartPre/ExecStartPost实现。ExecStop 停止服务时执行的命令(如: ExecStop=/usr/sbin/nginx -s stop),用于优雅关闭服务。ExecReload 重载服务配置时执行的命令(如: ExecReload=/usr/sbin/nginx -s reload),通过systemctl reload <service>触发,通常用于不中断服务的配置更新。Restart 服务退出后的重启策略,提高服务可用性 WorkingDirectory 服务进程的工作目录(如: WorkingDirectory=/var/www/html),影响相对路径解析。Restart 当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务 -
常见值
- Type
simple(默认):服务启动后立即进入运行状态,需确保主进程不fork;forking:服务会fork子进程,父进程退出后子进程继续运行(如后台服务);oneshot:一次性任务,执行完毕后服务退出(需配合RemainAfterExit=yes使服务状态保持为“active”);
- Restart
always:无论退出原因(正常/异常)均重启;on-failure:仅在异常退出(退出码非0、信号终止等)时重启;on-success:仅正常退出时重启(适用于一次性任务);no(默认):不重启。 配合RestartSec=(重启延迟,默认100ms)可避免频繁重启;
- Type
Install段的常用选项
| 选项 | 说明 |
|---|---|
| Alias | 服务的别名,可通过别名进行管理(如:Alias=webserver.service ,允许systemctl start webserver)。 |
| RequiredBy | 类似WantedBy,但表示强依赖目标,较少使用(通常使用WantedBy)。 |
| WantedBy | 服务安装的目标(target),决定服务在哪个运行级别下自动启动(如:WantedBy=multi-user.target ,表示在多用户模式下自动启动)。执行systemctl enable <service>时,会在目标的.wants目录下创建服务的软链接。 |
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket[Service]
Type=notify
Environment="NO_PROXY=192.168.9.0/24,127.0.0.0/8"
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always[Install]
WantedBy=multi-user.target
jar包开机自启
-
前置: 本地有一个 recalculation.jar包
-
编写启动脚本
[root@localhost ~]# cat recalculation-start.sh #!/bin/bash # export JAVA_HOME=/data/openSourceSoft/java/default export PATH=$JAVA_HOME/bin:$PATHss_start(){java -server -Xms2048m -Xmx2048m -jar /data/drs/recalculation/recalculation.jar > /data/drs/recalculation/re.log &echo $! > /data/drs/recalculation/recalculation-service.pid } ss_stop(){PID=$(cat /data/drs/recalculation/recalculation-service.pid)kill -9 $PID } case $1 instart)ss_start ;;stop)ss_stop ;;*)echo "选项异常";; esac[root@localhost ~]# chmod +x cat recalculation-start.sh -
service脚本
[root@localhost ~]# cat /usr/lib/systemd/system/recalculation.service [Unit] Description=recalculation After=syslog.target network.target remote-fs.target nss-lookup.target[Service] Type=forking ExecStart=/data/drs/recalculation/recalculation-start.sh start ExecStop=/data/drs/recalculation/recalculation-stop.sh stop PrivateTmp=true[Install] WantedBy=multi-user.target
