Я использую Ubuntu 10.04 и пытаюсь настроить репозиторий с помощью reprepro
. Я также хотел бы, чтобы закрепление всего в этом репозитории было предпочтительнее всего остального, даже если пакеты более старых версий. (Он будет содержать только избранный набор пакетов.)
Однако я не могу заставить закрепление работать и считаю, что это как-то связано с репозиторием, а не с apt
конфигурация на клиенте.
Я сделал следующие шаги, чтобы настроить свой репозиторий
/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
, но он, естественно, предпочитает более новую версию Asterisk 1.6, которая сейчас находится в репозиториях Ubuntu 10.04. Чтобы попытаться исправить это, я создал /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, которые могут вызвать это.
Есть ли какой-то шаг, который я пропустил или сделал ошибку при настройке репозитория?
ОБНОВЛЕНО
Благодаря некоторой помощи maxb на # 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
файл. Но, похоже, это не решило мою проблему.
Мне удалось решить эту проблему, имея reprepro
подписать Release
файлы. Для справки это делается с помощью SignWith
вариант в conf/distributions
, и задокументирован в reprepro(1)
справочная страница.