Jeg har et Fedora-system (A) der jeg har installert noen pakker over tid. Nå vil jeg installere Fedora på en annen datamaskin (B), og jeg vil installere de samme pakkene på den.

I Debian-termer vil jeg oppnå noe slikt:

$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b 

Men for å være ærlig ønsker jeg virkelig en bedre metode for å velge de samme pakkene på det nye Fedora 19-systemet (B): Jeg vil bare installere pakkene fra system A som eksplisitt ble nevnt på en dnf install (eller yum install) kommandolinje – og ikke de som ble installert som avhengigheter!

Hvorfor? Fordi kanskje avhengigheter har endret seg – og jeg vil ikke installere utdaterte avhengigheter på det nye systemet. I tillegg, når jeg fjerner pakker, vil jeg også fjerne de (muligens) unødvendige automatisk installerte avhengighetene (dvs. foreldreløse).

Jeg har funnet dnf list installed – men den vises ikke hvis en pakke ble eksplisitt valgt eller bare installert på grunn av avhengighet.

Hvordan gjør jeg få den informasjonen om Fedora?

Hva er Fedora / dnf-måten å replikere pakkevalg?

Svar

Siden Fedora 26 har Dnf repoquery underkommando støttet et nytt alternativ for oppføring av alle brukerinstallerte pakker:

$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst 

I motsetning til andre metoder, viser den også alle feilsøkingspakker. Den ekstra grep i eksemplet ovenfor filtrerer dem ut.

Slik installerer du listen på vert B:

$ < pkgs_a.lst xargs dnf -y install 

Dnf API

Med nylige Dnf-versjoner (f.eks. Fedora> = 23) kan pakkedatabasen spørres for brukerinstallerte pakkenavn 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 avbrytes dnf install hvis en eller flere pakker ikke lenger er tilgjengelige. Alternativt kan dnf tvinges for å installere alle gjenværende:

# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b 

PS: Sett koden ovenfor og mer i user-installed.py som også støtter andre distribusjoner.

historie brukerinstallert

På Fedora 23 og senere, gir Dnf kommandoen

# dnf history userinstalled 

som viser alle brukerinstallerte pakker. Per 2016-11 , dets nytten er begrenset fordi det ikke er noen måte å kontrollere utdataene og skrive ut pakker fullt kvalifiserte (dvs. inkludert versjonsinformasjon).

brukerinstallerte begrensninger

Merk at merkingen av pakker som brukerinstallert har noen begrensninger på noen Fedora-versjoner, for Fedora 23-ish era-systemer (fra rundt 2015 -11) følgende problemer er relevante):

Repoquery

På eldre Fedora-systemer, der Dnf, Dnf API og dnf history userinstalled er ikke tilgjengelig, man kan bruke repoquery i stedet, f.eks:

$ 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 

Den andre awk-tilstanden brukes til å ekskludere pakker som ble installert av installatøren. Installatørens bruker-ID ble tilsynelatende lagret som 4294967295 – alternativt kan du skrive noe sånt som

.

Merk at denne kommandoen fungerer på Fedora opp til utgivelse 21 – men f.eks. ikke på utgivelse 23, fordi kommandoen repoquery ble erstattet med dnf repoquery. Og dnf repoquery forstår ikke %{yumdb_info.reason} -taggen.

Kommentarer

  • Jeg ‘ er ikke sikker på om denne tilnærmingen vil få alt, jeg la merke til disse på systemet mitt da Jeg løp repoquery ...: » Ugyldig yumdb forespørsel ‘ årsak ‘ for installert pkg: HandBrake-cli-0.9.5-1.fc14.x86_64 »
  • @slm, hm, fra hvilket depot var håndbrems installert? Kanskje oppbevaringsområdet har noe å gjøre med det?
  • Jeg tror det kan ha vært en frittstående RPM som jeg installerte ved hjelp av yum localinstall .... Jeg hadde ganske mye pakker som falt i den leiren skjønt.
  • repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l returnerte 90 pakker.

Svar

Den enkleste måten, og det har fungert lenge er:

yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump> 

… som fungerer omtrent som get / set selections dpkg-kommandoen, AIUI.Vær også oppmerksom på at hvis du spiller historikken på nytt, kan du bruke:

yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info> 

… i stedet for å måtte analysere den selv.

Svar

Inspirert av slm «s svar Jeg har funnet frem til følgende yum history -basert løsning:

Få all detaljert historikk om alle installasjoner av yum (dvs. ingen oppgraderinger) , unntatt de som ble utført som en del av de første installasjonshandlingene (transaksjoner 1 og 2 på systemet mitt, tilskrevet brukeren «System»):

$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history 

Filtrer eksplisitt installerte pakker og kutte av versjonsprefikser.

$ < 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 stygge regulære uttrykket er nødvendig slik at alle slags versjonssuffikser samsvares.

Resultatene ser ganske bra ut på systemet mitt.

En sammenligning mot repoquery ansatz (på systemet mitt):

 method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214 

(jeg ledet repoquery-resultatene gjennom ugh sort -u)

Hvorfor er det forskjeller? Fordi repoquery inkluderer alle pakkene fra transaksjoner 1 og 2, dvs. alle pakker som ble installert av Fedora-installatøren. Dette forklarer hvorfor repoquery inkluderer de nevnte pakkene xorg-x11- drv-mga og venner.

Sammenligning av repoquery-2nd og yum-history viser at repoquery-2nd er mer nøyaktig – det inkluderer ikke noen allerede fjernede pakker . I tillegg inneholder det noen få (2 på systemet mitt) pakker fra «yum update» -operasjoner, ser det ut til.

Advarsel

Ovennevnte historiebaserte metode viser bare alle eksplisitt installerte pakker over hele systemets levetid. Det balanserer ikke pakkene som ble fjernet i en senere transaksjon. Dermed trenger denne metoden en viss manuell kurering av resultatene og bør bare brukes på systemer der repoquery ikke er tilgjengelig.

Kommentarer

  • Fin måte å ta det beste ut av begge svarene våre! Jeg ‘ Jeg gir deg mer enn +1 hvis jeg kunne for den endelige løsningen + en fin sammenligning av de forskjellige måtene å gjøre det på.

Svar

Jeg har en eldre versjon av Fedora (14), så min mor inkluderer en mindre funksjonsrik versjon av yum, men det kan være lurt å ta en titt på yum history -funksjonen. Jeg tror du kan få informasjonen du leter etter fra den kommandoen.

historikliste

$ 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å tilbake til aller første transaksjon ved å sende en liste med tall til 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 

historieinformasjon

Følgende viser deg hva som ble installert som en del av den første yum-transaksjonen:

$ 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 

Legg merke til hvordan yum rapporterer om en pakke eksplisitt ble installert eller installert fordi den var nødvendig av en avhengighet. Du kan analysere denne informasjonen og få listen over pakker som eksplisitt var installert.

Kommentarer

  • I ‘ har lagt til et svar basert på yum history ideen, det sammenligner også resultatene med repoquery -basert metode . Som en bivirkning har jeg ‘ utvidet svaret mitt på spørsmålet.

Svar

dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt 

Kommentarer

  • Når du ser på de 5 andre svarene her, hva legger du merke til som er annerledes med svaret ditt? Det er absolutt ingen forklaring på hvorfor eller hvordan svaret ditt er bedre enn forskjellige. Det ville være bra hvis du kunne gi en beskrivelse av svaret ditt som dekker disse tingene.
  • @StephenRauch, denne kommandoen er ikke ‘ t inkludert i de andre svarene, fordi det ‘ er et nylig dnf-tillegg. --userinstalled -bryteren ble bare lagt til dnf i mai . Jeg ‘ har testet det, og det gir nøyaktige resultater. Moduler kernel / kernel-core / kernel-modules pakkene som ikke er ‘ t virkelig brukerinstallert. Den inneholder også alle *-debuginfo pakker – men de kan enkelt filtreres ut, om nødvendig.
  • @maxschlepzig, takk for tilbakemeldingen, men dette var faktisk en litt av et retorisk spørsmål, som prøver å utdanne / be svareren om å forklare det i svaret.
  • @StephenRauch, nok, noen redigering ville absolutt være passende og ville tillate meg å markere det som akseptert svar.

Svar

Hvis du vil liste opp pakker du har installert, kan du prøve dette 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 viser ikke avhengigheter

PS2: det er sortert alfabetisk

PS3: det viser ikke om du har fjernet pakken senere

Svar

Det jeg gjorde (glemte detaljene, og jeg er «lat lat», så …

Få alle installerte pakker: rpm -qa > file

Bruk sed(1) for å kvitte seg med versjonsnummer og slikt (beholder arkitekturen, om nødvendig). Dette krevde en få iterasjoner for å få det riktig, vil du erstatte den siste strekningen av -[0-9.]-[0-9].fc23 eller lignende med ingenting, men det er morsomme versjon «tall» også.

Etter installerer som normalt, gjør en yum -y install $(< file) (eller dnf, etter behov).

Du får litt nedfall av pakker som ikke finnes ymore, eller endret navn, eller ble erstattet av andre.

Kommentarer

  • Ok, men dette vil markere alle tidligere installerte pakker som brukerintallert på destinasjonsverten. Selv om de opprinnelig bare ble installert som en avhengighet.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *