zoukankan      html  css  js  c++  java
  • [TimLinux] systemd 精通CentOS7系统启动systemd

    1. 介绍

    systemd: 在12种不同类型的实体单元(entity unit)间提供了一个依赖关系系统。

    2. 几个概念

    实体单元:为系统的启动和维护封装多种对象(object)。
    主体单元在单元配置文件中配置(语法和基本选项集在man 5 systemd.unit中查看),也有通过从其他配置文件中自动创建单元配置,根据系统运行时的状态动态创建单元配置。单元的配置:1. 来自配置文件,2. 来自其他配置文件,自动创建当前单元的配置,3. 系统运行时得出的动态配置。

    实体单元状态:active(started, bound, plugged, ...),inactive(stopped,unbound, unplugged, ...), failed(启动失败)。一旦进入一个状态,将被记录。实体单元也有许多附加的子状态。

    3. 实体单元

    12种实体单元类型:
    1. 服务单元(service units):启动和控制 daemons 等进程,更多信息 man 5 systemd.service
    2. 套接字单元(socket units):封装本地在系统内等 IPC 或网络 socket,基于网络点激活,man 5 systemd.socket, man 7 daemon
    3. 目标单元(target units):用于对单元分组,或启动阶段更好同步点,man 5 systemd.target
    4. 设备单元(device units):基于设备点激活,内核使用的设备,man 5 systemd.device
    5. 挂载单元(mount units):控制在文件系统内的挂载点,man 5 systemd.mount
    6. 自动挂载单元(automount units):提供自动挂载能力,并行启动阶段文件系统挂载,man 5 systemd.automount
    7. 快照单元(snapshot units):可用来临时对实体单元集合对状态进行临时保存,之后可以从保存快照单元中恢复,man 5 systemd.snapshot
    8. 定时器单元(timer units):基于定时器来触发其他单元对激活,man 5 systemd.timer
    9. 交换单元(swap units):与挂载单元类型,封装了文件系统内存交换分区相关对象,man 5 systemd.swap
    10. 路径单元(path units):用来当文件系统的对象改变或被修改时,激活其他服务,man 5 systemd.path
    11. 切片单元(slice units):用于资源管理的目的来对单元进行分组,管理系统进程(如:服务单元、范围单元)在层次化树中,man 5 systemd.slice
    12. 范围单元(scope units):与服务单元类似,但是用来管理外部进程,而不是启动他们,man 5 systemd.scope

    4. 依赖

    systemd 包含许多种类的依赖:
    1. 正向,反向需求(requirement)依赖(Requires= 和 Conflicts=2. 顺序依赖(After= 和 Before=)
    当在两个单元之间只存在需求依赖,而没有顺序依赖,两单元将并行启动。通常的模式是需求依赖和顺序依赖在两个单元内都进行配置,多数的依赖关系是由systemd隐式创建和维护的,配置文件内不需要手动进行配置。
    
    应用程序可能在单元状态发生变化时,因配置的依赖关系而被请求启动。在systemd内,这样的请求被封装在'jobs'内,并维护在一个Job queue里面。Jobs可能成功或失败,他们的执行是顺序的,顺序依赖关系来自单元被调用时的顺序。
    
    在启动阶段的systemd激活 target单元 default.target,它的工作是用来激活启动阶段的服务单元、和其他根据依赖关系拉起来的启动单元。通常单元名只是graphical.targe或者multi-user.target的一个符号链接别名。然而切换到其他目标也是一项需要慎重对待的管理任务。man 7 systemd.special查看关于这些目标单元更多的细节。
    
    systemd进程存放在一个独立的Linux控制组(control groups),单元属于systemd层次的私有结构中。systemd使用这样的结构来有效跟踪进程。控制组信息在内核中维护,并且通过文件系统结构(/sys/fs/cgroup/systemd)或者工具来访问(ps xawf -eo pid,user,cgroup,args)。

    5. 启动过程

    systemd 解析顺序:
    1. /usr/lib/systemd/system/default.target ->graphical.target
    
    cat /usr/lib/systemd/system/default.target
    [Unit]
    Description=Graphical Interface
    Documentation=man:systemd.special(7)
    Requires=multi-user.target
    Wants=display-manager.service
    Conflicts=rescue.service rescue.target
    After=multi-user.target rescue.service rescue.target display-manager.service
    AllowIsolate=yes
    
    发现Requires,然后解析 multi-user.target
    
    2. /usr/lib/systemd/system/multi-user.target
    
    cat /usr/lib/systemd/system/multi-user.target
    [Unit]
    Description=Multi-User System
    Documentation=man:systemd.special(7)
    Requires=basic.target
    Conflicts=rescue.service rescue.target
    After=basic.target rescue.service rescue.target
    AllowIsolate=yes
    
    包含的单元集合:
    /etc/systemd/system/multi-user.target.wants/
    /usr/lib/systemd/system/multi-user.target.wants/
    
    发现 Requires,然后解析 basic.target
    
    3. /usr/lib/systemd/system/basic.target
    
    cat /usr/lib/systemd/system/basic.target
    [Unit]
    Description=Basic System
    Documentation=man:systemd.special(7)
    
    Requires=sysinit.target
    After=sysinit.target
    Wants=sockets.target timers.target paths.target slices.target
    After=sockets.target paths.target slices.target
    
    包含的单元集合:
    /etc/systemd/system/basic.target.wants/
    /usr/lib/systemd/system/basic.target.wants/
    
    basic.target是一个特殊单元,不能被重命名(systemd认这个名称,并执行了一些内置默认的启动操作)
    
    发现 Requires,然后解析 sysinit.target
    
    4. /usr/lib/systemd/system/sysinit.target
    
    cat /usr/lib/systemd/system/sysinit.target
    [Unit]
    Description=System Initialization
    Documentation=man:systemd.special(7)
    Conflicts=emergency.service emergency.target
    Wants=local-fs.target swap.target
    After=local-fs.target swap.target emergency.service emergency.target
    
    包含的单元集合:
    /etc/systemd/system/sysinit.target.wants/
    /usr/lib/systemd/system/sysinit.target.wants/
    
    发现 After,然后解析 local-fs.target
    
    5. /usr/lib/systemd/system/local-fs.target
    
    cat /usr/lib/systemd/system/local-fs.target
    [Unit]
    Description=Local File Systems
    Documentation=man:systemd.special(7)
    DefaultDependencies=no
    Conflicts=shutdown.target
    After=local-fs-pre.target
    OnFailure=emergency.target
    OnFailureJobMode=replace-irreversibly
    
    包含的单元集合:
    /usr/lib/systemd/system/local-fs.target.wants/
    
    发现 After,然后解析 local-fs-pre.target,pre.target是一个特殊target,内置了启动项。

    6. 其他

    要查看具体的启动顺序可以通过如下命令输入到文件,然后通过浏览器打开查看。
    systemd-analyze plot > boot-sequence.html


    列出所有正在运行的单元,按从初始化开始到启动所花的时间排序。
    systemd-analyze blame

  • 相关阅读:
    软件开发中的程序员和产品经理
    Linux下自动备份MySQL
    使用FeignClient,消费方使用方法,和一些坑
    FeignClient 使用
    关于sql查询,按时间段查询
    aquery验证
    Ajax
    弹框
    来源于网络 感觉很好就收藏;了
    org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
  • 原文地址:https://www.cnblogs.com/timlinux/p/10382239.html
Copyright © 2011-2022 走看看