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

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

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

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

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

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

答案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) 

不建议尝试自动回滚apt,但如果您使用日志,那么应该可以手动执行此操作,除非失败的操作破坏了干扰apt操作的某些内容,例如不一致的 dpkg 数据库。在这种情况下,您必须先解决问题才能继续。

答案3

不,apt 并不那么容易。

最好的选择是某种类型的快照。通过 lvm/zfs/btrfs 的文件系统快照或实例快照(如果您使用某种 VM)。

唯一的其他选择是在之前和之后对已安装的软件包 (dpkg -l) 进行清点。如果您想“回滚”,您必须明确安装以前的版本。

相关内容