38

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

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

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


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

8 ответов8

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), но его трудно анализировать, и его можно прочитать только с правами суперпользователя; 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 сам по себе , так как управление пакетами является большой частью того , что делает различные дистрибутивы разные.)

7

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

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

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

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

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

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)

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

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

1

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

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .