I'm on Ubuntu 10.04, and trying to set up a repository using reprepro
. I'd also like the pin everything in that repository to be preferred over anything else, even if packages are older versions. (It will only contain a select set of packages.)
However, I cannot seem to get the pinning to work, and believe it has something to do with the repository side of things, rather than the apt
configuration on the client.
I've taken the following steps to set up my repository
- Installed a web server (my personal choice here is Cherokee),
- Created the directory
/var/www/apt/
, Created the file
conf/distributions
, like so:Origin: Shteef Label: Shteef Suite: lucid Version: 10.04 Codename: lucid Architectures: i386 amd64 source Components: main Description: My personal repository
Ran
reprepro export
from the/var/www/apt/
directory.
Now on any other machine, I can add this (empty) repository over HTTP to my /etc/apt/sources.list
, and run apt-get update
without any errors:
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
In my case, now I want to use an old version of Asterisk, namely Asterisk 1.4. I rebuilt the asterisk-1:1.4.21.2~dfsg-3ubuntu2.1
package from Ubuntu 9.04 (with some small changes to fix dependencies) and uploaded it to my repository.
At this point I can see the new package in aptitude
, but it naturally prefers the newer Asterisk 1.6 currently in the Ubuntu 10.04 repositories. To try and fix that, I have created /etc/apt/preferences.d/personal
like so:
Package: *
Pin: release o=Shteef
Pin-Priority: 1000
But when I try to install the asterisk
package, it will still prefer the 1.6 version over my own 1.4 version. This is what apt-cache policy asterisk
shows:
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
Clearly, it is not picking up my pin. In fact, when I run just apt-cache policy
, I get the following:
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
[...]
Unlike Ubuntu's repository, apt
doesn't seem to pick up a release
-line at all for my own repository. I'm suspecting this is the cause why I can't pin on release o=Shteef
in my preferences file. But I can't find any noticable difference between my repository's Release
files and Ubuntu's that would cause this.
Is there a step I've missed or mistake I've made in setting up my repository?
UPDATED
Thanks to some help by maxb on #ubuntu-server, I was able to find out some more about what's going on.
It looks like apt
downloads package lists into /var/lib/apt/lists/
. There's a subdirectory there called partial
, which the manpage apt-cache(8)
describes as:
Storage area for state information in transit.
But my repository Release
file gets stuck in there, and is never copied to the parent lists
directory. I can get the pinning to work if I do this step manually:
$ 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
[...]
But the manual step is undesirable, of course.
I also noticed that the Sources
file is missing in my repository, but Sources.gz
is generated. Recreating the Sources
file by unzipping Sources.gz
creates a file that matches the size and hashes in the Release
file. But it doesn't appear to fix my problem.
I managed to solve this by having
reprepro
sign theRelease
files. For reference, this is done with theSignWith
option inconf/distributions
, and is documented in thereprepro(1)
manpage.