web-dev-qa-db-ja.com

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

aptitude upgradeまたはapt-get upgradeを開始する前に、何かを設定して、システムが実際のアップグレード前の「apt」状態に「簡単に」ロールバックできるようにする方法はありますか。違う?

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

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

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

57
Totor

Debianサーバー上の最後のapt-get upgradeにより、busyboxを超えて最新のカーネルを起動できなくなり、zfsルートパーティションのマウントに失敗したため、今、私はこれに対する答えを理解する必要がありました。少なくとも古いカーネルはまだ起動できましたが、他のソフトウェアと互換性がありませんでした。したがって、ロールバックの必要性。

短い答え-次のコマンドを使用できます:

$ apt-get -s install $(apt-history rollback | tr '\n' ' ')

必要な処理を行う場合は、-sを削除して再度実行してください。これを正しく動作させるために私が取った手順は次のとおりです。

  1. 今日のアップグレードを残すために/var/log/dpkg.logを一時的にトリミングしました

  2. 小さなスクリプトapt-historyhere から~/.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
}
52
ChrisW

ログファイル/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データベース。その場合は、続行する前に問題を修正する必要があります。

7
Faheem Mitha

いいえ、aptはそれを容易にしません。

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

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

4
bahamat