Эта проблема:
Мне нужен способ установить определенные закрепленные версии некоторых пакетов в моей системе Debian. snapshot.debian.org похоже, предлагает средства для этого, однако даже после добавления снимка в мои apt-sources я не могу apt-get install
некоторые конкретные версии пакетов в этом архиве снимков.
Вопрос:
Каков официальный или «правильный» способ установки конкретной версии пакета из архива моментальных снимков Debian?
История и то, что я пробовал:
Давайте использовать Debian8 Jessie и двоичный файл ядра 3.16.x, который на одну младшую версию ниже текущей, в качестве наших примеров. На момент написания этой статьи выпущенное Джесси ядро - 3.16.43-2 + deb8u5. Скажем, я хочу установить 3.16.43-2 + deb8u4.
Я начинаю с поиска в архивах моментальных снимков debian нужной мне версии (http://snapshot.debian.org/binary/linux-image-3.16.0-4-amd64/) и нажмите на точную версию ядра, которое я ищу, что приведет меня к http://snapshot.debian.org/package/linux/3.16.43-2%2Bdeb8u4/#linux-image-3.16.0-4-amd64_3.16.43-2:2b:deb8u4
Отсюда я вижу, что пакет был «замечен в debian-security в 2017-09-20 22:12:21» и «замечен в debian 08.10.2017 16:31:52». Я решил использовать первое и остановился на снимке состояния debian-security 20170920T221221Z.
Следуя инструкциям на первой странице snapshot.debian.org, Я добавляю в свой /etc/apt/sources.list следующее:
deb http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates main
deb src http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates main
Я тогда бегу apt-get -o Acquire::Check-Valid-Until=false update
и убедитесь, что обновление (кажется) успешно завершено.
Я бы подумал, что это позволит мне сейчас установить желаемую версию ядра, но apt знает только о двух вариантах установки: 3.16.43-2 + deb8u2 и 3.16.43-2 + deb8u5. Нет признаков + deb8u4:
# apt-cache madison linux-image-3.16.0-4-amd64
linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u5 | http://security.debian.org/ jessie/updates/main amd64 Packages
linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u5 | http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates/main amd64 Packages
linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u2 | http://cloudfront.debian.net/debian/ jessie/main amd64 Packages
linux-image-3.16.0-4-amd64 | 3.16.7-ckt25-2 | http://cloudfront.debian.net/debian/ jessie-updates/main amd64 Packages
linux | 3.16.39-1 | http://cloudfront.debian.net/debian/ jessie-backports/main Sources
# apt-cache policy linux-image-3.16.0-4-amd64
linux-image-3.16.0-4-amd64:
Installed: 3.16.43-2+deb8u5
Candidate: 3.16.43-2+deb8u5
Version table:
3.16.43-2+deb8u5 0
500 http://security.debian.org/ jessie/updates/main amd64 Packages
500 http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates/main amd64 Packages
*** 3.16.43-2+deb8u2 0
500 http://cloudfront.debian.net/debian/ jessie/main amd64 Packages
100 /var/lib/dpkg/status
3.16.7-ckt25-2 0
500 http://cloudfront.debian.net/debian/ jessie-updates/main amd64 Packages
Кроме того, если я попытаюсь указать и установить нужную мне версию, она вернет «Not Found»:
# apt-get install linux-image-3.16.0-4-amd64=3.16.43-2+deb8u4
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Version '3.16.43-2+deb8u4' for 'linux-image-3.16.0-4-amd64' was not found
Мне удалось обойти это, загрузив двоичный файл .deb и dpkg -i
устанавливая его, но я бы предпочел использовать apt вместо того, чтобы свернуть .debs и установить их. Может ли кто-нибудь объяснить, что мне нужно сделать, чтобы иметь возможность apt-get install
конкретный пакет или хотя бы объясните Зачем это не работает так, как я ожидал?
Это не точная наука, но вот вероятное объяснение того, почему это не сработало в данном конкретном случае (обычно это работает, когда вы не следите за изменением цели слишком быстро).
Данный репозиторий обычно ссылается только на одну версию пакета в файле Packages, например, вот этот. Это не техническое обязательство, например deb https://dl.winehq.org/wine-builds/debian/ jessie main
включает несколько версий одного и того же пакета в свой файл Packages, все из которых можно получить с помощью apt-get, используя =
как и вы, но Debian (TM) не хранит ссылки на несколько версий в одном файле Packages.
Если вы посмотрите на фактический каталог, в котором существует пакет, который вы ищете, вы увидите, что доступны обе версии:
Linux-образ-3.16.0-4-amd64_3.16.43-2 + deb8u4_amd64.deb
Linux-образ-3.16.0-4-amd64_3.16.43-2 + deb8u5_amd64.deb
Когда появился deb8u5, предыдущая ссылка на deb8u4 исчезла. Возможно, на deb8u4 .deb все еще ссылается другой репозиторий, или он просто не прошел некоторую «сборку мусора». Нажатие на «предыдущее изменение» в навигации по снимкам приводит только к deb8u3 без deb8u4 или deb8u5. Это означает, что смена между deb8u4 и deb8u5 произошла слишком быстро, чтобы файл пакетов deb8u4 был доступен для загрузки или для snapshot.debian.org сохранить этот промежуточный файл пакетов до того, как его заменит deb8u5. Эта ссылка (и соответствующие контрольные суммы, и подписанный файл выпуска) в debian-security потеряна.
Просто попробуйте еще раз с debian (вместо debian-security):
Linux-образ-3.16.0-4-amd64_3.16.43-2 + deb8u4_amd64.deb
с соответствующим Packages.xz файл. В этом есть запись только для deb8u2 ... и останется только эта. Предполагается, что новые версии будут поступать из debian-security до выпуска 8.10, поэтому даже если они появляются в пуле, это только потому, что snapshot.debian.org заставляет все появляться в одном месте.
Извините, для этой конкретной версии пакета я не вижу способа загрузить файл deb8u4. Даже если его можно скачать по ссылкам и dpkg -i
может установить его, проверить то, что было загружено, невозможно, поэтому его следует избегать.
ПРИМЕЧАНИЕ: ваш метод правильный. Обычно вы можете завершить это, закрепив свой конкретный снимок для некоторых конкретных пакетов, позволяя apt-get выбирать их автоматически (без необходимости =
) и избегая их обновления позже. Это объясняется там: https://wiki.debian.org/AptPreferences . Их удерживание тоже работает (dpkg --set-selections
или apt-mark hold
), чтобы избежать обновления.