Jeg har et Fedora-system (A), hvor jeg har installeret nogle pakker over tid. Nu vil jeg installere Fedora på en anden computer (B), og jeg vil installere de samme pakker på den.
I Debian-termer vil jeg opnå noget som dette:
$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b
Men for at være ærlig vil jeg virkelig have en bedre metode til at vælge de samme pakker på det nye Fedora 19-system (B): Jeg vil bare installere pakkerne fra system A, der eksplicit blev nævnt på en dnf install
(eller yum install
) kommandolinje – og ikke dem, der blev installeret som afhængigheder!
Hvorfor? Fordi måske afhængigheder er ændret – og jeg vil ikke installere forældede afhængigheder på det nye system. Plus, når jeg fjerner pakker, vil jeg også fjerne de (muligvis) unødvendige automatisk installerede afhængigheder (dvs. forældreløse).
Jeg har fundet dnf list installed
– men det vises ikke, hvis en pakke blev eksplicit valgt eller bare installeret på grund af afhængighed.
Hvordan gør jeg få disse oplysninger om Fedora?
Hvad er Fedora / dnf-måde at replikere pakkevalg på?
Svar
Siden Fedora 26 har Dnf repoquery
underkommando understøttet en ny mulighed for at liste alle brugerinstallerede pakker:
$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst
I modsætning til andre metoder viser den også alle debuginfo-pakker. Den ekstra grep i eksemplet ovenfor filtrerer dem ud.
Sådan installeres listen på vært B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
Med de seneste Dnf-versioner (f.eks. Fedora> = 23) kan pakkedatabasen forespørges for brugerinstallerede pakkenavne 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 afbrydes dnf install
, hvis en eller flere pakker ikke længere er tilgængelige. Alternativt kan dnf tvinges for at installere alle de resterende:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Sæt ovenstående kode og mere i user-installed.py
, der også understøtter andre distributioner.
historie brugerinstalleret
På Fedora 23 og senere leverer Dnf kommandoen
# dnf history userinstalled
, der viser alle brugerinstallerede pakker. Fra og med 2016-11 , dens nytten er begrænset , fordi der ikke er nogen måde at kontrollere dets output og udskrive pakker fuldt kvalificerede (dvs. inklusive versionoplysninger).
brugerinstallerede begrænsninger
Bemærk, at markeringen af pakker som brugerinstalleret har nogle begrænsninger for nogle Fedora-versioner til Fedora 23-ish-æra-systemer (fra omkring 2015 -11) følgende problemer er relevante):
- pakker installeret via GUI er ikke inkluderet
- pakker, der er installeret via kommandoen, der ikke findes, er ikke inkluderet
- nogle pakker installeret som standard (af anaconda) er inkluderet
Efterspørgsel
På ældre Fedora-systemer, hvor Dnf, Dnf API og dnf history userinstalled
er ikke tilgængelige, man kan bruge repoquery i stedet for 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 anden awk-betingelse bruges til at ekskludere pakker, der blev installeret af installationsprogrammet. Installatørens bruger-id blev tilsyneladende gemt som 4294967295 – alternativt kan du skrive noget som
.
Bemærk, at denne kommando fungerer på Fedora op til frigivelse 21 – men f.eks. ikke ved frigivelse 23, fordi kommandoen repoquery
blev erstattet med dnf repoquery
. Og dnf repoquery
forstår ikke %{yumdb_info.reason}
-tagget.
Kommentarer
Svar
Den nemmeste måde, og det fungerede i lang tid er:
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
… som fungerer meget som kommandoen get / set dpkg, AIUI.Bemærk også, at hvis du gentager historikken, kan du bruge:
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… i stedet for at skulle analysere det selv.
Svar
Inspireret af slm “s svar Jeg er kommet med følgende yum history
-baseret løsning:
Få al detaljeret historik på alle yum-installationstransaktioner (dvs. ingen opgraderinger) , eksklusive dem, der udføres som en del af de første installationshandlinger (transaktioner 1 og 2 på mit system, tilskrevet brugeren “System”):
$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history
Filtrer eksplicit installerede pakker og afskæringspræfikser.
$ < 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 grimme regulære udtryk er nødvendigt, så alle slags versionssuffikser matches.
Resultaterne ser ganske fint ud på mit system.
En sammenligning med repoquery ansatz (på mit system):
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(Jeg pipede resultaterne af efterspørgsel igennem ugh sort -u)
Hvorfor er der forskelle? Fordi repoquery inkluderer alle pakkerne fra transaktion 1 og 2, dvs. alle pakker, der blev installeret af Fedora-installationsprogrammet. Dette forklarer, hvorfor repoquery inkluderer de nævnte pakker xorg-x11- drv-mga og venner.
Sammenligning af repoquery-2nd og yum-history viser, at repoquery-2nd er mere præcis – det inkluderer ikke nogle allerede fjernede pakker . Derudover indeholder det nogle få (2 på mit system) pakker fra “yum update” -operationer, det ser ud til.
Advarsel
Ovenstående historikbaserede metode viser kun alle eksplicit installerede pakker i hele systemets levetid. Det afbalancerer ikke de pakker, der blev fjernet i en senere transaktion. Denne metode kræver således en vis manuel kuratering af resultaterne og bør kun bruges på systemer, hvis repoquery
ikke er tilgængelig.
Kommentarer
- Dejlig måde at få det bedste ud af begge vores svar! Jeg ‘ Jeg giver dig mere end +1, hvis jeg kunne for den eventuelle løsning + en god sammenligning af de forskellige måder at gøre det på.
Svar
Jeg har en ældre version af Fedora (14), så min yum indeholder en mindre funktionsrig version af yum
, men du vil måske se på yum history
-funktionen. Jeg tror, du kan få de oplysninger, du leder efter, fra den kommando.
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å tilbage til allerførste transaktion ved at videregive en liste med tal 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
historieinformation
Følgende viser dig, hvad der blev installeret som en del af 1. yum-transaktion:
$ 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
Bemærk, hvordan yum rapporterer, om en pakke eksplicit blev installeret eller installeret, fordi den var afhængig af en afhængighed. Du kunne analysere disse oplysninger og få din liste over pakker, der blev eksplicit installeret.
Kommentarer
- I ‘ har tilføjet et svar baseret på din
yum history
idé, det sammenligner også resultaterne med denrepoquery
-baserede metode . Som en bivirkning har jeg ‘ udvidet mit repoquery-svar.
Svar
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Kommentarer
- Når du ser på de andre 5 svar her, hvad bemærker du, der er anderledes ved dit svar? Der er absolut ingen forklaring på hvorfor eller hvordan dit svar er bedre end forskellige. Det ville være godt, hvis du kunne give en beskrivelse af dit svar, der dækker disse ting.
- @StephenRauch, denne kommando er ikke ‘ t inkluderet i de andre svar, fordi det ‘ er en nylig dnf-tilføjelse.
--userinstalled
-omskifteren blev bare tilføjet til dnf i maj . Jeg ‘ har testet det, og det giver nøjagtige resultater. Modul pakkerne kernel / kernel-core / kernel-modules, der ikke er ‘ t virkelig brugerinstalleret. Den indeholder også alle*-debuginfo
pakker – men de kan let filtreres fra, hvis det er nødvendigt. - @maxschlepzig, tak for feedbacken, men dette var faktisk en lidt af et retorisk spørgsmål, der forsøger at uddanne / bede svareren om at forklare det i svaret.
- @StephenRauch, fair nok, en vis redigering ville bestemt være passende og ville give mig mulighed for at markere det som accepteret svar.
Svar
For at liste pakker du har installeret, prøv 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 afhængigheder
PS2: det er sorteret alfabetisk
PS3: det viser ikke, om du har fjernet pakken senere
Svar
Hvad jeg gjorde (glemte detaljerne, og jeg “er doven bum, så …
Få alle installerede pakker: rpm -qa > file
Brug sed(1)
for at slippe af med versionsnumre og lignende (beholder arkitekturen, hvis det kræves). Dette krævede en få iterationer for at få det rigtigt, vil du erstatte den sidste strækning af -[0-9.]-[0-9].fc23
eller lignende med intet, men der er også sjove version “tal”.
Efter installer som normalt, gør en yum -y install $(< file)
(eller dnf
efter behov).
Du får noget nedfald af pakker, der ikke findes en ymore, eller ændret navn eller blev erstattet af andre.
Kommentarer
- Ok, men dette markerer alle tidligere installerede pakker som brugerintallede på destinationsværten. Selvom de oprindeligt kun blev installeret som en afhængighed.
repoquery ...
: ” Ugyldig yumdb forespørgsel ‘ årsag ‘ for installeret pkg: HandBrake-cli-0.9.5-1.fc14.x86_64 ”yum localinstall ...
. Jeg havde dog en hel del pakker, der faldt ind i den lejr.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
returnerede 90 pakker.