Loading... # Lean(L大)的openwrt源码编译教程 最近买了个软路由,是前一段时间众筹的那款 `j4125` CPU的软路由。之前也在恩山上找了不少时间的固件,但始终不是很满意:有的功能太少,有的功能太多不稳定,等等问题,结果找来找去还是自己编译来得舒服。尝试了一段时间,遂出了这篇教程。 ## 注意事项 - 编译问题多种多样,且因人而异,l大的源码已经尽量做到了无错误。若出现问题,请自行度娘或~~(烧香拜佛)~~ 。我也会试着举一些常出现的问题。 - 本教程基于 [L大的openwrt仓库](https://github.com/coolsnowwolf/lede) ,理论上也可以类比到 [官方仓库](https://github.com/openwrt/openwrt) ,博主没有试过,请自行尝试。 - 有一个好的环境对编译成功率起到很大影响。此处包括但不限于: **编译环境** 、 **网络环境** ……甚至是 **周遭环境** ~~(沐浴更衣,打扫宿舍)~~ ## 准备工作 - 一台linux系统的电脑(可以是虚拟机),最好用 `Ubuntu 20.04` (官方指定)。 - 至少40G的硬盘空间。否则……你懂的<(`^´)> ![image-20210916202914070](http://storage.live.com/items/DB44658DD8A8FA78!65507:/image-20210916202914070.png?authkey=AGlHGlyPeBMMiGU) 这台虚拟机只用来编译openwrt就已经这样了,我的硬盘啊 (ఠ్ఠ ˓̭ ఠ్ఠ)。 - 至少8G的内存。我爆过内存。 - CPU不要太旧就行。大不了编译时间长点 - 良好的网络环境。至于怎么良好,至少得保证虚拟机全球联网。 - 平稳的心态、耐得住心、 ~~好的运气~~ 。 ## 第一次编译 ### 系统安装 Ubuntu系统不用我介绍怎么安装吧,这可是linux中数一数二的简单。如果不会装,那可能接下来教程也不太适合你。 ### 配置软件源(可选) 如果是安装时地区选择中国的、不是官方源的……都可以换成官方源。(更新速度最快)(默认你的机器可以全球上网) ```shell $ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份原来软件源 $ sudo vim /etc/apt/sources.list #书写新软件源 ``` 删除文件内容并黏贴以下代码块内容(vim不会用请百度)。 ``` deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse ``` 若官方源仍有问题可更换至国内镜像源,推荐使用[清华源](https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/) ```yaml # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse ``` 运行以下代码更新数据 ```shell $ sudo apt-get update #从软件源更新数据 ``` ### 安装必要的环境 ```shell $ 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 ``` 必须 **确认无误** 才可以进入下一步。 ### 拉取代码 ```shell $ git clone https://github.com/coolsnowwolf/lede $ cd lede ``` 这里拉取的就是 [L大的openwrt仓库](https://github.com/coolsnowwolf/lede) 。官方仓库请自行寻找。 ### 软件源的安装 各个软件源地址都在 `lede/feeds.conf.default` 中。这里暂且只使用L大源码中已经有的软件源。添加其他源请看 [添加软件源](#添加软件源) 。 ```shell $ ./scripts/feeds update -a $ ./scripts/feeds install -a ``` ### 选择平台 运行以下命令: ```shell make menuconfig ``` 不出意外你会看见以下画面: ![配置菜单](http://storage.live.com/items/DB44658DD8A8FA78!65508:/配置菜单.png?authkey=AGlHGlyPeBMMiGU) 第一次编译的时候只要注意 **前面三个选项** :`Target System` `Subtarget` `Target Profile` 这三个选项决定了你编译的固件适用于哪些平台,而你的机器是什么平台又是由你的处理器 **架构** 、 **指令集** 、**机器型号** 决定的,切记不可选错了。 举个栗子: - 图中前三项就是标准 `x86` 平台的设置方式 - 如果你是 `r2s` 路由器,用的是 `Rockchip RK3328` 处理器,你可以使用如下设置: - `Target System` ---> `Rockchip` - `Subtarget` ---> `RK33xx boards (64bit)` - `Target Profile` ---> `FriendlyARM NanoPi R2S` 市面上比较热门的机型这里应该都是有的,博主没钱,就介绍这两个。 从这里开始,自编译固件的优势就显现出来了: ***适配性极广!!!*** 千奇百怪、五花八门的型号只要这里出现,就可以编译。编译好了之后系统、软件再也不求人。 选完这三个选项选中下面的 `< Save >` 保存即可,暂时不编译其他的插件。 ### 开始编译 ***[重要]*** 到了这步请确保自己网络环境为: ***全局代理*** 并且保持到 **编译结束** 。 ```shell $ make -j8 download V=s ``` 此步骤下载DL库 ***(全局代理)*** 。一定要保证下载的DL库完整,可以多运行几次,如果有一两个几次没法下载没关系,忽略吧。 输入下面命令开始编译: ```shell $ make -j$(($(nproc) + 1)) V=s ``` ***[注意]*** 这里直接使用多线程编译,而非WIKI里的单线程编译。我这么做是应为单线程耗费时间实在是太长了。如果追求稳定可以使用单线程编译: ```shell $ make -j1 V=s ``` 如果多线程编译出问题了,可以转而使用单线程编译来检查错误代码。 ### 编译完成 如果情况顺利我们会看到这样的画面: ![编译完成](http://storage.live.com/items/DB44658DD8A8FA78!72594:/编译完成.png?authkey=AGlHGlyPeBMMiGU) 如果不是这个画面,那么大概率没编译成功,那么只能顺着错误代码排查原因了。 - 刷机包在 `lede/bin/targets/xx/xx` ,‘xx’由个人选的平台决定 - 软件仓库在`lede/bin/packages/xx` ,这个仓库可以添加到openwrt后台的自定义软件源里,安装软件再也不怕出错 ## 二次编译和重新配置 二次编译相较于第一次编译会快很多。但是如果 `menuconfig` 里勾选以前没编译过的软件,这些软件实际上就是第一次编译。 你可以理解为每个软件其实是单独编译的,最后被整合成镜像。那就不难理解为什么我推荐第一次编译的时候不进行软件的勾选。这其实是防止出现问题。 二次编译适用于以下情况: - 固件(软件)源码更新 - 给固件安装内置新的软件 - 驱动、内核的更新和安装 - …… 二次编译其实和第一次差不多 ```shell $ git pull #更新最新固件源码。 $ ./scripts/feeds update -a && ./scripts/feeds install -a #更新最新软件源码,也用在添加新软件源时下载。 ``` - 如果你要更新配置文件 - ```shell $ rm -rf ./tmp && rm -rf .config #删除缓存和默认配置(注:这会删除之前的配置) $ make menuconfig #配置菜单 $ make -j8 download #下载dll $ make -j$(($(nproc) + 1)) V=s #编译 ``` - 如果你不改配置 - ```shell $ make defconfig #使用之前菜单生成.config $ make -j$(($(nproc) + 1)) V=s #编译 ``` ## 添加软件源 有时候L大的仓库已经不能满足你对自用软件的要求。下面两种方法获取软件源,从而自己编译,适应自己的机器环境。 ### 直接用别人搜集的源码仓库(方便简单) 这里推荐两个仓库: - [kenzok8/openwrt-packages: openwrt常用软件包 (github.com)](https://github.com/kenzok8/openwrt-packages) - [liuran001/openwrt-packages: 国内常用OpenWrt软件包源码合集,每天自动更新,建议使用lean源码 (github.com)](https://github.com/liuran001/openwrt-packages) 我用的第一个,这里用第一个举例。(其实readme都写得很清楚) 1. 打开源码文件夹下 `feeds.conf.default` 2. 添加两条代码 ``` src-git kenzo https://github.com/kenzok8/openwrt-packages #软件库 src-git small https://github.com/kenzok8/small #passwall依赖 ``` 3. 运行 `./scripts/feeds update -a && ./scripts/feeds install -a ` 安装 4. 运行 `make menuconfig ` 就能勾选 ### 单个软件源添加 有时候别人搜集的仓库也没有你要的软件,这时候可以单独添加你要的软件源码。 这里用 [lisaac/luci-app-dockerman: Docker Manager interface for LuCI (github.com)](https://github.com/lisaac/luci-app-dockerman) 举例: 1. 找个位置`clone` `dockerman` 仓库,我在 `/home/tutu/lede-packages` 拉源码 2. 找到有 `Makefile` 文件的那一层路径,那我这就在 `/home/tutu/lede-packages/luci-app-dockerman/application/luci-app-dockerman` 目录里 3. 创建软链接 `ln -s /home/tutu/lede-packages/luci-app-dockerman/application/luci-app-dockerman /home/tutu/lede/package` 4. 运行 `make menuconfig ` 就能勾选 **[注]** 其实可以直接在 `/home/tutu/lede/package` 里 `clone` 仓库,但这样不方便统一管理,遂作罢。 **[注]** 你可以不去找 `Makefile` 所在的那层路径,直接软链接整个源码,`make menuconfig ` 会历遍整个 `/lede/package` 查找 `Makefile` 。 ## .config文件 `.config` 由 `make menuconfig` 生成,主要包含哪些要编译,哪些不编译,哪些整合进固件。 - 应用主要在 `LuCI--->Applications` 里 - `Target Images` 决定刷机包格式,文件系统大小 - `Root filesystem partition size` 决定文件系统大小,也决定镜像大小,不建议太小,不然你编译很多软件进系统会报错。 - 其他的得自己根据自己的平台看。 - …… 这一部分建议自己摸索,基本上你编译的固件含有生么功能都由此决定。 ## 总结 其实到这里从来没接触过编译的都可以自己搞个固件出来了,最多只有时间和设备的差别。其实还有很多没讲,比如: - [ ] 编译错误的讲解(我自己都没摸透) - [ ] openwrt基础使用(可能出) - [ ] 自制软件仓库(简单的,可能出) - [ ] …… 如果到这步还不懂,那安安心心找个别人弄好的固件包吧,老老实实[恩山](https://www.right.com.cn/forum/)吧。 最后修改:2021 年 10 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏