Mám systém Fedora (A), do kterého jsem časem nainstaloval nějaké balíčky. Nyní chci nainstalovat Fedoru na jiný počítač (B) a chci na ni nainstalovat stejné balíčky.

Z hlediska Debianu chci dosáhnout něčeho takového:

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

Ale abych byl upřímný, opravdu chci lepší metodu pro výběr stejných balíčků v novém systému Fedory 19 (B): Chci jen nainstalovat balíčky ze systému A, které byly výslovně zmíněny na dnf install (nebo yum install) příkazovém řádku – a ne těch, které byly nainstalovány jako závislosti!

Proč? Protože se možná změnily závislosti – a já nechci instalovat zastaralé závislosti na novém systému. Navíc, když odstraňuji balíčky, chci odstranit (případně) také nepotřebné automaticky nainstalované závislosti (tj. Sirotky).

Nalezl jsem dnf list installed – ale nezobrazí se, pokud byl balíček explicitně vybrán nebo právě nainstalován kvůli závislosti.

Jak mohu získat tyto informace o Fedoře?

Jaký je způsob Fedory / dnf k replikaci výběru balíčků?

Odpověď

Od Fedory 26 má dílčí příkaz Dnf repoquery podporu novou možnost pro výpis všech uživatelsky nainstalovaných balíčků:

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

Na rozdíl od jiných metod uvádí také všechny balíčky debuginfo. Další grep ve výše uvedeném příkladu je odfiltruje.

Instalace seznamu na hostiteli B:

$ < pkgs_a.lst xargs dnf -y install 

Dnf API

S nedávnými verzemi Dnf (např. Fedora> = 23) lze na databázi balíčků vyhledávat názvy nainstalovaných uživatelů pomocí rozhraní 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 

Ve výchozím nastavení se dnf install přeruší, pokud jeden nebo více balíků již není k dispozici. Alternativně lze dnf vynutit nainstalovat všechny zbývající:

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

PS: Vložte výše uvedený kód a další do user-installed.py , který podporuje i další distribuce.

history userinstalled

Ve Fedoře 23 a novějších poskytuje Dnf příkaz

# dnf history userinstalled 

, který uvádí seznam všech balíků nainstalovaných uživatelem. Od 2016-11 , jeho užitečnost je omezená , protože neexistuje způsob, jak ovládá svůj výstup a tiskne balíčky plně kvalifikované (tj. včetně informací o verzi).

Uživatelem instalovaná omezení

Všimněte si, že označování balíčků jako nainstalovaných uživatelem má u některých verzí Fedory určitá omezení, pro systémy Fedora 23-ish era (přibližně od roku 2015 -11) jsou relevantní následující problémy):

Repoquery

Na starších systémech Fedora, kde Dnf, Dnf API a dnf history userinstalled není k dispozici, lze místo toho použít repoquery , např .:

$ 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 

Druhá podmínka awk se používá k vyloučení balíků, které byly nainstalovány instalačním programem. Uživatelské ID instalátoru bylo zřejmě uloženo jako 4294967295 – alternativně můžete napsat něco jako

.

Všimněte si, že tento příkaz funguje na Fedoře až do vydání 21 – ale např. ne ve verzi 23, protože příkaz repoquery byl nahrazen příkazem dnf repoquery. A dnf repoquery nerozumí značce %{yumdb_info.reason}.

Komentáře

  • I ‚ si nejsem jistý, jestli tento přístup získá všechno, všiml jsem si toho v mém systému, když Spustil jsem repoquery ...: “ neplatný yumdb querytag ‚ reason ‚ pro nainstalované pkg: HandBrake-cli-0.9.5-1.fc14.x86_64 “
  • @slm, hm, z jaké bylo úložiště nainstalována ruční brzda? Možná má nastavení úložiště něco společného?
  • Myslím, že to mohlo být samostatné RPM, které jsem nainstaloval pomocí yum localinstall .... Měl jsem ale slušné množství balíčků, které spadly do toho tábora.
  • repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l vrátil 90 balíčků.

Odpověď

Nejjednodušší a dlouhodobě fungující způsob je:

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

… který funguje podobně jako příkaz get / set selections dpkg, AIUI.Upozorňujeme, že pokud přehráváte historii, můžete použít:

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

… místo toho, abyste ji museli analyzovat sami.

Odpověď

Inspirováno slm „s answer Přišel jsem s následujícím yum history řešením založeným na:

Získejte podrobnou historii všech transakcí instalace yum (tj. žádné upgrady) , s výjimkou těch, které byly provedeny jako součást počátečních akcí instalačního programu (transakce 1 a 2 v mém systému, připsané uživateli „Systém“):

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

Filtrovat explicitně nainstalované balíčky a odříznout předpony verzí.

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

Je zapotřebí ošklivý regulární výraz, aby se shodovaly všechny druhy přípon verzí.

Výsledky vypadají v mém systému celkem dobře.

Srovnání s repoquery ansatz (v mém systému):

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

(Výsledky repoquery jsem pipetoval ugh sort -u)

Proč existují rozdíly? Protože repoquery zahrnuje všechny balíčky z transakcí 1 a 2, tj. Všechny balíčky, které byly nainstalovány instalačním programem Fedory. To vysvětluje, proč repoquery zahrnuje zmíněné balíčky xorg-x11- drv-mga a přátele.

Porovnání repoquery-2 a yum-history ukazuje, že repoquery-2 je přesnější – neobsahuje některé již odebrané balíčky . Kromě toho obsahuje několik (2 na mém systému) balíčky z „yum update“ -operations, zdá se.

Varování

Výše uvedená metoda založená na historii uvádí pouze všechny výslovně nainstalované balíčky po celou dobu životnosti systému. Nevyvažuje ty balíčky, které byly odebrány v pozdější transakci. Tato metoda tedy vyžaduje určité ruční zpracování výsledků a měla by se používat pouze v systémech, které repoquery není k dispozici.

Komentáře

  • Pěkný způsob, jak využít obě naše odpovědi! Dávám vám ‚ více než +1, kdybych mohl pro případné řešení + pěkné srovnání různých způsobů, jak to udělat.

Odpověď

Mám starší verzi Fedory (14), takže moje yum obsahuje méně bohatou verzi yum, ale možná se budete chtít podívat na funkci yum history. Věřím, že z tohoto příkazu získáte informace, které hledáte.

seznam historie

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

Můžete se vrátit zpět na úplně první transakce předáním seznamu čísel 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 

informace o historii

Následující text vám ukáže, co bylo nainstalováno jako součást první transakce 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 

Všimněte si, jak yum hlásí, zda byl balíček explicitně nainstalován nebo nainstalován, protože bylo potřeba pro závislost. Tyto informace můžete analyzovat a získat seznam balíčků, které byly explicitně nainstalovány.

Komentáře

  • I přidal jsem odpověď na základě vašeho yum history nápadu, porovná také výsledky s metodou založenou na repoquery . Jako vedlejší efekt jsem ‚ rozšířil svoji odpověď na repoquery.

Odpovědět

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

Komentáře

  • Když se podíváte na dalších 5 odpovědí, v čem si všimnete, že se liší ve vaší odpovědi? Neexistuje absolutně žádné vysvětlení proč nebo jak je vaše odpověď odlišná. Bylo by dobré, kdybyste mohli uvést popis své odpovědi, který tyto věci pokrývá.
  • @StephenRauch, tento příkaz není ‚ zahrnut v ostatních odpovědích, protože ‚ je nedávný přírůstek dnf. Přepínač --userinstalled byl právě přidán do dnf v květnu . Testoval jsem to ‚ a poskytuje přesné výsledky. Modulovejte balíčky kernel / kernel-core / kernel-modules, které nejsou ‚ skutečně nainstalovány uživatelem. Obsahuje také všechny *-debuginfo balíčky – ale v případě potřeby je lze snadno odfiltrovat.
  • @maxschlepzig, děkuji za zpětnou vazbu, ale ve skutečnosti to byl trochu řečnická otázka, snaží se poučit / vyzvat odpověď, aby vysvětlila, že v odpovědi.
  • @StephenRauch, spravedlivě, určitá úprava by určitě byla vhodná a umožnila by mi ji označit jako přijat Odpovědět.

Odpověď

Chcete-li zobrazit seznam balíčků , které jste nainstalovali, zkuste jednorázový :

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

Výsledek:

# 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: nezobrazuje závislosti

PS2: je řazen abecedně

PS3: nezobrazuje, pokud jste balíček odstranili později

Odpověď

Co jsem udělal (zapomněl jsem podrobnosti a já jsem líný zadek, takže …

Získejte všechny nainstalované balíčky: rpm -qa > file

Pomocí sed(1) se zbavte čísel verzí apod. (pokud je to nutné, ponechejte si architekturu). To vyžadovalo pár iterací, aby to bylo správné, chcete nahradit poslední úsek -[0-9.]-[0-9].fc23 ničím, ale existují i legrační „čísla“.

Poté instalací jako obvykle proveďte yum -y install $(< file) (nebo dnf, jak je požadováno).

Dostanete nějaký spad balíčků, které neexistují ymore, nebo změnil název, nebo byl nahrazen jinými.

Komentáře

  • Dobře, ale tím se všechny dříve nainstalované balíčky označí jako uživatelsky nainstalované cílového hostitele. I kdyby byly původně nainstalovány pouze jako závislost.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *