web-dev-qa-db-ja.com

apt-installedパッケージのスナップショットとロールバック

Debian/Ubuntuシステムにapt/apt-getを使用してインストールされたパッケージのスナップショットを取得し、後でそのスナップショットにロールバックする方法はありますか?

私のユースケースは次のとおりです。ビルドの依存関係が多数あるプログラムをビルドするスクリプトを記述したいと思います。スクリプトの開始時にこれらの依存関係を適切にインストールしたいと思います。これらの依存関係の一部はすでにインストールされている可能性があり、その場合、一部のインストールは操作できなくなります。プログラムをビルドした後、システムをビルド前の状態に戻したい、つまり、スクリプトがインストールしたものをアンインストールしたいが、それ以外はそのままにしておきたい。

つまり、スナップショットにaptをロールバックしたいのです。

私は次のようなものを想像しています:

_magic-command-that-writes-apt-snapshot my-packages.txt
apt install gcc texlive fortran75 cobol60 qbasic fftw 
./configure && && make && make install
magic-command-that-rollsback-to-apt-snapshot my-packages.txt
_

多分これは_/var/log/apt/history.log_を解析することで可能ですが、それは非常に壊れやすいようです。

物事をより簡単またはより複雑にする可能性があるいくつかの詳細:

  • マシンの初期状態に対して堅牢な一般的なソリューションが欲しいのですが、スクリプトに_apt install_コマンドが1つだけ含まれることを保証できます(複数ではなく、_dist-upgrade_ではなく_build-deps_)。
  • この場合、aptコマンドがupgradesするパッケージについては心配していません。それは私の目的にとっては害のない副作用です。ロールバックはそれらをアンインストールすべきではありませんが、ダウングレードしない場合は問題ありません。
  • スクリプトは非インタラクティブのままにする必要があります(たまたまdockerビルドで実行されます)。
  • 「副次的被害」は避けたい。特に、packageBはスクリプトによってインストールされたため、packageBはpackageAに依存し、packageAはpackageB以外の依存関係を持たないため、packageAをアンインストールする必要があるとは思いません。多分packageAはすでにインストールされています!つまり、スクリプトによってパッケージがインストールされた場合にのみ、パッケージをアンインストールする必要があります。扶養家族がいるかどうかは関係ありません。 (この要件は、私が正しく理解していれば、この質問が このような質問 の誤りではない理由です。)
1
Mike

組み込みオプション

私の知る限りでは、apt/apt-getには、探していることを行う組み込み関数がありません。 Snapshot-Debian はそのようなことをしているようですが、それはあなたの要件を完全にカバーしているとは思いません。

代替案

リストされているUbunutを使用するためのハード要件がないため、これらは検討すべきいくつかのオプションです。

Solus(eopkg)

特にUbuntuとは関係ありませんが、Solusがパッケージマネージャーでこれを提供していることを知っています:eopokg Docs

提供されたリンクからの引用:

歴史

次のコマンドを使用して、eopkgの履歴を表示できます。

Sudo eopkg history

ロールバック

システムをロールバックするには、まず上記の履歴コマンドを使用して、トランザクション/操作番号が何であったかを確認します。次に、次のコマンドを使用します。

Sudo eopkg history -t number

この場合、番号は、変更する前の操作です。したがって、数が100の場合、99を使用します。

Yum(Fedora/CentOS/RHEL)

Yumにはこの機能が組み込まれています。これは公式ドキュメント here および here で確認できます。

あなたができる彼らのドキュメントを参照する:

Sudo yum history list all

元に戻したいトランザクションを見つけて、詳細を確認します。

Sudo yum history info <transaction_ID>

次に元に戻します:

Sudo yum undo <transaction_ID>

1
Zuntaruk

ここにある 'apt-rollback'スクリプトを使用してみてください:

https://gitlab.com/fabio.dellaria/apt-rollback

wget https://gitlab.com/fabio.dellaria/apt-rollback/-/raw/master/apt-rollback.sh && chmod +x ./apt-rollback.sh

次のコマンドを使用します。

./apt-rollback.sh --last
Usage: apt-rollback [--last] [--remove/--reinstall package-name] [--help]

  --last       Undo the last APT command
               Supports the undo of the only Install, Remove and Purge commands

  --remove     Remove an INSTALLED package and related configuration files
               Removing also all its first installed dependencies

  --reinstall  Reinstall a REMOVED package,
               and all its first installed dependences
               Reproducing exactly its first installation

  --help       Print the help

あなたはここで小さなビデオデモを見ることができます: apt-rollback Video Demo

1
maxwatt

Aptにはスナップショット機能はありません。通常は必要ありません。それはあなたがすでに望んでいることのほとんどをします。

Ubuntuシステムには、通常はデータ用の優れたバックアップ機能がありますが、パッケージにも使用できます。すべての* buntuデスクトップシステムにデフォルトでインストールされます。

パッケージとコンパイルされたバイナリの両方を含む可能性があり、べき等である必要があるソフトウェアの大規模で複雑なセットのインストール(およびアンインストール)のユースケースは、DebsよりもSnapsの方が適切に処理されます。

編集:OPのコメントでユースケースが明確になりました-どのパッケージが既にインストールされているかはわかりません。削除とインストールを一致させる必要があります。幸いにも、aptでもそれが可能です。 2つの方法があります。

  1. Apt-markingを使用します。 Aptは、どのパッケージをインストールするか指定に対して、どのパッケージが依存関係としてプルされたかを追跡します。その追跡を変更できます。一般に、トップレベルのパッケージはaptマークが付けられた「手動」である必要があり、すべての依存関係はaptマークが付けられた「自動」である必要があります

    通常のようにインストールします:Sudo apt install foo bar bazこのaptは、3つのパッケージすべてに「手動で」インストールされていることを示します。

    • 削除を指定するまで、Aptはそれらを削除しません。
    • libfooのように取り込まれる依存関係には、「自動」というマークが適切に付けられます。
    • baralreadyインストールされている場合、再度インストールされることはありませんが、人間がインストールすることを望んでいるため、apt-markは「auto」から「manual」に変更されます。

    安全に使用することはできませんapt remove foo bar bazbarを削除すると、以前にbarに依存していたものもすべて削除されるためです。だからここにトリックがあります:apt-markingを「auto」に戻します

     Sudo apt-mark auto foo bar baz    // Make packages eligible for autoremove  
     Sudo apt autoremove               // Remove Foo and Baz (and their dependencies)
                                       // Since something else "manual" still depends upon Bar, don't remove it.
    
  2. Aptは--var-log/aptにインストールされている実際にはをログに記録します。ログを解析して、削除のリストを特定します。

0
user535733