Debian은 패키지를 현재 다운로드 가능한 버전으로 일괄 다운그레이드합니다.

Debian은 패키지를 현재 다운로드 가능한 버전으로 일괄 다운그레이드합니다.

일부 데비안 저장소에서 "향상된" 패키지가 많이 있습니다. 이제 저장소를 비활성화했으므로 /etc/apt/sources.list.d사용 가능한 모든 패키지에 "향상된" 모든 패키지를 다시 설치하고 싶습니다. grep을 사용하면 패키지 목록을 잘 얻을 수 있지만

apt-get install --reinstall \
  $(dpkg-query -Wf '${Version}\t${Package}\n' | grep SOMEREPO | awk '{print $2}' )

해당 패키지를 다운로드할 수 없다고 보고합니다. 물론 현재 버전에서는 불가능합니다. --reinstall --downgrade거절당하다 apt. 다운그레이드하는 유일한 방법은 특정 버전의 이름을 지정하는 것입니다(작성하려면 훨씬 더 성가신 스크립트가 필요함).일괄가방).

내가 간과한 것이 있나요? 어쩌면 자격이 그것을 할 수 있습니까?

고쳐 쓰다: 통과할 수 있다는 걸 알아요결정된(정말 고마워요, 모드님!) 하지만 사실 그건 해결책이 아닙니다. 매우 힘들고,난 상관 없어다운그레이드의 구체적인 출처에 관해. 현재 활성화된 소스에서 사용 가능한 버전으로 다운그레이드하고 싶습니다.

업데이트 2: Debian 파생 제품(MX Linux)을 사용하고 있으므로 다운그레이드는 다음에서 가능합니다.

  • 데비안 스포일러
  • buster-backports
  • 배포판별https://mirrors.*/mx/MX-Packages/mx/repo/

답변1

핀 우선 순위는 /etc/apt/preferences또는 아래의 새 파일 에 추가하는 것입니다 /etc/apt/preferences.d.

Package: *
Pin: release a=*
Pin-Priority: 1001

apt upgrade다운그레이드를 의미하더라도 알고 있는 설치된 패키지의 최신 버전을 설치합니다. apt이후에는 현재 구성된 저장소의 패키지만 알려지므로 apt update원하는 효과를 얻을 수 있습니다.

답변2

이것이 내가 생각해낸 것입니다:

apt install $(apt-show-versions | grep newer | awk '{print $1}' | while read pkg; do ver="$(apt-cache madison "$pkg" | head -n1 | awk -F'|' '{gsub("\\s", "", $2); print $2}')"; printf "%s=%s\n" "$pkg" "$ver"; done)

작동 방식은 다음과 같습니다.

  1. apt-show-versions | grep newer | awk '{print $1}'다운그레이드해야 하는 패키지 목록을 결정 하는 데 사용됩니다 .

    host ~ # apt-show-versions|grep newer
    libapache2-mod-php:all 2:8.3+94+0~20240205.51+debian11~1.gbp6faa2e newer than version in archive
    libapache2-mod-php8.2:amd64 8.2.18-1+0~20240411.52+debian11~1.gbp91aa2d newer than version in archive
    [...]
    
  2. 각 패키지의 최신 버전을 확인하려면 apt-cache madison(파싱하기 쉬운 대안인 것 같음 )을 사용하십시오 .apt-cache policy

    host ~ # apt-cache madison libapache2-mod-php    
    libapache2-mod-php | 2:8.2+93~iservbpo11+1 | https://update.iserv.eu/debian bullseye-stable/main amd64 Packages
    libapache2-mod-php |   2:7.4+76 | http://deb.debian.org/debian bullseye/main amd64 Packages
    
  3. pkg=verAPT에 이 특정 버전의 패키지를 설치하도록 지시하는 각 패키지에 대한 문자열을 구성하고 libapache2-mod-php=2:8.2+93~iservbpo11+1이러한 모든 문자열을 apt install.

답변3

나중에 참고할 수 있도록네 말대로 해, 데비안부서... 강렬한 스크립팅 후:

ps=$(for p in $(dpkg-query -Wf '${Version}\t${Package}\n' | grep REPO | awk '{print $2}'); do
  apt --quiet list $p | grep -v /now | grep / | awk '{print $1}' | head -1
done)
# this still leaves some /oldstable,oldstable broken versions
apt install --reinstall $(echo "$ps" | cut -f1 -d,)

권장하는 것은 아닙니다. 시스템이 간단한 작업을 방해하면 짜증납니다.

관련 정보