私はいくつかのパッケージをインストールした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 install
1つ以上のパッケージが使用できなくなった場合は中止します。または、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月頃から始まる)システムでは、次の質問が含まれます。
- インストール済みパッケージGUIを介して含まれない
- インストール済みパッケージ転送コマンドが見つかりませんハンドラが含まれていません。
- 既定でインストールされているいくつかのソフトウェアパッケージ(anacondaが提供)含まれる
また探して
以前の 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 repoquery
。dnf 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