Flippy固件打包方式提炼

固件打包所需环境

固件编译的配置相关

  1. 固件必需的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
> Target System	 > QEMU ARM Virtual Machine			# OpenWrt v22.03以下架构配置
> Subtarget > QEMU ARMv8 Virtual Machine (cortex-a53)
> Target Profile > Default

> Target System > Arm SystemReady (EFI) compliant # OpenWrt 23.05以上架构配置
> Subtarget > 64-bit (armv8) machines
> Target Profile > Generic EFI Boot

> Target Images > tar.gz
> Base system > dnsmasq-full # 与dnsmasq二选一,否则会冲突报错
> Base system > wireless-tools # 无线扫描联网功能
> Network > WirelessAPD > hostapd-common
> Network > WirelessAPD > wpad-basic
> Network > WirelessAPD > wpa-cli
> Network > iw

> Libraries > libpam # 开启WiFi6需要它
> Kernel modules > Wireless Drivers > kmod-mt7916-firmware # 自动选择mac cfg80211等,否则hostapd编译会报错

> LuCI > Collections > luci
> LuCI > Modules > luci-compat
> LuCI > Modules > Translations > Chinese Simplified (zh_Hans)
> LuCI > Protocols > luci-proto-modemmanager

> Utilities > kmod # 内核模块工具
> Utilities > Disc > parted # 磁盘扩容所需
> Utilities > Filesystem > resize2fs # 磁盘扩容所需
> Utilities > Filesystem > e2fsprogs # mkfs.ext4程序


# 可选的配置
> LuCI > Collections > luci-ssl # WEB界面启用https访问,这两行为uhttpd支持
> Libraries > Networking > libuhttpd-wolfssl # 也可换为luci-ssl-openssl libuhttpd-openssl
  1. 手动扩容磁盘
1
2
3
4
# 刷完固件后,可通过下面操作来扩容root分区到100%
parted /dev/mmcblk0 resizepart 2 100% # 扩容第二分区ROOT到 100%
partprobe /dev/mmcblk0p2 # 重读指定设备的分区表信息
resize2fs /dev/mmcblk0p2 # 调整ext4文件系统空间大小

打包时变量的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PLATFORM=rockchip
SOC=rk3588
BOARD=h88k-v3

KERNEL_VERSION="5.10.160-rk3588-flippy-2405a"
KERNEL_PKG_HOME="${PWD}/kernel"
MODULES_TGZ=${KERNEL_PKG_HOME}/modules-${KERNEL_VERSION}.tar.gz
BOOT_TGZ=${KERNEL_PKG_HOME}/boot-${KERNEL_VERSION}.tar.gz
DTBS_TGZ=${KERNEL_PKG_HOME}/dtb-rockchip-${KERNEL_VERSION}.tar.gz

FMW_HOME="${PWD}/files/firmware"
BOOTFILES_HOME="${PWD}/files/bootfiles/rockchip/rk3588/h88k-v3"
BOOTLOADER_IMG="${PWD}/files/rk3588/h88k-v3/rk3588-h88k-bootloader.bin"

WIRELESS_CONFIG="${PWD}/files/rk3588/h88k-v3/wireless"
NETWORK_SERVICE_PATCH="${PWD}/files/rk3588/h88k-v3/network.patch"
BOARD_HOME="${PWD}/files/rk3588/h88k-v3/board.d"

KMOD_BLACKLIST="${PWD}/files/kmod_blacklist"
SYSCTL_CUSTOM_CONF="${PWD}/files/99-custom.conf"

OPWRT_ROOTFS_GZ="${PWD}/openwrt-armvirt-64-default-rootfs.tar.gz"
TGT_IMG="${PWD}/openwrt_${SOC}_${BOARD}_k${KERNEL_VERSION}.img"

创建镜像分区并挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SKIP_MB=16
BOOTFS_MB=256
ROOTFS_MB=1024

TGT_BOOT="${PWD}/tmp/tgt_boot"
TGT_ROOT="${PWD}/tmp/tgt_root"
mkdir -p $TGT_BOOT $TGT_ROOT

dd if=/dev/zero of="$TGT_IMG" bs=1M count="$((SKIP_MB + BOOTFS_MB + ROOTFS_MB + 1))" conv=fsync && sync
losetup -f -P "$TGT_IMG"
TGT_DEV=$(losetup | grep "$TGT_IMG" | gawk '{print $1}')

parted -s "$TGT_DEV" mklabel "gpt"
parted -s "$TGT_DEV" mkpart primary ext4 "$(($SKIP_MB * 1024 * 1024))"b "$[($SKIP_MB + $BOOTFS_MB) * 1024 * 1024 - 1]"b
parted -s "$TGT_DEV" mkpart primary ext4 "$[($SKIP_MB + $BOOTFS_MB) * 1024 * 1024]"b "100%"

BOOTFS_UUID=$(uuidgen) # cd8a1775-0527-4026-8c7d-ea2295a7c691
ROOTFS_UUID=$(uuidgen) # f4b6a401-1298-45fb-934e-fb4af83d8f5e
mkfs.ext4 -U ${BOOTFS_UUID} -L "BOOTFS" -b 4k "${TGT_DEV}p1"
mkfs.ext4 -U ${ROOTFS_UUID} -L "ROOTFS" -b 4k "${TGT_DEV}p2"

mount -t ext4 "${TGT_DEV}p1" "${TGT_BOOT}"
mount -t ext4 "${TGT_DEV}p2" "${TGT_ROOT}"

释放并优化根文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 释放 Openwrt rootfs 压缩包
cd ${TGT_ROOT} && \
tar --exclude="./lib/firmware/*" --exclude="./lib/modules/*" -xzf "$OPWRT_ROOTFS_GZ" && \
mkdir -p boot rom overlay proc sys run ./etc/modprobe.d ./etc/modules.d.remove && \
sync

# 裁减 Rootfs 中用不到的文件
cd ${TGT_ROOT}
rm -rf ./lib/firmware/* ./lib/modules/*
rm -f ./etc/docker-init ./sbin/firstboot ./sbin/jffs2reset ./sbin/jffs2mark
[ -f ./etc/ppp/options-opkg ] && mv ./etc/ppp/options-opkg ./etc/ppp/options
chmod 755 ./etc/init.d/*

# 复制 Added firmware 文件
cd ${TGT_ROOT} && cp -a ${FMW_HOME}/* ./lib/firmware/ && sync

# 释放 Kernel modules 压缩包
cd ${TGT_ROOT} && \
mkdir -p lib/modules && \
cd lib/modules && \
tar xzf ${MODULES_TGZ} && \
cd ${KERNEL_VERSION}/ && \
find . -name '*.ko' -exec ln -sf {} . \; && \
rm -f "build" "source" "ntfs.ko" && \
sync

# 复制增补的文件
cd $TGT_ROOT
cp -v $WIRELESS_CONFIG ./etc/config/
patch -p1 < $NETWORK_SERVICE_PATCH
rm -rf ./etc/board.d/* && cp -v $BOARD_HOME/* ./etc/board.d/

# 调整 getty 配置
cd $TGT_ROOT
cat > ./etc/inittab <<EOF
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
tty1::askfirst:/usr/libexec/login.sh
ttyS2::askfirst:/usr/libexec/login.sh
ttyFIQ0::askfirst:/usr/libexec/login.sh
EOF

# 创建 fstab 配置文件
cd $TGT_ROOT
cat > ./etc/fstab <<EOF
UUID=${ROOTFS_UUID} / ext4 noatime,errors=remount-ro 0 1
UUID=${BOOTFS_UUID} /boot ext4 noatime,errors=remount-ro 0 2
#tmpfs /tmp tmpfs defaults,nosuid 0 0
EOF

# 启用自定义的内核优化参数
cp -v ${SYSCTL_CUSTOM_CONF} ./etc/sysctl.d/

# 禁用黑名单中的内核模块
[ -d ./etc/modules.d.remove ] || mkdir -p ./etc/modules.d.remove
for mod in $(cat ${KMOD_BLACKLIST}) ;do
mv -f ./etc/modules.d/${mod} ./etc/modules.d.remove/ 2>/dev/null
done

# 启用自定义的 soc 内核模块
echo "mt7915e wed_enable=Y" > ./etc/modules.d/mt7915e
echo "bifrost_kbase" > ./etc/modules.d/rk_gpu
echo "rknpu" > ./etc/modules.d/rk_npu

# 启用 USB RTL8152/8153/8156 网卡驱动
[ -f ./etc/modules.d/usb-net-rtl8152 ] || echo "r8152" > ./etc/modules.d/usb-net-rtl8152

# 启用看门狗驱动
echo "dw_wdt" > ./etc/modules.d/watchdog

解压并更改启动分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 释放 Kernel zImage、uInitrd 及 dtbs 压缩包
cd ${TGT_BOOT} && \
cp -v "${BOOTFILES_HOME}"/* . && \
tar xzf "${BOOT_TGZ}" && \
rm -f initrd.img-${KERNEL_VERSION} && \
ln -sf vmlinuz-${KERNEL_VERSION} Image && \
ln -sf uInitrd-${KERNEL_VERSION} uInitrd && \
mkdir -p dtb-${KERNEL_VERSION}/rockchip && \
ln -sf dtb-${KERNEL_VERSION} dtb && \
cd dtb/rockchip && \
tar xzf "${DTBS_TGZ}" && \
sync

# 修改引导分区相关配置
cd $TGT_BOOT
cat > armbianEnv.txt <<EOF
verbosity=7
bootlogo=true
fdtfile=rockchip/rk3588-hlink-h88k-v3.dtb
rootdev=UUID=${ROOTFS_UUID}
rootfstype=ext4
console=serial
consoleargs=console=ttyFIQ0 console=tty1
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
earlycon=on
docker_optimizations=on
extraargs=
extraboardargs=net.ifnames=0
overlay_prefix=rk3588
overlays=
user_overlays=
EOF

# 写入 u-boot 到磁盘镜像,rockchip的bootloader统一从磁盘的第65个扇区开始至16MB这个范围
dd if=${BOOTLOADER_IMG} of=${TGT_DEV} conv=fsync,notrunc bs=512 skip=64 seek=64

# 卸载镜像
cd ${TGT_BOOT}/../
umount -f * 2>/dev/null
losetup -D

打包所需文件列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 以下文件皆来自:https://github.com/unifreq/openwrt_packit
.
├── kernel
│   ├── boot-5.10.160-rk3588-flippy-2405a.tar.gz
│   ├── dtb-rockchip-5.10.160-rk3588-flippy-2405a.tar.gz
│   └── modules-5.10.160-rk3588-flippy-2405a.tar.gz
├── openwrt-armvirt-64-default-rootfs.tar.gz
└── files
   ├── 99-custom.conf
   ├── kmod_blacklist
   ├── firmware
   │   ├── mali_csffw.bin
   │   ├── mediatek
   │   │   ├── mt7916_eeprom.bin
   │   │   ├── mt7916_rom_patch.bin
   │   │   ├── mt7916_wa.bin
   │   │   └── mt7916_wm.bin
   │   ├── regulatory.db
   │   ├── regulatory.db.p7s
   │   └── rtl_nic
   │      └── rtl8125b-2.fw
   ├── bootfiles
   │   └── rockchip
   │   └── rk3588
   │   └── h88k-v3
   │   ├── armbianEnv.txt
   │   └── boot.scr
   └── rk3588
   └── h88k-v3
      ├── board.d
      │   ├── 00_model
      │   ├── 01_led
      │   └── 99-default_network
      ├── network.patch
      ├── wireless
      └── rk3588-h88k-bootloader.bin