资讯详情

systemd 介绍

📅 2026/10/16 4:06:19 | 华诺云谱 👁 阅读
systemd 介绍
systemd 是一个 Linux 系统基础组件的集合提供了一个系统和服务管理器运行为 PID 1 并负责启动其它程序。功能包括支持并行化任务同时采用 socket 式与 D-Bus 总线式激活服务按需启动守护进程 (daemon)利用 Linux 的 cgroups 监视进程支持快照和系统恢复维护挂载点和自动挂载点各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本可以替代 sysvinit。除此之外功能还包括日志进程、控制基础系统配置维护登陆用户列表以及系统账户、运行时目录和设置可以运行容器和虚拟机可以简单的管理网络配置、网络时间同步、日志转发和名称解析等。1. 介绍systemd 是 Linux 系统中最新的初始化系统 (init)它主要的设计目标是克服 sysvinit 固有的缺点提高系统的启动速度。systemd 和 Ubuntu 的 upstart 是竞争对手但是时至今日 Ubuntu 也采用了 systemd所以 systemd 在竞争中胜出大有一统天下的趋势。其实systemd 的很多概念都来源于苹果 Mac OS 操作系统上的 launchd。systemd 的优点是功能强大使用方便缺点是体系庞大非常复杂下图展示了 systemd 的架构此图来自互联网systemd 能够在与 upstart 的竞争中胜出自然有很多过人之处接下来让我们介绍一些 systemd 的主要优点。1.1. 兼容性systemd 提供了和 sysvinit 兼容的特性。系统中已经存在的服务和进程无需修改。这降低了系统向 systemd 迁移的成本使得 systemd 替换现有初始化系统成为可能。1.2. 启动速度systemd 提供了比 upstart 更激进的并行启动能力采用了 socket / D-Bus activation 等技术启动服务。一个显而易见的结果就是更快的启动速度。为了减少系统启动时间systemd 的目标是尽可能启动更少的进程尽可能将更多进程并行启动同样地upstart 也试图实现这两个目标。下图展示了 upstart 相对于 sysvinit 在并发启动这个方面的改进upstart 增加了系统启动的并行性从而提高了系统启动速度。但是在 upstart 中有依赖关系的服务还是必须先后启动。比如任务 A, B, (C, D) 因为存在依赖关系所以在这个局部还是串行执行。systemd 能够更进一步提高并发性即便对于那些 upstart 认为存在相互依赖而必须串行的服务比如 Avahi 和 D-Bus 也可以并发启动。从而实现如下图所示的并发启动过程在 systemd 中所有的任务都同时并发执行总的启动时间被进一步降低为 T1。可见 systemd 比 upstart 更进一步提高了并行启动能力极大地加速了系统启动时间。1.3. systemd 提供按需启动能力当 sysvinit 系统初始化的时候它会将所有可能用到的后台服务进程全部启动运行。并且系统必须等待所有的服务都启动就绪之后才允许用户登录。这种做法有两个缺点首先是启动时间过长其次是系统资源浪费。某些服务很可能在很长一段时间内甚至整个服务器运行期间都没有被使用过。比如 CUPS打印服务在多数服务器上很少被真正使用到。您可能没有想到在很多服务器上 SSHD 也是很少被真正访问到的。花费在启动这些服务上的时间是不必要的同样花费在这些服务上的系统资源也是一种浪费。systemd 可以提供按需启动的能力只有在某个服务被真正请求的时候才启动它。当该服务结束systemd 可以关闭它等待下次需要时再次启动它。这有点类似于以前系统中的 inetd并且有很多文章介绍如何把过去 inetd 管理的服务迁移到 systemd。1.4. 采用Linux的 cgroups 跟踪和管理进程的生命周期systemd 利用了 Linux 内核的特性即 cgroups 来完成跟踪的任务。当停止服务时通过查询 cgroupssystemd 可以确保找到所有的相关进程从而干净地停止服务。cgroups 已经出现了很久它主要用来实现系统资源配额管理。cgroups 提供了类似文件系统的接口使用方便。当进程创建子进程时子进程会继承父进程的 cgroups。因此无论服务如何启动新的子进程所有的这些相关进程都会属于同一个 cgroupssystemd 只需要简单地遍历指定的 cgroups 即可正确地找到所有的相关进程将它们一一停止即可。1.5. 启动挂载点和自动挂载的管理传统的 Linux 系统中用户可以用 /etc/fstab 文件来维护固定的文件系统挂载点。这些挂载点在系统启动过程中被自动挂载一旦启动过程结束这些挂载点就会确保存在。这些挂载点都是对系统运行至关重要的文件系统比如 HOME 目录。和 sysvinit 一样Systemd 管理这些挂载点以便能够在系统启动时自动挂载它们。systemd 还兼容 /etc/fstab 文件您可以继续使用该文件管理挂载点。有时候用户还需要动态挂载点比如打算访问 DVD 或者 NFS 共享的内容时才临时执行挂载以便访问其中的内容而不访问光盘时该挂载点被取消 (umount)以便节约资源。传统地人们依赖 autofs 服务来实现这种功能。systemd 内建了自动挂载服务无需另外安装 autofs 服务可以直接使用 systemd 提供的自动挂载管理能力来实现 autofs 的功能。1.6. 实现事务性依赖关系管理系统启动过程是由很多的独立工作共同组成的这些工作之间可能存在依赖关系比如挂载一个 NFS 文件系统必须依赖网络能够正常工作。systemd 虽然能够最大限度地并发执行很多有依赖关系的工作但是类似挂载 NFS和启动网络这样的工作还是存在天生的先后依赖关系无法并发执行。对于这些任务systemd 维护一个事务一致性的概念保证所有相关的服务都可以正常启动而不会出现互相依赖以至于死锁的情况。1.7. 日志服务systemd 自带日志服务 journald该日志服务的设计初衷是克服现有的 syslog 服务的缺点。比如syslog 不安全消息的内容无法验证。每一个本地进程都可以声称自己是 Apache PID 4711而 syslog 也就相信并保存到磁盘上。数据没有严格的格式非常随意。自动化的日志分析器需要分析人类语言字符串来识别消息。一方面此类分析困难低效此外日志格式的变化会导致分析代码需要更新甚至重写。systemd journal 用二进制格式保存所有日志信息用户使用 journalctl 命令来查看日志信息。无需自己编写复杂脆弱的字符串分析处理程序。1.8. systemd journal 的优点如下简单性代码少依赖少抽象开销最小。零维护日志是除错和监控系统的核心功能因此它自己不能再产生问题。举例说自动管理磁盘空间避免由于日志的不断产生而将磁盘空间耗尽。移植性日志文件应该在所有类型的 Linux 系统上可用无论它使用的何种 CPU 或者字节序。性能添加和浏览日志非常快。最小资源占用日志数据文件需要较小。统一化各种不同的日志存储技术应该统一起来将所有的可记录事件保存在同一个数据存储中。所以日志内容的全局上下文都会被保存并且可供日后查询。例如一条固件记录后通常会跟随一条内核记录最终还会有一条用户态记录。重要的是当保存到硬盘上时这三者之间的关系不会丢失。syslog 将不同的信息保存到不同的文件中分析的时候很难确定哪些条目是相关的。扩展性日志的适用范围很广从嵌入式设备到超级计算机集群都可以满足需求。安全性日志文件是可以验证的让无法检测的修改不再可能。2. 命令systemd 并不是一个命令而是一组命令涉及到系统管理的方方面面但最常用的命令是systemctl。2.1. systemctlsystemctl是 Systemd 的主命令用于管理系统。systemctl命令主要有两大功能控制systemd系统和管理系统上运行的服务# 重启系统 $ sudo systemctl reboot # 关闭系统切断电源 $ sudo systemctl poweroff # CPU停止工作 $ sudo systemctl halt # 暂停系统 $ sudo systemctl suspend # 让系统进入冬眠状态 $ sudo systemctl hibernate # 让系统进入交互式休眠状态 $ sudo systemctl hybrid-sleep # 启动进入救援状态单用户状态 $ sudo systemctl rescue2.2. systemd-analyzesystemd-analyze命令用于查看启动耗时。# 查看启动耗时 $ systemd-analyze # 查看每个服务的启动耗时 $ systemd-analyze blame # 显示瀑布状的启动过程流 $ systemd-analyze critical-chain # 显示指定服务的启动流 $ systemd-analyze critical-chain atd.service2.3. hostnamectlhostnamectl命令用于查看当前主机的信息。# 显示当前主机的信息 $ hostnamectl # 设置主机名。 $ sudo hostnamectl set-hostname rhel72.4. localectllocalectl命令用于查看本地化设置。# 查看本地化设置 $ localectl # 设置本地化参数。 $ sudo localectl set-locale LANGen_GB.utf8 $ sudo localectl set-keymap en_GB2.5. timedatectltimedatectl命令用于查看当前时区设置。# 查看当前时区设置 $ timedatectl # 显示所有可用的时区 $ timedatectl list-timezones # 设置当前时区 $ sudo timedatectl set-timezone America/New_York $ sudo timedatectl set-time YYYY-MM-DD $ sudo timedatectl set-time HH:MM:SS2.6. loginctlloginctl命令用于查看当前登录的用户。# 列出当前session $ loginctl list-sessions # 列出当前登录用户 $ loginctl list-users # 列出显示指定用户的信息 $ loginctl show-user ruanyf3. Unit3.1. 含义Systemd 可以管理所有系统资源。不同的资源统称为 Unit单位。Unit 一共分成12种。Service unit系统服务Target unit多个 Unit 构成的一个组Device Unit硬件设备Mount Unit文件系统的挂载点Automount Unit自动挂载点Path Unit文件或路径Scope Unit不是由 Systemd 启动的外部进程Slice Unit进程组Snapshot UnitSystemd 快照可以切回某个快照Socket Unit进程间通信的 socketSwap Unitswap 文件Timer Unit定时器systemctl list-units命令可以查看当前系统的所有 Unit。# 列出正在运行的 Unit $ systemctl list-units # 列出所有Unit包括没有找到配置文件的或者启动失败的 $ systemctl list-units --all # 列出所有没有运行的 Unit $ systemctl list-units --all --stateinactive # 列出所有加载失败的 Unit $ systemctl list-units --failed # 列出所有正在运行的、类型为 service 的 Unit $ systemctl list-units --typeservice3.2. Unit 的状态systemctl status命令用于查看系统状态和单个 Unit 的状态。# 显示系统状态 $ systemctl status # 显示单个 Unit 的状态 $ sysystemctl status bluetooth.service # 显示远程主机的某个 Unit 的状态 $ systemctl -H rootrhel7.example.com status httpd.service除了status命令systemctl还提供了三个查询状态的简单方法主要供脚本内部的判断语句使用。# 显示某个 Unit 是否正在运行 $ systemctl is-active application.service # 显示某个 Unit 是否处于启动失败状态 $ systemctl is-failed application.service # 显示某个 Unit 服务是否建立了启动链接 $ systemctl is-enabled application.service3.3. Unit 管理对于用户来说最常用的是下面这些命令用于启动和停止 Unit主要是 service。# 立即启动一个服务 $ sudo systemctl start apache.service # 立即停止一个服务 $ sudo systemctl stop apache.service # 重启一个服务 $ sudo systemctl restart apache.service # 杀死一个服务的所有子进程 $ sudo systemctl kill apache.service # 重新加载一个服务的配置文件 $ sudo systemctl reload apache.service # 重载所有修改过的配置文件 $ sudo systemctl daemon-reload # 显示某个 Unit 的所有底层参数 $ systemctl show httpd.service # 显示某个 Unit 的指定属性的值 $ systemctl show -p CPUShares httpd.service # 设置某个 Unit 的指定属性 $ sudo systemctl set-property httpd.service CPUShares5003.4 依赖关系Unit 之间存在依赖关系A 依赖于 B就意味着 Systemd 在启动 A 的时候同时会去启动 B。systemctl list-dependencies命令列出一个 Unit 的所有依赖。$ systemctl list-dependencies nginx.service上面命令的输出结果之中有些依赖是 Target 类型详见下文默认不会展开显示。如果要展开 Target就需要使用--all参数。$ systemctl list-dependencies --all nginx.service4. Unit 的配置文件4.1. 概述每一个 Unit 都有一个配置文件告诉 Systemd 怎么启动这个 Unit。Systemd 默认从目录/etc/systemd/system/读取配置文件。但是里面存放的大部分文件都是符号链接指向目录/usr/lib/systemd/system/真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间建立符号链接关系。$ sudo systemctl enable clamdscan.service # 等同于 $ sudo ln -s /usr/lib/systemd/system/clamdscan.service /etc/systemd/system/multi-user.target.wants/clamdscan.service如果配置文件里面设置了开机启动systemctl enable命令相当于激活开机启动。与之对应的systemctl disable命令用于在两个目录之间撤销符号链接关系相当于撤销开机启动。$ sudo systemctl disable clamdscan.service配置文件的后缀名就是该 Unit 的种类比如sshd.socket。如果省略Systemd 默认后缀名为.service所以sshd会被理解成sshd.service。4.2 配置文件的状态systemctl list-unit-files命令用于列出所有配置文件。# 列出所有配置文件 $ systemctl list-unit-files # 列出指定类型的配置文件 $ systemctl list-unit-files --typeservice这个命令会输出一个列表。$ systemctl list-unit-files UNIT FILE STATE chronyd.service enabled clamd.service static clamdscan.service disabled这个列表显示每个配置文件的状态一共有四种。enabled已建立启动链接disabled没建立启动链接static该配置文件没有[Install]部分无法执行只能作为其他配置文件的依赖masked该配置文件被禁止建立启动链接注意从配置文件的状态无法看出该 Unit 是否正在运行。这必须执行前面提到的systemctl status命令。$ systemctl status bluetooth.service一旦修改配置文件就要让 SystemD 重新加载配置文件然后重新启动否则修改不会生效。$ sudo systemctl daemon-reload $ sudo systemctl restart httpd.service参考文献systemd详解_哪有天生的学霸一切都是厚积薄发的博客-CSDN博客_systemdsystemctl 详解_Coding_的博客-CSDN博客_systemctlsystemctl命令_别掉头发啦的博客-CSDN博客systemd 介绍_shliang310的博客-CSDN博客_systemd
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑