构建离线版不完整 APT 源

构建一个离线版本的,只包含特定软件安装包的 APT 离线 仓库。

  1. 首先启动一个对应 Ubuntu 系统的 docker 容器

  2. 在 Docker 容器中执行 apt update 更新软件源索引

  3. 在 Docker 容器中执行 apt install apt-rdepends

  4. 重复下面命令,将要下载的软件下载下来:

apt download `apt-rdepends some-packages | grep -v "^ " `

其中 some-packages 的地方应该写入所要下载安装的软件包,比如 gcc。但是如果,下载的过程中,提示,有安装包无法被下载(就是系统内置的包,不在软件源中),就需要通过 grep -v "package-a\|package-b" 进行过滤,其中 \| 就是多个包的分割线(实际对应的是 grep 中或者的关系,-v 表示排除:

apt download `apt-rdepends some-packages | grep -v "^ " | grep -v "package-a\|package-b"`

这里需要注意,排出的表达式,比如只排除 libc-dev 但是不排除 libc-dev-bin 的话,表达式中应该写 libc-dev$。这样的写法同时会排除 linux-libc-dev 这个包,如果不打算排除这个包的话,就需要 ^libc-dev$

  1. 然后通过如下命令生成 apt 的 repo, 如果 repo 的位置在 /path/to/repo
cd /path/to
dpkg-scanpackages --multiversion repo | gzip > repo/Packages.gz
chmod 777 -R repo

这里如果不 cd 而是直接写 dpkg-scanpackages --multiversion /path/to/repo 的话,产生的 Packages 文件中包的路径就会出现 /path/to/repo/xxx.deb,这个东西配置后面的内容,会导致 apt 找不到具体的 deb 包。

  1. 最后在目标设备的 /etc/apt/sources.list 或者 /etc/apt/sources.list.d/xxx.list 文件中添加一行:
deb [trusted=yes] file:///path/to /repo/