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

9925
quark

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

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

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


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

38
Вы вряд ли получите один простой ответ для всех дистрибутивов Linux. Управление пакетами - это большая часть того, что отличает разные дистрибутивы Linux. Telemachus 14 лет назад 0
Телемах - правда. И может иметь смысл разделить это на два вопроса. Но это казалось довольно специализированным вопросом, и я использую обе системы, поэтому я не хотел сужать это заранее. Похоже, что большинство ответов здесь для dpkg / apt, поэтому отдельный вопрос для rpm / yum может иметь смысл. quark 14 лет назад 0
Переключиться на NixOS :) (просто троллинг). Alexey 7 лет назад 0

8 ответов на вопрос

31
Telemachus

На любом компьютере с 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, так что это автоматически, что является серьезной победой. И если сделать это на ванильной машине, разница в списках достаточно близка к тому, что я прошу, чтобы быть практически полезным. quark 14 лет назад 0
Обратите внимание, что теперь APT ведет журнал в /var/log/apt/history.log и используется `apt-get`,` synaptic` и `aptitude` (насколько я видел). Это с начала 2010 года. Tshepang 13 лет назад 3
Выражения `dpkg.log` не выглядят правдоподобными в Ubuntu 14.04, так как любой пользователь, я могу получить свой выбор легко, не тривиально, но не слишком сложно. `awk '$ 3! =" install "; /var/log/dpkg.log | сортировать | uniq` Steve Buzonas 9 лет назад 0
На самом деле, я понимаю, что это не так просто, как я изначально думал, недостаток предыдущего скрипта awk не обращает внимания на неустановленные пакеты. Следующий `awk '$ 3! ~ / Install | remove | purge / END }} '/var/log/dpkg.log | сортировать Steve Buzonas 9 лет назад 0
7
Ludwig Weinzierl

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

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

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

Основная идея сильна: используйте командную строку для вывода списка установленных на данный момент приложений, а затем используйте командную строку для установки этих пакетов на новый компьютер. Вы можете стать довольно креативными и конкретными с подходом. pcapademic 14 лет назад 3
Я предпочитаю dpkg --get-selection CesarB 14 лет назад 1
Хотя это не отслеживает пакеты, которые я добавил отдельно от их зависимостей, оно определенно генерирует полезный список. quark 14 лет назад 0
3
pupeno

Способность на самом деле довольно хороша в этом. 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 - разные операционные системы и должны рассматриваться как таковые (даже если они совместно используют свое ядро ​​и некоторые другие вещи).

Я думаю, что вы можете получить эту информацию без необходимости `grep`:` поиск aptitude '~ i! ~ M'` должен помочь. Telemachus 14 лет назад 2
Кроме того, `apt-get` не считается устаревшим. Debian рекомендует использовать `aptitude` для управления пакетами в командной строке, но это далеко от того, чтобы отрицать` apt-get`. Telemachus 14 лет назад 1
Здесь есть что-то тонкое. Поиск «А» в третьем столбце, кажется, помечает пакеты, которые, как я знаю, установлены как зависимости. Но он явно не охватывает их всех: большая часть списка точно не была установлена ​​по моему явному запросу. quark 14 лет назад 0
@Telemachus. Ваша команда и команда с шаблоном не делают одно и то же: два списка имеют разное содержимое. Я не знаю достаточно о способностях, чтобы сказать вам, почему, хотя. quark 14 лет назад 0
@Pablo: ссылки на ваш журнал кажутся неработающими. Если вы можете исправить их, я бы определенно хотел их прочитать. quark 14 лет назад 0
@quark: ссылки исправлены. pupeno 14 лет назад 0
@ J.Pablo: На моей машине две команды выдают одинаковый вывод (как и должны). Возможно, вы установили несколько пакетов нестандартным способом? Telemachus 14 лет назад 0
Телемах: какие две команды? (Я никогда не устанавливаю пакеты нестандартным способом). pupeno 14 лет назад 0
@ J.Pablo: Извините, я отвечал на комментарий Кварка, но я неправильно прочитал и ответил вам. Эти две команды - ваши с `grep` (` поиск aptitude ~ i | grep -v "i A" `) и моя попытка без` grep` (`поиск aptitude ~ ~ i! ~ M'`). Кварк сказал, что он получил разные списки от двух команд. Я не думаю, что результат должен быть другим, но, возможно, я что-то здесь упускаю. Telemachus 14 лет назад 0
2
seb

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

Отметил. По-видимому, это не установлено (по умолчанию) в Ubuntu. quark 14 лет назад 0
1
Wade

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

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

От 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
jmiserez

При простом использовании 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) 

Очень немногие пакеты еще падают через трещину, хотя я подозреваю, что они являются на самом деле установлены пользователем, либо сразу после установки через настройку локализации языка или, например, с помощью программы установки Тотема кодека. Кроме того, версии заголовков 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
Stefano Borini

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

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

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

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

Вы можете просто поместить команды установки менеджера пакетов в скрипт и получить тот же эффект; при условии, что нужный вам код упакован. Ваш подход очень похож на Gentoo. wcoenen 14 лет назад 0
Приятно знать о. Похоже, много дополнительной работы помимо системы Ubuntu / Debian по умолчанию. Я вижу, как вручную поддерживаются некоторые пакеты, но поддерживать * все * из них таким способом - больше работы, чем я хочу. quark 14 лет назад 0
Да, но с дополнительной проблемой, что вещи ubuntu / fink / darwinports не работают кроссплатформенно везде (я был на цифровом и IBM sp4 однажды). Я не утверждаю, что это хороший способ. Я просто говорю, что это делает работу, хотя и уродливым, вонючим способом, и я полностью контролирую то, что происходит в моей системе. Stefano Borini 14 лет назад 0
Конечно, я мог бы на днях принять решение серьезно взглянуть, чтобы появиться и все переделать с ним. Stefano Borini 14 лет назад 0
Этот путь более распространен в наши дни, когда вы рассматриваете такие инструменты, как повар и марионетка. Steve Buzonas 9 лет назад 0