在使用 Openwrt 的 ImageGenerator 编译固件时,有时会需要使用自己的本地包,比如离线编译、安装非官方源的包等,这时可以通过搭建一个用来本地编译的软件源解决这个问题。

查找资料后发现,一个 Openwrt 的软件源包括如下文件:

* xxx.ipk
* Packages
* Packages.asc
* Packages.gz
* Packages.manifest
* Packages.sig

其中“Packages.asc”和“Packages.sig”是搭建远程源所需的验证文件,因此作为本地源是不需要这两个文件的,而另外三个文件实际上内容是一样的:

Package: XXXXXX
Version: 1.0.0
Depends: libc
License: GPL-3.0+
Section: net
Architecture: mipsel_24kc
Installed-Size: 20000
Filename: XXX_1.0.0_mipsel_24kc.ipk
Size: 10000
SHA256sum: 2a58d50ac1e7e730709fe3e363ab45e4fe422f3750412e7a097594f0d77117cd
Description: XXXXXXXXX.

...

所以在上一步的基础上,新建一个文件,如上填入每个软件包的信息,然后分别保存为:“Packages”、“Packages.menifest”,再把“Packages”的一个副本使用 gzip 压缩为 “Packages.gz”,即可成功搭建一个本地软件源。

虽然已经解决了本地源搭建的问题,但是问题又来了,要是只有一两个软件包,手动写入它们的信息倒也不是什么问题,但是如果是几十上百个软件包呢?这种时候就应该果断用脚本来解决问题。由于
ImageGenerator 已经自带了 ipkg-make-index.sh
文件,只需要稍作改造就可以拿来直接用了,这里我使用两份脚本来完成任务,一个提取软件包信息,一个批量写入文件:

#### make-index.sh

#!/bin/bash

pkg_dir=$1

if [ -z $pkg_dir ] || [ ! -d $pkg_dir ]; then
    echo "No package found!" >&2
    exit 0
fi

for pkg in `find $pkg_dir -name '*.ipk' | sort`; do
  name="${pkg##*/}"
  name="${name%%_*}"
  echo "Generating index for package $pkg" >&2
  file_size=$(ls -l $pkg | awk '{print $5}')
  sha256sum=$(sha256sum $pkg | awk '{print $1}')
  sed_safe_pkg=`echo $pkg | sed -e 's/^.///g' -e 's/\//\\\//g'`
  tar -xzOf $pkg ./control.tar.gz | tar xzOf - ./control | sed -e "s/^Description:/Filename: $sed_safe_pkg\
Size: $file_size\
SHA256sum: $sha256sum\
Description:/"
echo ""
done
exit 0

#### generate.sh

#!/bin/bash

SCRIPT="./make-index.sh"

# Generates package manifest
$SCRIPT . 2>/dev/null > Packages.manifest
grep -vE '^(Maintainer|LicenseFiles|Source|Require)' Packages.manifest > Packages
gzip -9nc Packages > Packages.gz

将这两个脚本放到本地源仓库中,然后运行“./generate.sh” 即可生成所需文件。

最后修改:2021 年 01 月 03 日
如果觉得我的文章对你有用,请随意赞赏