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

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

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

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

(編集する)いくつかのヒント:わかりましたetckeeperたとえば、パッケージがインストールまたは削除されたときに通知を受け取るには、aptいくつかのフックを使用します。キャッシュ()から再インストールaptできるように、新しくインストールされたパッケージのリストと以前のバージョン番号を保存するスクリプトの種類があると思いました。しかもapt/var/cache/apt/archivescheckinstallファイルの変更を追跡できます。

これを正しく達成する方法の詳細は何ですか?

答え1

今、この問題に対する答えを見つけなければなりません。これはapt-get upgrade、Debian サーバーの最後の問題のため、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) 

自動ロールバックを試すことはお勧めできませんが、ログを使用している場合は、失敗した操作のために一貫性のないdpkgデータベースなど、操作を妨げるものが破損しaptない限り、手動で実行することができます。aptこの場合、続行する前に問題を解決する必要があります。

答え3

いいえ、適切なことはそれほど簡単ではありません。

最良のオプションは一種のスナップショットです。 lvm/zfs/btrfs またはインスタンスのスナップショット (ある種の VM を使用している場合) によるファイルシステムのスナップショット。

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

関連情報