level 13
顶帖帝
楼主
依赖需求
systemctl show 命令提供了一些关于正在运行的单位和它们正在执行的任务的内部信息,以及关于 systemd 依赖于哪些单位来启用多用户模式的信息。
systemctl show -p Wants multi-user.target
其他的目标也可能显示在输出中,如 multi-user.target 依赖于 basic.target。而后者又依赖于 sysinit.target,sysinit.target 依赖于 local-fs.target。这三个目标用于管理系统的基本配置,包括挂载文件系统和启动 udev。为指定对于基本目标(basic target)的依赖,单位配置文件 multi-user.target 包含了如下语句:
Requires=basic.targetAfter=basic.target
在使用 Requires 的同时指定 After 一行,systemd 就会知道它必须不仅启用该目标,而且需等待该目标完全启动后再继续进行其他任务。
Wants 是 Requires 的稍弱形式的替代语句,systemd 也会启用这些单位,但即使这些单位不能启动也会继续启动系统。这一类依赖也可以通过链接到单位文件来指定,单位文件位于含有该单位的路径、名称和一个 .wants的目录下。你可以使用 ls 或 systemctl 的 show 命令:
ls /*/systemd/system/multi-user.target.wants/systemctl show -p Wants multi-user.target关闭服务
如果你想要通过挂起 NTPD 服务单位来让系统在启动时不通过 NTP 来同步系统时间,你可以使用下面的方式:
systemctl disable ntpd.service
在这里,systemctl 仅仅是移除了到 Wants 目录下面的服务单位的链接;同理,可用 systemctl enable 命令来创建一个链接以激活一项服务。也可以不使用 systemctl 而以手动创建(移除)链接的方式激活(挂起)单位。
如果一项服务是由传统的初始化脚本而不是单位来启动的,systemctl 则将这个激活要求递交给 update-rc.d 程序。如在 Linux Deepin 中安装 Apache 和使用 systemctl 激活它时就是这种情况。反过来, update-rc.d 也可将任务授权给 systemctl 来完成,但这只是个别情况,请读者最好不用或谨慎使用。
服务的激活与挂起在该服务下一次启动或系统关闭后生效;下面的命令用来立即启动一项服务:
systemctl start ntpd.service
对于使用 sysvinit 的发行版,与之对应的命令是 service ntpd start。在 systemctl 命令之后使用 stop 参数来代替 start 则为停止一项服务。使用systemctl status 命令可以传达该单位的信息,如当前状态及与该单位的对应的配置文件。该程序也告诉我们该服务现在是否正在运行,如果正在运行的话,会显示运行了多长时间,以及有哪些进程属于它,并明晰地显示出主进程。
通过由 systemctl 创建的控制组可以很容易地找出是哪项服务启动了哪些进程。system-cgls 可显示由 systemd 创建的 cgroup 层次(hierarchy)。也可用ps命令显示组从属关系(group affiliation)
ps xaw -eo pid,args,cgroup

问题解决停在启动行界面
如果在启动时出现可能与 systemd 直接或间接相关的问题,请用以下参数启动 kernel:
systemd.log_target=kmsg systemd.log_level=debug
systemd 会识别这些参数并在终端提供全面的故障排除信息。同时,该信息也会保存在由 dmesg 创建的内核通知缓冲存储区(kernel notification buffer)以备过后分析。
命令行程序 poweroff、halt 及 reboot 是 systemd 的一部分,但也可以使用 systemctl 的命令关闭或重新启动系统。也可以这样重启系统:
systemctl kexec
在所有服务被终止后,systemd 告诉正在运行的内核直接启动一个预先配置好的 Linux 内核,这会让系统快速重新启动,因为它会直接跳过BIOS和引导装载程序,如果没有一个配置好的 kexec 内核,systemd 则会执行正常的重新启动过程。
深入探究
对于标准的管理任务来说,你通常只会接触到服务单位和目标单位;对于更深层的 systemd 功能,或是要在系统启动时做到像使用 sysvinit 和 upstart 的发行版使用脚本管理系统那样管理好系统启动,其他的单位就也显得很重要了。这些任务包括挂载 /etc/fstab 中指定的文件系统,激活交换分区及不定时清理临时文件目录。
对于其中的挂载任务,systemd 有一个自动挂载功能,可以为 /etc/fstab 中配置的挂载点创建虚拟挂载点(phseudo mount point)。虚拟挂载点直到存取时才真正挂载。在 /etc/fstab 中加入 comment=systemd.automount 一行可把任一挂载点变为自动挂载点。这样可以加快启动过程。这对于读取网络共享很有用,因为 WLAN 连接直到用户使用 NetworkManager 时才被建立。
寻找答案
systemctl 可以用来在不知道一服务的 PID 时告诉 systemd 去发出信号。比如,下面的命令会让 rsyslogd 进入调试模式(debug mode),当你再次输入这个命令时,该服务会停止:
systemctl kill --signal=USR1 rsyslogd.service
如果你不指定发送哪一个信号,systemctl 会发送一个标准终止信号,会终止属于一服务的所有进程。
systemd-analyze 命令会告诉你系统启动所用时间及其中有多少时间是用在内核、initramfs及由 systemd 控制的用户级配置上。
如果你想更深入地查看后一因素,可使用 systemd-analyze blame 来获知各个单位的启动时间。如需知道关于启动过程的更为详细的信息,该程序可创建一个用图表展示单位启动的 SVG 文件:
systemd-analyze plot > plot.svg

2014年09月23日 14点09分
1
systemctl show 命令提供了一些关于正在运行的单位和它们正在执行的任务的内部信息,以及关于 systemd 依赖于哪些单位来启用多用户模式的信息。
systemctl show -p Wants multi-user.target
其他的目标也可能显示在输出中,如 multi-user.target 依赖于 basic.target。而后者又依赖于 sysinit.target,sysinit.target 依赖于 local-fs.target。这三个目标用于管理系统的基本配置,包括挂载文件系统和启动 udev。为指定对于基本目标(basic target)的依赖,单位配置文件 multi-user.target 包含了如下语句:
Requires=basic.targetAfter=basic.target
在使用 Requires 的同时指定 After 一行,systemd 就会知道它必须不仅启用该目标,而且需等待该目标完全启动后再继续进行其他任务。
Wants 是 Requires 的稍弱形式的替代语句,systemd 也会启用这些单位,但即使这些单位不能启动也会继续启动系统。这一类依赖也可以通过链接到单位文件来指定,单位文件位于含有该单位的路径、名称和一个 .wants的目录下。你可以使用 ls 或 systemctl 的 show 命令:
ls /*/systemd/system/multi-user.target.wants/systemctl show -p Wants multi-user.target关闭服务
如果你想要通过挂起 NTPD 服务单位来让系统在启动时不通过 NTP 来同步系统时间,你可以使用下面的方式:
systemctl disable ntpd.service
在这里,systemctl 仅仅是移除了到 Wants 目录下面的服务单位的链接;同理,可用 systemctl enable 命令来创建一个链接以激活一项服务。也可以不使用 systemctl 而以手动创建(移除)链接的方式激活(挂起)单位。
如果一项服务是由传统的初始化脚本而不是单位来启动的,systemctl 则将这个激活要求递交给 update-rc.d 程序。如在 Linux Deepin 中安装 Apache 和使用 systemctl 激活它时就是这种情况。反过来, update-rc.d 也可将任务授权给 systemctl 来完成,但这只是个别情况,请读者最好不用或谨慎使用。
服务的激活与挂起在该服务下一次启动或系统关闭后生效;下面的命令用来立即启动一项服务:
systemctl start ntpd.service
对于使用 sysvinit 的发行版,与之对应的命令是 service ntpd start。在 systemctl 命令之后使用 stop 参数来代替 start 则为停止一项服务。使用systemctl status 命令可以传达该单位的信息,如当前状态及与该单位的对应的配置文件。该程序也告诉我们该服务现在是否正在运行,如果正在运行的话,会显示运行了多长时间,以及有哪些进程属于它,并明晰地显示出主进程。
通过由 systemctl 创建的控制组可以很容易地找出是哪项服务启动了哪些进程。system-cgls 可显示由 systemd 创建的 cgroup 层次(hierarchy)。也可用ps命令显示组从属关系(group affiliation)
ps xaw -eo pid,args,cgroup

问题解决停在启动行界面如果在启动时出现可能与 systemd 直接或间接相关的问题,请用以下参数启动 kernel:
systemd.log_target=kmsg systemd.log_level=debug
systemd 会识别这些参数并在终端提供全面的故障排除信息。同时,该信息也会保存在由 dmesg 创建的内核通知缓冲存储区(kernel notification buffer)以备过后分析。
命令行程序 poweroff、halt 及 reboot 是 systemd 的一部分,但也可以使用 systemctl 的命令关闭或重新启动系统。也可以这样重启系统:
systemctl kexec
在所有服务被终止后,systemd 告诉正在运行的内核直接启动一个预先配置好的 Linux 内核,这会让系统快速重新启动,因为它会直接跳过BIOS和引导装载程序,如果没有一个配置好的 kexec 内核,systemd 则会执行正常的重新启动过程。
深入探究
对于标准的管理任务来说,你通常只会接触到服务单位和目标单位;对于更深层的 systemd 功能,或是要在系统启动时做到像使用 sysvinit 和 upstart 的发行版使用脚本管理系统那样管理好系统启动,其他的单位就也显得很重要了。这些任务包括挂载 /etc/fstab 中指定的文件系统,激活交换分区及不定时清理临时文件目录。
对于其中的挂载任务,systemd 有一个自动挂载功能,可以为 /etc/fstab 中配置的挂载点创建虚拟挂载点(phseudo mount point)。虚拟挂载点直到存取时才真正挂载。在 /etc/fstab 中加入 comment=systemd.automount 一行可把任一挂载点变为自动挂载点。这样可以加快启动过程。这对于读取网络共享很有用,因为 WLAN 连接直到用户使用 NetworkManager 时才被建立。
寻找答案
systemctl 可以用来在不知道一服务的 PID 时告诉 systemd 去发出信号。比如,下面的命令会让 rsyslogd 进入调试模式(debug mode),当你再次输入这个命令时,该服务会停止:
systemctl kill --signal=USR1 rsyslogd.service
如果你不指定发送哪一个信号,systemctl 会发送一个标准终止信号,会终止属于一服务的所有进程。
systemd-analyze 命令会告诉你系统启动所用时间及其中有多少时间是用在内核、initramfs及由 systemd 控制的用户级配置上。
如果你想更深入地查看后一因素,可使用 systemd-analyze blame 来获知各个单位的启动时间。如需知道关于启动过程的更为详细的信息,该程序可创建一个用图表展示单位启动的 SVG 文件:
systemd-analyze plot > plot.svg
