Systemd提供了许多很好的工具用于查看系统启动情况,也可以控制在系统启动时运行什么,在这篇文章中,将总结Systemd的开机系统优化,以及如何删除系统开机服务。

一、删除开机启动服务

1、查看开机启动项

在过去,你能很容易通过查看 /etc/init.d 了解到哪些服务进程会在引导时启动。Systemd 以不同的方式展现,你可以使用如下命令罗列允许开机启动的服务进程。

$ systemctl list-unit-files --type=service | grep enabled
accounts-daemon.service                    enabled
anacron-resume.service                     enabled
anacron.service                            enabled
bluetooth.service                          enabled
brltty.service                             enabled
[...] 

在此列表顶部,蓝牙服务是冗余项,故无需运行此服务。

2、停止并禁用服务

下面的命令将停止该服务进程,并且使其开机不启动。

$ sudo systemctl stop bluetooth.service // 停止服务
$ sudo systemctl disable bluetooth.service  // 禁用服务

3、确认执行结果

$ systemctl status bluetooth.service
 bluetooth.service - Bluetooth service
  Loaded: loaded (/lib/systemd/system/bluetooth.service; disabled; vendor preset: enabled)
  Active: inactive (dead)
    Docs: man:bluetoothd(8)

4、彻底禁止开机启动

$ sudo systemctl mask bluetooth.service
 Created symlink from /etc/systemd/system/bluetooth.service to /dev/null.

5、查看服务详情

$ systemctl status bluetooth.service

6、彻底删除服务

$ rm -rf /usr/lib/systemd/system/bluetooth.service
$ rm -rf /etc/systemd/system/bluetooth.service
$ systemctl daemon-reload

这样就彻底把不需要的启动项删除了。

7、静态服务说明

通过执行命令可以获得如下服务列表:

$ systemctl list-unit-files --type=service                       
UNIT FILE                                  STATE   
accounts-daemon.service                    enabled
acpid.service                              disabled
alsa-restore.service                       static    
alsa-utils.service                         masked

不能启用或禁用静态服务,因为静态服务被其他的进程所依赖,并不意味着它们自己运行。

二、优化开机启动项

1、几个常见进程的依赖运行

这里举例了几个服务进程的作用。许多服务进程都是发行版特定的,所以你应该看看你的发行版文档(比如通过 google 或 StackOverflow)。

  • accounts-daemon.service 是一个潜在的安全风险。它是 AccountsService 的一部分,AccountsService 允许程序获得或操作用户账户信息。我不认为有好的理由能使我允许这样的后台操作,所以我选择掩盖mask该服务进程。
  • avahi-daemon.service 用于零配置网络发现,使电脑超容易发现网络中打印机或其他的主机,我总是禁用它,别漏掉它。
  • brltty.service 提供布莱叶盲文设备支持,例如布莱叶盲文显示器。
  • debug-shell.service 开放了一个巨大的安全漏洞(该服务提供了一个无密码的 root shell ,用于帮助 调试 systemd 问题),除非你正在使用该服务,否则永远不要启动服务。
  • ModemManager.service 该服务是一个被 dbus 激活的守护进程,用于提供移动宽频broadband(2G/3G/4G)接口,如果你没有该接口,无论是内置接口,还是通过如蓝牙配对的电话,以及 USB 适配器,那么你也无需该服务。
  • pppd-dns.service 是一个计算机发展的遗物,如果你使用拨号接入互联网的话,保留它,否则你不需要它。
  • rtkit-daemon.service 听起来很可怕,听起来像是 rootkit。 但是你需要该服务,因为它是一个实时内核调度器real-time kernel scheduler。
  • whoopsie.service 是 Ubuntu 错误报告服务。它用于收集 Ubuntu 系统崩溃报告,并发送报告到 https://daisy.ubuntu.com 。 你可以放心地禁止其启动,或者永久的卸载它。
  • wpa_supplicant.service 仅在你使用 Wi-Fi 连接时需要。

    2、查看系统启动的日志信息

    Systemd提供了一些命令帮助调试系统开机启动问题,该命令会显示你的系统启动的所有消息。

    $ journalctl -b
    -- Logs begin at 五 2019-09-20 13:31:16 CST, end at 六 2019-10-08 19:43:49 CST. --
    9月 20 13:31:16 localhost.localdomain sshd[4387]: pam_unix(sshd:session): session closed for user root
    9月 20 13:31:16 localhost.localdomain rsyslogd[948]: imjournal: journal reloaded... [v8.24.0-52.el7 try http://www.rsyslog.com/e/0 ]
    9月 20 13:31:16 localhost.localdomain systemd-logind[530]: Removed session 16.
    9月 20 13:31:16 localhost.localdomain sshd[4913]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=106.12.196.118  user=root
    9月 20 13:31:16 localhost.localdomain sshd[4913]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
    [...]
    

    通过命令 journalctl -b -1 可以复审前一次启动,journalctl -b -2 可以复审倒数第 2 次启动,以此类推。

    3、查看某一进程的启动日志

    上述命令会打印出大量的信息,你可能并不关注所有信息,只是关注其中问题相关部分。为此,系统提供了几个过滤器,用于帮助你锁定目标。 让我们以进程号为 1 的进程为例,该进程是所有其它进程的父进程。

    $ journalctl _PID=1
    -- Logs begin at 五 2019-09-20 13:31:16 CST, end at 六 2019-10-08 19:43:49 CST. --
    9月 20 13:31:16 localhost.localdomain systemd[1]: Started Session 17 of user root.
    9月 20 13:31:16 localhost.localdomain systemd[1]: Started Session 18 of user root.
    9月 20 13:31:16 localhost.localdomain systemd[1]: Started Session 19 of user root.
    9月 20 13:31:16 localhost.localdomain systemd[1]: Started Session 20 of user root.
    [...] 
    

    这些打印消息显示了什么被启动,或者是正在尝试启动。

    4、查看服务启动耗时

    $ systemd-analyze blame
         8.708s gpu-manager.service
         8.002s NetworkManager-wait-online.service
         5.791s mysql.service
         2.975s dev-sda3.device
         1.810s alsa-restore.service
         1.806s systemd-logind.service
         1.803s irqbalance.service
         1.800s lm-sensors.service
         1.800s grub-common.service
    

    上述进程中没有出现任何异常,但是如果存在系统启动瓶颈,则该命令将能发现它。

以上就是Systemd的简单使用。