最理想是用两台机器继续验证,一台可以联网,一台无法联网,不过我只有一台机器,所以使用docker来验证。

联网的机器下载deb包和制作离线包: 

1,配置软件源

#deb [trusted=yes] file:///mnt/ubuntu-deb-packages/  /
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse

2,配置下载脚本

download-deps.sh
#!/bin/bash

mkdir $PWD/deps
cd $PWD/deps

packages="qemu-kvm libvirt-bin bridge-utils virtinst virt-manager"

for p in ${packages}
do
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends $p | grep -v i386 | grep "^\w")
done

packages目录可以自由定义你想下载的软件,下载,最好用root用户

mkdir -p ~/test-1
cd ~/test-1
./download-deps.sh

3,建立依赖

cd ~/test-1/
sudo dpkg-scanpackages -m . /dev/null | gzip -9c > Packages.gz
cp Packages.gz ./deps

相关命令说明: 

在Ubuntu上安装dpkg-scanpackages,你实际上需要安装dpkg-dev软件包,因为dpkg-scanpackagesdpkg-dev的一部分, dpkg-scanpackages通常用于创建本地的APT软件源。当你有一组.deb文件并希望它们能够被本地机器或其他机器通过APT安装时,你会使用dpkg-scanpackages来生成PackagesPackages.gz文件,如下命令:

dpkg-scanpackages ./ | gzip -9c > Packages.gz 

这个命令用于创建一个压缩的 Packages.gz 文件,该文件是 Debian 和 Ubuntu 软件包管理系统(APT)所需的一个重要组件。这个文件包含了关于软件包仓库中所有软件包的信息,如软件包名称、版本号、依赖关系等。APT 工具使用这个文件来了解软件仓库中有哪些软件包可用,并据此来安装、升级或删除软件包。

这条命令的各个部分解释如下:

  • dpkg-scanpackages ./dpkg-scanpackages 是一个用于生成 Packages 文件的工具。它扫描指定的目录(在这个例子中是当前目录 ./)下的所有 .deb 文件,并生成一个包含这些软件包信息的文本文件。
  • |:这是一个管道符号,用于将一个命令的输出作为另一个命令的输入。在这个例子中,dpkg-scanpackages 的输出被传递给 gzip 命令。
  • gzip -9cgzip 是一个用于文件压缩的工具。-9 参数指定了最大的压缩级别(1-9,9 是最高级别),-c 参数表示将压缩后的数据输出到标准输出(stdout),而不是覆盖原始文件。
  • > Packages.gz:这部分将前面命令的输出(即经过 gzip 压缩后的数据)重定向到一个名为 Packages.gz 的文件中。如果文件已经存在,它会被覆盖;如果不存在,会创建一个新文件。

综合起来,dpkg-scanpackages ./ | gzip -9c > Packages.gz 这个命令会生成一个压缩的 Packages.gz 文件,该文件包含了当前目录下所有 .deb 软件包的信息,并且已经被压缩以减少存储空间和网络传输的开销。这个 Packages.gz 文件通常会被放置在软件仓库的 dists 子目录下,并由 APT 工具在更新软件源时自动下载和解压,以便获取软件包信息。

apt-ftparchive packages . > Packages的作用

apt-ftparchive packages . > Packages 是一个用于创建 Debian 软件仓库的命令。这条命令的作用是将当前目录下的所有 .deb 文件的相关信息导出到 Packages 文件中,这个文件是一个包含所有软件包信息的二进制文件,它可以被 APT 工具用来索引和更新软件包。

这条命令的具体含义如下:

  • apt-ftparchive 是一个用于生成 APT 软件仓库的工具。
  • packages 是 apt-ftparchive 的一个子命令,用于列出目录中的所有软件包。
  • . 表示当前目录。
  • > 是重定向操作符,用于将命令的输出写入到后面指定的文件中。
  • Packages 是输出文件的名字,它包含了所有的软件包的信息。

如果你想要执行这条命令,首先你需要确保当前目录下有 .deb 文件。然后,你可以在终端中运行这条命令来生成 Packages 文件。之后,你可以使用 dpkg-scanpackages 命令来生成 Packages 和 Sources 文件,这些文件是用于更新软件源的。

apt-ftparchive release ./ > Release的作用

apt-ftparchive release ./ > Release 命令用于生成一个 Release 文件,该文件是 APT 软件仓库中非常重要的一个组成部分。Release 文件包含了关于软件仓库的元数据信息,如仓库的版本号、软件包的校验和、发布日期等。APT 工具使用这个文件来验证仓库的完整性和可信度,并确定是否需要更新本地软件包列表。

这条命令的各部分含义如下:

  • apt-ftparchive:如前所述,这是一个用于生成 APT 软件仓库的工具。
  • release:这是 apt-ftparchive 的一个子命令,用于生成 Release 文件。
  • ./:这表示当前目录,即软件仓库的根目录。APT 仓库通常包含一个或多个二进制软件包(.deb 文件)以及相关的元数据文件。
  • >:这是重定向操作符,用于将命令的输出写入到后面指定的文件中。
  • Release:这是输出文件的名字,即生成的 Release 文件。

Release 文件通常包含以下信息:

  • Origin:软件仓库的来源,通常是一个软件项目或组织的名称。
  • Label:软件仓库的标签,通常与 Origin 相同,但可以是任何描述性字符串。
  • Suite:软件仓库的套件名称,例如 stabletestingunstable 等。
  • Codename:软件仓库的代号名称,通常是一个描述性的字符串,用于标识仓库的版本。
  • VersionRelease 文件的版本号,用于跟踪文件的更新。
  • Support:提供支持的联系方式或 URL。
  • Architectures:软件仓库支持的体系结构列表。
  • Components:软件仓库中的组件列表,例如 maincontribnon-free 等。
  • Description:软件仓库的描述信息。
  • MD5Sum:软件仓库中所有文件的 MD5 校验和。
  • SHA1 或 SHA256:软件仓库中所有文件的 SHA-1 或 SHA-256 校验和。

这些信息对于 APT 工具来说是必要的,以确保软件仓库的完整性和可信度。当使用 apt-get update 或其他 APT 命令更新软件源时,APT 会检查 Release 文件中的信息,并根据这些信息来下载和安装软件包。

在制作离线源时,dpkg-scanpackagesapt-ftparchive packages, 和 apt-ftparchive release 这三个命令各自扮演着不同的角色,以生成APT软件仓库所需的不同元数据文件。

  1. dpkg-scanpackages ./ | gzip -9c > Packages.gz:
    dpkg-scanpackages 命令扫描指定目录下的所有 .deb 文件,生成一个包含这些软件包详细信息的文本文件,即 Packages 文件。这些信息包括软件包的名称、版本号、大小、依赖关系等。然后,通过管道 | 将 Packages 文件的输出传递给 gzip 命令进行压缩,生成 Packages.gz 文件。压缩后的文件减少了存储空间和网络传输的开销。Packages.gz 文件是APT软件仓库中必不可少的组件,因为它为APT工具提供了软件包的基本信息,使得APT能够知道哪些软件包是可用的,以及它们的依赖关系等。
  2. apt-ftparchive packages ./ > Packages:
    apt-ftparchive packages 命令也用于生成包含软件包信息的文件,但与 dpkg-scanpackages 不同的是,它生成的 Packages 文件是二进制的,而不是文本格式。二进制格式的 Packages 文件通常更加紧凑和高效,因为它使用了专门的编码和压缩算法。这个命令也是扫描指定目录下的 .deb 文件,并将软件包信息导出到 Packages 文件中。虽然 dpkg-scanpackages 更常用,但 apt-ftparchive packages 在某些情况下可能也是必要的,特别是在处理复杂的软件仓库结构或需要更高效的索引格式时。
  3. apt-ftparchive release ./ > Release:
    apt-ftparchive release 命令用于生成 Release 文件。Release 文件包含了关于整个软件仓库的元数据信息,如仓库的标识、组件列表、签名信息等。这个文件是APT软件仓库中非常重要的组成部分,因为它提供了软件仓库的整体描述和验证信息,使得APT工具能够验证仓库的完整性和可信度。Release 文件通常包含软件仓库的版本号、支持的体系结构、组件名称、MD5或SHA校验和等信息。APT工具在更新软件源时,会首先检查 Release 文件以获取仓库的基本信息和验证签名。

综上所述,这三个命令共同生成了APT软件仓库所需的元数据文件,这些文件提供了软件包的信息和软件仓库的描述,使得APT工具能够正确地索引、更新和安装软件包。在制作离线源时,这些文件需要被复制到离线环境中的适当位置,以便APT工具能够访问和使用它们。

另外一种apt-get保存deb的方式(只适合第一次安装系统,后期ubuntu会定期删除deb包): 

默认情况下使用apt install安装包时,会自动下载安装包及其依赖包到/var/cache/apt/archieves目录,可通过如下配置改变这一行为:

#禁止保存
echo 'Binary::apt::APT::Keep-Downloaded-Packages "0";' | sudo tee /etc/apt/apt.conf.d/10apt-keep-downloads

#允许保存
echo 'Binary::apt::APT::Keep-Downloaded-Packages "1";' | sudo tee /etc/apt/apt.conf.d/10apt-keep-downloads