systemd详解

1.Systemd


CentOS 7.0使用的systemd完全替代了init时代传统的Sys V,虽然替代但是system完全兼容Sys V 和LSB的启动脚本,能更有效的引导加载服务。



2.Systmed的新特性:

(1) 系统引导时实现服务的并行启动

(2) 按需激活进程,默认系统不启动进程,需要什么服务启动什么进程,从而节约系统资源

(3) 系统状态快照,可以恢复到过去某一时刻的状态

(4) 基于依赖关系定义服务控制逻辑



3.Systemd的核心控制单元(unit): 基于CentOS7的核心特性的systemd单元,通过配置文件进程标识和配置,文件中主要包含了系统服务,监听socket,保存的系统快照以及其他与init相关的信息

主要配置文件位置:

/etc/systemd/system/

/usr/lib/systemd/system

/run/systemd/system

Unit的类型:


Service unit:文件扩展名为: service,用于定义系统服务

  Target unit:扩展名为:target,用于模拟实现“运行级别”概念

  Device unit: 设备扩展名.device,用于定义内核识别的设备

  Mount unit:.mount,定义文件系统挂载点

  Socket unit: .socket,用于标识进程间通信的socket文件

  Snapshot unit:.snapshot,管理系统快照

  Swap unit:.swap,用于标识swap设备

  Automount unit:.automount文件系统的自动挂载点

  Path unit:.path 用于定义文件系统中的一个文件或目录


  注:

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


如果无扩展名,systemctl 默认把扩展名当作 .service。例如 netcfg 和 netcfg.service 是等价的。

挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount。

设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。


4.systemd unit的使用:(一下我们只介绍服务及.service有关的单元)

命令格式:  systemctl  COMMAND  name.service  #name为某个服务名


具体如下:(一下以httpd为例)


(1) 启动单元:

[root@localhost ~]# systemctl start  name.service

(2) 关闭单元:

[root@localhost ~]# systemctl stop name.servce

(3) 重启单元:

[root@localhost ~]# systemctl restart name.service

(4) 查看状态:

[root@localhost ~]# systemctl status name.service

(5) 重新载入:

[root@localhost ~]# systemctl reload name.service

(6) 设定开机自启动:

[root@localhost ~]# systemctl  enable name.service

(7) 取消开机自启动:

[root@localhost ~]# systemctl  disable name.service

(8) 查看某服务是否开机自启动:

[root@localhost ~]# systemctl  is-enabled name.service

(9) 查看所有服务:

[root@localhost ~]# systemctl list-units --type service --all

(10)查看所有激活的服务

[root@localhost ~]# systemctl list-units --type service

(11) 当前服务是否处于活动状态:

[root@localhost ~]# systemctl is-active name.service

(12) 

查看所有服务开机自启状态[root@localhost ~]# systemctl list-unit-files --type service#查看所有服务开机自启状态

[root@localhost ~]# systemctl start httpd.service#启动httpd服务

[root@localhost ~]# systemctl status httpd.service i#查看httpd服务状态

httpd.service - The Apache HTTP Server

   Loaded: loaded (/usr/lib/systemd/system/httpd.service

; disabled)#httpd已加载和目录,disabled:禁止开机自启动

   Active: active (running) since 六 2015-09-12 18:38:04 CST; 22s ago

 Main PID: 57126 (httpd)  # 当前正处于活动状态

   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"

   CGroup: /system.slice/httpd.service

           ├─57126 /usr/sbin/httpd -DFOREGROUND

           ├─57127 /usr/sbin/httpd -DFOREGROUND

           ├─57128 /usr/sbin/httpd -DFOREGROUND

           ├─57129 /usr/sbin/httpd -DFOREGROUND

           ├─57130 /usr/sbin/httpd -DFOREGROUND

           └─57131 /usr/sbin/httpd -DFOREGROUND


9月 12 18:38:03 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...

9月 12 18:38:04 localhost.localdomain httpd[57126]: AH00558: httpd: Could not reliabl...e

9月 12 18:38:04 localhost.localdomain systemd[1]: Started The Apache HTTP Server.

Hint: Some lines were ellipsized, use -l to show in full.


[root@localhost ~]# systemctl stop httpd.service #关闭httpd服务

[root@localhost ~]# systemctl status httpd.service 

httpd.service - The Apache HTTP Server

   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)

   Active: inactive (dead)#非活动状态,dead,为未启动服务


9月 12 18:38:03 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...

9月 12 18:38:04 localhost.localdomain httpd[57126]: AH00558: httpd: Could not reliabl...e

9月 12 18:38:04 localhost.localdomain systemd[1]: Started The Apache HTTP Server.

9月 12 19:44:22 localhost.localdomain systemd[1]: Stopping The Apache HTTP Server...

9月 12 19:44:23 localhost.localdomain systemd[1]: Stopped The Apache HTTP Server.

Hint: Some lines were ellipsized, use -l to show in full.#从启动到关闭的日志记录

[root@localhost ~]# systemctl enable httpd.service #设置开机自启动

[root@localhost ~]# systemctl status httpd.service 

httpd.service - The Apache HTTP Server

   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)#enbaled开机启动

   Active: active (running) since 六 2015-09-12 20:05:55 CST; 9min ago

 Main PID: 57551 (httpd)

   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"

   CGroup: /system.slice/httpd.service

           ├─57551 /usr/sbin/httpd -DFOREGROUND

           ├─57552 /usr/sbin/httpd -DFOREGROUND

           ├─57553 /usr/sbin/httpd -DFOREGROUND

           ├─57554 /usr/sbin/httpd -DFOREGROUND

           ├─57555 /usr/sbin/httpd -DFOREGROUND

           └─57556 /usr/sbin/httpd -DFOREGROUND


9月 12 20:05:55 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...

9月 12 20:05:55 localhost.localdomain httpd[57551]: AH00558: httpd: Could not reliabl...e

9月 12 20:05:55 localhost.localdomain systemd[1]: Started The Apache HTTP Server.

Hint: Some lines were ellipsized, use -l to show in full.




[root@localhost ~]# systemctl  restart httpd.service#重新启动httpd服务

[root@localhost ~]# systemctl is-active httpd.service #查看httpd处于active

active

[root@localhost ~]# systemctl list-units --type service#所有激活的服务,即处于active

UNIT                              LOAD   ACTIVE SUB     DESCRIPTION

abrt-ccpp.service                 loaded active exited  Install ABRT coredump hook

abrt-oops.service                 loaded active running ABRT kernel log watcher

abrt-xorg.service                 loaded active running ABRT Xorg log watcher

abrtd.service                     loaded active running ABRT Automated Bug Reporting Tool

accounts-daemon.service           loaded active running Accounts Service

alsa-state.service                loaded active running Manage Sound Card State (restore a

atd.service                       loaded active running Job spooling tools

auditd.service                    loaded active running Security Auditing Service

bluetooth.service                 loaded active running Bluetooth service

chronyd.service                   loaded active running NTP client/server

colord.service                    loaded active running Manage, Install and Generate Color

crond.service                     loaded active running Command Scheduler

cups.service                      loaded active running CUPS Printing Service

dbus.service                      loaded active running D-Bus System Message Bus

firewalld.service                 loaded active running firewalld - dynamic firewall daem



[root@localhost ~]# systemctl list-units --type service --all#所有的服务,激活与未激活的

UNIT                             LOAD   ACTIVE   SUB     DESCRIPTION

abrt-ccpp.service                loaded active   exited  Install ABRT coredump hook

abrt-oops.service                loaded active   running ABRT kernel log watcher

abrt-vmcore.service              loaded inactive dead    Harvest vmcores for ABRT

abrt-xorg.service                loaded active   running ABRT Xorg log watcher

abrtd.service                    loaded active   running ABRT Automated Bug Reporting Tool

accounts-daemon.service          loaded active   running Accounts Service

alsa-restore.service             loaded inactive dead    Restore Sound Card State

alsa-state.service               loaded active   running Manage Sound Card State (restore 

alsa-store.service               loaded inactive dead    Store Sound Card State

atd.service                      loaded active   running Job spooling tools

auditd.service                   loaded active   running Security Auditing Service

bluetooth.service                loaded active   running Bluetooth service



[root@localhost ~]# systemctl list-unit-files --type service#查看所有服务开机自启状态

UNIT FILE                                   STATE   

abrt-ccpp.service                           enabled 

abrt-oops.service                           enabled 

abrt-pstoreoops.service                     disabled

abrt-vmcore.service                         enabled 

abrt-xorg.service                           enabled 

abrtd.service                               enabled 

accounts-daemon.service                     enabled 

alsa-restore.service                        static  

alsa-state.service                          static  

alsa-store.service                          static  

anaconda-direct.service                     static  

anaconda-nm-config.service                  static  

anaconda-noshell.service                    static  

[email protected]                     static 



电源管理


电源管理

安装 polkit 后才可使用电源管理。


如果你正登录在一个本地的systemd-logind用户会话,且当前没有其它活动的会话,那么以下命令无需root权限即可执行。否则(例如,当前有另一个用户登录在某个tty),systemd 将会自动请求输入root密码。


重启:

$ systemctl reboot


退出系统并停止电源:

$ systemctl poweroff

待机:

$ systemctl suspend


休眠:

$ systemctl hibernate


混合休眠模式(同时休眠到硬盘并待机):

$ systemctl hybrid-sleep


文件系统挂载

默认行为是:在启动一个需要挂载特定分区的服务之前,系统自动检查并挂载分区。/etc/fstab 中设定的网络文件系统(如 NFS、Samba)无需配置即可正常工作,systemd 将确保网络文件系统在网络链接就绪后挂载。


详情参阅:man 5 systemd.mount。


LVM

如果装有不通过 initramfs 激活的LVM卷,则需启动 lvm-monitoring 服务(由 lvm2 软件包提供):


# systemctl enable lvm-monitoring



ACPI 电源管理

参阅 Power Management


临时文件

/usr/lib/tmpfiles.d/ 和 /etc/tmpfiles.d/ 中的文件描述了 systemd-tmpfiles 如何创建、清理、删除临时文件和目录,这些文件和目录通常存放在 /run 和 /tmp 中。配置文件名称为 /etc/tmpfiles.d/<program>.conf。此处的配置能覆盖 /usr/lib/tmpfiles.d/ 目录中的同名配置。


临时文件通常和服务文件同时提供,以生成守护进程需要的文件和目录。例如 Samba 服务需要目录 /run/samba 存在并设置正确的权限位,就象这样:


/usr/lib/tmpfiles.d/samba.conf

D /run/samba 0755 root root

此外,临时文件还可以用来在开机时向特定文件写入某些内容。比如,要禁止系统从USB设备唤醒,利用旧的 /etc/rc.local 可以用 echo USBE > /proc/acpi/wakeup,而现在可以这么做:


/etc/tmpfiles.d/disable-usb-wake.conf

w /proc/acpi/wakeup - - - - USBE

详情参见 man 5 tmpfiles.d。


注意: 该方法不能向 /sys 中的配置文件添加参数,因为 systemd-tmpfiles-setup 有可能在相关模块加载前运行。这种情况下,需要首先通过 modinfo <模块名> 确认需要的参数,并在 /etc/modprobe.d 下的一个文件中设置改参数。另外,还可以使用 udev 规则,在设备就绪时设置相应属性


自己编写 .service 文件

systemd 的单元文件是受 XDG Desktop Entry .desktop 文件启发而产生,而最初起源是 Windows 下的 .ini 文件。


处理依赖关系

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


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


启动方式

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


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认为服务就绪。

修改现存单元文件

要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。例如,如果想添加一个额外的依赖,创建这么一个文件即可:


/etc/systemd/system/<unit>.d/customdependency.conf


[Unit]

Requires=<新依赖>

After=<新依赖>

然后运行以下命令使更改生效:


# systemctl daemon-reload

# systemctl restart <单元>

此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到 /etc/systemd/system/,然后进行修改,也可以达到同样效果。在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable <unit>,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。


小贴士: 可以用 systemd-delta 命令来查看哪些单元文件被覆盖、哪些被修改。


单元配置文件的 vim 语法高亮支持

可从官方仓库安装 vim-systemd 软件包,使 unit 配置文件在 Vim 下支持语法高亮。


目标(target)

启动级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和启动级别功能相似又不同的概念――目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 启动级别的目标,仍可以使用旧的 telinit 启动级别 命令切换。

获取当前目标


不要使用 runlevel 命令了:


$ systemctl list-units --type=target

创建新目标

在 Fedora 中,启动级别 0、1、3、5、6 都被赋予特定用途,并且都对应一个 systemd 的目标。然而,没有什么很好的移植用户定义的启动级别(2、4)的方法。要实现类似功能,可以以原有的启动级别为基础,创建一个新的目标 /etc/systemd/system/<新目标>(可以参考 /usr/lib/systemd/system/graphical.target),创建 /etc/systemd/system/<新目标>.wants 目录,向其中加入额外服务的链接(指向 /usr/lib/systemd/system/ 中的单元文件)。


目标表


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 中,启动级别通过“目标单元”访问。通过如下命令切换:


# systemctl isolate graphical.target

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


修改默认启动级别/目标

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


小贴士: 可以省略扩展名 .target。


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

 systemd.unit=rescue.target (大致相当于级别1)

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


# systemctl enable multi-user.target

命令执行情况由 systemctl 显示:链接 /etc/systemd/system/default.target 被创建,指向新的默认启动级别。该方法当且仅当目标配置文件中有以下内容时有效:


[Install]

Alias=default.target

目前,multi-user.target、graphical.target 都包含这段内容。


日志

systemd提供了自己日志系统(logging system),称为 journal. 使用 systemd 日志,无需额外安装日志服务(syslog)。读取日志的命令:


# journalctl

默认情况下(当 Storage= 在文件 /etc/systemd/journald.conf 中被设置为 auto),日志记录将被写入 /var/log/journal/。该目录是 systemd 软件包的一部分。若被删除,systemd 不会自动创建它,直到下次升级软件包时重建该目录。如果该目录缺失,systemd 会将日志记录写入 /run/systemd/journal。这意味着,系统重启后日志将丢失。


过滤输出

journalctl可以根据特定字段过滤输出,例如:


显示本次启动后的所有日志:


# journalctl -b

不过,一般大家更关心的不是本次启动后的日志,而是上次启动时的(例如,刚刚系统崩溃了)。目前还没有这项功能,正在 [email protected] 讨论中。


目前的折中方案是:


# journalctl --since=today | tac | sed -n '/-- Reboot --/{n;:r;/-- Reboot --/q;p;n;b r}' | tac

以上命令输出本日内的所有启动信息。但要注意,如果日志很多,该命令执行时间会比较漫长。


动态跟踪最新信息:


# journalctl -f

显示特定程序的所有消息:


 # journalctl /usr/lib/systemd/systemd

显示特定进程的所有消息:


# journalctl _PID=1

显示指定单元的所有消息:


# journalctl -u netcfg

详情参阅man journalctl、man systemd.journal-fields


日志大小限制

如果按上面的操作保留日志的话,默认日志最大限制为所在文件系统容量的 10%,即:如果 /var/log/journal 储存在 50GiB 的根分区中,那么日志最多存储 5GiB 数据。可以修改 /etc/systemd/journald.conf 中的 SystemMaxUse 来指定该最大限制。如限制日志最大 50MiB:


SystemMaxUse=50M

详情参见 man journald.conf.


配合syslog使用

systemd提供了 socket /run/systemd/journal/syslog,以兼容传统日志服务。所有系统信息都会被传入。要使传统日志服务工作,需要让服务链接该 socket,而非 /dev/log(官方说明)。Arch 软件仓库中的 syslog-ng 已经包含了需要的配置。


设置开机启动 syslog-ng:


 # systemctl enable syslog-ng

疑难解答

关机/重启十分缓慢

如果关机特别慢(甚至跟死机了一样),很可能是某个拒不退出的服务在作怪。systemd 会等待一段时间,然后再尝试杀死它。请阅读这篇文章,确认你是否是该问题受害者。


短时进程无日志记录

若 journalctl -u foounit.service 没有显示某个短时进程的任何输出,那么改用 PID 试试。例如,若 systemd-modules-load.service 执行失败,那么先用 systemctl status systemd-modules-load 查询其 PID(比如是123),然后检索该 PID 相关的日志 journalctl -b _PID=123。运行时进程的日志元数据(诸如 _SYSTEMD_UNIT 和 _COMM)被乱序收集在 /proc 目录。要修复该问题,必须修改内核,使其通过套接字连接来提供上述数据,该过程类似于 SCM_CREDENTIALS。


诊断启动问题

使用如下内核参数引导: systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M


禁止在程序崩溃时转储内存

要使用老的内核转储,创建下面文件:


/etc/sysctl.d/49-coredump.conf


kernel.core_pattern = core

kernel.core_uses_pid = 0

然后运行:


# /usr/lib/systemd/systemd-sysctl

同样可能需要执行“unlimit”设置文件大小:


$ ulimit -c unlimited

Sun Jul 20 23:00:16 CST 2014

关于版权



《Linux运维笔记》的博文均基于创作共享的知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议发布。转载本站博文时请务必以超链接形式标明源文出处,否则谢绝一切转载!


转载请保留固定链接: https://blog.linuxeye.com/400.html










你可能感兴趣的:(linux,centos,7, ,Systemd)