私は2つのdebian 11システム(サーバー1とサーバー2)とdebian 9と11システム(サーバー3とサーバー2)を比較し、同じパッケージがあることを確認します。不足しているパッケージをインストールするためにansibleを使用する予定です。
私が探していますDebian はインストールされたパッケージのリストをどこに保存しますか?ただし、適切なパッケージバージョンは表示されず、依存関係も表示されます。 system2に欠落しているパッケージを比較してインストールできるようにするには、バージョン番号とともにsystem1にインストールされているDebianパッケージのみが必要です。
答え1
apt-mark showmanual
手動でインストールされたすべてのパッケージが一覧表示されます。つまり依存関係に引き付けられ、インストールされた状態を維持するのではなく、明示的にインストールされるパッケージです。
そのバージョンを入手するには、次のようにします。
dpkg-query -W $(apt-mark showmanual)
ただし、これを使用してあるシステムから別のシステムにパッケージ選択を確実にコピーすることはできません。依存関係の計算は、(パッケージの依存関係が進むにつれて)異なる時点で異なる結果を生成するためです。apt
これは、パッケージセットのインストールを要求しても、数ヶ月または数年前と同じように、現在のシステムでまったく同じ結果が生成されないことを意味します。可能特に、両方のシステムが同じデフォルトバージョンのDebianとしてインストールされている場合は、同じ結果を生成しますが、それに依存することはできません。
また、特定のバージョンに依存することはあまり役に立ちません。apt
リポジトリから現在利用可能なバージョンのみをインストールできるため、「ソース」システムにバージョンを含むリポジトリを維持しない限り、そこにインストールされているバージョンがわかります。あなたの目標について実行可能な情報を提供しません。また、見ることができます以前のバージョンの Debian パッケージがパッケージリポジトリから消えるのはなぜですか? (バージョン管理システム構成との関連性が高い)
実際には、次に説明する方法のいずれかを使用する必要があります。ある Debian システムから別の Debian システムにインストールされたパッケージを選択してコピーする方法は? (Debian ハルトック)- デフォルトでは、dpkg --get-selections
すべてのパッケージ「オプション」を一覧表示し、それをターゲットシステムに適用するためにdpkg --set-selections
使用されます。apt-get dselect-upgrade
答え2
基本的なアプローチは次のとおりです。
dpkg -l | awk '/^ii/ {print $2}'
インストールされているすべてのパッケージのリストを返します(^iiはそれに対応します)。
これにはバージョン番号は含まれていませんが、使用しているリポジトリのパッケージプールでバージョンが変更された可能性があるため、バージョン番号に基づいてインストールすることはできません。
apt-get updateを実行した後にのみaptで実際にバージョンをインストールでき、両方のシステムがDebian 11なので、フルパッケージ数に同じバージョンがあるので、バージョン番号が必要だと思う理由が何であるかよくわかりません。 、サードパーティ製のリポジトリなどを使用しない限り。
各システムのリストを作成し、ターゲットシステムのリストに表示されないパッケージのみをインストールできます。
スクリプトを使用してこのようなタスクを実行すると、パッケージがソースシステムリストに対してターゲットシステムにインストールされていることをテストし、パッケージが存在しない場合にのみインストールしますが、ループでこれを行う必要があるため、より強力になります。これは、何らかの理由でパッケージがターゲットシステムのリポジトリで利用できない場合、1つずつ実行しないとすべてが失敗するためです。
明確な方法は、2つのリストを作成し、ターゲットシステムにないパッケージの小さなdiffリストを作成し、それらの小さなリストを繰り返して1つずつインストールすることです。繰り返すと、インストールが失敗し、リストの次のインストールが続行されるため、孤立した問題が解決されます。
Bashは2つのリストを比較して、欠落している項目を見つけます。
Bashだけでリストを比較する方法の例がありますが、望むものより少し複雑です。
このようなことをするには、スクリプト全体を使用する方が良いと思います。私は個人的にPerlでやりますが、この種の作業に使用したいものは何でも使用できます。
孤児を作る
もう1つの問題は、これによって欠落しているパッケージが1つずつインストールされることです。これには、さまざまな依存関係を含めることができますが、望ましくない孤立したパッケージを含めることもできます。
たとえば、システムが次の Debian 安定リリースに複数回アップグレードされた場合、孤立したパッケージが発生する可能性があり、これにより削除できない孤立したパッケージが残る可能性があります。
このアプローチの最大の欠点は、パッケージが変更されたり新しいバージョンを取得できるため、実際にパッケージの依存関係をインストールしたくないことです。これにより、パッケージは孤立しますが、明示的にインストールしたため、apt autoremoveによって削除されません。したがって、依存関係は導入されず、明示的にインストールされたとマークされます。これはlibパッケージにもっと頻繁に影響しますが、インストール時にさまざまなパッケージをインポートする他のエントリにも影響を与える可能性があります。
この問題を解決するために、より多くのスクリプトを使用できますが、複雑になる可能性があるため、パッケージを一致させることが目標である場合は、完了するまで1つずつインストールするだけです。インストールが少し台無しになり、少し混乱が追加されますが、これを行う簡単な方法です。
注意してお勧めします!
これを行うときは、--no-install-recommendsを使用することが重要です。そうでなければ本当に混乱するでしょう。このため、私は常に推奨事項をインストールしないようにシステムを設定します。推奨事項は、制御できない項目に簡単にデイジーチェーンでリンクできます。 --no-install-recommendsなしで単一の小さなCLIプログラムがインストールされている場合は、デイジーチェーンのためにいくつかのインポートを試みるいくつかの例をオンラインで見たことがあります。 100MB パケットの問題です。
たとえば、/etc/apt/apt.conf.d/ では、80basics などのファイルに次の行を追加できます。
APT::Install-Recommends "0";
APT::Install-Suggests "0";
APT::AutoRemove::SuggestsImportant "false";
APT::AutoRemove::RecommendsImportant "false";
推奨や提案を自動的にインストールしたい状況は見たことがありません。
これを行う方が良い方法かもしれません。
私はこれが同期システムの標準的な問題なので、これを行うより良い方法があると思います。おそらく、いくつかの基本的なDebianツールや他のサードパーティ製のツールがこれを行うことができます。このようなことが起こらないと驚きます。存在しませんが、わかりません。
答え3
他の答えdpkg
のバリエーションは次のとおりです。
dpkg-query -W
パッケージ名とパッケージバージョンのソートされたリストを出力します。各行には、パッケージ名、タブ、およびパッケージのバージョン文字列があります。-W
リストを一致するパッケージ名(名前に含まれるパッケージなど)に減らすために、オプションに引数としてglob式(一重引用符)を追加できます。dpkg-query -W '*apt*'
または、出力をラインにパイプしたり、ラインをフィルタリングまたはリダイレクトすることもできます。ファイルに出力し、テキストエディタを使用して読み込みます。apt
grep
awk
sed
cat