Bagaimana cara mereplikasi pemilihan paket yang diinstal dari satu instance Fedora ke yang lain?

16

Saya memiliki sistem Fedora (A) di mana saya telah menginstal beberapa paket dari waktu ke waktu. Sekarang saya ingin menginstal Fedora di komputer lain (B) dan saya ingin menginstal paket yang sama di atasnya.

Dalam istilah Debian saya ingin mencapai sesuatu seperti ini:

$ dpkg --get-selections > pkg_sel_host_a  # on host_a
$ dpkg --set-selections < pkg_sel_host_a  # on host_b

Tapi jujur ​​saja, saya benar-benar ingin metode yang lebih baik untuk memilih paket yang sama pada sistem Fedora 19 baru (B): Saya hanya ingin menginstal paket dari sistem A yang secara eksplisit disebutkan pada dnf install(atauyum install ) baris perintah - dan tidak yang diinstal sebagai dependensi!

Mengapa? Karena mungkin dependensi telah berubah - dan saya tidak ingin menginstal dependensi yang sudah ketinggalan zaman pada sistem baru. Plus, ketika saya menghapus paket saya ingin menghapus (mungkin) maka dependensi yang tidak perlu diinstal secara otomatis (yaitu anak yatim) juga.

Saya telah menemukan dnf list installed - tetapi tidak ditampilkan jika suatu paket dipilih secara eksplisit atau baru diinstal karena ketergantungan.

Bagaimana saya mendapatkan informasi itu di Fedora?

Apa cara Fedora / dnf untuk mereplikasi pilihan paket?

maxschlepzig
sumber

Jawaban:

12

Sejak Fedora 26, dukungan repoquery sub- perintah Dnf memiliki opsi baru untuk mendaftar semua paket yang diinstal pengguna:

$ dnf repoquery --qf '%{name}' --userinstalled \
 | grep -v -- '-debuginfo$' \
 | grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst

Berbeda dengan metode lain, ia juga mencantumkan semua paket debuginfo. Grep tambahan dalam contoh di atas memfilternya.

Untuk menginstal daftar di host B:

$ < pkgs_a.lst xargs dnf -y install

API Dnf

Dengan versi Dnf terbaru (mis. Fedora> = 23), basis data paket dapat ditanyakan untuk nama paket yang diinstal pengguna melalui API Python Dnf:

$ 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

Secara default, dnf installbatalkan jika satu atau lebih paket tidak tersedia lagi. Atau, dnf dapat dipaksa untuk menginstal semua yang tersisa:

# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b

PS: Masukkan kode di atas dan lebih banyak lagi user-installed.pyyang juga mendukung distribusi lain.

riwayat pengguna diinstal

Pada Fedora 23 dan yang lebih baru, Dnf menyediakan

# dnf history userinstalled

perintah yang mencantumkan semua paket yang diinstal pengguna. Pada 2016-11, kegunaannya terbatas karena tidak ada cara untuk mengontrol hasilnya dan mencetak paket yang sepenuhnya memenuhi syarat (yaitu termasuk informasi versi).

Keterbatasan yang diinstal pengguna

Perhatikan bahwa penandaan paket sebagai yang diinstal oleh pengguna memiliki beberapa batasan pada beberapa versi Fedora, untuk sistem era Fedora 23-ish (mulai sekitar 2015-11) masalah berikut ini relevan):

Repoquery

Pada sistem Fedora yang lebih lama, di mana Dnf, API Dnf dan dnf history userinstalledtidak tersedia, seseorang dapat menggunakan repoquery sebagai gantinya, misalnya:

$ 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

Kondisi awk kedua digunakan untuk mengecualikan paket yang diinstal oleh installer. User-id installer tampaknya disimpan sebagai 4294967295 - atau Anda dapat menulis sesuatu seperti itu ($3 == 0 || $3 == your-user-id).

Perhatikan bahwa perintah ini berfungsi pada Fedora hingga rilis 21 - tetapi mis. Tidak pada rilis 23, karena perintah repoquerydiganti dengan dnf repoquery. Dan dnf repoquerytidak mengerti %{yumdb_info.reason}tag.

maxschlepzig
sumber
Saya tidak yakin apakah pendekatan ini akan mendapatkan semuanya, saya perhatikan ini di sistem saya ketika saya berlari repoquery ...: "querytag yumdb tidak valid 'alasan' untuk pkg terpasang: HandBrake-cli-0.9.5-1.fc14.x86_64"
slm
@slm, hm, dari repositori apa rem tangan diinstal? Mungkin pengaturan repositori ada hubungannya dengan itu?
maxschlepzig
Saya pikir itu mungkin RPM mandiri yang saya instal menggunakan yum localinstall .... Saya punya cukup banyak paket yang jatuh ke kamp itu.
slm
repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -lmengembalikan 90 paket.
slm
6

Cara termudah, dan itu berhasil untuk waktu yang lama adalah:

yum-debug-dump => gives file.

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

... yang berfungsi seperti perintah get / set dpkg, AIUI. Perhatikan juga bahwa jika Anda memutar ulang riwayat, Anda dapat menggunakan:

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

... Daripada harus mengurai sendiri.

James Antill
sumber
3

Terinspirasi oleh jawaban slm , saya telah datang dengan solusi berbasis berikut :yum history

Dapatkan semua riwayat terperinci tentang semua transaksi pemasangan yum (mis. Tidak ada peningkatan), tidak termasuk yang dieksekusi sebagai bagian dari tindakan pemasang awal (transaksi 1 dan 2 pada sistem saya, dikaitkan dengan pengguna 'Sistem'):

$ yum history list all | awk -F'|' \
                            '$4 ~ /Install/ && $2 !~ /System/ {print $1}' \
    | xargs yum history info > yum_history

Saring paket yang diinstal secara eksplisit dan memotong awalan versi.

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

Ekspresi reguler yang jelek diperlukan agar semua jenis sufiks versi cocok.

Hasilnya terlihat cukup baik di sistem saya.

Perbandingan dengan ansatz repoquery (di sistem saya):

paket metode #
―――――――――――――――――――――――――
repoquery 569
repoquery-2nd 216
sejarah yum 214

(Saya menyalurkan hasil repoquery melalui sort -u)

Mengapa ada perbedaan? Karena repoquery mencakup semua paket dari transaksi 1 dan 2, yaitu semua paket yang diinstal oleh installer Fedora. Ini menjelaskan mengapa repoquery menyertakan paket-paket yang disebutkan xorg-x11- drv-mga dan teman-teman.

Membandingkan repoquery-2nd dan yum-history menunjukkan bahwa repoquery-2nd lebih akurat - tidak termasuk beberapa paket yang sudah dihapus. Selain itu termasuk beberapa (2 pada sistem saya) paket dari operasi 'pembaruan yum', tampaknya.

Peringatan

Metode berbasis sejarah di atas hanya mencantumkan semua paket yang diinstal secara eksplisit selama masa hidup lengkap sistem. Itu tidak mengimbangi paket-paket yang dihapus dalam transaksi nanti. Dengan demikian, metode ini membutuhkan beberapa kurasi manual dari hasil dan hanya boleh digunakan pada sistem yang repoquerytidak tersedia.

maxschlepzig
sumber
Cara yang baik untuk mengambil yang terbaik dari kedua jawaban kami! Saya akan memberi Anda lebih dari +1 jika saya bisa untuk solusi akhirnya + perbandingan yang bagus dari berbagai cara untuk melakukannya.
slm
2

Saya memiliki versi yang lebih lama dari Fedora (14) sehingga yum saya menyertakan versi yang kurang kaya fitur yum, tetapi Anda mungkin ingin melihat yum historyfitur tersebut. Saya yakin Anda bisa mendapatkan info yang Anda cari dari perintah itu.

daftar sejarah

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

Anda dapat kembali ke transaksi pertama dengan memberikan daftar nomor ke 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

info sejarah

Berikut ini akan menunjukkan kepada Anda apa yang diinstal sebagai bagian dari transaksi yum pertama:

$ 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

Perhatikan bagaimana Anda melaporkan apakah suatu paket secara eksplisit diinstal atau diinstal karena dibutuhkan oleh dependensi. Anda dapat menguraikan info ini dan mendapatkan daftar paket yang diinstal secara eksplisit.

slm
sumber
Saya telah menambahkan jawaban berdasarkan yum historyide Anda , itu juga membandingkan hasilnya dengan repoquerymetode berbasis. Sebagai efek samping saya telah memperluas jawaban repoquery saya.
maxschlepzig
1
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Flo
sumber
1
Ketika Anda melihat ke 5 jawaban lainnya di sini, apa yang Anda perhatikan berbeda dari jawaban Anda? Sama sekali tidak ada penjelasan mengapa atau bagaimana jawaban Anda lebih baik berbeda. Akan lebih baik jika Anda bisa memberikan beberapa deskripsi jawaban Anda yang mencakup hal-hal ini.
Stephen Rauch
@StephenRauch, perintah ini tidak termasuk dalam jawaban lain, karena ini merupakan tambahan dnf baru-baru ini. The --userinstalledsaklar hanya ditambahkan ke DNF Mei . Saya sudah mengujinya, dan memberikan hasil yang akurat. Modulo paket kernel / kernel-inti / modul-kernel yang tidak benar-benar diinstal pengguna. Ini juga berisi semua *-debuginfopaket - tetapi mereka dapat dengan mudah disaring, jika perlu.
maxschlepzig
@maxschlepzig, terima kasih atas umpan baliknya, tapi ini sebenarnya sedikit pertanyaan retoris, mencoba mendidik / mendorong penjawab untuk menjelaskan hal itu dalam jawaban.
Stephen Rauch
@StephenRauch, cukup adil, beberapa penyuntingan tentu akan sesuai dan akan memungkinkan saya untuk menandainya sebagai jawaban yang diterima.
maxschlepzig
0

Untuk mencantumkan paket yang telah Anda instal, coba one-liner ini :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e 's/command_line = (.*)/yum \1/g'"

Hasil:

# 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: tidak menunjukkan dependensi

PS2: disortir berdasarkan abjad

PS3: itu tidak muncul jika Anda telah menghapus paket nanti

Fernando Fabreti
sumber
-1

Apa yang saya lakukan (lupa detailnya, dan saya gelandangan malas, jadi ...

Dapatkan semua paket yang diinstal: rpm -qa > file

Gunakan sed(1)untuk menyingkirkan nomor versi dan semacamnya (pertahankan arsitektur, jika diperlukan). Ini membutuhkan beberapa iterasi untuk memperbaikinya, Anda ingin mengganti bentangan terakhir -[0-9.]-[0-9].fc23atau serupa dengan tidak ada, tetapi ada juga versi "angka" yang lucu.

Setelah menginstal seperti biasa, lakukan yum -y install $(< file)(atau dnf, sesuai kebutuhan).

Anda akan mendapatkan beberapa paket kejatuhan yang tidak ada lagi, atau berganti nama, atau digantikan oleh yang lain.

vonbrand
sumber
Oke, tetapi ini akan menandai semua paket yang diinstal sebelumnya sebagai yang diinput-pengguna pada host tujuan. Bahkan jika mereka awalnya hanya diinstal sebagai dependensi.
maxschlepzig