基于Docker编译openwrt

Docker确实是个好东西,当我用MAC OSX下载编译openwrt过程中遇到不少问题时,想到openwrt官网wiki建议使用的Ubuntu,于是我想到了Docker。

至于Docker怎样好,在MAC OSX里怎么安装,在这里不作细说,可参考这篇文章

这里只说在docker里构建openwrt的image及使用其进行编译。

假设docker环境已经安装配置好并且已经启动。

创建openwrt的Docker image

进到docker环境,执行以下命令新建开发目录并进到该目录底下:

mkdir -p /src/openwrt && cd /src/openwrt

执行vi Dockerfile新建docker image配置文件,输入以下内容:

FROM ubuntu:14.10 #使用ubuntu14.10作为基准镜像 RUN apt-get update &&\
apt-get install -y git-core subversion build-essential gcc-multilib \ libncurses5-dev zlib1g-dev gawk flex gettext wget unzip python &&\ #安装openwrt编译所需依赖相关 apt-get clean &&\ useradd -m openwrt &&\ #新建openwrt用户 echo 'openwrt ALL=NOPASSWD: ALL' > /etc/sudoers.d/openwrt &&\ #赋予openwrt用户无密码超级权限 sudo -iu openwrt svn co svn://svn.openwrt.org.cn/dreambox/trunk openwrt-pandorabox &&\ #svn下载openwrt源代码,这里下载的是国内[openwrt中文](openwrt.org.cn)团队的openwrt-pandorabox开发版本 sudo -iu openwrt openwrt/scripts/feeds update #更新openwrt扩展包

保存以上文件退出后,执行创建image指令:

docker build --rm -t myname/my-openwrt:base . //注意:docker build命令最后一定要以.结束才能执行下去

-t 选项是你要构建的base image的tag,就好比ubuntu:14.10一样 –rm 选项是告诉Docker在构建完成后删除临时的Container,Dockerfile的每一行指令都会创建一个临时的Container,一般你是不需要这些临时生成的Container的.

接下来docker会自动下载依赖的image和相关包,这需要花费一些时间。

运行docker image

创建image完成后,执行以下指令运行image并进入其中:

docker run -t -i myname/my-openwrt:base sudo -iu openwrt bash

添加扩展软件包(Add packages from extra feeds)

执行cd openwrt-pandorabox/进到源码根目录下.

执行cp feeds.conf.default feeds.conf,然后vi feeds.conf进入此文件的编辑:

src-svn packages svn://svn.openwrt.org.cn/dreambox/feeds/packages_12.09 src-svn qpe svn://svn.openwrt.org.cn/dreambox/feeds/qpe
src-svn device svn://svn.openwrt.org.cn/dreambox/feeds/device
src-svn dreambox_packages svn://svn.openwrt.org.cn/dreambox/feeds/dreambox_packages
src-svn luci_cn svn://svn.openwrt.org.cn/dreambox/feeds/luci/trunk

文件内前面加注释符号#表示该软件源不会被下载和安装。需要安装何种软件源就去掉相应的# 。

请注意,这个设置并不表示这些应用程序包会被编译,而只是在后面使用menuconfig命令时会获取这些包的描述信息(OpenWrt-Makefiles)。

现在,更新下载这些包,并安装它们到package/feeds/目录:

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

配置DreamBox(Configure target and packages)

下一步是检查编译环境,若可进行编译则生成默认配置: make defconfig

若defconfig回显提示缺少软件包或编译库等依赖,则按提示安装所缺软件包或库等即可,不难的,细心点就行。

现在开始配置OpenWrt-DreamBox,选择你需要目标平台,以及选择将要编译和添加进固件的软件包。运行命令: makde menuconfig

接下来出现的配置界面跟Linux内核的配置界面基本差不多,几乎每一项都有3个选择Y/M/N:

  • Y:选择Y,该软件将被编译,并且加入到你的目标固件里;
  • M:选择M,该软件包将会被编译,但不会被放入固件里。在需要它的时候,可以 用OPKG软件包管理器进行安装;
  • N:选择N,该软件包将不会被编译,也不会被安装进固件。

  • 方向键是移动光标

  • 回车键是确认
  • 空格键是选择,可以代替Y/M/N键的使用

比如要为TP-LINK TL-MR3420编译openwrt:

  • 1 选择CPU型号:

Target System ---> (X) Atheros AR71xx/AR7240/AR913x

  • 2 选择路由型号

Target Profile ---> (X) TP-LINK TL-MR3420 v1

  • 3 软件包就使用默认的,或者可以根据需要添加。

    • 添加luci

      LuCI ->Collections -> <*> luci

    • 添加luci的中文语言包

      LuCI ->Translations -> <*> luci-i18n-chinese

    • 添加DDNS

      LuCI ->Applications -> <*>luci-app-ddns

    • 添加USB挂载

      Base system -> <*>block-mount

    • 添加硬盘格式支持

      Kernel modules -> Filesystems -> <*> kmod-fs-ext4

    • 添加UTF8编码

      Kernel modules -> Native Language Support -> <*> kmod-nls-utf8

    • 添加USB扩展支持

      Kernel modules -> USB Support -> <*> kmod-usb-storage-extras.

    • 添加自动挂载工具

      Utilities -> Filesystem -> <*> badblocks

    • 添加复位键支持

      Utilities -> <*> restorefactory

    • 添加一键开关无线

      Utilities -> <*> wifitoggle

  • 如果需要单独配置OpenWrt-DreamBox的linux kernel,可以使用下面命令配置:

    make kernel_menuconfig

这和普通的linux kernel的make menuconfig没有什么区别,可以根据需求自行配置。

  • 如无特殊情况,直接使用默认的内核配置即可!

编译openwrt(Build your OpenWRT image)

完成menuconfig配置后,退出保存,开始编译DreamBox:make

编译过程可能会很久(一边下载源代码一边编译),请确认你有足够的磁盘空间(应至少保证能够有大约4G以上的空间)。

另外,你可以使用:make -j 3 V=99

这个命令会使用双核CPU进行编译,并且输出编译过程中的信息,这样你可以比较清楚的看到编译情况或出错情况:

  • -j3:具有多核CPU处理器的PC进行编译,可使用-j参数加速编译,用法为-j
  • V=99:表示输出详细的debug信息
  • make world:表示编译所有

如只想清除/编译某个模块,您可以做如下类似操作:

make package/qos/clean make package/qos/compile make package/qos/install

烧写固件(Flash)

编译结束后,生成的固件存放在bin目录下,其中包含了kernel和rootfs的镜像文件,以及众多可以使用OPKG工具安装的.ipk安装包。 接下了就是往flash中烧写固件,每个硬件设备不尽相同,不在详述。

参考:

Docker体验之:在MACOS下安装docker并构建nodejs开发环境

OpenWrt-DreamBox开发文档索引

Wilson

张弛有度、简约不简单