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


38

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

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

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


以下の回答のほとんどは、私が探しているものの近似値を提供し、ある程度有用です。選ばれたものは、すべての警告があったとしても、新しいシステムにツールを再インストールする合理的な自動方法に最も近いものです。


すべてのLinuxディストリビューションについて、簡単に共有できる1つの答えを得る可能性は低いでしょう。パッケージ管理は、さまざまなLinuxディストリビューションを区別する重要な部分です。
テレマコス

テレマコス-本当。そして、これを2つの質問に分けることは理にかなっているかもしれません。しかし、それはかなり専門的な質問のようで、私は両方のシステムを使用しているので、事前にあまり絞りすぎたくありませんでした。ここでの回答のほとんどはdpkg / aptに対するものであるように見えるので、rpm / yumに対する別の質問が意味をなすかもしれません。
クォーク

NixOSに切り替えてください:)(トローリングのみ)。
アレクセイ

回答:


31

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

dpkg --get-selections "*" > my_favorite_packages

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

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

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

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

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

aptitude search '~i ~M'

インストールしたものだけが必要な場合(自動依存関係は不要)、以下を無効にし~Mます。

aptitude search '~i !~M'

パッケージ名と「インストール」という単語だけを持つようにフォーマットする場合は、aptitudeそれもできます。これにより、フィードの準備ができたリストが表示されますdpkg --get-selections

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

(RedHatまたはRedHatベースのシステムには何もありません。申し訳ありません。パッケージ管理は異なるディストリビューションを異なるものにする重要部分であるため、Linux 自体にはまったく答えがありません。)


あなたのアドバイスとLudwigの組み合わせがうまくいくかもしれません:aptitudeはdpkgにフィードするスクリプトを生成できるので、それは自動化可能であり、これは大きな勝利です。そして、もしバニラマシン上でそれを行うとしたら、リストの違いは、私が実際に役立つように求めているものに十分に近いものです。
クォーク

3
APTは、現在「/var/log/apt/history.log」のログを保持し、かつによって使用されていることに注意してくださいapt-getsynapticaptitude(これまで私が見てきたように)。これは2010
。– tshepang

dpkg.logUbuntu 14.04では、簡単な選択ではなく簡単に選択できますが、それほど難しくはないため、このステートメントは真実ではないようです。awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
スティーブブゾナス

実際、最初に思ったほど簡単ではないことがわかりました。以前のawkスクリプトの欠陥は、アンインストールされたパッケージには注意を払っていません。次のようにawk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -uします。
スティーブブゾナス

7

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

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

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


3
基本的な考え方は強力です。コマンドラインを使用して現在インストールされているアプリケーションのリストをダンプし、コマンドラインを使用してそれらのパッケージを新しいマシンにインストールします。このアプローチを使用すると、かなり創造的で具体的になります。
pcapademic

1
dpkg --get-selections
CesarB 2009

これは、依存関係とは別に追加したパッケージを追跡しませんが、間違いなく有用なリストを生成します。
クォーク

3

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

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

私は私のブログでは2本の支柱にすべてのことを行う方法について説明しますのDebian GNU / LinuxのクリーンアップのDebian GNU / Linuxの(またはUbuntuの)クリーンアップを、リプライズ。要するに、あなたが探している答えは次のとおりです。

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

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

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


2
私はあなたが必要とせずにその情報を得ることができると思うgrepaptitude search '~i !~M'トリックを行う必要があります。
テレマコス

1
また、apt-get非推奨ではありません。Debian aptitudeはコマンドラインでのパッケージ管理を推奨していますが、それは非推奨とは程遠いですapt-get
テレマコス

ここには微妙なものがあります。3番目の列で「A」を検索すると、依存関係としてインストールされていることがわかっているパッケージがマークされているようです。しかし、それらのすべてをキャッチしているわけではないことは明らかです。リストのほとんどは、明示的なリクエストによってインストールされたものではありません。
クォーク

@Telemachus。コマンドとパターンのあるコマンドはまったく同じことを行いません。2つのリストの内容は異なります。適性について十分に知りませんが、その理由を説明します。
クォーク

@Pablo:ログへのリンクが壊れているようです。あなたがそれらを修正できるなら、私は間違いなくそれらを読みたいです。
クォーク

2

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


注目。これはUbuntuに(デフォルトで)インストールされていないようです。
クォーク

1

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


手動インストールとシステム更新が混在しているため、私にとってはあまり役に立ちません。また、セットアップによってはterm.logsが最終的に古くなって削除されるため、必要な限り戻されません。
クォーク

これを試みる人にとっては、aptのログを歩くことは、ここで説明した他のオプションよりもはるかに多くの作業のように思われることに注意してください。ログからパッケージリストを抽出するのは確かに自動ではありません。
クォーク

1

から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

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

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

を使用して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)

非常に少数のパッケージがまだクラックを通過しますが、これらユーザーが言語ローカリゼーションセットアップまたはTotemコーデックインストーラーなどを使用してインストールした直後に実際にインストールされていると思われます。また、バージョン固有でないメタパッケージのみをインストールしたにもかかわらず、linux-headerバージョンも蓄積されているようです。例:

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

仕組み

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

他の可能性もうまくいきません:

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

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


0

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

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

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

私が開発したいくつかのプログラム(私が制御できるように)には、プログラムしたツール、栗のパッケージマネージャーを使用します。MacOSX上の.appフォルダーのようなもの。すべてがパッケージに含まれているので、いつ何がインストールされているかを知っています。


パッケージマネージャーのインストールコマンドをスクリプトに入れるだけで、同じ効果が得られます。必要なコードがパッケージ化されていると仮定します。あなたのアプローチは、gentooのアプローチと非常によく似ています。
wcoenen 09

知ってうれしい。デフォルトのUbuntu / Debianシステムを超える多くの追加作業のように見えます。いくつかのパッケージを手動で保守するのを見ることができますが、すべてのパッケージをこのように保守することは、私がやりたいことよりも多くの作業です。
クォーク

はい、ただし、ubuntu / fink / darwinportsがどこでもクロスプラットフォームで動作しないという追加の問題があります(デジタルとIBM sp4を一度使用しました)。これがいい方法だとは言いません。justくて臭い方法ではあるが、それは仕事をすると言うだけで、私は私のシステムで何が起こるかを完全に制御し続けます。
ステファノボリーニ

もちろん、私はこれらの日のいずれかを実際に真剣に見て、それを使ってすべてを作り直すことを決めることができました。
ステファノボリーニ

このパスは、シェフやパペットなどのツールを検討する最近ではより一般的です。
スティーブブゾナス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.