使用 Docker 编译 OpenWrt

请注意,本文编写于 121 天前,最后修改于 14 天前,其中某些信息可能已经过时。

前言

最近入了 OpenWrt 编译的坑,在经历过各种不顺利的编译体验后,我决定使用 Docker 去构建一个专门用于 OpenWrt 编译的系统环境容器。这样的好处是编译的过程始终在容器内进行,可以保持编译环境的高度一致性,基本上杜绝了因编译环境不同导致的编译失败的情况,有助于提高效率和编译成功率,同时省去了对编译环境的配置。本篇教程将介绍如何使用博主精心制作的 OpenWrt 编译环境 Docker 镜像来进行编译。

NOTICE: 本文与相关 Docker 镜像已于2019年11月18日重写

镜像特点

  • 基于 Ubuntu 18.04
  • 预装 OpenWrt 编译依赖软件包(免配置编译环境)
  • 预装 Zsh 与 Oh My Zsh(提升终端输入效率)
  • 预装 Tmux 与 Oh My Tmux(终端复用、后台运行)
  • 可挂载 buildroot 到宿主机(删除容器后源码与编译产物不会丢失)
  • 可通过 SSH 登录编译环境
  • 可通过 SFTP 取回编译产物

项目地址

欢迎 starfollow

https://github.com/P3TERX/openwrt-build-env

安装 Docker

安装 Docker 可以参考这个教程。写得非常详细,各种系统都有,就不自己水了。

TIPS: 使用 Windows 10 与 VMware 的组合的小伙伴需要注意,安装 Docker 要开启 Hyper-V ,这会导致 VMware 无法使用。可以选择使用 WSL 编译

配置编译环境容器

NOTICE: 代码框中的命令是一个整体,使用时注意完整复制粘贴。

获取镜像

TIPS: 中国大陆网络环境建议配置镜像加速器后再拉取镜像。
  • 从 Docker Hub 拉取镜像(速度快)
docker pull p3terx/openwrt-build-env
  • 本地构建镜像(版本新)
docker build -t p3terx/openwrt-build-env github.com/P3TERX/openwrt-build-env

建立容器

使用镜像建立容器并后台运行:

docker run \
    -itd \
    --name openwrt-build-env \
    -h P3TERX \
    -p 10022:22 \
    -v ~/openwrt:/home/user/openwrt \
    p3terx/openwrt-build-env

可选/自定义项:

  • -h P3TERX - 容器内系统的主机名,编译后会显示在内核日志中。
  • -p 10022:22 - SSH 端口映射,10022为宿主机端口。端口不能被占用,如需暴露在公网请修改防火墙设置。
  • -v ~/openwrt:/home/user/openwrt - 挂载目录,实现容器内外文件共享,左边宿主机路径,右边容器路径。
TIPS: 除非你对 Docker 的操作非常熟悉,否则不建议进行任何改动。

设置挂载目录文件权限

宿主机使用普通用户启动容器的情况下,使宿主机和容器之间可随意修改挂载目录中的文件,避免权限问题。


点击查看

修改 UID 与 GID

在宿主机输入id命令查看 UID 与 GID

若两者都为1000或者都为0(root 用户)则跳过这个步骤。
$ id
uid=1001(p3terx) gid=1002(p3terx)
  • 修改 UID(自行替换)
docker exec openwrt-build-env \
sudo usermod -u 1001 user
  • 修改 GID(自行替换)
docker exec openwrt-build-env \
sudo groupmod -g 1002 user
  • 重启容器
docker restart openwrt-build-env

修改文件归属

  • 修改文件归属用户和用户组为user
docker exec openwrt-build-env \
sudo chown -hR user:user .

验证结果

  • 进入容器
docker exec -it openwrt-build-env zsh
  • 输入la命令列出文件。当所有归属都为user说明没有问题了。
$ la
total 144K
-rw-r--r--  1 user user  220 Apr  5  2018 .bash_logout
-rw-r--r--  1 user user 3.7K Apr  5  2018 .bashrc
drwxr-xr-x  1 user user 4.0K Nov 18 12:14 .oh-my-zsh
-rw-r--r--  1 user user  807 Apr  5  2018 .profile
drwx------  1 user user 4.0K Nov 18 12:14 .ssh
drwxr-xr-x  1 user user 4.0K Nov 18 12:14 .tmux
lrwxrwxrwx  1 user user   16 Nov 18 12:14 .tmux.conf -> .tmux/.tmux.conf
-rw-r--r--  1 user user  11K Nov 18 12:14 .tmux.conf.local
-rw-r--r--  1 user user  42K Nov 18 13:04 .zcompdump
-rw-r--r--  1 user user  42K Nov 18 13:04 .zcompdump-P3TERX-5.4.2
-rw-------  1 user user  107 Nov 18 13:05 .zsh_history
-rw-r--r--  1 user user 3.6K Nov 18 12:14 .zshrc
drwxr-xr-x 16 user user 4.0K Nov 17 20:10 openwrt

SSH 安全设置

默认用户名和密码均为user,若需要把 SSH 端口暴露在公网,强烈建议修改密码或者使用密钥登录。


点击查看

修改密码

在宿主机执行以下命令修改密码。

docker exec -it openwrt-build-env \
sudo passwd user

密钥登录

容器中已经建立好了.ssh目录,若想和宿主机共用一个密钥,只需把密钥认证文件复制进去即可。

docker cp ~/.ssh/authorized_keys openwrt-build-env:/home/user/.ssh

设置认证文件归属

docker exec openwrt-build-env \
sudo chown user:user /home/user/.ssh/authorized_keys

禁用密码登录

docker exec openwrt-build-env \
sudo sed -i '/PasswordAuthentication /c\PasswordAuthentication no' /etc/ssh/sshd_config

最后重启容器

docker restart openwrt-build-env

编译环境容器的基本操作

进入编译环境容器

  • 从宿主机进入容器
docker exec -it openwrt-build-env zsh
  • 通过 SSH 连接容器
ssh user@IP -p 10022
TIPS: 自行替换IP字段。宿主机可通过localhost127.0.0.1连接容器。

退出编译环境容器

快捷键Ctrl+D或输入exit命令可以退出容器操作界面。

容器会持续在后台运行,如果你不想占用资源,输入以下命令让容器停止运行。

docker stop openwrt-build-env

如果需要再次使用,输入以下命令启动编译环境容器。

docker start openwrt-build-env

开始编译

编译的过程就像复读机,几乎就是复制粘贴的过程。详细的编译步骤可以去看《OpenWrt 编译步骤与命令详解》,这里不做赘述了。

如果你想后台编译,这涉及到 Tmux 的使用,可自行搜索学习相关知识,其流程大致为:

  • tmux
  • 开始编译
  • 关闭窗口
  • tmux a
  • 查看编译结果

若挂载目录到宿主机,不要忘记把源码放入挂载的目录中。比如下面这样:

git clone https://github.com/coolsnowwolf/lede openwrt

找到编译的固件

如果你没有瞎改容器启动命令,那么不管是宿主机还是容器,它们的路径都是一样的。以 x86_64 平台为例子,固件所在路径为:

~\openwrt\bin\targets\x86\64
科普:~符号代表用户主目录,俗称家目录。其路径与当前登陆的用户有关,在 Linux 中普通用户家目录的路径是/home/用户名,而 root 用户是/root。Windowd 10 中路径是C:\Users\用户名。在 macOS 中路径是/Users/用户名

欢迎订阅我的 TG 频道,接收最新的文章推送和有趣的内容。加入 TG 群组,和小伙伴们一同交流、学习、成♂长。

添加新评论

评论列表