要精准识别“可信的人工安装核心包”,需三步:一、从 /var/log/apt/history.log 提取真实手动安装命令并去噪;二、用 comm 比对排除从未出现在日志中的“伪 manual”包;三、按系统管理、基础工具、安全日志三类定义最小核心集并固化 apt-mark manual。

直接用 apt-mark showmanual 列出的包,不等于“你亲手装过的核心包”。它混入了大量因依赖关系被自动带入、但后来被系统提升为 manual 标记的包。要真正筛出**可信的人工安装核心包**,必须结合日志回溯+语义过滤+人工校验三步走。
第一步:提取真实手动安装记录
Ubuntu 的 /var/log/apt/history.log 是唯一权威来源,记录每次 apt install 命令的完整参数。运行以下命令提取所有明确由用户执行的安装动作:
grep -oP 'Commandline: apt install \K[^ ]+' /var/log/apt/history.log | sort -u- 若需排除常见工具链干扰(如 build-essential、git、curl),可追加过滤:
... | grep -vE '(build-essential|git|curl|wget|vim|nano)' - 结果保存为基线候选列表:
... > ~/manual-install-baseline.txt
第二步:比对并排除“伪手动”包
apt-mark showmanual 输出的是当前标记为 manual 的全部包,其中很多是“被动升格”的——比如你装了 nginx,它依赖 libpcre3,之后又单独装了 python3-pip,系统可能把 libpcre3 也标为 manual(因它同时满足多个包依赖)。这类包不属于你的主动选择。
- 查出哪些 manual 包从未出现在 history.log 中:
comm -23 - 这些就是“疑似冗余 manual 包”,应重点审查是否可卸载(例如
libjpeg-dev、libx11-dev等开发头文件)
第三步:定义最小化核心集并固化标记
最小系统基线不是越少越好,而是保留能支撑运维、诊断、安全更新和基础服务的最小集合。建议保留以下几类(可按需删减):
-
系统管理类:
apt、apt-utils、ca-certificates、curl、gnupg、sudo、systemd-sysv(或sysvinit-core) -
基础工具类:
bash、coreutils、findutils、grep、iproute2、procps、util-linux -
安全与日志类:
logrotate、rsyslog(或syslog-ng-core)、openssh-server(如需远程)
确认后,统一标记为 manual 防止后续 autoremove 误伤:sudo apt-mark manual $(cat core-baseline.txt | tr '\n' ' ')
第四步:生成可审计的最小化基线快照
完成筛选和标记后,导出两个关键清单供长期维护:
- 人工安装主干包:
apt-mark showmanual | comm -12 - 当前系统全部 manual 包(含依赖升格):
apt-mark showmanual | sort > baseline-manual-full-$(date +%F).txt - 对比两次快照,就能看出哪些包是后来被“自动带入并升格”的,便于下次精简时决策











