本文来源http://blog.csdn.net/gt945/article/details/12209105
由于openwrt编译出来的文件默认为通用格式的uImage,squashfs根文件系统是lzma压缩过的,这样的镜像烧到机器上是启动不起来的,Magic Number和Checksum无法通过。
解决方案有二:
1.修改uboot,使其支持openwrt的默认格式。
2.将镜像和根文件系统按照wnr2200的方式打包。
由于没有编程器,uboot刷坏了就砖了,而且修改uboot之后想要再换回官方固件非常麻烦,因此我采取的是方案2。
官方uboot在启动的时候,先检验flash中0x50000处的Magic Number,然后对整个分区进行校验。 0x50000处对应的其实是一个squashfs文件系统,当校验正确之后,就会通过fsload命令加载内核并启动。
我们要做的就是依葫芦画瓢,生成一个合法的分区即可,我将0x50000指定为kernel分区,大小为1.5M,能放下大部分内核了。kernel分区是一个squashfs文件系统,里面只放一个uImage,方便起见,弄了一个脚本。要注意,${BASE_DIR}/bin/目录下的程序一定要官方代码中生成的。
#!/bin/bash BASE_DIR=${PWD} OPENWRT_BIN=/home/tao/workspace/OpenWRT/openwrt/bin/ar71xx/ IMAGE_NAME="WNR2200 Openwrt" MAX_IMAGE_SIZE=6750208 MKIMAGE=${BASE_DIR}/bin/mkimage MKSQUASHFS=${BASE_DIR}/bin/mksquashfs-lzma CHECKSIZE=${BASE_DIR}/bin/checksize APPENDSUM=${BASE_DIR}/bin/appendsum rm -rf ${BASE_DIR}/output mkdir ${BASE_DIR}/output/root/image -p cp ${OPENWRT_BIN}/openwrt-ar71xx-generic-root.squashfs ${BASE_DIR}/output/root.fs ${MKIMAGE} -A mips -O linux -T kernel -a 80060000 -e 80060000 -C lzma -d ${OPENWRT_BIN}/openwrt-ar71xx-generic-vmlinux.lzma ${BASE_DIR}/output/root/image/uImage ${MKIMAGE} -A mips -O linux -T kernel -a 80060000 -e 80060000 -C lzma -d ${OPENWRT_BIN}/openwrt-ar71xx-generic-vmlinux-initramfs.lzma ${BASE_DIR}/output/uImage-initramfs ${MKSQUASHFS} ${BASE_DIR}/output/root ${BASE_DIR}/output/root.squashfs -nopad -noappend -root-owned -be dd if=${BASE_DIR}/output/root.squashfs of=${BASE_DIR}/output/tmpfile.1 bs=64k conv=sync echo -ne '\xde\xad\xc0\xde' >> ${BASE_DIR}/output/tmpfile.1 dd of=${BASE_DIR}/output/root.squashfs if=${BASE_DIR}/output/tmpfile.1 bs=64k conv=sync echo -ne '\xde\xad\xc0\xde' >> ${BASE_DIR}/output/root.squashfs rm ${BASE_DIR}/output/tmpfile.1 ${MKIMAGE} -A mips -O linux -T filesystem -C none -a 0x9f050000 -e 0x9f050000 -name "${IMAGE_NAME}" -d ${BASE_DIR}/output/root.squashfs ${BASE_DIR}/output/image.pad ${CHECKSIZE} ${BASE_DIR}/output/image.pad ${MAX_IMAGE_SIZE} ${APPENDSUM} ${BASE_DIR}/output/image.pad ${BASE_DIR}/output/image.img rm ${BASE_DIR}/output/image.pad
执行脚本之后会生成image.img,将该文件刷到0x50000,uboot就能正确验证,并加载内核。
为了兼容wnr2200, uImage的打包也不同,见脚本中的
${MKIMAGE} -A mips -O linux -T kernel -a 80060000 -e 80060000 -C lzma -d ${OPENWRT_BIN}/openwrt-ar71xx-generic-vmlinux.lzma ${BASE_DIR}/output/root/image/uImage做完以上工作,openwrt就能在wnr2200上正确启动了,剩下的就和常规openwrt一样了。