何か問題が発生した場合、apt-getアップグレードをロールバックできますか?


53

aptitude upgradeまたはを開始するapt-get upgrade前に、何か問題が発生した場合に実際のアップグレード前の「適切な」状態に「簡単に」システムをロールバックできるように、何かをセットアップする方法はありますか?

つまり、たとえば、プロセス中にアップグレードされた古いバージョンのパッケージを再インストールします。

(編集)いくつかのヒントetckeeperたとえば、フックをapt使用してapt、パッケージをインストールまたはアンインストールするたびに通知されるようにします。新しくインストールされたパッケージとその以前のバージョン番号のリストを保存して、aptキャッシュからそれらを再インストールできるようなスクリプトが存在すると考えられます(/var/cache/apt/archives)。checkinstallファイルの変更を追跡できるものもあります...

それを適切に達成する方法に関する詳細はありますか?


aptにそのようなものがあることを知りません。現在インストールされているパッケージ番号などを追跡する必要があります。必要に応じて昨日のバックアップを復元するだけで簡単です。
アントン

回答:


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
トーター

次の拡張子を使用すると、指定された日付のアップグレードのみに一致します(したがって、前にログを変更する必要はありません)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はそれを簡単にしません。

最適なオプションは、何らかのスナップショットです。何らかのVMを使用している場合は、lvm / zfs / btrfsを介したファイルシステムスナップショットまたはインスタンススナップショットのいずれか。

他の唯一のオプションは、インストール済みパッケージのインベントリを取得する(dpkg -l)前後に取得することです。「ロールバック」したい場合は、以前のバージョンを明示的にインストールする必要があります。


正確なバージョンは知っていますが、aptは拒否apt install openssl=1.0.2g-1ubuntu4.12E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not foundます。結果はになります。私はちょうどにアップグレード1.0.2g-1ubuntu4.13しているのは、いくつかのCORS / CSPの問題を引き起こしている場合、私は今、思ったんだけど
チャバ・トス

リポジトリに存在しない可能性があります。
バハマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.