Jag har ett Fedora-system (A) där jag har installerat några paket över tiden. Nu vill jag installera Fedora på en annan dator (B) och jag vill installera samma paket på den.
I Debian-termer vill jag åstadkomma något så här:
$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b
Men för att vara ärlig vill jag verkligen ha en bättre metod för att välja samma paket på det nya Fedora 19-systemet (B): Jag vill bara installera paketen från system A som nämnts uttryckligen på en dnf install
(eller yum install
) kommandorad – och inte de som installerades som beroenden!
Varför? Eftersom beroenden kanske har förändrats – och jag vill inte installera föråldrade beroenden på det nya systemet. Dessutom när jag tar bort paket vill jag ta bort (eventuellt) då onödiga automatiskt installerade beroenden (dvs. föräldralösa) också.
Jag har hittat dnf list installed
– men det visas inte om ett paket uttryckligen valdes eller bara installerades på grund av ett beroende.
Hur gör jag få den informationen om Fedora?
Vad är Fedora / dnf-sättet att replikera paketval?
Svar
Sedan Fedora 26 har Dnf repoquery
underkommandot ett nytt alternativ för att lista alla användarinstallerade paket:
$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst
Till skillnad från andra metoder listas också alla debuginfo-paket. Den extra grep i exemplet ovan filtrerar bort dem.
Så här installerar du listan på värd B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
Med senaste Dnf-versioner (t.ex. Fedora> = 23) kan paketdatabasen förfrågas för användarinstallerade paketnamn via 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
Som standard avbryts dnf install
om ett eller flera paket inte längre finns tillgängliga. Alternativt kan dnf tvingas för att installera alla återstående:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Lägg ovanstående kod och mer till user-installed.py
som också stöder andra distributioner.
historikanvändare installerad
På Fedora 23 och senare tillhandahåller Dnf kommandot
# dnf history userinstalled
som visar alla användarinstallerade paket. Från och med 2016-11 , dess användbarhet är begränsad eftersom det inte finns något sätt att styra dess utdata och skriva ut paket fullt kvalificerade (dvs. inklusive versioninformation).
användarinstallerade begränsningar
Observera att markeringen av paket som användarinstallerade har vissa begränsningar för vissa Fedora-versioner för Fedora 23-ish era-system (från omkring 2015 -11) följande frågor är relevanta):
- paket installerade via GUI ingår inte
- paket installerade via kommandot som inte hittades ingår inte
- vissa paket installerade som standard (av anaconda) ingår
Repoquery
På äldre Fedora-system, där Dnf, Dnf API och dnf history userinstalled
är inte tillgängliga, man kan använda repoquery istället, t.ex.:
$ 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
Det andra awk-villkoret används för att utesluta paket som installerats av installationsprogrammet. Installatörens användar-ID sparades tydligen som 4294967295 – alternativt kan du skriva något som
.
Observera att detta kommando fungerar på Fedora upp till släpp 21 – men t.ex. inte vid release 23, eftersom kommandot repoquery
ersattes med dnf repoquery
. Och dnf repoquery
förstår inte taggen %{yumdb_info.reason}
.
Kommentarer
Svar
Det enklaste sättet och det fungerade länge är:
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
… som fungerar ungefär som kommandot get / set dpkg, AIUI.Observera också att om du spelar om historik kan du använda:
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… istället för att behöva analysera det själv.
Svar
Inspirerad av slm ”s svar Jag har kommit med följande yum history
-baserad lösning:
Få all detaljerad historik om alla yuminstallationer (dvs. inga uppgraderingar) , exklusive de som utförs som en del av de första installationsåtgärderna (transaktion 1 och 2 på mitt system, tillskriven användaren ”System”):
$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history
Filtrera uttryckligen installerade paket och klippa av versionprefix.
$ < 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
Det fula reguljära uttrycket behövs så att alla slags versionssuffix matchas.
Resultaten ser ganska bra ut på mitt system.
En jämförelse mot repoquery ansatz (på mitt system):
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(jag pipade repoquery-resultaten genom ugh sort -u)
Varför finns det skillnader? Eftersom repoquery inkluderar alla paket från transaktion 1 och 2, dvs. alla paket som installerades av Fedora-installationsprogrammet. Detta förklarar varför repoquery innehåller de nämnda paketen xorg-x11- drv-mga och vänner.
Jämförelse av repoquery-2nd och yum-history visar att repoquery-2nd är mer exakt – det innehåller inte några redan borttagna paket . Dessutom innehåller det några (2 på mitt system) paket från ”yum update” -operationer, verkar det.
Varning
Ovanstående historikbaserade metod listar bara alla uttryckligen installerade paket under hela systemets livstid. Det balanserar inte de paket som togs bort i en senare transaktion. Den här metoden kräver alltså manuell sammanställning av resultaten och bör endast användas på system om repoquery
inte är tillgängligt.
Kommentarer
Svar
Jag har en äldre version av Fedora (14) så min yum innehåller en mindre funktionsrik version av yum
, men du kanske vill ta en titt på yum history
-funktionen. Jag tror att du kan få den information du letar efter från det kommandot.
historiklista
$ 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 ...
Du kan gå tillbaka till allra första transaktionen genom att skicka en lista med siffror till 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
historikinformation
Följande visar vad som installerades som en del av den första yumtransaktionen:
$ 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
Lägg märke till hur yum rapporterar om ett paket uttryckligen installerades eller installerades eftersom det behövdes av ett beroende. Du kan analysera denna information och få din lista över paket som uttryckligen installerats.
Kommentarer
- I ’ har lagt till ett svar baserat på din
yum history
idé, det jämför också resultaten med denrepoquery
-baserade metoden . Som en bieffekt har jag ’ utökat mitt repoquery-svar.
Svar
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Kommentarer
- När du tittar på de andra 5 svaren här, vad märker du som skiljer sig åt ditt svar? Det finns absolut ingen förklaring till varför eller hur ditt svar är bättre än olika. Det vore bra om du kunde ge en beskrivning av ditt svar som täcker dessa saker.
- @StephenRauch, det här kommandot ingår inte ’ i de andra svaren, eftersom det ’ är ett nytt dnf-tillägg.
--userinstalled
-omkopplaren lades bara till till dnf i maj . Jag ’ har testat det och det ger korrekta resultat. Modulera paketet kernel / kernel-core / kernel-modules som inte är ’ inte riktigt användarinstallerade. Den innehåller också alla*-debuginfo
paket – men de kan enkelt filtreras bort, om det behövs. - @maxschlepzig, tack för återkopplingen, men detta var faktiskt en lite av en retorisk fråga, som försöker utbilda / uppmana svararen att förklara det i svaret.
- @StephenRauch, rättvis nog, viss redigering skulle verkligen vara lämplig och skulle tillåta mig att markera den som accepterad svar.
Svar
För att lista paket du har installerat, prova detta one-liner :
alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g""
Resultat:
# 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: det visar inte beroenden
PS2: det sorteras alfabetiskt
PS3: det visar inte om du har tagit bort paketet senare
Svar
Vad jag gjorde (glömde detaljerna, och jag ”lazy bum, så …
Skaffa alla installerade paket: rpm -qa > file
Använd sed(1)
för att bli av med versionsnummer och sådant (behåll arkitekturen om det behövs). några iterationer för att få rätt, vill du ersätta den sista sträckan av -[0-9.]-[0-9].fc23
eller liknande med ingenting, men det finns roliga version ”siffror” också.
Efter installera som vanligt, gör en yum -y install $(< file)
(eller dnf
, efter behov).
Du kommer att få något nedfall av paket som inte finns ymore, eller ändrat namn, eller har ersatts av andra.
Kommentarer
- Ok, men detta markerar alla tidigare installerade paket som användarintallade på destinationsvärd. Även om de ursprungligen bara var installerade som ett beroende.
repoquery ...
: ” Ogiltig yumdb förfrågan ’ orsak ’ för installerad pkg: HandBrake-cli-0.9.5-1.fc14.x86_64 ”yum localinstall ...
. Jag hade dock en hel del paket som föll i det lägret.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
returnerade 90 paket.