Passwall 是 OpenWrt 系统一款非常优秀的网络服务插件,通过该插件,就可以方便的运行各种科学上网工具进行代理上网。所以,理论上也可以把 Passwall 看做是 OpenWrt 平台的代理客户端,通过调用其他工具软件,来实现代理及分流功能。

Passwall 如想正常工作,还需要安装其需要使用的组件软件包,有些是系统依赖,也有些是工具组件。这些软件包会在 passwall 发布新版本时随同其发行版一同发行。这样就会出现一个时间差,如果在 passwall 新版本发布前,某些组件已经有了更新,特别是 xary、sing-box 以及 naive 等基础工具,就不能在第一时间将其全部更新至最新版。虽然 passwall 工具包含组件更新功能,可以更新一部分组件,但是其他组件还是需要等待新版本的发布了。

如果不想等待,也可以自行编译 passwall_packages 组件软件包的,并且可以交叉编译,是不是很方便呢。

本文就以 naiveproxy 组件为例,实例演示如何在 Debian 编译最新版的 OpenWrt 软件包。

1] 配置编译环境

想要编译 OpenWrt 软件包,最方便的方法是使用官方提供的 SDK 工具。根据自己所使用编译主机的 CPU 架构,下载对应的 SDK 程序包即可。>>官方下载地址在这里<<

在下载页面,可以看到一个名为”openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst”的压缩包,这即为编译 OpenWrt 软件包的 SDK 工具(示例使用x86-64架构),Debian 系统需要使用该工具进行软件包的编译。

Debian 系统想要正常编译,磁盘空间建议不低于 40 GB,版本最好使用 12 以上,并且系统已经创建了一个具体 sudo 权限的普通用户(例如user)。

进入 Debian 系统,切换到普通用户,使用如下命令安装编译所需要的依赖包:

$ sudo apt update
$ sudo apt install build-essential clang flex bison g++ gawk \
  gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev \
  python3-setuptools rsync swig unzip zlib1g-dev file wget

依赖包安装守成后,使用如下命令下载并解压 SDK 工具包:

$ wget https://downloads.openwrt.org/releases/24.10.2/targets/x86/64/openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst
$ apt-get install zstd
$ tar -I zstd -xvf openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst
$ cd openwrt-sdk-24.10.2-x86-64_gcc-13.3.0_musl.Linux-x86_64/

此时,编译 OpenWrt 软件包的基础环境就搭建完成了。

2] 编译 naiveproxy 软件包

查看目录中的内容,可以看到如下结构:

图.1 OpenWrt SDK 工具包目录结构

独立于 Open­Wrt 源码之外的软件包,会创建并保存在 feeds 目录中,所以需要单独进行拉取和更新。而管理 feeds 的配置文件就是 feeds.conf.default 文件,将自定义的软件包添加至该文件,就可以在之后的编译目录中看到这些软件包了。

例如想要把 passwall 和 passwall-packages 软件包添加到 feeds,命令如下:

$ echo "src-git passwall_packages https://github.com/xiaorouji/openwrt-passwall-packages.git;main" >> "feeds.conf.default"
$ echo "src-git passwall https://github.com/xiaorouji/openwrt-passwall.git;main" >> "feeds.conf.default"

添加完成后,就需要使用如下命令下载 feeds 源中的软件包源码(在 SDK 工具目录下执行):

$ ./scripts/feeds update -a
$ ./scripts/feeds install -a

由于以上两条命令会下载 github openwrt官网等外网的资源,所以建议编译主机最好有科学上网环境,以提高编译成功率。

命令执行完成后,会生成一个 feeds 目录,用于保存软件包的编译信息。对于 naiveproxy 来说,其主要的编译信息保存在”feeds/passwall_packages/naiveproxy/Makefile”文件中。查看该文件,发现其最新的”PKG_VERSION:=139.0.7258.62″,并不是 naiveproxy 的最新版,于是可以修改该文件的 PKG_VERSION 至最新版正确值”PKG_VERSION:=140.0.7339.123″。

由于该编译文件中还具有 hash 值核验功能,编译时下载的软件包与文件中指定的 hash 值相同才会继续编译,所以还要修改文件中的如下部分:

ifeq ($(ARCH_PREBUILT),aarch64_cortex-a53)
  PKG_HASH:=88b631884518ad25eaee00350445824bb962283cf7665519d4d7b242605a95a4
else ifeq ($(ARCH_PREBUILT),aarch64_cortex-a72)
  PKG_HASH:=c8196e4ac5e60c933cdce968b1e630abf3577de1258a4c330eb99ea8649a177a
else ifeq ($(ARCH_PREBUILT),aarch64_generic)
  PKG_HASH:=7fa990948c429c36fd0778cd9125e08aed79d5e92be6675951540ddd7069b2fb
else ifeq ($(ARCH_PREBUILT),arm_arm1176jzf-s_vfp)
  PKG_HASH:=51db374620c21797a732d11e17b7ddc31e9be681804ea3145938a24320aaa66a
else ifeq ($(ARCH_PREBUILT),arm_arm926ej-s)
  PKG_HASH:=abf5db455d57de10dec4b5e5d37903293bcbbe80a3baeb33aded53fb4d503db1
else ifeq ($(ARCH_PREBUILT),arm_cortex-a15_neon-vfpv4)
  PKG_HASH:=4ea19599f0287da886c79b93d3ac7ae03727402587fa3af5fdd3d12ad2e2a58e
else ifeq ($(ARCH_PREBUILT),arm_cortex-a5_vfpv4)
  PKG_HASH:=6824c79925f5cc9c3a8fd8a2090c982a0b30c0ce014aa90f99a2f36ed68ada9d
else ifeq ($(ARCH_PREBUILT),arm_cortex-a7)
  PKG_HASH:=456c896ac9a26d41a6bc0aea74262780516203a143cfb530906ac9a580d35ab5
else ifeq ($(ARCH_PREBUILT),arm_cortex-a7_neon-vfpv4)
  PKG_HASH:=0ac6f60ba0b90ef38aa88f1172b7119e07ec775b1776594afb51452f5b4af125
else ifeq ($(ARCH_PREBUILT),arm_cortex-a7_vfpv4)
  PKG_HASH:=361341cd9300e071f06545d92bf355bd83fe415af7392cffcd503e9207f273e5
else ifeq ($(ARCH_PREBUILT),arm_cortex-a8_vfpv3)
  PKG_HASH:=04eaadc2c6cf300c788d8531cdf04821c91a751bae720c2fc4631ec6445a0cd8
else ifeq ($(ARCH_PREBUILT),arm_cortex-a9)
  PKG_HASH:=523af9336b72da3a32f38d1975e86f15bdc859234f8e7f0a3c664fc31da2ce3f
else ifeq ($(ARCH_PREBUILT),arm_cortex-a9_neon)
  PKG_HASH:=b20c2e0c098503d8b57c6ab70d70de401bb642a474521ccf0e700756ad7ed8e1
else ifeq ($(ARCH_PREBUILT),arm_cortex-a9_vfpv3-d16)
  PKG_HASH:=9658d4f6a9a7e753774b1b231808c5267addc7cea94e2e93e7f823ec84e279e3
else ifeq ($(ARCH_PREBUILT),arm_mpcore)
  PKG_HASH:=cfdcc0bfd70c689b01af8ebcc712f8a1431aeba77a4bc1522444268f9864d12d
else ifeq ($(ARCH_PREBUILT),arm_xscale)
  PKG_HASH:=5c7706b1cb19e27d4c0135feea6af245e19af684b9e2bb38c3cea80c9adb970c
else ifeq ($(ARCH_PREBUILT),mipsel_24kc)
  PKG_HASH:=70e248ffa44a067ced6c178f3aef09097e7bbd6030cb7d3776866880ad954eb6
else ifeq ($(ARCH_PREBUILT),mipsel_mips32)
  PKG_HASH:=a49e6088ddb1af6135fa2a46ba5c55db66b4a2ecd46cb6daf3776181a2e62296
else ifeq ($(ARCH_PREBUILT),riscv64)
  PKG_HASH:=4f8163daea361188f8eec3c1794b78416b898aff226e33e82f8ae6f96d403ac3
else ifeq ($(ARCH_PREBUILT),x86)
  PKG_HASH:=02e38a354b26ed8ebe7a753bac2f8a4a4b4210a23dcb430de0ab88b88b689f92
else ifeq ($(ARCH_PREBUILT),x86_64)
  PKG_HASH:=df910463af15f53b5540dcb23a9858ba73dd2bc336eea9625ba0360bd3b29042
else
  PKG_HASH:=dummy
endif

此部分记录的 hash 值是 139.0.7258.62 版本的 hash 值,显然与最新版不一致,于是可以根据 naiveproxy 给定的 OpenWrt 各种架构的 hash 值重新设置。例如 x86_64 架构 naiveproxy 软件包的 hash 值是”sha256:5903794ae52b3f9f249dfd825c78235087f4253c528fbe60085d025cf5fb791a”,于是可以将 Makefile 文件中”PKG_HASH:=df910463af15f53b5540dcb23a9858ba73dd2bc336eea9625ba0360bd3b29042″修改为”PKG_HASH:=5903794ae52b3f9f249dfd825c78235087f4253c528fbe60085d025cf5fb791a”,这样,软件包的版本和 hash 值就匹配了。对于其他架构的 hash 值,也可以根据需要进行修改,示例只编译 x86_64 架构,所以只修改了该架构的 hash 值。

修改完成后,就可以使用如下命令定义软件包了:

$ make menuconfig

图.2 配置 OpenWrt 软件包

选择到指定的软件包,按空格键选择编译选项,<> 表示不编译;<*>表示编译到固件;<M>表示编译生成单独的 ipk 文件,如果仅想编译生成软件包,则在对应软件包前设置成 <M>即可。

选择完成后,选择 <Exit> 退出软件包设定。

设定完成后,就可以使用中下命令编译生成软件包了:

 make package/naiveproxy/compile V=99

如果一切顺利,就会在 bin 目录生成对应的软件包:

图.3 生成 naiveproxy 软件包

对于交叉编译,只需要在配置软件包时,选择对应的架构,并修改 Makefile 文件中的 hash 值即可。是不是很简单呢,希望大家都可以自己尝试编译 OpenWrt 的软件包。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注