私はいくつかのパッケージをインストールした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}
。