1、首先安装编译必须软件包
apt update -y && apt upgrade -y && apt install -y sudo
sudo apt install -y build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-distutils rsync unzip zlib1g-dev file wget
2.创建一个非root用户,下面编译都用这个新建的用户
使用adduser
命令创建新用户。例如,要创建一个名为newuser
的用户,运行:
adduser newuser
将新用户添加到sudo组(如果你想让它具有sudo权限):
usermod -aG sudo newuser
然后用新创建的用户登录:
su - newuser
3.拉取官方源码
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git pull
选择指定代码分支
git branch -a
git tag #一直按回车,出现END,按q退出
git checkout v23.05.2
4.首次编译
更新,安装订阅源的软件包。
./scripts/feeds update -a && ./scripts/feeds install -a
如果你想编译与官方一样的固件,请下载官方config
wget https://downloads.openwrt.org/releases/23.05.2/targets/x86/64/config.buildinfo -O .config
进入图形化配置界面。
make menuconfig
提前下载编译需要的 dl 库
make download V=s
dl 库下载完就可以开始编译了
make -j$(nproc) V=s
编译好的固件在 bin/targets
5.二次编译
cd openwrt
同步当前分支最新源码
git pull origin $(git branch -a | grep -E '\* \(HEAD detached at .*\)' | awk '{print substr($5, 1, length($5)-1)}')
更新,安装订阅源的软件包。
./scripts/feeds update -a && ./scripts/feeds install -a
清理旧文件(删除 /bin
和 /build_dir
目录中的文件,)。可选
make clean
清除编译配置和缓存(如果不改变配置,这步可以忽略。)rm -rf ./tmp
删除执行 make menuconfig
后产生的一些临时文件,包括一些软件包的检索信息,删除后会重新加载 package
目录下的软件包,若不删除会导致一些新加入的软件包不显示。.config
若不删除,取消选择某些组件它的依赖组件不会自动取消,所以对于需要调整组件的情况下建议删除。可选
rm -rf ./tmp && rm -rf .config
如果更换架构或源码有重大更新,例如要从 x86_64
换到 MediaTek Ralink MIPS
,或者源码版本更新建议执行以下命令深度清理 /bin
和 /build_dir
目录的中的文件以及 /staging_dir
、/toolchain
、/tmp
和 /logs
中的文件。(清除旧的编译产物、交叉编译工具及工具链等目录)可选
make dirclean
清除 OpenWrt 源码以外的文件。可选
除非是做开发,并打算 push 到 GitHub 这样的远程仓库,否则几乎用不到。此操作相当于 make dirclean
外加删除 /dl
、/feeds
目录和 .config
文件。
make distclean
还原 OpenWrt 源码到初始状态。可选
如果把源码改坏了,或者长时间没有进行编译时使用。
git clean -xdf
进入图形化配置界面(按需求自己配置,不改变配置,这步可忽略)
make menuconfig
下载编译需要的 dl 库
make download V=s
开始编译
make -j$(nproc) V=s
6.修改软件包
源代码里的 feeds.conf.default 文件,保存着软件包订阅,格式如下:
src-git packages https://git.openwrt.org/feed/packages.git
src-git luci https://git.openwrt.org/project/luci.git
src-git routing https://git.openwrt.org/feed/routing.git
src-git telephony https://git.openwrt.org/feed/telephony.git
如果源码自带的订阅没有你需要的软件,可以添加第三方订阅来获取。添加完订阅,在编译的时候需要更新和安装软件包,命令如下。添加一次,就执行一次命令。
./scripts/feeds update -a && ./scripts/feeds install -a
7.更改某些配置
源代码里的 package/base-files/files/bin/config_generate
文件可以修改路由器的默认的管理地址。通过以下命令修改(假设修改成 192.168.0.1),也可以通过打开文件进行修改。
sed -i 's/192.168.1.1/192.168.0.1/g' package/base-files/files/bin/config_generate
自定义固件大小
注意:编译丰富插件时,建议修改下面两项默认大小,留足插件空间。以 x86/64 为例
系统分区,驱动或插件多的话需要适当扩大这个分区。
Target Images —> (16) Kernel partition size (in MB)
默认是 (16) 建议修改 (256)
文件系统分区,基本可以理解为安装后默认的 /overlay
分区大小。
Target Images —> (160) Root filesystem partition size (in MB)
默认是 (160) 建议修改 (512)
单独添加软件包
以 OpenClash 为例,拉取源码到 package 目录之下
mkdir package/luci-app-openclash
cd package/luci-app-openclash
git init
git remote add -f origin https://github.com/vernesong/OpenClash.git
git config core.sparsecheckout true
echo "luci-app-openclash" >> .git/info/sparse-checkout
git pull --depth 1 origin master
git branch --set-upstream-to=origin/master master
# 同步源码
cd package/luci-app-openclash/luci-app-openclash
git pull
修改活动连接数
#package/kernel/linux/files/sysctl-nf-conntrack.conf
net.netfilter.nf_conntrack_acct=1
net.netfilter.nf_conntrack_checksum=0
net.netfilter.nf_conntrack_max=65535
net.netfilter.nf_conntrack_tcp_timeout_established=7440
net.netfilter.nf_conntrack_udp_timeout=60
net.netfilter.nf_conntrack_udp_timeout_stream=180
net.netfilter.nf_conntrack_helper=1
net.netfilter.nf_conntrack_buckets=65535
net.netfilter.nf_conntrack_expect_max=65535
修改x86启动等待时间
#config/Config-images.in
default "5"改为default "0"
解决自行编译的OpenWrt不能在线安装软件包的问题
1.打开https://downloads.openwrt.org/releases/23.05.2/targets/x86/64/kmods/
5.15.137-1-47964456485559d992fe6f536131fc64 #47964456485559d992fe6f536131fc64是需要用到的值
touch vermagic #在openwrt源码根目录创建vermagic文件,填入上一步获取的值
2.修改/home/你的用户名/openwrt/include/kernel-defaults.mk
查找mkhash
注释掉#grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic
换行添加
cp $(TOPDIR)/vermagic $(LINUX_DIR)/.vermagic
3.修改/home/你的用户名/openwrt/package/kernel/linux/Makefile
查找mkhash
注释掉#STAMP_BUILT:=$(STAMP_BUILT)_$(shell $(SCRIPT_DIR)/kconfig.pl $(LINUX_DIR)/.config | $(MKHASH) md5)
换行添加
STAMP_BUILT:=$(STAMP_BUILT)_$(shell cat $(LINUX_DIR)/.vermagic)
openwrt 修改默认语言为 zh_cn
文件在 feeds/luci/modules/luci-base/root/etc/config/luci
把 option lang auto 修改为 option lang zh_cn
修改主机名为 2333
文件在 package/base-files/files/bin/config_generate
把 set system.@system[-1].hostname='OpenWrt' 修改为 set system.@system[-1].hostname='2333'
修改时区为 CST-8
文件在 package/base-files/files/bin
把 set system.@system[-1].timezone='UTC' 修改为 set system.@system[-1].timezone='CST-8'
修改时区为上海
文件在 package/base-files/files/bin
在 set system.@system[-1].timezone= 的下面添加 set system.@system[-1].zonename='Asia/Shanghai'
修改无线名称 SSID
文件在 package/kernel/mac80211/files/lib/wifi/mac80211.sh
把 set wireless.default_radio${devidx}.ssid=OpenWrt 修改为 set wireless.default_radio${devidx}.ssid=2333
修改wan口为pppoe拨号
package/base-files/files/lib/functions/uci-defaults.sh
ucidef_set_interface_wan() {
#dhcp改成pppoe
ucidef_set_interface "wan" ifname "$1" protocol "${2:-dhcp}"
}
修改lan口ip和pppoe拨号用户名、密码
package/base-files/files/bin/config_generate
case "$protocol" in
static)
local ipad
case "$1" in
#修改lan口ip
lan) ipad=${ipaddr:-"192.168.1.1"} ;;
*) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
esac
netm=${netmask:-"255.255.255.0"}
uci -q batch <<-EOF
set network.$1.proto='static'
set network.$1.ipaddr='$ipad'
set network.$1.netmask='$netm'
EOF
[ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60'
;;
dhcp)
# fixup IPv6 slave interface if parent is a bridge
[ "$type" = "bridge" ] && ifname="br-$1"
uci set network.$1.proto='dhcp'
[ -e /proc/sys/net/ipv6 ] && {
uci -q batch <<-EOF
delete network.${1}6
set network.${1}6='interface'
set network.${1}6.ifname='$ifname'
set network.${1}6.proto='dhcpv6'
EOF
}
;;
pppoe)
uci -q batch <<-EOF
set network.$1.proto='pppoe'
#拨号用户名
set network.$1.username='username'
#拨号密码
set network.$1.password='password'
EOF
[ -e /proc/sys/net/ipv6 ] && {
uci -q batch <<-EOF
set network.$1.ipv6='1'
delete network.${1}6
set network.${1}6='interface'
set network.${1}6.ifname='@${1}'
set network.${1}6.proto='dhcpv6'
EOF
}
;;
esac
修改默认eth0为wan
package/base-files/files/etc/board.d/99-default_network
ucidef_set_interface_lan 'eth1 eth2 eth3'
[ -d /sys/class/net/eth1 ] && ucidef_set_interface_wan 'eth0'