最理想是用两台机器继续验证,一台可以联网,一台无法联网,不过我只有一台机器,所以使用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-scanpackages
是dpkg-dev
的一部分, dpkg-scanpackages
通常用于创建本地的APT软件源。当你有一组.deb
文件并希望它们能够被本地机器或其他机器通过APT安装时,你会使用dpkg-scanpackages
来生成Packages
和Packages.gz
文件,如下命令:
dpkg-scanpackages ./ | gzip -9c > Packages.gz
这个命令用于创建一个压缩的 Packages.gz
文件,该文件是 Debian 和 Ubuntu 软件包管理系统(APT)所需的一个重要组件。这个文件包含了关于软件包仓库中所有软件包的信息,如软件包名称、版本号、依赖关系等。APT 工具使用这个文件来了解软件仓库中有哪些软件包可用,并据此来安装、升级或删除软件包。
这条命令的各个部分解释如下:
dpkg-scanpackages ./
:dpkg-scanpackages
是一个用于生成Packages
文件的工具。它扫描指定的目录(在这个例子中是当前目录./
)下的所有.deb
文件,并生成一个包含这些软件包信息的文本文件。|
:这是一个管道符号,用于将一个命令的输出作为另一个命令的输入。在这个例子中,dpkg-scanpackages
的输出被传递给gzip
命令。gzip -9c
:gzip
是一个用于文件压缩的工具。-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:软件仓库的套件名称,例如
stable
、testing
、unstable
等。 - Codename:软件仓库的代号名称,通常是一个描述性的字符串,用于标识仓库的版本。
- Version:
Release
文件的版本号,用于跟踪文件的更新。 - Support:提供支持的联系方式或 URL。
- Architectures:软件仓库支持的体系结构列表。
- Components:软件仓库中的组件列表,例如
main
、contrib
、non-free
等。 - Description:软件仓库的描述信息。
- MD5Sum:软件仓库中所有文件的 MD5 校验和。
- SHA1 或 SHA256:软件仓库中所有文件的 SHA-1 或 SHA-256 校验和。
这些信息对于 APT 工具来说是必要的,以确保软件仓库的完整性和可信度。当使用 apt-get update
或其他 APT 命令更新软件源时,APT 会检查 Release
文件中的信息,并根据这些信息来下载和安装软件包。
在制作离线源时,dpkg-scanpackages
, apt-ftparchive packages
, 和 apt-ftparchive release
这三个命令各自扮演着不同的角色,以生成APT软件仓库所需的不同元数据文件。
- dpkg-scanpackages ./ | gzip -9c > Packages.gz:
dpkg-scanpackages
命令扫描指定目录下的所有.deb
文件,生成一个包含这些软件包详细信息的文本文件,即Packages
文件。这些信息包括软件包的名称、版本号、大小、依赖关系等。然后,通过管道|
将Packages
文件的输出传递给gzip
命令进行压缩,生成Packages.gz
文件。压缩后的文件减少了存储空间和网络传输的开销。Packages.gz
文件是APT软件仓库中必不可少的组件,因为它为APT工具提供了软件包的基本信息,使得APT能够知道哪些软件包是可用的,以及它们的依赖关系等。 - apt-ftparchive packages ./ > Packages:
apt-ftparchive packages
命令也用于生成包含软件包信息的文件,但与dpkg-scanpackages
不同的是,它生成的Packages
文件是二进制的,而不是文本格式。二进制格式的Packages
文件通常更加紧凑和高效,因为它使用了专门的编码和压缩算法。这个命令也是扫描指定目录下的.deb
文件,并将软件包信息导出到Packages
文件中。虽然dpkg-scanpackages
更常用,但apt-ftparchive packages
在某些情况下可能也是必要的,特别是在处理复杂的软件仓库结构或需要更高效的索引格式时。 - 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