OpenWRT系统定制方法
OpenWRT的SDK是一套全自动的编译框架,其中是不包含编译需要的源码的。
以OK1046A-C OpenWRT开发为例
编译步骤为:
tar xvf openwrt_ok1046_v1.0.tar.bz2
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
cp ok1046_defconfig .config
make -j4
编译完成后内核及设备树位于:
build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-4.9.63/arch/arm64/boot/Image
build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-4.9.63/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1040-5559.dtb
build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-4.9.63/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1133-5559.dtb
文件系统位于:
staging_dir/target-aarch64_generic_musl/root-layerscape
编译过程中,OpenWRT会在官方源中下载源码,下载的源码会存放在OpenWRT根目录下的dl目录中
如果OpenWRT的源码都是使用的官方提供的,那我们怎么针对不同的开发板进行系统定制呢?
如果是改动内核配置文件的话:
在OpenWRT的根目录下直接运行
make kernel_menuconfig
根据需求配置完相应的内核模块后,相应的改动就会保存在内核配置文件中
内核的配置文件为:
target/linux/layerscape/armv8_64b/config-4.9
如果是改动内核源码的话:
我们需要将我们使用的OpenWRT从官网下载的内核源码解压到一个文件夹下
tar xvf ./dl/linux-4.9.63.tar.xz
然后将target/linux/layerscape/patches-4.9/路径下的patch按照数字从小到大的顺序打到内核源码上
zyh@1ffe9f7b637e:~/workspace/SOURCE/OpenWRT/OK104x-linux-openwrt-C2$ ls target/linux/layerscape/patches-4.9
201-config-support-layerscape.patch 806-flextimer-support-layerscape.patch 906-qsgmii-xfi-phy.patch
202-core-linux-support-layerscape.patch 808-guts-support-layerscape.patch 907-qspi.patch
301-arch-support-layerscape.patch 809-i2c-support-layerscape.patch 908-sdemmc-non-removable.patch
302-dts-support-layercape.patch 810-iommu-support-layerscape.patch 909-pwm-fan.patch
401-mtd-spi-nor-support-layerscape.patch 811-irqchip-support-layerscape.patch 910-ina220-shunt-resistor.patch
402-mtd-support-layerscape.patch 812-mmc-layerscape-support.patch 911_rtl8111f_rx8010_driver.patch
701-sdk_dpaa-support-layerscape.patch 813-qe-support-layerscape.patch 912-ls1043-aqr107-remove-irq.patch
702-pci-support-layerscape.patch 814-rtc-support-layerscape.patch 913-ls1043-rx8010-i2c-0-3.patch
703-phy-support-layerscape.patch 815-spi-support-layerscape.patch 914-fix-network-retransmit-issue.patch
704-fsl-mc-layerscape-support.patch 816-tty-serial-support-layerscape.patch 915-ls1043-emmc-hs200.patch
705-dpaa2-support-layerscape.patch 817-usb-support-layerscape.patch 916-ls1043-pwm-fan-use-tmu.patch
706-fsl_ppfe-support-layercape.patch 818-vfio-support-layerscape.patch 917-ls1043-hs200-limit-clock-100M.patch
801-ata-support-layerscape.patch 901-add-ls1043definconfig.patch 918-ls1046-1046-support.patch
802-clk-support-layerscape.patch 902-config-tmu-driver.patch 919-support-1046-C2.patch
803-cpufreq-support-layerscape.patch 903-config-gpio-driver.patch 920-add-huawei-5G.patch
804-crypto-support-layerscape.patch 904-config-add-ath10k.patch
805-dma-support-layerscape.patch 905-esdhc-support.patch
打完patch之后,我们可以将这个源码做一个git init
然后在此基础上做内核的源码改动,如添加驱动或者修改设备树等
源码改动完成后,我们可以先将改动使用commit提交到git,然后使用
git show > xxx_add_some_support.patch
生成patch,注意前面的xxx的数字要比target/linux/layerscape/patches-4.9路径下的所有的patch的数字都要大,然后再将此patch文件放到target/linux/layerscape/patches-4.9路径下。
然后重新编译OpenWRT即可。
对OpenWRT文件系统的改动:
暂时还未有可以像改动内核源码一样类似的方法,我们手册中给出的一种方法为:
将用户资料“工具”目录“fmc_1046.tar”文件拷贝到虚拟机/home/forlinx/work 目录
tar xvf /home/forlinx/work/fmc_1046.tar -C \
/home/forlinx/work/openwrt/staging_dir/target-aarch64_generic_musl/root-layerscape/
制作镜像
cd /home/forlinx/work/openwrt/staging_dir/target-aarch64_generic_musl
rm root-layerscape/lib/preinit/80_mount_root
sudo make_ext4fs -s -T -I -l 7489978368 OpenWRT.img root-layerscape
另一种方法为:直接操作生成的OpenWRT镜像:
img文件的两种格式:raw和sparse
一种是raw ext4 image,即经常说的raw image,使用file观察它:
forlinx@ubuntu:~/tools$ file root.raw.img
root.raw.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)
其特点是完整的ext4分区镜像(包含很多全零的无效填充区),可以直接使用mount进行挂载,因此比较大。
另一种是sparse ext4 image,即经常说的simg,使用file观察它:
forlinx@ubuntu:~/tools$ file root.img
root.img: data
就是说是一个非常普通的dat文件。由于它将raw ext4进行稀疏描述,因此尺寸比较小(没有全零的无效填充区,一般在300到500M之间)。
其中,网络上提供了源代码工具在两者之间转换:
https://github.com/anestisb/android-simg2img.git
首先对img镜像进行格式转化
simg2img OpenWRT_1133.img OpenWRT_1133_raw.img
然后将生成的raw格式镜像进行挂载
sudo mount OpenWRT_1133_raw.img /media/
这个时候就可以进入media目录直接对OpenWRT文件系统进行修改了
修改完成之后,重新生成img镜像
sudo make_ext4fs -s -T -I -l 7489978368 OpenWRT_1133.img /media/
卸载掉挂载目录
sudo umount /dev/loop1
此处的loop编号可以通过df命令查询
使用file命令查看这两种img文件如下:
zyh@1ffe9f7b637e:~$ file OpenWRT_1133.img
OpenWRT_1133.img: Android sparse image, version: 1.0, Total of 1828608 4096-byte output blocks in 1004 input chunks.
zyh@1ffe9f7b637e:~$ file OpenWRT_1133_raw.img
OpenWRT_1133_raw.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)