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

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

  • Ik ‘ ben niet zeker of deze aanpak alles oplevert, ik merkte deze op mijn systeem toen Ik heb repoquery ...: ” uitgevoerd Ongeldige yumdb-querytag ‘ reden ‘ voor geïnstalleerd pakket: HandBrake-cli-0.9.5-1.fc14.x86_64 ”
  • @slm, hm, van welke repository was handrem geïnstalleerd? Misschien heeft de installatie van de repository er iets mee te maken?
  • Ik denk dat het een standalone RPM kan zijn die ik heb geïnstalleerd met 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.

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 de repoquery 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *