Ik heb een Fedora-systeem (A) waar ik in de loop van de tijd een aantal pakketten heb geïnstalleerd. Nu wil ik Fedora op een andere computer (B) installeren en ik wil dezelfde pakketten erop installeren.
In Debian-termen wil ik zoiets bereiken:
$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b
Maar om eerlijk te zijn, ik wil echt een betere methode om dezelfde pakketten te selecteren op het nieuwe Fedora 19-systeem (B): ik wil alleen de pakketten van systeem A installeren die expliciet werden genoemd op een dnf install
(of yum install
) opdrachtregel – en niet degene die als afhankelijkheden zijn geïnstalleerd!
Waarom? Omdat misschien de afhankelijkheden zijn veranderd – en ik wil geen verouderde afhankelijkheden op het nieuwe systeem installeren. Plus, als ik pakketten verwijder, wil ik ook de (mogelijk) dan onnodige automatisch geïnstalleerde afhankelijkheden (dwz wezen) verwijderen.
Ik “heb dnf list installed
gevonden – maar het wordt niet weergegeven als een pakket expliciet is geselecteerd of zojuist is geïnstalleerd vanwege een afhankelijkheid.
Hoe kan ik krijg je die informatie in Fedora?
Wat is de Fedora / dnf manier om pakketselecties te repliceren?
Antwoord
Sinds Fedora 26 heeft de Dnf repoquery
ondersteuning van subcommandos een nieuwe optie voor het weergeven van alle door de gebruiker geïnstalleerde pakketten:
$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst
In tegenstelling tot andere methoden, worden ook alle debuginfo-pakketten weergegeven. De extra grep in het bovenstaande voorbeeld filtert ze eruit.
Om de lijst op host B te installeren:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
Met recente Dnf-versies (bijv. Fedora> = 23), kan de pakketdatabase worden opgevraagd voor door de gebruiker geïnstalleerde pakketnamen via de 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
Standaard wordt dnf install
afgebroken als een of meer pakketten “niet meer beschikbaar zijn. Als alternatief kan dnf worden geforceerd om alle resterende te installeren:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Plaats de bovenstaande code en meer in user-installed.py
die ook andere distributies ondersteunt.
history userinstalled
Op Fedora 23 en later biedt Dnf het
# dnf history userinstalled
commando dat alle door de gebruiker geïnstalleerde pakketten weergeeft. , is het bruikbaarheid beperkt omdat er geen manier is om controle over de output en het print pakketten volledig gekwalificeerd (d.w.z. inclusief versie-informatie).
door de gebruiker geïnstalleerde beperkingen
Merk op dat het markeren van pakketten als door de gebruiker geïnstalleerd, enkele beperkingen heeft op sommige Fedora-versies, voor systemen uit het Fedora 23-achtige tijdperk (van rond 2015 -11) de volgende zaken zijn relevant):
- pakketten die via de GUI zijn geïnstalleerd, zijn niet inbegrepen
- pakketten geïnstalleerd via de commando-niet-gevonden handler zijn niet inbegrepen
- sommige pakketten zijn standaard geïnstalleerd (door anaconda) zijn inbegrepen
Repoquery
Op oudere Fedora-systemen, waar Dnf, de Dnf API en dnf history userinstalled
zijn” niet beschikbaar, men kan in plaats daarvan repoquery gebruiken, bijvoorbeeld:
$ 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
De tweede awk-voorwaarde wordt gebruikt om pakketten uit te sluiten die door het installatieprogramma zijn geïnstalleerd. De gebruikers-id van het installatieprogramma is blijkbaar opgeslagen als 4294967295 – u kunt ook iets schrijven als
.
Merk op dat dit commando werkt op Fedora tot en met release 21 – maar b.v. niet op release 23, omdat het commando repoquery
werd vervangen door dnf repoquery
. En dnf repoquery
begrijpt de %{yumdb_info.reason}
-tag niet.
Reacties
Antwoord
De gemakkelijkste manier, en het heeft lang gewerkt, is:
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
… wat ongeveer hetzelfde werkt als het get / set selections dpkg commando, AIUI.Merk ook op dat als u de geschiedenis opnieuw afspeelt, u het volgende kunt gebruiken:
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… in plaats van deze zelf te moeten analyseren.
Antwoord
Geïnspireerd door slm “s antwoord Ik “heb de volgende yum history
gebaseerde oplossing bedacht:
Krijg alle gedetailleerde geschiedenis over alle Yum-installatietransacties (dwz geen upgrades) , met uitzondering van degene die worden uitgevoerd als onderdeel van de initiële acties van het installatieprogramma (transacties 1 en 2 op mijn systeem, toegeschreven aan gebruiker “Systeem”):
$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history
Filter expliciet geïnstalleerde pakketten en snijd versievoorvoegsels af.
$ < 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
De lelijke reguliere expressie is nodig zodat alle soorten versie-achtervoegsels overeenkomen.
De resultaten zien er best goed uit op mijn systeem.
Een vergelijking met de repoquery ansatz (op mijn systeem):
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(Ik heb de repoquery-resultaten doorgesluisd via ugh sort -u)
Waarom zijn er verschillen? Omdat repoquery alle pakketten van transactie 1 en 2 bevat, d.w.z. alle pakketten die zijn geïnstalleerd door het Fedora-installatieprogramma. Dit verklaart waarom repoquery de genoemde pakketten xorg-x11- drv-mga en vrienden bevat.
Het vergelijken van repoquery-2nd en yum-history laat zien dat repoquery-2nd nauwkeuriger is – het bevat niet enkele reeds verwijderde pakketten . Bovendien bevat het een paar (2 op mijn systeem) pakketten van “yum update” -operaties, zo lijkt het.
Waarschuwing
De bovenstaande op geschiedenis gebaseerde methode vermeldt alleen alle expliciet geïnstalleerde pakketten gedurende de volledige levensduur van het systeem. Het compenseert niet de pakketten die bij een latere transactie zijn verwijderd. Deze methode heeft dus enige handmatige curatie van de resultaten nodig en mag alleen worden gebruikt op systemen waar repoquery
niet beschikbaar is.
Opmerkingen
- Leuke manier om het beste uit onze beide antwoorden te halen! Ik ‘ zou je meer dan een +1 geven als ik kon voor de uiteindelijke oplossing + de mooie vergelijking van de verschillende manieren om het te doen.
Answer
Ik heb een oudere versie van Fedora (14) dus mijn yum bevat een versie met minder functies van yum
, maar misschien wil je de functie yum history
eens bekijken. Ik denk dat je de informatie die je zoekt kunt krijgen met dat commando.
geschiedenislijst
$ 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 ...
Je kunt teruggaan naar de allereerste transactie door een lijst met getallen door te geven aan 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
geschiedenisinformatie
Het volgende zal je laten zien wat er is geïnstalleerd als onderdeel van de eerste yum-transactie:
$ 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
Merk op hoe yum rapporteert of een pakket expliciet is geïnstalleerd of geïnstalleerd omdat het was nodig vanwege een afhankelijkheid. Je zou deze info kunnen parseren en je lijst met pakketten krijgen die expliciet geïnstalleerd waren.
Reacties
- I ‘ heeft een antwoord toegevoegd op basis van uw
yum history
idee, het vergelijkt ook de resultaten met derepoquery
gebaseerde methode . Als bijwerking heb ik ‘ mijn repoquery-antwoord uitgebreid.
Answer
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Opmerkingen
- Als je de andere 5 antwoorden hier bekijkt, wat valt je op dat anders is aan je antwoord? Er is absoluut geen verklaring voor waarom of hoe uw antwoord beter of anders is. Het zou goed zijn als je een beschrijving van je antwoord zou kunnen geven die deze dingen omvat.
- @StephenRauch, dit commando is niet ‘ t opgenomen in de andere antwoorden, omdat het ‘ een recente dnf-toevoeging is. De
--userinstalled
switch is zojuist toegevoegd aan dnf in mei . Ik ‘ heb het getest en het geeft nauwkeurige resultaten. Modulo de kernel / kernel-core / kernel-modules pakketten die niet ‘ echt door de gebruiker zijn geïnstalleerd. Het bevat ook alle*-debuginfo
pakketten – maar ze kunnen gemakkelijk worden uitgefilterd, indien nodig. - @maxschlepzig, bedankt voor de feedback, maar dit was eigenlijk een beetje een retorische vraag, in een poging de beantwoorder op te voeden / ertoe aan te zetten dat in het antwoord uit te leggen.
- @StephenRauch, eerlijk genoeg, enige bewerking zou zeker gepast zijn en zou me toestaan om het als geaccepteerd te markeren antwoord.
Answer
Probeer dit om een lijst te maken van pakketten die u hebt geïnstalleerd one-liner :
alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g""
Resultaat:
# 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: het toont geen afhankelijkheden
PS2: het is alfabetisch gesorteerd
PS3: het laat niet zien of je het pakket later hebt verwijderd
Antwoord
Wat ik deed (de details vergeten, en ik “een luie klootzak, dus …
Haal alle geïnstalleerde pakketten op: rpm -qa > file
Gebruik sed(1)
om versienummers en dergelijke te verwijderen (behoud de architectuur, indien nodig). een paar iteraties om het goed te krijgen, je wilt het laatste stuk -[0-9.]-[0-9].fc23
of iets dergelijks door niets vervangen, maar er zijn ook grappige versienummers.
Na installeer zoals normaal, doe een yum -y install $(< file)
(of dnf
, zoals vereist).
Je zult wat fall-out krijgen van pakketten die niet bestaan en ymeer, of veranderde de naam, of werd vervangen door anderen.
Reacties
- Ok, maar dit zal alle eerder geïnstalleerde pakketten markeren als door de gebruiker geïnstalleerd de bestemmingshost. Zelfs als ze oorspronkelijk alleen als afhankelijkheid waren geïnstalleerd.
repoquery ...
: ” uitgevoerd Ongeldige yumdb-querytag ‘ reden ‘ voor geïnstalleerd pakket: HandBrake-cli-0.9.5-1.fc14.x86_64 ”yum localinstall ...
. Ik had echter een behoorlijk aantal pakketten die in dat kamp vielen.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
retourneerde 90 pakketten.