Ho un sistema Fedora (A) dove 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 una riga di comando dnf install
(o yum install
) e non su quelle installate come dipendenze!
Perché? Perché forse le dipendenze sono cambiate – e non voglio installare dipendenze obsolete sul nuovo sistema. Inoltre, quando rimuovo i pacchetti voglio rimuovere anche le dipendenze (possibilmente) allora non necessarie installate automaticamente (cioè orfane).
Ho trovato dnf list installed
– ma non viene visualizzato se un pacchetto è stato selezionato esplicitamente o è stato semplicemente installato a causa di una dipendenza.
Come faccio a ottenere queste informazioni su Fedora?
Qual è il modo Fedora / dnf per replicare le selezioni dei pacchetti?
Risposta
A partire da Fedora 26, il sottocomando Dnf repoquery
supporta ha una nuova opzione per elencare tutti i pacchetti installati dallutente:
$ 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 nellesempio precedente li filtra.
Per installare lelenco sullhost B:
$ < pkgs_a.lst xargs dnf -y install
API Dnf
Con le recenti versioni Dnf (ad es. Fedora> = 23), il database dei pacchetti può essere interrogato per i nomi dei pacchetti installati dallutente tramite lAPI 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 per installare tutti i rimanenti:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Inserisci il codice precedente e altro in user-installed.py
che supporta anche altre distribuzioni.
cronologia installata dallutente
Su Fedora 23 e versioni successive, Dnf fornisce il comando
# dnf history userinstalled
che elenca tutti i pacchetti installati dagli utenti. A partire dal 2016-11 , la sua utilità è limitata perché non è possibile controlla il suo output e stampa i pacchetti completamente qualificati (es. incluse le informazioni sulla versione).
Limitazioni installate dallutente
Notare che il contrassegno dei pacchetti come installati dallutente ha alcune limitazioni su alcune versioni di Fedora, per i sistemi Fedora dellera 23 (dal 2015 circa -11) 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
- alcuni pacchetti installati di default (da anaconda) sono inclusi
Repoquery
Sui vecchi sistemi Fedora, dove Dnf, lAPI Dnf e dnf history userinstalled
non sono disponibili, è possibile utilizzare repoquery , ad esempio:
$ 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 è usata per escludere i pacchetti che sono stati installati dallinstallatore. Lid utente dellinstallatore era apparentemente memorizzato come 4294967295 – in alternativa puoi scrivere qualcosa come
.
Nota che questo comando funziona su Fedora fino alla versione 21, ma ad es. non nella versione 23, perché il comando repoquery
è stato sostituito con dnf repoquery
. E dnf repoquery
non comprende il tag %{yumdb_info.reason}
.
Commenti
Risposta
Il modo più semplice e ha funzionato a lungo è:
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
… che funziona in modo molto simile al comando get / set selections dpkg, AIUI.Tieni inoltre presente che se stai riproducendo la cronologia puoi utilizzare:
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… invece di doverla analizzare da solo.
Risposta
Ispirato da slm “s answer Ho trovato la seguente soluzione basata su yum history
:
Ottieni tutta la cronologia dettagliata di tutte le transazioni di installazione yum (cioè nessun aggiornamento) , esclusi quelli eseguiti come parte delle azioni iniziali del programma di installazione (transazioni 1 e 2 sul mio sistema, attribuite allutente “System”):
$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history
Filtra i pacchetti installati esplicitamente e taglia i prefissi di versione.
$ < 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
La brutta espressione regolare è necessaria in modo tale che tutti i tipi di suffissi di versione siano abbinati.
I risultati sembra abbastanza a posto sul mio sistema.
Un confronto con il repoquery ansatz (sul mio sistema):
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(Ho trasmesso i risultati del repoquery tramite ugh sort -u)
Perché ci sono differenze? Perché repoquery include tutti i pacchetti delle transazioni 1 e 2, cioè tutti i pacchetti che sono stati installati dallinstaller di Fedora. Questo spiega perché repoquery include i pacchetti menzionati xorg-x11- drv-mga e amici.
Il confronto di repoquery-2nd e yum-history mostra che repoquery-2nd è più accurato – non include alcuni pacchetti già rimossi . Inoltre include alcuni (2 sul mio sistema) pacchetti dalle operazioni “yum update”, a quanto pare.
Avvertenza
Il metodo basato sulla cronologia di cui sopra elenca solo tutti esplicitamente installati pacchetti per lintera durata del sistema. Non bilancia quei pacchetti che sono stati rimossi in una transazione successiva. Pertanto, questo metodo richiede una cura manuale dei risultati e dovrebbe essere utilizzato solo su sistemi in cui repoquery
non è disponibile.
Commenti
- Bel modo di prendere il meglio da entrambe le nostre risposte! ‘ ti darei più di un +1 se potessi per leventuale soluzione + il bel confronto dei vari modi per farlo.
Risposta
Ho una versione precedente di Fedora (14) quindi il mio yum include una versione meno ricca di funzionalità di yum
, ma potresti voler dare unocchiata alla funzione yum history
. Credo che tu possa ottenere le informazioni che stai cercando da quel comando.
elenco cronologia
$ 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 ...
Puoi tornare al prima transazione passando un elenco di numeri a 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
informazioni sulla cronologia
Quanto segue ti mostrerà cosa è stato installato come parte della prima transazione 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
Nota come yum segnala se un pacchetto è stato installato o installato esplicitamente perché era necessario per una dipendenza. Puoi analizzare queste informazioni e ottenere lelenco dei pacchetti che sono stati installati in modo esplicito.
Commenti
- I ‘ ho aggiunto una risposta basata sulla tua idea
yum history
, inoltre confronta i risultati con il metodo basato surepoquery
. Come effetto collaterale, ‘ ho esteso la mia risposta del repository.
Risposta
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Commenti
- Mentre esamini le altre 5 risposte qui, cosa noti di diverso nella tua risposta? Non cè assolutamente alcuna spiegazione del perché o come la tua risposta è migliore o diversa. Sarebbe utile se potessi fornire una descrizione della tua risposta che copre queste cose.
- @StephenRauch, questo comando non è ‘ t incluso nelle altre risposte, perché ‘ è unaggiunta dnf recente. Lopzione
--userinstalled
è stata appena aggiunta a dnf a maggio . Lho ‘ testato e fornisce risultati accurati. Modulo i pacchetti kernel / kernel-core / kernel-modules che non sono ‘ realmente installati dallutente. Contiene anche tutti i pacchetti*-debuginfo
, ma possono essere facilmente filtrati, se necessario. - @maxschlepzig, grazie per il feedback, ma in realtà era un un po una domanda retorica, cercando di educare / spingere chi ha risposto a spiegarlo nella risposta.
- @StephenRauch, abbastanza giusto, alcune modifiche sarebbero certamente appropriate e mi permetterebbero di contrassegnarlo come accettato risposta.
Risposta
Per elencare i pacchetti che hai installato, prova questo one-liner :
alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g""
Risultato:
# 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: non mostra le dipendenze
PS2: è ordinata alfabeticamente
PS3: non mostra se hai rimosso il pacchetto in seguito
Risposta
Cosa ho fatto (ho dimenticato i dettagli e sono “un fannullone, quindi …
Ottieni tutti i pacchetti installati: rpm -qa > file
Utilizza sed(1)
per eliminare i numeri di versione e simili (mantieni larchitettura, se necessario). Ciò richiedeva un poche iterazioni per farlo bene, vuoi sostituire lultimo tratto di -[0-9.]-[0-9].fc23
o simili con niente, ma ci sono anche divertenti “numeri” di versione.
Dopo installando normalmente, esegui un yum -y install $(< file)
(o dnf
, come richiesto).
Otterrai qualche ricaduta di pacchetti che non esistono in ymore, o cambiato nome, o sono stati sostituiti da altri.
Commenti
- Ok, ma questo segnerà tutti i pacchetti precedentemente installati come installati dallutente su lhost di destinazione. Anche se originariamente erano stati installati solo come dipendenza.
repoquery ...
: ” tag query yumdb non valido ‘ motivo ‘ per il pacchetto installato: HandBrake-cli-0.9.5-1.fc14.x86_64 ”yum localinstall ...
. Tuttavia avevo una discreta quantità di pacchetti che rientravano in quel campo.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
ha restituito 90 pacchetti.