如果出现问题,我可以回退apt-get升级吗?


53

在启动aptitude upgrade或之前,是否有办法apt-get upgrade设置某些内容,以便在出现问题时可以“轻松地”将系统回滚到实际升级之前的“ apt”状态?

也就是说,例如,重新安装在此过程中升级的软件包的旧版本。

(编辑)一些提示:我知道etckeeper例如使用了一些钩子,apt以便在apt安装或卸载软件包时得到通知。我想可能会有某种脚本可以保存新安装的软件包列表及其以前的版本号,以便能够从apt缓存(/var/cache/apt/archives)重新安装它们。还checkinstall可以跟踪文件修改...

有关如何正确实现此目标的任何详细信息?


我不知道apt具有类似的内置功能,您将不得不跟踪当前安装的软件包编号等。更简便的恕我直言,只是在必要时恢复昨天的备份。
Anthon 2013年

Answers:


46

我现在只好想出一个答案,因为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
}

很高兴找到这些资源!好答案!
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.log给出apt采用以下格式的每个动作的摘要列表:

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问题现在
乔鲍·托特

它可能不再在存储库中。
bahamat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.