web-dev-qa-db-ja.com

Ubuntu(Linux)にインストールされたパッケージをどのように追跡しますか?

(この質問は 10458 とよく似ています。FedoraとUbuntu/Debianは異なる回答を保証するのに十分異なることが示唆されました。)

Ubuntuセットアップを使用するときは、ベースラインインストールに加えて、徐々に多くのパッケージをインストールします。再インストールする場合、または新しいマシンをインストールする必要がある場合は、通常、それらの固有パッケージを再インストールしたいと思っています。最小限の手間で作業に戻ります。すべてのパッケージマネージャー(apt-getaptitudeおよびsynaptic)は、どのパッケージがインストールされているかを教えてくれ、すべてのログを持っています(ただし、ツールごとにログが異なるため、面倒です)。しかし、それらのいずれも、依存関係やシステムの更新とは対照的に、どのパッケージをインストールしたかを教えてくれません。ログでさえも、何を抽出する必要があるのか​​、またはそれらを統合する方法(さまざまなaptファミリーツールの場合)が完全にわからないという点で、トリッキーです。つまり、再インストールするたび、または単にバックアップするたびに、そのリストを再作成する方法がわかりません。

私は必ずしもこれを行うためのツールを期待しているわけではありませんが、そうでない場合は回避策を探しています。 grepの対象となるパターン、優れた経験則、または正確に何がログに記録されているかについての明確なアイデアでさえ、役に立つでしょう。ここには「ベストアンサー」はないかもしれませんが、良い答えは非常に役立ちます。


以下の回答のほとんどは、私が探しているもののいくつかの近似を提供し、ある程度役に立ちます。選択されたのは、すべての注意点があっても、新しいシステムにツールを再インストールする合理的に自動化された方法に最も近い方法です。

38
quark

Debianベースのマシンでは、これはパッケージセットを複製する一般的な方法の1つです。古いマシンで:

dpkg --get-selections "*" > my_favorite_packages

ファイルmy_favorite_packagesを新しいマシンにコピーします(サムドライブは適切なオプションですが、scpも正常に動作します)。次に、このシーケンスを(root権限で)実行します。

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

これはあなたを取得しませんonlyインストールしたパッケージ。また、依存関係なども取得します。また、2台のマシン間のリポジトリが異なる場合、すべてのベットがオフになります。

ログに関する限り、apt-get/var/log/apt/history.logでログを保持します(コメントでこれを更新してくれたTshepangに感謝)。 dpkgは(/var/log/dpkg.logで)実行しますが、解析が非常に難しく、ルート権限でのみ読み取ることができます。 aptitudeには/var/log/aptitudeに1つあり、通常のユーザー権限でページングできます。

私が知る限り、これらのログのどれも、自動インストールされた依存関係とは対照的に、具体的にインストールしたものを追跡しないことが正しいです。ただし、その情報はaptitude検索から取得できます。自動的にインストールされたすべてのインストール済みパッケージを検索します。

aptitude search '~i ~M'

必要な場合のみインストールしたもの(自動依存関係ではない)は、~Mを無効にします。

aptitude search '~i !~M'

onlyパッケージの名前とWordの "install"が含まれるようにフォーマットしたい場合は、aptitudeでも同じことができます。これにより、dpkg --get-selectionsにフィードする準備ができたリストが提供されます。

aptitude search '~i !~M' -F "%p install"

(RedHatまたはRedHatベースのシステムには何もありません。申し訳ありません。Linuxには1つの答えはありませんそれ自体パッケージ管理は、さまざまなディストリビューションの大きな部分を占めているためです異なる。)

31
Telemachus

使用する dpkg -l '*' > jaunty.originalは、新しくインストールされたシステムにインストールされているすべてのパッケージを記憶します。

すべての追加パッケージをインストールしたら、dpkg -l '*' > mysystem.2009017

追加のパッケージはただの違いです:diff jaunty.original mysystem.2009017

7

適性は実際にはこれでかなり良いです。 Aptitudeは、手動または依存関係によって何かがインストールされたときを認識し、不要になったものとインストールされただけのものを削除するように指示することができます。

Ubuntuのインストールを構成する少数のパッケージ、ubuntu-minimal、ubuntu-desktop、ubuntu-serverなどがあります。それらを手動でインストールされたものとしてマークし、他のすべてのものを削除するようにAptitudeに指示すると、最終的には可能な限り最小限のパッケージになります。

すべての方法をブログの2つの投稿で説明します: Debian GNU/Linuxのクリーンアップ および Debian GNU/Linux(またはUbuntu)のクリーンアップ、reprise 。要するに、あなたが探している答えは:

aptitude search ~i | grep -v "i A"

前回私がこれに取り組んだとき、apt-getを使用した場合、機能しませんでした。そのため、私は常にaptitudeを推奨しています。私が知る限り、Debianはapt-getを非推奨にしてaptitudeを支持しています。

私はFedoraでそれを行う方法を知りません、そしてあなたはおそらく別の質問に分けるよりも分離すべきです。 FedoraとUbuntuは異なるオペレーティングシステム であり、そのように扱う必要があります(カーネルやその他のものを共有している場合でも)。

3
pupeno

Debianでは apt-show-versions はインストールされたパッケージのバージョンを表示します。

2
seb

man aptitude-create-state-bundleから:

aptitude-create-state-bundleは、現在のパッケージアーカイブ状態を複製するために必要なファイルを格納する圧縮アーカイブを作成します。

これは、手動でインストールされたパッケージに関するaptitudeと同じ情報を保持します。

aptitude-run-state-bundleで使用するためのものです:

aptitude-run-state-bundleは、aptitude-create-state-bundle(1)によって作成された、指定されたaptitude状態のバンドルを一時ディレクトリにアンパックし、提供されたで呼び出し、その後一時ディレクトリを削除します。

1
intuited

dpkgを使用しただけでは、パッケージがユーザーによって手動でインストールされたのか、(依存関係として、または最初のOSインストール中に)自動でインストールされたのかがわかりません。その情報を保持したい場合は、実際に手動でインストールされたパッケージのみのリストを取得する必要があります。

そのためには、これら2つのワンライナーのいずれかを使用できます。どちらも私のマシンでまったく同じ出力を生成し、この質問でこれまでに提案されたすべてのソリューションよりも正確です。これらは、2つの回答 (1) および (2) の組み合わせです。最初にこの回答 here を投稿したことに注意してください。

apt-markの使用

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

aptitudeの使用

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

これらのareは、言語ローカリゼーションのセットアップによるインストールの直後、または、 Totemコーデックインストーラーを介して。また、バージョン固有でないメタパッケージのみをインストールしたにもかかわらず、linux-headerのバージョンも蓄積されているようです。例:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

どのように機能しますか

  1. 手動でインストールされたパッケージのリストを取得します。 aptitudeの場合、追加のsedは、行末の残りの空白を取り除きます。
  2. 新規インストールの直後にインストールされるパッケージのリストを取得します。
  3. ファイルを比較し、ファイル2に存在しないファイル1の行のみを出力します。

他の可能性も機能しません:

  • ubuntu-14.04-desktop-AMD64.manifestの代わりに/var/log/installer/initial-status.gzファイル( ここでは Ubuntu 14.04の場合)を使用します。それ以外のパッケージが手動でインストールされたものとして表示されます。
  • apt-mark showautoの代わりに/var/log/installer/initial-status.gzを使用します。たとえば、apt-markにはxserver-xorgパッケージは含まれていませんが、他のファイルには含まれています。

どちらも上記のソリューションよりも多くのパッケージをリストしています。

1
jmiserez

Aptベースのシステムでは、/ var/log/apt/term.logを確認してください。私にとって、インストールが終了した場所と、インストールが開始した場所を描くためのかなり明確な線があります。

1
Wade

私は偏見があり、私が提示する解決策は常に可能であるとは限りませんが、この状況に飽きました。その結果、更新/パッケージマネージャーツールでは何もインストールしなくなりました。

私はかなり難しいルートをとりました(バージョンに厳しい要件がありました)。私は、必要なすべてのパッケージ(プログラム、ライブラリ、その他)をダウンロードしてコンパイルし、ホームディレクトリにインストールする巨大なmakefileを作成しました。私は段階的にそれを少しずつ開発しました。 makefileは、コンパイラを含め、すべてをダウンロードしてコンパイルします。

新しいシステムに移動するか、再インストールするときは、makefile(およびいくつかのサポートするもの)をコピーし、make worldを実行して、翌日に戻ってきます。

私が開発した一部のプログラム(つまり、自分で制御できる)については、プログラムしたツール chestnut package manager を使用しています。 MacOSXのような.appフォルダのようなものです。すべてがパッケージに含まれているので、いつ何がインストールされるかがわかります。また、自己完結型で十分であることもわかっています(システムライブラリを除く)

0
Stefano Borini