Назад | Перейти на главную страницу

Закрепление на основе происхождения репозитория репозитория

Я использую Ubuntu 10.04 и пытаюсь настроить репозиторий с помощью reprepro. Я также хотел бы, чтобы закрепление всего в этом репозитории было предпочтительнее всего остального, даже если пакеты более старых версий. (Он будет содержать только избранный набор пакетов.)

Однако я не могу заставить закрепление работать и считаю, что это как-то связано с репозиторием, а не с 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) справочная страница.