原文章撰写于 2016年5月18日,请注意时效性。

一般的通用 Linux 发行版都会在启动时启动各种各样的东西,包括许多不需要运行的服务。蓝牙、Avahi、ModemManager、ppp-dns......这些都是什么东西,谁需要它们?

Systemd 提供了很多很好的工具,用于查看系统启动过程中发生了什么,并控制启动时的启动项。在本文中,我将介绍如何关闭 Systemd 发行版上的启动垃圾。

查看引导服务 (View Boot Services)

在过去,你可以通过查看 /etc/init.d 轻松查看哪些服务被设置为在启动时启动。你可以使用下面的咒语列出已启用的启动服务:

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
[...]

在靠近顶部的位置,是我不喜欢的一个东西:蓝牙。我不在电脑上使用它,也不需要它运行。下面的命令可以停止蓝牙,然后禁止它在启动时启动:

$ sudo systemctl stop bluetooth.service
$ sudo systemctl disable bluetooth.service

您可以通过检查 bluetooth服务 的状态来确认:

$ 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)

被禁用的服务可以由其他服务启动。如果你真的不想让它运行,又不想卸载它,那么你可以屏蔽(译者:mask,可理解为给服务给“遮蔽”住)它,防止它在任何情况下启动:

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

一旦确认禁用某项服务没有不良副作用,就可以选择卸载该服务。

您可以生成一份所有服务的列表:

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

您不能启用或禁用静态服务,因为这些服务依赖于其他 systemd 服务,不能单独运行。

我能禁用这些服务吗?

如何知道哪些是您需要的,哪些是可以安全禁用的?这始终取决于您的具体设置。

以下是部分服务及其用途。许多服务是针对发行版的,因此请随身携带发行版文档(如 Google 和 Stack Overflow)。

  • accounts-daemon.service 是一个潜在的安全风险。它是 AccountsService 的一部分,允许程序获取和操作用户账户信息。我想不出允许这种幕后操作的好理由,所以我屏蔽了它。
    (译者询问的GPT4:/usr/libexec/accounts-daemon 是由 AccountsService 提供的后台服务程序。AccountsService 是一个架构设计为在 DBus 上提供关于用户账户信息的轻量级服务框架。
    它是为了解决如何在不同的会话、服务和工具之间共享、缓存和查询账户信息这一问题而设计的。AccountsService 可以提供关于系统中用户账户的信息,包括可以登录的用户列表,各个用户的语言环境,是否自动登录,Home 目录位置,用户头像等。
    这个守护进程,accounts-daemon,一般会在系统启动时由 systemd 或其他初始化系统启动,然后运行在后台,以请求处理和响应其他进程的查询。
    这意味着各种不同的程序,例如登录管理器、设置应用程序、邮件服务器等,都可以通过 AccountsService 查询和(在适当的权限下)修改用户账户信息。这使得用户账户信息的管理变得更为集中和一致,并且无需每次都从 /etc/passwd 文件或类似的地方进行解析。)
  • avahi-daemon.service 本应提供零配置的网络发现功能,使查找网络上的打印机和其他主机变得超级简单。我总是禁用它,而且并不想念它。
  • brltty.service 提供盲文设备支持,例如盲文显示器。
  • debug-shell.service 会打开一个巨大的安全漏洞,除非你正在使用它,否则绝对不能启用。它提供了一个无需密码的 root shell,有助于调试 systemd 问题。
  • ModemManager.service 是一个 DBus 激活的守护进程,用于控制移动宽带(2G/3G/4G)接口。如果您没有移动宽带接口(内置接口、通过蓝牙与手机配对的接口或 USB 加密狗),则不需要它。
  • pppd-dns.service 已成为过去式。如果您使用拨号上网,请保留它。否则,你就不需要它了。
  • rtkit-daemon.service 听起来很吓人,就像 rootkit,但你需要它,因为它是实时内核调度程序。
  • whoopsie.service 是 Ubuntu 的错误报告服务。它会收集崩溃报告并发送至 https://daisy.ubuntu.com。您可以安全地禁用它,也可以通过卸载 apport 将其永久删除。
  • wpa_supplicant.service 只有在使用 Wi-Fi 网络接口时,才需要启用。

启动过程中会发生什么(What Happens During Bootup)

Systemd 有一些命令可以帮助调试启动问题。该命令可重新显示出所有启动信息:

$ journalctl -b

-- Logs begin at Mon 2016-05-09 06:18:11 PDT, 
end at Mon 2016-05-09 10:17:01 PDT. --
May 16 06:18:11 studio systemd-journal[289]: 
Runtime journal (/run/log/journal/) is currently using 8.0M.
Maximum allowed usage is set to 157.2M.
Leaving at least 235.9M free (of currently available 1.5G of space).
Enforced usage limit is thus 157.2M.
[...]

您可以使用 journalctl -b -1 查看以前的启动情况,它会显示上一次启动;journalctl -b -2 显示两次启动前的情况,以此类推。

它会输出大量内容,这些内容很有趣,但可能并不那么有用。它有几个过滤器,可以帮助你找到想要的内容。让我们看看 PID 1,它是所有其他进程的父进程:

$ journalctl _PID=1

May 08 06:18:17 studio systemd[1]: Starting LSB: Raise network interfaces....
May 08 06:18:17 studio systemd[1]: Started LSB: Raise network interfaces..
May 08 06:18:17 studio systemd[1]: Reached target System Initialization.
May 08 06:18:17 studio systemd[1]: Started CUPS Scheduler.
May 08 06:18:17 studio systemd[1]: Listening on D-Bus System Message Bus Socket
May 08 06:18:17 studio systemd[1]: Listening on CUPS Scheduler.
[...]

这显示了启动的内容 ---- 或试图启动的内容。

最有用的工具之一是 systemd-analyze blame,它可以显示哪些服务启动时间最长。

$ 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

voyage200
1 声望0 粉丝