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):
- pakker installert via GUI er ikke inkludert
- pakker installert via kommandofinner ikke funnet er ikke inkludert
- noen pakker installert som standard (av anaconda) er inkludert
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
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 medrepoquery
-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.
repoquery ...
: » Ugyldig yumdb forespørsel ‘ årsak ‘ for installert pkg: HandBrake-cli-0.9.5-1.fc14.x86_64 »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.