Openwrt自编译教程

本文最后更新于:2024年9月5日 下午

Openwrt自编译教程

安装编译环境

安装依赖

1
2
3
4
5
6
7
8
9
10
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 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 \
msmtp nano ninja-build p7zip p7zip-full patch pkgconf python3 python3-pyelftools \
libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs unzip \
vim wget xmlto xxd zlib1g-dev python3-setuptools libgsl-dev\
nodejs python2.7 upx-ucl mkisofs libtinfo5

下载源码

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

常见文件说明

feeds.conf.default文件

此文件记录了插件包所在的源,我们可以在里面加入自己的源。
网上有很多朋友整理了一些常用插件包,可以在此处直接添加,也可以根据自己的需求,自己建立一下git仓库,里面存放自己用到的插件包。

例如,我们可以使用以下命令添加常用软件包

1
2
3
4
5
6
sed -i '$a src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default
sed -i '$a src-git small https://github.com/kenzok8/small' feeds.conf.default
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

常见配置说明

使用make menuconfig可进入图形界面版本的配置管理器。

image-20230801135132323

下面我们详细介绍一下各个配置选项:

  • Target System

    选择处理器架构。该配置对应target/linux下的各个目录,目录名称对应cpu架构。

  • Subtarget

    平台子选项

  • Target Profile

    选择具体路由器型号,该配置对应target/linux下的各个目录下不同系列cou对应芯片的.dtsi和对应的.dts文件,但也可以通过增加或修改dts文件增加或修改选项。

  • Target Images

    固件包打包格式

  • Base System

    • blocd

      自动挂载块设备,通常选上,挂载磁盘用。

  • Luci

    插件配置基本上都在此,正常情况下进入应该有很多个选项。

    image-20230801144508106如果出现出现只有一项子选项情况,那是可能因为没有更新软包,执行以下命令更新软件包即可。

    1
    2
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    • Collections

      默认选择luci,其他可根据自己需要选择。

    • Modules

      • Translations:选择页面语言
    • Applications

      插件选项,通常我们添加的插件都在此目录,选择自己需要的插件即可。

    • Themes

      luci主题选项

首次编译

  • make -j8 download V=s 下载dl库(国内请尽量做好软件源加速)

  • find dl -size -1024c -exec ls -l {} \;此命令可以列出下载不完整的文件得出小于1k的文件属于下载不完整),如果存在这样的文件可以使用find dl -size -1024c -exec rm -f {} \;命令将它们删除,然后重新执行make download下载并反复检查,确认所有文件完整可大大提高编译成功率,避免浪费时间。

  • 输入 make -j1 V=s-j1 后面数字1是线程数。第一次编译推荐用单线程)进行编译你要的固件。

    编译完成后固件保存在 ./bin/targets/ 文件夹内。

1
make -j8 download V=s && make -j$(nproc) || make -j1 || make -j1 V=s

二次编译

更新本地编译环境

1
2
3
4
5
6
7
8
9
# 更新软件列表、升级软件包
sudo sh -c "apt update && apt upgrade -y"

# 拉取最新源码
cd ~/openwrt && git pull

# 更新下载安装订阅源包含的软件包
cd ~/openwrt
./scripts/feeds update -a && ./scripts/feeds install -a

清除旧的编译产物

1
make clean

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

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

1
make dirclean

更换架构编译前必须执行。此操作会删除/staging_dir/toolchain/tmp/logs中的文件。

清除临时文件

1
rm -rf tmp

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

如果要更换架构,建议执行以下命令先深度清理 /bin/build_dir 目录的中的文件 (make clean) 以及 /staging_dir/toolchain/tmp/logs 中的文件,然后更换架构。

1
2
make clean
make dirclean

二次编译

第一次编译时间较长,后面编译可以用多线程,速度就快很多了。

1
2
3
make defconfig
make -j8 download
make -j$(($(nproc) + 1)) V=s

当然为了防止多线程编译出错,可以使用以下命令,优先使用多线程,报错会自动使用单线程,仍然报错会单线程执行编译并输出详细日志。

1
make -j$(nproc) || make -j1 || make -j1 V=s

文件清理

编译文件清理是根据.config文件配置的,即不同架构配置文件只清理当前配置下的数据,因此需要更换架构时,需要首先执行清理操作,否则可能清理不干净。

清理 /bin/build_dir 目录的中的文件

1
make clean

清理/staging_dir/toolchain/tmp/logs 中的文件,然后更换架构。

1
make dirclean

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

还原 Open­Wrt 源码到初始状态

1
git clean -xdf

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

清除临时文件

1
rm -rf tmp

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

如果要更换架构,建议执行以下命令先深度清理 /bin/build_dir 目录的中的文件 (make clean) 以及 /staging_dir/toolchain/tmp/logs 中的文件,然后更换架构。

1
2
make clean
make dirclean

独立编译插件

  • 进入LuCiThemes选项找到需要编译的插件,配置选项为M,M 表示选中插件但不编译进固件,保存并退出。

  • 获取交叉编译链

    1
    2
    make tools/install V=s -j$(grep processor /proc/cpuinfo | wc -l)
    make toolchain/install V=s -j$(grep processor /proc/cpuinfo | wc -l)
  • 单独编译

    1
    2
    make package/luci-lib-docker/compile V=99
    make package/luci-app-dockerman/compile V=99
  • 编译完成ipk插件包默认存放路径

    1
    /bin/packages/x86_64/base

可选:

更换golang版本

编译新版 Sing-box 和 hysteria,需 golang 版本 1.20 或者以上版本.

若自带的版本过低,可用下面命令换成 openwrt 官方 golang 版本

1
2
3
pushd feeds/packages/lang
rm -rf golang && svn co https://github.com/openwrt/packages/branches/openwrt-23.05/lang/golang
popd

参考链接

OpenWrt编译教程,在linux(debian/ubuntu/centos)下编译OpenWrt

OpenWrt 固件自编译教程:从入门到酸爽!


Openwrt自编译教程
https://genioco.github.io/2023/12/09/Guide/Openwrt编译教程/
作者
BadWolf
发布于
2023年12月9日
许可协议