문제가 발생하면 apt-get 업그레이드를 롤백할 수 있나요?

문제가 발생하면 apt-get 업그레이드를 롤백할 수 있나요?

aptitude upgradeapt-get upgrade문제가 발생할 경우 시스템을 실제 업그레이드 전의 "적절한" 상태로 "쉽게" 롤백할 수 있도록 부팅 시 또는 부팅 전에 무언가를 설정할 수 있는 방법이 있습니까 ?

예를 들어 이 프로세스 중에 업그레이드된 이전 버전의 패키지를 다시 설치하는 것입니다.

(편집하다)몇 가지 팁: 알아요etckeeper예를 들어, 패키지가 설치되거나 제거될 때 알림을 받으려면 apt일부 후크를 사용하십시오. 캐시( ) 에서 다시 설치할 apt수 있도록 새로 설치된 패키지 목록과 이전 버전 번호를 저장하는 일종의 스크립트가 있을 수 있다고 생각했습니다 . 게다가apt/var/cache/apt/archivescheckinstall파일 수정을 추적할 수 있습니다...

이를 올바르게 달성하는 방법에 대한 자세한 내용은 무엇입니까?

답변1

이제 이 문제에 대한 답을 찾아야 합니다. 왜냐하면 apt-get upgradeDebian 서버의 마지막 문제로 인해 busybox 외부에서 최신 커널을 부팅하고 zfs 루트 파티션을 마운트하는 것이 불가능하기 때문입니다. 적어도 이전 커널은 여전히 ​​부팅할 수 있지만 다른 소프트웨어와 호환되지 않습니다. 따라서 롤백이 필요합니다.

짧은 대답 - 다음 명령을 사용할 수 있습니다.

$ apt-get -s install $(apt-history rollback | tr '\n' ' ')

원하는 대로 작동한다면 삭제 -s하고 다시 실행해 보세요. 작동시키기 위해 취한 단계는 다음과 같습니다.

  1. 임시로 정리해서 /var/log/dpkg.log오늘의 업그레이드만 남겨두었습니다

  2. apt-history이 작은 스크립트를 설치했습니다.여기들어가서 ~/.bashrc달렸다

    $ apt-history rollback > rollback.txt
    ...
    libzfs2:amd64=0.6.4-4~wheezy 
    zfsutils:amd64=0.6.4-4~wheezy 
    zfs-initramfs:amd64=0.6.4-4~wheezy
    ...
    
  3. apt-get install그러면 텍스트 편집기에서 필요에 따라 에 입력하여 잘라낼 수 있는 올바른 형식의 버전이 지정된 패키지 목록이 제공됩니다 . 그런 다음 실행하세요( -s드라이런 먼저):

    $ apt-get -s install $(cat rollback.txt | tr '\n' ' ')
    $ apt-get install $(cat rollback.txt | tr '\n' ' ')
    

Apt는 예상되는 다운그레이드에 대해 경고를 발행합니다. 다음 업그레이드가 이 롤백을 덮어쓰는 것을 방지하려면 원래 문제가 해결될 때까지 패키지를 고정해야 합니다. 예를 들어:apt-mark hold zfsutils libzfs2 ...


function apt-history(){
    case "$1" in
      install)
            cat /var/log/dpkg.log | grep 'install '
            ;;
      upgrade|remove)
            cat /var/log/dpkg.log | grep $1
            ;;
      rollback)
            cat /var/log/dpkg.log | grep upgrade | \
                grep "$2" -A10000000 | \
                grep "$3" -B10000000 | \
                awk '{print $4"="$5}'
            ;;
      *)
            cat /var/log/dpkg.log
            ;;
    esac
}

답변2

로그 파일 /var/log/apt/history.log이며 /var/log/apt/term.log귀하의 설명과 가장 가까운 것입니다.

새로 설치된 패키지 목록과 이전 버전 번호를 저장하는 일종의 스크립트가 있을 것이라고 생각했습니다.

history.logapt각 작업의 요약 목록은 다음 형식으로 제공됩니다.

Start-Date: 2013-06-21  16:05:05
Commandline: apt-get install rdiff-backup
Install: python-pyxattr:i386 (0.5.0-3, automatic), rdiff-backup:i386 (1.2.8-6), python-pylibacl:i386 (0.5.0-3, automatic
), librsync1:i386 (0.9.7-7, automatic)
End-Date: 2013-06-21  16:05:42

특히 새로 설치된 패키지 또는 제거된 패키지 목록을 제공합니다. 또한 term.log작업 중 터미널에 실제로 존재했던 내용이 표시되므로 패키지의 이전 버전과 새 버전을 표시할 수 있습니다. 내 무작위 샘플 history.log:

Preparing to replace gnupg 1.4.10-4 (using .../gnupg_1.4.10-4+squeeze1_i386.deb) ...
Unpacking replacement gnupg ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 changed doc-base file(s)...
Registering documents with scrollkeeper...
Setting up gnupg (1.4.10-4+squeeze1) 

자동 롤백을 시도하는 것은 권장되지 않지만 로그를 사용하는 경우 실패한 작업으로 인해 일관되지 않은 dpkg 데이터베이스와 같이 작업을 방해하는 항목이 apt손상되지 않는 한 수동으로 수행하는 것이 가능합니다 . apt이 경우 계속하기 전에 문제를 해결해야 합니다.

답변3

아니요, 적절한 것은 그렇게 쉬운 일이 아닙니다.

가장 좋은 옵션은 일종의 스냅샷입니다. lvm/zfs/btrfs 또는 인스턴스 스냅샷(일종의 VM을 사용하는 경우)을 통한 파일 시스템 스냅샷.

유일한 다른 옵션은 설치된 패키지의 전후 목록을 작성하는 것입니다(dpkg -l). "롤백"하려면 이전 버전을 명시적으로 설치해야 합니다.

관련 정보