systemd的运行级别与服务管理命令简介
创始人
2024-03-01 14:33:21
0

从很久很久以前我们就在使用静态运行级别。而systemd提供了更为动态灵活的机制,来管控你的系统。

在开始介绍systemd命令前,让我们先简单的回顾一下历史。在Linux世界里,有一个很奇怪的现象,一方面Linux和自由软件(FOSS)在不断的向前推进,另一方面人们对这些变化却不断的抱怨。这就是为什么我要在此稍稍提及那些反对systemd所引起的争论的原因,因为我依然记得历史上有不少类似的争论:

  • 软件包(Pacakge)是邪恶的,因为真正的Linux用户会从源码构建他所想要的的一切,并严格的管理系统中安装的软件。
  • 解析依赖关系的包管理器是邪恶的,真正的Linux用户会手动解决这些该死的依赖关系。
  • apt-get总能把事情干好,所以只有Yum是邪恶的。
  • Red Hat简直就是Linux中的微软。
  • 好样的,Ubuntu!
  • 滚蛋吧,Ubuntu!

诸如此类…就像我之前常常说的一样,变化总是让人沮丧。这些该死的变化搅乱了我的工作流程,这可不是一件小事情,任何业务流程的中断,都会直接影响到生产力。但是,我们现在还处于计算机发展的婴儿期,在未来的很长的一段时间内将会持续有快速的变化和发展。想必大家应该都认识一些因循守旧的人,在他们的心里,商品一旦买回家以后就是恒久不变的,就像是买了一把扳手、一套家具或是一个粉红色的火烈鸟草坪装饰品。就是这些人,仍然在坚持使用Windows Vista,甚至还有人在使用运行Windows 95的老破烂机器和CRT显示器。他们不能理解为什么要去换一台新机器。老的还能用啊,不是么?

这让我回忆起了我在维护老电脑上的一项伟大的成就,那台破电脑真的早就该淘汰掉。从前我有个朋友有一台286的老机器,安装了一个极其老的MS-DOS版本。她使用这台电脑来处理一些简单的任务,比如说约会、日记、记账等,我还用BASIC给她写了一个简单的记账软件。她不用关注任何安全更新,是这样么?因为它压根都没有联网。所以我会时不时给她维修一下电脑,更换电阻、电容、电源或者是CMOS电池什么的。它竟然还一直能用。它那袖珍的琥珀CRT显示器变得越来越暗,在使用了20多年后,终于退出了历史舞台。现在我的这位朋友,换了一台运行Linux的老Thinkpad,来干同样的活。

前面的话题有点偏题了,下面抓紧时间开始介绍systemd。

运行级别 vs. 状态

SysVInit使用静态的运行级别来构建不同的启动状态,大部分发布版本中提供了以下5个运行级别:

  • 单用户模式(Single-user mode)
  • 多用户模式,不启动网络服务(Multi-user mode without network services started)
  • 多用户模式,启动网络服务(Multi-user mode with network services started)
  • 系统关机(System shutdown)
  • 系统重启(System reboot)

对于我来说,使用多个运行级别并没有太大的好处,但它们却一直在系统中存在着。 不同于运行级别,systemd可以创建不同的状态,状态提供了灵活的机制来设置启动时的配置项。这些状态是由多个unit文件组成的,状态又叫做启动目标(target)。启动目标有一个清晰的描述性命名,而不是像运行级别那样使用数字。unit文件可以控制服务、设备、套接字和挂载点。参考下/usr/lib/systemd/system/graphical.target,这是CentOS 7默认的启动目标:

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
After=multi-user.target
Conflicts=rescue.target
Wants=display-manager.service
AllowIsolate=yes
[Install]
Alias=default.target

现在再看看unit文件长什么样? 我来给大家找个例子。 unit文件存放在下面的两个目录下:

  • /etc/systemd/system/
  • /usr/lib/systemd/system/

我们可以修改第一个目录中的文件来进行自定义配置,而第二个目录中的文件是包安装时保存的备份。/etc/systemd/system/的优先级高于/usr/lib/systemd/system/。不错,用户优先级高于机器。下面是Apache Web server的unit文件:

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd/ $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi.user.target

就算是对于新手而言,上面的文件也是非常简单易懂的。这可比SysVInit的init文件要简单多了,为了便于比较,下面截取了/etc/init.d/apache2的一个片段:

SCRIPTNAME="${0##*/}"
SCRIPTNAME="${SCRIPTNAME##[KS][0-9][0-9]}"
if [ -n "$APACHE_CONFDIR" ] ; then
    if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
            DIR_SUFFIX="${APACHE_CONFDIR##/etc/apache2-}"
    else
            DIR_SUFFIX=

整个文件一共有410行。

你可以检查unit文件的依赖关系,我常常被这些复杂的依赖关系给吓到:

$ systemctl list-dependencies httpd.service

cgroups

cgroups,或者叫控制组,在Linux内核里已经出现好几年了,但直到systemd的出现才被真正使用起来。The kernel documentation中是这样描述cgroups的:“控制组提供层次化的机制来管理任务组,使用它可以聚合和拆分任务组,并管理任务组后续产生的子任务。”换句话说,它提供了多种有效的方式来控制、限制和分配资源。systemd使用了cgroups,你可以便捷的查看它,使用下面的命令可以展示你系统中的整个cgroup树:

$ systemd-cgls

你可以使用ps命令来进行查看cgroup树:

$ ps xawf -eo pid,user,cgroup,args

常用命令集

下面的命令行展示了如何为守护进程重新装载配置文件,注意不是systemd服务文件。 使用这个命令能够激活新的配置项,且尽可能少的打断业务进程,下面以Apache为例:

# systemctl reload httpd.service

重新装载服务文件(service file)需要完全停止和重新启动服务。如果服务挂死了,用下面的命令行可以恢复它:

# systemctl restart httpd.service

你还可以用一个命令重启所有的守护进程。这个命令会重新装载所有守护进程的unit文件,然后重新生成依赖关系树:

# systemctl daemon-reload

在非特权模式下,你也可以进行重启、挂起、关机操作:

$ systemctl reboot
$ systemctl suspend
$ systemctl poweroff

按照惯例,最后给大家介绍一些systemd的学习材料。Here We Go Again, Another Linux Init: Intro to systemdUnderstanding and Using Systemd 是不错的入门材料,这两份文档里会链接到更多其他资源。


via: http://www.linux.com/learn/tutorials/794615-systemd-runlevels-and-service-management

作者:Carla Schroder 译者:coloka 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

相关内容

在CentOS上正确执行s...
安全关闭CentOS系统的正确方法与注意事项 在服务器管理中,系统...
2025-05-26 06:49:16
bundler:faile...
这个问题可能是因为系统中缺少 sidekiq 的 gem 包依赖项...
2024-12-27 00:31:02
buildroot主机系统...
确认系统环境是否符合要求,例如所需的工具、包和库是否已安装。如果确...
2024-12-25 16:01:16
本地svn的目录为什么会出...
当本地svn的目录所在的硬盘分区的名称中包含空格时,svn会将路径...
2024-11-30 03:01:41
本地SVN目录里的文件夹经...
修改/更新SVN工作副本时,常常会在本地SVN目录中出现%Syst...
2024-11-30 03:01:29
本地svn版本库中不断出现...
这个问题的原因是svn版本库中存储的文件路径中使用了环境变量%Sy...
2024-11-30 03:01:27

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...