私は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
)コマンドライン-依存関係としてインストールされたものではありません!
どうして?おそらく依存関係が変更されたためです-そして、新しいシステムに古い依存関係をインストールしたくありません。さらに、パッケージを削除するときに、(おそらく)自動インストールされた不要な依存関係(つまり、孤立したもの)も削除したいと思います。
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バージョン(例: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
デフォルトでは、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バージョンでいくつかの制限があります。Fedora23時代のシステム(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)
のようなものを書くこともできます。
このコマンドはリリース21までのFedoraで機能することに注意してください。コマンドrepoquery
がdnf repoquery
に置き換えられたため、リリース23ではありません。そして dnf repoquery
は%{yumdb_info.reason}
タグを理解しません。
最も簡単な方法であり、長期間にわたって機能します。
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>
...自分で解析する必要はありません。
slm 's 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(私のシステム上)との比較:
方法#パッケージ ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yumの履歴214
(repoqueryの結果をsort -uでパイプしました)
なぜ違いがあるのですか? repoqueryにはトランザクション1と2のすべてのパッケージが含まれているため、Fedoraインストーラーによってインストールされたすべてのパッケージです。これが、repoqueryが上記のパッケージxorg-x11-drv-mgaとその仲間を含む理由を説明しています。
Repoquery-2ndとyum-historyを比較すると、repoquery-2ndの方が正確であることがわかります。これには、すでに削除されているパッケージが含まれていません。さらに、「yum update」操作からのいくつかのパッケージ(私のシステムでは2つ)が含まれているようです。
上記の履歴ベースの方法では、システムの全寿命にわたって明示的にインストールされたすべてのパッケージのみが一覧表示されます。後のトランザクションで削除されたパッケージのバランスは取りません。したがって、この方法では結果を手動で整理する必要があるため、repoquery
が使用できないシステムでのみ使用する必要があります。
古いバージョンの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がパッケージが明示的にインストールされたか、またはインストールされたかを報告する方法に注意してください。この情報を解析して、明示的にインストールされたパッケージのリストを取得できます。
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
あなたがインストールしたパッケージを一覧表示するには、これを試してくださいone-liner:
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:後でパッケージを削除した場合は表示されません