【编者的话】本文主要介绍了systemd,systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。文中涉及了一些systemd的基础知识及作者的一些观点。
Ubuntu 16.04把systemd作为Linux启动系统,所以,我意识到是时候学习一下systemd了(虽然有点晚)。systemd出现于大约6年前,并且在几年前就被众多Linux发行版所使用。除了Gentoo,Ubuntu是最后一个默认使用systemd的大的发行版。甚至Ubuntu 15在去年时就转为使用systemd。
Linux社区中关于systemd的讨论已经持续了很长时间了,如果我还年轻,我可能会热衷甚至会参与讨论,但是现在我并不关心那些讨论,我只是想使用大家已达成共识的技术。令人失望的是论战主导着对话,反而想学习systemd是什么变得困难,下面是我为理解systemd所作出的努力。
免责声明:我并非专家,在一些地方难免犯错。我重申,写这篇博客仅仅是为了作为自己的笔记,欢迎评论,但请不要浪费我的时间讨论一些偏激的意见。
由于我自己没有使用装有systemd的系统,关于在实践中使用systemd的链接只搜集了上面那些,所以说,我也有点out了。 unit file 看起来是非常有用的,它对systemd如何启动服务进行配置。systemd也可以使用旧的SysVInit风格的脚本来启动服务,包括解析LSB头部。
systemd是 初始化系统 ,是Linux系统的第一个用户进程,其进程号为1。内核准备就绪后就会运行systemd,systemd的任务是运行其他用户进程从而组成Unix系统,挂载文件系统,配置网络,启动守护进程等。
我们所熟知的init系统是SysVInit, /etc/rc.d
目录中的shell脚本。在当今多核、动态设备的时代,SysVInit逐渐淡出历史舞台, Upstart 是另外一个Linux初始化系统,Ubuntu已经使用了很长时间,但是大家好像都不太喜欢Upstart。 Launchd 是MacOS下的初始化系统,其性能和速度还是可圈可点的,systemd的作者明确表示是受到了Launchd的启发。
systemd是init系统思想的重写版本,其主要的设计目标是提高性能。过去Unix系统启动时间高达90s,使用systemd(或者MacOS下的Launchd)基本可以达到10s,甚至小于1s也是有可能的。systemd可以运行的更快,是因为它可以并发执行任务。此外,它避免了解释shell脚本的所有开销。据测,之于之前的系统,systemd是现代化的、全新的、更好的,虽然我无法评估这一点,但我相信应该如此。
systemd是仅支持Linux的,它采用了一堆非POSIX API来执行任务比如与设备协作,配置安全功能等。
我还没有上手systemd,所以还没接触到其他方面。但是我的理解是,整个Unix配置都合并到unit file中,用来引导systemd配置和启动用户空间程序。
我还有所顾忌,要不要升级Ubuntu 14 到Ubuntu 16,因为必须要升级所有旧东西。升级后会正常工作吗?特别提醒,我将Ubuntu 12升级到Ubuntu 14,然后手动安装了一些东西,导致以太网设备的名称发生了改变,使得机器无法在网络下重启。
我真的不关心关于争论的历史。systemd是既成事实,但是去关注一下这些争论,对于更好地理解systemd也是有帮助的。
对于systemd,大家普遍在抱怨的是其复杂性。在一个聚集了60多个相互关联的二进制文件里,systemd做了很多事情,而不仅仅是复制子进程。systemd将udev置于内部来管理设备,它有自己的日志系统(以二进制格式存放),等同于一个定时任务、inetd、atd、虚拟终端、一个登陆进程、监控系统等,当你看到所有被取代的过时的Unix软件时,你会感到惊讶,我也理解了为什么信奉“众多小工具”哲学的人为什么不喜欢systemd了。
另外,在sysvinit中,旧的组件组合在一起非常糟糕。shell需要挂载设备、文件系统,然后启动网络,以便你能够访问其他文件系统,以正确的顺序启动其他守护进程等等。当然udev和挂载可能是单独的软件,但是它们只能以一个特定的关系运行。这么一套包含众多相互依赖组件的复杂系统成本很高,有点像说了一个“众多小工具”的谎话。也有必须要说一下统一init、 cron、inet、登录以及类似的模块,这些都是响应事件的启动程序,为什么不共享代码呢?
作为一个庞大的项目,虽然systemd只有一种思想,仍然会有文化关怀。有些选择让我觉得很奇怪,比如二进制日志格式。无论出于何种原因,大多数Linux发行版都同意使用systemd,我相信他们都会根据自己的需要去塑造systemd,这看起来是一种打造软件的合理方法。
原文链接: Things I learned about systemd (翻译: 李加庆 )