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


53

방법은 시작하기 전에, 거기에 aptitude upgrade또는 apt-get upgrade뭔가 잘못되면 당신이 "쉽게"는 실제 업그레이드 전에했다 "쉽다"상태로 시스템을 롤백 할 수 있도록 뭔가를 설정하려면?

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

(편집) 몇 가지 힌트 : etckeeper예를 들어 패키지를 설치하거나 제거 apt할 때마다 알림을 받도록 후크를 사용 한다는 것을 알고 apt있습니다. apt캐시 에서 다시 설치할 수 있도록 새로 설치된 패키지 목록과 이전 버전 번호를 저장할 수있는 일종의 스크립트가 있다고 가정합니다 /var/cache/apt/archives. checkinstall파일 수정을 추적 할 수있는 것도 있습니다 ...

제대로 달성하는 방법에 대한 자세한 내용은 무엇입니까?


나는 apt가 그와 같은 빌드를 가지고 있다는 것을 알지 못한다. 현재 설치된 패키지 번호 등을 추적해야 할 것이다. 필요할 경우 어제 백업을 복원하는 것이 더 쉬운 IMHO.
Anthon

답변:


46

apt-get upgrade데비안 서버 에서 마지막 은 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
}

그 자료를 찾는 것이 좋습니다! 좋은 답변입니다!
L0j1k

1
apt-history rollback명령은 같은 교체 할 수 있습니다 awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor

다음 확장명을 사용하면 지정된 날짜의 업그레이드 만 일치하므로 이전에 로그를 수정할 필요가 없습니다.awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator

1
dpkg.log를 다듬은 후 여러 버전의 메시지를 찾을 수 없습니다 E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Raspian에 Debian Stretch를 사용하고 있습니다.
dps

7

로그 파일 /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) 

apt자동 롤백 시도 는 권장되지 않지만, 로그를 사용하는 경우 실패한 조치로 인해 조치를 방해하는 항목 ( apt예 : 일치하지 않는 dpkg 데이터베이스) 이 손상된 경우를 제외하고 수동으로 수행 할 수 있습니다 . 이 경우 계속하기 전에 문제를 해결해야합니다.


4

아니요, apt는 그렇게 쉽게하지 않습니다.

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

다른 옵션은 설치 패키지 (dpkg -l)의 인벤토리를 전후로 가져 오는 것입니다. "롤백"하려면 이전 버전을 명시 적으로 설치해야합니다.


정확한 버전을 알고 있지만 apt는 apt install openssl=1.0.2g-1ubuntu4.12결과를 거부합니다 E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. 방금 업그레이드를 1.0.2g-1ubuntu4.13했는데 이것이 CORS / CSP 문제를 일으키는 지 궁금합니다.
Csaba Toth

더 이상 저장소에 없을 수 있습니다.
bahamat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.