我在 Ubuntu 10.04 上,并尝试使用 设置存储库reprepro
。 我还希望将该存储库中的所有内容固定为优先于其他任何内容,即使软件包是旧版本。 (它将仅包含一组选定的软件包。)
但是,我似乎无法使固定功能正常工作,并且相信它与存储库方面有关,而不是apt
客户端上的配置。
我已按照以下步骤设置我的存储库
- 安装网络服务器(我个人选择的是 Cherokee),
- 创建目录
/var/www/apt/
, 创建文件
conf/distributions
,如下所示:Origin: Shteef Label: Shteef Suite: lucid Version: 10.04 Codename: lucid Architectures: i386 amd64 source Components: main Description: My personal repository
reprepro export
从目录中跑出来/var/www/apt/
。
现在在任何其他机器上,我都可以通过 HTTP 将这个(空)存储库添加到我的/etc/apt/sources.list
,并且运行apt-get update
时不会出现任何错误:
Ign http://archive.lan lucid Release.gpg
Ign http://archive.lan/apt/ lucid/main Translation-en_US
Get:1 http://archive.lan lucid Release [2,244B]
Ign http://archive.lan lucid/main Packages
Ign http://archive.lan lucid/main Sources
Ign http://archive.lan lucid/main Packages
Ign http://archive.lan lucid/main Sources
Hit http://archive.lan lucid/main Packages
Hit http://archive.lan lucid/main Sources
就我而言,现在我想使用旧版本的 Asterisk,即 Asterisk 1.4。我asterisk-1:1.4.21.2~dfsg-3ubuntu2.1
从 Ubuntu 9.04 重建了该软件包(进行了一些小改动以修复依赖关系),并将其上传到我的存储库。
此时我可以在 中看到新包aptitude
,但它自然更喜欢目前在 Ubuntu 10.04 存储库中较新的 Asterisk 1.6。为了尝试修复该问题,我创建了/etc/apt/preferences.d/personal
如下内容:
Package: *
Pin: release o=Shteef
Pin-Priority: 1000
但是当我尝试安装该asterisk
软件包时,它仍然会优先选择 1.6 版本,而不是我自己的 1.4 版本。如下所示apt-cache policy asterisk
:
asterisk:
Installed: (none)
Candidate: 1:1.6.2.5-0ubuntu1
Version table:
1:1.6.2.5-0ubuntu1 0
500 http://nl.archive.ubuntu.com/ubuntu/ lucid/universe Packages
1:1.4.21.2~dfsg-3ubuntu2.1shteef1 0
500 http://archive.lan/apt/ lucid/main Packages
显然,它没有检测到我的密码。事实上,当我运行 时apt-cache policy
,我得到了以下结果:
Package files:
100 /var/lib/dpkg/status
release a=now
500 http://archive.lan/apt/ lucid/main Packages
origin archive.lan
500 http://security.ubuntu.com/ubuntu/ lucid-security/multiverse Packages
release v=10.04,o=Ubuntu,a=lucid-security,n=lucid,l=Ubuntu,c=multiverse
origin security.ubuntu.com
[...]
与 Ubuntu 的存储库不同,apt
似乎release
根本没有为我自己的存储库选择一行。我怀疑这就是我无法在首选项文件中固定的原因release o=Shteef
。但我找不到我的存储库Release
文件和 Ubuntu 之间的任何明显差异,从而导致这种情况。
我在设置存储库时是否错过了某个步骤或者犯了什么错误?
更新
感谢最大在 #ubuntu-server 上,我能够了解更多正在发生的事情。
看起来好像apt
将软件包列表下载到 中/var/lib/apt/lists/
。那里有一个名为 的子目录partial
,手册页将其apt-cache(8)
描述为:
Storage area for state information in transit.
但是我的存储库Release
文件卡在那里,并且从未复制到父lists
目录。如果我手动执行此步骤,我可以使固定功能正常工作:
$ mv /var/lib/apt/lists/partial/archive.lan* /var/lib/apt/lists/
$ rm -f /var/cache/apt/*.bin
$ apt-cache policy
Package files:
100 /var/lib/dpkg/status
release a=now
1000 http://puppet.motto/apt/ lucid/main Packages
release v=10.04,o=Motto,a=lucid,n=lucid,l=Motto,c=main
origin puppet.motto
500 http://security.ubuntu.com/ubuntu/ lucid-security/multiverse Packages
release v=10.04,o=Ubuntu,a=lucid-security,n=lucid,l=Ubuntu,c=multiverse
origin security.ubuntu.com
[...]
但当然,手动步骤是不可取的。
我还注意到Sources
我的存储库中缺少该文件,但是Sources.gz
是生成。Sources
通过解压重新创建文件Sources.gz
会创建一个与文件大小和哈希值匹配的文件Release
。但这似乎无法解决我的问题。
答案1
reprepro
我设法通过对文件进行签名解决了这个问题。作为参考,这是使用 中的选项Release
完成的,并在手册页中有记录。SignWith
conf/distributions
reprepro(1)