很多团队做嵌入式 Linux 启动优化,第一反应都是换更快的 CPU、换更快的 eMMC,或者把系统日志全关掉,觉得这样就能把冷启动时间压下去。结果一轮操作下来,启动时间从 8 秒变成 7.3 秒,老板问一句“为什么还是没进系统”,大家又开始回头怀疑内核、怀疑 U-Boot、怀疑驱动,最后项目进入一种“每个人都觉得自己优化了,但总时间就是不明显下降”的状态。这类问题的根子往往不在某一个点,而在于启动链路被拆得不够细。BootROM、SPL、U-Boot、Kernel、Initramfs、RootFS、systemd 服务,这里面任何一段都可能只浪费 300 毫秒,但七八段叠加起来,就是你永远也压不进 5 秒的原因。尤其是 Initramfs,很多人明明已经决定用它做“抢跑式初始化”,结果打包时又把一堆用不到的模块、脚本、字体、诊断工具都塞进去,最后它反而成了新瓶颈。
这篇文章想解决的不是“如何背几个启动优化参数”,而是告诉你一套真正能在项目里落地的思路:先测量、再拆链路、再决定哪里该裁、哪里该移、哪里该延后。你会看到,想把嵌入式 Linux 压进 5 秒,真正值钱的不是某个神奇命令,而是对 Initramfs、内核配置和用户态服务边界的重新划分。
先别急着裁,先把启动时间按阶段量出来
如果你上来就改 initramfs,十有八九会把时间花错地方。正确顺序一定是先量,再裁。能量出来的东西才有资格被优化,量不出来的“体感变快”基本都不可靠。
在多数 systemd 系统里,先用下面这组命令把启动拆开看:

systemd-analyzesystemd-analyze blamesystemd-analyze critical-chain
如果你板子还没进完整桌面环境,而是纯控制台系统,那么 systemd-analyze 往往已经足够给出一个大概拆分:Firmware、Loader、Kernel、Userspace。这里最容易被忽视的是 Userspace 这一段。有些团队以为自己“内核很慢”,实际是开机后有十几个服务在串行等待网络、等待存储、等待 DBus,启动时间都烧在用户态了。
如果你想继续往前挖,就要把串口日志打开,在 U-Boot 和内核入口处打时间戳。很多产品最后发现,真正拖时间的不是 Linux 本身,而是 U-Boot 在等串口、扫设备、反复重试一个不存在的存储分区。换句话说,你以为在优化系统,实际是在替错误的启动配置背锅。
为什么 Initramfs 往往是启动优化里最容易出成绩的一刀
Initramfs 的价值不只是“临时根文件系统”,更重要的是它能让系统提早进入一个极小、可控的初始化环境。在工业设备、网关、仪表盘、车载边缘设备这类场景里,用户真正关心的通常不是“完整 Linux 用户空间何时全部 ready”,而是“最核心的应用何时能先跑起来”。
这时候,小而快的 Initramfs 就特别有用。很多官方资料在讨论启动优化时都会强调,用一个 tiny initramfs 提前运行关键应用,再切换到完整文件系统,是一条很实际的启动优化思路。另一方面,业内常见的启动优化经验也都反复提到:initramfs 体积越大,解压、读盘和内存搬运时间就越重,想提速就必须先减包体。
很多项目出问题,是因为把 Initramfs 当成“保险箱”,什么都往里塞:
这样做带来的直接结果就是:内核刚起来,接着又要解一个大包;包解完之后,还要在里面跑一堆并不关键的脚本。你名义上用了 Initramfs,实际却把它做成了“迷你版 RootFS”。
Initramfs 裁剪到底该裁什么
真正有效的裁剪,不是盲删文件,而是沿着“启动必需路径”删。
第一类要问的是:有没有只为兜底而存在、但实际产品启动并不需要的驱动和模块。如果你的量产硬件型号固定,存储介质固定,根文件系统格式固定,那你完全没必要把多种 NAND、MMC、SATA、USB 存储路径全部放进 Initramfs。
第二类要问的是:哪些动作不必在 Initramfs 完成。比如很多项目会在早期环境里做复杂网络检测、版本比对、日志清理、配置合并。这里面真正必须早做的,往往只有挂载根文件系统和启动关键应用,剩下的都可以延后到系统起来之后再做。
第三类要问的是:压缩算法是否合适。不同发行版工具链默认压缩算法不一样,某些默认值更偏“省空间”,未必偏“省时间”。像 lz4 这种通常更适合做启动时快速解压,而不是一味追求压得最小。很多团队就是在这里吃亏:镜像文件变小了,解压时间却并没有更优。
下面这段示意脚本是一个很常见的 Initramfs 精简版入口,它只做三件事:挂载基础文件系统、等待根分区、切根执行真正的 init。

#!/bin/shmount -t proc none /procmount -t sysfs none /sysmount -t devtmpfs none /devROOT_DEV=/dev/mmcblk0p2for i in 1 2 3 4 5; do [ -b "$ROOT_DEV" ] && break sleep 0.1donemount -o ro "$ROOT_DEV" /newroot || exec shexec switch_root /newroot /sbin/init
这个脚本看起来很朴素,但思路是对的:只保留最短必需路径,不在早期环境中做和“进入主系统”无关的复杂动作。对于那些只要求尽快进入业务界面的设备,这种极简路径往往比什么花哨逻辑都更有效。
把服务瘦身,往往比继续折腾内核更赚钱
很多项目做到这里,会把全部注意力继续放在内核裁剪上,觉得下一刀一定要从 CONFIG_xxx 下手。实际上,如果你已经把 Bootloader 和内核阶段压得比较干净,真正剩下的肉往往在用户态。
典型症状包括:
NetworkManager、wpa_supplicant、systemd-resolved串行启动- 一个守护进程因为等网络 ready,后面的业务服务也被连带阻塞
你必须问自己一个工程问题:设备“可用”到底意味着什么?如果是一个工业 HMI,那很可能是主界面起来就算可用;如果是一个边缘网关,那可能是本地采集和消息缓存 ready 就算可用;如果是一个摄像终端,那也许是预览链路跑起来就算可用。也就是说,你不一定要等所有服务都 ready 才算“启动完成”。
很多时候,把几个非关键服务改成延后启动、按需启动或者并行启动,收益比继续裁 30 个内核配置项还大。启动优化里最怕的,就是工程师只盯着“技术上最底层的东西”,却忽略了真正决定体验的业务就绪时间。
一个更接近量产项目的优化顺序
如果你真的要把启动时间压到 5 秒附近,我建议按下面这个顺序来推进,而不是见啥改啥。
第一步:锁定“用户真正感知的启动完成点”
不要一上来就说“进 systemd 就算好了”。先定义设备在什么时刻算可用。这个定义一旦明确,优化路径就清晰很多。
第二步:切分链路
把时间按 BootROM/SPL/U-Boot/Kernel/Initramfs/Userspace 切开。能在串口日志里打点的地方都打点,必要时录视频逐帧对齐。只有这样你才能知道 5 秒目标到底卡在哪段。
第三步:裁 Initramfs
这里要把“为了兼容而准备的一切”减到最低,只留下早期必须路径。模块少一点、脚本少一点、压缩算法更适合一点,通常都会有可见收益。
第四步:重排用户态服务
把“关键服务先跑”和“全家桶一起跑”彻底分开。你要的是尽快进入业务,而不是尽快把每个守护进程都拉起来。
第五步:最后再回头看内核与 Bootloader
当上面几刀都做完后,再去看内核配置、驱动内建与模块化策略、U-Boot 的探测顺序是否还能继续压。这样做效率更高,也更不容易把系统搞脆。
一个实用的 systemd 精简例子
下面这个例子展示的是,把一个关键业务提前,其余准备动作延后:

[Unit]Description=Fast UI ServiceAfter=local-fs.targetBefore=multi-user.targetDefaultDependencies=no[Service]Type=simpleExecStart=/usr/bin/hmi_mainRestart=always[Install]WantedBy=basic.target
这类做法的意义不在于“绕过 systemd”,而在于明确优先级。让关键应用跟 basic.target 关联,而不是被一串高层依赖拖住,通常能显著改善“屏幕黑着等半天”的主观体验。
当然,提前拉起业务服务的前提是依赖已经足够齐全。比如你的 GUI 明明依赖 DRM、input、配置文件挂载和一个本地 socket,那就别为了快而硬拉,最后只是把启动失败时间提前而已。
什么情况下不要死磕 5 秒
说实话,不是所有设备都值得为 5 秒这个数字付出巨大复杂度。如果你是一个固定安装的工业控制器,一天只上电一次,而且业务本身没有强交互需求,那把架构搞得极度复杂,只为多省 800 毫秒,很可能不划算。
但如果你的产品是车载中控、手持终端、医疗边缘设备、便携式仪表,用户每天频繁看到开机过程,那启动时间就是体验的一部分,甚至直接影响产品评价。这种情况下,Initramfs 裁剪和链路重排就不是“锦上添花”,而是产品力本身。
总结
把嵌入式 Linux 启动时间压进 5 秒,最忌讳的是把问题想成“找一条神奇命令”。真正有效的方法,是把链路拆清楚,然后一刀一刀按收益排序去优化。
如果你只记住三件事,那就是:先量时间,再动刀;先裁 Initramfs 和用户态关键路径,再回头碰更底层;设备“可用”的定义,比“所有服务都起来”更重要。
对大多数项目来说,Initramfs 裁剪不是唯一答案,但几乎总是最容易拿到第一波收益的地方。只要你不把它做成一个迷你 RootFS,而是真正把它当成“快速进入业务的跳板”,启动时间就很有机会被你压到一个足够漂亮的范围内。
没有好的单片机项目,到处找项目做? 需要哇塞单片机项目的完整源码+技术文档+视频教程?

点击此处领取单片机项目资料
觉得有用的话,点个「在看」,帮助更多纠结的人!