Am un sistem Fedora (A) unde am instalat unele pachete de-a lungul timpului. Acum vreau să instalez Fedora pe alt computer (B) și vreau să instalez aceleași pachete pe el.

În termeni Debian vreau să realizez ceva de genul acesta:

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

Dar, pentru a fi sincer, chiar vreau o metodă mai bună pentru a selecta aceleași pachete pe noul sistem Fedora 19 (B): vreau doar să instalez pachetele din sistemul A care au fost menționate explicit pe o linie de comandă dnf install (sau yum install) – și nu pe cele care au fost instalate ca dependențe!

De ce? Deoarece probabil că dependențele s-au schimbat – și nu vreau să instalez dependențe învechite pe noul sistem. În plus, atunci când elimin pachetele, vreau să elimin și dependențele (posibil), apoi inutile instalate automat (adică orfani).

Am „găsit dnf list installed – dar nu se afișează dacă un pachet a fost selectat în mod explicit sau doar a fost instalat din cauza unei dependențe.

Cum pot obțineți aceste informații despre Fedora?

Care este modalitatea Fedora / dnf de a replica selecțiile de pachete?

Răspuns

De la Fedora 26, subcomanda Dnf repoquery are o nouă opțiune pentru listarea tuturor pachetelor instalate de utilizator:

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

Spre deosebire de alte metode, listează și toate pachetele de debuginfo. Grep-ul suplimentar din exemplul de mai sus le filtrează.

Pentru a instala lista pe gazda B:

$ < pkgs_a.lst xargs dnf -y install 

API Dnf

Cu versiunile recente Dnf (de ex. Fedora> = 23), baza de date a pachetelor poate fi interogată pentru numele pachetelor instalate de utilizator prin intermediul API-ului Dnf Python:

$ 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 

În mod implicit, dnf install se întrerupe dacă unul sau mai multe pachete nu mai sunt disponibile. Alternativ, dnf poate fi forțat pentru a instala toate cele rămase:

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

PS: Puneți codul de mai sus și multe altele în user-installed.py care acceptă și alte distribuții.

istoric instalat de utilizator

Pe Fedora 23 și versiuni ulterioare, Dnf furnizează comanda

# dnf history userinstalled 

care listează toate pachetele instalate de utilizator. Începând cu 2016-11 , utilitatea este limitată , deoarece nu există nicio modalitate de a controlează ieșirea și imprimă pachete complet calificate (de ex. inclusiv informații despre versiune).

Limitări instalate de utilizator

Rețineți că marcarea pachetelor ca instalate de utilizator are unele limitări asupra unor versiuni Fedora, pentru sistemele Fedora 23-ish era (din jurul anului 2015 -11) următoarele probleme sunt relevante):

Repoquery

Pe sistemele Fedora mai vechi, unde Dnf, API-ul Dnf și dnf history userinstalled nu sunt disponibile, se poate folosi în schimb repoquery , de exemplu:

$ 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 

A doua condiție awk este utilizată pentru a exclude pachetele care au fost instalate de programul de instalare. ID-ul utilizatorului de instalare a fost aparent stocat ca 4294967295 – alternativ, puteți scrie ceva de genul

.

Rețineți că această comandă funcționează pe Fedora până la lansarea 21 – dar de ex. nu la versiunea 23, deoarece comanda repoquery a fost înlocuită cu dnf repoquery. Și dnf repoquery nu înțelege eticheta %{yumdb_info.reason}.

Comentarii

  • Nu ‘ nu sunt sigur dacă această abordare va obține totul, le-am observat pe sistemul meu când Am rulat repoquery ...: ” Querytag nevalid ‘ motiv ‘ pentru pkg-ul instalat: HandBrake-cli-0.9.5-1.fc14.x86_64 ”
  • @slm, hm, din ce depozit a fost frână de mână instalată? Poate că configurarea depozitului are ceva de-a face cu asta?
  • Cred că ar fi putut fi un RPM independent pe care l-am instalat folosind yum localinstall .... Am avut însă o cantitate destul de mare de pachete care au căzut în acea tabără.
  • repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l a returnat 90 de pachete.

Răspuns

Cel mai simplu mod și a funcționat mult timp este:

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

… care funcționează la fel ca comanda get / set selections dpkg, AIUI.Rețineți, de asemenea, că dacă redați istoricul, puteți utiliza:

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

… în loc să trebuiască să-l analizați singur.

Răspuns

Inspirat de slm „s răspunde Am „venit cu următoarea soluție bazată pe yum history:

Obțineți tot istoricul detaliat al tuturor tranzacțiilor de instalare Yum (adică fără upgrade-uri) , cu excepția celor executate ca parte a acțiunilor inițiale de instalare (tranzacțiile 1 și 2 pe sistemul meu, atribuite utilizatorului „Sistem”):

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

Filtrează pachetele instalate explicit și tăiați prefixele de versiune.

$ < 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 

Expresia regulată urâtă este necesară astfel încât să se potrivească toate tipurile de sufixe de versiune.

Rezultatele arată destul de bine pe sistemul meu.

O comparație cu repoquery ansatz (pe sistemul meu):

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

(Am trimis rezultatele repoqueriei prin intermediul ugh sort -u)

De ce există diferențe? Deoarece repoquery include toate pachetele din tranzacțiile 1 și 2, adică toate pachetele care au fost instalate de programul de instalare Fedora. Acest lucru explică de ce repoquery include pachetele menționate xorg-x11- drv-mga și friends.

Compararea repoquery-2nd și yum-history arată că repoquery-2nd este mai precisă – nu include unele pachete deja eliminate . În plus, include câteva (2 pe sistemul meu) pachete din operațiunile „yum update”, se pare.

Avertisment

Metoda de mai sus bazată pe istoric listează numai toate instalate în mod explicit pachete pe toată durata de viață a sistemului. Nu echilibrează pachetele care au fost eliminate într-o tranzacție ulterioară. Astfel, această metodă necesită o curatare manuală a rezultatelor și ar trebui utilizată numai pe sisteme dacă repoquery nu este disponibil.

Comentarii

  • O modalitate drăguță de a lua cele mai bune răspunsuri! ‘ ți-aș da mai mult de un +1 dacă aș putea pentru eventuala soluție + o comparație frumoasă a diferitelor moduri de a o face.

Răspuns

Am o versiune mai veche a Fedora (14), așa că yum include o versiune mai puțin bogată în caracteristici a yum, dar poate doriți să aruncați o privire la caracteristica yum history. Cred că puteți obține informațiile pe care le căutați din comanda respectivă.

lista istoricului

$ 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 ... 

Puteți reveni la prima tranzacție prin trecerea unei liste de numere către 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 

informații despre istoric

Următorul vă va arăta ce a fost instalat ca parte a primei tranzacții yum:

$ 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 

Observați cum yum raportează dacă un pachet a fost instalat sau instalat explicit deoarece a fost nevoie de o dependență. Puteți analiza aceste informații și puteți obține lista de pachete care au fost instalate în mod explicit.

Comentarii

  • I Am adăugat un răspuns pe baza ideii dvs. yum history, de asemenea, compară rezultatele cu metoda bazată pe repoquery . Ca efect secundar, am ‘ am extins răspunsul la cererea mea.

Răspuns

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

Comentarii

  • Pe măsură ce priviți celelalte 5 răspunsuri aici, ce observați că este diferit în răspunsul dvs.? Nu există absolut nicio explicație despre de ce sau cum răspunsul dvs. este mai bun decât diferit. Ar fi bine dacă ați putea oferi o descriere a răspunsului dvs. care să acopere aceste lucruri.
  • @StephenRauch, această comandă nu este inclusă în celelalte răspunsuri, ‘ deoarece ‘ este o adăugare recentă a dnf. Comutatorul --userinstalled a fost doar adăugat la dnf în mai . ‘ l-am testat și oferă rezultate exacte. Modulați pachetele kernel / kernel-core / kernel-modules care nu sunt ‘ cu adevărat instalate de utilizator. De asemenea, conține toate pachetele *-debuginfo – dar pot fi ușor filtrate, dacă este necesar.
  • @maxschlepzig, mulțumim pentru feedback, dar acesta a fost de fapt un un pic de întrebare retorică, încercând să educăm / să-l îndemnăm pe cel care răspunde să explice acest lucru în răspuns.
  • @StephenRauch, destul de corect, o anumită editare ar fi cu siguranță adecvată și mi-ar permite să o marcez ca acceptată Răspuns.

Răspuns

Pentru a lista pachetele pe care le-ați instalat , încercați acest one-liner :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g"" 

Rezultat:

# 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: nu afișează dependențe

PS2: este sortat alfabetic

PS3: nu arată dacă ați eliminat pachetul mai târziu

Răspundeți

Ce am făcut (am uitat detaliile și eu „sunt lene bum, așa că …

Obțineți toate pachetele instalate: rpm -qa > file

Utilizați sed(1) pentru a scăpa de numerele de versiune și altele (păstrați arhitectura, dacă este necesar). Acest lucru necesită o puține iterații pentru a-l face corect, doriți să înlocuiți cu nimic ultima parte a -[0-9.]-[0-9].fc23 sau similară, dar există și „numere” amuzante pentru versiune.

După instalarea normală, faceți o yum -y install $(< file) (sau dnf, după cum este necesar).

Veți avea parte de pachete care nu există ymore, sau a schimbat numele, sau au fost înlocuiți cu altele.

Comentarii

  • Ok, dar acest lucru va marca toate pachetele instalate anterior ca fiind instalate de utilizator pe gazda de destinație. Chiar dacă inițial au fost instalate doar ca dependență.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *