あるFedoraインスタンスから別のインストール済みパッケージを複製する方法は?


16

私は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)で同じパッケージを選択するより良い方法が本当に欲しいです:(dnf installまたはyum install)コマンドラインで明示的に言及されたシステムAからパッケージをインストールしたいだけです。 依存関係としてインストールされたもの!

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

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

Fedoraでその情報を取得するにはどうすればよいですか?

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

回答:


12

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 Python APIを介してパッケージデータベースにユーザーがインストールしたパッケージ名を照会できます。

$ 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

デフォルトでは、dnf install1つ以上のパッケージが利用できなくなった場合、中止します。または、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-ish時代のシステム(2015年11月頃から)には、次の問題が関連しています)。

レポクエリ

Dnf、Dnf API dnf history userinstalledが利用できない古いFedoraシステムでは、代わりに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として保存されていました-あるいは、のようなものを書くことができます($3 == 0 || $3 == your-user-id)

このコマンドはFedoraでリリース21まで動作しますが、たとえば、コマンドrepoqueryがに置き換えられたため、リリース23では動作しないことに注意してくださいdnf repoquery。そしてdnf repoquery%{yumdb_info.reason}タグを理解していません。


このアプローチですべてが得られるかどうかはrepoquery ...わかりませんが、実行時にシステムでこれらに気付きました。「インストールされたpkgのyumdb querytag 'reason'が無効です:HandBrake-cli-0.9.5-1.fc14.x86_64」
slm

@ slm、hm、ハンドブレーキはどのリポジトリからインストールされましたか?おそらく、リポジトリのセットアップに何か関係があるのでしょうか?
maxschlepzig

を使用してインストールしたスタンドアロンRPMであった可能性がありますyum localinstall ...。私はそのキャンプに落ちたパッケージのかなりの量を持っていました。
slm

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l90個のパッケージを返しました。
slm

6

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

yum-debug-dump => gives file.

yum-debug-restore <file-from-debug-dump>

...これは、get / set selections dpkgコマンド、AIUIとよく似ています。また、履歴を再生する場合は、次を使用できることに注意してください。

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

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


3

slm答えに触発され、私は次のようなyum history解決策を思いつきました。

すべてのyumインストールトランザクションに関するすべての詳細な履歴を取得します(つまり、アップグレードなし)。ただし、最初のインストーラーアクションの一部として実行されたもの(ユーザー 'System'に起因するシステム上のトランザクション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の仮説との比較(私のシステム上):

メソッド#パッケージ
―――――――――――――――――――――――――――
レポクエリ569
repoquery-2nd 216
ヤムの歴史214

(ソート-uを使用してrepoqueryの結果をパイプしました)

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

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

警告

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


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

2

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がどのように報告するかに注目してください。この情報を解析して、明示的にインストールされたパッケージのリストを取得できます。


私はあなたのyum history考えに基づいて答えを追加しましたrepoquery。また、結果をベースの方法と比較します。副作用として、repoqueryの回答を拡張しました。
maxschlepzig

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

1
ここで他の5つの答えを見ると、あなたの答えの違いは何ですか?なぜあなたの答えが違うのどのように違うのについての説明は全くありません。これらのことをカバーする回答の説明を提供していただければ幸いです。
スティーブンラウフ

@StephenRauch、このコマンドは最近のdnfの追加であるため、他の回答には含まれていません。--userinstalledスイッチはちょうどれた月にDNFに加えます。私はそれをテストしましたが、正確な結果が得られます。実際にユーザーがインストールしていないkernel / kernel-core / kernel-modulesパッケージをモジュロします。また、すべての*-debuginfoパッケージも含まれていますが、必要に応じて簡単に除外できます。
maxschlepzig

@maxschlepzig、フィードバックに感謝しますが、これは実際には修辞的な質問であり、回答者にそれを説明で説明するように教育/促そうとしました。
スティーブンラウチ

@StephenRauch、かなり公平なことですが、いくつかの編集は確かに適切であり、受け入れられた回答としてマークすることができます。
maxschlepzig

0

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

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:後でパッケージを削除した場合は表示されません


-1

私がやったこと(詳細を忘れて、私は怠け者だから...

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

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

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

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


わかりましたが、これにより、以前にインストールされたすべてのパッケージが、宛先ホスト上でユーザーインストール済みとしてマークされます。元々依存関係としてのみインストールされていたとしても。
maxschlepzig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.