Fedoraシステム(A)があり、時間の経過とともにいくつかのパッケージをインストールしてきました。次に、Fedoraを別のコンピューター(B)にインストールし、同じパッケージをインストールしたいと思います。

Debianの用語では、次のようなことを実現したいと思います。

$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b 

しかし、正直なところ、新しいFedora 19システムで同じパッケージを選択するためのより良い方法が本当に必要です(B):明示的に言及されたシステムAからパッケージをインストールしたいだけですdnf install(またはyum install)コマンドラインで-依存関係としてインストールされたものではありません!

なぜですか?おそらく依存関係が変更されたため、新しいシステムに古い依存関係をインストールしたくない。さらに、パッケージを削除するときに、(おそらく)不要な自動的にインストールされた依存関係(つまり孤立)も削除したい。

dnf list installedを見つけましたが、依存関係のためにパッケージが明示的に選択された場合、またはインストールされたばかりの場合は表示されません。

どうすればよいですかFedoraに関する情報を入手しますか?

パッケージの選択を複製するFedora / dnfの方法は何ですか?

回答

Fedora 26以降、Dnf repoquery サブコマンドサポートには、ユーザーがインストールしたすべてのパッケージを一覧表示するための新しいオプションがあります。

$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst 

他の方法とは対照的に、すべてのdebuginfoパッケージも一覧表示されます。上記の例の追加のgrepは、それらを除外します。

ホストBにリストをインストールするには:

$ < pkgs_a.lst xargs dnf -y install 

Dnf API

最近のDnfバージョン(Fedora> = 23など)では、パッケージデータベースにDnf PythonAPIを介してユーザーがインストールしたパッケージ名を照会できます。

$ python3 -c "import dnf; b = dnf.Base(); b.fill_sack(); \ l = sorted(set(x.name for x in b.iter_userinstalled() \ if not x.name.endswith("-debuginfo") \ and x.name not in \ ["kernel-modules", "kernel", "kernel-core", "kernel-devel"] )); \ print("\n".join(l)) " > pkgs_a.lst # dnf install $(cat pkgs_a.lst) # on host_b 

デフォルトでは、1つ以上のパッケージが利用できなくなった場合、dnf installは中止されます。または、dnf を強制することもできます残りのすべてをインストールするには:

# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b 

PS:上記のコードなどを user-installed.py に配置します。これは他のディストリビューションもサポートしています。

ユーザーがインストールした履歴

Fedora 23以降では、Dnfはユーザーがインストールしたすべてのパッケージを一覧表示する

# dnf history userinstalled 

コマンドを提供します。2016-11現在、その有用性は限られています。その出力を制御し、完全修飾されたパッケージを印刷します(つまり、バージョン情報を含む)。

ユーザーがインストールした制限

パッケージをユーザーがインストールしたものとしてマークすることには、Fedora 23時代のシステム(2015年頃から)の一部のFedoraバージョンにいくつかの制限があることに注意してください。 -11)次の問題が関連しています):

Repoquery

Dnf、Dnf API、は利用できません。代わりに、 repoquery を使用できます。例:

$ repoquery --installed \ --qf "%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}" --all \ | awk -F"|" " $2 ~ /user/ && ($3 != 4294967295) { print $1 }" \ | sort -u > pkgs_a.lst 

2番目のawk条件は、インストーラーによってインストールされたパッケージを除外するために使用されます。インストーラーのユーザーIDは4294967295として保存されているようです。または、

このコマンドはリリース21までのFedoraで機能することに注意してください。ただし、例:コマンドrepoquerydnf repoqueryに置き換えられたため、リリース23ではありません。また、 dnf repoquery %{yumdb_info.reason}タグを理解していません。

コメント

  • I ‘このアプローチですべてが得られるかどうかわからないので、システムでこれらに気づきました。 repoquery ...を実行しました:”無効なyumdbクエリタグ’理由’インストール済みパッケージの場合:HandBrake-cli-0.9.5-1.fc14.x86_64 ”
  • @ slm、hm、どのリポジトリからハンドブレーキがインストールされていますか?おそらくリポジトリの設定はそれと関係がありますか?
  • yum localinstall ...を使用してインストールしたスタンドアロンRPMであった可能性があります。でも、かなりの量のパッケージがそのキャンプに落ちました。
  • repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -lは90個のパッケージを返しました。

回答

最も簡単な方法で、長い間機能していました:

yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump> 

…これはget / set selectionsdpkgコマンドのAIUIとほとんど同じように機能します。また、履歴を再生する場合は、次を使用できることにも注意してください。

yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info> 

…自分で解析する代わりに。

回答

slm answer 次のyum historyベースのソリューションを考え出しました。

すべてのyumインストールトランザクションの詳細な履歴をすべて取得します(つまり、アップグレードなし)。 、初期インストーラーアクションの一部として実行されたもの(システム上のトランザクション1および2、ユーザー「システム」に起因)を除く:

$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history 

明示的にインストールされたパッケージをフィルター処理する

$ < yum_history grep "[^-]\<Install\>" | \ awk "{ print $2 }" \ | sed "s/\(-[0-9]\+:\|-[0-9]\+\.[0-9]\|-[0-9]\+-\|-[0-9]\+git\).\+\(\.fc1[1-7]\.\|\.noarch\).*$//" \ | sort > hist_pkg_list 

すべての種類のバージョンサフィックスが一致するように、醜い正規表現が必要です。

結果私のシステムでは非常に見栄えがします。

repoquery ansatz(私のシステム)との比較:

 method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214 

(レポクエリの結果をパイプで転送しましたugh sort -u)

なぜ違いがあるのですか? repoqueryには、トランザクション1および2のすべてのパッケージ、つまりFedoraインストーラーによってインストールされたすべてのパッケージが含まれているためです。これは、repoqueryに前述のパッケージxorg-x11-drv-mgaとその仲間が含まれている理由を説明しています。

repoquery-2ndとyum-historyを比較すると、repoquery-2ndの方が正確であり、すでに削除されているパッケージは含まれていません。 。さらに、「yumupdate」操作からのいくつか(私のシステムでは2つ)のパッケージが含まれているようです。

警告

上記の履歴ベースの方法では、明示的にインストールされたすべてのパッケージのみが一覧表示されます。システムの全ライフタイムにわたるパッケージ。後のトランザクションで削除されたパッケージのバランスは取れません。したがって、このメソッドは結果を手動でキュレートする必要があり、repoqueryが使用できないシステムでのみ使用する必要があります。

コメント

  • 両方の答えを最大限に活用するための良い方法です! ‘最終的な解決策とそれを行うためのさまざまな方法の素晴らしい比較ができれば、+ 1以上のものを提供します。

回答

古いバージョンのFedora(14)を使用しているため、yumには機能が少ないバージョンのyumですが、yum history機能を確認することをお勧めします。そのコマンドから、探している情報を取得できると思います。

履歴リスト

$ sudo yum history list Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 862 | System <unset> | 2013-07-12 18:00 | Install | 1 861 | System <unset> | 2013-07-09 03:11 | Install | 1 860 | System <unset> | 2013-07-01 13:40 | Install | 1 859 | System <unset> | 2013-06-29 22:07 | Install | 1 858 | System <unset> | 2013-06-25 22:33 | Install | 1 P< 857 | System <unset> | 2013-06-23 22:28 | Update | 1 >E 856 | System <unset> | 2013-06-23 21:33 | Install | 1 ... 

に戻ることができます。番号のリストをyum history listに渡すことによる最初のトランザクション:

$ sudo yum history list `seq 1 10` Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 10 | Sam M. (local) <saml> | 2010-12-18 23:23 | Install | 2 9 | Sam M. (local) <saml> | 2010-12-18 23:15 | Install | 38 8 | Sam M. (local) <saml> | 2010-12-18 23:12 | Install | 1 7 | Sam M. (local) <saml> | 2010-12-18 23:09 | Install | 1 < 6 | Sam M. (local) <saml> | 2010-12-18 22:37 | Install | 1 > 5 | Sam M. (local) <saml> | 2010-12-18 21:57 | Install | 1 4 | System <unset> | 2010-12-18 21:21 | Install | 5 3 | System <unset> | 2010-12-18 21:18 | Install | 4 2 | System <unset> | 2010-12-18 21:10 | Install | 3 1 | System <unset> | 2010-12-18 19:14 | Install | 1189 

履歴情報

以下は、最初のyumトランザクションの一部としてインストールされたものを示しています。

$ sudo yum history info 1 | less Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list Transaction ID : 1 Begin time : Sat Dec 18 19:14:05 2010 Begin rpmdb : 0:da39a3ee5e6b4b0d3255bfef95601890afd80709 End time : 19:42:43 2010 (1718 seconds) End rpmdb : 1189:8c21e9e377c3ebdee936916208f74232d5d6235f User : System <unset> Return-Code : Success Transaction performed with: Packages Altered: Dep-Install ConsoleKit-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-libs-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-x11-0.4.2-3.fc14.x86_64 Dep-Install GConf2-2.31.91-1.fc14.x86_64 Dep-Install GConf2-gtk-2.31.91-1.fc14.x86_64 Dep-Install ModemManager-0.4-4.git20100720.fc14.x86_64 Install NetworkManager-1:0.8.1-10.git20100831.fc14.x86_64 Dep-Install NetworkManager-glib-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-gnome-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-openconnect-0.8.1-1.fc14.x86_64 

yumがパッケージが明示的にインストールされたかインストールされたかを報告する方法に注意してください。依存関係によって必要でした。この情報を解析して、明示的にインストールされたパッケージのリストを取得できます。

コメント

  • I ‘ yum historyのアイデアに基づいて回答を追加しました。また、結果をrepoqueryベースの方法と比較します。 。副作用として、’レポクエリの回答を拡張しました。

回答

dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt 

コメント

  • ここで他の5つの回答を見ると、回答の違いに気づきましたか? なぜまたはどのようにあなたの答えが異なる方が良いかについての説明はまったくありません。これらのことをカバーする回答の説明を提供していただければ幸いです。
  • @StephenRauch、このコマンドは他の回答には含まれていません。’ ‘最近のdnfの追加だからです。 --userinstalledスイッチは5月にがdnfに追加されました。 ‘テストしたところ、正確な結果が得られました。 ‘実際にはユーザーがインストールしていないkernel / kernel-core / kernel-modulesパッケージをモジュロします。また、すべての*-debuginfoパッケージも含まれていますが、必要に応じて簡単に除外できます。
  • @maxschlepzig、フィードバックに感謝しますが、これは実際には少し修辞的な質問で、回答者にそのことを回答で説明するように教育/促そうとします。
  • @StephenRauch、十分に公平ですが、ある程度の編集は確かに適切であり、承認済みとしてマークすることができます。回答。

回答

インストールしたパッケージを一覧表示するには、 、こちらをお試しくださいワンライナー

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g"" 

結果:

# yum-userinstall yum install bind-utils yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install lsof yum install nano yum install nfs-utils libnfsidmap yum install nmap-ncat yum install openscap-scanner yum install open-vm-tools 

PS1:依存関係は表示されません

PS2:アルファベット順に並べ替えられます

PS3:後でパッケージを削除したかどうかは表示されません

回答

私がしたこと(詳細を忘れてしまったので、怠け者です…

インストールされているすべてのパッケージを取得します:rpm -qa > file

sed(1)を使用して、バージョン番号などを削除します(必要に応じてアーキテクチャを維持します)。これには、それを正しくするために数回繰り返すと、-[0-9.]-[0-9].fc23の最後の部分などを何も置き換えたくありませんが、面白いバージョンの「番号」もあります。

後通常どおりにインストールするには、yum -y install $(< file)(または必要に応じてdnf)を実行します。

フォールアウトが発生します存在しないパッケージのymore、名前の変更、または他の人に置き換えられました。

コメント

  • わかりました。ただし、これにより、以前にインストールされたすべてのパッケージがユーザーインストールとしてマークされます。宛先ホスト。元々は依存関係としてのみインストールされていたとしても。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です