根据代表库的来源进行固定

我在Ubuntu 10.04,并尝试使用reprepro设置一个存储库。 我还想让别针中的所有东西比别的东西更受欢迎,即使软件包是老版本。 (它只包含一套select的软件包。)

然而,我似乎无法得到固定工作,并认为它与事物的存储库方面有关,而不是客户端上的aptconfiguration。

我已经采取了以下步骤来设置我的存储库

现在在任何其他机器上,我可以通过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。 我从Ubuntu 9.04重新构build了asterisk-1:1.4.21.2~dfsg-3ubuntu2.1软件包(对修复依赖关系做了一些小改动),并将其上传到我的仓库。

在这一点上,我可以看到aptitude的新软件包,但它自然更喜欢目前在Ubuntu 10.04软件库中的较新的Asterisk 1.6。 为了解决这个问题,我创build了/etc/apt/preferences.d/personal如下所示:

 Package: * Pin: release o=Shteef Pin-Priority: 1000 

但是当我尝试安装asterisk包时,它仍然会比我自己的1.4版本更喜欢1.6版本。 这就是apt-cache policy asterisk显示的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似乎没有为我自己的版本库select一个release版本。 我怀疑这是我为什么不能在我的首选项文件中release o=Shteef 。 但我找不到在我的存储库的Release文件和Ubuntu的会导致这个问题的任何不明显的区别。

有没有一个步骤,我错过了或错误,我已经在build立我的存储库?


更新

感谢#ubuntu-server上的maxb的帮助,我能够find更多关于发生了什么的。

它看起来像将软件包列表下载到/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.gz创buildSources文件将创build一个与Release文件中的大小和哈希匹配的文件。 但它似乎并没有解决我的问题。

我设法通过reprepro签署Release文件来解决这个问题。 作为参考,这是通过conf/distributionsSignWith选项完成的,并logging在reprepro(1)联机帮助页中。