Yuhang Zheng

OpenWRT系统定制方法

N 人看过

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)