1つのFedoraインスタンスから別のインスタンスとしてインストールされたパッケージ選択をどのようにコピーしますか?

1つのFedoraインスタンスから別のインスタンスとしてインストールされたパッケージ選択をどのようにコピーしますか?

私はいくつかのパッケージをインストールしたFedoraシステム(A)を持っています。別のコンピュータ(B)にFedoraをインストールし、そのコンピュータに同じパッケージをインストールしようとしています。

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でインストールされているもの!

なぜ?依存関係が変更された可能性があるため、新しいシステムに古い依存関係をインストールしたくありません。また、パッケージをアンインストールするときに不要な、自動的にインストールされた依存関係(孤児など)も削除したいと思います。

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

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

Fedora / dnfのパッケージ選択コピー方法は何ですか?

答え1

Fedora 26からDNFrepoquery サブコマンドのサポートユーザーがインストールしたすべてのパッケージを一覧表示する新しいオプションがあります。

$ 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

ダンジョン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

添付:上記のコードなどuser-installed.py他のディストリビューションもサポートしています。

過去のユーザーのインストール

Fedora 23以降では、Dnfは以下を提供します。

# dnf history userinstalled

ユーザーがインストールしたすべてのパッケージを一覧表示するコマンド。 2016年11月現在、限られた有用性これは、出力を制御する方法がなく、完全なパッケージ(バージョン情報など)を印刷するためです。

ユーザーインストールの制限

パッケージをユーザーインストールとしてマークするには、特定のFedoraバージョンにいくつかの制限があります。 Fedora 23時代(2015年11月頃から始まる)システムでは、次の質問が含まれます。

また探して

以前の Fedora システムでは Dnf、Dnf API をdnf history userinstalled使用できません。また探して代わりに、たとえば次のようになります。

$ 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)

このコマンドは、バージョン21より前のFedoraでは機能しますが、バージョン23では機能しません。たとえば、コマンドがおよびrepoqueryに変わったためですdnf repoquerydnf repoqueryラベルがわかりません%{yumdb_info.reason}

答え2

最も簡単で効果的な方法は次のとおりです。

yum-debug-dump => gives file.

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

... get / set select dpkgコマンドAIUIと非常によく似ています。また、記録を再生するには、次のものを使用できます。

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

...直接解析する必要なしにです。

答え3

からインスピレーションを受ける持続可能な開発管理~の回答yum history私は以下に基づいて次の解決策を思いつきました。

最初のインストーラ操作の一部として実行されたトランザクション(私のシステムのトランザクション1と2、ユーザー「system」に帰属)を除いて、すべてのyumインストールトランザクション(つまりアップグレードなし)のすべての詳細履歴を取得します。

$ 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

さまざまなバージョンのサフィックスに一致する醜い正規表現が必要です。

結果は私のシステムではかなり良く見えます。

そしてまた探してansatz(私のシステムから):

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

(sort -uを介してrepoquery結果をパイプします)

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

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

警告する

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

答え4

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

関連情報