systemd是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本,可以替代 sysvinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等。 systemd 基本工具监视和控制systemd的主要命令是systemctl。该命令可用于查看系统状态和管理系统及服务。详见systemctl(1)。、 提示:在 systemctl 参数中添加 -H <用户名>@<主机名> 可以实现对其他机器的远程控制。该功能使用 SSH 连接。 分析系统状态显示 系统状态: 所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)。查看所有已安装服务: 显示 cgroup slice, 内存和父 PID: 使用单元一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets) 、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由 systemd 管理的计时器(.timer)。详情参阅 systemd.unit(5)。 使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service )。但是有些单元可以在 systemctl 中使用简写方式。 如果无扩展名,systemctl 默认把扩展名当作 .service 。例如 netcfg 和 netcfg.service 是等价的。 挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount 。 设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device 。 注意:有一些单元的名称包含一个 @ 标记(例如: name@string.service ),这意味着它是模板单元 name@.service 的一个 实例。 string 被称作实例标识符,在 systemctl 调用模板单元时,会将其当作一个参数传给模板单元,模板单元会使用这个传入的参数代替模板中的 %I 指示符。 在实例化之前,systemd 会先检查 name@string.suffix 文件是否存在(如果存在,就直接使用这个文件,而不是模板实例化)。大多数情况下,包含 @ 标记都意味着这个文件是模板。如果一个模板单元没有实例化就调用,该调用会返回失败,因为模板单元中的 %I 指示符没有被替换。 提示:
立即激活单元: 立即停止单元: 重启单元: 输出单元运行状态: 电源管理安装 polkit 后才能以普通用户身份使用电源管理。 如果你正登录在一个本地的 systemd-logind 用户会话,且当前没有其它活动的会话,那么以下命令无需 root 权限即可执行。否则(例如,当前有另一个用户登录在某个 tty ), systemd 将会自动请求输入root密码。 重启: $ systemctl reboot $ systemctl poweroff $ systemctl suspend $ systemctl hibernate $ systemctl hybrid-sleep 编写单元文件systemd 单元文件的语法来源于 XDG 桌面项配置文件.desktop文件,最初的源头则是Microsoft Windows的.ini文件。单元文件可以从多个地方加载,systemctl show --property=UnitPath 可以按优先级从低到高显示加载目录: /usr/lib/systemd/system/ :软件包安装的单元 /etc/systemd/system/ :系统管理员安装的单元 注意:当 systemd 运行在用户模式下时,使用的加载路径是完全不同的。 systemd 单元名仅能包含 ASCII 字符,下划线和点号和有特殊意义的字符(’@’, '-’)。其它字符需要用 C-style “\x2d” 替换。参阅 systemd.unit(5) 和 systemd-escape(1) 。 单元文件的语法,可以参考系统已经安装的单元,也可以参考 systemd.service(5) 中的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 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件
修改现存单元文件为了避免和 pacman 冲突,不应该直接编辑软件包提供的文件。有两种方法可以不改动原始文件就做到修改单元文件:创建一个优先级更高的本地单元文件或创建一个片段,应用到原始单元文件之上。两种方法都需要在修改后重新加载单元,用 # systemctl daemon-reload 提示:
替换单元文件要替换 # systemctl reenable unit 或者运行: # systemctl edit --full unit 这将会在记事本中打开 注意:即使 Pacman 更新了新的单元文件,软件包中的版本也不会被使用,所以这个方式会增加系统维护的难度,推荐使用下面一种方法。 附加配置片段要附加配置片段,先创建名为 # systemctl edit unit 这将会在编辑器中打开文件 Note:并不是所有参数都会被子配置文件覆盖。例如要修改 重置到软件包版本要回退单元的变更,使用 # systemctl revert unit 示例例如,如果想添加一个额外的依赖,创建如下文件即可: /etc/systemd/system/<unit>.d/customdependency.conf [Unit] Requires=<新依赖> After=<新依赖> 要修改一个非 /etc/systemd/system/unit.d/customexec.conf [Service] ExecStart= ExecStart=new command 修改 下面是自动重启服务的一个例子: /etc/systemd/system/unit.d/restart.conf [Service] Restart=always RestartSec=30 目标(target)运行级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和运行级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 运行级别的目标,仍可以使用旧的 获取当前目标不要使用 $ systemctl list-units --type=target 创建自定义目标在 sysvinit中有明确定义的运行级别(如:0、1、3、5、6)与 systemd中特定的 目标存在一一对应的关系。然而,对于用户自定义运行级别(2、4)却没有。如需要同样功能,建议你以原有运行级别所对应的 systemd 目标为基础,新建一个 “SysV 运行级别” 与 “systemd 目标” 对照表
切换当前运行目标systemd中,运行目标通过“目标单元”访问。通过如下命令切换: # systemctl isolate graphical.target 该命令仅更改当前运行目标,对下次启动无影响。这等价于sysvinit中的 更改开机默认启动目标开机启动的目标是 用 systemctl检查当前的默认启动目标: # systemctl get-default 用 systemctl修改 $ systemctl set-default multi-user.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target. 另一方法是向bootloader添加内核参数:
默认目标顺序Systemd 根据下面顺序选择
临时文件
临时文件通常和服务文件同时提供,以生成守护进程需要的文件和目录。例如 Samba 服务需要目录 /usr/lib/tmpfiles.d/samba.conf D /run/samba 0755 root root 此外,临时文件还可以用来在开机时向特定文件写入某些内容。比如,要禁止系统从USB设备唤醒,利用旧的 /etc/tmpfiles.d/disable-usb-wake.conf w /proc/acpi/wakeup - - - - USBE 详情参见 注意:该方法不能向 定时器一个定时器是一个以 注意:定时器很大程度上可取代 挂载因为 systemd 也负责按 systemd扩展了 fstab 的传统功能,提供了额外的挂载选项。例如可以确保一个挂载仅在网络已经连接时进行,或者仅当另外一个分区已挂载时再挂载。这些选项通常以 automounting也是一个例子,可以在使用时,而不是启动时挂载分区,详情请参考 fstab#Automount with systemd。 GPT 分区自动挂载在 GPT 分区磁盘系统上,systemd-gpt-auto-generator(8) 会按照 可探测分区规范 进行挂载。可以在 要禁用自动挂载,请修改分区的 类型 GUID 或设置分区属性 63 位 “不自动挂载”,详情参考 gdisk#Prevent GPT partition automounting。 Tips and tricksRunning services after the network is upTo delay a service after the network is up, include the following dependencies in the .servicefile: /etc/systemd/system/foo.service [Unit] ...Wants=network-online.targetAfter=network-online.target ... The network wait service of the particular application that manages the network, must also be enabled so that
For more detailed explanations see Running services after the network is up in the systemd wiki. Enable installed units by default** Reason:How does it work with instantiated units? (Discuss in Talk:Systemd (简体中文)#) Arch Linux ships with If this behavior is not desired, simply create a symlink from Note:Enabling all units by default may cause problems with packages that contain two or more mutually exclusive units. systemctl presetis designed to be used by distributions and spins or system administrators. In the case where two conflicting units would be enabled, you should explicitly specify which one is to be disabled in a preset configuration file as specified in the manpage for Sandboxing application environmentsA unit file can be created as a sandbox to isolate applications and their processes within a hardened virtual environment. systemd leverages namespaces, white-/blacklisting of Capabilities, and control groups to container processes through an extensive execution environment configuration. The enhancement of an existing systemd unit file with application sandboxing typically requires trial-and-error tests accompanied by the generous use of strace, stderr and journalctl error logging and output facilities. You may want to first search upstream documentation for already done tests to base trials on. Some examples on how sandboxing with systemd can be deployed:
疑难解答寻找错误这个例子中的失败的服务是 1.通过 systemd寻找启动失败的服务: $ systemctl --state=failed systemd-modules-load.service loaded failed failed Load Kernel Modules 或者使用 systemd消息: $ journalctl -fp err 2.我们发现了启动失败的 $ systemctl status systemd-modules-load systemd-modules-load.service - Load Kernel Modules Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static) Active: failed (Result: exit-code) since So 2013-08-25 11:48:13 CEST; 32s ago Docs: man:systemd-modules-load.service(8). man:modules-load.d(5) Process: 15630 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=1/FAILURE) 如果没列出 3.现在得到了 PID ,你就可以进一步探查错误的详细信息了.通过下列的命令收集日志,PID 参数是你刚刚得到的 $ journalctl -b _PID=15630 -- Logs begin at Sa 2013-05-25 10:31:12 CEST, end at So 2013-08-25 11:51:17 CEST. -- Aug 25 11:48:13 mypc systemd-modules-load[15630]: Failed to find module 'blacklist usblp'Aug 25 11:48:13 mypc systemd-modules-load[15630]: Failed to find module 'install usblp /bin/false' 4.我们发现有些内核模块的配置文件不正确,因此在 $ ls -Al /etc/modules-load.d/ ... -rw-r--r-- 1 root root 79 1. Dez 2012 blacklist.conf -rw-r--r-- 1 root root 1 2. Mär 14:30 encrypt.conf -rw-r--r-- 1 root root 3 5. Dez 2012 printing.conf -rw-r--r-- 1 root root 6 14. Jul 11:01 realtek.conf -rw-r--r-- 1 root root 65 2. Jun 23:01 virtualbox.conf ... 5.错误消息 /etc/modules-load.d/blacklist.conf # blacklist usblp# install usblp /bin/false 6.最后重新启动 # systemctl start systemd-modules-load 如果服务成功启动,不会有任何输出.如果你还是遇到了错误,回到步骤三,获得新的 PID 来跟踪日志并解决错误. 可以像这样确认服务成功启动: $ systemctl status systemd-modules-load systemd-modules-load.service - Load Kernel Modules Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static) Active: active (exited) since So 2013-08-25 12:22:31 CEST; 34s ago Docs: man:systemd-modules-load.service(8) man:modules-load.d(5) Process: 19005 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=0/SUCCESS) Aug 25 12:22:31 mypc systemd[1]: Started Load Kernel Modules. 诊断启动问题使用如下内核参数引导: 更多有关调试的信息,参见该文。 诊断一个服务如果某个 systemd服务的工作状况不合预期,希望调试的话,设置 在此服务的配置文件片段中加入: [Service] Environment=SYSTEMD_LOG_LEVEL=debug 或者等价的,临时编辑系统单元文件,例如:
重启 systemd-networkd服务,用 关机/重启十分缓慢如果关机特别慢(甚至跟死机了一样),很可能是某个拒不退出的服务在作怪。systemd 会等待一段时间,然后再尝试杀死它。请阅读这篇文章,确认你是否是该问题受害者。 短时进程无日志记录若 禁止在程序崩溃时转储内存要使用老的内核转储,创建下面文件: /etc/sysctl.d/49-coredump.conf kernel.core_pattern = core kernel.core_uses_pid = 0 然后运行: # /usr/lib/systemd/systemd-sysctl 同样可能需要执行“unlimit”设置文件大小: $ ulimit -c unlimited 更多信息请参阅 sysctl.d 和 /proc/sys/kernel 文档。 启动的时间太长不少用户用了 有些用户的问题是 systemd-tmpfiles-setup.service 在启动时启动失败从 systemd 219 开始, 参阅 Access Control Lists#Enabling ACL 获得如何包含 启动时显示的 systemd 版本和安装版本不一致需要 重新生成 initramfs。 提示:可以使用 pacman 钩子在更新 systemd时重新生成 initramfs。参考 这个帖子 和 Pacman#Hooks. 禁用远程机器的 emergency 模式如果远程机器位于云主机,emergency 模式会导致系统无法远程连接,可以通过下面方式禁用紧急模式: # systemctl mask emergency.service # systemctl mask emergency.target 转载于:https://blog.51cto.com/19910312/2379860 |
|
来自: imnobody2001 > 《Linux》