精简 Linux 固件包:每个 N100 节点省下约 450 MB
本文最后更新于:2026年10月10日 上午
前言
特别说明,本文对应的操作实际时间在 ubuntu 升级 26.04 之前。
手痒,最近又在折腾 HomeLab 里那四台 N100 小主机。
我装 homelab 最后悔的就是跟着上游,也只给系统分了 64G 的存储空间,1TB 的盘剩下的空间全给 Rook Ceph 了。导致现在的系统空间捉襟见肘,容器镜像/apt 包/缓存/… 一多, 随随便便磁盘空间就到 85% 以上了。🤣
它们跑的是 Ubuntu 24.04.5 + K3s,系统盘被我搞得抠抠搜搜,某天 df -h 一看,根分区又快到红线了。顺着 dpkg -l | grep firmware 摸下去,好家伙,一堆我压根没有对应硬件的厂商固件包,正稳稳当当躺在 /lib/firmware 里吃灰。
Ubuntu 24.04 起,linux-firmware 已经不是一个大包了,而是变成了元包,背后拉了 18 个厂商子包。26.04.1 沿用同一套布局。问题在于:我这四台机器上只有 Intel 核显、Intel 无线、Realtek 网卡这几样东西,剩下的 NVIDIA、Mellanox、Marvell、Qualcomm…… 全是陪跑的。
清掉它们,每个节点大约能省 450 MB,顺带还不用再下载这些厂商的固件更新。听起来很香,但说实话,第一版我差点把节点的内核升级给搞没了。😂
📝声明: 本文操作基于我自己的 HomeLab 四节点环境,不是通用发行版指南。动手前请先确认你自己的硬件清单。
先看清楚:Ubuntu 24.04 的固件包长什么样
拆分后的结构大致是这样:
| 类型 | 包名 | 说明 |
|---|---|---|
| 元包 | linux-firmware |
空壳,依赖 18 个厂商子包 |
| 子包 | linux-firmware-<vendor>-<type> |
实际装固件文件 |
| 独立包 | firmware-sof-signed |
声卡 DSP 固件,不走元包 |
| 微码 | amd64-microcode |
注意,这货也是个坑,后面说 |
关键点在于:元包本身没内容,它只是一个依赖入口。而 linux-image-generic 依赖这个元包。后面所有麻烦都是从这儿来的。
坑:为什么不能直接 apt remove
我一开始的想法很朴素:不要哪个删哪个呗。
1 | |
一按回车,apt 给出的方案让我头皮发麻:它要连带移除 linux-firmware 元包,然后是 linux-generic,然后是 linux-image-generic。
📝Notes: 这意味着节点会静默地停止接收内核升级。不是报错,不是告警,就是以后
apt upgrade再也不给你更新内核了。等你哪天想起来要打一个内核 CVE 补丁,才会发现这机器已经掉队几个月了。
这就是个 "埋雷式" 故障,当下一切正常,炸的时候你已经忘了自己干过什么。👎
正确姿势:同一事务里用桩包替换元包
思路其实很清晰:既然 linux-image-generic 需要的是 " 有一个东西满足 linux-firmware 这个依赖 ",那我给它一个空壳就行。
Ubuntu 提供了 linux-firmware-minimal,一个空的桩包,声明了 Conflicts/Replaces/Provides: linux-firmware。在同一次 apt 事务中安装它,apt 就能在解掉元包依赖的同时,把 18 个子包一起清掉,而不会动到 linux-image-generic。
1 | |
--no-install-recommends 这一步是必须的,不是可选项。因为 linux-firmware-minimal 会 recommend 全部 18 个子包。你不加这个参数,apt 会非常热情地把刚删掉的固件又给你装回来,白忙一场。🫣
保留与移除清单
这是我四台 N100 节点的实际取舍,供参考:
保留(约 300 MB 上下)
| 包 | 保留理由 |
|---|---|
linux-firmware-intel-graphics |
内核命令行设了 i915.enable_guc=2,需要 i915 GuC / HuC 固件 |
linux-firmware-intel-misc |
Intel 平台杂项固件 |
linux-firmware-intel-wireless |
iwlwifi 与蓝牙,CNVi 8086:54f0 / jumper 节点的 AX201 |
linux-firmware-misc |
通用固件,体积不大,留着兜底 |
linux-firmware-realtek |
jumper 节点的 RTL8111 / RTL8125 网卡 |
linux-firmware-amd-misc |
只有 257 KB,懒得纠结 |
firmware-sof-signed |
独立包,声卡 DSP |
移除(合计约 450 MB)
| 包 | 体积 | 理由 |
|---|---|---|
linux-firmware-nvidia-graphics |
106 MB | 集群里没有 NVIDIA 卡 |
linux-firmware-mellanox-spectrum |
79 MB | 没有 Mellanox 网卡 |
linux-firmware-marvell-prestera |
73 MB | 没有 Marvell DPU |
linux-firmware-qualcomm-misc |
59 MB | 没有高通硬件 |
linux-firmware-qualcomm-wireless |
47 MB | 同上 |
linux-firmware-amd-graphics |
29 MB | 没有 AMD 独显 |
linux-firmware-mediatek |
24 MB | 没有联发科硬件 |
linux-firmware-qlogic |
13 MB | 没有 QLogic HBA |
linux-firmware-broadcom-wireless |
11 MB | 没有博通无线 |
linux-firmware-marvell-wireless |
7 MB | 同上 |
linux-firmware-qualcomm-graphics |
7 MB | 同上 |
linux-firmware-netronome |
6 MB | 同上 |
判断标准就一句话:audit 报告里认不出来的硬件,对应固件一律不保留。
封装成 audit / plan / apply 三步
手动敲一遍还行,四台节点来回敲就纯属自虐了。我把它封成了 scripts/firmware-slim,三步走:
1 | |
plan 这一步是我最看重的:它用 apt-get -s 做模拟,一旦发现事务会移除 linux-generic 或 linux-image-generic,直接拒绝继续。这等于把前面那个 "静默失去内核升级" 的雷,硬编码成了一道闸门。👍
apply 则按节点依次执行:apt-mark manual 标记保留包 → 重跑模拟 → 异常就中止 → 执行安装 → 打印剩余固件包、linux-image-generic 状态和磁盘占用。
两个事后防护,别偷懒
第一,别跑 apt autoremove。
元包消失之后,apt 会认为那些被保留的子包 "不再被需要"。你一个 autoremove 下去,i915 和 Wi-Fi 固件就没了。重启之后大概率是黑屏或者没网,而且你还不一定第一时间联想到是固件被删了。所以脚本会先 apt-mark manual 把保留包钉死。
第二,amd64-microcode 别动。
这货看起来人畜无害,可它同样是 linux-image-generic 的依赖。移除它,会遇到和 linux-firmware 元包一模一样的连带问题。保持原样就对了。
验证与回滚
改完之后别急着关终端,按顺序验证一遍:
1 | |
🐾 注意: 以后要是给节点加了新硬件(比如插了块 NVIDIA 卡),装回对应子包即可,不需要重启整个集群。但千万别图省事去重装
linux-firmware元包,它会和linux-firmware-minimal冲突,还会把 18 个子包一次性全拉回来,前面白干。
总结
回头看这件事,真正的技术难点其实不在 "删哪个包",而在搞清楚 apt 的依赖图:
- Ubuntu 24.04 起
linux-firmware是元包,linux-image-generic依赖它 - 直接
apt remove子包 = 连带移除内核升级链路,静默埋雷 - 正确做法是同一事务装
linux-firmware-minimal桩包,且必须--no-install-recommends - 事后
apt-mark manual+ 不跑autoremove,才能守住保留的固件 amd64-microcode同样碰不得,原因一模一样
四台节点,每台省下约 450 MB,还少下载一堆永远用不上的厂商固件更新。对于 HomeLab 这种每一寸存储都要精打细算的场景,这笔账挺划算的。
删繁就简三秋树,固件这事儿,也是同一个道理。
以上。
📚️参考文档:
- Ubuntu
linux-firmware包拆分说明(Ubuntu Packages / Launchpad) apt-mark(8)、apt-get(8)手册页east4ming/homelab2仓库scripts/firmware-slim脚本源码- Ubuntu 24.04 splits firmware packages for faster updates