QNAP QHora-321 OpenWRT固件教程
这边会发布一个能正常使用的OpenWRT,系统内核依赖基本齐全,固件在稍后时间发布到固件服务器上。 后期iStoreOS适配后,可以玩到功能更全面的OpenWRT,并且通过iStoreOS的源码开放,开放自己编译系统,敬请期待。
刷机教程
从原厂固件刷机到OpenWRT。
1、需要准备一条TTL线连接到QHora-321,需要注意的是TTL的针脚间距是2.0mm。QHora-321的TTL线接口如下所示,针脚定义从左到右依次为Tx、Vcc、Rx、Gnd。只需要连接Tx、Rx、Gnd即可。
2、准备一个U盘,U盘必须为FAT32格式,里面存放如下刷机文件,并把U盘插到QHora-321内部的USB接口上。 cn9131-qhora-321.dtb和Image用于启动临时OpenWRT。 mmcblk0p1.img和mmcblk0p3.img为固件镜像文件。 刷机文件可以在固件下载服务器下载到,也可以按下方第二部分教程自己制作。
3、使用波特率115200连接TTL线,给QHora-321上电,出现如下指令,快速按任意键,让QHora-321停止在U-Boot模式。
Hit any key to stop autoboot: 0
4、输入如下命令启动U-Boot的USB功能。
usb start
5、依次输入如下命令,从U盘加载临时OpenWRT,并且启动临时OpenWRT
fatload usb 0:1 0x6500000 Image
fatload usb 0:1 0x6000000 cn9131-qhora-321.dtb
booti 0x6500000 - 0x6000000
6、在OpenWRT的CLI中输入如下命令,挂载U盘
mkdir /tmp/sda1
mount /dev/sda1 /tmp/sda1
7、(可选)备份原来emmc分区镜像,此步操作为可选执行
dd if=/dev/mmcblk0p1 of=/tmp/sda1/mmcblk0p1.img.bak
dd if=/dev/mmcblk0p3 of=/tmp/sda1/mmcblk0p3.img.bak
8、输入如下命令将OpenWRT新固件写入QHora-321的emmc存储
dd if=/tmp/sda1/mmcblk0p1.img of=/dev/mmcblk0p1
dd if=/tmp/sda1/mmcblk0p3.img of=/dev/mmcblk0p3
9、重启路由器,依然需要按键重新进入U-Boot
reboot
10、修改U-Boot的启动命令
setenv bootcmd 'ext4load mmc 0:1 0x6500000 Image; ext4load mmc 0:1 0x6000000 cn9131-qhora-321.dtb; setenv bootargs $console cpuidle.off=1 root=/dev/mmcblk0p3; booti 0x6500000 - 0x6000000'
setenv current_entry 0
saveenv
11、输入命令重启进入OpenWRT
reset
12、如果需要切换到原厂系统,只需要更改U-Boot的启动命令
setenv bootcmd ' ext4load mmc 0:2 0x6500000 Image; ext4load mmc 0:2 0x6000000 cn9131-db-A.dtb; setenv bootargs $console cpuidle.off=1; booti 0x6500000 - 0x6000000'
setenv current_entry 2
saveenv
刷机文件制作
前面刷机教程第2部提到了刷机需要4个刷机文件,这里讲下如何从OpenWRT编译的镜像制作4个刷机文件。 1、op编译出来ext4-sdcard.img.gz为固件文件。initramfs-kernel.bin为带全文件的内核镜像文件。
initramfs-kernel.bin重命名为Image
2、使用7zip,解压ext4-sdcard.img.gz两次,得到0.img和1.img文件。
0.img重命名为mmcblk0p1.img
1.img重命名为mmcblk0p3.img
3、使用7zip,解压上一部得到得到的mmcblk0p1.img,得到cn9131-qhora-321.dtb
至此获取到了上文教程中的刷机文件。 要说明的是,临时OpenWRT因为是全部加载内存运行,对文件大小有要求。大家刷自编译和自定义固件时候,临时OP可以使用固件服务器提供的最小OpenWRT。
QHora-321 分区和引导
这部分内容作为给后期想要折腾的朋友的,普通玩家跳过即可。
QHora-321有2个存储空间,一个4MB的SPI存储和一个4GB的emmc存储。 SPI存储里面存放了引导的U-Boot和U-Boot对应的ENV配置变量。 emmc存储里面存放固件。
SPI一共4个分区
0x000000000000-0x0000001f0000 : "U-Boot"
0x0000001f0000-0x000000200000 : "U-Boot ENV Factory"
0x000000200000-0x0000003f0000 : "Reserved"
0x0000003f0000-0x000000400000 : "U-Boot ENV"
U-Boot从emmc中启动系统依赖ENV中的bootcmd设置
原厂的bootcmd设置
bootcmd = ext4load mmc 0:2 0x6500000 Image; ext4load mmc 0:2 0x6000000 cn9131-db-A.dtb; setenv bootargs $console cpuidle.off=1; booti 0x6500000 - 0x6000000
OpenWRT的bootcmd设置
bootcmd = ext4load mmc 0:1 0x6500000 Image; ext4load mmc 0:1 0x6000000 cn9131-qhora-321.dtb; setenv bootargs $console cpuidle.off=1 root=/dev/mmcblk0p3; booti 0x6500000 - 0x6000000'
引导过程最主要是指定dtb文件和内核镜像Image,使用不同固件dtb文件文件名不同时候需要对应修改。 OpenWRT的比起原厂多一个需要指定root=,用于指定OpenWRT的根分区。 QHora-321也能直接使用PUZZLE-M901的固件进行引导,但是会有点点小问题。
emmc默认分区格式如下
Disk /dev/mmcblk0: 3.69 GiB, 3959422976 bytes, 7733248 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Device Start End Sectors Size Type
/dev/mmcblk0p1 34 131105 131072 64M Linux filesystem
/dev/mmcblk0p2 131106 262177 131072 64M Linux filesystem
/dev/mmcblk0p3 262178 1310753 1048576 512M Linux filesystem
/dev/mmcblk0p4 1310754 2359329 1048576 512M Linux filesystem
/dev/mmcblk0p5 2359330 3407905 1048576 512M Linux filesystem
/dev/mmcblk0p6 3407906 3538977 131072 64M Linux filesystem
/dev/mmcblk0p7 3538978 7372833 3833856 1.8G Linux filesystem
p1 p2为Boot分区,p3 p4为系统的根分区 每个分区有2组实现双系统切换,因此刷OpenWRT时候都是写入到p1和p3分区。保证可以通过修改bootcmd可以切换2个系统。 p5为原厂固件用于存放日志的分区 p6位空预留 p7是原厂系统的实际运行的根分区
如果你要保留双系统,只需要按照教程刷写p1和p3分区即可,完全恢复出厂也是恢复p1和p3分区。 如果你希望把整个emmc用作OpenWRT的空间,想要大分区,你只需要重新格式化分区emmc即可,并修改对应的bootcmd。emmc使用GPT分区格式,重新分区在OpenWRT下操作也是非常简单。但是如果你重新格式化emmc,想要恢复原厂系统就不可能了。