简易指南:使用 OpenWrt 的交叉编译 SDK 来编译 ipk 软件包
本文以编译 Linksys WRT1900ac 需要的 Shadowsocks/ShadowVPN/ChinaDNS 为例说明如何简单快速编译 ipk。
你需要一台安装了 Linux 的 VPS。
当然本地 PC(或者本地虚拟机中的 PC)也可以,不过一般没有海外的 VPS 网速好。
无论如何都更推荐 VPS。
本文以 Linode1024 和 Debian 8.1 64 bit 举例说明。
为了简化操作,推荐使用 Docker 快速安装编译环境。
你也可以手动安装编译所需的一些工具链,可以参考官方说明文档
本文尽可能采用简易的方法来简化操作步骤,但是仍然需要读者有基础的 Linux 命令行操作知识。
如果你具备了一定的 Linux 操作能力,那么本文可以给你一些启发,你可以选择适合自己的方式来做编译。(例如不用 Docker,不用 Debian 系的发行版等等)
配置好 VPS 的操作系统,推荐 Debian 系(Unbuntu)尽量新的版本
打开命令行(Mac 和 Linux 自带),或者 Window 的第三方命令行软件(例如 PuTTY)登入 VPS:
ssh root@VPS的IP
安装 Docker
wget -qO- https://get.docker.com/ | sh
下载运行 docker-openwrt-buildroot 镜像
docker run -t -i nemoalex/openwrt-buildroot /bin/bash
下载完成,这时候应该进入了一个容器的环境中,输入 ls 可以看到有一个 openwrt 的目录,其实在这个目录里已经可以编译 openwrt 了,但是我们为了方便,还是使用特定版本的 SDK。
在 https://downloads.openwrt.org/ 找到对应的发行版和对应 CPU 架构的固件下载地址。例如我使用的就是 https://downloads.openwrt.org/chaos_calmer/15.05/mvebu/generic/
可以看到在目录中有一个 SDK 压缩包,复制此链接地址,下载到 VPS 上:
wget https://downloads.openwrt.org/chaos_calmer/15.05/mvebu/generic/OpenWrt-SDK-15.05-mvebu_gcc-4.8-linaro_uClibc-0.9.33.2_eabi.Linux-x86_64.tar.bz2
下载完成后,解压:
tar -xf OpenWrt-SDK-15.05-mvebu_gcc-4.8-linaro_uClibc-0.9.33.2_eabi.Linux-x86_64.tar.bz2
进入目录
cd OpenWrt-SDK-15.05-mvebu_gcc-4.8-linaro_uClibc-0.9.33.2_eabi.Linux-x86_64
环境搭建好,接下来就是编译了。
这里的示例是编译 aa65535 移植的三个软件: ShadowVPN Shadowsocks ChinaDNS
按照说明,把需要编译的 makefile 下载到 package 目录下:
git clone https://github.com/aa65535/openwrt-chinadns.git package/chinadns
git clone https://github.com/aa65535/openwrt-shadowvpn.git package/shadowvpn
git clone https://github.com/shadowsocks/openwrt-shadowsocks.git package/shadowsocks-libev
如果你需要编译其它的软件,请参考软件提供的说明。
选择需要编译的模块:
make menuconfig
进入 network 选单,ChinaDNS 和 ShadowVPN 默认就是选中的状态没问题,而 Shadowsocks 有4个版本,选择你想要的版本,按空格把其它版本取消掉,可以节约编译时间。 例如我只选择 shadowsocks-libev-spec-polarssl。 好了以后 Exit,Yes 保存。
开始编译:
make V=99
如果你使用的是多核心的 CPU,可以选择加上 -j 参数,例如8核:
make -j 8 V=99
之后就是漫长的等待的时间了。
编译成功以后,ipk 包在 bin/mvebu/packages/base/ 目录中(注意 mvebu 是对应 CPU 的名子),查看一下。
ls bin/mvebu/packages/base/
如果有对应的 ipk 文件的话,就说明成功了。
接下来的任务是把这些 ipk 上传到路由器上。
如果你的路由器有公网 IP,可以配置路由器允许从外网登入(开放22端口),那么首选 scp 的方式。例如:
scp bin/mvebu/packages/base/*.ipk root@路由器IP:/root/
大功告成。
如果没有公网 IP,那么可以使用其它的方式。例如在 VPS 上开一个简单的 HTTP 服务器。
首先退出 Docker:
exit
找到刚才使用的 docker 容器的 ID:
docker ps --all
把ipk文件拷贝到宿主机:
mkdir ipks
docker cp 容器ID:/home/openwrt/OpenWrt-SDK-15.05-mvebu_gcc-4.8-linaro_uClibc-0.9.33.2_eabi.Linux-x86_64/bin/mvebu/packages/base/ShadowVPN_0.1.6-1_mvebu.ipk ./ipks/
...
貌似是要一个一个文件拷贝,不支持通配符。如果不记得目录或者文件名的话可以进去再看一下:
docker start 容器ID
docker attach 容器ID
拷贝完成后,开一个简单的 http 服务器:
cd ipks
python -m SimpleHTTPServer 8080
然后在本地浏览器中打开 http://VPSIP:8080 ,下载文件。
完成以后就是去路由器上安装 ipk 包了,在本地使用 scp 把文件传上去,opkg install xxx.ipk 就可以了。这部分不是本文的重点,不再赘述。