根据 reprepro 存储库的来源进行固定

根据 reprepro 存储库的来源进行固定

我在 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完成的,并在手册页中有记录。SignWithconf/distributionsreprepro(1)

相关内容