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/apt-getには、探していることを行う組み込み関数がありません。 Snapshot-Debian はそのようなことをしているようですが、それはあなたの要件を完全にカバーしているとは思いません。
リストされているUbunutを使用するためのハード要件がないため、これらは検討すべきいくつかのオプションです。
特にUbuntuとは関係ありませんが、Solusがパッケージマネージャーでこれを提供していることを知っています:eopokg Docs
提供されたリンクからの引用:
歴史
次のコマンドを使用して、eopkgの履歴を表示できます。
Sudo eopkg history
ロールバック
システムをロールバックするには、まず上記の履歴コマンドを使用して、トランザクション/操作番号が何であったかを確認します。次に、次のコマンドを使用します。
Sudo eopkg history -t number
この場合、番号は、変更する前の操作です。したがって、数が100の場合、99を使用します。
Yumにはこの機能が組み込まれています。これは公式ドキュメント here および here で確認できます。
あなたができる彼らのドキュメントを参照する:
Sudo yum history list all
元に戻したいトランザクションを見つけて、詳細を確認します。
Sudo yum history info <transaction_ID>
次に元に戻します:
Sudo yum undo <transaction_ID>
ここにある '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
Aptにはスナップショット機能はありません。通常は必要ありません。それはあなたがすでに望んでいることのほとんどをします。
Ubuntuシステムには、通常はデータ用の優れたバックアップ機能がありますが、パッケージにも使用できます。すべての* buntuデスクトップシステムにデフォルトでインストールされます。
パッケージとコンパイルされたバイナリの両方を含む可能性があり、べき等である必要があるソフトウェアの大規模で複雑なセットのインストール(およびアンインストール)のユースケースは、DebsよりもSnapsの方が適切に処理されます。
編集:OPのコメントでユースケースが明確になりました-どのパッケージが既にインストールされているかはわかりません。削除とインストールを一致させる必要があります。幸いにも、aptでもそれが可能です。 2つの方法があります。
Apt-markingを使用します。 Aptは、どのパッケージをインストールするか指定に対して、どのパッケージが依存関係としてプルされたかを追跡します。その追跡を変更できます。一般に、トップレベルのパッケージはaptマークが付けられた「手動」である必要があり、すべての依存関係はaptマークが付けられた「自動」である必要があります
通常のようにインストールします:Sudo apt install foo bar baz
このaptは、3つのパッケージすべてに「手動で」インストールされていることを示します。
libfoo
のように取り込まれる依存関係には、「自動」というマークが適切に付けられます。bar
がalreadyインストールされている場合、再度インストールされることはありませんが、人間がインストールすることを望んでいるため、apt-markは「auto」から「manual」に変更されます。安全に使用することはできませんapt remove foo bar baz
bar
を削除すると、以前に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.
Aptは--var-log/aptにインストールされている実際にはをログに記録します。ログを解析して、削除のリストを特定します。