Van egy Fedora rendszerem (A), ahová azóta telepítettem néhány csomagot. Most egy másik számítógépre (B) szeretném telepíteni a Fedorát, és ugyanazokat a csomagokat akarom telepíteni rá.

A Debian kifejezéssel valami hasonlót szeretnék megvalósítani:

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

De hogy őszinte legyek, nagyon szeretnék egy jobb módszert ugyanazok a csomagok kiválasztására az új Fedora 19 rendszeren (B): Csak azokat a csomagokat szeretném telepíteni az A rendszerből, amelyeket kifejezetten megemlítettek dnf install (vagy yum install) parancssoron – és nem azok, amelyeket függőségként telepítettek!

Miért? Mivel talán a függőségek megváltoztak – és nem akarok elavult függőségeket telepíteni az új rendszerbe. Ráadásul a csomagok eltávolításakor el akarom távolítani a (esetleg) szükségtelen automatikusan telepített függőségeket (pl. Árvákat) is.

Találtam dnf list installed – de nem jelenik meg, ha egy csomagot kifejezetten kiválasztottak, vagy éppen függőség miatt telepítettek.

Hogyan lehet megkapja ezeket az információkat a Fedora-ról?

Hogyan lehet a Fedora / dnf módszerrel replikálni a csomagkiválasztásokat?

Válasz

A Fedora 26 óta a Dnf repoquery alparancs támogatja új opcióval rendelkezik az összes felhasználó által telepített csomag felsorolásához:

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

Más módszerekkel ellentétben az összes debuginfo csomagot is felsorolja. A fenti példában szereplő további grep kiszűri őket.

A lista telepítéséhez a B gazdagépre:

$ < pkgs_a.lst xargs dnf -y install 

Dnf API

A legújabb Dnf verziók (pl. Fedora> = 23) esetén a csomag-adatbázis lekérdezhető a felhasználó által telepített csomagnevekről a Dnf Python API-n keresztül:

$ 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 

Alapértelmezés szerint a dnf install megszakítja, ha egy vagy több csomag már nem elérhető. Alternatív megoldásként a dnf kényszeríthető az összes többi telepítéséhez:

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

PS: Helyezze a fenti kódot és még sok mást a user-installed.py helyre, amely más terjesztéseket is támogat.

felhasználó által telepített előzmények

A Fedora 23-as és újabb verzióin a Dnf biztosítja a

# dnf history userinstalled 

parancsot, amely felsorolja az összes felhasználó által telepített csomagot. 2016-11-től , hasznossága korlátozott , mert nincs mód vezérli a kimenetét, és teljesen minősített csomagokat nyomtat (azaz beleértve a verzióinformációkat is.

felhasználó által telepített korlátozások

Ne feledje, hogy a csomagok felhasználó által telepítettként történő megjelölése bizonyos korlátozásokkal jár a Fedora egyes verzióiban, a Fedora 23-os korszakú rendszereiben (2015 körül -11) a következő kérdések relevánsak:

Repoquery

Régebbi Fedora rendszereken, ahol a Dnf, a Dnf API és a dnf history userinstalled nem érhető el, ehelyett használhatja a újraválaszokat , például:

$ 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 második awk feltétel arra szolgál, hogy kizárja azokat a csomagokat, amelyeket a telepítő telepített. A telepítő felhasználói azonosítóját nyilvánvalóan 4294967295 néven tárolták – alternatív megoldásként írhat hasonlót is:

.

Ne feledje, hogy ez a parancs a Fedorán működik a 21-es kiadásig – de pl. nem a 23. kiadásnál, mert a repoquery parancsot dnf repoquery váltotta fel. És dnf repoquery nem érti a %{yumdb_info.reason} címkét.

Megjegyzések

  • Nem vagyok biztos benne, hogy ez a megközelítés mindent megkap-e, ezeket észrevettem a rendszeremen, amikor Futtattam repoquery ...: ” Érvénytelen yumdb lekérdezés ‘ ok ‘ telepített pkg esetén: HandBrake-cli-0.9.5-1.fc14.x86_64 ”
  • @slm, hm, milyen tárolóból kézifék telepítve? Talán van valami köze a lerakat beállításához?
  • Úgy gondolom, hogy önálló RPM lehetett, amelyet a yum localinstall ... segítségével telepítettem. Viszont elég sok csomagom volt, amelyek ebbe a táborba estek.
  • repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l 90 csomagot adott vissza.

Válasz

A legegyszerűbb módszer, és sokáig működött:

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

… ami ugyanúgy működik, mint a get / set selections dpkg parancs, az AIUI.Vegye figyelembe azt is, hogy ha az előzményeket visszajátssza, használhatja a következőt:

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

… ahelyett, hogy saját maga kellene elemeznie.

Válasz

slm “s válasz A következő yum history alapú megoldást találtam ki:

Minden részletes előzmény beszerzése az összes yum telepítési tranzakcióról (azaz nincs frissítés) , kivéve azokat, amelyeket a kezdeti telepítői műveletek részeként hajtottak végre (1. és 2. tranzakció a rendszeremen, a “Rendszer” felhasználónak tulajdonítva):

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

Kifejezetten telepített csomagok szűrése és vágja le a verzió előtagjait.

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

A csúnya szabályos kifejezésre azért van szükség, hogy mindenféle verzió utótag megegyezzen.

Az eredmények nagyon jól néz ki a rendszeremen.

Összehasonlítás a repoquery ansatz-szal (a rendszeremen):

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

(A repoquery eredményeit átadtam ugh sort -u)

Miért vannak különbségek? Mivel a repoquery magában foglalja az 1. és 2. tranzakció összes csomagját, vagyis az összes csomagot, amelyet a Fedora telepítő telepített. Ez megmagyarázza, hogy a repoquery miért tartalmazza az említett xorg-x11- drv-mga és barátokat.

A repoquery-2nd és a yum-history összehasonlítása azt mutatja, hogy a repoquery-2nd pontosabb – nem tartalmaz néhány már eltávolított csomagot . Ezen kívül úgy tűnik, hogy néhány (a rendszeremen 2) csomagot tartalmaz a “yum update” műveletekből.

Figyelmeztetés

A fenti előzményalapú módszer csak az összes kifejezetten telepített felsorolja csomagokat a rendszer teljes élettartama alatt. Nem egyensúlyozza ki azokat a csomagokat, amelyeket egy későbbi tranzakció során távolítottak el. Ezért ehhez a módszerhez szükség van az eredmények kézi kezelésére, és csak olyan rendszereken kell használni, ahol repoquery nem áll rendelkezésre.

Megjegyzések

  • Remek módszer mindkét válaszunk legjobb kihasználására!

+1-nél többet adok, ha tehetném az esetleges megoldásért + a megvalósítás különféle módjainak szép összehasonlításáért.

Válasz

Van egy régebbi Fedora verzióm (14), így a yum tartalmaz egy kevésbé jellemzőkkel gazdag verziót a yum, de érdemes megnézni a yum history funkciót. Úgy gondolom, hogy a parancsból megszerezheti a keresett információkat.

előzménylista

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

Visszaléphet a a legelső tranzakció a számok listájának átadásával a yum history list címre:

$ 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 

előzmények információ

Az alábbiakban bemutatjuk, hogy mi került telepítésre az első yum tranzakció részeként:

$ 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 

Figyelje meg, hogy a yum hogyan jelenti, hogy egy csomagot kifejezetten telepítettek vagy telepítettek, mert az szükséges volt egy függőség számára. Elemezheti ezeket az információkat, és megszerezheti a kifejezetten telepített csomagok listáját.

Megjegyzések

  • I ‘ hozzáadta a választ az yum history ötlete alapján, összehasonlítja az eredményeket a repoquery alapú módszerrel is . Mellékhatásként ‘ kiterjesztettem a repoquery válaszomat.

Válasz

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

Megjegyzések

  • Miközben itt átnézi a másik 5 választ, mit észlel, ami eltér a válaszától? Egyáltalán nincs magyarázat arra, hogy miért vagy hogyan jobb a válaszod. Jó lenne, ha megadnál egy olyan leírást a válaszodról, amely lefedi ezeket a dolgokat.
  • @StephenRauch, ez a parancs nem szerepel ‘ a többi válaszban, mert ‘ a legutóbbi dnf-kiegészítés. A --userinstalled kapcsolót éppen adták májusban a dnf fájlhoz . ‘ teszteltem, és pontos eredményeket ad. Modulálja azokat a kernel / kernel-core / kernel-modules csomagokat, amelyek nem ‘ nem a felhasználók által telepítettek. Ez az összes *-debuginfo csomagot is tartalmazza – de szükség esetén könnyen kiszűrhetők.
  • @maxschlepzig, köszönöm a visszajelzést, de ez valójában egy kissé retorikus kérdés, próbálva oktatni / ösztönözni a válaszadót, hogy ezt magyarázza el a válaszban.
  • @StephenRauch, elég korrekt, bizonyos szerkesztések biztosan megfelelőek lennének, és lehetővé tennék, hogy elfogadhatóként jelöljem meg válasz.

Válasz

A telepített csomagok felsorolásához próbálkozzon ezzel egysoros :

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

Eredmény:

# 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: nem mutatja a függőségeket

PS2: ábécé sorrendbe van rendezve

PS3: nem jelenik meg, ha később eltávolította a csomagot

Válasz

Amit tettem (elfelejtettem a részleteket, és lusta vagyok, szóval …

Az összes telepített csomag letöltése: rpm -qa > file

A sed(1) paranccsal megszabadulhat a verziószámoktól és másiktól (ha szükséges, megőrizze az architektúrát). Ehhez a Néhány iteráció a megfelelő helyrehozáshoz. A -[0-9.]-[0-9].fc23 vagy hasonló utolsó szakaszát semmivel sem kell lecserélni, de vannak vicces “számok” verziók is.

Utána a szokásos módon történő telepítéskor hajtson végre egy yum -y install $(< file) (vagy dnf parancsot, ha szükséges).

Esni fog némi kiesés olyan csomagokból, amelyek nem léteznek ymore, vagy megváltoztatta a nevét, vagy másokkal helyettesítették őket.

Megjegyzések

  • Ok, de ez az összes korábban telepített csomagot felhasználó által beillesztettként jelöli meg a célállomás. Még akkor is, ha eredetileg csak függőségként telepítették őket.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük