当前位置: 首页 > news >正文

linux-系统启动-8

linux启动流程

系统启动流程:整体框架上遵循 Linux 标准的 BIOS/UEFI → GRUB → 内核加载 → systemd 初始化

启动流程

  1. 硬件启动阶段

    1. 加电自检(POST)
      • 主板BIOS/UEFI初始化硬件,检测CPU、内存、硬盘等关键组件。
      • 故障处理:严重错误停机;非严重错误提示报警
    2. 选择启动设备
      • BIOS/UEFI按配置顺序(硬盘>U盘>网络)扫描设备,加载首个含引导程序的设备
  2. 引导加载阶段(GRUB2)

    1. MBR引导(CentOS 7/8通用)
      • 读取硬盘首个扇区的MBR(主引导记录),加载GRUB2的 stage1(446字节)
    2. GRUB2阶段
      • Stage 1.5:加载文件系统驱动(如ext4/XFS),识别 /boot 分区
      • Stage 2:解析配置文件(/boot/grub2/grub.cfg ),显示内核选择菜单
      • 加载内核(vmlinuz)和初始化内存盘(initramfs)到内存
  3. 内核初始化阶段

    1. 内核解压与探测硬件

      • 解压vmlinuz,探测所有硬件并加载驱动(依赖initramfs中的临时驱动模块)
    2. 挂载根文件系统

      • 只读方式挂载真正的根文件系统(避免内核缺陷损坏数据)
    3. 启动第一个用户进程

      • 移交控制权给/usr/lib/systemd/systemd(PID=1)
    4. centos 7 跟 8 关键差异

      阶段CentOS 7CentOS 8
      引导支持仅BIOSBIOS + UEFI(支持GPT分区)
      默认内核3.10.x4.18.x(支持新硬件)
      服务单元路径/usr/lib/systemd/system同左,增加/etc/systemd/system优先级
      initramfs生成dracut同左,配置文件位于/etc/dracut.conf.d

      ⚠️: 如果用国产化内核4.1,研究好久用/usr/systemd/system

  4. systemd初始化阶段(核心差异点)

    内核初始化,centos7使用systemd代替init

    1. 执行initrd.target所有单元

      • 挂载/etc/fstab中的文件系统(如/sysroot
      • 加载必要驱动(如LVM/RAID),为根切换做准备
    2. initramfs 根文件系统切换到磁盘根目录 (/sysroot)

    3. 执行 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
        
    4. 关键target的作用

      1. sysinit.target :初始化系统环境(挂载文件系统、设主机名等)
      2. basic.target :准备基础服务(如套接字、定时器)
      3. multi-user.target:
        • 启动网络服务、sshd等后台进程。
        • 执行用户自定义脚本(/etc/rc.d/rc.local
      4. graphical.target (可选):启动X Window、桌面环境
      传统运行级别systemd目标说明
      3(多用户)multi-user.target文本界面,启动服务器服务
      5(图形)graphical.target加载X Window及桌面环境
      0(关机)poweroff.target终止所有服务并关闭电源
  5. 登录阶段

    1. 启动登录服务
      • systemd激活getty.target ,生成终端(tty1~tty6)等待用户登录
    2. 用户登录
      • 启动login进程,验证用户身份后加载Shell

启动流程阶段与差异对比

  • 阶段对比

    阶段CentOS 7CentOS 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.servicenginx.service
    Target.target类似传统运行级别,用于分组和激活其他Unit,如multi-user.target (多用户命令行模式)、graphical.target (图形界面模式)。
    Socket.socket定义进程间通信的套接字,支持按需启动服务(Socket激活),如dbus.socketcups.socket
    Mount.mount管理文件系统挂载点,定义挂载选项和依赖,如/home.mounttmp.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)可避免频繁重启;
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包开机自启

  1. 前置: 本地有一个 recalculation.jar包

  2. 编写启动脚本

    [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 
    
  3. 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
    
http://www.dtcms.com/a/557901.html

相关文章:

  • 数码商城系统|电子|基于SprinBoot+vue的商城推荐系统(源码+数据库+文档)
  • 第10讲:导航与路由:在页面间穿梭
  • Linux 磁盘空间“消失”之谜:文件已删,空间却不释放?
  • P1990 覆盖墙壁(dp)
  • 计算机操作系统理论学习
  • 胶州建网站推广游戏的平台
  • 未来之窗昭和仙君(四十九)集成电路芯片生产管理出库——东方仙盟筑基期
  • 哈尔滨公司网站建设科技企业网站源码
  • 行业网站推广怎么做wordpress-3.7
  • Pandas 简介与安装
  • openpnp - 吸嘴的单独校准
  • 程序员除了做软件是不是就做网站县 两学一做网站
  • 企业网站制作公司有哪些口碑营销的本质是什么
  • 北京住房和建设部网站首页网站开发结构图
  • 最新电子电气架构(EEA)调研-4
  • Google Chrome (dev beta)
  • SimPy经典案例分析
  • 跨端开发实践:多端适配指南
  • 索引的知识总结
  • 外贸汽车网站制作设计类专业笔记本电脑推荐
  • 织梦网站网站上的图用美图秀秀做可以吗
  • WebMvcConfig 和 WebSecurityConfig 详解
  • 使用unity做网站商城网站建设运营协议书
  • 21.7 企业级监控与日志系统实战:Prometheus+Grafana+ELK全链路配置指南
  • wordpress网站搬家书画院网站源码
  • css属性使用手册
  • SAPMM修改物料评估类型后报错:M7115只是可能对有相同评估类进行倒记帐(本月1002,前月1007)
  • 现在主流的网站开发语言全网整合营销平台
  • 08数据展示:Grafana数据可视化工具
  • 做网站多少钱_西宁君博相约宿迁人才网