web-dev-qa-db-ja.com

インストールされたパッケージ選択を1つのFedoraインスタンスから別のインスタンスに複製する方法は?

私は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の方法は何ですか?

16
maxschlepzig

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

デフォルトでは、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月頃)の場合、次の問題が関連します)。

Repoquery

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で機能することに注意してください。コマンドrepoquerydnf repoqueryに置き換えられたため、リリース23ではありません。そして dnf repoquery%{yumdb_info.reason}タグを理解しません。

12
maxschlepzig

最も簡単な方法であり、長期間にわたって機能します。

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>

...自分で解析する必要はありません。

6
James Antill

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が使用できないシステムでのみ使用する必要があります。

3
maxschlepzig

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

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

あなたがインストールしたパッケージを一覧表示するには、これを試してください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:後でパッケージを削除した場合は表示されません

0