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):

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

  • Jag ’ jag är inte säker på om detta tillvägagångssätt kommer att få allt, jag märkte dessa på mitt system när Jag sprang repoquery ...: ” Ogiltig yumdb förfrågan ’ orsak ’ för installerad pkg: HandBrake-cli-0.9.5-1.fc14.x86_64 ”
  • @slm, hm, från vilket förvar var handbroms installerad? Kanske har förvarets inställning något att göra med det?
  • Jag tror att det kan ha varit en fristående RPM som jag installerade med 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.

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

  • Trevligt sätt att ta det bästa av båda våra svar! Jag ’ d ger dig mer än +1 om jag kunde för den eventuella lösningen + en trevlig jämförelse av de olika sätten att göra det.
  • 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 den repoquery -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.

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *