如何系统的学会编程
systemd是的,即使在句子开头也都是小写,是现代替换init和SystemV init脚本的方法。 它也更多。
像大多数系统管理员一样,当我想到init程序和SystemV时,我想到的是Linux的启动和关闭,而没有太多其他事情,例如在服务启动和运行后对其进行管理。 像init一样,systemd是所有进程的源泉,它负责使Linux主机达到可以完成生产性工作的状态。 systemd假定的某些功能要比旧的init程序要广泛得多,它可以管理运行中的Linux主机的许多方面,包括安装文件系统,管理硬件,处理计时器以及启动和管理所需的系统服务。拥有高效的Linux主机。
本系列文章部分基于我的三卷Linux培训课程“ 使用和管理Linux:零到sysadmin”的摘录,探讨了systemd在启动时和启动完成后的功能。
Linux启动
前作完整的过程,需要一台Linux主机从关闭状态到运行状态是复杂的,但它是开放的和可知。 在详细介绍之前,我将简要介绍一下从打开主机硬件到系统准备好用户登录为止。在大多数情况下,“启动过程”是作为一个单独的实体进行讨论的,但这是不准确的。 实际上,完整的启动和启动过程包含三个主要部分:
- 硬件引导:初始化系统硬件
- Linux引导:加载Linux内核,然后系统化
- Linux启动: systemd为主机做好生产准备的地方
Linux启动序列在内核加载init或systemd之后开始,这取决于发行版分别使用旧启动还是新启动。 init和systemd程序启动和管理所有其他进程,并且在各自的系统上都被称为“所有进程之母”。
重要的是将硬件引导与Linux引导与Linux引导分开,并明确定义它们之间的分界点。 了解这些差异以及使Linux系统达到可以生产的状态所起的作用,可以管理这些进程并更好地确定大多数人称为“引导”的问题出在哪里。
启动过程遵循三步引导过程,使Linux计算机进入可用于生产性工作的操作状态。 当内核将主机的控制权转移到systemd时,启动过程开始。
系统性争议
systemd可以引起sysadmin以及负责保持Linux系统正常运行的其他人员的广泛React。 systemd在许多Linux系统中接管了许多任务,这一事实在某些开发人员和sysadmins组之间引起了压抑和矛盾。
SystemV和systemd是执行Linux启动序列的两种不同方法。 SystemV启动脚本和init程序是旧方法,而使用target的systemd是新方法。 尽管大多数现代Linux发行版都使用较新的systemd进行启动,关闭和过程管理,但仍有一些不是。 原因之一是某些发行版维护者和一些系统管理员喜欢较旧的SystemV方法,而不是较新的systemd方法。
我认为两者都有优势。
为什么我更喜欢SystemV
我更喜欢SystemV,因为它更开放。 使用Bash脚本完成启动。 内核启动init程序(已编译的二进制文件)之后,init启动rc.sysinit脚本,该脚本执行许多系统初始化任务。 rc.sysinit完成后,init启动/etc/rc.d/rc脚本,该脚本又启动由/etc/rc.d/rcX.d中的SystemV启动脚本定义的各种服务,其中“ X”为正在启动的运行级别的编号。
由Red Hat的Lennart Poettering和Kay Sievers开发的systemd是一个复杂的系统,包含大型,已编译的二进制可执行文件,如果不访问源代码就无法理解。 它是开源的,因此“访问源代码”并不难,只是不太方便。 systemd似乎代表了对Linux哲学多个原则的重大驳斥。 作为二进制文件,systemd不会直接打开供sysadmin查看或进行简单更改。 systemd尝试做所有事情,例如管理正在运行的服务,同时提供比SystemV显着更多的状态信息。 它还管理硬件,进程,进程组,文件系统挂载等。 systemd几乎存在于现代Linux主机的各个方面,使其成为系统管理的一站式工具。 所有这些都明显违反了原则,即程序应该小,每个程序都应该做一件事并且做好。
为什么我更喜欢systemd
我更喜欢使用systemd作为启动机制,因为它取决于启动过程的当前阶段,以并行方式启动尽可能多的服务。 这样可以加快整体启动速度,并使主机系统比SystemV更快地进入登录屏幕。
systemd管理着运行中的Linux系统的几乎所有方面。 它可以管理正在运行的服务,同时提供比SystemV多得多的状态信息。 它还管理硬件,进程和进程组,文件系统挂载等。 systemd几乎存在于现代Linux操作系统的各个方面,使其成为系统管理的一站式工具。 (听起来熟悉吗?)
systemd工具是已编译的二进制文件,但由于所有配置文件均为ASCII文本文件,因此工具套件已打开。 可以通过各种GUI和命令行工具以及添加或修改各种配置文件来适应特定本地计算环境的需求来修改启动配置。
真正的问题
您认为我不喜欢两个启动系统吗? 我愿意,我可以和任何一个一起工作。
我认为,SystemV和systemd之间大多数争议的真正问题和根本原因在于,在sysadmin级别上别无选择 。 各种发行版的开发人员,维护人员和打包人员已经选择了使用SystemV还是systemd,但这是有充分理由的。 挖出并替换一个初始化系统,由于其极端的侵入性,会带来很多后果,这些后果很难在发行版设计过程之外解决。
尽管实际上是我自己做出了选择,但我的Linux主机仍可以启动并正常工作,这是我通常最关心的问题。 作为最终用户,甚至是系统管理员,我最关心的是我是否可以完成工作,写书和本文,安装更新以及编写脚本来自动完成所有工作。 只要我能做好工作,我就不会真正在意发行版中使用的开始顺序。
在启动或服务管理期间出现问题时,我会在意。 无论主机上使用哪种启动系统,我都足够了解事件顺序来查找故障并进行修复。
更换SystemV
以前曾尝试用更现代的东西替代SystemV。 在大约两个版本中,Fedora使用了一个叫做Upstart的东西来替换老化的SystemV,但是它没有替换init并且没有提供我注意到的更改。 由于Upstart没有对围绕SystemV的问题进行任何重大更改,因此朝这个方向的努力很快就被Systemd放弃了。
尽管大多数Linux开发人员都同意替换旧的SystemV启动是个好主意,但许多开发人员和sysadmin对此并不喜欢systemd。 与其重新讨论人们在systemd中曾经或曾经遇到过的所有所谓的问题,我不带您去看两篇好文章,即使有些陈旧,它们应该涵盖大多数内容。 Linux内核的创建者Linus Torvalds似乎没有兴趣。 在2014年ZDNet的一篇文章中, Linus Torvalds和Linux systemd上的其他人中 ,Linus清楚地表达了他的感受。
“我实际上对systemd本身没有任何特别强烈的意见。我与一些核心开发人员有问题,我认为它们在错误和兼容性方面过于武断,而且我认为某些设计细节太疯狂了(我例如,不喜欢二进制日志),但这只是细节,不是大问题。”
如果您对Linus不太了解,我可以告诉您,如果他不喜欢某事,那么他非常直率,坦率,并且非常清楚这种不喜欢。 在解决自己对事物的不满时,他在社会上更容易被接受。
2013年,Poettering写了一篇很长的博客文章,他在揭穿有关systemd的神话的同时揭露了创建它的一些原因。 这是一本很好的读物,我强烈建议您阅读。
系统任务
根据编译过程中使用的选项(本系列中未介绍的选项),systemd可以具有多达69个二进制可执行文件,这些可执行文件可以执行以下任务,其中包括:
- systemd程序以PID 1的身份运行,并提供尽可能多的并行服务的系统启动,其副作用是,可以缩短总体启动时间。 它还管理关机顺序。
- systemctl程序提供用于服务管理的用户界面。
- 提供了对SystemV和LSB启动脚本的支持,以实现向后兼容。
- 服务管理和报告提供了比SystemV更多的服务状态数据。
- 它包括用于基本系统配置的工具,例如主机名,日期,语言环境,已登录用户的列表,正在运行的容器和虚拟机,系统帐户,运行时目录和设置,用于管理简单网络配置的守护程序,网络时间同步,日志转发,以及名称解析。
- 它提供套接字管理。
- systemd计时器提供了类似cron的高级功能,包括在相对于系统启动,systemd启动,计时器的最后一次启动等时间运行脚本。
- 它提供了一种工具来分析计时器规范中使用的日期和时间。
- 具有分层意识的文件系统的挂载和卸载可以更安全地级联已挂载的文件系统。
- 它可以积极创建和管理临时文件,包括删除文件。
- D-Bus的接口提供了在插入或卸下设备时运行脚本的功能。 这允许将所有设备(无论是否可插拔)都视为即插即用,从而大大简化了设备处理。
- 它的分析启动顺序的工具可用于定位花费时间最多的服务。
- 它包括用于存储系统日志消息的日志以及用于管理日志的工具。
建筑
这些任务和更多任务由许多守护程序,控制程序和配置文件支持。 图1显示了许多属于systemd的组件。 这是一个简化的图,旨在提供高级概述,因此不包括所有单个程序或文件。 它也无法提供对数据流的任何见解,因为数据流是如此复杂,以至于在本系列文章的上下文中这将是无用的练习。
图1:Shduel Csaba Otto Traian(CC BY-SA 3.0)的systemd体系结构
对systemd的完整论述将自己带一本书。 您不需要了解图1中的systemd组件如何组合在一起的详细信息。 足以了解可以管理各种Linux服务并处理日志文件和日志的程序和组件。 但是很明显,systemd并不是它的某些批评家所声称的那样的庞然大物。
系统化为PID 1
systemd是PID1。它的某些功能比旧的SystemV3 init程序要广泛得多,它可以管理运行中的Linux主机的许多方面,包括挂载文件系统以及启动和管理生产Linux主机所需的系统服务。 与启动顺序无关的任何systemd任务都不在本文讨论范围之内(但本系列后面的内容将进行探讨)。
首先,systemd挂载/ etc / fstab定义的文件系统,包括所有交换文件或分区。 此时,它可以访问/ etc中的配置文件,包括它自己的文件。 它使用其配置链接/etc/systemd/system/default.target来确定将主机引导到的状态或目标。 default.target文件是指向真实目标文件的符号链接。 对于台式机工作站,通常将是graphic.target ,等效于SystemV中的运行级别5。 对于服务器,默认值更可能是multi-user.target ,类似于SystemV中的运行级别3。 Emergency.target与单用户模式相似。 目标和服务是系统单位。
下表(图2)将systemd目标与旧的SystemV启动运行级别进行了比较。 systemd提供systemd目标别名以实现向后兼容。 目标别名允许脚本(以及许多系统管理员)使用SystemV命令(如init 3)更改运行级别。 当然,SystemV命令将转发给systemd进行解释和执行。
systemd targets | SystemV运行级别 | 目标别名 | 描述 |
default.target | 这个目标总是与一个符号链接要么multi-user.target或graphical.target别名。 systemd始终使用default.target启动系统。 default.target绝不应别名为halt.target , poweroff.target或reboot.target 。 | ||
graphical.target | 5 | runlevel5.target | Multi-user.target使用GUI |
4 | runlevel4.target | 没用过。 运行级别4与SystemV世界中的运行级别3相同。 可以创建和定制此目标以启动本地服务,而无需更改默认的multi-user.target 。 | |
multi-user.target | 3 | runlevel3.target | 所有服务正在运行,但仅命令行界面(CLI) |
2 | runlevel2.target | 多用户,没有NFS,但所有其他非GUI服务正在运行 | |
rescue.target | 1个 | runlevel1.target | 基本系统,包括仅在运行最基本服务的情况下挂载文件系统,并在主控制台上安装急救外壳 |
emergency.target | 小号 | 单用户模式-没有服务正在运行; 文件系统未挂载。 这是最基本的操作级别,只有在主控制台上运行的紧急外壳供用户与系统交互。 | |
halt.target | 在不关闭电源的情况下暂停系统 | ||
reboot.target | 6 | runlevel6.target | 重启 |
poweroff.target | 0 | runlevel0.target | 停止系统并关闭电源 |
图2:SystemV运行级别与systemd目标和一些目标别名的比较
每个目标在其配置文件中都有一组依赖性。 systemd启动所需的依赖关系,这些依赖关系是在特定功能级别上运行Linux主机所需的服务。 加载并运行目标配置文件中列出的所有依赖项后,系统将在该目标级别运行。 在图2中,功能最多的目标位于表的顶部,功能朝表的底部递减。
systemd还会查看旧版SystemV初始化目录,以查看是否存在任何启动文件。 如果是这样,systemd会将它们用作配置文件以启动文件描述的服务。 不推荐使用的网络服务是一个很好的例子,它仍然在Fedora中使用SystemV启动文件。
图3(下图)直接从启动手册页复制而来。 它显示了systemd启动期间事件的一般顺序以及确保成功启动的基本排序要求的映射。
cryptsetup-pre.target
|
(various low-level v
API VFS mounts: (various cryptsetup devices...)
mqueue, configfs, | |
debugfs, ...) v |
| cryptsetup.target |
| (various swap | | remote-fs-pre.target
| devices...) | | | |
| | | | | v
| v local-fs-pre.target | | | (network file systems)
| swap.target | | v v |
| | v | remote-cryptsetup.target |
| | (various low-level (various mounts and | | |
| | services: udevd, fsck services...) | | remote-fs.target
| | tmpfiles, random | | | /
| | seed, sysctl, ...) v | | /
| | | local-fs.target | | /
| | | | | | /
\____|______|_______________ ______|___________/ | /
\ / | /
v | /
sysinit.target | /
| | /
______________________/|\_____________________ | /
/ | | | \ | /
| | | | | | /
v v | v | | /
(various (various | (various | |/
timers...) paths...) | sockets...) | |
| | | | | |
v v | v | |
timers.target paths.target | sockets.target | |
| | | | v |
v \_______ | _____/ rescue.service |
\|/ | |
v v |
basic.target rescue.target |
| |
________v____________________ |
/ | \ |
| | | |
v v v |
display- (various system (various system |
manager.service services services) |
| required for | |
| graphical UIs) v v
| | multi-user.target
emergency.service | | |
| \_____________ | _____________/
v \|/
emergency.target v
graphical.target
图3:systemd启动图
可以将sysinit.target和basic.target目标视为启动过程中的检查点。 尽管systemd的设计目标之一是并行启动系统服务,但是必须先启动某些服务和功能目标,然后才能启动其他服务和目标。 在满足该检查点所需的所有服务和目标之前,无法通过这些检查点。
当sysinit.target所依赖的所有单元都完成时, 就可以到达sysinit.target 。 所有这些单元,装入文件系统,设置交换文件,启动udev,设置随机生成器种子,启动低级服务以及设置加密服务(如果已加密一个或多个文件系统)都必须完成,但是必须在sysinit.target ,这些任务可以并行执行。
sysinit.target将启动系统仅能正常运行所需的所有低层服务和单元,以及启动向basic.target转移所需的所有低层服务和单元。
满足sysinit.target之后,systemd然后启动满足下一个目标所需的所有单元。 基本目标通过启动所有下一个目标所需的单元来提供一些其他功能。 其中包括设置诸如各种可执行目录的路径,通信套接字和计时器之类的内容。
最后,用户级别的目标,multi-user.target或graphical.target,可以初始化。 必须满足multi-user.target才能满足图形目标的依赖关系。 图3中带下划线的目标是通常的启动目标。 当达到这些目标之一时,启动已完成。 如果multi-user.target是默认值,那么您应该在控制台上看到文本模式登录。 如果graphical.target是默认的,那么你应该看到图形化登录; 您看到的特定GUI登录屏幕取决于您的默认显示管理器。
引导手册页还描述并提供了引导到初始RAM磁盘和systemd关机过程的映射。
systemd还提供了一个列出完整启动或指定单元的依赖项的工具。 单元是可控制的systemd资源实体,其范围从特定服务(例如httpd或sshd)到计时器,安装,套接字等。 尝试以下命令并在结果中滚动。
systemctl list-dependencies graphical.target
注意,这完全扩展了使系统进入图形目标运行模式所需的顶级目标单元列表。 使用--all选项也可以扩展所有其他单位。
systemctl list-dependencies --all graphical.target
您可以使用less命令的搜索工具来搜索诸如“ target”,“ slice”和“ socket”之类的字符串。
因此,现在尝试以下方法。
systemctl list-dependencies multi-user.target
和
systemctl list-dependencies rescue.target
和
systemctl list-dependencies local-fs.target
和
systemctl list-dependencies dbus.service
这个工具可以帮助我可视化我正在处理的主机的启动依赖项的细节。 继续并花一些时间探索一个或多个Linux主机的启动树。 但是要小心,因为systemctl手册页包含以下注释:
“请注意,此命令仅列出当前由服务管理器加载到内存中的单元。特别是,此命令不适合针对特定单元的所有反向依赖关系获取全面列表,因为它不会列出由单元声明的依赖关系目前尚未加载。”
最后的想法
甚至在深入研究systemd之前,很明显它既强大又复杂。 显然,systemd不是单个,巨大,整体且不可知的二进制文件。 而是由许多较小的组件和旨在执行特定任务的子命令组成。
本系列的下一篇文章将更详细地探讨systemd启动,以及systemd配置文件,更改默认目标以及如何创建简单服务单元。
资源资源
互联网上有大量有关systemd的信息,但是很多信息简洁,晦涩甚至是误导。 除了本文提到的资源之外,以下网页还提供了有关systemd启动的更详细和可靠的信息。
- Fedora项目对systemd有很好的实用指南 。 它具有使用systemd配置,管理和维护Fedora计算机所需的几乎所有知识。
- Fedora项目还有一个很好的备忘单 ,可以将旧的SystemV命令与可比的systemd命令进行交叉引用。
- 有关systemd及其创建原因的详细技术信息,请查看Freedesktop.org 对systemd的描述 。
- Linux.com的“更多系统乐趣”提供了更多高级系统信息和技巧 。
还有systemd的设计师和主要开发者Lennart Poettering撰写的一系列针对Linux sysadmin的技术性文章。 这些文章是在2010年4月至2011年9月之间撰写的,但它们现在和那时一样具有相关性。 关于systemd及其生态系统的许多其他优点都基于这些论文。
- 重新思考PID 1
- 系统管理员,第一部分
- 系统管理员,第二部分
- 系统管理员,第三部分
- 管理员专用的systemd,第IV部分
- 系统管理员,第五部分
- 管理员专用的systemd,第VI部分
- 管理员专用系统,第七部分
- 管理员专用的系统化第八部分
- 管理员专用的systemd,第IX部分
- 适用于管理员的systemd,第X部分
- 管理员专用系统,第十一部分
如何系统的学会编程