Mám systém Fedora (A), kam jsem v průběhu času nainstaloval nějaké balíčky. Nyní chci nainstalovat Fedoru na jiný počítač (B) a chci na něj 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ů na novém systému Fedora 19 (B):Chci jen nainstalovat balíčky ze systému A, které byly výslovně zmíněny v dnf install
(nebo yum install
) příkazového řádku – a ne ty, které byly nainstalovány jako závislosti!
Proč? Protože se možná závislosti změnily – a já nechci do nového systému instalovat zastaralé závislosti. Navíc, když odebírám balíčky, chci také odstranit (možná) pak nepotřebné automaticky instalované závislosti (tj. sirotci).
Zjistil jsem, že dnf list installed
– ale nezobrazuje se, pokud byl balíček explicitně vybrán nebo právě nainstalován kvůli závislosti.
Jak získám tyto informace na Fedoře?
Jaký je způsob, jakým Fedora/dnf replikuje výběr balíčků?
Přijatá odpověď:
Od Fedory 26 je Dnf repoquery
dílčí příkaz support má novou volbu pro výpis všech balíčků nainstalovaných uživatelem:
$ 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 také uvádí všechny balíčky debuginfo. Další grep ve výše uvedeném příkladu je odfiltruje.
Instalace seznamu na hostitele B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
S nejnovějšími verzemi Dnf (např. Fedora>=23) lze v databázi balíčků vyhledávat názvy balíčků nainstalovaných uživatelem prostřednictvím 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í dnf install
přeruší, pokud jeden nebo více balíčků již není k dispozici. Alternativně lze dnf vynutit instalaci všech zbývajících:
# 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ý také podporuje další distribuce.
historie uživatelsky nainstalována
Na Fedoře 23 a novějších poskytuje Dnf
# dnf history userinstalled
příkaz, který uvádí všechny balíčky nainstalované uživatelem. Od roku 2016-11 je jeho užitečnost omezená, protože neexistuje způsob, jak ovládat jeho výstup a tiskne balíčky plně kvalifikované (tj. včetně informací o verzi).
Omezení instalovaná uživatelem
Všimněte si, že označení balíčků jako nainstalovaných uživatelem má na některých verzích Fedory určitá omezení, pro systémy z éry Fedory 23 (přibližně z let 2015-11) jsou relevantní následující problémy:
- balíčky nainstalované prostřednictvím GUI nejsou součástí dodávky
- balíčky nainstalované pomocí obslužného programu command-not-found nejsou zahrnuty
- jsou zahrnuty některé balíčky nainstalované ve výchozím nastavení (anaconda)
Repoquery
Na starších systémech Fedora, kde je uživatelsky nainstalován Dnf, Dnf API a dnf history userinstalled
nejsou dostupné, 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é jméno instalačního programu bylo zřejmě uloženo jako 4294967295 – případně můžete napsat něco jako ($3 == 0 || $3 == your-user-id)
.
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 dnf repoquery
. A dnf repoquery
nerozumí %{yumdb_info.reason}
tag.