Ho un sistema Fedora (A) in cui ho installato alcuni pacchetti nel tempo. Ora voglio installare Fedora su un altro computer (B) e voglio installare gli stessi pacchetti su di esso.
In termini Debian voglio realizzare qualcosa del genere:
$ dpkg --get-selections > pkg_sel_host_a # on host_a
$ dpkg --set-selections < pkg_sel_host_a # on host_b
Ma ad essere onesto, voglio davvero un metodo migliore per selezionare gli stessi pacchetti sul nuovo sistema Fedora 19 (B):voglio solo installare i pacchetti dal sistema A che sono stati esplicitamente menzionati su un dnf install
(o yum install
) riga di comando – e non quelli che sono stati installati come dipendenze!
Come mai? Perché forse le dipendenze sono cambiate e non voglio installare dipendenze obsolete sul nuovo sistema. Inoltre, quando rimuovo i pacchetti, voglio rimuovere anche le (possibilmente) dipendenze installate automaticamente non necessarie (cioè orfane).
Ho trovato dnf list installed
– ma non viene visualizzato se un pacchetto è stato selezionato in modo esplicito o semplicemente installato a causa di una dipendenza.
Come ottengo queste informazioni su Fedora?
Qual è il modo Fedora/dnf per replicare le selezioni dei pacchetti?
Risposta accettata:
Da Fedora 26, il Dnf repoquery
Subcommand Supports ha una nuova opzione per elencare tutti i pacchetti installati dall'utente:
$ dnf repoquery --qf '%{name}' --userinstalled
| grep -v -- '-debuginfo$'
| grep -v '^(kernel-modules|kernel|kernel-core|kernel-devel)$' > pkgs_a.lst
A differenza di altri metodi, elenca anche tutti i pacchetti debuginfo. Il grep aggiuntivo nell'esempio sopra li filtra.
Per installare l'elenco sull'host B:
$ < pkgs_a.lst xargs dnf -y install
API DNF
Con le versioni Dnf recenti (ad es. Fedora>=23), è possibile eseguire query sul database dei pacchetti per i nomi dei pacchetti installati dall'utente tramite l'API Dnf Python:
$ 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
Per impostazione predefinita, dnf install
si interrompe se uno o più pacchetti non sono più disponibili. In alternativa, dnf può essere forzato a installare tutti quelli rimanenti:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Inserisci il codice sopra e altro in user-installed.py
che supporta anche altre distribuzioni.
cronologia utente installati
Su Fedora 23 e versioni successive, Dnf fornisce il
# dnf history userinstalled
comando che elenca tutti i pacchetti installati dall'utente. A partire dal 2016-11, la sua utilità è limitata perché non c'è modo di controllarne l'output e stampa pacchetti completamente qualificati (ovvero includendo le informazioni sulla versione).
Limitazioni installate dall'utente
Nota che il contrassegno dei pacchetti come installati dall'utente ha alcune limitazioni su alcune versioni di Fedora, per i sistemi dell'era Fedora 23-ish (dal 2015-11 circa) i seguenti problemi sono rilevanti):
- I pacchetti installati tramite la GUI non sono inclusi
- I pacchetti installati tramite il gestore command-not-found non sono inclusi
- sono inclusi alcuni pacchetti installati di default (da anaconda)
Recupero
Sui vecchi sistemi Fedora, dove Dnf, l'API Dnf e dnf history userinstalled
non sono disponibili, è invece possibile utilizzare repoquery, ad es.:
$ 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
La seconda condizione awk viene utilizzata per escludere i pacchetti installati dal programma di installazione. L'ID utente del programma di installazione è stato apparentemente memorizzato come 4294967295 – in alternativa puoi scrivere qualcosa come ($3 == 0 || $3 == your-user-id)
.
Nota che questo comando funziona su Fedora fino al rilascio 21, ma ad es. non nella versione 23, perché il comando repoquery
è stato sostituito con dnf repoquery
. E dnf repoquery
non comprende il %{yumdb_info.reason}
tag.