在运维 Linux 服务器时,经常会遇到这样的问题:
系统里注册了大量 systemd 服务,但其中绝大多数属于操作系统自带组件,而真正由管理员后期安装、配置过的服务却被淹没在其中。
如果无法区分这两类服务,就很难判断哪些服务是业务依赖,哪些是历史遗留或冗余组件。
本文以一台 Ubuntu 服务器为例,系统性地展示如何识别「用户自行安装的服务」,包括正在运行和已经停用但仍然存在的部分。
一、为什么 running 列表不够用
很多人会使用:
systemctl list-units --type=service --state=running
来查看系统当前运行的服务。
这个命令只能回答一个问题:
“现在有哪些服务在跑?”
但它完全无法反映以下信息:
- 过去安装过、现在未运行的服务(如 V2Ray、FRP)
- 被禁用但仍然存在的代理、守护进程
- 旧环境残留的 unit 文件
因此,仅依赖 running 视图会得出错误结论,例如误以为系统“只有 Apache 和 MySQL”。
二、真正的总清单:所有已注册的服务
systemd 中,所有服务的定义都存放在 unit files 中,可以通过:
systemctl list-unit-files --type=service
获得完整列表。
这个列表显示:
- 所有 systemd 认识的服务
- 是否 enabled / disabled / static / masked
在示例服务器中,共列出了 249 个 unit 文件。
但其中绝大多数是 Linux 与 Ubuntu 自带组件(systemd、udev、networkd、fsck、plymouth 等),需要进一步过滤。
三、用服务内容反推系统画像
通过分析 unit 文件,可以反推出这台服务器的历史和用途:
1. Web 与数据库业务
apache2.service
apache-htcacheclean.service
mysql.service
ssl-cert.service
phpsessionclean.service
这是一套典型的 LAMP Web 服务器栈。
2. 代理与内网穿透(管理员自行安装)
v2ray.service
v2ray@.service
frpc.service
这些服务在当前并未运行,但它们的 unit 文件仍然存在,说明该系统曾被用作代理或内网穿透节点。
3. 虚拟机环境
open-vm-tools.service
vgauth.service
vmtoolsd.service
说明系统运行在 VMware 虚拟化环境中,或至少从 VMware 镜像迁移而来。
4. 树莓派生态
rpi-eeprom-update.service
该服务仅在 Raspberry Pi 或其镜像系统中存在,说明系统基于 RPi 生态构建。
5. Ubuntu Cloud / Pro 组件
cloud-init.service
cloud-config.service
cloud-final.service
ubuntu-advantage.service
ua-reboot-cmds.service
ua-timer.service
表明系统来自 Ubuntu cloud 镜像,并启用了 Pro / Advantage 框架。
6. Snap 子系统
snapd.service
snapd.apparmor.service
snapd.seeded.service
snapd.system-shutdown.service
snapd.autoimport.service
snapd.core-fixup.service
…
Snap 是 Canonical 提供的独立包管理体系,它引入了后台守护进程和 loop 挂载设备,并非 Linux 核心组件。
四、什么是“系统自带”,什么是“管理员安装”
在本次分析中,已明确排除了以下类别作为系统自带:
- 所有
systemd-* - 所有
dbus-* - 所有
getty* - 所有
udev* - 所有
networkd / resolved / timesyncd - 所有
fsck / initrd / tmpfiles - 所有
lvm / mdadm / cryptdisks - 所有
wpa_supplicant - 所有
avahi / polkit / rsyslog / cron - 所有
motd / logrotate / man-db - 所有
xfs_scrub / e2scrub
这些构成了操作系统的“骨架”。
剩下的部分,就是该服务器在其生命周期中被人为添加的功能层。
五、这台服务器的真实结构
通过 systemd 服务反推,该服务器并不是一台“纯净 Ubuntu”,而是:
Ubuntu Cloud 镜像
- VMware 虚拟机
- Raspberry Pi 生态
- Apache / MySQL Web 服务
- 曾启用 V2Ray 与 FRP
- 启用了 Snap 子系统
这也解释了为什么系统中会同时存在:
- cloud-init
- vmtools
- rpi-eeprom
- v2ray/frpc
- snapd
六、结语
systemctl list-units 只能看到“现在在跑什么”,
而 systemctl list-unit-files 才能看清“这台机器经历过什么”。
对一台长期运行、迁移过环境、承担过多种角色的服务器来说,
真正重要的是识别:
哪些服务是当前业务必须的,
哪些是历史残留,
哪些正在悄悄占用资源或制造不确定性。
这一步,是将系统从“能用”升级为“可控”的关键。