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:
- a GUI-n keresztül telepített csomagok nem szerepelnek
- a csomag nem található a parancs nem található kezelőn keresztül.
- néhány alapértelmezés szerint telepített csomag (anaconda által) szerepelnek benne
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
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 arepoquery
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.
repoquery ...
: ” Érvénytelen yumdb lekérdezés ‘ ok ‘ telepített pkg esetén: HandBrake-cli-0.9.5-1.fc14.x86_64 ”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.