我目前正在使用 Ubuntu 并尝试在虚拟机上安装 Debian 系统,这意味着我必须处理软件包。由于我是新手,我在网上阅读了很多有关它的内容,尤其是 debian wiki(ubuntu wiki 也很有用)。特别是,我学习了如何创建本地存储库以及如何正确编辑sources.list 文件。
但是,我仍然对它的工作原理有一些疑问,我在网上找不到详细信息。
首先,当您使用在线存储库时。我知道 apt-get 将遵循您在 source.list 文件中编写的链接并搜索 Packages.gz 存档。我不明白的是这个简单的档案(似乎只是一个列表)可安装包) 允许安装该软件包吗? Packages.gz 是否提供了有关如何查找 .deb 文件然后继续安装的适当信息?或者是别的什么?
其次,关于 Sources.gz 存档。我读过它是 Packages.gz 中列出的包的源代码,但在大多数情况下不需要它。那么,如果我在我的 source.list 文件中添加此 Sources.gz 的链接,它到底给了我什么?这有什么意义呢?
三、关于本地仓库;这与前面的问题有关。我知道如何使用 .deb 文件创建本地存储库,但假设我只有这个 Packages.gz 存档:这还不够,对吧?如果我有 Sources.gz 存档,它会起作用吗?
最后,我在 Debian 存储库中看到,除了 dist 存储库之外,还有一个包含大量 .deb 的池存储库。我知道安装它们的方法(下载 .deb 及其依赖项,使用 dpkg -i 安装它们),但是有更简单的方法吗?更自动化的东西,可以在线找到 .deb,找到它的依赖项,并安装所有内容? (就像 apt-get 所做的那样,但据我了解,apt-get 只能与 Packages.gz 和 Sources.gz 档案一起使用,不能直接与 .deb 一起使用)
抱歉,这不是一个真正的问题,而是一个问题列表 ^^ 但我在网上找到的所有内容主要是“在在线存储库中 apt-get 搜索该包及其依赖项并通过 dpkg 安装它”,我会喜欢有关它的更多详细信息。
答案1
Packages.gz 包含一个
Filename
字段,其值可能类似于pool/main/n/name-of-package/name-of-package_version_amd64.deb
。这告诉包管理器查看该 URL。
例如,如果您的sources.list(.d)中有以下行:
deb https://some-domain.com/some-url some-distribution main
您将拥有以下文件:https://some-domain.com/some-url/dists/some-distribution/main/binary-amd64/Packages.gz
该文件将被引用pool/main/n/name-of-package/name-of-package_version_amd64.deb
,因此您的包管理器将查看https://some-domain.com/some-url/pool/main/n/name-of-package/name-of-package_version_amd64.deb
。Sources.gz 的工作方式相同,但是可选的。它与 一起使用
apt source
,如果您希望自己编译它而不是使用预构建的二进制文件,它将为您获取源代码。
这对于想要修补发行版所使用的软件包的确切版本的系统管理员来说主要有用,而不是那些只是访问项目主页并按照那里的构建说明进行操作的贡献者/好奇的人。如果某个包位于发行版的池目录中但不在 中
Packages.gz
,则它很可能位于另一个Package.gz
.请注意典型行中如何包含多个单词sources.list
:
deb http://archive.ubuntu.com/ubuntu precise main universe multiverse
main
,universe
并且multiverse
每个单词都有自己的Packages.gz
文件。您可能需要启用一些,例如 debiannon-free
默认情况下禁用。但是,某些软件包仍然不可用(甚至在池中也不可用)。您可以选择添加不受信任的存储库(例如 Ubuntu 上的 PPA),自己打包缺少的程序(以便您和其他人可以使用他们的包管理器来管理该程序)或直接自己构建和安装它(您应该使用/usr/local
前缀避免与您的包管理器发生冲突)。- 当出现新的(版本)包时,
Release
分发的文件会更新。这可以让apt update
我们知道它必须重新下载Packages.gz
。