8

自编译树莓派 OpenWrt 完全指南 (一) - 环境搭建

 2 years ago
source link: https://mlapp.cn/373.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

自编译树莓派 OpenWrt 完全指南 (一) - 环境搭建

发表于 2019-03-23

更新于 2019-06-20

分类于

OpenWrt

本文字数: 3.8k

阅读时长 ≈ 3 分钟

20190323 初次成文

很久之前就打算写一篇有关 OpenWrt 编译的教程,结果因为自己的原因,这篇教程从 2018 年拖(咕)到了 2019 年 3 月 (也就是说这算一篇跨年教程了?),趁着论文前的这段空档时间,再不抓紧时间把之前挖过的坑填上的话以后就有可能咕更久了,于是就有了这篇教程~

在之前的文章中小苏有提到过 “我的编译教程要比别人的更简单”,为了“让编译更简单”,在这篇教程中小苏将会使用打包好的 Docker 镜像作为 OpenWrt 的编译环境,并且会将编译过程中需要下载的众多源码和依赖包单独提供出来,尽量减少大家编译时漂洋过海下载源码包的麻烦。

特别说明:本文中提供的 dl.tar.gz (下文中会提及) 不保证 100% 适用于除树莓派外的其他情况和设备,除此之外的内容应该适用于其他大部分设备。

在这篇教程中,为了成功搭建 OpenWrt 编译环境,你需要准备:
系统为 Linux 或 macOS 的 PC 或 Server 设备(需要支持安装 Docker);
科学上网环境(最好部署到路由器上)。
挂载目录所在分区剩余空间应大于 50G 。

在接下来的操作中,假定你已经安装并配置好 Linux 系统、 Docker 环境,Docker 环境的一系列安装和配置步骤(包括但不限于配置 Docker 加速器,加入 sudo 用户组)可以从 Docker - 从入门到实践 项目中找到~

配置好 Docker 环境及加速器后,在终端中执行:

docker --version

若可以正确返回类似如下的 Docker 的版本信息即为安装成功~

Docker version 18.06.3-ce, build d7080c1

安装和配置好 Docker 环境之后,我们需要拉取编译所需的 Docker 镜像。这里的 Docker 镜像是小苏通过 Dockerfile 构建的,镜像中包含 OpenWrt 编译所需的所有依赖环境和一些常用工具,除此之外镜像中还配置好了 zsh,oh-my-zsh,以及一系列 zsh 插件 (git / sudo / zsh-syntax-highlighting / zsh-autosuggestions),可以说是开箱即用的一个 Docker 镜像。

因为镜像基于 Ubuntu 14.04 构建,所以小苏在 “前期准备”一节中并没有规定需要安装某种指定的 Linux 发行版,所以不论你的机器上安装了哪种 Linux 发行版,在 OpenWrt 编译的整个过程始终在容器内的 Ubuntu 14.04 中进行,这样的好处是可以保持编译环境的高度一致性,基本上杜绝了因编译环境不同导致的编译失败的情况,同时也可以省去大家对编译环境的配置,有助于提高效率和编译成功率~

关于此镜像的更多信息:
Dockerfile :
https://github.com/SuLingGG/openwrtenv
Docker Hub:
https://hub.docker.com/r/sulinggg/openwrtenv

好了,不自卖自夸了,我们需要执行以下命令拉取编译所需的 Docker 镜像:

docker pull sulinggg/openwrtenv

镜像拉取过程中为分层拉取,拉取完成后可以看到类似如下信息:

Using default tag: latest
latest: Pulling from sulinggg/openwrtenv
e082d4499130: Pull complete
371450624c9e: Pull complete
c8a555b3a57c: Pull complete
1456d810d42e: Pull complete
4ce8c7c9791d: Pull complete
cfbcf6e48aaf: Pull complete
Digest: sha256:13c93c3895421d8f70f3c39f9403c6c7299601b190351aedf81e9190e059f73c
Status: Downloaded newer image for sulinggg/openwrtenv:latest

接下来我们需要在主机上新建一个目录作为编译过程中的挂载目录:

mkdir ~/workspace

接下来我们使用刚刚拉取的镜像建立一个名为 openwrtenv 的容器:

docker run -itd -v ~/workspace:/home/admin/workspace --name openwrtenv sulinggg/openwrtenv

其中:
-v ~/workspace:/home/admin/workspace 表示将刚刚建立的文件夹 ~/workspace 挂载到容器中的 /home/admin/workspace 文件夹中(若容器中此文件夹不存在则会递归新建);
--name openwrtenv 表示新建的容器名为 openwrtenv;
sulinggg/openwrtenv表示将使用 sulinggg/openwrtenv 镜像创建容器。

命令执行完毕后,返回结果中如果只返回容器的 sha256 值则说明容器创建成功。

接下来我们执行以下命令进入容器:

docker exec -it openwrtenv zsh

其中:
openwrtenv为容器名称;
zsh为此次执行的容器中的命令,一般情况下选用 bashsh,但因为小苏在镜像中已经配置好了 zsh,所以可以直接选用 zsh

执行后我们将会看到类似的提示:

# root @ 6883dad1f91e in / [18:58:25] 
$

此时当前用户为默认的 root 用户,而 OpenWrt 不能使用 root 用户编译,针对这种情况,小苏在镜像中建立并配置了普通用户 admin,接下来我们需要把刚刚挂载到容器的 workspace 文件夹的所有者改为 admin 以使 admin 用户可以正常读写此目录 (感谢评论区 :) 的指出):

chown -R admin:admin /home/admin/workspace

完成 workspace 文件夹的所有者更改后,我们执行命令切换用户为 admin:

su admin

此时我们便切换到了普通用户 admin:

# admin @ 6883dad1f91e in / [18:58:50] 
$

接下来我们切换目录为普通用户 admin 的 home 目录,看看下面有什么东西:

cd ~ && ls

我们可以看到 admin 用户的 home 目录下 (/home/admin) 存在一个 workspace 文件夹,这个文件夹就是我们挂载到容器中的挂载文件夹,即主机下的 ~/workspace 文件夹,主机中的这个文件夹中的内容将与容器中的 /home/admin/workspace 文件夹保持同步,即容器中文件夹中的内容改变情况会同步到主机,主机中的内容改变情况也会同步到容器。
之后的编译工作就在 workspace 文件夹中进行。

环境已经搭建完毕,接下来进入编译前的准备阶段。(从现在开始应该保持全程科学上网状态)

首先我们切换到容器内的 workspace 文件夹并且把 Lean 大的 OpenWrt 仓库克隆到本地:

cd ~/workspace && git clone https://github.com/coolsnowwolf/lede

除了编译所需的环境镜像之外,小苏还为大家提供了编译过程中需要的一些依赖和源码包,并将它们打包成了一个文件,将文件解包到指定目录后,在编译过程中就不需要漂洋过海去下载了:

注:此文件 (dl.tar.gz) 不保证 100% 适用于除树莓派外的其他情况和设备

cd ~/workspace/lede && wget http://netdisk.club/DockerRes/BuildRes/dl.tar.gz

如果上面的链接下载速度慢的话,也可以试试这个,但下载文件时必须处于科学上网环境下,否则此文件无法下载成功:

cd ~/workspace/lede && wget https://image.moeclub.org/GoogleDrive/1DnECAO7PDL_lR-9kneyLshM7unwr_6Ma -O dl.tar.gz

下载完成后解压:

tar -zxvf dl.tar.gz

接下来安装和更新必要的软件包:

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

测试编译环境:

make defconfig

配置固件菜单:

make menuconfig

在“配置固件菜单”这一步内中,我们需要选择编译对象设备的 CPU 平台、CPU 型号、固件格式、固件分区大小、包含的软件包以及其它选项。

开始编译:

make V=99 -j1

编译所用时间与设备硬件性能,添加的软件包多少,CPU 线程数有关。

编译完成后的固件、ipk 软件包及其他资料将存放到 OpwnWrt 项目仓库的 bin 文件下,如果你严格按照本文教程操作,编译完成后的一系列文件将存放在容器的 /home/admin/workspace/lede/bin 文件夹下,同时因为我们使用了挂载目录的原因,这些文件也会永久存放在到主机的 ~/workspace/lede/bin 文件下。

至此,OpenWrt 编译教程的第一部分就结束了,在下一篇 “完全指南” 中,小苏将重点讲讲 make menuconfigmake V=99 -j1 这两项,同时,这两项也是编译过程中的重头戏。
另外,除本文提到的 dl.tar.gz 文件外,此教程的大部分内容应该适用于绝大多数情况和设备。

更多编译细节,请看下一篇~

OpenWrt By Lean · coolsnowwolf/lede - GitHub:
https://github.com/coolsnowwolf/lede

OpenWrt Project Document - The build system:
https://openwrt.org/docs/guide-developer/build-system/start

OpenWrt Environment · SuLingGG/openwrt - GitHub:
https://github.com/SuLingGG/openwrtenv

SuLingGG/openwrtenv - Docker Hub:
https://hub.docker.com/r/sulinggg/openwrtenv

Docker 从入门到实践 · yeasy/docker_practice - GitHub:
https://github.com/yeasy/docker_practice

从零开始编译OpenWRT/LEDE固件 - GXNAS博客:
https://wp.gxnas.com/2367.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK