Начиная с Fedora 26, repoquery
подкоманда Dnf поддерживает новую опцию для перечисления всех установленных пользователем пакетов:
$ dnf repoquery --qf '%{name}' --userinstalled \
| grep -v -- '-debuginfo$' \
| grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst
В отличие от других методов, в нем также перечислены все пакеты debuginfo. Дополнительный grep в приведенном выше примере отфильтровывает их.
Чтобы установить список на хосте B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
В последних версиях Dnf (например, Fedora> = 23) база данных пакетов может запрашиваться для имен установленных пользователем пакетов через API-интерфейс 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
По умолчанию dnf install
прерывается, если один или несколько пакетов больше не доступны. В качестве альтернативы, dnf можно принудительно установить все остальные:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: поместите приведенный выше код и многое другое, user-installed.py
что также поддерживает другие дистрибутивы.
История пользователя установлена
На Fedora 23 и позже Dnf предоставляет
# dnf history userinstalled
команда, которая выводит список всех установленных пользователем пакетов. По состоянию на 2016-11 гг. Его полезность ограничена, потому что нет способа контролировать его вывод, и он печатает пакеты с полной квалификацией (т.е. включая информацию о версии).
Ограничения, установленные пользователем
Обратите внимание, что пометка пакетов как установленных пользователем имеет некоторые ограничения для некоторых версий Fedora, для систем Fedora 23-го периода (примерно с 2015 по 2011 год) актуальны следующие проблемы):
Repoquery
В более старых системах Fedora, где Dnf, Dnf API и dnf history userinstalled
недоступны, можно вместо этого использовать repoquery , например:
$ 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
Второе условие awk используется для исключения пакетов, которые были установлены установщиком. Идентификатор пользователя установщика, очевидно, был сохранен как 4294967295 - в качестве альтернативы вы можете написать что-то вроде ($3 == 0 || $3 == your-user-id)
.
Обратите внимание, что эта команда работает в Fedora вплоть до выпуска 21 - но, например, не в выпуске 23, потому что команда repoquery
была заменена на dnf repoquery
. И dnf repoquery
не понимает %{yumdb_info.reason}
тег.
repoquery ...
: «Недопустимый тег запроса yumdb 'причина' для установленного pkg: HandBrake-cli-0.9.5-1.fc14.x86_64"yum localinstall ...
. У меня было достаточно пакетов, которые упали в этот лагерь, хотя.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
вернул 90 посылок.Самый простой способ, и он работал долго:
... которая работает так же, как команда get / set selections dpkg, AIUI. Также обратите внимание, что если вы воспроизводите историю, вы можете использовать:
... вместо того, чтобы разбирать его самостоятельно.
источник
Вдохновленный ответом slm , я нашел следующее решение:
yum history
Получить всю подробную историю по всем транзакциям установки yum (т.е. без обновлений), за исключением тех, которые выполнялись как часть начальных действий установщика (транзакции 1 и 2 в моей системе, приписанные пользователю 'System'):
Фильтруйте явно установленные пакеты и обрезайте префиксы версий.
Гадкое регулярное выражение необходимо, чтобы все виды суффиксов версий были сопоставлены.
Результаты выглядят довольно хорошо в моей системе.
Сравнение с анзацем репо-запросов (в моей системе):
(Я передал результаты репо через sort -u)
Почему есть различия? Поскольку repoquery включает в себя все пакеты из транзакций 1 и 2, то есть все пакеты, которые были установлены установщиком Fedora. Это объясняет, почему repoquery включает в себя упомянутые пакеты xorg-x11-drv-mga и друзей.
Сравнение repoquery-2nd и yum-history показывает, что repoquery-2nd более точен - он не включает некоторые уже удаленные пакеты. Кроме того, он включает в себя несколько (2 в моей системе) пакетов из операций 'yum update'.
Предупреждение
Вышеупомянутый основанный на истории метод только перечисляет все явно установленные пакеты в течение полного срока службы системы. Это не уравновешивает те пакеты, которые были удалены в более поздней транзакции. Таким образом, этот метод требует некоторой ручной обработки результатов и должен использоваться только в тех системах, в которых
repoquery
он недоступен.источник
У меня есть более старая версия Fedora (14), поэтому моя ням включает менее функциональную версию
yum
, но вы можете взглянуть на этуyum history
функцию. Я верю, что вы можете получить информацию, которую вы ищете из этой команды.список истории
Вы можете вернуться к самой первой транзакции, передав список номеров
yum history list
:информация об истории
Следующее покажет вам, что было установлено как часть транзакции 1st yum:
Обратите внимание, как yum сообщает, был ли пакет явно установлен или установлен, потому что он был необходим для зависимости. Вы можете проанализировать эту информацию и получить список пакетов, которые были явно установлены.
источник
yum history
идее, он также сравнивает результаты сrepoquery
основанным методом. В качестве побочного эффекта я расширил свой ответ на повторный запрос.источник
--userinstalled
Переключатель был просто добавлен в DNF в мае . Я проверил это, и это дает точные результаты. По модулю пакеты kernel / kernel-core / kernel-modules, которые на самом деле не установлены пользователем. Он также содержит все*-debuginfo
пакеты, но при необходимости их можно легко отфильтровать.К списку пакетов вы установили, попробуйте этот один вкладыш :
Результат:
PS1: это не показывает зависимости
PS2: отсортировано по алфавиту
PS3: он не показывает, если вы удалили пакет позже
источник
Что я сделал (забыл подробности, а я ленивая задница, так что ...
Получить все установленные пакеты:
rpm -qa > file
Используйте,
sed(1)
чтобы избавиться от номеров версий и тому подобного (сохранить архитектуру, если требуется). Для этого потребовалось несколько итераций, вы хотите заменить последний отрезок-[0-9.]-[0-9].fc23
или подобный ничем, но есть и забавные версии «чисел».После установки, как обычно, сделайте
yum -y install $(< file)
(илиdnf
, как требуется).Вы получите некоторые пакеты, которые больше не существуют, или изменили имя, или были заменены другими.
источник