openwrt打包过程分析

首先下载对应的imagebuilder

以newifiD2为例, 是 https://mirrors.aliyun.com/openwrt/releases/23.05.4/targets/ramips/mt762...

展开后, 在top目录下.targetinfo文件里, 可以找到 profile名字叫DEVICE_d-team_newifi-d2

然后 make image PROFILE="DEVICE_d-team_newifi-d2" 就可以了,

要修改ipk列表,

make image PROFILE="DEVICE_d-team_newifi-d2" \
PACKAGES=“-wpad-basic-mbedtl wpad dnsmasq_route"

如果要包含一些自己配置文件,

make image PROFILE="DEVICE_d-team_newifi-d2" \
PACKAGES=“-wpad-basic-mbedtl wpad dnsmasq_route" \
FILES="/home/liushiwei/openwrt/myset"

具体的打包过程是用make的宏来做的,

到target/linux/ramips/images下搜索d-team_newifi-d2, 就可以找到对应的make文件

grep d-team_newifi-d2 target/linux/ramips/images/*

mt7621.mk:define Device/d-team_newifi-d2
mt7621.mk:TARGET_DEVICES += d-team_newifi-d2
 
vi mt7621.mk
define Device/d-team_newifi-d2
  $(Device/dsa-migration)
  $(Device/uimage-lzma-loader)
  IMAGE_SIZE := 32448k
  DEVICE_VENDOR := D-Team
  DEVICE_MODEL := Newifi D2
  DEVICE_PACKAGES := kmod-mt7603 kmod-mt76x2 kmod-usb3 \
        kmod-usb-ledtrig-usbport -uboot-envtools
endef
上面没有定义IMAGE*, 所以是没有特殊要求,使用的是Makefile里的define Device/Default:
define Device/Default
  IMAGES := sysupgrade.bin
  IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | check-size | append-metadata
endef
append-kernel, append-rootfs, pad-rootfs, check-size, append-metadata 这些个宏, 都在顶层目录的include/image-commands.mk里定义,
分别作用如下:
append-kernel: 增加内核到目标文件。
append-rootfs: 增加rootfs到目标文件
pad-rootfs: 对齐到4096,rom擦除块, 因为rootfs后面是jffs2的overlay, 也就是分区的分界点,必须对齐擦除块
check-size: 检查体积是否超过rom大小
append-metadata: 增加metadata信息,json格式的,型号版本等。
以上来看,newifid2的rom还是很简单的。
 
下面是netgear-3800ch的生成过程:
3800ch的定义在target/linux/ath79/image/generic.mk文件:
define Device/netgear_wndr3800
  $(Device/netgear_wndr3x00)
  DEVICE_MODEL := WNDR3800
  UIMAGE_MAGIC := 0x33373031
  NETGEAR_BOARD_ID := WNDR3800
  NETGEAR_HW_ID := 29763654+16+128
  IMAGE_SIZE := 15872k
  SUPPORTED_DEVICES += wndr3700
endef
真正的打包过程, 在netgear_wndr3x00 中:
define Device/netgear_wndr3x00
  $(Device/netgear_generic)
  SOC := ar7161
  DEVICE_PACKAGES := kmod-usb-ohci kmod-usb2 kmod-usb-ledtrig-usbport \
        kmod-leds-reset kmod-owl-loader kmod-switch-rtl8366s
endef
继续找netgear_generic的宏定义在common-netgear.mk文件中:
define Device/netgear_generic
  IMAGE/default := append-kernel | pad-to $$$$(BLOCKSIZE) | \
        netgear-squashfs | append-rootfs | pad-rootfs
  IMAGE/sysupgrade.bin := $$(IMAGE/default) | check-size | append-metadata
  IMAGE/factory.img := $$(IMAGE/default) | netgear-dni | check-size
endef
它的rom就比较特殊, 增加了一些步骤, 具体的操作, 可以去找这些宏的定义,看一下。


下面是一些常见的宏:
(top)/include/image-commands.mk:
define Build/append-kernel
        dd if=$(IMAGE_KERNEL) >> $@
endef
 
define Build/append-rootfs
        dd if=$(IMAGE_ROOTFS) >> $@
endef
 
define Build/pad-rootfs
        $(STAGING_DIR_HOST)/bin/padjffs2 $@ $(1) \
                $(if $(BLOCKSIZE),$(BLOCKSIZE:%k=%),4 8 16 64 128 256)
endef
 
define Build/netgear-dni
        $(STAGING_DIR_HOST)/bin/mkdniimg \
                -B $(NETGEAR_BOARD_ID) -v $(shell cat $(VERSION_DIST)| sed -e 's/[[:space:]]/-/g').$(firstword $(subst -, ,$(REVISION))) \
                $(if $(NETGEAR_HW_ID),-H $(NETGEAR_HW_ID)) \
                -r "$(1)" \
                -i $@ -o $@.new
        mv $@.new $@
endef
 
 
define Build/pad-rootfs
        $(STAGING_DIR_HOST)/bin/padjffs2 $@ $(1) \
                $(if $(BLOCKSIZE),$(BLOCKSIZE:%k=%),4 8 16 64 128 256)
endef