精简 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
sudo apt remove linux-firmware-nvidia-graphics

一按回车,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
2
3
4
5
6
7
8
9
10
11
12
# 1. 先把自己要保留的子包标记为手动安装,防止被当作自动依赖清掉
sudo apt-mark manual \
linux-firmware-intel-graphics \
linux-firmware-intel-misc \
linux-firmware-intel-wireless \
linux-firmware-misc \
linux-firmware-realtek \
linux-firmware-amd-misc \
firmware-sof-signed

# 2. 同一事务安装桩包,务必带 --no-install-recommends
sudo apt-get install --no-install-recommends -y linux-firmware-minimal

--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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 只读体检:系统信息、固件包及大小、非 Intel 硬件、Wi-Fi/蓝牙、在用驱动、磁盘占用
scripts/firmware-slim audit

# 预览事务,不落盘
scripts/firmware-slim plan

# 真正执行,需要输入 yes 确认
scripts/firmware-slim apply

# 无 TTY 场景(比如 CI / 脚本里)
scripts/firmware-slim apply --yes

# 只针对单个节点
scripts/firmware-slim apply --node jumper

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 已安装的固件包清单
dpkg -l 'linux-firmware-*' | awk '$1=="ii" {print $2, $3}'

# 2. 确认内核升级链路还活着
dpkg -l linux-image-generic

# 3. 磁盘占用
df -h /

# 4. 重启后查固件加载情况
journalctl -k -b | grep -iE 'firmware|iwlwifi|i915|GuC|HuC'

第 4 步是真正的验收:只要 `iwlwifi` 和 i915 GuC/HuC 没报固件加载失败,无线和核显就是好的。

回滚也很简单,两条路:

# 单独装回某个厂商包(推荐)
sudo apt-get install --no-install-recommends -y linux-firmware-realtek

# 或者装回元包(注意:它会和 linux-firmware-minimal 冲突)

🐾 注意: 以后要是给节点加了新硬件(比如插了块 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 这种每一寸存储都要精打细算的场景,这笔账挺划算的。

删繁就简三秋树,固件这事儿,也是同一个道理。

以上。


📚️参考文档:


精简 Linux 固件包:每个 N100 节点省下约 450 MB
https://ewhisper.cn/posts/22759/
作者
东风微鸣
发布于
2026年10月10日
许可协议