文档章节

Linux服务管理之systemd简介

柳哥
 柳哥
发布于 2015/05/09 15:53
字数 1694
阅读 169
收藏 2

近年来,Linux系统的init进程经历了两次重大的演进,传统的sysinit已经逐渐淡出历史舞台,新的upstartsystemd各有特点,越来越多的Linux发行版采纳了systemd。RHEL 7.0也开始使用systemd

systemd是Linux系统中最新的初始化系统(init),它的主要设计目标是克服sysinit固有的缺点,提高系统的启动速度。systemd和Ubuntu的upstart是竞争对手,预计会取代upstart,已经有消息称ubuntu也将采用systemd作为其标准的系统初始化系统。

systemd提供了比upstart更激进的并行启动能力,采用了socket/D-Bus activation等技术启动服务。一个显而易见的结果就是,具有更快的启动速度。为了减少系统的启动时间,systemd的目标是:

  • 尽可能启动更少的进程。

  • 尽可能并行启动更多的进程。

systemd提供了按需启动能力

当sysvinit系统初始化时,它会将所有可能用到的后台服务进程全部启动运行,并且系统必须等待所有的服务都启动就绪后,才允许用户登录。这种做法有两个缺点:首先是启动时间过长;其次是浪费了系统资源。某些服务很可能在很长一段时间内,甚至整个服务器运行期间都没有被使用过。花费在启动这些服务上的时间是不必要的;同样,花费在这些服务上的系统资源也是浪费的。systemd可以提供按需启动能力,只有在某个服务被真正请求时才启动它。当该服务结束后,systemd可以关闭它,等待下次需要时再次启动它。

systemd采用Linux的Cgroup特性跟踪和管理进程的生命周期

init系统的一个重要职责就是负责跟踪和管理服务进程的生命周期,它不仅可以启动一个服务,而且也必须能够停止服务。这看上去没什么特别的,然而在真正用代码实现时,你或许会发现停止服务比一开始想的要困难。

服务进程一般都会作为守护进程(daemon)在后台运行,为此服务程序有时候会派生(fork)两次。在upstart中,需要在配置文件中正确地配置expect,这样upstart通过对fork系统调用进行计数,从而获知真正的守护进程的PID号。为了处理这类问题,upstart通过strace来跟踪fork,exit等系统调用,但是这种方法很笨拙,且缺乏可扩展性。systemd则利用了Linux内核特性即Cgroup来完成跟踪任务。当停止服务时,通过查询Cgroup,systemd可以确保找到所有的相关进程,从而干净地停止服务。

Cgroup已经出现了很久,它主要用来实现系统资源配额管理。当进程创建子进程时,子进程会继承父进程的Cgroup。因此无论服务如何启动新的子进程,所有的这些相关进程都会属于同一个Cgroup,systemd只需要简单地遍历指定的Cgroup,即可正确地找到所有的相关进程,将它们一一停止。

启动挂载点和自动挂载管理

在传统的Linux系统中,用户可以用/etc/fstab文件来维护固定的文件系统挂载点。这些挂载点在系统启动过程中被自动挂载,一旦启动过程结束,这些挂载点就会确保存在。这些挂载点都 是对系统运行至关重要的文件系统,比如目录。和sysvinit一样,systemd管理这些挂载点,以便能够在系统启动时自动挂载它们。systemd还兼容/etc/fstab文件,你可以继续使用该文件管理挂载点。

有时候用户还需要动态挂载点,比如打算访问光盘时,才临时执行挂载以便访问其中的内容,而不访问光盘时该挂载点被取消(umount),以便节约资源。传统的,人们依赖autofs服务来实现这种功能。

systemd内建了自动挂载服务,无须另外安装autofs服务,可以直接使用systemd提供的自动挂载管理能力来实现autofs的功能。

实现事务性依赖关系管理

系统启动过程是由很多独立工作共同组成的,这些工作之间可能存在依赖关系,比如挂载一个NFS文件系统必须依赖网络能够正常工作。systemd虽然能够最大限度地并发执行很多有依赖关系的工作,但是类似于“挂载NFS”和“启动网络”这样的工作还是存在天生的先后依赖关系,无法并发执行。对于这些任务,systemd维护一个“事务一致性”的概念,保证所有相关的服务都可以正常启动而不会出现互相依赖,以至于死锁的情况

能够对系统进行快照和恢复

systemd支持按需启动,因此系统的运行状态是动态变化的,人们无法准确地知道系统当前运行了哪些服务。systemd快照提供了一种将当前系统运行状态保存并恢复的能力

比如系统当前正运行服务A和B,可以用systemd命令行对当前系统运行状况创建快照,然后将进程A停止,或者做其他的对系统的任意改变,比如启动新的进程C。在这些改变之后,运行systemd的快照恢复命令,就可立即将系统恢复到快照时刻的状态,即只有服务A,B在运行。一个可能的应用场景是调试,假设服务器出现一些异常,为了调试用户将当前状态保存为快照,然后可以进行任意操作,比如停止服务等,等调试结束后,恢复快照即可。注意:这个快照功能目前在systemd中并不完善

日志服务

systemd自带了日志服务journald,该日志服务的设计初衷是克服现有的syslog服务的缺点。比如:

  • syslog不安全,消息的内容无法验证。

  • 数据没有严格的格式,非常随意。

systemd journald用二进制格式保存所有的日志信息,用户使用journalctl命令来查看日志信息,无须自己编写复杂,脆弱的字符串分析处理程序。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 207
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
RHEL/CentOS 7的几点新改变

一、CentOS的Services使用了systemd来代替sysvinit管理 1、systemd的服务管理程序: systemctl是主要的工具,它融合之前service和chkconfig的功能于一体。可以使用它永久性或只在当前会话中启...

liuzhuqing
2018/06/29
0
0
Systemd这个有争议的项目正在接管你身边的Linux发行版

Systemd 是目前为止在Linux平台上最有争议的项目之一。它到底有多大的争议?它的争议大到systemd的开发者之一Lennart Poettering 声称有人使用比特币雇佣职业杀手要干掉他。但是还是有比较理...

mac_zhao
2015/06/23
0
0
使用systemctl命令启动和关闭mysql

以前都用service命令管理mysql,现在liunx系统升级了,又有了新的更好的方法管理系统进程,现在我们来学习如何用systemctl命令管理mysql。 Systemctl是一个systemd工具,主要负责控制systemd...

zped
2018/08/08
0
0
使用 systemd 发布 Node.js 应用

2013年1月16日,我在“比利时node.js用户组” 讲过一个“用systemd部署Node.js”的话题。 下面是我所用幻灯片的注解版: 如果你更喜欢PDF(没有笔记),可以在此下载。 简介 这次演讲的主题是...

oschina
2013/01/22
1K
2
如何使用 chkconfig 和 systemctl 命令启用或禁用 Linux 服务

对于 Linux 管理员来说这是一个重要(美妙)的话题,所以每个人都必须知道,并练习怎样才能更高效的使用它们。 在 Linux 中,无论何时当你安装任何带有服务和守护进程的包,系统默认会把这些...

作者: Prakash Subramanian
2018/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java单例模式学习记录

在项目开发中经常能遇见的设计模式就是单例模式了,而实现的方式最常见的有两种:饿汉和饱汉(懒汉)。由于日常接触较多而研究的不够深入,导致面试的时候被询问到后有点没底,这里记录一下学习...

JerryLin123
昨天
3
0
VSCODE 无法调试

VSCODE 无法调试 可以运行 可能的原因: GCC 的参数忘了加 -g

shzwork
昨天
4
0
理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器。 坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂。耐心看完...

Tiny熊
昨天
4
0
5.线程实现

用于线程实现的Python模块 Python线程有时称为轻量级进程,因为线程比进程占用的内存少得多。 线程允许一次执行多个任务。 在Python中,以下两个模块在一个程序中实现线程 - _thread 模块 th...

Eappo_Geng
昨天
6
0
ServiceLoader

创建一个接口文件在resources资源目录下创建META-INF/services文件夹在services文件夹中创建文件,以接口全名命名创建接口实现类 内容me.zzp.ar.d.PostgreSQLDialectme.zzp.ar.d.Hype...

Cobbage
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部