H88K的BSP内核运行LEDE系统

配置环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Ubuntu 22.04 WSL2下为H88K编译LEDE,WSL1不支持后续步骤
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libfuse-dev libglib2.0-dev libgmp3-dev \
libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libpython3-dev libreadline-dev \
libssl-dev libtool lrzsz mkisofs msmtp ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 \
python3-pyelftools python3-setuptools qemu-utils rsync scons squashfs-tools subversion swig texinfo \
uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

# WSL编译的话可能需要如下剔除Windows的PATH内容
sudo vi /etc/wsl.conf
[interop]
appendWindowsPath = false


# WSL2上由于网络隔离了,所以需要先宿主机防火墙放行再设置虚拟机的代理
# PowerShell中运行来放开对wsl2的局域网访问权限, 设置 -> 防火墙 -> 高级设置 -> 入站规则中可看到
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow

# 设置虚拟机的代理,没有跳过。以下类似:export all_proxy="http://172.23.240.1:7890"
proxy_port=7890
proxy_host=$(ip route | awk '/default/ {print $3}')
export all_proxy="socks5://${proxy_host}:${proxy_port}"

获取源码

1
2
3
4
5
6
7
8
9
10
11
12
13
# 获取官方指定版本源码,这里以大雕源码为例
# git clone -b v22.03.6 --depth=1 https://git.openwrt.org/openwrt/openwrt.git
# git clone -b v23.05.3 --depth=1 https://git.openwrt.org/openwrt/openwrt.git

# 获取大雕的魔改源码和Flippy的构建套件
git clone --depth=1 https://github.com/coolsnowwolf/lede.git
git clone --depth=1 https://github.com/unifreq/openwrt_packit.git
cd lede

# 以后每次编译前建议执行以下三行命令更新源码
git pull
./scripts/feeds update -a
./scripts/feeds install -a

开始编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 适用于官方v23.05的配置文件,但这里以LEDE的为例
# wget -O .config https://github.com/ophub/amlogic-s9xxx-openwrt/raw/main/config/openwrt-main/config

# 拷贝Flippy的lede编译配置文件
cp ../openwrt_packit/files/openwrt_config_demo/arm64-r23.10.31-20231031-huge.config .config

# 开始编译
make menuconfig # 进入固件配置界面
make download V=s -j8 # 下载所需源码,请尽量使用梯子
make V=s -j$(nproc) # 首次编译推荐用单线程

# 清理相关
make clean # 在源码有大规模更新或者内核更新后执行,以保证编译质量,此操作会删除/bin和/build_dir目录中的文件
make dirclean # 更换架构编译前必须执行,此操作相当于 make clean 以及删除/staging_dir、/toolchain、/tmp和/logs中的文件
make distclean # 除非打算 push 到远程仓库 否则几乎用不到,此操作相当于 make dirclean 外加删除/dl、/feeds目录和.config文件

固件配置

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
> 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

###########################################################
# (可选)磁盘扩容需要 /etc/first_run.sh
> Utilities > Disc > lsblk
> Utilities > Disc > blkid
> Utilities > Disc > parted
> Utilities > Shells > bash
> Utilities > Filesystem > btrfs-progs
> Utilities > Filesystem > e2fsprogs
# (可选)获取设备信息脚本 /etc/balethirq.pl /usr/bin/cpustat
> Languages > Perl > perl-http-date
> Languages > Perl > perlbase-file
> Languages > Perl > perlbase-getopt
> Languages > Perl > perlbase-unicode

生成镜像

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
# 安装依赖
sudo apt install btrfs-progs dosfstools uuid-runtime fdisk parted gawk

# public_funcs : 如果存在 openwrt-armvirt-64-generic-rootfs.tar.gz 就使用这个
# openwrt_flippy.sh : PACKAGE_FILE="openwrt-armvirt-64-generic-rootfs.tar.gz" 指定名
# 编译完成后复制到 openwrt_packit/ 下待用,命名和路径如上
cp lede/bin/targets/armvirt/64/openwrt-armvirt-64-generic-rootfs.tar.gz openwrt_packit/
cd openwrt_packit/


# 可以修改如下 RK3588_KERNEL_VERSION 和 KERNEL_PKG_HOME 来指定内核版本和存放位置
cat > openwrt_packit/whoami <<EOF
WHOAMI=leux
OPENWRT_VER="R23.12.23"
DISTRIB_REVISION="r20265-f85a79bcb4"
DISTRIB_DESCRIPTION="OpenWrt 22.03.6 r20265-f85a79bcb4"
RK3588_KERNEL_VERSION="5.10.160-rk3588-flippy-2405a"
KERNEL_PKG_HOME="/home/leux/openwrt_packit/kernel"
OP_ROOT_TGZ="openwrt-armvirt-64-generic-rootfs.tar.gz"
EOF


# Flippy的预编译内核:https://pan.baidu.com/s/1tY_-l-Se2qGJ0eKl7FZBuQ?pwd=846l
# 拷贝Flippy提供的内核到上面 KERNEL_PKG_HOME 中
cp boot-5.10.160-rk3588-flippy-2311b.tar.gz openwrt_packit/kernel/
cp modules-5.10.160-rk3588-flippy-2311b.tar.gz openwrt_packit/kernel/
cp dtb-rockchip-5.10.160-rk3588-flippy-2311b.tar.gz openwrt_packit/kernel/
cp header-5.10.160-rk3588-flippy-2311b.tar.gz openwrt_packit/kernel/


# 开始构建镜像
sudo ./mk_rk3588_h88k-v3.sh

# 构建完成后拷贝镜像
cp openwrt_packit/output/openwrt_rk3588_h88k-v3_R23.12.23_k5.10.160-rk3588-flippy-2311b.img /mnt/d/test/

# 完全清理
sudo rm -rf openwrt_packit/tmp/ openwrt_packit/output/ openwrt_packit/openwrt-armvirt-64-generic-rootfs.tar.gz
rm /mnt/d/test/*

编译相关

  1. 修改默认主题为 Argon

修改 lede/feeds/luci/collections/luci/Makefile+luci-theme-bootstrap 替换成 +luci-theme-argon

  1. 关于LEDE源码编译构建后WEB管理后台无法打开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
错误显示:daemon.err uhttpd[5343]: Failed to initialize ustream-ssl
问题原因:是由于LEDE将openssl升级到3.0导致的,回滚到v1.1.1可解决问题

方法一:无需替换openssl,修改/etc/config/uhttpd文件中注释掉2行 listen_https 再重启即可解决

方法二:删除自带的3.0,使用持续更新的istore的openssl来顶替
cd lede/package/libs/ && rm -rf openssl/
cp -r istoreos/package/libs/openssl/ openssl/

方法三:也可以通过git回退到openssl未升级3.0时再编译
git log --pretty=oneline # 查看历史提交的ID
7494eb16185a176de226f55e842cadf94f1c5a11 openssl: bump to 3.0.10
a2a0e5b9f6ce420398487ea29a85b0b0c49c9087 ipq-wifi: bump to latest git HEAD

git checkout a2a0e5b9f6ce420398487ea29a85b0b0c49c9087 # 回退到未升级3.0时
  1. lean的源经常开倒车又不做测试就把源码发出来了!所以遇到一些包错误直接用官方版本替换对应源码包即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Disabling debugger
Disabling profiler
checking for x86_64-pc-linux-gnu-xml2-config... /home/leux/lede/staging_dir/hostpkg/bin/x86_64-pc-linux-gnu-xml2-config
configure: error: Could not find libxml2 anywhere, check ftp://xmlsoft.org/.
make[3]: *** [Makefile:167: /home/leux/lede/build_dir/hostpkg/libxslt-1.1.34/.configured] Error 1
make[3]: Leaving directory '/home/leux/lede/feeds/packages/libs/libxslt'
time: package/feeds/packages/libxslt/host-compile#3.10#5.57#9.81
ERROR: package/feeds/packages/libxslt [host] failed to build.
make[2]: *** [package/Makefile:114: package/feeds/packages/libxslt/host/compile] Error 1
make[2]: Leaving directory '/home/leux/lede'
make[1]: *** [package/Makefile:110: /home/leux/lede/staging_dir/target-aarch64_generic_musl/stamp/.package_compile] Error 2
make[1]: Leaving directory '/home/leux/lede'
make: *** [/home/leux/lede/include/toplevel.mk:231: world] Error 2
leux@B650:~/lede$

# 使用openwrt官方的包替换掉它
rm -rf lede/package/feeds/packages/libxslt/*
cp -r openwrt/package/feeds/packages/libxslt/* lede/package/feeds/packages/libxslt/

# 测试是否依旧报错
make package/feeds/packages/libxslt/host/compile V=s
  1. 二次修改rootfs
1
2
3
4
5
6
7
8
# 别人的rootfs解压修改
mount /root/rootfs.img /mnt/root/
cd /mnt/root/
tar -czvf /mnt/nvme0n1p1/openwrt-armvirt-64-generic-rootfs.tar.gz ./*


# 打包当前rrootfs
tar -czvf /home/leux/openwrt_packit/openwrt-armvirt-64-generic-rootfs.tar.gz ./*

打包相关

  1. 系统镜像构建脚本的大多数操作都在 openwrt_packit/public_funcs 文件的函数中定义
1
2
3
4
5
6
7
8
9
10
11
12
# 如需修改SSH登录欢迎界面中系统创作者,可在该脚本第1179行更改(by lean & lienol)
Base on OpenWrt ${OPENWRT_VER} by lean & lienol >> etc/banner

# 登录SSH欢迎界面下方显示的系统信息,由本脚本中 function copy_supplement_files() 函数实现
# 它会把 mk_rk3588_h88k-v3.sh 脚本中定义的 SYSINFO_SCRIPT 复制到 /etc/profile.d/30-sysinfo.sh
# 它依赖一个perl脚本 /usr/bin/cpustat 来实现设备信息的获取

# 该脚本第669行的 function extract_rootfs_files() 函数执行的步骤如下
# 释放 Openwrt rootfs 压缩包,裁减 Rootfs 中用不到的文件,重新链接 kmod 程序
# 释放 Armbian firmware 压缩包,复制 Added firmware 文件,优化 firmware,释放 Kernel modules 压缩包

# 该脚本第855行的 function extract_rockchip_boot_files() 函数用来 释放 Kernel zImage、uInitrd 及 dtbs 压缩包
  1. 构建脚本 mk_rk3588_h88k-v3.sh 文件末尾执行的函数作用如下,不需要可注释掉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
copy_supplement_files				# 复制增补文件
extract_glibc_programs # 释放基于 glibc 的增补程序包
adjust_docker_config # docker 配置调整
adjust_openssl_config # openssl 配置调整
adjust_qbittorrent_config # 调整 qbittorrent 配置
adjust_getty_config # 调整 getty 配置
adjust_samba_config # 调整 samba server 配置
adjust_nfs_config "mmcblk0p4" # 调整 nfs server 配置
adjust_openssh_config # 调整 openssh 配置
adjust_openclash_config # 调整 openclash 配置
use_xrayplug_replace_v2rayplug # 用 xray 代替 v2ray (如果v2ray不存在)
create_fstab_config # 生成 openwrt 所需的 fstab 文件
adjust_turboacc_config # 调整 turboacc 相关配置
adjust_ntfs_config # 调整 ntfs 配置
adjust_mosdns_config # mosdns 配置调整
patch_admin_status_index_html # 主页CPU状态及电压监控补丁
adjust_kernel_env # 调整 内核 环境
copy_uboot_to_fs # 复制 u-boot 到文件系统
write_release_info # 写入 release 信息
write_banner # 写入 banner 信息
config_first_run # 配置 first run 程序
create_snapshot "etc-000" # 对btrfs格式的 rootfs 创建 etc 快照
write_uboot_to_disk # 写入 u-boot 到磁盘镜像
clean_work_env # 清理环境
  1. Flippy固件默认分区布局
分区 路径 大 小 挂 载 点
u-boot 或者是分区表 4MB~16MB
boot /dev/mmcblk0p1 128MB~512MB /boot
主rootfs /dev/mmcblk0p2 720MB~1GB /
副rootfs /dev/mmcblk0p3 720MB~1GB /mnt/xx
数据分区 /dev/mmcblk0p4 >=5GB /mnt/yy
一半内存 /dev/shm 内存的一半 /tmp

注:每次在线升级后,副rootfs变成主rootfs,主rootfs变成副rootfs
注:个人数据,下载数据,docker数据可放数据分区

  1. 如果你用的不是LEDE而是OPENWRT官方,那么如下可以供你参考
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
# 官方OPENWRT v22.03.6版本信息参考
cat > /home/leux/openwrt_packit/whoami <<EOF
WHOAMI=leux
OPENWRT_VER="v22.03.6"
DISTRIB_REVISION="r20265-f85a79bcb4"
DISTRIB_DESCRIPTION="OpenWrt 22.03.6 r20265-f85a79bcb4"
RK3588_KERNEL_VERSION="5.10.160-rk3588-flippy-2405a"
KERNEL_PKG_HOME="/home/leux/openwrt_packit/kernel"
OP_ROOT_TGZ="openwrt-armvirt-64-default-rootfs.tar.gz"
EOF

# 官方OPENWRT v23.05.3版本信息参考
cat > /home/leux/openwrt_packit/whoami <<EOF
WHOAMI=leux
OPENWRT_VER="v23.05.3"
DISTRIB_REVISION="r23809-234f1a2efa"
DISTRIB_DESCRIPTION="OpenWrt 23.05.3 r23809-234f1a2efa"
RK3588_KERNEL_VERSION="5.10.160-rk3588-flippy-2405a"
KERNEL_PKG_HOME="/home/leux/openwrt_packit/kernel"
OP_ROOT_TGZ="openwrt-armsr-armv8-generic-rootfs.tar.gz"
EOF


# 构建脚本 mk_rk3588_h88k-v3.sh 中末尾执行的函数注释掉只剩如下后可正常运行
copy_supplement_files # 复制增补文件
adjust_getty_config # 调整 getty 配置
create_fstab_config # 生成 openwrt 所需的 fstab 文件
adjust_kernel_env # 调整 内核 环境
write_uboot_to_disk # 写入 u-boot 到磁盘镜像

# 复制增补文件 函数中只需要这三行,其余行可考虑注释
function copy_supplement_files() {
......
[ -n "$WIRELESS_CONFIG" ] && [ -f $WIRELESS_CONFIG ] && cp -v $WIRELESS_CONFIG etc/config/
[ -n "$NETWORK_SERVICE_PATCH" ] && [ -f $NETWORK_SERVICE_PATCH ] && patch -p1 < $NETWORK_SERVICE_PATCH
[ -n "$BOARD_HOME" ] && [ -d $BOARD_HOME ] && cp -v $BOARD_HOME/* ./etc/board.d/
......
}


# 以下相似内核模块只能二选一,否则安装时会因为已存在而报错:> Kernel modules > Wireless Drivers
< > kmod-ath10k <*> kmod-ath10k-ct
< > kmod-ath10k-ct-smallbuffers < > kmod-ath10k-smallbuffers
< > kmod-libertas-sdio < > kmod-libertas-spi <*> kmod-libertas-usb
<*> kmod-mwifiex-pcie < > kmod-mwifiex-sdio

# 更换官方源为国内中科大源
sed -i 's/downloads.openwrt.org/mirrors.ustc.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf
  1. 将根文件系统由 btrfs 改为 ext4
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
# 对 mk_rk3588_h88k-v3.sh 中的修改如下:
--- a/mk_rk3588_h88k-v3.sh
+++ b/mk_rk3588_h88k-v3.sh
@@ -128,12 +128,12 @@
ROOTFS_MB=1024
SIZE=$((SKIP_MB + BOOT_MB + ROOTFS_MB + 1))
create_image "$TGT_IMG" "$SIZE"
-create_partition "$TGT_DEV" "gpt" "$SKIP_MB" "$BOOT_MB" "ext4" "0" "-1" "btrfs"
-make_filesystem "$TGT_DEV" "B" "ext4" "MMC_BOOT" "R" "btrfs" "MMC_ROOTFS1"
+create_partition "$TGT_DEV" "gpt" "$SKIP_MB" "$BOOT_MB" "ext4" "0" "-1" "ext4"
+make_filesystem "$TGT_DEV" "B" "ext4" "BOOT" "R" "ext4" "ROOT"
mount_fs "${TGT_DEV}p1" "${TGT_BOOT}" "ext4"
-mount_fs "${TGT_DEV}p2" "${TGT_ROOT}" "btrfs" "compress=zstd:${ZSTD_LEVEL}"
-echo "创建 /etc 子卷 ..."
-btrfs subvolume create $TGT_ROOT/etc
+mount_fs "${TGT_DEV}p2" "${TGT_ROOT}" "ext4"
+# echo "创建 /etc 子卷 ..."
+# btrfs subvolume create $TGT_ROOT/etc
extract_rootfs_files
extract_rockchip_boot_files
@@ -144,8 +144,8 @@
sed -e '/rootflags=/d' -i armbianEnv.txt
cat >> armbianEnv.txt <<EOF
rootdev=UUID=${ROOTFS_UUID}
-rootfstype=btrfs
-rootflags=compress=zstd:${ZSTD_LEVEL}
+rootfstype=ext4
EOF
echo "armbianEnv.txt -->"
echo "==============================================================================="

# 对 public_funcs 中函数 create_fstab_config 的修改如下:
--- a/public_funcs
+++ b/public_funcs
@@ -935,7 +935,7 @@
EOF
elif [ ! -z "${BOOT_UUID}" ];then
cat > ./etc/fstab <<EOF
-UUID=${ROOTFS_UUID} / btrfs compress=zstd:${ZSTD_LEVEL} 0 1
+UUID=${ROOTFS_UUID} / ext4 noatime,errors=remount-ro 0 1
UUID=${BOOT_UUID} /boot ext4 noatime,errors=remount-ro 0 2
#tmpfs /tmp tmpfs defaults,nosuid 0 0
EOF