Debian

如果出現問題,我可以回滾 apt-get 升級嗎?

  • June 14, 2020

有沒有辦法在開始aptitude upgradeor之前apt-get upgrade設置一些東西,以便您可以“輕鬆”將系統回滾到實際升級之前的“apt”狀態,如果出現問題?

也就是說,例如,重新安裝在此過程中升級的舊版本的軟體包。

(編輯)一些提示:我知道etckeeper例如使用一些鉤子,以便在安裝或解除安裝包apt時通知它。apt我想可能有某種腳本可以保存新安裝的軟體包列表及其以前的版本號,以便能夠從apt記憶體(/var/cache/apt/archives)中重新安裝它們。還有checkinstall哪個可以跟踪文件修改…

有關如何正確實現這一目標的任何細節?

我剛才不得不想出一個答案,因為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
...
  1. 這提供了一個格式良好的版本化包列表,通過將其輸入到apt-get install. 在文本編輯器中根據需要修剪此列表,然後執行(-s首先使用 for dry-run):
$ 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
}

引用自:https://unix.stackexchange.com/questions/79050