标签 路由器 下的文章

早年写过一篇旧的同名文章。介绍过如何在openwrt编译时,直接集成一个自己想要的geodata文件。
只是当年才疏学浅,用了最土的方式,直接修改openwrt源文件的方式来实现。
如今研究过openwrt的项目结构后,发现通过添加外部feeds来覆盖源目标的方式才是最正确的方法。

这个方法也适用于要添加其它的自定义项目。
首先,将要添加的项目的文件,这里geodata只有一个Makefile文件。保存到适当的位置。
以我保存的路径为例:

/home/ubuntu/openwrt/feeds/v2ray-geodata/Makefile

然后,在openwrt项目,根目录下的feeds.conf.default第一行添加以下一行:

src-link custom /home/ubuntu/openwrt/feeds

为什么要在第一行?因为feeds的优先级是根据自上而下的加载顺序决定的。最先加载的优先级最高,可以覆盖后面原生自带的相同项目。
这里也可以看出来,在/home/ubuntu/openwrt/feeds的路径下,还可以放入其它多个自己想要添加的项目。
最后就是正常的编译流程:

cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
make download -j8
make V=s -j$(nproc)

下面是我的加强版geodata项目Makefile文件内容,可以直接保存使用。

# SPDX-License-Identifier: GPL-3.0-only
#
# Copyright (C) 2021-2022 ImmortalWrt.org

include $(TOPDIR)/rules.mk

PKG_NAME:=v2ray-geodata
PKG_RELEASE:=1

PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=winger zhang <winger.zhang@gmail.com>

include $(INCLUDE_DIR)/package.mk

GEODATA_VER:=202503192212
GEOIP_FILE:=geoip.dat.$(GEODATA_VER)
define Download/geoip
  URL:=https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/$(GEODATA_VER)/
  URL_FILE:=geoip.dat
  FILE:=$(GEOIP_FILE)
  HASH:=e32b80017d1dea91bc36c4e7ed07a5e7f200356415e678a8a6f825fb521f7b68
endef

GEOSITE_FILE:=geosite.dat.$(GEODATA_VER)
define Download/geosite
  URL:=https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/$(GEODATA_VER)/
  URL_FILE:=geosite.dat
  FILE:=$(GEOSITE_FILE)
  HASH:=57c476f6e50737c5fdf68778ec1615fb2017f75886a6bb0252927c314e5904b7
endef

define Package/v2ray-geodata/template
  SECTION:=net
  CATEGORY:=Network
  SUBMENU:=IP Addresses and Names
  URL:=https://www.v2fly.org
  PKGARCH:=all
endef

define Package/v2ray-geoip
  $(call Package/v2ray-geodata/template)
  TITLE:=GeoIP List for V2Ray
  VERSION:=$(GEODATA_VER)-$(PKG_RELEASE)
  LICENSE:=CC-BY-SA-4.0
endef

define Package/v2ray-geosite
  $(call Package/v2ray-geodata/template)
  TITLE:=Geosite List for V2Ray
  VERSION:=$(GEODATA_VER)-$(PKG_RELEASE)
  LICENSE:=MIT
endef

define Build/Prepare
    $(call Build/Prepare/Default)
ifneq ($(CONFIG_PACKAGE_v2ray-geoip),)
    $(call Download,geoip)
endif
ifneq ($(CONFIG_PACKAGE_v2ray-geosite),)
    $(call Download,geosite)
endif
endef

define Build/Compile
endef

define Package/v2ray-geoip/install
    $(INSTALL_DIR) $(1)/usr/share/v2ray
    $(INSTALL_DATA) $(DL_DIR)/$(GEOIP_FILE) $(1)/usr/share/v2ray/geoip.dat
endef

define Package/v2ray-geosite/install
    $(INSTALL_DIR) $(1)/usr/share/v2ray
    $(INSTALL_DATA) $(DL_DIR)/$(GEOSITE_FILE) $(1)/usr/share/v2ray/geosite.dat
endef

$(eval $(call BuildPackage,v2ray-geoip))
$(eval $(call BuildPackage,v2ray-geosite))

最后,如何快速的更新Makefile文件,以编译打包最新的geodata文件。可以看我的另外一篇文章

使用的是lean的源:

https://github.com/coolsnowwolf/lede.git

大体步骤与文档中描述的基本一致,但是因为是在arm64的主机上。因此有几个点与x86机器编译不同,这里记录一下。

编译的系统是Ubuntu 20.04 aarch64。
首先安装编译环境的包就与x86不太一样。具体是:

sudo apt update -y
sudo apt full-upgrade -y
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-arm-linux-gnueabihf \
g++-multilib-arm-linux-gnueabihf git golang gperf haveged help2man intltool libelf-dev libglib2.0-dev \
libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

2025年更新,最新的lede分支已经包含了以下两个源的绝大多数重点内容,没有特别需求可以不用添加了。
用git拉回代码后,还需要加入特别需要的包。
feeds.conf.default 文件中添加两行:

src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small

因为本人需要集成加强版geodata文件,要添加一个本地feeds:

src-link custom /home/ubuntu/openwrt/feeds

更新 feeds 什么的跟官方文档一样。

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

接下来,重点来了。必须多做一件与x86系统不同的配置,否则会报这个错误。

Makefile:366: * go-bootstrap cannot be installed on linux/arm64. Stop.

看报错信息,是编译过程无法安装go到arm64系统上。所以需要手动安装golang,并把路径设置到编译配置中。
在配置编译参数时:

make menuconfig

要加入以下设置:

Languages > Go > Configuration > External bootstrap Go root directory

按上面的环境安装后,go应该默认在 /usr/lib/go 目录下。将 /usr/lib/go 写入这项配置。

(/usr/lib/go) External bootstrap Go root directory

选好其它需要的配置后,开始编译:

make download -j8
make V=s -j1

慢慢等待编译完成吧。编译完成后输出路径:bin/targets

需要更新代码再次编译的话:

cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make defconfig
make download -j8
make V=s -j$(nproc)

如果需要重新配置:

rm -rf ./tmp && rm -rf .config
make menuconfig
make V=s -j$(nproc)

PS:第一次编译有概率会出现一个错误。

bash: po2lmo: command not found

这个是因为包依赖关系没有处理好,被依赖的luci-base包没有先编译出来。所以只要先编译好就可以了。
用以下命令指定编译luci-base

make package/feeds/luci/luci-base/compile V=99

给编译的固件加个自己的签名……

cd lede
vim package/lean/default-settings/files/zzz-default-settings

找到DISTRIB_REVISION或者DISTRIB_DESCRIPTION,加上想要添加的内容。比如:

(Compiled by winger. On $(date +%F))