编辑
2024-08-16
Openwrt
0
请注意,本文编写于 311 天前,最后修改于 66 天前,其中某些信息可能已经过时。

目录

准备工作
环境
依赖
源码
配置
vermagic
获取值
ipq40xx
qualcommax-ipq807x
修改内核配置文件
时区
默认IP
软件包
更新软件包源
添加第三方软件有两种方式:
菜单配置
预下载
编译
编译固件
单独编译某个软件包
获取成果

Screenshot 2024-08-16 at 15.44.21.png

更新至官方 24.10.0 版本、arm 架构编译为例,若为其他平台(x86、树莓派等其他架构)则下文中获取内核的魔法值、菜单配置需自行更改

准备工作

环境

  • 系统:Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-24-generic x86_64)
  • 网络:科学上网
  • 磁盘:大约有 70G 的空闲空间
  • 内存:至少 4G 物理内存
  • CPU:越快越好,影响编译速度

依赖

以 root 用户执行以下命令或者有 root 权限的用户运行以下命令

Debian / Ubuntu / Mint

Modernized set for Ubuntu 24.04 that has Python 3.12 without python3-distutils: (OpenWrt main/master in Apr 2024)

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

源码

以下命令以普通用户执行,不要用 root

先进入自己的工作目录,例如我的是~/Downloads

cd Downloads

注意

git clone 不要--depth=1 参数,这是非常愚蠢的行为,因为它会导致你编译的 base-files 版本号与官方不一致!

下载源码(-b 指定分支/标签、 --single-branch 仅下载单个分支/标签、 --depth=1 只下载最新的一次提交

git clone -b openwrt-24.10 https://github.com/openwrt/openwrt.git openwrt-24.10

进入到该目录

cd openwrt-24.10

配置

vermagic

编译时,一定会遇到内核的魔法值不一样,需要完成如下修改:

获取值

获取值时,要注意后续选择平台,本文以 arm 平台为例

方式一:(不知什么原因,该方式失效)

执行以下脚本即可写入到 vermagic 文件中。注意: 24.10.0 为版本号

curl -s https://downloads.openwrt.org/releases/24.10.0/targets/ipq40xx/generic/openwrt-24.10.0-ipq40xx-generic.manifest | grep kernel | awk '{print $3}' | awk -F- '{print $3}' > vermagic

方式二:

  1. 打开官方对应版本的下载链接:https://downloads.openwrt.org/releases
  2. 点击:24.10.0 -> targets -> ipq40xx -> generic 页面最底下
  3. 下载 Supplementary Files 中的 openwrt-24.10.0-ipq40xx-generic.manifest 文件
  4. 使用文本编辑器打开该文件,记录下 kernel 最后面的字符串(不包含版本号“6.6.73-1-”)
  5. 执行以下脚本写入到 vermagic 文件中 \

ipq40xx

echo '60aeaf7e722ca0f86e06f61157755da3' > vermagic

qualcommax-ipq807x

echo 'fe73d0be6a246a6dcf1bbde8cd8b0d43' > vermagic

修改内核配置文件

编辑配置文件

vim include/kernel-defaults.mk +130

找到这一行,然后注释掉!

# grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic

再在下一行添加如下内容

cp $(TOPDIR)/vermagic $(LINUX_DIR)/.vermagic

时区

编辑配置文件

vim package/base-files/files/bin/config_generate +315

修改时区为 CST-8

set system.@system[-1].timezone='CST-8'

再在下一行添加如下内容

set system.@system[-1].zonename='Asia/Shanghai'

默认IP

默认管理IP为 192.168.1.1 ,可以根据自己的需求进行修改

编辑配置文件

vim package/base-files/files/bin/config_generate +165

修改如下内容

lan) ipad=${ipaddr:-"192.168.50.1"} ;;

软件包

更新软件包源

每次编译之前,都需要执行以下代码更新 feeds 包

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

添加第三方软件有两种方式:

  1. 将软件包仓库地址写入 feeds.conf.default 文件中,可以参考 kenzok8 的软件包的说明文档
  2. 使用 git clone 手动下载软件包放入到 package 文件夹中(本人使用这种方式)
  • 添加 nft-fullcone 软件包(Kernel modules -> Netfilter Extensions -> kmod-nft-fullcone)
git clone https://github.com/fullcone-nat-nftables/nft-fullcone.git package/nft-fullcone
  • 添加 passwall2 软件包和依赖包
git clone https://github.com/xiaorouji/openwrt-passwall2.git package/luci-app-passwall2
git clone https://github.com/xiaorouji/openwrt-passwall-packages.git package/passwall-packages
  • 添加 natmapt 软件包(Network -> natmapt)
git clone --branch master --single-branch --no-checkout https://github.com/muink/openwrt-natmapt.git package/natmapt
  • 添加 luci-app-natmapt 软件包(LuCI -> Applications -> luci-app-natmapt)
git clone --branch master --single-branch --no-checkout https://github.com/muink/luci-app-natmapt.git package/luci-app-natmapt
  • 添加 stunman 软件包(Network -> stuntman)
git clone --branch master --single-branch --no-checkout https://github.com/muink/openwrt-stuntman.git package/stuntman
  • 添加 luci-app-log-viewer 软件包
git clone https://github.com/gSpotx2f/luci-app-log.git package/luci-app-log-viewer
  • 添加 luci-theme-argon 软件包
git clone https://github.com/jerrykuku/luci-theme-argon.git package/luci-theme-argon
  • 添加 luci-app-advanced 软件包
git clone https://github.com/sirpdboy/luci-app-advanced.git package/luci-app-advanced
  • 添加 luci-app-adguardhome 软件包
git clone https://github.com/xiaoxiao29/luci-app-adguardhome.git package/luci-app-adguardhome
  • 添加 fastfetch 软件包(Utilities -> fastfetch)
git clone --branch master --single-branch --no-checkout https://github.com/muink/openwrt-fastfetch.git package/fastfetch
  1. 所有添加的软件包,都执行一下下面的命令,否则有可能make menuconfig可能会找不到
pushd package/xxx umask 022 git checkout popd

菜单配置

执行以下命令打开菜单配置

make menuconfig

终于来到了一个图形化界面,该界面有如下操作

提示

  • 键:上下切换
  • PgUp PgDn 键:上下翻页
  • Enter 回车键: -进入子菜单 -选择/确认
  • Sapce 空格键:在 < > 上进行操作,按一次变为 <*>,按两次变为 < M >
  • Y 键:选中,在 < > 上进行操作,操作后变为 <*>
  • N 键:取消选中,在 <*> 上进行操作,操作后变为 < >
  • Esc 键:连击两下,返回上层菜单,如果在主菜单则为退出配置

配置根据自己的需要进行选择

  • Target System -> Qualcomm Atheros IPQ40XX

  • Subtarget -> generic

  • Target Profile -> Linksys WHW03 V2

  • [*] Package the OpenWrt-based Toolchain

  • Base system --->

    < > dnsmasq

    <*> dnsmasq-full

  • Kernel modules ---> Netfilter Extensions --->

    <M> kmod-nft-fullcone

    {M} kmod-nft-compat

  • LuCI ---> Collections --->

    <*> luci

  • LuCI ---> Collections ---> Modules --->

    <*> luci-base

  • LuCI ---> Collections ---> Modules ---> Translations --->

    <*> Chinese Simplified

注意

  • 尽量不要把软件包写入rootfs,即 " * ",应该选择 " M " 。因为 " * " 会增加rootfs的磁盘占用,让生成的固件体积变大,进而导致磁盘可用空间减少。 \
  • 由于squashfs格式编译的固件中rootfs是只读的,因此这些写入rootfs的软件包即使你手动remove了,它也仅仅是被系统标注为隐藏不可见而已,并不会释放空间。 \
  • 如果你opkg upgrade任何一个已经存在于rootfs的软件包,同样也会将原始软件包标注为隐藏,然后在/overlay中另外安装一份新版本,那么这个软件包实际占用的空间大致等于2倍

如果不小心配错了,可以执行以下命令重新配置

rm -rf ./tmp && rm -rf .config make menuconfig

如果想要清除以前旧的配置和缓存,可以使用以下命令

仅清理编译结果(bin目录)

make clean

清理所有编译文件(除了.config、dl文件夹和feeds以外都清理)

make dirclean

清理所有编译文件以及相关依赖(完全清理干净,一键回到刚git clone下来的时候)

make distclean

还原使用make menuconfig对配置文件.config进行的调整

make defconfig

预下载

为了防止ssh连接因各种原因断开导致命令中断,务必采用tmux命令

tmux new -s openwrt

先把编译时需要的文件下载下来(只是一部分,后面编译阶段还会下载,仍需保持网络畅通)

make download -j$(nproc)

编译

编译固件

接下来就要进入漫长的编译时间了,使用 -j 参数可以指定编译时使用的线程数

亲测Thinkpad X1 Carbon i5 线程全开需要接近1小时完成

根据CPU核心数开启指定线程数执行编译

make V=s -j$(nproc)

如果编译过程中报错了,需要使用单线程模式,确认出错的地方,然后排查(注:有时候单线程就不报错了)

make V=s -j1

单独编译某个软件包

  1. make menuconfig
    Select the package LuCI -> Applications -> luci-app-xxxx
  2. make package/luci-app-xxxx/compile V=99

如果ssh连接中断,再次ssh到服务器,输入以下tmux命令恢复会话

tmux attach -t openwrt

获取成果

编译完成后,文件所在位置是: ~/Downloads/openwrt/bin/targets/ipq40xx/generic/