15995477811705.jpg

自动编译 openwrt

请参考 借助 GitHub Actions 的 OpenWrt 在线集成自动编译

手动编译 openwrt

1. 先决条件

使用 Linux, BSD 或 MacOSX 系统来进行编译.

1.1 安装编译所需依赖的软件包

依赖软件包安装官方示例

通用的 Linux 系统
CentOS

  1. # 某些软件包会依赖 EPEL
  2. sudo yum install binutils bzip2 gcc gcc-c++ gawk gettext flex \
  3. ncurses-devel zlib-devel zlib-static make patch unzip openssl-devel \
  4. perl-ExtUtils-MakeMaker glibc glibc-devel glibc-static ncurses-libs \
  5. sed sdcc intltool sharutils bison wget git-core xz

Debian / Ubuntu

  1. sudo apt-get update
  2. sudo apt-get install subversion g++ zlib1g-dev build-essential git \
  3. python python3 python3-distutils libncurses5-dev gawk gettext unzip \
  4. file libssl-dev wget libelf-dev ecj fastjar java-propose-classpath

推荐使用 Ubuntu 18 LTS x64

Ubuntu 18.04 LTS

  1. sudo apt-get install subversion build-essential libncurses5-dev \
  2. zlib1g-dev gawk git ccache gettext libssl-dev xsltproc zip

1.2 需要大约3-4 GB的空余硬盘空间,主要用来存储编译成功的固件

1.3 以非root用户来进行编译操作

1.3.1 新建用户 openwrt ,输入密码,其他信息可不填直接回车,最后输入 Y 确定完成
  1. sudo adduser openwrt

1.3.2 给这个用户授予 sudo 权限
  1. sudo usermod -aG sudo,adm openwrt

1.3.3 以用户 openwrt 重新登入系统

2. 下载 OpenWrt 源代码

2.1 克隆源代码仓库

可参考 使用 gitee 建立 github 仓库镜像加速源码下载

  1. git clone https://gitee.com/cheenbee/openwrt.git

2.2 进入源码目录

  1. cd openwrt

2.3 更新和安装 feeds

可以把 feeds 理解为接口:即可扩展的功能插件

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

关于 feeds
  • 默认会安装的 feeds 可以通过查看 feeds.conf.default (或 feeds.conf) 文件得知
  1. src-git packages https://git.openwrt.org/feed/packages.git
  2. src-git luci https://git.openwrt.org/project/luci.git
  3. src-git routing https://git.openwrt.org/feed/routing.git
  4. src-git telephony https://git.openwrt.org/feed/telephony.git
  5. src-git freifunk https://github.com/freifunk/openwrt-packages.git
  6. #src-git video https://github.com/openwrt/video.git
  7. #src-git targets https://github.com/openwrt/targets.git
  8. #src-git management https://github.com/openwrt-management/packages.git
  9. #src-git oldpackages http://git.openwrt.org/packages.git
  10. #src-link custom /usr/src/openwrt/custom-feed

以其中的 luci 为例:是一个现代化和模块化的网页界面功能接口,让我们可以通过网络浏览器控制路由设备.如果你想自定义界面显示,定制主题 即可.

  • 使用 ./scripts/feeds -h 可以查看各命令的使用说明

15995499797860.jpg

3. 配置编译目标和选项

  1. make menuconfig

这将打开编译 OpenWrt 的配置菜单,用于设置目标系统和选项.

关于 menuconfig 配置选择

menuconfig 拥有一个文本界面,包括处理的目标平台,要编译的软件包,要被包含进固件的软件包和一些内核设置
15995604311620.jpg

树莓派4b

我这里以编译树莓派4的固件为例,从 Raspberry Pi 4 Tech Specs 可知架构为 Broadcom BCM2711 64-bit

Target System (目标系统)———> (Broadcom BCM27xx)
Subtarget (子目标)———> (BCM2711 boards (64 bit))
Target Profile (目标档案)———> (Raspberry Pi 4B)
Target Images (目标镜像)———> [*] ext4 [*] squashfs [*] GZip images
镜像格式不清楚的请自行搜索或保持默认即可

X86

X86_64为例:

Target System (目标系统)———> (x86)
Subtarget (子目标)———> (x86_64)
Target Profile (目标档案)———> (Generic x86/64)
Target Images (目标镜像)———> [*] ext4 [*] squashfs [*] GZip images

4. 预先获取所有依赖包的源文件: 下载 dl 库

在执行最终的make之前,最好先使用make download预先获取所有依赖包的源文件

  1. make -j8 download V=s

下载完成的依赖包源文件存放在 /openwrt/dl 目录下,如果你尝试使用多核编译OpenWrt,而且没有下载所有依赖包的源文件,那么你的编译很可能会失败.

5. 构建编译固件

  1. make -j1 V=s

这个命令会自动执行以下操作:

  • 编译工具链
  • 然后用这个工具链交叉编译源文件
  • 创建 opkg-packages
  • 生成可以进行烧录的固件映像文件

编译完成需要一段时间,短则数个小时,长则数天,编译完成后固件输出路径: /openwrt/bin/targets/bla/bla.

构建选项(可选)

在多核CPU上构建

可通过-j选项启用多个进程以加速构建过程,首次编译推荐使用单进程:

  1. make -j3
  • 使用标准公式 <你的CPU个数 + 1>
  • 构建过程中若产生随机错误,尝试去掉 -j 选项重新构建

显示更多信息

  1. make V=s

Note:

  • *-factory 镜像文件用于在目标机上首次安装OpenWrt
  • *-sysupgrade 镜像文件用于更新现有的OpenWrt安装

6. 清理编译环境

  1. make clean

重新编译

  1. cd openwrt
  2. git pull
  3. ./scripts/feeds update -a && ./scripts/feeds install -a
  4. make defconfig
  5. make -j8 download
  6. make -j$(($(nproc) + 1)) V=s

重新配置再编译

  1. cd openwrt
  2. rm -rf ./tmp && rm -rf .config
  3. make menuconfig
  4. make -j$(($(nproc) + 1)) V=s

错误合集

1. you should not run configure as root15995604311620.jpg

15995618180271.jpg

  1. sudo make -j $(($(nproc) + 1)) V=s FORCE_UNSAFE_CONFIGURE=1

2. openwrt is not in the sudoers file. This incident will be reported.

  1. sudo usermod -aG sudo,adm openwrt

参考

Quick Image Building Guide

OpenWrt编译 – 说明

中文:如何编译自己需要的 OpenWrt 固件

安装OpenWrt(通用)

编译适用于mt7620a的OpenWrt