1. 编译环境准备

1.1 环境说明

本教程以乌班图22.04作为环境 请确保编译过程全局魔法

1.2 基础编译过程

设置环境变量(不知道有没有用):

1
2
注意使用root编译会报错,可以在/etc/profile 最后添加export FORCE_UNSAFE_CONFIGURE=1,然后执行
export FORCE_UNSAFE_CONFIGURE=1
  1. 系统软件包更新
    1
    
    sudo apt-get -y update && sudo apt-get -y upgrade
    
  2. 安装依赖关系与编译工具链
    1
    2
    3
    4
    5
    6
    
    sudo apt install -y ack antlr3 aria2 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 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 libpython3-dev qemu-utils \
    rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
    
  3. 下载 OpenWrt 源码
    1
    2
    3
    4
    
    git clone https://github.com/openwrt/openwrt.git && cd openwrt 
    git clone https://github.com/coolsnowwolf/lede && cd lede
    # 还有个
    git clone https://github.com/istoreos/istoreos
    

(源码有很多,本教程以官方源码和LEDE为例)

  1. 切换适合分支

openwrt-22.03 已将 iptables 移除,为避免兼容性问题,暂时切换到 openwrt-21.02分支:

1
git checkout openwrt-21.02
  1. 更新并安装 feeds 软件源
    1
    
    ./scripts/feeds update -a && ./scripts/feeds install -a
    

(以下为校园网防检测部署)

  1. 加入模块
    1
    2
    
    git clone https://github.com/Zxilly/UA2F.git package/UA2F
    git clone https://github.com/CHN-beta/rkp-ipid.git package/rkp-ipid 
    
  2. 配置编辑
    1
    
    make menuconfig
    

配置编译 rdp-ipid:

  • Kernel modules → Other modules → kmod-rkp-ipid

配置编译 ua2f:

  • Network → Routing and Redirection → UA2F

配置编译 iptables 模块(Firewall中)

选中:

  • iptables-mod-filter
  • iptables-mod-ipopt
  • iptables-mod-u32

基本界面配置:

  • LuCI → Collections → luci (lede 默认已选)
  • LuCI → Modules → Translations → Chinese Simplified (zh_Hans) (lede 默认已选)
  • LuCI → Modules → luci-compat
  • LuCI → Applications → luci-app-ttyd(网页终端)
  • LuCI → Themes → xxxxx (根据需要自己选管理界面的主题,如果路由器储存太小,建议就维持默认的)

其他配置:

  • 添加EXT4硬盘格式支持:Kernel modules > Filesystem > kmod-fs-ext4
  • 添加USB支持(如不添加可能会不响应键盘):Kernel modules > USB Support

网卡驱动配置:

  • 经查找网卡使用的是Intel IG211-AT,走的是PCIE通道,这里要选用e1000e
  • Kernel modules > Network Devices将kmod-e1000e,kmod-igb驱动选中

无线网卡驱动:

  • 内核中的无线驱动找到RTL8821AE的驱动
  • Kernel modules > Wireless Drivers

作者:KANSUNG 链接:https://www.jianshu.com/p/5190ab903820 来源:简书

添加其他工具(可选):

  • LuCI > Applications -> luci-app-openclash
  • LuCI > Applications -> luci-app-adblock
  • LuCI > Applications -> luci-app-ddns-go

添加必要组件:

  • Kernel modules -> Network Support -> kmod-tun (openclash TUN模式必须)

排除冲突组件:

  • Base system -> dnsmasq (取消勾选,因为默认会安装dnsmasq-full,需要排除dnsmasq避免冲突报错)

编辑配置文件:

  • 使用 vim .config,在开头添加一行(UA2F 插件需要):
    1
    
    CONFIG_NETFILTER_NETLINK_GLUE_CT=y
    
  1. 编译和配置内核
    1
    2
    
    make kernel_menuconfig
    make -j1 V=sc kernel_menuconfig  # 日志更详细
    

配置路径: Networking support → Networking options → Network packet filtering framework (Netfilter) (要先选中再进去)→ Core Netfilter Configuration →

选中以下选项:

  • Netfilter NFNETLINK interface
  • Netfilter LOG over NFNETLINK interface
  • Netfilter connection tracking support
  • Connection tracking netlink interface
  • NFQUEUE and NFLOG integration with Connection Tracking
  1. 编译 下载编译工具:
    1
    
    make download -j$(nproc) V=s
    

开始编译:

1
2
make -j$(nproc) V=s
make -j1 V=sc 2> build.log  # 错误输出到日志

二次编译需要更新源码:

1
git pull

1.1.10 重新配置

如果需要重新配置:

1
2
3
rm -rf ./tmp && rm -rf .config
make menuconfig
make -j$(($(nproc) + 1)) V=s   # 多线程编译失败后自动进入单线程编译,失败则输出详细日志

1.1.11 编译更换其它CPU架构的固件(建议操作)

清除旧的编译产物:

1
make clean

在源码有大规模更新或者内核更新后执行,以保证编译质量。此操作会删除/bin和/build_dir目录中的文件。

清除旧的编译产物、交叉编译工具及工具链等目录:

1
make dirclean

更换架构编译前必须执行。此操作会删除/bin和/build_dir目录的中的文件(make clean)以及/staging_dir、/toolchain、/tmp和/logs中的文件。

清除 OpenWrt 源码以外的文件(可选):

1
make distclean

除非是做开发,并打算 push 到 GitHub 这样的远程仓库,否则几乎用不到。此操作相当于make dirclean外加删除/dl、/feeds目录和.config文件。

还原 OpenWrt 源码到初始状态(可选):

1
git clean -xdf

如果把源码改坏了,或者长时间没有进行编译时使用。

清除临时文件:

1
rm -rf tmp

删除执行make menuconfig后产生的一些临时文件,包括一些软件包的检索信息,删除后会重新加载package目录下的软件包。若不删除会导致一些新加入的软件包不显示。

删除编译配置文件:

1
rm -f .config

在不删除的情况下如果取消选择某些组件它的依赖组件不会自动取消,所以对于需要调整组件的情况下建议删除。

注意:所有操作不要使用root用户

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/u010674953/article/details/129280724

2. 个性化配置

2.1 修改默认主题

进入路径openwrt/feeds/luci/collections/luci,修改Makefile(适用于openwrt版本19.07,不同的版本,会稍微不同):

  • 将LUCI_DESCRIPTION中,bootstrap 替换为 argon
  • 将LUCI_DEPENDS中,+luci-theme-bootstrap 替换为 +luci-theme-argon

原文链接:https://blog.csdn.net/pyt1234567890/article/details/107442792

1.2.2 个性化主题

以 “argon”主题为例,可编辑性强要更改OpenWrt源码中的主题,包括Argon主题,可以按照以下步骤操作:

  1. 进入feeds/luci/themes/目录
  2. 找到Argon主题所在的目录(一般为luci-theme-argon),并进入该目录
  3. 打开root/usr/share/luci/static/resources/view/themes/argon/header.htm文件,该文件定义了Argon主题的顶部导航栏、LOGO等内容
  4. 在header.htm文件中找到需要修改的内容,并进行相应的编辑和保存。例如,将LOGO图片路径指向自己的图片文件,或者调整导航栏的布局和样式
  5. 如果需要修改Argon主题的其他部分,例如底部导航栏、颜色方案等,可以在root/usr/share/luci/static/resources/view/themes/argon/目录下找到对应的文件进行编辑

1.2.3 个性化主机名

修改package/base-files/files/bin/config_generate,将"OpenWrt"替换

1.2.4 自定义默认密码

修改passwd文件

1.2.5 终端横幅

修改文件:

1
./package/base-files/files/etc/banner

横幅生成地址:http://www.network-science.de/ascii/

1.2.6 无线更改

修改文件:

1
/package/kernel/mac80211/files/lib/wifi/mac80211.sh    # (ssid)

修改自定义版本号:openwrt_release

3. 插件开发

3.1 插件源码的文件组成

Openwrt插件一般使用”MVC”结构:

  1. 配置文件 位于 /etc/config/*
    1
    2
    3
    
    config server
    option username ''
    option password ''
    

    例示文件中生成了两个待输入的配置。现在需要一个表单页面来管理它。

  2. CBI文件 一般位于目录 /usr/lib/lua/luci/model/cbi/*.lua
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
require("luci.sys")

-- 页面标题和描述
m = Map("bargo", translate("Bargo Client"), translate("Configure Bargo client, Powered By Sinchie."))

-- 读取配置文件
s = m:section(TypedSection, "server", "")
s.addremove = false
s.anonymous = true

-- 是否启用的选择框
enable = s:option(Flag, "enable", translate("Enable"))
-- 映射我们的配置到输入框
username = s:option(Value, "username", translate("Username"))
pass = s:option(Value, "password", translate("Password"))
pass.password = true

-- 如果点击了保存按钮
local apply = luci.http.formvalue("cbi.apply")
if apply then
    -- 这里是调用我们自己的程序脚本,后面会讲怎么来写这个脚本
    io.popen("/etc/init.d/bargo restart > /dev/null &")
end

return m
  1. 控制器文件 一般位于系统的/usr/lib/lua/luci/controller/*.lua,创建控制器文件后可以在web界面创建一个界面入口(菜单)。脚本结构如下:
1
2
3
4
5
6
7
8
9
10
11
-- module 名称
module("luci.controller.bargo", package.seeall)

function index()
    -- 4 个参数介绍
    -- 1.后台访问路径 admin/services/bargo 
    -- 2.target 动作(call, template, cbi)call 是调用自定义函数,template 调用 html 模板,cbi 调用 openwrt 的公共表单页面
    -- 3.菜单名称 
    -- 4.排序
    entry({"admin", "services", "bargo"}, cbi("bargo"), _("Bargo Client"), 1)
end

1.3.2 创建构建文件Makefile

制作 OpenWRT 编译 Makefile 文件需要以下步骤:

  1. 安装 OpenWRT SDK,并设置环境变量
  2. 在任意目录下,创建一个新的文件夹,用于存放你的应用程序代码
  3. 在该目录下,创建 Makefile 文件,并按照以下结构填写相应内容:
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
# 这是注释,可以忽略或者修改

include $(TOPDIR)/rules.mk # 引入OpenWRT编译规则
PKG_NAME:=myapp # 应用程序的名称,建议使用小写字母和数字组合
PKG_VERSION:=1.0 # 应用程序的版本号
PKG_RELEASE:=1 # 应用程序的发行版本号

include $(INCLUDE_DIR)/package.mk # 引入OpenWRT中提供的软件包模板
define Package/myapp # 描述应用程序的信息
  SECTION:=net
  CATEGORY:=Network
  TITLE:=My Application
  DEPENDS:=+libopenssl +libcurl +libjson-c 
endef

define Package/myapp/description # 描述应用程序功能和用途
 My Application is a simple program that does something useful.
endef

define Build/Prepare # 准备构建应用程序所需的源码和资源
# 此处可以添加自定义命令,用于准备应用程序的源码和资源
endef

define Build/Configure # 配置应用程序的编译选项
# 此处可以添加自定义命令,用于配置应用程序的编译选项
endef

define Build/Compile # 编译应用程序的源码
# 此处可以添加自定义命令,用于编译应用程序的源码
endef

define Package/myapp/install # 安装应用程序所需的文件和目录
$(INSTALL_DIR) $(1)/usr/bin # 创建安装目录
$(INSTALL_BIN) $(PKG_BUILD_DIR)/myapp $(1)/usr/bin/ # 安装二进制文件
endef

$(eval $(call BuildPackage,myapp)) # 构建软件包并注册到OpenWRT中

4. 补充工具

4.1 修改接口MAC地址

修改MAC地址:

1
uci set network.cfg050f15.macaddr='98:8F:E0:67:44:86'

保存更改:

1
uci commit network

5. 其他参考资料

添加USB和硬盘格式还有网卡教程: https://www.jianshu.com/p/5190ab903820