原文章撰写于 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。