私のシステムはDebian Busterです。 gitを使用してインストールされたパッケージのリストを追跡したいと思います。
インストールされたパッケージのリストを使用する場合、リストdpkg -l
はどこから入手できますか?
でいくつかのパッケージ情報が見つかり/var/lib/dpkg/status
ましたが、そのファイルには私が興味のあるものよりも多くの情報が含まれています。パッケージリストが保存される場所は他にありますか?
インストールされたパッケージ、そのバージョン、または削除されたパッケージを知るための最良のトレースファイルは何ですか?
修正する
gitを使って/var/lib/dpkg/statusを追跡しようとしましたが、出力は非常に不明で混乱しました。ステータス情報が多すぎます。インストールされているパッケージのリストとそのバージョンを追跡するだけです。 dpkg -l の出力に似ています。
dpkg -l で示されたパッケージのリストは一部のファイルに保存されていますか、それとも毎回動的に生成されますか?
/var/lib/dpkg/にgitリポジトリを作成し、gitにいくつかのフィルタを作成して、デフォルトでdpkg -lの出力を追跡できますか?または、git statusを実行するたびにリストが動的に生成される可能性がありますか?それとも他の解決策がある場合は、gitがどのような可能性を提供するのかわかりません。
答え1
インストール済みパッケージのリストはい;これは/var/lib/dpkg/status
正式な参照です。インストールされたパッケージは、「インストールの確認がインストール済み」の状態でこのファイルに表示されます。dpkg -l
このファイルは実行されるたびに処理され、ファイルに保存された情報は出力を生成するために使用されます。
より単純なデータセットを追跡して比較を簡素化するには、必要に応じて生成する必要があります。
インストールされているパッケージのリストを追跡するには、次を実行できます。
dpkg --get-selections
git
バージョンも必要なので、定期的に追跡されたファイルに出力を保存します。
dpkg -l
より適切かもしれません。
指摘したとおりマーティン・コンラッドここで生成された情報を使用して後でシステム状態を復元できるようにするには、手動でインストールされたタグも追跡する必要があり、保存も追加します。
apt-mark showmanual
apt-mark showhold
上記のすべてをフックに追加して、システムのすべての変更を追跡できます。dpkg
たとえば、/etc/packages/
ファイルを保存するには(代わりに/var/lib/dpkg
「所有者」はdpkg
そのまま残す必要があります)/etc/dpkg/dpkg.cfg.d/package-history
post-invoke="if [ -x /usr/local/bin/package-history ]; then /usr/local/bin/package-history; fi"
そして、/usr/local/bin/package-history
次のファイルが含まれています
#!/bin/sh
cd /etc/packages
dpkg --get-selections > selections
dpkg -l > list
apt-mark showhold > holds
apt-mark showmanual > manual
後者は実行可能でなければなりません。
sudo chmod 755 /usr/local/bin/package-history
上記のコマンドの出力はすべて整列しているため、後処理する必要はありません。これらのファイルを使用すると、インストールされているパッケージの状態を正確に復元し、バージョンの変更を追跡し、削除されたが削除されていないパッケージを表示することもできます。
スクリプトに追加git commit
(最初に変更を確認)したり、それを使用してファイルの変更を追跡したり、gitリポジトリ自体を作成したりすることもできます。フックを使用してファイルが更新されていることを確認してください。package-history
etckeeper
/etc/packages
/etc/packages
dpkg
どのapt
によって駆動されるか、またはdpkg
に基づく他のパッケージ変更スクリプト自体内でコミットすると、コミット粒度は実行に対応し、関連するタスクdpkg
に対応します。package-history
dpkg
etckeeper
etckeeper
スクリプトで送信を処理するには、次を追加します。
if [ "$(git status --porcelain | wc -l)" -gt 0 ]; then
git add *
git commit -m 'Update package information'
fi
上記のスクリプトの最後に移動し、rootとして手動で一度実行してgit履歴を初期化する必要があります(後でmkdir /etc/packages; git init /etc/packages
)。
答え2
パッケージのリスト(表示されているように)が
dpkg -l
一部のファイルに保存されていますか、それとも毎回動的に作成されますか?
Stephen Kittの答えはすでにこれを示しています。/var/lib/dpkg/status
情報はそこにあり、他のすべては単にそれを解析することです。dpkg -l
情報を1つの(デフォルト)形式で表示しdpkg-query
(本質的にはdpkg -l
)他の形式で情報を表示するために使用できます。
同様の機能を持つパッケージからインスピレーションを得ることができ、etckeeper
。パッケージの変更に対する変更をコミットdpkg
するためのフックを追加し、コミット/etc
メッセージにパッケージのリストを含めます。 gitはパッケージリストを追跡しないので、直接使用することはできません。
次のフックを追加します。
# cat apt/apt.conf.d/05etckeeper
DPkg::Pre-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; };
DPkg::Post-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; };
RPM::Pre-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; };
RPM::Post-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; };
dpkg-query -W -f '${Status}\t${Package} ${Version} ${Architecture}\n'
パッケージリストを取得するために、etckeeperジョブ自体が呼び出されます。
だからあなたはそのようなことをすることができます。以下を含むファイルを作成します/etc/apt/99-track-packages
。
DPkg::Post-Invoke { "/some/script"; };
次の/some/script
ようになります。
#! /bin/sh
cd /some/git/directory
dpkg -l >> list-of-packages
git commit -am 'some message'
その後、aptが呼び出されるたびにコミットが行われますdpkg
。