文档章节

systemd入门和使用

水海云
 水海云
发布于 2017/09/09 11:13
字数 2531
阅读 26
收藏 1
点赞 0
评论 0

给 systemd 传达命令的主要工具是systemctl,它是一个命令行程序。该工具在改变配置文件或重新启动后台程序时需要 root 权限,但即使是非 root用户也能下达一些诊断的命令。 如果你在启动该命令时不加任何参数,你会看到一个系统启动时执行任务的“单位(unit)”列表,包括挂载及检测磁盘、启动后台服务及配置硬件。

服务

服务(service)单位是最重要的一类单位之一,因为它们管理着后台服务。挂载(mount)与自动挂载(automount)单位用来挂载文件系统。套接字(socket)单位用来创建套接字,并在访问套接字后,立即利用依赖关系间接地启动另一单位。你可以使用参数让 systemctl 只列出某个类型的单位,如所有的服务单位:

systemctl --type=service

systemd 自动将其输出结果递交给 less显示;你不仅可以使用箭头键来上下滚动,也可以向右滚动,因为有时更多的信息会偶尔“藏”到那里。

  • 第一栏是单位的名字
  • 第二栏则表示该单位的定义是否已由 systemd 正确加载。
  • 第三栏则告诉我们该单位是否正在运行。如果你使用了 -a 参数,那么该程序将仅显示非正在运行的单位,即已安装但并未在启动时使用的单位,同时也包含引导系统未能正常加载的单位文件(原因很可能为该单位文件出现错误)。
  • 第四栏则给出了当前状态:“exited”表示该进程已经无任何错误地完成,这种情况适用于一诸如进程在启动后并不在后台继续运行的情况,例如,在系统启动时由于考虑到兼容性因素执行在 sysvinit 里面常用的 /etc/rc.d/rc.local 文件的服务单位。“Running”表示正在后台运行的服务,如 cron、dbus、sshd 和 udev。不能启动或启动后崩溃的服务在第四栏中用红色标为“failed”(如果终端可以显示彩色)。
  • 第五栏是对该单位的描述。标有“LSB”或“SYSV”的单位已由 systemd 自动创建以管理传统启动脚本。

你可以如下命令来察看该服务是何时崩溃的以及在服务程序结束后提供了什么错误代码:

systemctl status ntpd.service

如果你想要通过挂起 NTPD 服务单位来让系统在启动时不通过 NTP 来同步系统时间,你可以使用下面的方式:

systemctl disable ntpd.service

在这里,systemctl 仅仅是移除了到 Wants 目录下面的服务单位的链接;同理,可用 systemctl enable 命令来创建一个链接以激活一项服务。也可以不使用 systemctl 而以手动创建(移除)链接的方式激活(挂起)单位。

服务的激活与挂起在该服务下一次启动或系统关闭后生效;下面的命令用来立即启动一项服务:

systemctl start ntpd.service

对于使用 sysvinit 的发行版,与之对应的命令是 service ntpd start。在 systemctl 命令之后使用 stop 参数来代替 start 则为停止一项服务。

通过由 systemctl 创建的控制组可以很容易地找出是哪项服务启动了哪些进程。system-cgls 可显示由 systemd 创建的 cgroup 层次(hierarchy)。

单位

创建单位用的系统配置文件位于 /lib/systemd/system/,但 /etc/systemd/system 目录下的同名文件会优先于前者。单位文件的定义通常比传统的 sysvinit 脚本要短得多。例如,用于通过 NTP 来同步网络时间的服务只有短短几行:

[Unit]
Description=Network Time Service
[Service]
ExecStart=/usr/bin/ntpd -g
[Install]
WantedBy=multi-user.target
  • 所有的单位文件都包含由[Unit]开头的一节,其中包含一般设置与简短介绍。
  • [Service]一节含有针对该服务要进行的任务的指定设置——对于 NTP 来说,仅需要启动该服务的命令行。如果需要用一个指定的命令来终止程序,你可以用 ExecStop= 来进行设置。这一步对于 NTP 守护进程是不需要的,因为根据 Unix 传统,它可以用一个简单的“SIGTERM”信号来结束。如果没有指定其他命令,这个命令会告诉 systemd 结束任务。
  • [Install]一节包含了 systemd 在(反)安装时要解释的说明;这里的 NTP 一例中,其内容意为在“多用户”目标激活时应当同步时间。

目标

“目标”单位的概念与 sysvinit 的运行级别相似;实际上,为考虑兼容性,systemd 甚至能够识别与目标对应的运行级别名称。所以你可以在引导装载程序中的 kernel 一行中加入 single 这个参数;systemd 就会激活rescue.target,提供一个相当于单用户模式的最小化界面。 在 systemd 中,多用户模式(即不使用图形化登陆界面就完全启动系统的模式)由 multi-user.target 表示,可以通过下面这个链接来将其设为默认启动目标:

ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

如果此后你确实需要默认启动图形化登陆界面,可用同样的方式来将 graphical.target 设为默认目标。这等同于传统初始化工具的运行级别 5。你也可以在引导装载程序中为 kernel 指定想要启动的目标单位:

systemd.unit=multi-user.target

如果想要在操作过程中激活一个不同的目标单位,你可以使用 systemctl 的 isolate 命令(需要 root 权限):

systemctl isolate rescue.target

切换为 rescue 目标对于管理任务来说很有用,systemd 这时会停止所有的用户登陆与后台服务,只有系统服务在运行,如监视逻辑卷的服务(lvm2-monitor)。有时甚至这些服务也需要停止并重新安装,这时你可以使用 emergency.target 来进入紧急模式(emergency mode),这时只有命令提示符的进程以及内核线程在运行。

依赖

systemctl show 命令提供了一些关于正在运行的单位和它们正在执行的任务的内部信息,以及关于 systemd 依赖于哪些单位来启用多用户模式的信息。

systemctl show -pWants multi-user.target

其他的目标也可能显示在输出中,如 multi-user.target 依赖于 basic.target。而后者又依赖于 sysinit.target,sysinit.target 依赖于 local-fs.target。这三个目标用于管理系统的基本配置,包括挂载文件系统和启动 udev。为指定对于基本目标(basic target)的依赖,单位配置文件 multi-user.target 包含了如下语句:

Requires=basic.target
After=basic.target

在使用 Requires 的同时指定 After 一行,systemd 就会知道它必须不仅启用该目标,而且需等待该目标完全启动后再继续进行其他任务。

Wants 是 Requires 的稍弱形式的替代语句,systemd 也会启用这些单位,但即使这些单位不能启动也会继续启动系统。这一类依赖也可以通过链接到单位文件来指定,单位文件位于含有该单位的路径、名称和一个 .wants的目录下。你可以使用 ls 或 systemctl 的 show 命令:

ls /*/systemd/system/multi-user.target.wants/
systemctl show -pWants multi-user.target

优化

启动故障

如果在启动时出现可能与 systemd 直接或间接相关的问题,请用以下参数启动 kernel:

systemd.log_target=kmsg systemd.log_level=debug

systemd 会识别这些参数并在终端提供全面的故障排除信息。同时,该信息也会保存在由 dmesg 创建的内核通知缓冲存储区(kernel notification buffer)以备过后分析。

命令行程序 poweroff、halt 及 reboot 是 systemd 的一部分,但也可以使用 systemctl 的命令关闭或重新启动系统。也可以这样重启系统:

systemctl kexec

在所有服务被终止后,systemd 告诉正在运行的内核直接启动一个预先配置好的 Linux 内核,这会让系统快速重新启动,因为它会直接跳过BIOS和引导装载程序,如果没有一个配置好的 kexec 内核,systemd 则会执行正常的重新启动过程。

自动挂载

对于其中的挂载任务,systemd 有一个自动挂载功能,可以为 /etc/fstab 中配置的挂载点创建虚拟挂载点(phseudo mount point)。虚拟挂载点直到存取时才真正挂载。在 /etc/fstab 中加入 comment=systemd.automount 一行可把任一挂载点变为自动挂载点。这样可以加快启动过程。这对于读取网络共享很有用,因为 WLAN 连接直到用户使用 NetworkManager 时才被建立。

停止服务

systemctl 可以用来在不知道一服务的 PID 时告诉 systemd 去发出信号。比如,下面的命令会让 rsyslogd 进入调试模式(debug mode),当你再次输入这个命令时,该服务会停止:

systemctl kill--signal=USR1 rsyslogd.service

如果你不指定发送哪一个信号,systemctl 会发送一个标准终止信号,会终止属于一服务的所有进程。

启动时间

systemd-analyze 命令会告诉你系统启动所用时间及其中有多少时间是用在内核、initramfs及由 systemd 控制的用户级配置上。 如果你想更深入地查看后一因素,可使用 systemd-analyze blame 来获知各个单位的启动时间。如需知道关于启动过程的更为详细的信息,该程序可创建一个用图表展示单位启动的 SVG 文件:

systemd-analyze plot<plot.svg

这可以用来寻找过分拖长启动时间的单位。

© 著作权归作者所有

共有 人打赏支持
水海云
粉丝 50
博文 119
码字总数 99980
作品 0
深圳
程序员
宋宝华:用systemd-nspawn运行最轻量级容器

systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu 16.04,x86_64机器。本文的目的是:在Ubuntu中用systemd-nspawn启动一个容器,运行Debian操作系统...

jus3ve ⋅ 2017/12/08 ⋅ 0

systemd使用详解

systemd是干什么的不多解释 具体可以自己去百度一下 不过介绍相关使用方法的基本上没有,所以这里算抛砖引玉吧 遗漏和不懂之处颇多,因为能查到的资料有限--不过对于初期使用已经绰绰有余。 ...

KlausZL ⋅ 2014/04/18 ⋅ 0

Systemd入门教程:命令篇

systemd的特性有: 支持并行化任务 同时采用socket式与D-Bus总线式激活服务; 按需启动守护进程(daemon); 利用Linux的cgroups监视进程; 支持快照和系统恢复; 维护挂载点和自动挂载点; ...

linuxprobe ⋅ 2016/06/11 ⋅ 0

Systemd 入门教程:命令篇

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。 本文介绍它的基本用法,分为上下两篇。今天介绍它的主要命令,下一篇介绍如何用于实战。 一、由来 历史上,L...

阮一峰 ⋅ 2016/03/07 ⋅ 0

Systemd 入门教程:命令篇

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。 本文介绍它的基本用法,分为上下两篇。今天介绍它的主要命令,下一篇介绍如何用于实战。 一、由来 历史上,L...

snowing1990 ⋅ 2016/03/15 ⋅ 0

编写有趣且有价值的 Systemd 服务

让我们假设你希望搭建一个游戏服务器,运行 Minetest 这款非常酷、开源的,以采集 & 合成为主题的沙盒游戏。你希望将游戏运行在位于客厅的服务器中,以便搭建完成后可供你的学校或朋友使用。...

24% ⋅ 05/31 ⋅ 0

Systemd 入门教程:实战篇

上一篇文章,介绍了 Systemd 的主要命令,这篇文章主要介绍如何使用 Systemd 来管理我们的服务,以及各项的含义; 一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/...

linuxprobe ⋅ 2016/06/27 ⋅ 0

Linux 守护进程原理及实例(Redis、Nginx)

1. 什么是守护进程 守护进程,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束。可以使用命令查看系统的守护进程,输出如下所示: Linux系统中常见的守护进程有:...

yangbodong22011 ⋅ 2017/11/28 ⋅ 0

Systemd 入门教程:实战篇

上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务。 一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在目录添加一个配置文件。 如果你想让该...

阮一峰 ⋅ 2016/03/08 ⋅ 0

systemd 使用教程【转】

转载自阮一峰的博客: http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html 国庆在家随意翻了......

lirulei90 ⋅ 2017/10/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud构建微服务架构服务注册与发现

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、...

明理萝 ⋅ 29分钟前 ⋅ 0

占位slot

一、为什么我们需要slot 假如我们有个需要,子组件中需要显示一段html内容,显示什么不是由子组件决定,而是由父组件传递什么决定,我们该怎么做 很挫的做法,我们使用组件间的数据传递 父组...

金于虎 ⋅ 29分钟前 ⋅ 0

Linux集群 NTP 时间同步

基于CentOS 7 规划 比如有2台机器 IP 主机名 说明 192.168.103.51 cdh51 本地NTP服务端 192.168.103.52 cdh52 本地NTP客户端 安装NTP服务 每台机器都安装ntp yum -y install ntp NTP服务端(...

囚兔 ⋅ 31分钟前 ⋅ 0

国际版链克口袋 获取方法

1 月16日,网心科技玩客云团队在官网发布了停止链克口袋转帐服务的通知。通知中表示迅雷将于1月25日在AppStore和官网,正式发布链克口袋新版本,新版本不支持迅雷及迅雷合作伙伴开发的应用场...

xiaogg ⋅ 33分钟前 ⋅ 0

Raft中Batching和pipelining到底是什么?

Raft supports batching and pipelining of log entries, and both are important for best performance. Many of the costs of request processing are amortized when multiple requests a......

黑客画家 ⋅ 33分钟前 ⋅ 0

Mybatis-Plus 之BaseMapper 方法详解

/** * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能 * 这个 Mapper 支持 id 泛型 * @author hubin * @Date 2016-01-23 */public interface BaseMapper<T> ...

干干 ⋅ 34分钟前 ⋅ 0

JVM笔记9-Class类文件结构

摘要: 1.Class类文件结构   Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这使得整个 Class 文件中...

传授知识的天使 ⋅ 38分钟前 ⋅ 0

MySQL数据库之sleep线程过长如何处理?

  什么是sleep线程?   sleep线程长时间保持可客户端与服务端的连接状态   导致sleep过多的原因:   使用太多持久连接(高并发系统中 不适合使用持久连接)   程序中 没有及时关闭MyS...

老男孩Linux培训 ⋅ 38分钟前 ⋅ 0

转发和重定向的区别

转发在服务器端完成的;重定向是在客户端完成的 转发的速度快;重定向速度慢 转发的是同一次请求;重定向是两次不同请求 转发不会执行转发后的代码;重定向会执行重定向之后的代码 转发地址栏...

冯莉莉莉莉 ⋅ 39分钟前 ⋅ 0

go语言实现http proxy的关键一步

go语言自带包ReverseProxy 实现了proxy的功能。 但我希望proxy进程能够在代理的同时,完整的把请求和请求体记录在日志里。 仅使用ReverseProxy 包的话,uri记录没问题,但body只能被读取一次...

xuanzilie ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部