Як повторити вибір встановленого пакету з одного екземпляра Fedora в інший?


16

У мене є система Fedora (A), де я встановив деякі пакети протягом часу. Тепер я хочу встановити Fedora на інший комп'ютер (B) і хочу встановити ті самі пакети на ньому.

У термінах Debian я хочу здійснити щось подібне:

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

Але якщо чесно, я дійсно хочу кращого методу вибору тих самих пакетів у новій системі Fedora 19 (B): я просто хочу встановити пакунки із системи A, які були чітко вказані в командному рядку dnf install(або yum install) - а не ті, які були встановлені як залежності!

Чому? Тому що, можливо, залежності змінилися - і я не хочу встановлювати застарілі залежності в новій системі. Плюс до цього, коли я видаляю пакунки, я хочу видалити (можливо), потім непотрібні автоматично встановлені залежності (тобто сироти).

Я знайшов dnf list installed- але він не відображається, якщо пакет був явно обраний або просто встановлений через залежність.

Як отримати цю інформацію про Fedora?

Який спосіб Fedora / dnf для копіювання вибору пакунків?

Відповіді:


12

Оскільки 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. Додаткова грепа у наведеному вище прикладі відфільтровує їх.

Щоб встановити список на хості 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-ish епохи (приблизно з 2015-11 рр.) Є актуальними наступні питання):

Запит

У старих системах Fedora, де Dnf, API Dnf і dnf history userinstalledнедоступні, замість цього можна використовувати репост , наприклад:

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

@slm, hm, з якого сховища було встановлено ручний гальмо? Можливо, налаштування сховища пов'язане з цим?
maxschlepzig

Я думаю, що це міг бути окремий оберт, який я встановив за допомогою yum localinstall .... Я мав неабияку кількість пакетів, які потрапили в той табір.
slm

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -lповернуло 90 пакетів.
slm

6

Найпростіший спосіб, і він працює довго:

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>

... замість того, щоб самостійно розбирати.


3

Натхненний ОДС «s відповідь я придумав таке yum historyрішення на основі:

Отримати всю детальну історію всіх транзакцій yum install (тобто жодних оновлень), за винятком тих, що виконуються як частина початкових дій інсталятора (транзакції 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

Некрасивий регулярний вираз потрібен для того, щоб відповідати всі види суфіксів версій.

Результати в моїй системі виглядають досить чудово.

Порівняння проти ансамблю на запит (у моїй системі):

метод # пакети
―――――――――――――――――――――――――
репост 569
репост-2-е 216
yum історія 214

(Я переніс результати перезапиту через sort -u)

Чому існують відмінності? Оскільки запит включає всі пакети з транзакцій 1 і 2, тобто всі пакунки, які були встановлені установщиком Fedora. Це пояснює, чому репост запиту включає згадані пакети xorg-x11- drv-mga та друзів.

Порівнюючи repoquery-2nd та yum-history, показує, що repoquery-2nd є більш точним - він не включає деякі вже вилучені пакети. Окрім того, він включає декілька (2 у моїй системі) пакунків із операцій 'yum update', здається.

Увага

Вищенаведений метод на основі історії лише перераховує всі явно встановлені пакети протягом усього терміну експлуатації системи. Він не врівноважує ті пакунки, які було вилучено пізнішою транзакцією. Таким чином, цей метод потребує певного ручного курінгу результатів, і його слід використовувати лише в тих системах, коли вони repoqueryнедоступні.


Гарний спосіб взяти найкраще з обох наших відповідей! Я хотів би дати вам більше, ніж +1, якби міг отримати можливе рішення + приємне порівняння різних способів зробити це.
slm

2

У мене є старіша версія Fedora (14), тому мій yum включає в себе менш багату функцію версію 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-ї операції 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

Зверніть увагу, як yum повідомляє про те, чи був пакет явно встановлений чи встановлений, оскільки він був потрібний залежності. Ви можете проаналізувати цю інформацію та отримати список пакунків, які були явно встановлені.


Я додав відповідь на основі вашої yum historyідеї, вона також порівнює результати з repoqueryметодом, що базується. Як побічний ефект я поширив свою відповідь на запит.
maxschlepzig

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

1
Переглядаючи інші 5 відповідей тут, що ви помічаєте, що відрізняється від вашої відповіді? Абсолютно немає пояснень, чому або як краще відповідати ваша відповідь. Було б добре, якби ви могли надати якийсь опис вашої відповіді, який стосується цих речей.
Стівен Рауч

@StephenRauch, ця команда не включена в інші відповіді, оскільки це нещодавнє додавання dnf. --userinstalledПеремикач був просто доданий в DNF в травні . Я перевірив це, і він дає точні результати. Модулюйте пакети ядра / ядра / ядра / ядра, які не встановлені користувачем. Він також містить усі *-debuginfoпакети - але вони можуть бути легко відфільтровані, якщо необхідно.
maxschlepzig

@maxschlepzig, дякую за відгуки, але це насправді було трохи риторичного питання, намагаючись навчити / підказати відповідь-ер у поясненні цього у відповіді.
Стівен Рауч

@StephenRauch, досить чесно, деяке редагування, безумовно, було б доречним і дозволило б мені позначити це як прийняту відповідь.
maxschlepzig

0

До списку пакетів ви встановили, спробуйте цей один вкладиш :

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: не відображається, якщо ви видалили пакет пізніше


-1

Що я зробив (забув подробиці, і я ледачий бам, так що ...

Отримати всі встановлені пакети: rpm -qa > file

Використовуйте sed(1)для позбавлення від номерів версій і подібних (зберігайте архітектуру, якщо потрібно). Для того, щоб виправити це, було потрібно кілька ітерацій, ви хочете -[0-9.]-[0-9].fc23нічим не замінити останню ділянку чи подібне, але є і кумедні "номери" версії.

Після установки як звичайного, зробіть yum -y install $(< file)(або dnf, як потрібно).

Ви отримаєте декілька помилок пакунків, які вже не існують, або змінили назву, або були замінені іншими.


Гаразд, але це позначатиме всі раніше встановлені пакети як встановлені користувачем на хості призначення. Навіть якщо вони спочатку були встановлені лише як залежність.
maxschlepzig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.