Как вы отслеживаете, какие пакеты были установлены в Ubuntu (Linux)?


38

(Этот вопрос очень похож на 10458. Было высказано предположение, что Fedora и Ubuntu / Debian достаточно разные, чтобы гарантировать разные ответы.)

Поскольку я использую любую установку Ubuntu, я постепенно устанавливаю несколько пакетов сверх базовой установки. Если я переустанавливаю или мне нужно установить новую машину, я обычно хочу переустановить эти конкретные пакеты, и я хочу сделать это быстро, чтобы вернуться к работе с минимумом хлопот. Насколько я видел все менеджеры пакетов ( apt-get, aptitudeи synaptic) может сказать мне , какие установлены пакеты, и все они имеют бревна (хотя и различных единиц для каждого инструмента, который является хлопот). Но никто из них не может сказать мне, какие пакеты у меня естьустановлен, в отличие от их зависимостей или системных обновлений. Даже журналы хитры в том, что я не совсем уверен, что мне следует из них извлекать или как их интегрировать (в случае различных инструментов семейства apt). Это означает, что каждый раз, когда я переустанавливаю или даже просто делаю резервную копию, я не уверен, как заново создать этот список.

Я не обязательно ожидаю, что какой-либо инструмент сделает это для меня, но если они этого не делают, я ищу обходные пути. Даже шаблоны для поиска, хорошие эмпирические правила или четкое представление о том, что именно регистрируется, были бы полезны. Здесь не может быть «лучшего ответа», но хорошие будут очень полезны.


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


Вы вряд ли получите один простой ответ для всех дистрибутивов Linux. Управление пакетами - это большая часть того, что отличает разные дистрибутивы Linux.
Телемах

Телемах - правда. И может иметь смысл разделить это на два вопроса. Но это казалось довольно специализированным вопросом, и я использую обе системы, поэтому я не хотел сужать это слишком заранее. Похоже, что большинство ответов здесь для dpkg / apt, поэтому может иметь смысл отдельный вопрос для rpm / yum.
кварк

Переключиться на NixOS :) (просто троллинг).
Алексей

Ответы:


31

На любом компьютере с Debian это один из распространенных способов дублирования набора пакетов. На старой машине:

dpkg --get-selections "*" > my_favorite_packages

Скопируйте файл my_favorite_packagesна новый компьютер (флэш-накопитель является хорошим вариантом, но scpтакже отлично работает). Затем запустите эту последовательность (с правами суперпользователя):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

Это не дает вам только те пакеты, которые вы установили. Он также получает их зависимости и т. Д. Кроме того, если хранилища между двумя компьютерами разные, все ставки отключены.

Что касается журналов, apt-getведет журнал в /var/log/apt/history.log(спасибо Tshepang за обновление этого в комментарии); dpkgделает (в /var/log/dpkg.log), но это, как известно, трудно анализировать и может быть прочитано только с привилегиями root; aptitudeимеет один на /var/log/aptitudeи вы можете просматривать его с правами обычного пользователя.

Насколько я могу судить, вы правы, что ни один из этих журналов не отслеживает конкретно то, что вы установили, в отличие от автоматически устанавливаемых зависимостей. Вы можете получить эту информацию, однако, из aptitudeпоиска. Поиск всех установленных пакетов, которые также были установлены автоматически:

aptitude search '~i ~M'

Если вам нужны только те, которые вы установили (не авто-зависимости), отмените ~M:

aptitude search '~i !~M'

Если вы хотите, чтобы он был отформатирован так, чтобы у вас были только имена пакетов и слово «установить», aptitudeможете сделать это тоже. Это дает вам список готовых к подаче dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(У меня ничего нет в системах RedHat или RedHat. Извините. На самом деле нет единого ответа для Linux как такового, поскольку управление пакетами - это большая часть того, что делает разные дистрибутивы разными .)


Похоже, сочетание ваших советов и советов Людвига может сработать: aptitude может сгенерировать сценарий для передачи в dpkg, так что это автоматически, что является серьезной победой. И если сделать это на ванильной машине, разница в списках достаточно близка к тому, что я прошу, чтобы быть практически полезным.
кварк

3
Обратите внимание , что APT теперь хранит журнал в «/var/log/apt/history.log», и используется apt-get, synapticи aptitude(насколько я видел). Это с начала 2010 года.
Чепанг

В dpkg.logUbuntu 14.04 эти утверждения, похоже, не соответствуют действительности, так как любой пользователь, которого я могу получить, выбирает легко, не тривиально, но не слишком сложно. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Стив Бузонас

На самом деле, я понимаю, что это не так просто, как я изначально думал, недостаток предыдущего скрипта awk не обращает внимания на неустановленные пакеты. Следующее awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -uделает.
Стив Бузонас

7

Используйте, dpkg -l '*' > jaunty.originalчтобы запомнить все установленные пакеты в только что установленной системе.

После того, как вы установили все ваши дополнительные пакеты, сделайте dpkg -l '*' > mysystem.2009017.

Дополнительные пакеты - только разница: diff jaunty.original mysystem.2009017


3
Основная идея сильна: используйте командную строку, чтобы вывести список установленных приложений, а затем используйте командную строку, чтобы установить эти пакеты на новый компьютер. Вы можете стать довольно креативными и конкретными с подходом.
pcapademic

1
Я предпочитаю dpkg --get-selections
CesarB

Хотя это не отслеживает пакеты, которые я добавил отдельно от их зависимостей, оно определенно генерирует полезный список.
кварк

3

Способность на самом деле довольно хороша в этом. Aptitude знает, когда что-то было установлено вручную или по зависимости, и вы можете сказать ему, чтобы он удалил вещи, которые больше не нужны и были установлены только потому, что что-то еще зависело от этого, всегда поддерживая вашу систему как можно меньше.

Существует несколько пакетов, которые составляют установку Ubuntu, Ubuntu-Minimal, Ubuntu-Desktop, Ubuntu-Server и так далее. Если вы скажете Aptitude пометить их как установленные вручную и удалить все остальное, вы получите минимально возможное количество пакетов.

Я объясняю, как это сделать, в двух постах в моем блоге: Очистка Debian GNU / Linux и Очистка Debian GNU / Linux (или Ubuntu), повторение . Короче говоря, вы ищете ответ:

aptitude search ~i | grep -v "i A"

В прошлый раз, когда я работал с этим, если вы использовали apt-get, то это не сработало. Вот почему я всегда рекомендую aptitude, и насколько я знаю, Debian отвергает apt-get в пользу aptitude.

Я не знаю, как это сделать на Fedora, и вы, вероятно, должны отделиться, чем в другой вопрос. Fedora и Ubuntu являются разными операционными системами и должны рассматриваться как таковые (даже если они совместно используют свое ядро ​​и некоторые другие вещи).


2
Я думаю, что вы можете получить эту информацию без необходимости grep: aptitude search '~i !~M'следует сделать свое дело.
Телемах

1
Кроме того, apt-getне считается устаревшим. Debian рекомендует aptitudeуправлять пакетами из командной строки, но это далеко не устарело apt-get.
Телемах

Здесь есть что-то тонкое. Поиск «А» в третьем столбце, кажется, помечает пакеты, которые, как я знаю, установлены как зависимости. Но он явно не охватывает их всех: большая часть списка точно не была установлена ​​по моему явному запросу.
кварк

@Telemachus. Ваша команда и команда с шаблоном не делают одно и то же: два списка имеют разное содержимое. Я не знаю достаточно о способностях, чтобы сказать вам, почему, хотя.
кварк

@Pablo: ссылки на ваш журнал кажутся неработающими. Если вы можете исправить их, я бы определенно хотел их прочитать.
кварк

2

На Debian apt-show-version показывает версии установленных пакетов.


Принято к сведению. По-видимому, это не установлено (по умолчанию) в Ubuntu.
кварк

1

В системах на основе apt смотрите /var/log/apt/term.log. Для меня есть довольно четкая линия, чтобы нарисовать, где установка закончилась и где мои установки начались.


Менее полезен для меня, потому что есть смешивание ручных установок и системных обновлений. Также в зависимости от вашей настройки term.logs в конечном итоге будет устаревшим и удаленным, поэтому он не вернется так далеко, как мне нужно.
кварк

Для тех, кто пытается это сделать, обратите внимание, что просмотр журнала apt кажется гораздо более трудоемким, чем другие варианты, обсуждаемые здесь. Это, конечно, не автоматическое извлечение списка пакетов из журнала.
кварк

1

От man aptitude-create-state-bundle:

aptitude-create-state-bundle создает сжатый архив, в котором хранятся файлы, необходимые для репликации текущего состояния архива пакета.

Это сохранит ту же информацию, что aptitudeи данные о том, какие пакеты были установлены вручную.

Он предназначен для использования с aptitude-run-state-bundle:

aptitude-run-state-bundle распаковывает данный пакет состояния aptitude, созданный aptitude-create-state-bundle (1), во временный каталог, вызывает его вместе с предоставленным и впоследствии удаляет временный каталог.


1

При простом использовании dpkgвы не знаете, был ли пакет установлен пользователем вручную или автоматически (как зависимость или во время первоначальной установки ОС). Если вы хотите сохранить эту информацию, вам нужно получить список только тех пакетов, которые фактически были установлены вручную.

Для этого вы можете использовать любой из этих двух строк. Оба дают одинаковый результат на моей машине и более точны, чем все решения, предложенные до сих пор в этом вопросе. Они представляют собой комбинацию двух ответов (1) и (2) . Обратите внимание, что я первоначально разместил этот ответ здесь .

Использование apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Использование aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Очень немногие пакеты по-прежнему попадают в трещины, хотя я подозреваю, что они на самом деле устанавливаются пользователем, либо сразу после установки через настройку языковой локализации, либо, например, через установщик кодеков Totem. Кроме того, версии заголовков linux также накапливаются, хотя я установил только не зависящий от версии метапакет. Примеры:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Как это работает

  1. Получить список установленных вручную пакетов. Для способности, дополнительные sedудаляют оставшиеся пробелы в конце строки.
  2. Получите список установленных пакетов сразу после новой установки.
  3. Сравните файлы, выведите только те строки в файле 1, которых нет в файле 2.

Другие возможности не работают так же хорошо:

  • Использование ubuntu-14.04-desktop-amd64.manifestфайла ( здесь для Ubuntu 14.04) вместо /var/log/installer/initial-status.gz. Дополнительные пакеты отображаются как установленные вручную, хотя это не так.
  • Использование apt-mark showautoвместо /var/log/installer/initial-status.gz. apt-markнапример, не включает пакет xserver-xorg, в то время как другой файл включает.

Оба перечисляют больше пакетов, чем приведенное выше решение.


0

Я предвзят, и решение, которое я представляю, не всегда возможно, но я устал от этой ситуации. В результате я больше ничего не устанавливаю с помощью инструментов менеджера обновлений / пакетов.

Я выбрал довольно сложный путь (у меня были строгие требования к версиям). Я создал огромный make-файл, который загружает, компилирует и устанавливает в свой домашний каталог каждый пакет (программу, библиотеку и все, что мне нужно). Я развивал это постепенно, шаг за шагом. Makefile загружает и компилирует все, даже компиляторы.

Когда я перехожу на новую систему или переустанавливаю, я просто копирую make-файл (плюс некоторые вспомогательные материалы), запускаю make world и возвращаюсь на следующий день.

Для некоторых программ, которые я разрабатываю (поэтому у меня есть контроль), я использую инструмент, который я запрограммировал, каштановый менеджер пакетов . Вроде как .app папки на MacOSX. Все в пакете, поэтому я знаю, что установлено в любое время, и я знаю, что он самодостаточен и самодостаточен (за исключением системных библиотек)


Вы можете просто поместить команды установки менеджера пакетов в скрипт и получить тот же эффект; при условии, что код, который вам нужен, упакован. Ваш подход очень похож на Gentoo.
wcoenen

Приятно знать о. Похоже, много дополнительной работы помимо системы Ubuntu / Debian по умолчанию. Я вижу, как вручную поддерживаются некоторые пакеты, но поддерживать все из них таким способом - больше работы, чем я хочу.
кварк

Да, но с дополнительной проблемой, что вещи ubuntu / fink / darwinports не работают кроссплатформенно везде (я был на цифровом и IBM sp4 однажды). Я не утверждаю, что это хороший способ. Я просто говорю, что это делает работу, хотя и уродливым, вонючим способом, и я полностью контролирую то, что происходит в моей системе.
Стефано Борини

Конечно, я мог бы на днях принять решение серьезно взглянуть, чтобы появиться и переделать все вместе с ним.
Стефано Борини

Этот путь более распространен в наши дни, когда вы рассматриваете такие инструменты, как повар и марионетка.
Стив Бузонас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.