海思机顶盒Hi3798使用Hitool和TTL备份并烧录海纳思Linux服务器系统固件
摘要
介绍了使用海思 CPU 的机顶盒的固件备份和烧录。通过 USB-TTL 串口烧录器 CH340 连接机顶盒,使用华为海思刷机工具 HiTool 创建和修改分区表文件,备份和烧写固件,通过升级包升级系统。在海纳思系统中安装homeassistant,通过 FTP、WebDAV、Alist云盘访问文件,真实的 CPU 型号和 reg name 的确定,以及加快烧写速度的方法。
背景说明
使用 Home assistant(后文缩写为 HA)需要个人服务器,根据不同的情况有不同的家用 Linux 服务器方案。
服务器方案
优点
缺点
旧手机
体积小、功耗低、价格低
性能低、网络受限
机顶盒
体积小、功耗低、价格低
性能低、网络受限
树莓派
体积小、功耗低
价格贵、性能中、网络受限
迷你主机
体积小、价格中
功耗中、性能中、网络受限
NAS
体积中、价格中
功耗高、性能高、网络受限
电脑/服务器
性能高
价格贵、体积大、功耗高、网络受限
云服务器
网络不受限,性能高
价格贵
旧手机可用于简单的功能验证,安装较为复杂,也容易出现问题。目前常用的方案有termux、termux+proot、Alpine Term+docker、linux deploy(需要 root 权限)。termux 和 termux+proot 方案主要是通过安装 Python 来安装 HA。经过尝试,termux 安装 HA 会出现依赖报错;termux+proot+debian 启动 HA 时会出现版本错误的提示;Alpine Term+docker 安装 HA 后可以正常运行,但性能极低卡顿严重。
机顶盒可用于简单的个人使用,安装难度一般,不容易出现问题。目前常用的有Armbian、海纳思系统这两种方案,主要是通过安装 docker 来安装 HA。海纳思系统 主要支持海思芯片中的 Hi3798MV100 、Hi3798MV200 、Hi3798MV300 ,不支持Hi3798MV300H 等带后缀的处理器。Armbian 主要支持晶晨芯片中的 S9xx 系列。
原本是打算对型号为CM211-2的机顶盒进行刷机,后来发现 CPU 型号为Hi3798MV300H。于是改为对型号为HG680-j且 CPU 为Hi3798MV100的机顶盒进行刷机。
操作实践
前提要求
软件:华为海思刷机工具HiTool,电视机顶盒工具开心电视助手(非必需)。
硬件:电脑,USB-TTL 串口烧录器 CH340,U 盘。
固件包:海纳思 hinas 固件 TTL-hi3798mv100-202301.zip
获取系统信息
使用网线将接机顶盒和电脑连接到网络,使用导线连接机顶盒和 USB-TTL 串口烧录工具。
打开HiTool后点击HiBurn。
设置PC 与板端配置参数。设置 本地 PC 配置下的串口 和 服务器 IP,板端配置下的IP 地址 和网关。串口 为 USB-TTL 串口烧录器所使用的端口号(查看方式:控制面板 -> 设备管理器 -> 端口(COM 和 LPT)),服务器 IP 为电脑的 IP 地址。 IP 地址 为机顶盒的 IP 地址,网关一般保持默认即可 。传输方式 选择 网口(推荐)。
获取中央处理器型号和管脚配置表。点击 打开终端工具 ,然后点击连接,最后给机顶盒上电。启动信息中的 Reg Name 包含管脚配置表、中央处理器型号、内存规格、PCB 板层数、闪存类型。
查看分区表。对于型号为CM211-2且 CPU 为Hi3798MV300H的机顶盒,启动信息中会显示分区表信息。而对于型号为HG680-j且 CPU 为Hi3798MV100的机顶盒,启动信息中不会显示分区表,需要执行cat /proc/cmdline命令查看分区表信息。
查看挂载信息。执行mount命令查看系统中所有的挂载文件系统。
查看闪存块分区。对于型号为CM211-2机顶盒,执行cd /dev/block/platform/soc/by-name和ls -al命令查看闪存块分区所指向的分区名。而对于型号为HG680-j机顶盒,执行cd /dev/block/platform/hi_mci.1/by-name和ls -al命令查看闪存块分区所指向的分区名。对于其它机顶盒,可在/dev/block/platform下的目录的子目录中寻找by-name文件夹。
查看文件系统信息。执行df命令查看系统中分区的大小和使用量。
根据系统中分区的使用量,清理无用信息为数据备份做准备。软件卸载可使用开心电视助手软件,此软件还可以便捷的获取分区表、挂载信息、文件系统信息等。
创建和修改分区表
设置芯片型号。点击芯片 -> 切换芯片 -> Hi3798MV100 。
点击 烧写 eMMC,点击表格右侧的绿色的加号以创建新的分区。
点击名称项,根据分区表输入分区名,并遵循闪存块分区中的区块顺序(从mmcblk0p1到mmcblk0p17)。
点击文件项里面的右侧的文件夹图标(选中时出现),在弹出的对话框中选择文件路径并在输入文件名后点击打开,建议文件名与分区名一致。
点击长度项,根据分区表设置对应分区的大小。
点击文件系统项,根据挂载信息选择对应分区的文件系统。此项只影响烧录的速度。
勾选要操作的分区前面的复选框。
点击eMMC分区表文件右侧的浏览,在弹出的对话框中选择文件路径并在输入文件名后点击打开,然后点击保存。建议文件名包含设备的 CPU 型号和闪存类型。
操作固件
备份固件
方法一:TTL+HiTool
在创建和修改分区表的最后一步点击上载。
弹出对话框后关闭机顶盒电源。
开启机顶盒电源。
等待对话框中的上载的进度条结束。
方法二:TTL+U 盘
点击 打开终端工具 ,然后点击连接,最后给机顶盒上电。
执行df命令查看系统中分区的使用情况。
插入 U 盘(FAT32 格式)后执行df命令查看系统中分区的使用情况,新出现的/mnt/sda/sda1表示 U 盘挂载成功。
执行cd /dev/block/platform/soc/by-name和ls -al命令查看闪存块分区所指向的分区名。
root@Hi3798MV300:/ # cd /dev/block/platform/soc/by-name
root@Hi3798MV300:/dev/block/platform/soc/by-name # ls -al
lrwxrwxrwx root root 1970-01-01 08:00 baseparam -> /dev/block/mmcblk0p5
lrwxrwxrwx root root 1970-01-01 08:00 boot -> /dev/block/mmcblk0p9
lrwxrwxrwx root root 1970-01-01 08:00 cache -> /dev/block/mmcblk0p14
lrwxrwxrwx root root 1970-01-01 08:00 fastboot -> /dev/block/mmcblk0p1
lrwxrwxrwx root root 1970-01-01 08:00 fastplay -> /dev/block/mmcblk0p8
lrwxrwxrwx root root 1970-01-01 08:00 logo -> /dev/block/mmcblk0p7
lrwxrwxrwx root root 1970-01-01 08:00 misc -> /dev/block/mmcblk0p10
lrwxrwxrwx root root 1970-01-01 08:00 partition -> /dev/block/mmcblk0p2
lrwxrwxrwx root root 1970-01-01 08:00 pqparam -> /dev/block/mmcblk0p6
lrwxrwxrwx root root 1970-01-01 08:00 recovery -> /dev/block/mmcblk0p3
lrwxrwxrwx root root 1970-01-01 08:00 securestore -> /dev/block/mmcblk0p12
lrwxrwxrwx root root 1970-01-01 08:00 swdb -> /dev/block/mmcblk0p13
lrwxrwxrwx root root 1970-01-01 08:00 swdevinfo -> /dev/block/mmcblk0p4
lrwxrwxrwx root root 1970-01-01 08:00 system -> /dev/block/mmcblk0p15
lrwxrwxrwx root root 1970-01-01 08:00 trustedcore -> /dev/block/mmcblk0p11
lrwxrwxrwx root root 1970-01-01 08:00 userdata -> /dev/block/mmcblk0p16
执行cd /mnt/sda/sda1命令以切换当前工作目录为/mnt/sda/sda1,执行mkdir FW_BK命令以在当前工作目录创建名为FW_BK的文件夹。
使用下面的dd命令备份分区。对于比较大的分区,应执行dd if=/dev/block/platform/soc/by-name/userdata | gzip > /mnt/sda/sda1/FW_BK/userdata.bin.gz命令以先压缩后输出。
dd if=/dev/block/platform/soc/by-name/fastboot of=/mnt/sda/sda1/FW_BK/fastboot.bin
dd if=/dev/block/platform/soc/by-name/partition of=/mnt/sda/sda1/FW_BK/partition.bin
dd if=/dev/block/platform/soc/by-name/recovery of=/mnt/sda/sda1/FW_BK/recovery.bin
dd if=/dev/block/platform/soc/by-name/swdevinfo of=/mnt/sda/sda1/FW_BK/swdevinfo.bin
dd if=/dev/block/platform/soc/by-name/baseparam of=/mnt/sda/sda1/FW_BK/baseparam.bin
dd if=/dev/block/platform/soc/by-name/pqparam of=/mnt/sda/sda1/FW_BK/pqparam.bin
dd if=/dev/block/platform/soc/by-name/logo of=/mnt/sda/sda1/FW_BK/logo.bin
dd if=/dev/block/platform/soc/by-name/fastplay of=/mnt/sda/sda1/FW_BK/fastplay.bin
dd if=/dev/block/platform/soc/by-name/boot of=/mnt/sda/sda1/FW_BK/boot.bin
dd if=/dev/block/platform/soc/by-name/misc of=/mnt/sda/sda1/FW_BK/misc.bin
dd if=/dev/block/platform/soc/by-name/trustedcore of=/mnt/sda/sda1/FW_BK/trustedcore.bin
dd if=/dev/block/platform/soc/by-name/securestore of=/mnt/sda/sda1/FW_BK/securestore.bin
dd if=/dev/block/platform/soc/by-name/swdb of=/mnt/sda/sda1/FW_BK/swdb.bin
dd if=/dev/block/platform/soc/by-name/cache of=/mnt/sda/sda1/FW_BK/cache.bin
dd if=/dev/block/platform/soc/by-name/system of=/mnt/sda/sda1/FW_BK/system.bin
dd if=/dev/block/platform/soc/by-name/userdata of=/mnt/sda/sda1/FW_BK/userdata.bin
烧录固件
方法一:TTL+HiTool
解压海纳思系统固件包TTL-hi3798mv100-202301.zip。
点击eMMC分区表文件右侧的浏览,在弹出的对话框中选择海纳思系统固件包中的 eMMC 分区表文件后点击打开。
勾选需要烧录的分区前面的复选框。
点击烧写。
弹出对话框后关闭机顶盒电源。
开启机顶盒电源。
等待对话框中的烧写的进度条结束。
方法二:TTL+U 盘
点击 打开终端工具 ,然后点击连接,最后给机顶盒上电。
执行df命令查看系统中分区的使用情况。
插入 U 盘(FAT32 格式)后执行df命令查看系统中分区的使用情况,新出现的/mnt/sda/sda1表示 U 盘挂载成功。
执行cd /dev/block/platform/soc/by-name和ls -al命令查看闪存块分区所指向的分区名。
root@Hi3798MV300:/ # cd /dev/block/platform/soc/by-name
root@Hi3798MV300:/dev/block/platform/soc/by-name # ls -al
lrwxrwxrwx root root 1970-01-01 08:00 baseparam -> /dev/block/mmcblk0p5
lrwxrwxrwx root root 1970-01-01 08:00 boot -> /dev/block/mmcblk0p9
lrwxrwxrwx root root 1970-01-01 08:00 cache -> /dev/block/mmcblk0p14
lrwxrwxrwx root root 1970-01-01 08:00 fastboot -> /dev/block/mmcblk0p1
lrwxrwxrwx root root 1970-01-01 08:00 fastplay -> /dev/block/mmcblk0p8
lrwxrwxrwx root root 1970-01-01 08:00 logo -> /dev/block/mmcblk0p7
lrwxrwxrwx root root 1970-01-01 08:00 misc -> /dev/block/mmcblk0p10
lrwxrwxrwx root root 1970-01-01 08:00 partition -> /dev/block/mmcblk0p2
lrwxrwxrwx root root 1970-01-01 08:00 pqparam -> /dev/block/mmcblk0p6
lrwxrwxrwx root root 1970-01-01 08:00 recovery -> /dev/block/mmcblk0p3
lrwxrwxrwx root root 1970-01-01 08:00 securestore -> /dev/block/mmcblk0p12
lrwxrwxrwx root root 1970-01-01 08:00 swdb -> /dev/block/mmcblk0p13
lrwxrwxrwx root root 1970-01-01 08:00 swdevinfo -> /dev/block/mmcblk0p4
lrwxrwxrwx root root 1970-01-01 08:00 system -> /dev/block/mmcblk0p15
lrwxrwxrwx root root 1970-01-01 08:00 trustedcore -> /dev/block/mmcblk0p11
lrwxrwxrwx root root 1970-01-01 08:00 userdata -> /dev/block/mmcblk0p16
使用下面的dd命令烧录分区。备份的固件所在的位置为FW_BK文件夹。对于比较大的分区,应执行gzip -dc /mnt/sda/sda1/FW_BK/userdata.bin.gz | dd of=/dev/block/platform/soc/by-name/userdata命令以先解压后输出。
dd if=/mnt/sda/sda1/FW_BK/fastboot.bin of=/dev/block/platform/soc/by-name/fastboot
dd if=/mnt/sda/sda1/FW_BK/partition.bin of=/dev/block/platform/soc/by-name/partition
dd if=/mnt/sda/sda1/FW_BK/recovery.bin of=/dev/block/platform/soc/by-name/recovery
dd if=/mnt/sda/sda1/FW_BK/swdevinfo.bin of=/dev/block/platform/soc/by-name/swdevinfo
dd if=/mnt/sda/sda1/FW_BK/baseparam.bin of=/dev/block/platform/soc/by-name/baseparam
dd if=/mnt/sda/sda1/FW_BK/pqparam.bin of=/dev/block/platform/soc/by-name/pqparam
dd if=/mnt/sda/sda1/FW_BK/logo.bin of=/dev/block/platform/soc/by-name/logo
dd if=/mnt/sda/sda1/FW_BK/fastplay.bin of=/dev/block/platform/soc/by-name/fastplay
dd if=/mnt/sda/sda1/FW_BK/boot.bin of=/dev/block/platform/soc/by-name/boot
dd if=/mnt/sda/sda1/FW_BK/misc.bin of=/dev/block/platform/soc/by-name/misc
dd if=/mnt/sda/sda1/FW_BK/trustedcore.bin of=/dev/block/platform/soc/by-name/trustedcore
dd if=/mnt/sda/sda1/FW_BK/securestore.bin of=/dev/block/platform/soc/by-name/securestore
dd if=/mnt/sda/sda1/FW_BK/swdb.bin of=/dev/block/platform/soc/by-name/swdb
dd if=/mnt/sda/sda1/FW_BK/cache.bin of=/dev/block/platform/soc/by-name/cache
dd if=/mnt/sda/sda1/FW_BK/system.bin of=/dev/block/platform/soc/by-name/system
dd if=/mnt/sda/sda1/FW_BK/userdata.bin of=/dev/block/platform/soc/by-name/userdata
升级固件
方法一:使用 TTL+HiTool+U 盘。烧写recovery到recovery,烧写emmc到misc,然后重启机顶盒以进入恢复模式,最后在恢复模式中选择apply update from external storage后选择 U 盘中的update.zip刷机包进行刷机。
方法二:使用 TTL+U 盘或者ADB+U 盘。使用dd命令输出recovery到recovery,emmc到misc,然后执行reboot命令以重启进入恢复模式,最后在恢复模式中选择apply update from external storage后选择 U 盘中的update.zip刷机包进行刷机。
方法三:使用ADB或TTL或TTL+HiTool烧写recovery后安装原生版本的设置软件包,进入原生版本的设置后选择本地升级以升级系统。升级包必须被命名为update.zip并位于 U 盘的根目录。软件包一般被命名为SWProductCheck.apk,可在卡刷救砖相关教程中搜寻。
方法四:把fastboot.bin、bootargs.bin、recovery.img三个文件复制到U盘根目录。短接强制刷机的短接点,然后打开机顶盒的电源,等待几秒后松开短接。机顶盒就会加载U 盘中的fastboot.bin并引导 U 盘中的recovery.img进入恢复模式,最后在恢复模式中选择apply update from external storage后选择 U 盘中的update.zip刷机包进行刷机。
方法五:把fastboot.bin、bootargs.bin、recovery.img三个文件复制到U盘根目录。使用ADB或TTL或TTL+HiTool擦除fastboot.bin分区。重启后机顶盒就会加载U 盘中的fastboot.bin并引导 U 盘中的recovery.img进入恢复模式,最后在恢复模式中选择apply update from external storage后选择 U 盘中的update.zip刷机包进行刷机。
使用简述
在浏览器输入机顶盒的IP地址以进入海纳思系统首页。
在首页点击外网,然后点击终端管理,初始用户名和密码分别为root和ecoo1234,可通过passwd root命令修改当前系统 root 账号的密码。
在终端管理页面输入apt install minidlna安装 MiniDLNA 软件。系统内置有基本功能的软件安装脚本, 输入以下命令即可自动安装并自动配置软件。Portainer 是可视化的容器镜像图形管理工具,青龙面板是支持 Python3、JavaScript、Shell、Typescript 脚本的定时任务管理平台,Home Assistant 是基于 Python 3 开发的集成现有智能家居生态的开源家庭自动化平台。
install-portainer.sh 安装 Docker 容器管理面板
install-qinglong.sh 安装 Docker 应用: 青龙面板
install-homeassistant.sh 安装智能家居控制面板
支持通过 FTP 或 SCP 等方式对服务器文档进行管理,初始用户名和密码分别为ubuntu和ecoo1234。SFTP 模式的 22 端口可访问根目录, FTP 模式的 21 端口则只能访问/home 目录。
内置的 WebDAV 服务器在 8081 端口,初始用户名和密码分别为admin和admin,默认存储位置在 /home/ubuntu/webdav。
内置的Alist云盘支持多种存储,支持网页浏览和 WebDAV 访问。初始用户名和密码分别为admin和admin123。
执行recoverbackup命令可以还原备份系统, 根分区内的数据将全部被原备份系统清除并覆盖。
注意事项
关于芯片型号:魔百盒 CM211-2 的 CPU 型号有 MV100、MV300、MV300H。实际的 CPU 型号以reg name中包含 CPU 型号或芯片本身的丝印为准。
关于reg name:芯片待烧录固件的fastboot中的reg name与机顶盒现有的fastboot中的reg name在管脚配置表和中央处理器型号上应保持一致,否则无法烧录fastboot。启动信息中显示的reg name仅供参考,实际的管脚配置表以机顶盒现有的fastboot中的reg name包含的管脚配置表为准。
关于HiBurn中的传输方式:无论传输方式选择串口还是网口,烧写fastboot时,实际上都是通过串口来传输数据,因此非常慢。
关于HiBurn中的文件系统:如果实际上存在文件系统但软件中的文件系统被设置为none时,在进行烧写操作时,分区镜像将会以二进制的形式进行传输;如果设置为一个确定的文件系统,如ext3/4时,在进行烧写操作时,分区镜像将会以压缩包的形式进行传输,即对镜像先压缩后传输,最后解压并写入分区。因此,在进行烧写操作时,设置文件系统可以减少分区镜像传输所需要的时间,最终加快总体的烧写速度。对于上载操作,无论是否设置软件中的文件系统,上载的分区镜像总是以二进制的形式进行传输,不会改变上载速度。
关于压缩:userdata分区的镜像大小会超过 4GB,超过 FAT32 文件系统限制,所以需要压缩。在使用dd命令时,结合分区的大小和使用量来决定是否进行压缩可以有效的节省空间占用和传输时间。
关于终端内容被覆盖丢失:点击窗口 -> 首选项 ,点击终端后修改终端缓存行数。
关于使用 HiTool 烧录和备份固件失败:点击窗口 -> 首选项,然后点击HiBurn,修改TFTP设置和命令设置。根据控制台的报错信息来修改对应的参数。有时重新操作一次也会恢复正常。
参考资料
海思机顶盒 NAS 海纳思系统使用指南
打造最强华为海思hi3798mv100/200/300机顶盒NAS服务器系统_华为盒子论坛_ZNDS
海思Hi3798MV300/Hi3798MV310/Hi3798MV300H共升级包使用指南芯片手册-手机|智能终端-海思平台-一牛网论坛
电视盒子芯片性能那家强?电视盒子变身 linux 系统装 docker 宝塔青龙打开盒子的另一片天地
【狗蛋】搭建一个属于家庭服务器,硬件、软件、配置推荐【万字长文持续更新】 - 知乎
魔百盒CM211-2网络机顶盒固件下载汇总及主板区分-评测/图文分享-安卓刷机固件网【麒麟刷机网】
河南移动cmcc-2 ch电视盒子Hi3798MV310线刷-卡刷-刷机-救砖 - 知乎
选择哪种方式刷入海思设备
海思hi3798mv300/300H通用解锁版recovery_中国移动魔百盒_ZNDS
魔百和CM211-2刷机(MV300芯片)朝歌代工拆机TTL破解固件 - 机顶盒/智能电视 数码之家
北京CM211-2 原厂救砖包 刷当贝 无需拆机教程_中国移动魔百盒_ZNDS
版权声明:本文为「梦幻之心星」原创,依据 CC BY-NC-SA 4.0 许可证进行授权,转载请附上原文出处链接及本声明。
博客园地址:https://www.cnblogs.com/Sky-seeker
微信公众号:关注微信公众号,获取即时推送