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 dalamnya.
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 sejujurnya, saya sangat menginginkan metode yang lebih baik untuk memilih paket yang sama pada sistem Fedora 19 yang baru (B):Saya hanya ingin menginstal paket dari sistem A yang secara eksplisit disebutkan pada dnf install
(atau yum install
) baris perintah – dan bukan 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) dependensi yang diinstal secara otomatis yang tidak dibutuhkan (yaitu anak yatim) juga.
Saya telah menemukan dnf list installed
– tetapi tidak ditampilkan jika sebuah paket dipilih secara eksplisit atau hanya diinstal karena ketergantungan.
Bagaimana cara mendapatkan informasi itu di Fedora?
Apa cara Fedora/dnf untuk mereplikasi pilihan paket?
Jawaban yang Diterima:
Sejak Fedora 26, repoquery
Dnf dukungan subcommand 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, ini juga mencantumkan semua paket debuginfo. Grep tambahan dalam contoh di atas menyaringnya.
Untuk menginstal daftar pada host B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
Dengan versi Dnf terbaru (mis. Fedora>=23), database paket dapat ditanyakan untuk nama paket yang diinstal pengguna melalui 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
Secara default, dnf install
dibatalkan 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 lainnya ke dalam user-installed.py
yang juga mendukung distribusi lain.
riwayat pengguna terpasang
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 outputnya dan ia mencetak paket yang sepenuhnya memenuhi syarat (yaitu, termasuk informasi versi).
Batasan yang dipasang pengguna
Perhatikan bahwa penandaan paket sebagai terinstal pengguna memiliki beberapa batasan pada beberapa versi Fedora, untuk sistem Fedora era 23-ish (dari sekitar 2015-11) masalah berikut relevan):
- paket yang diinstal melalui GUI tidak disertakan
- paket yang diinstal melalui pengendali command-not-found tidak disertakan
- beberapa paket yang diinstal secara default (dengan anaconda) disertakan
Permintaan Ulang
Pada sistem Fedora yang lebih lama, tempat Dnf, API Dnf, dan dnf history userinstalled
tidak tersedia, seseorang dapat menggunakan repoquery sebagai gantinya, mis.:
$ 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 penginstal. ID pengguna penginstal tampaknya disimpan sebagai 4294967295 – sebagai alternatif, Anda dapat menulis sesuatu seperti ($3 == 0 || $3 == your-user-id)
.
Perhatikan bahwa perintah ini berfungsi pada Fedora hingga rilis 21 – tetapi mis. bukan pada rilis 23, karena perintah repoquery
diganti dengan dnf repoquery
. Dan dnf repoquery
tidak mengerti %{yumdb_info.reason}
tag.