如何在openWRT/LEDE固件中添加第三方二进制IPK?

所谓的第三方二进制ipk就是没有源码,只有ipk文件。

主要参考文档:
OpenWrt Project: 使用镜像生成工具 (Image Builder)
https://openwrt.org/start?id=zh/docs/guide-user/additional-software/imagebuilder

编译环境及步骤参见:
编译openWRT/LEDE固件 http://xingyuncheng.net/?p=19

有两种办法:
1.从源码编译
1.1 上传
将需要添加的ipk文件上传到~/lede/bin/packages/x86_64/packages/packages/目录;

1.2 创建索引
上传ipk文件以后,需要将所上传的ipk文件进行索引,不然编译程序不认识,没法编译进固件。

#先设置PATH路径,否则创建过程会提示mkhash出错
export PATH=”~/lede/staging_dir/host/bin:$PATH”

cd ~/lede/bin/packages/x86_64/packages/packages/
~/lede/scripts/ipkg-make-index.sh ./ > ./Packages
gzip -9c ./Packages > ./Packages.gz

很不幸,运行的时候出现错误提示:
tar: ./control.tar.gz: Not found in archive
tar: Exiting with failure status due to previous errors

ipk文件其实就是压缩文件打包,只要将.ipk改成.tar.gz后缀,再解压缩就能看到ipk文件内容。
看了一下我要编译的ipk文件结构跟正常的不同,压缩包内显示的不是./control.tar.gz,而是control.tar.gz,所以没办法只好把~/lede/scripts/ipkg-make-index.sh修改了一下,24行内:
tar -xzOf $pkg ./control.tar.gz
改成:
tar -xzOf $pkg control.tar.gz
保存以后重新运行:
~/lede/scripts/ipkg-make-index.sh ./ > ./Packages
成功。

然后再运行
gzip -9c ./Packages > ./Packages.gz

这样~/lede/bin/packages/x86_64/packages/packages/文件夹就多了2个文件
Packages
Packages.gz

1.3 然后按照正常流程编译固件
编译完成以后,在固件的/根目录就会有上传的ipk文件。
但不幸的是,这样上传的ipk文件并不能自动安装,还需要自己手工安装一下。
不完美。

2.
用imagebuilder添加进去(可以自动安装进固件)
imagebuilder是从源码编译的时候,一个可选的中间文件,具体生成办法请百度。

2.1 上传ipk
~/imagebuilder/packages/是原生ipk所在路径,不要将第三方ipk放在同一个目录下。
所以上传到以下位置:~/imagebuilder/packages/packages/

2.2 创建索引文件
export PATH=”~/imagebuilder/staging_dir/host/bin:$PATH”
cd ~/imagebuilder/packages/packages/
~/imagebuilder/scripts/ipkg-make-index.sh ./ > ./Packages
gzip -9c ./Packages > ./Packages.gz

中间ipkg-make-index.sh运行出错也是参照1.2步骤修改的。
创建好的索引位于以下绝对路径:
/home/oldfox126/imagebuilder/packages/packages/Packages.gz
oldfox126是我登录Ubuntu的用户名

2.3 修改软件源
vi ~/imagebuilder/repositories.conf
在这行
# src custom file:///usr/src/openwrt/bin/x86/packages
后面增加一行:
src custom file:///home/oldfox126/imagebuilder/packages/packages
这里的oldfox126要修改成你登录Ubuntu的用户名
保存。

2.4 编译固件包
cd ~/imagebuilder/
make image PACKAGES=”smartdns luci-app-smartdns”

这里的smartdns、luci-app-smartdns,是我刚才上传的2个第三方二进制ipk,只要包名字不需要版本号和日期。如果不清楚包名字叫什么,
cat ~/imagebuilder/packages/packages/Packages
就看到了。

这样增加的ipk,才会自动安装进固件。
完美!