zoukankan      html  css  js  c++  java
  • systemd 之 systemctl

    Systemd 常规操作与彩蛋

    一、前言

    上了俩个月的RHCE工程师的班,收获颇多。话说回来,在 redhat 7 中有个非常重要的概念,即:systemd

    systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。systemd 的特性有:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。

    二、基础知识

    监视和控制 systemd 的主要命令是 systemctl

    该命令可用于查看系统状态和管理系统及服务。详见 man 1 systemctl

    使用单元

    一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets) 、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由 systemd 管理的计时器(.timer)。详情参阅 man 5 systemd.unit

    使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service )。但是有些单元可以在 systemctl 中使用简写方式。

    • 如果无扩展名,systemctl 默认把扩展名当作 .service 。例如 netcfgnetcfg.service 是等价的。
    • 挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount
    • 设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device

    单元位置

    所有可用的单元文件存放在 /usr/lib/systemd/system//etc/systemd/system/ 目录(后者优先级更高)。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。要注意当单元文件被COPY至并完成修改后,一定要使用 systemctl daemon-reload 完成重载与应用。

    编写单元

    systemd 单元文件的语法来源于 XDG 桌面项配置文件.desktop文件,最初的源头则是Microsoft Windows的.ini文件。单元文件可以从两个地方加载,优先级从低到高分别是:

    • /usr/lib/systemd/system/ :软件包安装的单元

    • /etc/systemd/system/ :系统管理员安装的单元

    • systemd 运行在用户模式下时,使用的加载路径是完全不同的。

    • systemd 单元名仅能包含 ASCII 字符,下划线和点号。其它字符需要用 C-style "x2d" 替换。

    单元文件的语法,可以参考系统已经安装的单元,也可以参考 man systemd.service 中的EXAMPLES章节

    **提示: **以 # 开头的注释可能也能用在 unit-files 中,但是只能在新行中使用。不要在 systemd 的参数后面使用行末注释, 否则 unit 将会启动失败。

    处理依赖关系

    使用 systemd 时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元 A 要求单元 BA 启动之前运行。在此情况下,向单元 A 配置文件中的 [Unit] 段添加 Requires=BAfter=B 即可。若此依赖关系是可选的,可添加 Wants=BAfter=B 。请注意 Wants=Requires= 并不意味着 After= ,即如果 After= 选项没有制定,这两个单元将被并行启动。

    依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。

    服务类型

    编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。

    • Type=simple :(默认值) systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型。

    • Type=forking :systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程。

    • Type=oneshot :这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。

    • Type=notify :与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。

    • Type=dbus :若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

    • Type=idlesystemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。

    type 的更多解释可以参考 systemd.service(5)

    三、常规操作

    快速了解

    输出激活的单元

    systemctl
    

    审查系统运行状态

    systemctl status
    

    注意:这条命令也用于检查服务状态,可在其后加入服务名称或PID号即可查询。缺省下展示所有服务信息。

    输出运行失败的单元

    systemctl --failed
    

    立即激活单元:

    # systemctl start <单元>
    

    常规使用

    立即激活单元:

    # systemctl start <单元>
    
    

    立即停止单元:

    # systemctl stop <单元>
    
    

    重启单元:

    # systemctl restart <单元>
    
    

    重新加载配置:

    # systemctl reload <单元>
    
    

    输出单元运行状态:

    $ systemctl status <单元>
    
    

    注意:在输出显示中有Docs:标签,其内容即为:由单元文件提供的手册页;使用-l 参数可查看完整的服务状态日志(提取至内存,即最新)。

    检查单元是否配置为自动启动(单):

    $ systemctl is-enabled <单元>
    

    检查单元是否配置为自动启动(全):

    $ systemctl list-unit-files
    

    注意:你并不需要立马背出该语句,在 chkconfig 命令中有写。依旧可以使用它完成服务的自启或取消自启,但使用 chkconfig 已经不能显示服务的状态了。

    开机自动激活单元:

    # systemctl enable <单元>
    
    

    取消开机自动激活单元:

    # systemctl disable <单元>
    
    

    禁用一个单元(禁用后,间接启动也是不可能的):

    # systemctl mask <单元>
    
    

    取消禁用一个单元:

    # systemctl unmask <单元>
    

    重新载入 systemd,扫描新的或有变动的单元:

    # systemctl daemon-reload
    

    更多操作

    修改默认运行级别/目标

    开机启动的目标是 default.target,默认链接到 graphical.target (大致相当于原来的运行级别5)。可以通过内核参数更改默认运行级别:

    • systemd.unit=multi-user.target (大致相当于级别3)
    • systemd.unit=rescue.target (大致相当于级别1)

    另一个方法是修改 default.target。可以通过 systemctl 修改它:

    # systemctl set-default multi-user.target
    
    

    要覆盖已经设置的default.target,请使用 force:

    # systemctl set-default -f multi-user.target
    
    

    可以在 systemctl 的输出中看到命令执行的效果:链接 /etc/systemd/system/default.target 被创建,指向新的默认运行级别。

    切换运行级别/目标

    systemd 中,运行级别通过“目标单元”访问。通过如下命令切换:

    # systemctl isolate graphical.target
    
    

    该命令对下次启动无影响。等价于telinit 3telinit 5

    SysV 运行级别 Systemd 目标 注释
    0 runlevel0.target, poweroff.target 中断系统(halt)
    1, s, single runlevel1.target, rescue.target 单用户模式
    2, 4 runlevel2.target, runlevel4.target, multi-user.target 用户自定义运行级别,通常识别为级别3。
    3 runlevel3.target, multi-user.target 多用户,无图形界面。用户可以通过终端或网络登录。
    5 runlevel5.target, graphical.target 多用户,图形界面。继承级别3的服务,并启动图形界面服务。
    6 runlevel6.target, reboot.target 重启
    emergency emergency.target 急救模式(Emergency shell)

    四、一些彩蛋

    显示系统自动时间

    # systemd-analyze blame
    

    输出系统启动图片

    systemd-analyze plot > bootchart.svg
    
    systemd-analyze dot | dot -Tsvg > bootchart.svg
    

    注意:这俩个彩蛋依赖于画图工具,需进行安装。yum -y install plot graphviz

  • 相关阅读:
    【转】编写高质量代码改善C#程序的157个建议——建议147:重构多个相关属性为一个类
    【转】编写高质量代码改善C#程序的157个建议——建议146:只对外公布必要的操作
    【转】编写高质量代码改善C#程序的157个建议——建议145:避免过长的方法和过长的类
    【转】编写高质量代码改善C#程序的157个建议——建议144:一个方法只做一件事
    【转】编写高质量代码改善C#程序的157个建议——建议143:方法抽象级别应在同一层次
    【转】编写高质量代码改善C#程序的157个建议——建议142:总是提供有意义的命名
    【转】编写高质量代码改善C#程序的157个建议——建议141:不知道该不该用大括号时,就用
    【转】编写高质量代码改善C#程序的157个建议——建议140:使用默认的访问修饰符
    【转】编写高质量代码改善C#程序的157个建议——建议139:事件处理器命名采用组合方式
    SpringMVC学习总结(六)——SpringMVC文件上传例子(2)
  • 原文地址:https://www.cnblogs.com/itxdm/p/Systemd_regular_operation_with_eggs.html
Copyright © 2011-2022 走看看