Openwrt 编译教程

DoNotKnow 发布于 7 小时前 20 次阅读


一、Openwrt 简介

OpenWrt 项目是一个针对嵌入式设备的 Linux 操作系统。OpenWrt 不是一个单一且不可更改的固件,而是提供了具有软件包管理功能的完全可写的文件系统。这使您可以从供应商提供的应用范围和配置中解脱出来,并且让您通过使用适配任何应用的软件包来定制设备。对于开发人员来说,OpenWrt 是一个无需围绕它构建完整固件就能开发应用程序的框架; 对于普通用户来说,这意味着拥有了完全定制的能力,能以意想不到的方式使用该设备。(摘至[OpenWrt Wiki] 欢迎访问 OpenWrt 项目

而作为一个开源的系统,其除了官方主线以外,还要大大小小的不同 folk 分支,其中本土化最好的莫过于 Immoralwrt 分支。因此本文介绍方法以 Immoralwrt 为例,其余分支编译方式,配置方式基本相同。

二、编译环境配置

Immoralwrt 官方推荐适用 Debian 11 进行编译,由于个人更喜欢适用 Ubuntu,演示均以 Ubuntu 演示。

1.前期准备

Debian/Ubuntu 系统的安装网上有很多不错的教程,可以自行搜索,这里不做演示。但请确保至少 4GB 内存、25GB 可用磁盘空间,且保证网络可正常联网。由于Immoralwrt 编译根据不同架构,不同型号,软件包数量的不同,所需空间也有所不同,个人建议预留更大的磁盘空间(64 GB 甚至更多)。

此外,编译全程不得适用 root 账户进行,部分步骤需要适用 root 权限,均通过 sudo 命令实现。由于 Immortalwrt 官方源码发布于Github,请确保您的网络环境可以访问到Github。

2.安装依赖

Immoralwrt 官方提供了依赖安装脚本
sudo bash -c 'bash <(curl -s https://build-scripts.immortalwrt.org/init_build_environment.sh)'

直接运行并等待执行完成即可,如果遇到出现缺失 curl 模块的情况,可以使用sudo apt-get update && apt-get install curl来安装

3.拉取源码

如果您不需要使用特定分支或者特定版本的 Immoralwrt 进行编译,可以直接执行git clone https://github.com/immortalwrt/immortalwrt来拉去源码

当然如果您在拉去后向切换到特定分支也可以使用git checkout 分支名来切换,或者直接使用git clone -b <branch> --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt来拉取对应分支的源码。

4.更新软件源索引并安装软件包软链接

输入cd ./immortalwrt进入源码目录,然后输入./scripts/feeds update -a &&./scripts/feeds install -a等待运行完成即可

5.注意事项

  1. 所有操作请使用普通非特权用户执行,不要用 root 身份,也不要全程加 sudo;
  2. 其他架构 CPU 理论可编译,但需要额外适配修改,项目不提供任何兼容性保障
  3. 系统环境变量路径、编译工作目录严禁包含空格及非 ASCII 字符
  4. 若使用 WSL(Windows 子系统),必须从环境变量 PATH 中移除 Windows 系统目录,具体参看 WSL 编译环境配置文档
  5. 不推荐使用 macOS 作为编译主机,无官方兼容性保障,相关配置技巧可参考 macOS 编译环境文档
  6. 更多细节详见官方编译环境搭建文档

----------摘至 Github-Immortalwrt

三、配置编译设置

输入make menuconfig进入图形化界面,该界面可以通过方向键控制光标位置,回车键来确认,ESC 键回到上一个页面。你也可以按/进入搜索界面搜索你需要的软件包

图中Target System, Subtarget, Target Profile 需要根据你需要编译的路由器选择,如我需要编译 X86 的固件则分别选择 x86, x86_64, Generic x86/64

下面的 Target Images 是编译出的固件文件的相关配置,一般不需要修改

Global build setting 包含一些简单的设置选项

  • Cryptographically signed package lists ---- 为软件包列表进行签名(建议关闭)
  • Enable signature checking in opkg ---- 启用 opkg 签名验证(建议关闭)
  • Enable TLS certificate verification during package download ---- 在软件包下载时启用TLS连接(启用该功能请务必安装Network-File Transfer - wget-ssl)
  • Use APK instead of OPKG to build distribution ---- 使用 APK 源而不是 OPKG 来构建固件 (启用该功能请务必安装Base system - openwrt-keyring)
  • Cryptographically signed package .apk file ---- 加密每一个 .apk 软件包 (注:此处 apk 文件与安卓的 apk 无任何关系)

然后进入 LuCI勾选 default-setting-chn,否则您编译出的固件将不包含中文界面,然后进入LuCI-3.Applications,勾选ttyd否则您的编译将会报错。

到此为之,基本的编译配置已经完成,如果您需要额外的软件包,可以自行选择

然后将光标移动到Save并回车即可保存,接着退出配置界面即可

四、编译及报错排查

编译时在源码目录输入time make V=s -j$(nproc),如果编译结束后没有任何 error(warning 可忽略)即代表编译完成。编译出来的固件会在immortalwrt/bin/targets/xxx/xxx下生成

如果遇到任何报错,请使用time make V=s -j1进行单线程编译,查看输出日志排除错误。错误日志可以交给 AI 进行分析,也许能够提供较好的解决方式。

到这里,你已经掌握了基本的编译方式,由于 openwrt 的极广的适配性,极高的可扩展性,还有大大小小的功能和大大小小的BUG(bushi)等着你。