debian11编译原版OpenWrt记录

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'
上一篇