Systemd的使用指南

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Systemd的使用指南相关的知识,希望对你有一定的参考价值。

参考技术A

本文主要是学习笔记的第二篇,介绍的是systemd的systemctl和编写配置单元的语法格式。

供自己日后复习而整理的,因此将参考文献放在最前面了。

主要参考和引用的文字来自 linux systemd 主要语法

Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。
这里以一个docker.service为例。一般开机会加载的配置文件都放在/lib/systemd/system中。用户和三方软件定义的配置文件一般在/usr/lib/systemd/system中。

启动[关闭]一个docker服务

查看可以使用的服务,使用管道进行具体的选择。直接使用 systemctl list-unit-files 可以看到配置单元列表(查看各个服务的启动与禁用情况),被启用enabled的单元显示为绿色,被禁用disabled的显示为红色。标记为“static”的单元不能直接启用,它们是其他单元所依赖的对象。

查看服务的状态,如服务描述、单元配置文件的位置、启动的时间、进程号,以及它所从属的 CGroups(用以限制各组进程的资源开销)。

重新加载配置服务,如果修改了某个服务的配置文件,就要重新加载配置,然后重新启动,否则修改不会生效。

将某项服务设置[取消]为可开机启动。其实就是把用户配置文件链接到系统配置文件去.如果配置文件设置了开机启动,则会开机启动.

让单元重新加载配置文件的,(不停止服务)

重启服务

可以使用 systemctl cat sshd.service 来查看具体的配置单元的设置。主要分为三个区块,下面介绍三个区块,以及区块内包含属性的含义.

其中Post pre 类命令写多个不覆盖,其他会覆盖.

一个触摸板的例子见附录B

WantedBy字段:表示该服务所在的 Target。一般来说,常用的 Target 有两个:

如果您在 /usr/lib/systemd/system 目录中输入 ls 命令,您将看到各种以 .target 结尾的文件。启动目标target是一种将多个单元聚合在一起以致于将它们同时启动的方式。例如,对大多数类 Unix 操作系统而言有一种“多用户multi-user”状态,意思是系统已被成功启动,后台服务正在运行,并且已准备好让一个或多个用户登录并工作——至少在文本模式下。一个服务会通过配置单元的Install区块的 WantedBy 选项让自己成为启动目标的依赖。因此,切换到多用户启动目标会启用enable那些包含上述语句的单元。关于target的更多内容可以回顾上面 四、systemd中的基本概念 中的内容
一个简单的配置例子见附录C

开机关闭触摸板的例子,上面的配置文件,启动类型设为oneshot,就表明这个服务只要运行一次就够了,不需要长期运行。

如果关闭以后,将来某个时候还想打开,配置文件修改如下。RemainAfterExit字段设为yes,表示进程退出以后,服务仍然保持执行。这样的话,一旦使用systemctl stop命令停止服务,ExecStop指定的命令就会执行,从而重新开启触摸板。

systemd的简单使用和说明

参考了

systemd入门1

debian官方参考

opensuse中文

systemd介绍

1 systemd

systemd是Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。目前debian8和centos7均默认使用了systemd工具来管理服务。在此之前,通常使用init的sysv风格的脚本管理本机服务。缺点是不方便处理并发依赖等。systemd相较sysv则更加方便,更加强大,缺点是体系比较庞大,比较复杂。

2 安装

apt-get install systemd-sysv

3 帮助

man systemd-system.conf

常用命令介绍:

2 systemctl

systemctl是systemd组的一个命令,用于管理系统本身。

常见的有:

# 重启系统$ sudo systemctl reboot# 关闭系统,切断电源$ sudo systemctl poweroff# CPU停止工作$ sudo systemctl halt# 暂停系统$ sudo systemctl suspend# 让系统进入冬眠状态$ sudo systemctl hibernate# 让系统进入交互式休眠状态$ sudo systemctl hybrid-sleep# 启动进入救援状态(单用户状态)$ sudo systemctl rescue

3 systemd-analyze

# 查看启动耗时[[email protected] ~]# systemd-analyzeStartup finished in 607ms (kernel) + 3.971s (initrd) + 27.937s (userspace) = 32.517s                                                                                  

# 查看每个服务的启动耗时,blame本义责任,这里可理解为追究[[email protected] ~]# systemd-analyze blame
     14.290s network.service      5.228s firewalld.service      3.775s tuned.service      1.584s kdump.service      1.415s NetworkManager.service       995ms boot.mount       946ms postfix.service       881ms lvm2-monitor.service       715ms systemd-tmpfiles-setup-dev.service       699ms rhel-readonly.service       519ms systemd-logind.service       409ms polkit.service       382ms [email protected]:2.service       319ms rsyslog.service       223ms auditd.service       223ms kmod-static-nodes.service       208ms systemd-udev-trigger.service       202ms sys-kernel-debug.mount       191ms rhel-import-state.service       158ms rhel-dmesg.service       155ms systemd-sysctl.service       143ms home.mount       132ms systemd-vconsole-setup.service       127ms dev-mapper-centos\x2dswap.swap       122ms systemd-user-sessions.service       112ms dev-mqueue.mount       111ms dev-hugepages.mount       102ms plymouth-read-write.service        85ms systemd-tmpfiles-setup.service        63ms systemd-update-utmp.service        60ms systemd-remount-fs.service        51ms systemd-random-seed.service        44ms plymouth-start.service        39ms systemd-udevd.service        33ms plymouth-quit-wait.service        27ms plymouth-quit.service        22ms systemd-update-utmp-runlevel.service         9ms systemd-journal-flush.service         4ms sys-kernel-config.mount# 显示瀑布状的启动过程流[[email protected] ~]# systemd-analyze critical-chainThe time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @27.914s
└─kdump.service @26.327s +1.584s
  └─network.target @26.327s
    └─network.service @12.034s +14.290s
      └─NetworkManager.service @10.617s +1.415s
        └─firewalld.service @5.388s +5.228s
          └─basic.target @5.376s
            └─paths.target @5.376s
              └─brandbot.path @5.375s
                └─sysinit.target @5.364s
                  └─systemd-update-utmp.service @5.300s +63ms
                    └─auditd.service @5.074s +223ms
                      └─systemd-tmpfiles-setup.service @4.986s +85ms
                        └─rhel-import-state.service @4.794s +191ms
                          └─local-fs.target @4.793s
                            └─boot.mount @3.798s +995ms
                              └─dev-disk-by\x2duuid-b85ebcc8\x2db3d8\x2d43c0\x2d98ed\x2d7b8842b3aabb.device @3.794s# 显示指定服务的启动流$ systemd-analyze critical-chain atd.service

4 hostnamectl

[[email protected] ~]# hostnamectl 
   Static hostname: localhost.localdomain
         Icon name: computer
           Chassis: n/a
        Machine ID: af17eb32eba246d98b89e8ecd838105f
           Boot ID: 4abee0d67b064429bcff27c145e59bc2
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-229.el7.x86_64
      Architecture: x86_64

5 localectl

[[email protected] ~]# localectlSystem Locale: LANG=en_US.UTF-8
   VC Keymap: us
  X11 Layout: us

6 timedatectl

[[email protected] ~]# timedatectl
  Local time: Sat 2016-08-06 11:01:06 EDT
  Universal time: Sat 2016-08-06 15:01:06 UTC
        RTC time: Sat 2016-08-06 15:01:06
        Timezone: America/New_York (EDT, -0400)     NTP enabled: n/aNTP synchronized: no
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  Sun 2016-03-13 01:59:59 EST
                  Sun 2016-03-13 03:00:00 EDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2016-11-06 01:59:59 EDT
                  Sun 2016-11-06 01:00:00 EST[[email protected] ~]# timedatectl set-timezone Asia/Shanghai[[email protected] ~]# timedatectl
      Local time: Sat 2016-08-06 23:02:32 CST
  Universal time: Sat 2016-08-06 15:02:32 UTC
        RTC time: Sat 2016-08-06 15:02:32
        Timezone: Asia/Shanghai (CST, +0800)     NTP enabled: n/aNTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

7 loginctl

[[email protected] ~]# loginctlSESSION        UID USER             SEAT            
     1          0 root                             
     2          0 root                             

2 sessions listed.

systemd的术语介绍

1 Unit单元

Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。

Unit类型 一共分成12种。

Service unit:系统服务

Target unit:多个 Unit 构成的一个组

Device Unit:硬件设备

Mount Unit:文件系统的挂载点

Automount Unit:自动挂载点

Path Unit:文件或路径

Scope Unit:不是由 Systemd 启动的外部进程

Slice Unit:进程组

Snapshot Unit:Systemd 快照,可以切回某个快照

Socket Unit:进程间通信的 socket

Swap Unit:swap 文件

Timer Unit:定时器

# 通过命令可以查看当前service类型的服务 
[[email protected] ~]# systemctl list-units --type=serviceUNIT                               LOAD   ACTIVE SUB     DESCRIPTION
auditd.service                     loaded active running Security Auditing Service
crond.service                      loaded active running Command Scheduler
dbus.service                       loaded active running D-Bus System Message Bus
firewalld.service                  loaded active running firewalld - dynamic firewall daemon
[email protected]                 loaded active running Getty on tty1
kdump.service                      loaded active exited  Crash recovery kernel arming
             ..................LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.32 loaded units listed. Pass --all to see loaded but inactive units, too.To show all installed unit files use ‘systemctl list-unit-files‘.
# 查看unit的状态,说明防火墙已经打开,服务开启
[[email protected] ~]# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Sat 2016-08-06 22:51:07 CST; 22min ago
 Main PID: 854 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─854 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopidAug 06 22:51:07 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
# 下面的这个命令用于判断状态,写脚本方便使用,只有三种可能unknown,inactive,active
[[email protected] ~]# systemctl is-active firewalld.service
active
# 启动和停止某个服务systemctl start/stop SERVICE
[[email protected] ~]# systemctl start firewalld.service
[[email protected] ~]# systemctl stop firewalld.service
# systemctl服务reload
[[email protected] ~]# systemctl daemon-reload

# 查看某个服务的init参数
[[email protected] ~]# systemctl show firewalld.serviceId=firewalld.serviceNames=firewalld.service
Requires=dbus.socket basic.target
Wants=system.slice
WantedBy=basic.target
Conflicts=iptables.service ip6tables.service ebtables.service shutdown.targetBefore=network.target libvirtd.service NetworkManager.service shutdown.targetAfter=dbus.socket basic.target system.slice
Description=firewalld - dynamic firewall daemon
LoadState=loaded
ActiveState=inactive
SubState=dead
FragmentPath=/usr/lib/systemd/system/firewalld.service
UnitFileState=enabled
......
CPUAccounting=noCPUShares=1024BlockIOAccounting=noBlockIOWeight=1000MemoryAccounting=noMemoryLimit=18446744073709551615DevicePolicy=autoExecMainStartTimestamp=Sat 2016-08-06 23:18:41 CST
ExecMainStartTimestampMonotonic=1669233994ExecMainExitTimestamp=Sat 2016-08-06 23:18:45 CST
ExecMainExitTimestampMonotonic=1674104830ExecMainPID=2819ExecMainCode=1ExecMainStatus=0# 查看unit之间的依赖关系
[[email protected] ~]# systemctl list-dependencies firewalld.service

unit文件的配置格式

配置systemctl最重要的就是配置文件了

# 以httpd.service为例
[[email protected] ~]# cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true[Install]
WantedBy=multi-user.target


配置文件分为三个区块,unit,service,installunit部分:
    unit通常负责unit元数据和unit间的依赖关系
    常见参数如下:
    Description:简短描述
    Documentation:文档地址
    Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
    Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
    BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行    Before:本unit再要执行的unit之前执行    After:本unit在要执行的unit之后执行
    Conflicts:有我没你
    Condition...:不满足指定条件不运行
    Assert...:不满足指定断言就失败,抛异常
    
service部分:
    只有service类型的unit才有,service通常负责描述启动时候的一些情况
    常见参数如下:    Type:定义启动时的进程行为。它有以下几种值。        Type=simple:默认值,执行ExecStart指定的命令,启动主进程        Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出        Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行        Type=dbus:当前服务通过D-Bus启动        Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行        Type=idle:若有其他任务执行完毕,当前服务才会运行
    ExecStart:启动当前服务的命令
    ExecStartPre:启动当前服务之前执行的命令
    ExecStartPost:启动当前服务之后执行的命令
    ExecReload:重启当前服务时执行的命令
    ExecStop:停止当前服务时执行的命令
    ExecStopPost:停止当其服务之后执行的命令
    RestartSec:自动重启当前服务间隔的秒数
    Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
    TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
    Environment:指定环境变量    
install部分:    install一般负责描述如何启动的问题,是否开机启动等
    常见参数如下:
    WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
    RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中    Alias:当前 Unit 可用于启动的别名
    Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
    
# 此时可以再次看下之前的httpd的配置文件
# 以httpdd.service为例
[[email protected] ~]# cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP ServerAfter=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true[Install]
WantedBy=multi-user.target

target

target相当于unit组,通过组的形式管理unit服务,和传统的sysv的init的runlevel很像

# Target 与 传统 RunLevel 的对应关系如下。Traditional runlevel      New target name     Symbolically linked to...Runlevel 0           |    runlevel0.target -> poweroff.targetRunlevel 1           |    runlevel1.target -> rescue.targetRunlevel 2           |    runlevel2.target -> multi-user.targetRunlevel 3           |    runlevel3.target -> multi-user.targetRunlevel 4           |    runlevel4.target -> multi-user.targetRunlevel 5           |    runlevel5.target -> graphical.targetRunlevel 6           |    runlevel6.target -> reboot.target
它与init进程的主要差别如下。
(1)默认的 RunLevel(在/etc/inittab文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。
(2)启动脚本的位置,以前是/etc/init.d目录,符号链接到不同的 RunLevel 目录 (比如/etc/rc3.d、/etc/rc5.d等),现在则存放在/lib/systemd/system和/etc/systemd/system目录。(3)配置文件的位置,以前init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。现在的配置文件主要存放在/lib/systemd目录,在/etc/systemd目录里面的修改可以覆盖原始设置。

journal日志

systemctl可以用journal方式,方便地查看日志

# 查看所有日志(默认情况下 ,只保存本次启动的日志)$ sudo journalctl# 查看内核日志(不显示应用日志)$ sudo journalctl -k# 查看系统本次启动的日志$ sudo journalctl -b$ sudo journalctl -b -0# 查看上一次启动的日志(需更改设置)$ sudo journalctl -b -1# 查看指定时间的日志$ sudo journalctl --since="2012-10-30 18:17:16"$ sudo journalctl --since "20 min ago"$ sudo journalctl --since yesterday$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"$ sudo journalctl --since 09:00 --until "1 hour ago"# 显示尾部的最新10行日志$ sudo journalctl -n# 显示尾部指定行数的日志$ sudo journalctl -n 20# 实时滚动显示最新日志$ sudo journalctl -f# 查看指定服务的日志$ sudo journalctl /usr/lib/systemd/systemd# 查看指定进程的日志$ sudo journalctl _PID=1# 查看某个路径的脚本的日志$ sudo journalctl /usr/bin/bash# 查看指定用户的日志$ sudo journalctl _UID=33 --since today# 查看某个 Unit 的日志$ sudo journalctl -u nginx.service$ sudo journalctl -u nginx.service --since today# 实时滚动显示某个 Unit 的最新日志$ sudo journalctl -u nginx.service -f# 合并显示多个 Unit 的日志$ journalctl -u nginx.service -u php-fpm.service --since today# 查看指定优先级(及其以上级别)的日志,共有8级# 0: emerg# 1: alert# 2: crit# 3: err# 4: warning# 5: notice# 6: info# 7: debug$ sudo journalctl -p err -b# 日志默认分页输出,--no-pager 改为正常的标准输出$ sudo journalctl --no-pager# 以 JSON 格式(单行)输出$ sudo journalctl -b -u nginx.service -o json# 以 JSON 格式(多行)输出,可读性更好$ sudo journalctl -b -u nginx.serviceqq
 -o json-pretty# 显示日志占据的硬盘空间$ sudo journalctl --disk-usage# 指定日志文件占据的最大空间$ sudo journalctl --vacuum-size=1G# 指定日志文件保存多久$ sudo journalctl --vacuum-time=1years

服务开机启动

# systemctl服务开机启动其实就是符号链接了一个unit配置文件到/etc/systemd/system的*.wants文件夹内[[email protected] ~]# systemctl enable httpd.serviceln -s ‘/usr/lib/systemd/system/httpd.service‘ ‘/etc/systemd/system/multi-user.target.wants/httpd.service‘

sysv 和 systemd

如何转服务,前提你有或者都会写两种格式的(sysv && systemd 风格的) 参考价值的两个链接

opensuse中文

csdn上的


本文出自 “启学的学习之路” 博客,请务必保留此出处http://qixue.blog.51cto.com/7213178/1906779

以上是关于Systemd的使用指南的主要内容,如果未能解决你的问题,请参考以下文章

systemd的简单使用和说明

如何在Debian上使用systemd管理系统

Ubuntu对systemd的使用

systemd 使用

systemd 服务未使用 dbus 接口启动

如何在docker centos容器中使用systemd