systemd详解.docx

上传人:b****2 文档编号:3282804 上传时间:2023-05-05 格式:DOCX 页数:13 大小:21.91KB
下载 相关 举报
systemd详解.docx_第1页
第1页 / 共13页
systemd详解.docx_第2页
第2页 / 共13页
systemd详解.docx_第3页
第3页 / 共13页
systemd详解.docx_第4页
第4页 / 共13页
systemd详解.docx_第5页
第5页 / 共13页
systemd详解.docx_第6页
第6页 / 共13页
systemd详解.docx_第7页
第7页 / 共13页
systemd详解.docx_第8页
第8页 / 共13页
systemd详解.docx_第9页
第9页 / 共13页
systemd详解.docx_第10页
第10页 / 共13页
systemd详解.docx_第11页
第11页 / 共13页
systemd详解.docx_第12页
第12页 / 共13页
systemd详解.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

systemd详解.docx

《systemd详解.docx》由会员分享,可在线阅读,更多相关《systemd详解.docx(13页珍藏版)》请在冰点文库上搜索。

systemd详解.docx

systemd详解

systemd详解

CentOS7使用systemd替换了SysV。

Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。

systemd的特性有:

▪支持并行化任务

▪同时采用socket式与D-Bus总线式激活服务;

▪按需启动守护进程(daemon);

▪利用Linux的cgroups监视进程;

▪支持快照和系统恢复;

▪维护挂载点和自动挂载点;

▪各服务间基于依赖关系进行精密控制。

systemd基本工具

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

该命令可用于查看系统状态和管理系统及服务。

详见man1systemctl。

小贴士:

▪在systemctl参数中添加-H<用户名>@<主机名>可以实现对其他机器的远程控制。

该过程使用ssh链接。

▪systemadm是systemd的官方图形前端

分析系统状态

输出激活的单元:

1.$ systemctl

以下命令等效:

1.$ systemctl list-units

输出运行失败的单元:

1.$ systemctl --failed

所有可用的单元文件存放在/usr/lib/systemd/system/和/etc/systemd/system/目录(后者优先级更高)。

查看所有已安装服务:

1.$ systemctl list-unit-files

使用单元

一个单元配置文件可以描述如下内容之一:

系统服务(.service)、挂载点(.mount)、sockets(.sockets)、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由systemd管理的计时器(.timer)。

详情参阅man5systemd.unit。

使用systemctl控制单元时,通常需要使用单元文件的全名,包括扩展名(例如sshd.service)。

但是有些单元可以在systemctl中使用简写方式。

▪如果无扩展名,systemctl默认把扩展名当作.service。

例如netcfg和netcfg.service是等价的。

▪挂载点会自动转化为相应的.mount单元。

例如/home等价于home.mount。

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

注:

有一些单元的名称包含一个@标记,(e.g.name@string.service):

这意味着它是模板单元name@.service的一个实例。

string被称作实例标识符,在systemctl调用模板单元时,会将其当作一个参数传给模板单元,模板单元会使用这个传入的参数代替模板中的%I指示符。

在实例化之前,systemd会先检查name@string.suffix文件是否存在(如果存在,应该就是直接使用这个文件,而不是模板实例化了)。

大多数情况下,包换@标记都意味着这个文件是模板。

如果一个模板单元没有实例化就调用,该调用会返回失败,因为模板单元中的%I指示符没有被替换。

立即激活单元:

1.# systemctl start <单元>

立即停止单元:

1.# systemctl stop <单元>

重启单元:

1.# systemctl restart <单元>

命令单元重新读取配置:

1.# systemctl reload <单元>

输出单元运行状态:

1.$ systemctl status <单元>

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

1.$ systemctl is-enabled <单元>

开机自动激活单元:

1.# systemctl enable <单元>

注意:

如果服务没有Install段落,一般意味着应该通过其它服务自动调用它们。

如果真的需要手动安装,可以直接连接服务,如下(将foo替换为真实的服务名):

1.# ln -s /usr/lib/systemd/system/foo.service /etc/systemd/system/graphical.target.wants/

取消开机自动激活单元:

1.# systemctl disable <单元>

显示单元的手册页(必须由单元文件提供):

1.# systemctl help <单元>

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

1.# systemctl daemon-reload

电源管理

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

如果你正登录在一个本地的systemd-logind用户会话,且当前没有其它活动的会话,那么以下命令无需root权限即可执行。

否则(例如,当前有另一个用户登录在某个tty),systemd将会自动请求输入root密码。

重启:

1.$ systemctl reboot

退出系统并停止电源:

1.$ systemctl poweroff

待机:

1.$ systemctl suspend

休眠:

1.$ systemctl hibernate

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

1.$ systemctl hybrid-sleep

编写单元文件

systemd单元文件的语法来源于XDG桌面入口配置文件.desktop文件,最初的源头则是MicrosoftWindows的.ini文件。

单元文件可以从两个地方加载,优先级从低到高分别是:

▪/usr/lib/systemd/system/:

软件包安装的单元

▪/etc/systemd/system/:

系统管理员安装的单元

注意:

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

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

小贴士:

以#开头的注释可能也能用在unit-files中,但是只能在新行中使用。

不要在systemd的参数后面使用行末注释,否则unit将会启动失败。

处理依赖关系

使用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=参数进行设置。

▪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=idle:

systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。

除此之外,其他行为和Type=simple类似。

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

修改现存单元文件

要更改由软件包提供的单元文件,先创建名为/etc/systemd/system/<单元名>.d/的目录(如/etc/systemd/system/httpd.service.d/),然后放入*.conf文件,其中可以添加或重置参数。

这里设置的参数优先级高于原来的单元文件。

例如,如果想添加一个额外的依赖,创建这么一个文件即可:

1./etc/systemd/system/.d/customdependency.conf

2.[Unit]

3.Requires=<新依赖>

4.After=<新依赖>

其它举例,

1./etc/systemd/system/unit.d/customexec.conf

2.

3.[Service]

4.ExecStartExecStart=

5.ExecStart=new command

想知道为什么修改ExecStart前必须将其置空

下面是自动重启服务的一个例子:

1./etc/systemd/system/unit.d/restart.conf

2.

3.[Service]

4.Restart=always

5.RestartSec=30

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

1.# systemctl daemon-reload

2.# systemctl restart <单元>

此外,把旧的单元文件从/usr/lib/systemd/system/复制到/etc/systemd/system/,然后进行修改,也可以达到同样效果。

在/etc/systemd/system/目录中的单元文件的优先级总是高于/usr/lib/systemd/system/目录中的同名单元文件。

注意,当/usr/lib/中的单元文件因软件包升级变更时,/etc/中自定义的单元文件不会同步更新。

此外,你还得执行systemctlreenable,手动重新启用该单元。

因此,建议使用前面一种利用*.conf的方法。

小贴士:

用systemd-delta命令来查看哪些单元文件被覆盖、哪些被修改。

系统维护的时候需要及时了解哪些单元已经有了更新

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

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

目标(target)

启动级别(runlevel)是一个旧的概念。

现在,systemd引入了一个和启动级别功能相似又不同的概念——目标(target)。

不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。

一些目标继承其他目标的服务,并启动新服务。

systemd提供了一些模仿sysvinit启动级别的目标,仍可以使用旧的telinit启动级别命令切换。

获取当前目标

不要使用runlevel命令了:

1.$ 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

急救模式(Emergencyshell)

切换启动级别/目标

systemd中,启动级别通过“目标单元”访问。

通过如下命令切换:

1.# systemctl isolate graphical.target

该命令对下次启动无影响。

等价于telinit3或telinit5。

修改默认启动级别/目标

开机启动进的目标是default.target,默认链接到graphical.target(大致相当于原来的启动级别5)。

可以通过内核参数更改默认启动级别:

小贴士:

可以省略扩展名.target。

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

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

另一个方法是修改default.target。

可以通过systemctl修改它:

1.# systemctl enable multi-user.target

命令执行情况由systemctl显示:

链接/etc/systemd/system/default.target被创建,指向新的默认启动级别。

该方法当且仅当目标配置文件中有以下内容时有效:

1.[Install]

2.Alias=default.target

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

临时文件

/usr/lib/tmpfiles.d/和/etc/tmpfiles.d/中的文件描述了systemd-tmpfiles如何创建、清理、删除临时文件和目录,这些文件和目录通常存放在/run和/tmp中。

配置文件名称为/etc/tmpfiles.d/.conf。

此处的配置能覆盖/usr/lib/tmpfiles.d/目录中的同名配置。

临时文件通常和服务文件同时提供,以生成守护进程需要的文件和目录。

例如Samba服务需要目录/run/samba存在并设置正确的权限位,就象这样:

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

2.D /run/samba 0755 root root

此外,临时文件还可以用来在开机时向特定文件写入某些内容。

比如,要禁止系统从USB设备唤醒,利用旧的/etc/rc.local可以用echoUSBE>/proc/acpi/wakeup,而现在可以这么做:

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

2.w /proc/acpi/wakeup - - - - USBE

详情参见man5tmpfiles.d。

注意:

该方法不能向/sys中的配置文件添加参数,因为systemd-tmpfiles-setup有可能在相关模块加载前运行。

这种情况下,需要首先通过modinfo<模块名>确认需要的参数,并在/etc/modprobe.d下的一个文件中设置改参数。

另外,还可以使用udev规则,在设备就绪时设置相应属性。

定时器

定时器是以.timer为后缀的配置文件,记录由system的里面由时间触发的动作,定时器可以替代cron的大部分功能。

日志

systemd提供了自己日志系统(loggingsystem),称为journal.使用systemd日志,无需额外安装日志服务(syslog)。

读取日志的命令:

1.# journalctl

默认情况下(当Storage=在文件/etc/systemd/journald.conf中被设置为auto),日志记录将被写入/var/log/journal/。

该目录是systemd软件包的一部分。

若被删除,systemd不会自动创建它,直到下次升级软件包时重建该目录。

如果该目录缺失,systemd会将日志记录写入/run/systemd/journal。

这意味着,系统重启后日志将丢失。

Tip:

如果/var/log/journal/位于btrfs文件系统,应该考虑对这个目录禁用写入时复制

过滤输出

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

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

1.# journalctl -b

不过,一般大家更关心的不是本次启动后的日志,而是上次启动时的(例如,刚刚系统崩溃了)。

可以使用-b参数:

▪journalctl-b-0显示本次启动的信息

▪journalctl-b-1显示上次启动的信息

▪journalctl-b-2显示上上次启动的信息journalctl-b-2

▪Showallmessagesfromdate(andoptionaltime):

1.# journalctl --since="2012-10-3018:

17:

16"

▪Showallmessagessince20minutesago:

1.# journalctl --since "20 min ago"

▪显示最新信息

1.# journalctl -f

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

1.# journalctl /usr/lib/systemd/systemd

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

1.# journalctl _PID=1

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

1.# journalctl -u netcfg

▪Showkernelringbuffer:

1.# journalctl -k

▪Showauth.logequivalentbyfilteringonsyslogfacility:

1.# journalctl -f -l SYSLOG_FACILITY=10

详情参阅manjournalctl、mansystemd.journal-fields,以及Lennert的这篇博文

日志大小限制

如果按上面的操作保留日志的话,默认日志最大限制为所在文件系统容量的10%,即:

如果/var/log/journal储存在50GiB的根分区中,那么日志最多存储5GiB数据。

可以修改/etc/systemd/journald.conf中的SystemMaxUse来指定该最大限制。

如限制日志最大50MiB:

1.SystemMaxUse=50M

详情参见manjournald.conf.

配合syslog使用

systemd提供了socket/run/systemd/journal/syslog,以兼容传统日志服务。

所有系统信息都会被传入。

要使传统日志服务工作,需要让服务链接该socket,而非/dev/log(官方说明)。

Arch软件仓库中的syslog-ng已经包含了需要的配置。

设置开机启动syslog-ng:

1.# systemctl enable syslog-ng

这里有一份很不错的journalctl指南。

Forwardjournaldto/dev/tty12

In/etc/systemd/journald.confenablethefollowing:

1.ForwardToConsole=yes

2.TTYPath=/dev/tty12

3.MaxLevelConsole=info

重启journald:

1.# systemctl restart systemd-journald

疑难解答

关机/重启十分缓慢

如果关机特别慢(甚至跟死机了一样),很可能是某个拒不退出的服务在作怪。

systemd会等待一段时间,然后再尝试杀死它。

请阅读这篇文章,确认你是否是该问题受害者。

短时进程无日志记录

若journalctl-ufoounit.service没有显示某个短时进程的任何输出,那么改用PID试试。

例如,若systemd-modules-load.service执行失败,那么先用systemctlstatussystemd-modules-load查询其PID(比如是123),然后检索该PID相关的日志journalctl-b_PID=123。

运行时进程的日志元数据(诸如_SYSTEMD_UNIT和_COMM)被乱序收集在/proc目录。

要修复该问题,必须修改内核,使其通过套接字连接来提供上述数据,该过程类似于SCM_CREDENTIALS。

诊断启动问题

使用如下内核参数引导:

systemd.log_level=debugsystemd.log_target=kmsglog_buf_len=1M

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

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

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

2.

3.kernel.core_pattern = core

4.kernel.core_uses_pid = 0

然后运行:

1.# /usr/lib/systemd/systemd-sysctl

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

1.$ ulimit -c unlimited

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2