Как копировать установленный выбор пакета от одного экземпляра Fedora до другого?

Fedora на самом деле очень прост (хотя не легкий) разветвить, или "сделать ремикс", как они называют его. repo определения находятся в fedora-release. Конфигурации упаковываются с самими приложениями, таким образом, необходимо будет восстановить их от SRPM. После того как Вы собрали пакеты, из которых Вы хотите создать свое ветвление, Вы работаете createrepo превратить их в фактический repo. Можно затем использовать инструменты, перечисленные в Wiki для генерации медиа от repo.

16
25.11.2016, 22:45
6 ответов

Начиная с Fedora 26, Dnf repoquery поддержки подкоманды имеют новую опцию для списка всех установленных пользователями пакетов:

$ 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), база данных пакета может быть запрошена для установленных имен пакета пользователя с помощью Python Dnf 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

По умолчанию, dnf install аварийные прекращения работы, если один или несколько пакетов больше не доступны. С другой стороны, dnf может быть вынужден установить все остающиеся:

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

PS: Поместите вышеупомянутый код и больше в user-installed.py это также поддерживает другие дистрибутивы.

история userinstalled

На Fedora 23 и позже, Dnf обеспечивает

# dnf history userinstalled

управляйте, чтобы перечислил установленные пакеты всего пользователя. С 2016-11, ограничена его полноценность, потому что нет никакого способа управлять его выводом, и это печатает полностью определенные пакеты (т.е. включая информацию о версии).

Ограничения userinstalled

Обратите внимание, что маркировка пакетов, как установлено пользователями имеет некоторые ограничения на некоторые версии Fedora для Fedora системы эры с 23 выходами (приблизительно от 2015-11), следующие проблемы релевантны):

Repoquery

В более старых системах Fedora, где Dnf, API Dnf и 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} тег.

12
27.01.2020, 19:48
  • 1
    я не уверен, получит ли этот подход все, я заметил их в своей системе, когда я работал repoquery ...: "Недопустимые yumdb querytag 'рассуждают' для установленного pkg: HandBrake-cli-0.9.5-1.fc14.x86_64" –  slm♦ 13.07.2013, 18:41
  • 2
    @slm, гм, от того, какой репозиторий ручной тормоз был установлен? Возможно, установка репозитория имеет некоторое отношение к нему? –  maxschlepzig 13.07.2013, 19:24
  • 3
    я думаю, что это, возможно, был автономный об/мин, что я установил использование yum localinstall .... У меня было изрядное количество пакетов, которые попали в тот лагерь все же. –  slm♦ 13.07.2013, 19:35
  • 4
    repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l возвращенный 90 пакетов. –  slm♦ 13.07.2013, 19:39

Самый легкий путь, и это работало, в течение долгого времени:

yum-debug-dump => gives file.

yum-debug-restore <file-from-debug-dump>

... который работает во многом как получить/установить выборы dpkg команда, AIUI. Также обратите внимание, что при воспроизведении истории, можно использовать:

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

... вместо того, чтобы иметь необходимость проанализировать его самостоятельно.

6
27.01.2020, 19:48

Вдохновленный ответом slm я придумал следующее yum history основанное решение:

Получите всю подробную историю на всех вкусных транзакциях установки (т.е. никакие обновления), исключая те execited как часть начальных действий установщика (транзакции 1 и 2 в моей системе, приписанной пользователю 'Система'):

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

Фильтр явно установил пакеты и отключил префиксы версии.

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

Ужасное регулярное выражение необходимо таким образом, что все виды суффиксов версии подобраны.

Результаты выглядят довольно хорошо в моей системе.

Сравнение с repoquery подходом (в моей системе):

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

(Я передал результаты repoquery по каналу через вид-u),

Почему там различия? Поскольку repoquery включает все пакеты от транзакций 1 и 2, т.е. все пакеты, которые были установлены установщиком Fedora. Это объясняет, почему repoquery включает упомянутый Xorg-11-пакетов - drv-mga и друзья.

Сравнение repoquery-2-го и вкусная история показывает, что repoquery-2-й более точно - это не включает, некоторые уже удалили пакеты. Кроме того, это включает некоторых (2 в моей системе) пакеты от 'вкусных '-операций обновления, это кажется.

Предупреждение

Вышеупомянутый основанный на истории метод только перечисляет все явно установленные пакеты за полное время жизни системы. Это не балансирует те пакеты, которые были удалены в более поздней транзакции. Таким образом этот метод нужен в некотором ручном курировании результатов и должен только использоваться в системах, были repoquery не доступно.

3
27.01.2020, 19:48
  • 1
    Хороший способ взять лучший из обоих наших ответов! Я дал бы Вам больше, чем +1, если я мог для возможного решения + хорошее сравнение различных способов сделать это. –  slm♦ 14.07.2013, 01:53

У меня есть более старая версия Fedora (14), таким образом, моя конфетка включает менее многофункциональную версию yum, но Вы могли бы хотеть смотреть на yum history функция. Я полагаю, что можно получить информацию, которую Вы ищете от той команды.

список предыстории

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

Можно вернуться к самой первой транзакции путем передачи списка чисел к 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

информация об истории

Следующее покажет Вам, что было установлено как часть 1-й вкусной транзакции:

$ 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

Заметьте, как вкусные отчеты, был ли пакет явно установлен или установлен, потому что он был необходим зависимости. Вы могли проанализировать эту информацию и получить Ваш список пакетов, которые были явно установлены.

2
27.01.2020, 19:48
  • 1
    я добавил ответ на основе Вашего yum history идея, это также сравнивает результаты с repoquery основанный метод. Как побочный эффект я расширил свой ответ repoquery. –  maxschlepzig 13.07.2013, 22:20

Что я сделал (забыл подробности, а я ленивый бездельник, так что...)

Получить все установленные пакеты: rpm -qa > file

Используйте sed(1), чтобы избавиться от номеров версий и тому подобного (сохраните архитектуру, если требуется). Это потребовало нескольких итераций, чтобы добиться нужного результата, вы хотите заменить последнюю строку -[0-9.]-[0-9].fc23 или подобную на ничто, но есть и забавные "номера" версий.

После установки, как обычно, выполните yum -y install $(<файл) (или dnf, как требуется).

Вы получите некоторые выпадения пакетов, которые больше не существуют, или изменили название, или были заменены другими.

-1
27.01.2020, 19:48

Чтобы просмотреть пакеты , которые вы установили,попробуй этот один -вкладыш:

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

Результат:

# 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 :не показывает зависимости

PS2 :отсортировано по алфавиту

PS3 :не отображается, удалили ли вы пакет позже

0
27.01.2020, 19:48

Теги

Похожие вопросы