2つのホストにインストールされているパッケージの違いのリストを計算する


11

Debian仮想サーバーにいくつか問題を追加し、それらすべてをゼロから再インストールするだけです。しかし、私はまだ古いバージョンにアクセスでき、インストール済みパッケージのリストを取得できました。

将来的に仮想サーバーを復元するプロセスを容易にするために、サーバーごとに特定のパッケージのリストを作成したいと思います。

私が達成したいことをよりよく説明します。私はすでに、どこでも基本的なパッケージと構成を使用して新しい仮想サーバーを作成する自動プロセスを持っています。ここで、この「スケルトン」でデルタを保存して、特定のサーバーの再インストールを簡単にしたいと思います。

本当のプラスは、変更された構成ファイルもデフォルトから保存することですが、パッケージリストだけで生きることができます。

つまり、ホストにはインストールされているが別のホストにはインストールされていないパッケージのリストを作成する方法が必要です。

リストに手動でインストールされたパッケージのみが含まれ、すべての依存関係のリストが含まれていない場合は、非常に便利です。

この特定のタスクを達成するために設計された既存のツールがある場合は、お気軽に提案してください。ただし、依存関係をできるだけ小さくしたいと思います。詳細については、これらは正確には仮想サーバーではなく、LXCコンテナーです。


ただの考えですが、今から反対方向からこれに取り掛かる時期かもしれません。情報を引き出そうとする代わりに、構成管理システム(人形)をセットアップする理由。次に、物事を管理対象システムにプッシュします。
Zoredache

ああ、ところで、この質問を見てください。 serverfault.com/questions/3852/...
Zoredache

@Zoredache私は現在、これらすべてを管理するためのいくつかのより良い方法を探していますが、その間、念のためにサーバーの状態を保存する簡単な方法を見つけたかったのです。リンクをありがとう!
krtek

回答:


12

参照インストール(1回のみ):

dpkg-query -W -f='${Package}\n' | sort > baselist.txt

(以下は想定bash

参照インストールから追加されたパッケージを取得するには(削除されたものは表示されません):

comm -1 -3 baselist.txt <(dpkg-query -W -f='${Package}\n' | sort)

より良い、のコピーを避けますbaselist.txt

comm -1 -3 <(ssh user@refserver cat /path/to/baselist.txt) <(dpkg-query -W -f='${Package}\n' | sort)

2

古いサーバーで次を実行:

dpkg --get-selections> old-packages-list

上記のファイルを新しいサーバーにコピーして、これを新しいサーバーで実行します。

dpkg --set-selections <古いパッケージリスト

apt-get update

dselect update

また、/etc/apt/sources.listパッケージを移行する前に、古いサーバーから新しいサーバーにすべての追加のリポジトリも追加することを忘れないでください。そうしないと、ほとんどのパッケージがインストールされないままになります。


これにより、パッケージのリスト全体が保存されます。これは、サーバーの復元に使用したソリューションそのものです。しかし今、将来のプロセスを容易にするために、ベースサーバーとは異なるパッケージのリストのみを保存したいと思います。
krtek

1
わかりました。これも非常に簡単です。まず、「dpkg --get-selections> old-packages-list」によって古いサーバーからリストのバックアップを作成し、次に「dpkg --get-selections」によって新しいサーバー上のパッケージのリストを取得します> new-packages-list ",,, runこのコマンドを実行します" cat old-packages-list | awk '{print $ 1}'> old-list ",,, same command on new server、but new old with new。両方のファイルで差分を実行すると、違いがわかります。diff -w古いリスト新しいリスト
ファーハン

1
cut -f1probablzはawkよりも速く、Khaledの回答についてコメントしたように、diffが常に正しい結果を返すとは限りません。解決策commは今のところ本当にあります...しかし、手動でインストールされたパッケージのみをリストするバージョンがありません。
krtek

1

次のコマンドを使用して、両方のサーバー上のパッケージの完全なリストを取得できます。

     dpkg -l | sort > old_file
     dpkg -l | sort > new_file

次に、以下を使用して違いを取得できます。

     diff -Nur old_file new_file > changes.txt

grepを使用して、必要な変更をフィルタリングできます。また、diffを使用して、構成ファイルの変更を取得し、必要に応じて適用するパッチを生成できます。ちなみに、diffは2つのファイルだけでなく2つのフォルダーを比較できます。


diff出力の問題は、すべてを自動的に再インストールするためにapt-getに直接供給することができないことです...そして提案されたShellholicのように、この特定のケースではcommを使用する方が良いです、パッケージリストは本当に長いです。
krtek

別の問題は、dpkgが出力の列のサイズを自動調整することです。したがって、長いパッケージ名を持つサーバーからのdpkg -lは、diffを困難にします。
パオロ

1

ブループリントは、まさにあなたのニーズに合わせて設計されています。インストールされている説明パッケージと変更された設定ファイルを吐き出します。クリーンボックスに適用するために、これらの記述をPuppetまたはChefスクリプトに変換することができます。


0

この役立つパッケージも見つかりました。その説明は次のとおりです。

Debianパッケージのファイルシステムツリーを現在のファイルシステムツリーと比較し、異なるファイルの統一されたdiffを出力するBashスクリプト。

https://code.google.com/p/dpkg-diffs/

PATHのどこかに貼り付けて実行できる単一のbashファイルだけです-私にとってはうまくいくようで、古すぎません。

これが誰かを助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.