首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Ubuntu N100节点固件精简实战:省下450MB磁盘空间
📅 2026/10/14 20:11:32
✍️ 爱科研究院
👁 阅读 3,247
1. 从一次磁盘告警说起为什么我要对 N100 节点的固件包动刀手里管着几台 N100 小主机做边缘节点配置是 16GB 内存加 256GB 的固态系统清一色 Ubuntu Server。按理说这个配置跑轻量服务绰绰有余但上个月连续两台机器报了根分区使用率超过 85% 的告警。登上去一看/usr/lib/firmware这个目录占掉了将近 1.2GB而整块系统盘实际可用空间本来就不宽裕再叠加容器镜像和日志空间很快就见底了。这件事让我意识到一个问题Ubuntu 默认安装的 linux-firmware 包对绝大多数实际部署场景来说塞了太多根本用不上的固件。N100 这类低功耗平台硬件组成非常固定——核显、几个 USB 控制器、一个或两个网卡、NVMe 存储控制器就这些。但发行版为了兼容市面上所有可能的硬件把 AMD、NVIDIA、各种无线网卡、蓝牙芯片、电视卡、声卡 DSP 的固件全打包进去了。这些文件在 N100 上永远不会被加载纯粹是占着磁盘。于是我做了一轮精简实验目标很明确在不影响 N100 节点正常启动和硬件识别的前提下把固件包体积压到最小。最终结果是每个节点省下约 450MB 的磁盘空间根分区使用率从 85% 降到了 60% 出头。这篇文章就把整个思路、操作步骤、踩过的坑和验证方法完整记录下来适合手里有类似小主机、边缘设备或者对系统精简有需求的读者参考。需要先说明一点精简固件是有风险的操作删错了文件可能导致某个硬件在重启后无法工作严重的话甚至进不了系统。所以下面的每一步我都会强调先确认、再操作、留后路的原则你照着做的时候千万别跳步。2. 先搞清楚 /usr/lib/firmware 里到底装了什么2.1 固件包的本质内核驱动和硬件之间的翻译文件很多人对固件的理解比较模糊这里用个类比说清楚。内核里的驱动程序相当于一个翻译官它知道怎么跟某款硬件芯片对话。但有些硬件芯片在启动时需要先加载一段厂商提供的二进制代码才能正常工作这段代码就是固件firmware。驱动负责把固件喂给硬件硬件加载完固件后才真正开始干活。所以固件不是驱动本身而是驱动运行所需的配套数据。比如某款无线网卡内核里有它的驱动模块但驱动初始化时会去/usr/lib/firmware找对应的.bin或.fw文件找不到就报错网卡就用不了。这就解释了为什么不能无脑删——你得知道哪些硬件真的存在哪些固件真的会被请求。在 Ubuntu 上这些文件由linux-firmware这个包提供另外还有一些厂商单独拆出来的包比如linux-firmware-*系列。用下面这条命令可以看清楚占用情况dpkg -L linux-firmware | grep -v /$ | wc -l du -sh /usr/lib/firmware du -sh /usr/lib/firmware/* | sort -rh | head -30第一条统计文件数量第二条看总大小第三条按目录列出占用最大的前 30 项。我第一次跑的时候排在前面的几个目录是amdgpu、i915、nvidia、mellanox、qcom、brcm加起来占了七成以上空间。而 N100 用的是 Intel 核显对应的是i915目录其他几个大块头基本跟我无关。2.2 N100 平台真正需要的固件清单N100 是 Intel 的低功耗处理器集成 UHD Graphics 核显主板通常搭配 Realtek 或 Intel 的千兆/2.5G 网卡存储走 NVMe 或 SATA。基于这个硬件构成我梳理了一份必需固件清单固件目录/文件用途N100 是否需要i915/Intel 核显固件需要rtl_nic/Realtek 有线网卡固件视网卡型号而定intel/Intel 网卡、蓝牙等固件视具体芯片而定nvidia/NVIDIA 显卡固件不需要amdgpu/AMD 显卡固件不需要mellanox/高速网卡固件不需要qcom/高通无线/蓝牙固件不需要brcm/博通无线固件不需要mediatek/联发科无线固件不需要iwlwifi/Intel 无线网卡固件无无线网卡则不需要这张表是精简的核心依据。但要注意视情况而定的那几项必须实际确认不能凭猜测。确认方法在下一节详细讲。2.3 用 lspci 和 lsusb 摸清硬件底细在动手删任何东西之前先把机器上的硬件列清楚。这两条命令是基础lspci -nnk lsusblspci -nnk会列出所有 PCI 设备包括设备 ID 和正在使用的内核驱动。重点看三类VGA 兼容控制器显卡、以太网控制器有线网卡、网络控制器无线网卡。lsusb则列出 USB 设备蓝牙适配器、部分无线网卡会挂在这里。我拿其中一台 N100 节点举例lspci输出里显卡是Intel Corporation Alder Lake-N [UHD Graphics]驱动是i915网卡是Realtek Semiconductor Co., Ltd. RTL8111/8168/8411驱动是r8169。没有无线网卡没有独立显卡没有蓝牙。这就非常清晰了——我只需要保留i915和rtl_nic相关的固件其余全部可以清理。这里有个经验把lspci -nnk的输出完整保存一份存到 U 盘或者另一台机器上。万一精简后出问题你可以对照这份记录判断是哪个硬件受影响。我一般会执行lspci -nnk /root/hardware-baseline.txt lsusb /root/hardware-baseline.txt2.4 确认内核实际加载了哪些固件光看硬件还不够还得确认内核在启动过程中到底请求了哪些固件文件。最直接的办法是查内核日志dmesg | grep -i firmware journalctl -k | grep -i firmware输出里会有类似i915 0000:00:02.0: firmware: direct-loading firmware i915/adlp_dmc.bin这样的记录说明这个固件被实际加载了。把所有direct-loading的记录收集起来就是这台机器真正用到的固件文件列表。另一个更彻底的方法是看/sys下的信息但 dmesg 已经够用了。我建议在刚重启完、还没跑其他任务的时候执行这样日志最干净。把结果存下来dmesg | grep -i firmware.*loading | awk {print $NF} | sort -u /root/used-firmware.txt这个文件就是你的白名单基础。后面精简时白名单里的文件绝对不能删。3. 精简方案的设计不是简单粗暴地 rm3.1 为什么不能直接删文件最直觉的做法是rm -rf /usr/lib/firmware/nvidia这样删目录。但这么做有几个问题。第一linux-firmware是 dpkg 管理的包你手动删了文件下次系统更新这个包时dpkg 会认为文件丢失并重新装回来你的精简成果一夜回到解放前。第二手动删文件后dpkg -V linux-firmware会报一堆校验失败系统状态不干净。第三没有记录的话过几个月你自己都忘了删过什么出问题很难排查。所以正确的思路是要么用 dpkg 的机制排除文件要么在包安装后用一个可重复执行的脚本做清理并且记录清楚。我两种方法都试过下面分别说。3.2 方案一用 dpkg 的路径排除机制适合追求干净的状态dpkg 本身不直接支持安装包但排除某些文件但可以借助dpkg-divert或者更实用的apt配置来减少安装内容。不过对于已经装好的系统更实际的做法是重新配置包。这里有个技巧可以把不需要的固件目录通过dpkg-divert转移但操作繁琐。我最终采用的是方案二为主、方案一为辅的组合。方案一是利用/etc/dpkg/dpkg.cfg.d/下的配置文件配合path-exclude指令。创建一个文件sudo tee /etc/dpkg/dpkg.cfg.d/01-firmware-exclude EOF path-exclude/usr/lib/firmware/nvidia/* path-exclude/usr/lib/firmware/amdgpu/* path-exclude/usr/lib/firmware/mellanox/* path-exclude/usr/lib/firmware/qcom/* path-exclude/usr/lib/firmware/brcm/* path-exclude/usr/lib/firmware/mediatek/* EOF这个配置的作用是今后任何包尝试往这些路径安装文件时dpkg 会直接跳过。注意它只对之后安装生效已经装好的文件不会自动删除。所以还需要配合手动清理一次。这个机制的好处是系统更新linux-firmware时这些目录不会再被填满。注意path-exclude是全局生效的写之前一定要确认这些路径你确实永远不需要。如果哪天你换了硬件记得回来删掉对应的排除行。3.3 方案二可重复执行的清理脚本推荐我更喜欢这个方案因为它透明、可审计、可回滚。核心思路是写一个脚本定义一份保留清单然后删除清单之外的所有固件文件。脚本内容大致如下#!/bin/bash # firmware-slim.sh - 精简 /usr/lib/firmware set -euo pipefail FW_DIR/usr/lib/firmware KEEP_LIST/root/firmware-keep.txt BACKUP_DIR/root/firmware-backup # 保留清单每行一个相对路径或目录前缀 cat $KEEP_LIST EOF i915/ rtl_nic/ intel/ice- intel/i40e- intel/igb- intel/ixgbe- EOF mkdir -p $BACKUP_DIR cd $FW_DIR # 先备份将被删除的内容用硬链接省空间 while IFS read -r item; do [ -z $item ] continue find . -path ./$item* -prune -o -type f -print done $KEEP_LIST | while read -r f; do mkdir -p $BACKUP_DIR/$(dirname $f) cp -al $f $BACKUP_DIR/$f 2/dev/null || cp -a $f $BACKUP_DIR/$f done # 执行删除 while IFS read -r item; do [ -z $item ] continue find . -path ./$item* -prune -o -type f -print done $KEEP_LIST | xargs -r rm -f # 清理空目录 find $FW_DIR -type d -empty -delete echo 精简完成当前大小 du -sh $FW_DIR这个脚本有几个关键设计点值得说明。第一保留清单用前缀匹配比如i915/会保留整个 i915 目录intel/ice-只保留 Intel 网卡中 ice 系列相关的文件。第二删除前用硬链接备份cp -al创建硬链接几乎不占额外空间但保留了恢复能力。第三用find ... -prune排除保留项避免误删。我第一次跑这个脚本时/usr/lib/firmware从 1.18GB 降到了约 730MB。等等这才省了 450MB 左右跟标题说的对上了。但为什么不是更小因为i915目录本身就很大里面包含了从老到新各代 Intel 核显的固件而 N100 的核显只需要其中一部分。3.4 进一步压缩 i915只留 Alder Lake-N 需要的i915目录里有一堆*_dmc.bin、*_guc.bin、*_huc.bin文件对应不同代的 Intel 核显。N100 属于 Alder Lake-N对应的固件文件名里通常带adlp或adln前缀。可以用 dmesg 确认dmesg | grep -i i915 | grep -i firmware我的输出里出现了i915/adlp_dmc.bin和i915/adlp_guc_70.bin这类文件。那么就可以把 i915 目录里其他代的固件也清掉只保留adlp相关的。这一步能再省下 100MB 左右。不过这一步风险更高建议先只做前面的大块清理稳定运行一两周后再考虑细抠 i915。4. 实操全流程从备份到验证的每一步4.1 操作前的完整备份策略精简固件属于改系统底层的操作备份是底线。我建议至少做两层备份。第一层是固件目录的完整备份直接打包tar czf /root/firmware-full-backup-$(date %Y%m%d).tar.gz /usr/lib/firmware这个包大概 300-400MB压缩后放在根分区之外的地方比如挂载的额外存储或者通过网络传到另一台机器。第二层是记录当前包状态dpkg -l | grep firmware /root/firmware-packages.txt dpkg -L linux-firmware /root/firmware-filelist.txt这样万一需要恢复你可以对照文件列表把缺失的文件补回来或者直接重装linux-firmware包。提示如果根分区已经很满打包可能失败。可以先清理 apt 缓存apt clean和旧日志journalctl --vacuum-size100M腾出空间再备份。4.2 执行清理并观察即时反馈备份完成后运行前面写的清理脚本。执行过程中注意看有没有报错。执行完后立即检查du -sh /usr/lib/firmware df -h /确认空间释放了且没有误删保留清单里的内容。然后不要急着重启先做一些非破坏性验证。比如重新加载网卡驱动看是否正常sudo modprobe -r r8169 sudo modprobe r8169 ip link show如果网卡还在、能正常通信说明网卡固件没问题。核显的验证稍微麻烦点可以看dmesg有没有新的 i915 报错。4.3 重启后的硬件自检清单真正考验在重启之后。重启完成后按这个清单逐项检查网络连通性ping网关ip a看网卡是否正常获取地址。显卡工作状态dmesg | grep -i i915看有没有firmware load failed之类的错误。存储识别lsblk确认所有磁盘都在。USB 设备lsusb对比精简前的记录看有没有设备消失。系统日志整体扫描journalctl -b -p err看本次启动有没有 error 级别日志。我第一轮精简后重启网卡和显卡都正常但发现dmesg里有一条蓝牙相关的固件加载失败。虽然这台机器没蓝牙但那条报错看着不舒服。后来发现是某个 USB 控制器被识别成了蓝牙设备实际不影响使用就在保留清单里加回了对应的intel/ibt-*文件报错消失。4.4 建立长期维护习惯精简不是一劳永逸的。系统更新、内核升级都可能带来新的固件需求。我的做法是每次内核大版本更新后重新跑一遍 dmesg 检查看有没有新的固件加载失败。另外把清理脚本和保留清单纳入配置管理换机器时直接复用。还有个小技巧可以写一个定时任务每周检查一次/usr/lib/firmware的大小如果超过某个阈值就发通知。这样能及时发现更新把固件又装回来了。5. 踩过的坑和几条硬核经验5.1 删了 rtl_nic 导致网卡不认的教训第一次实验时我图省事觉得 Realtek 网卡固件应该在内核里就把rtl_nic目录也删了。结果重启后网卡直接不工作ip a里只剩 lo。好在有备份进恢复模式把目录拷回去才恢复。这件事说明有线网卡固件在很多平台上确实是必需的尤其是 Realtek 的某些型号驱动初始化时要加载rtl_nic/rtl8168*.fw。所以rtl_nic必须保留。5.2 硬链接备份的坑跨文件系统会失败前面脚本里用了cp -al创建硬链接备份。这个操作要求源和目标在同一个文件系统上。如果你的/root和/usr不在同一个分区有些部署会分开硬链接会失败脚本里的|| cp -a会退化成完整复制可能瞬间占满空间。所以执行前一定确认df输出里两者是否同分区。不同分区的话直接改成完整复制到外部存储。5.3 别碰正在使用的固件文件有个细节容易忽略如果某个固件文件正在被内核使用直接rm虽然能删掉目录项但内核仍持有文件句柄实际空间不会立即释放而且可能导致后续重新加载驱动时找不到文件。稳妥的做法是在单用户模式或者刚启动、相关驱动还没加载时执行清理。我一般是在救援模式或者用 live 环境挂载根分区来操作最干净。5.4 保留清单要留冗余精简的诱惑是删得越多越好但我的经验是保留清单宁可多留一点。比如 Intel 网卡固件我一开始只留了ice系列后来发现某些主板用的是igb或e1000e虽然当前机器没用但万一换网卡或者用 USB 网卡转接就可能需要。多留几十 MB换来的是省心。真正的大头是显卡和无线网卡固件那些删掉收益最大、风险也最可控因为 N100 平台基本不用。5.5 验证要覆盖冷启动场景热重启和冷启动完全断电再上电在固件加载上可能有差异。有些固件在热重启时因为硬件状态还在不会重新请求冷启动时才会真正走一遍加载流程。所以精简后至少做一次完全断电的冷启动测试确认所有硬件都能正常初始化。我一般会关机、拔电源等一分钟、再开机这样测出来的结果才可靠。6. 精简后的收益与适用边界6.1 450MB 到底意味着什么单看 450MB 好像不多但放在 N100 这类小主机的场景里意义不小。很多 N100 设备用的是 128GB 甚至 64GB 的 eMMC 或小容量 SSD系统盘往往只分 30-40GB。省下 450MB意味着可以多跑一两个容器或者给日志留出更充裕的缓冲。我这几台节点精简后根分区使用率从 85% 降到 60% 左右磁盘告警彻底消失系统更新时也不再因为空间不足而失败。更重要的是精简固件顺带清理了一批永远不会执行的代码路径系统启动时内核扫描固件的范围变小启动速度有轻微提升。虽然提升不明显大概快一两秒但对于需要频繁重启的测试环境来说积少成多。6.2 什么情况下不该做这个精简这个方案不是万能的。以下几种情况建议谨慎或者干脆别做硬件配置不确定或经常变动如果你这台机器可能随时插不同的网卡、显卡保留完整固件更省心。需要热插拔多种外设比如经常接不同型号的 USB 无线网卡、采集卡删了固件会导致即插即用失效。对系统稳定性要求极高、不接受任何手动改动那就别碰用发行版默认配置最稳。没有可靠备份手段备份都做不了就别做这种底层改动了。6.3 把这套方法迁移到其他平台这套确认硬件、建立白名单、备份、清理、验证的流程其实不限于 N100 和 Ubuntu。ARM 开发板、其他 x86 小主机、甚至某些定制路由器系统只要固件是以文件形式存放在文件系统里的都可以套用。区别只在于保留清单不同。核心逻辑始终是先搞清楚什么在用再决定删什么删之前留后路删之后做冷启动验证。我在另一台基于 ARM 的开发板上也做过类似操作那台设备的固件目录结构和 Ubuntu 不同但思路完全一致。先dmesg抓加载记录再对照硬件清单最后清理。省下的空间比例甚至比 N100 还高因为 ARM 平台的固件包里塞了更多用不上的东西。最后分享一个我一直在用的小习惯每次做完这类系统精简我都会在机器的/root下留一个README-slim.txt写清楚哪天做了什么、删了什么、保留清单在哪、怎么恢复。过半年再回来看这台机器一眼就知道当初动过什么手脚。这个习惯帮我省过好几次事推荐你也养成。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/14 20:11:32
最大似然估计与最大后验估计:从贝叶斯原理到深度学习正则化
2026/10/14 20:06:29
STM32开发工具链全景拆解:IDE选型、GCC编译与OpenOCD调试实战
2026/10/14 20:06:28
基于Python的检验结果自动比对系统:从数据清洗到异常分级实践
2026/10/14 21:21:58
App 邮箱验证码注册与登录机制说明
2026/10/14 21:21:58
帮手如何用一句话配置消防任务
2026/10/14 21:21:58
二、C++系列之引用
2026/10/14 21:21:58
出海 B2B 销售情报落地:从信号到行动的三层工作流
2026/10/14 21:21:58
ThinkPHP6+Layui后台管理框架实践:RBAC权限设计与快速开发
2026/10/14 21:16:58
C++类和对象(下)初始化列表、类型转换、static、友元、内部类、匿名对象
2026/10/14 0:02:01
Oracle 19c Windows客户端安装配置与连接排错指南
2026/10/14 0:02:01
React Native截图优化:解决Android兼容性问题
2026/10/14 0:02:01
金属锈蚀速率计算模型与防护方案优化实践
2026/10/13 12:25:09
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/14 18:35:19
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/14 14:52:59
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/12 19:53:23
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/11 21:41:11
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/11 23:43:10
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)