☰
【Linux】RK3568-系统镜像(六)
2026/10/2 8:18:17 网站建设 项目流程

文章目录

      • 1.镜像+根文件系统

1.镜像+根文件系统

一、核心概念对照表

概念定义举例类比
根文件系统Linux 运行时挂载的/目录树,是"内容"/bin、/etc、/opt/camera书的内容
镜像存储介质的逐字节副本,是一个文件sdcard.img、rootfs.img书的影印件
固件固化在芯片里的程序单片机 hex、路由器系统硬件里刻的字
烧录把镜像写入存储介质dd if=xxx.img of=/dev/mmcblk0复印
量产把原型方案批量复制到多台设备生产线批量烧录批量印刷

二、MCU 与 MPU 的本质区别

维度单片机(MCU)微处理器(MPU,跑 Linux)
运行内容只有一个程序Bootloader + Kernel + 根文件系统 + 多个服务
启动流程复位 → 执行main()BootROM → SPL → U-Boot → Kernel → systemd → 你的服务
量产方式烧录 hex/bin 到 Flash制作整机镜像,批量写入 eMMC/SD
用户程序形态就是"整个程序"是系统里的一个服务
差异化一般无每台设备需唯一 token/序列号/MAC

关键结论:MCU 烧"程序",MPU 烧"系统 + 服务"。


三、Linux 启动与自启动机制

3.1 完整启动链路

芯片复位 ↓ BootROM(芯片固化,无法修改) ↓ SPL(二级引导,很小) ↓ U-Boot(大引导,加载内核) ↓ Kernel(加载驱动、挂载根文件系统) ↓ init / systemd(PID=1,总调度器) ↓ systemd 读取所有 .service 文件 ↓ camera.service 被触发 → 执行 start_camera.sh ↓ 启动 mediamtx / frpc / ffmpeg

3.2 为什么 .service 能自动运行?

  1. systemd 启动时扫描/etc/systemd/system/等目录下的.service文件。
  2. 执行systemctl enable camera.service时,systemd 在/etc/systemd/system/multi-user.target.wants/下创建一个软链接。
  3. 开机进入multi-user.target时,systemd 会启动所有被"想要"(Wanted)的服务。
  4. WantedBy=multi-user.target就是告诉 systemd:“我要跟着多用户模式一起启动”。

本质:enable= 创建软链接。

3.3 为什么不能用 rc.local?

对比项rc.localsystemd
依赖管理无,靠sleep硬等声明After=、Wants=,自动排序
崩溃重启无Restart=on-failure自动拉起
日志需自己重定向journalctl统一管理
并行启动串行,慢并行,快
量产可控性弱强

结论:rc.local 是玩具,systemd 是产品。


四、你的项目架构回顾

4.1 数据流向

USB摄像头 → FFmpeg(H.264编码) → MediaMTX(本机RTSP) → frpc(内网穿透) → 阿里云服务器(frps) → 手机VLC远程拉流

4.2 目录结构(原型阶段)

/home/baiwen/video1/ ├── mediamtx # MediaMTX 可执行文件 ├── mediamtx.yml # MediaMTX 配置 ├── frp_0.71.0_linux_arm64/ # FRP 客户端目录 │ ├── frpc │ └── frpc.toml ├── start_camera.sh # 开机自启脚本 └── camera.log # 运行日志

4.3 三个关键文件

文件作用位置
start_camera.sh启动脚本,负责依次拉起三个服务/home/baiwen/video1/
camera.servicesystemd 服务定义,实现开机自启/etc/systemd/system/
frpc.tomlFRP 客户端配置(含 token)/home/baiwen/video1/frp_xxx/

五、从原型到量产:四个阶段

阶段 1:原型验证(你现在)

做法:手动配置,逐台操作

  1. 装系统
  2. 拷贝文件到/home/baiwen/video1/
  3. 写camera.service
  4. systemctl enable
  5. 重启验证

特点:能跑通,但不能批量复制。

阶段 2:小批量试产(5~20 台)

做法:SD 卡克隆 + 手动改 token

  1. 在一台样机上配好所有东西
  2. 用dd把 SD 卡做成.img
  3. 每台烧完后,手动 SSH 改frpc.toml的 token
  4. 验证硬件和软件一致性
# 制作镜像ddif=/dev/mmcblk0of=sdcard.imgbs=4M# 烧录到新卡ddif=sdcard.imgof=/dev/mmcblk0bs=4M

缺点:手动改 token,效率低,易出错。

阶段 3:中批量(100 台以上)

做法:定制镜像 + first-boot 自动化

  1. 用Yocto或Buildroot定制精简根文件系统
  2. 把mediamtx、frpc、脚本、camera.service直接编入镜像
  3. 用厂商烧录工具(如 RKDevTool、uuu)批量烧录 eMMC
  4. 首次启动运行first-boot.service,自动个性化

first-boot 脚本要做的事:

#!/bin/bash# 1. 生成唯一 tokenTOKEN=$(openssl rand-hex16)# 2. 生成唯一序列号(用 MAC 地址)SERIAL=$(cat/sys/class/net/eth0/address|tr-d':')# 3. 从模板生成配置文件sed"s/__TOKEN__/$TOKEN/"/opt/camera/frpc.toml.template>/etc/frp/frpc.toml# 4. 设置唯一主机名echo"camera-$SERIAL">/etc/hostname# 5. 自我禁用,只跑一次systemctl disable first-boot.service

阶段 4:正式产品

做法:CI/CD + OTA 升级

  1. Yocto/Buildroot做完整构建流水线(代码提交 → 自动编译 → 生成镜像)
  2. 镜像里预置:
    • 应用(打包成.deb或放到/opt/)
    • systemd 服务
    • RAUC / SWUpdate做 OTA 升级框架
    • A/B 分区方案(升级失败可回滚)
  3. 生产线用夹具 + 自动化工具烧录,写入序列号、MAC、密钥
  4. 出厂后通过 OTA 推送更新

六、量产镜像里应该装什么?

6.1 完整交付包结构

你的应用包/ ├── opt/camera/ # 应用目录 │ ├── mediamtx # 可执行文件 │ ├── mediamtx.yml # 配置 │ ├── frpc # FRP 客户端 │ ├── frpc.toml.template # 配置模板(token 留空,首启时填) │ └── start_camera.sh # 启动脚本 ├── etc/systemd/system/ │ ├── camera.service # 服务定义 │ └── first-boot.service # 首启个性化服务 └── etc/first-boot.d/ └── 01-personalize.sh # 个性化脚本

6.2 关键点

项目原型阶段量产阶段
token硬编码在 frpc.toml用模板 + 首启生成
主机名手动设置用 MAC 地址自动生成
服务启动手动systemctl start编入镜像,开机自动
升级方式手动 SSH 替换OTA 推送

七、打包方式对比

方式适合场景做法
直接拷贝到 rootfs自己维护镜像放进 Yocto/Buildroot 的recipes或overlay
打成.deb包Debian/Ubuntudpkg-deb --build生成,安装自动放好服务
Docker 容器应用隔离应用做成镜像,宿主 systemd 拉起容器
只读分区防篡改根文件系统只读,应用分区单独可写

八、镜像 vs 根文件系统:核心区别

维度根文件系统镜像
本质目录树(内容)文件(副本)
运行时是"活"的,被挂载使用是"死"的,只能被读写
包含关系是镜像的一部分可以包含根文件系统
路径/xxx.img
制作方式用cp、dpkg填充用dd、mkfs、mksquashfs生成
使用方式挂载后直接访问用dd写入存储介质
类比书的内容书的影印件

一句话:根文件系统是 Linux 运行时看到的/;镜像是把它打包成的.img文件。


九、术语速查表

术语含义类比
镜像 (Image)存储介质的逐字节副本书的影印件
根文件系统 (rootfs)Linux 运行时的/目录树书的内容
固件 (Firmware)固化在芯片里的程序硬件里刻的字
Bootloader启动引导程序(U-Boot)电脑的 BIOS
KernelLinux 内核操作系统的心脏
systemdLinux 的总调度器(PID=1)工厂的调度中心
Servicesystemd 管理的服务单元工厂里的一条产线
烧录把镜像写入存储介质复印
量产批量复制到多台设备批量印刷
OTA空中升级手机系统更新
A/B 分区双分区互为备份,升级失败可回滚双系统启动
first-boot首次启动时运行的个性化脚本新手机开机设置

十、给你的下一步建议

当前状态:原型验证完成 ✅

短期目标(如果你想做几台设备自用):

  1. 在一台样机上配好所有东西
  2. 用dd做成.img
  3. 每台烧完后手动改 token
  4. 验证一致性

中期目标(如果想做小批量产品):

  1. 学 Yocto 或 Buildroot,做定制镜像
  2. 写first-boot.sh做自动化个性化
  3. 用厂商烧录工具批量写入

长期目标(如果要做正式产品):

  1. 引入 OTA 升级框架
  2. A/B 分区,支持失败回滚
  3. 云端设备管理

十一、一句话总结整个项目

你做的不是"烧一个程序",而是"部署一个系统"。

镜像是打包方式,根文件系统是运行内容,systemd 服务是启动机制,first-boot是个性化方案,OTA是升级方案。

这五点就是嵌入式 Linux 产品化的全部骨架。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询