systemd – 以 openSUSE 12.1 更快、更干净地启动

2011年12月22日 | Manu Gupta | 无许可

openSUSE 12.1 采用 systemd 替代 System V init 守护进程。systemd 提供了一种新的、改进的启动系统和管理服务的方式。它具有许多新功能,例如套接字和 dbus 激活、使用 cgroups(控制组)以及积极的并行化能力,从而加快系统的启动速度。Systemd 还为系统管理员引入了许多新功能和工具。本文将解释 systemd 的作用、如何实现以及如何利用它提供的新的可能性。

启动系统和服务

在 openSUSE 12.1 中,systemd 启动并监督 openSUSE 操作系统及其服务。这意味着通常包括以下几个步骤

  • 挂载磁盘(如果需要,检查错误),

  • 启动防火墙和其他安全工具,

  • 启动邮件、数据库或 Web 服务器等服务,

  • 连接网络和网络文件系统,

  • 启动图形系统和登录管理器,将您带到桌面

在运行和启动后,systemd 会跟踪服务并在需要时启动新的服务(例如打印)。

旧时代(SysV init)

systemd 替代了旧的 SysV init 系统,它基本上是 /etc/init.d(有时在其他发行版中为 /etc/rc.d)中的一组松散的 shell 脚本。这些脚本会根据系统的“运行级别”调用,基于指向这些脚本本身在 /etc/init.d/rcX.d 目录中的符号链接。那里的每个目录代表一个运行级别编号,它们的顺序和依赖关系通过使用从 00 到 99 的数字对这些脚本的符号链接的命名来管理。启动时,系统会进入指定的运行级别,启动与该运行级别关联的所有脚本。虽然有点脆弱,但这个系统相当清晰易懂,尽管脚本通常很大而且很复杂。

全新改进:systemd

systemd 不使用 shell 脚本,而是使用“.service”文件,这些文件定义了 systemd 提供的各种功能,有点像旧的 SysV init 脚本,但具有比 bash 更简单、更声明性的语法。

依赖关系和事件

systemd 不会根据预定义的运行级别编号来启动脚本,而是使用依赖关系和事件来决定何时启动服务。例如,一旦网络设备初始化完成,systemd 就会启动网络服务。一旦建立连接,基于网络的 NFS(网络文件存储)和 Samba(文件共享)等服务就可以启动。如果没有网络,systemd 不会启动它们。如果没有连接到系统的打印机,则不需要打印服务 CUPS。

systemd 使用套接字和 dbus 来启动服务,从而允许按需启动守护进程,并监视套接字以获取来自应用程序的请求。例如,只有在您尝试打印时,打印服务才会启动。

启动和停止服务

systemd 可以同时启动尽可能多的服务,同时尊重系统的依赖关系和需求。这与它不需要为每个单独的脚本启动 shell 解释器相结合,从而加快了启动时间。

systemd 中的服务可以禁用、启用、启动、停止、重新启动和重新加载,就像 SysV 中的脚本一样,但与 SysV 不同,受脚本控制的应用程序会被密切监控和控制。SysV 不会注意到服务崩溃(例如由于崩溃),systemd 会尝试重新启动它们。当 systemd 停止进程时,您可以确定它已被停止(这要归功于使用 cgroup 内核功能),而在 SysV 中,进程有时会设法摆脱脚本的控制。

标准化

systemd 致力于标准化 init 脚本,而这些脚本过去每个发行版都不同。这应该可以减少发行版的维护负担,因为它们将共享更多的工作,但当然需要它们首先适应通用标准。这意味着使用标准“systemctl”来控制服务,而不是 /etc/rc* 文件。目前,openSUSE 仍然支持 rc 样式的文件(在 /etc/rc.d 中提供符号链接),因此您仍然可以通过手动方式运行服务。systemd 也与旧式 init 脚本向后兼容,这意味着“非”标准(未包含在 systemd 中)脚本将继续工作。有关更多详细信息和这方面的限制列表,请参阅 此处

使用 systemd

让我们回顾一下 systemd 的一些功能,这些功能与“普通”用户和系统管理员相关。

管理服务和(自动)挂载设备

通过 udev 规则标记的设备在 systemd 中标记为单元,它们的 udev 属性可以用作配置源来设置设备单元的依赖关系。systemd 还维护挂载和自动挂载点,并在需要时(取消)挂载设备。对于每个自动挂载点,我们都有一个匹配的挂载点。要让 systemd 自动挂载设备,请将“comment=systemd.automount”添加到 fstab 行选项中,挂载点将自动处理为自动挂载点。这可用于网络文件系统 nfs 和 cifs。/etc/fstab 用作这些挂载点的额外配置。systemd 还支持目标单元,这些单元在逻辑上分组,并且这些组可以一起控制。

稳定性和紧急功能

Systemd 在运行时自动计算服务之间的依赖关系,并能够打破依赖关系循环,即当服务之间发生循环时,systemd 会在检测到后打破它,您的系统将继续工作而无需用户交互。它还支持创建快照并稍后恢复系统状态,可用于紧急 shell 并提供一种轻松暂停服务的方式。但是,此功能不是持久性的,它仅保存在内存中并在重新启动后刷新。

新的系统工具

系统管理员将欢迎 systemctl 等新工具来管理系统。例如,要检查 mysql.service 的状态,请运行:$ systemctl status mysql.service mysql.service - LSB: Start the MySQL database server Loaded: loaded (/etc/init.d/mysql) Active: active (running) since Wed, 02 Nov 2011 10:53:34 +0100; 24h ago Process: 3242 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS) CGroup: name=systemd:/system/mysql.service ├ 3578 /bin/sh /usr/bin/mysqld_safe --mysqld=mysqld --user=mysql --pid-file=/var/run/mysql/mysqld.pid --socket=/var/ru... └ 4191 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --lo... systemctl 的真正很酷之处在于它的选项卡补全。第一层用于命令,例如 systemctl 将显示您可以运行的操作。第二层将显示您可以使用哪个服务名称,例如 systemctl start my 将补全为 mysql.service

禁用/启用服务

 systemctl disable mysql.service
 systemctl enable mysql.service

请注意,chkconfig 了解 systemd,并会告诉您服务是 systemd 原生还是不是。

位置 systemd 服务文件主要存储在 /lib/systemd/system

<strong>Start stop your computer</strong>
 systemctl reboot
 systemctl halt
 systemctl poweroff
 systemctl emergency
 systemctl rescue

获取信息

 systemd-analyse --time: give your boot time of your system
 systemd-analyse --blame: find which service took too much time to boot
 systemd-analyse --plot > bootchart.svg : see your boot, in a graphical chart
 systemctl dot : Use a command line like systemctl dot --order | dot -Tsvg > systemd-order.svg to generate a graphical dependency tree

调试 您可以通过在启动行中添加来激活启动时的调试模式

 systemd.log_target=kmsg systemd.log_level=debug

退回

虽然我们不建议任何人使用 12.1 上的 sys V init,但希望选择它作为默认值的人可以通过安装 sysvinit-init 包(它将卸载 systemd-sysvinit 包)或更改他们的 grub 选项来执行此操作。即使您不使用 systemd,也不要尝试卸载其软件包,这可能会破坏您的系统。如果您让 sysvinit 包安装,您可以添加 init=/sbin/sysvinit 到您的启动行, voilà!

分类: 发行版

标签

分享此帖子