本文及资源最后更新时间 2022-04-29 by sky995
OpenWRT是一个高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件和扩展性,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。 同时,它还提供了100多个已编译好的软件,而且数量还在不断增加,而OpenWrt SDK 更简化了开发软件的工序。
OpenWrt的优势
如果对Linux系统有一定的认识, 并想学习或接触嵌入式 Linux 的话, OpenWRT很适合。 而且OpenWRT支持各种处理器架构,无论是对ARM,X86,PowerPC或者MIPS都有很好的支持。 其多达3000多种软件包,囊括从工具链(toolchain),到内核(linux kernel),到软件包(packages),再到根文件系统(rootfs)整个体系,使得用户只需简单的一个make命令即可方便快速地定制一个具有特定功能的嵌入式系统来制作固件。
一般嵌入式 Linux 的开发过程, 无论是 ARM, PowerPC 或 MIPS 的处理器, 都必需经过以下的开发过程:
- 创建 Linux 交叉编译环境;
- 建立 Bootloader;
- 移植 Linux 内核;
- 建立 Rootfs (根文件系统);
- 安装驱动程序;
- 安装软件;
熟悉这些嵌入式 Linux 的基本开发流程后,不再局限于 MIPS 处理器和无线路由器, 可以尝试在其它处理器, 或者非无线路由器的系统移植嵌入式 Linux, 定制合适自己的应用软件, 并建立一个完整的嵌入式产品。
编译OpenWrt前言
编译 OpenWrt 的过程就像是复读机,除了选择系统组件外,几乎每次编译都是复制粘贴相同的命令。而理解每一条命令的作用、什么时候该去执行,这样才能更好的去解决编译中遇到的问题,更顺利的编译出固件。
编译OpenWrt基础教程
1.准备编译环境
首先装好 Ubuntu 64bit,推荐 Ubuntu 20.04 LTS x64。
2.安装编译依赖
终端命令行输入 sudo apt-get update ,然后输入 sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync
3.拉取源码
1:lede 源码git clone https://github.com/coolsnowwolf/lede
2:官方源码git clone https://git.openwrt.org/openwrt/openwrt.git
3:天灵源码git clone -b 你想要拉的分支 –single-branch https://github.com/immortalwrt/immortalwrt
git clone(代表克隆拉取的意思) 后面的才是源码的开源地址
4.更新下载feeds (这里以lede源码为例)
添加第三方feeds源
feeds里添加
src-git kenzok https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small
找到文件lede/feeds.conf.default
把上面的两段复制进去保存
feeds 是扩展的软件包,独立于 OpenWrt 源码之外,所以需要单独进行拉取和更新。
终端cd lede 进入源码目录
./scripts/feeds update -a(更新feeds源)
./scripts/feeds install -a(安装feeds源)
5.配置文件的设置
make menuconfig
OpenWrt Configuration【OpenWrt配置】
Target System (x86) —> 目标系统(x86)
Subtarget (x86_64) —> 子目标(x86_64)
Target Profile (Generic) —>目标配置文件(通用)
Target Images —> 保存目标镜像的格式
Enable experimental features by default —> 默认情况下启用实验功能
Global build settings —> 全局构建设置
Advanced configuration options (for developers) —- 高级配置选项(适用于开发人员)
Build the OpenWrt Image Builder 构建OpenWrt图像生成器
Build the OpenWrt SDK构建OpenWrt SDK
Package the OpenWrt-based Toolchain打包基于OpenWrt的工具链
Image configuration —>图像配置
Base system —> 基本系统
Administration —> 管理
Boot Loaders —>引导加载程序
Development —> 开发
Extra packages —> 额外包
Firmware —>固件
Fonts —>字体
Kernel modules —> 内核模块
Languages —>语言
Libraries —> 图书馆
LuCI —> LuCI 软件包
Mail —>邮件
Multimedia —>多媒体
Network —>网络
Sound —> 声音
Utilities —>实用程序
Xorg —>Xorg
选择你路由器CPU的架构
首次编译建议只选择架构,其它都不要动,这样编译成功率会更高。如果不打算调整组件则输入make defconfig,它会检测编译环境并生成默认的编译配置文件。
5.下载dl(依赖)库
make -j8 download V=s下载dl库(国内请尽量全局科学上网)
j8代表你的CPU线程数 8=8线程
但似乎有个上限,实测5线程以上其实速度相差不了多少,在 (科学) 网络好的情况下,基本在5分钟以内能下载完。
find dl -size -1024c -exec ls -l {} \;
此命令可以列出下载不完整的文件(根据我多次编译的经验得出小于1k的文件属于下载不完整),如果存在这样的文件可以使用find dl -size -1024c -exec rm -f {} \;命令将它们删除,然后重新执行make download下载并反复检查,确认所有文件完整可大大提高编译成功率,避免浪费时间。(这段可以不执行)
6.编译固件
make -j1 V=s
-j1:使用单线程编译。新手推荐单线程编译,一是因为玄学问题可能成功率高,二是方便查看错误日志。
V=s:输出详细日志,用于编译失败时找出错误。而且满屏代码在跑能装逼,一跑就是几个小时,装逼更持久。(上面也说了)
编译完成后输出路径:bin/targets
7.如果需要重新配置
rm -rf ./tmp && rm -rf .config
make menuconfig
make -j$(($(nproc) + 1)) V=s(多线程编译失败后自动进入单线程编译,失败则输出详细日志)
8.编译更换其它CPU架构的固件(建议操作)
清除旧的编译产物
make clean
在源码有大规模更新或者内核更新后执行,以保证编译质量。此操作会删除/bin和/build_dir目录中的文件。
清除旧的编译产物、交叉编译工具及工具链等目录
make dirclean
更换架构编译前必须执行。此操作会删除/bin和/build_dir目录的中的文件(make clean)以及/staging_dir、/toolchain、/tmp和/logs中的文件。
清除 OpenWrt 源码以外的文件(可选)
make distclean
除非是做开发,并打算 push 到 GitHub 这样的远程仓库,否则几乎用不到。此操作相当于make dirclean外加删除/dl、/feeds目录和.config文件。
还原 OpenWrt 源码到初始状态(可选)
git clean -xdf
如果把源码改坏了,或者长时间没有进行编译时使用。
清除临时文件
rm -rf tmp
删除执行make menuconfig后产生的一些临时文件,包括一些软件包的检索信息,删除后会重新加载package目录下的软件包。若不删除会导致一些新加入的软件包不显示。
删除编译配置文件
rm -f .config
在不删除的情况下如果取消选择某些组件它的依赖组件不会自动取消,所以对于需要调整组件的情况下建议删除。
所有操作不要root用户
今天的