systemctl介绍

本文发布时间: 2019-Mar-22
声明:本文转载自:systemd (简体中文) systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。systemd 的特性有:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。 检视和控制systemd的主要命令是systemctl。该命令可用于查看系统状态和管理系统及服务。详见man 1 systemctl。 小贴士: - 在 systemctl 参数中添加 -H <用户名>@<主机名> 可以实现对其他机器的远程控制。该过程使用 SSH连接。 - systemadm 是 systemd 的官方图形前端。官方软件仓库 提供了稳定版本 systemd-ui。 - Plasma 用户可以安装 systemctl 图形前端 systemd-kcm。安装后可以在 System administration 下找到基本工具分析系统状态显示 系统状态:$ systemctl status输出激活的单元:$ systemctl以下命令等效:$ systemctl list-units输出运行失败的单元:$ systemctl --failed所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)。查看所有已安装服务:$ systemctl list-unit-files使用单元一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets) 、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由 systemd 管理的计时器(.timer)。详情参阅 man 5 systemd.unit。 使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service)。但是有些单元可以在systemctl中使用简写方式。如果无扩展名,systemctl 默认把扩展名当作 .service。例如 netcfg 和 netcfg.service 是等价的。挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount。设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。 Note: 有一些单元的名称包含一个 @ 标记, (e.g. [email protected]): 这意味着它是模板单元 [email protected] 的一个 实例。 string 被称作实例标识符, 在 systemctl 调用模板单元时,会将其当作一个参数传给模板单元,模板单元会使用这个传入的参数代替模板中的 %I 指示符。 在实例化之前,systemd 会先检查 [email protected] 文件是否存在(如果存在,应该就是直接使用这个文件,而不是模板实例化了)。大多数情况下,包换 @ 标记都意味着这个文件是模板。如果一个模板单元没有实例化就调用,该调用会返回失败,因为模板单元中的 %I 指示符没有被替换。 Tip: 下面的大部分命令都可以跟多个单元名, 详细信息参见 man systemctl。 从systemd 220版本开始, systemctl命令在enable、disable和mask子命令中增加了–now选项,可以实现激活的同时启动服务,取消激活的同时停止服务。 一个软件包可能会提供多个不同的单元。如果你已经安装了软件包,可以通过pacman -Qql package | grep systemd命令检查这个软件包提供了哪些单元。立即激活单元:# systemctl start <单元>立即停止单元:# systemctl stop <单元>重启单元:# systemctl restart <单元>重新加载配置:# systemctl reload <单元>输出单元运行状态:$ systemctl status <单元>检查单元是否配置为自动启动:$ systemctl is-enabled <单元>开机自动激活单元:# systemctl enable <单元>取消开机自动激活单元:# systemctl disable <单元>禁用一个单元(禁用后,间接启动也是不可能的):# systemctl mask <单元>取消禁用一个单元:# systemctl unmask <单元>显示单元的手册页(必须由单元文件提供):# systemctl help <单元>重新载入 systemd,扫描新的或有变动的单元:# systemctl daemon-reload电源管理安装 polkit 后才可以一般用户身份使用电源管理。 如果你正登录在一个本地的systemd-logind用户会话,且当前没有其它活动的会话,那么以下命令无需root权限即可执行。否则(例如,当前有另一个用户登录在某个tty),systemd 将会自动请求输入root密码。 重启:$ systemctl reboot退出系统并停止电源:$ systemctl poweroff待机:$ systemctl suspend休眠:$ systemctl hibernate混合休眠模式(同时休眠到硬盘并待机):$ systemctl hybrid-sleep编写单元文件systemd 单元文件的语法来源于 XDG桌面入口配置文件.desktop文件,最初的源头则是Microsoft Windows的.ini文件。单元文件可以从两个地方加载,优先级从低到高分别是:/usr/lib/systemd/system/: 软件包安装的单元/etc/systemd/system/: 系统管理员安装的单元当systemd运行在用户模式下时,使用的加载路径是完全不同的。systemd 单元名仅能包含 ASCII 字符, 下划线和点号. 其它字符需要用 C-style “\x2d” 替换. 参阅 man systemd.unit 和 man systemd-escape.}}单元文件的语法,可以参考系统已经安装的单元,也可以参考man systemd.service中的EXAMPLES章节。 小贴士: 以 # 开头的注释可能也能用在 unit-files 中, 但是只能在新行中使用。 不要在 systemd 的参数后面使用行末注释, 否则 unit 将会启动失败。处理依赖关系使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。 依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。服务类型编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。Type=idle: systemd会等待所有任务处理完成后,才开始执行idle类型的单元。其他行为和Type=simple 类似。type的更多解释可以参考 systemd.service(5)。修改现存单元文件为了避免和 pacman 冲突,不应该直接编辑软件包提供的文件. 要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。例如,如果想添加一个额外的依赖,创建这么一个文件即可:/etc/systemd/system/<unit>.d/customdependency.conf[Unit]Requires=<新依赖>After=<新依赖>As another example, in order to replace the ExecStart directive for a unit that is not of type oneshot, create the following file:/etc/systemd/system/unit.d/customexec.conf[Service]ExecStart=ExecStart=new command想知道为什么修改 ExecStart 前必须将其置空,参见 ([1]). 下面是自动重启服务的一个例子:/etc/systemd/system/unit.d/restart.conf[Service]Restart=alwaysRestartSec=30然后运行以下命令使更改生效:# systemctl daemon-reload# systemctl restart <单元>此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到 /etc/systemd/system/,然后进行修改,也可以达到同样效果。在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable ,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。 小贴士: 用 systemd-delta 命令来查看哪些单元文件被覆盖、哪些被修改。系统维护的时候需要及时了解哪些单元已经有了更新。安装 vim-systemd 软件包,可以使 unit 配置文件在 Vim 下支持语法高亮。目标(target)启动级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和启动级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 启动级别的目标,仍可以使用旧的 telinit 启动级别 命令切换。获取当前目标不要使用 runlevel 命令了:$ systemctl list-units --type=target创建新目标在 Fedora 中,启动级别 0、1、3、5、6 都被赋予特定用途,并且都对应一个 systemd 的目标。然而,没有什么很好的移植用户定义的启动级别(2、4)的方法。要实现类似功能,可以以原有的启动级别为基础,创建一个新的目标 /etc/systemd/system/<新目标>(可以参考 /usr/lib/systemd/system/graphical.target),创建 /etc/systemd/system/<新目标>.wants 目录,向其中加入额外服务的链接(指向 /usr/lib/systemd/system/ 中的单元文件)。目标表 SysV 启动级别 Systemd 目标 注释 0 runlevel0.target, poweroff.target 中断系统(halt) 1, s, single runlevel1.target, rescue.target 单用户模式 2, 4 runlevel2.target, runlevel4.target, multi-user.target 用户自定义启动级别,通常识别为级别3。 3 runlevel3.target, multi-user.target 多用户,无图形界面。用户可以通过终端或网络登录。 5 runlevel5.target, graphical.target 多用户,图形界面。继承级别3的服务,并启动图形界面服务。 6 runlevel6.target, reboot.target 重启 emergency emergency.target 急救模式(Emergency shell)切换启动级别/目标systemd 中,启动级别通过“目标单元”访问。通过如下命令切换:# systemctl isolate graphical.target该命令对下次启动无影响。等价于telinit 3 或 telinit 5。修改默认启动级别/目标开机启动进的目标是 default.target,默认链接到 graphical.target (大致相当于原来的启动级别5)。可以通过内核参数更改默认启动级别:systemd.unit=multi-user.target (大致相当于级别3)systemd.unit=rescue.target (大致相当于级别1)另一个方法是修改 default.target。可以通过 systemctl 修改它:# systemctl set-default multi-user.target要覆盖已经设置的default.target,请使用 force:# systemctl set-default -f multi-user.target可以在 systemctl 的输出中看到命令执行的效果:链接 /etc/systemd/system/default.target 被创建,指向新的默认启动级别。


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:09pm
栏目列表