其实这台摄像头在今年 3 月份的时候就不慎刷成砖了,当时反复研究都没能救回来,只能搁在一边落灰许久。直到最近村里有些事需要调监控,结果又碰上另一台摄像头无法识别内存卡的状况,回放也看不了。
今天下单了一台说得过去的品牌摄像头,就想着还是看看能不能把这台刷坏的救回来——哪怕就当个红灯亮着的摆设也好。于是决定试试:不拆硬件、不焊接的前提下能不能修好。
由于访问仓库的网络卡得转圈圈,且仓库文档又全是英文的,干脆将仓库地址丢给 AI 进行分析,按它给的命令一条一条跑,没想到真的就成了。
家里人几年前买的一个云蚁物联解决方案的 Wi-Fi 摄像头,断断续续用着,当初忍不了 App 的广告,就想着开放 RTSP 直播流,假装以后可以接入 NVR。为此不断查找教程,看到了一众 yi-hack 的仓库。
结果刷机时固件型号没对上,期间为了救砖又连续尝试过别的固件,摄像头最后还是起不来——App 掉线、无法开机自检、红外线灯珠不亮。按当时看到的教程拔卡重启也无效,要不是黄灯还有微亮,我都怀疑彻底坏掉了。
撇在那里几个月,一度以为得等我把硬件维修技术练上来再修。
这不今天突发奇想,想着能不能试试修复。网络卡顿又看不懂英语,就干脆把搜到的仓库地址扔给 AI 翻译分析。
最后靠刷机前脚本自动 dump 下来的分区备份 + 一张 SD 卡 + 一个 reset 按钮把它救回来了,现在 App 能正常连上,红外夜视也恢复了。下面是完整的操作步骤、踩过的坑和参考链接,给遇到同样情况的朋友当个参考。
目录
1. 背景与症状
一台”云蚁物联”的 Wi-Fi 摄像头,当初为了开放 RTSP 直播流,想刷 yi-hack 开启 RTSP 功能。结果:
- 第一次刷错固件 → 黄灯长亮、起不来
- 拔 SD 卡重启 → 无效(坏的是 flash,不是卡)
- 又放了”其他固件”进去试图救 → flash 被污染两轮
- App 显示掉线几个月,红外夜视、云功能全挂
2. 判断机型(b091qp)
救砖的第一步是确认机型,因为不同机型的flash 分区表不一样,写错偏移 = 砖上加砖。从之前刷机时的备份目录能看到:
homever.txt : 9.0.41.99_202108051748 mtd.txt : mtd0: 00060000 00001000 "uboot" mtd1: 001f0000 00001000 "boot" mtd2: 00120000 00001000 "rootfs" mtd3: 00300000 00001000 "home" mtd4: 00150000 00001000 "backup" mtd5: 00020000 00001000 "env" mtd6: 00010000 00001000 "mfg" mtd7: 00010000 00001000 "conf"
固件 9.0.41 对应 yi-hack-Allwinner-v2 的 b091qp 机型(云蚁物联 / 一批白牌摄像头同平台)。backup 分区 0x150000 = 1392640 字节,起始偏移 0x670000。后面所有参数都锚定在这套分区表上。
3. 准备救砖素材(分区备份)
幸运的是,刷机前按流程 dump 过完整的分区备份,目录长这样(相对路径):
~/workspace/backup/ ├── homever.txt # 固件版本 ├── mtd.txt # 分区表 ├── mtdblock0.bin # uboot 393216 字节 ├── mtdblock1.bin # boot 2031616 字节 ├── mtdblock2.bin # rootfs 1179648 字节 ├── mtdblock3.bin # home 3145728 字节 ├── mtdblock4.bin # backup 1376256 字节 ← 救砖核心 ├── mtdblock5.bin # env 131072 字节 ├── mtdblock6.bin # mfg 65536 字节 └── mtdblock7.bin # conf 65536 字节
要还原的是 3 个:mtdblock2(rootfs)+ mtdblock3(home)+ mtdblock4(backup)。uboot/boot/env/mfg/conf 一律不动(动了就真砖了)。之所以 3 个一起还原,是因为两轮刷写很可能把 rootfs/home 也污染了,只还原 backup 的话校验过了但 rootfs 还是坏的,照样起不来。
4. 克隆仓库并放置备份
cd ~/workspace git clone --depth 1 https://github.com/roleoroleo/yi-hack-Allwinner-v2 cd yi-hack-allwinner-v2/unbrick # 把 3 个干净分区放进 b091qp 机型目录 cp ~/workspace/backup/mtdblock2.bin b091qp/ cp ~/workspace/backup/mtdblock3.bin b091qp/ cp ~/workspace/backup/mtdblock4.bin b091qp/ # build.sh 靠这个文件识别机型,内容就是机型名 printf 'b091qp' > b091qp/filename
5. 安装依赖
build.sh 依赖 mkimage(u-boot-tools)和 mkfs.jffs2(mtd-utils):
sudo apt install u-boot-tools mtd-utils
6. 打包救砖分区(factory 模式)
打包成 3 个 U-Boot 格式的分区镜像。这里最终用的是 factory 模式(直接拷贝原始分区,不走 jffs2 挂载):
cd ~/workspace/yi-hack-allwinner-v2/unbrick sudo ./build.sh factory # 核对 3 个 gz 大小(关键!) ls -l b091qp/*.gz # 预期: # rootfs_b091qp.gz ~1104696 # home_b091qp.gz ~2970919 # backup_b091qp.gz ~1241855 ← 绝不能只有 2.5KB!
7. 第一个坑:hacked 模式因缺 mtdram 回退成 factory
一开始我跑的是 sudo ./build.sh hacked,结果报错:
modprobe: FATAL: Module mtdram not found in directory /lib/modules/6.1.0 umount: b091qp/mnt: not mounted. ### Updating b091qp/backup/init.sh cp: 对 'b091qp/backup/init.sh' 调用 stat 失败: 没有那个文件或目录
原因:hacked 模式要先 mount.jffs2(靠 modprobe mtdram 模拟挂载)把 backup 分区挂出来改 init.sh、塞随机文件改 hash。但内核没有 mtdram 模块 → 挂载失败 → 脚本静默 fallback 成 factory 路径(直接 cp mtdblock4.bin)。所以第一次产出的其实是 factory 版,不是 hacked 版。
cp: 对 'b091qp/backup/init.sh' 调用 stat 失败,说明它走了 factory fallback。对我们的场景(救活,不是先跑 hack)这没影响——factory 版照样能把干净分区写回。想真正跑 hacked 模式,先 sudo apt install linux-modules-extra-$(uname -r) 装上 mtdram 再重跑。
8. 第二个坑:backup 分区打出 2.5KB 空壳
更要命的是,第一次 hacked 跑出来的 backup_b091qp.gz 只有 2589 字节:
-rw-r--r-- 1 root root 2589 11月 1日 20:30 backup_b091qp.gz ← 坏! -rw-r--r-- 1 root root 2970919 11月 1日 20:30 home_b091qp.gz -rw-r--r-- 1 root root 1104696 11月 1日 20:30 rootfs_b091qp.gz
原因:jffs2 挂载失败 → mkdir -p b091qp/backup 建了个空目录 → create.jffs2 对空目录生成了一个全 0 pad 的空 jffs2 镜像(几 KB)→ 打包进去了。这要是写进 flash,backup 分区直接被擦成空白,比原来更糟。
修复:清掉坏产物,重跑 factory(factory 不走 jffs2 挂载,直接 cp,就避免了这个坑):
cd ~/workspace/yi-hack-allwinner-v2/unbrick rm -f b091qp/backup_b091qp.gz b091qp/rootfs_b091qp.gz b091qp/home_b091qp.gz sudo ./build.sh factory ls -l b091qp/*.gz # 现在 backup_b091qp.gz = 1241855 字节 ✅
9. 解压生成 3 个裸分区文件
bootloader 认的是裸分区文件(不带 .gz)。gunzip -k 会解压到 .gz 同目录:
cd ~/workspace/yi-hack-allwinner-v2/unbrick/b091qp gunzip -k rootfs_b091qp.gz home_b091qp.gz backup_b091qp.gz ls -l # 得到 3 个裸文件: # rootfs_b091qp 1179712 # home_b091qp 3145792 # backup_b091qp 1376320
mtdblockX.bin 多 64 字节 = U-Boot mkimage 镜像头,正常。看到的大小对得上就 OK。
10. 写入 SD 卡(FAT32)
准备一张干净的 FAT32 SD 卡(最好先重新格式化,去掉之前 unbrick 的裸文件残留),把 3 个裸文件放到卡根目录:
# 假设 SD 卡挂到 /mnt/usb(换成你实际的挂载点) sudo mount /dev/sdX /mnt/usb # /dev/sdX 是 SD 卡,用 lsblk 确认 cp ~/workspace/yi-hack-allwinner-v2/unbrick/b091qp/rootfs_b091qp /mnt/usb/ cp ~/workspace/yi-hack-allwinner-v2/unbrick/b091qp/home_b091qp /mnt/usb/ cp ~/workspace/yi-hack-allwinner-v2/unbrick/b091qp/backup_b091qp /mnt/usb/ sync ls -l /mnt/usb/ # 应正好 3 个裸文件,无 .gz、无 bin、无目录
卡根目录最终结构:
/ (SD 卡根目录) ├── rootfs_b091qp 1,179,712 ├── home_b091qp 3,145,792 └── backup_b091qp 1,376,320
11. 救砖操作:按 reset + 通电(关键!)
这是整个流程里最容易做错、也最决定成败的一步。
具体操作:
- SD 卡先插进摄像头
- 按住机身上的 reset 按钮不松手(一般是”线尾巴”/机身侧的小复位键)
- 在按住 reset 的同时给摄像头通电
- 保持按住 约 5 秒后松手(这次黄灯闪烁的时间明显比之前长,说明在写分区)
- 等 5–10 分钟,期间不要断电、不要拔卡
关于”断电前那个高亮有没有用”——不确定。两种可能:
– 它只是普通上电时的正常自检高亮,跟 recovery 无关(更可能)
– 它可能是 bootloader 检测到 SD 卡内容后的一次”预校验”反应,为后面正式进 recovery 做了铺垫
不管哪种,正式救砖的关键动作始终是”按住 reset + 通电”这一步。如果你重试时遇到”普通通电有高亮但按 reset 通电没反应”的怪现象,可以把”高亮瞬间断电 → 再按 reset 通电”作为备选时序试一次。
但要警惕:如果此时 bootloader 已经开始读 SD 卡、往 flash 写分区(黄灯持续闪烁中),中途断电就等于恢复过程异常中断——分区只写了一半,flash 比没救砖前更难收拾。所以:
– 黄灯规律闪烁后,千万不要断电、不要拔卡,哪怕看到”好像写完了”也别急,让流程自己跑完
– 如果确实被强制断电了(断电前就断电、或者手滑),别慌、也别反复重试,先冷静判断:再完整跑一次”按 reset 通电”(让 bootloader 重新从头校验、重新写分区),多数情况下能救回来;如果反复断电后彻底没反应,就只能走 UART 硬救砖了
12. 成功标志与恢复确认
救砖成功的现象(我实际看到的):
- 等待过程中黄灯规律闪烁(比之前常亮时长得多)—— bootloader 在读卡、写分区
- 听到一声 “ling” 提示音,并伴随摄像头云台转动(PTZ 自检)
- 手机 App 里那台掉线几个月的摄像头重新显示在线
- 红外夜视灯也亮了
出现这些就说明 3 个分区都写回成功,系统完全恢复。
13. 后续
救砖只是把系统救活了——现在 App 能正常连上,红外夜视、云功能都恢复了。SD 卡里那 3 个裸分区文件已经完成使命,可以直接拔卡。
14. 踩坑总结(口诀)
- 先认机型:看 SN 前缀 + 固件版本 → 查支持表 → 锁定 flash 分区表(我的是 b091qp / 9.0.41)
- 备份是命根子:刷机前 dump 的
mtdblock4.bin(backup)是救砖唯一素材,没有就只能 UART - 还原 3 个分区:rootfs + home + backup 一起写回,别只写 backup
- build 完核对 .gz 大小:backup 只有 2.5KB = 空壳(jffs2 挂载失败),不能上卡;重跑 factory 模式最稳
- bootloader 认裸文件:把 3 个不带 .gz 的裸分区放 FAT32 卡根目录
- 关键动作:按住 reset + 通电:普通开机不读卡,必须触发 recovery 模式(约 5 秒松手)
- 通电前先断电:插 SD 卡进摄像头前务必确认摄像头已断电;万一忘了断电就插卡、看到黄灯瞬间高亮,立刻断电,不影响后续正式操作
- 写入过程中别断电:黄灯开始规律闪烁(bootloader 正在写 flash)后,绝对不要断电、不要拔卡,让流程自己跑完;中途断电 = 分区写一半,比没救砖更难收拾
- 判断成功:黄灯规律闪烁 / “ling”声 / 云台转动 / App 恢复在线 / 夜视灯亮
15. 参考链接
- 魔改固件仓库(含 unbrick 救砖目录):
https://github.com/roleoroleo/yi-hack-Allwinner-v2 - 救砖官方说明(unbrick/README.md):
https://github.com/roleoroleo/yi-hack-Allwinner-v2/tree/master/unbrick - 救砖 Wiki(Unbrick the cam):
https://github.com/roleoroleo/yi-hack-Allwinner-v2/wiki/Unbrick-the-cam
16. 后记
说起来,3 月份刷坏的时候,我一度打算买根 USB-TTL 线走硬刷救砖。当时盯着那几颗锈蚀的螺丝,还先喷了点除锈剂准备开盖,后来各种原因也没能拆开,更没去主板上看丝印、确认机型,这台摄像头就一直搁下了。
这不,今天看着那已经风干的除锈剂,还有跟螺丝对不上的螺丝刀,索性也打消了开盖的念头,决定先上网查查救砖教程,看看该怎么下手。好在网上有总结好的软刷机救砖教程——不拆机、靠分区备份写回就能救活。于是先按不拆机的路子试,没想到一次就成了。
再想想为什么当初会刷坏:这种”杂牌”摄像头难找官方技术支持,根本不知道去哪找原厂刷机固件;能找到的那几个刷机固件,也没一个明确说支持”用某某方案”的这款产品。当时我就是拼着外观描述的型号盲猜、下错固件包才出的问题。
好在那个刷机脚本自带备份操作,我当时折腾各个固件的时候,也先把导出的分区备份留了一份下来。今天再借助 AI 把仓库里的救砖教程捋一遍,才把它救了回来。所以想刷 yi-hack 的朋友,备份脚本跑完一定留好分区 dump、机型先查 SN/固件版本别瞎猜型号,这两步省了,后面省不回来。
ChiuYut
2026年11月01日