2010-02-16 3 views
8

Есть ли способ получить dpkg, apt-get или aptitude для создания списка пакетов, которые необходимо установить на второй машине, чтобы дублировать пакеты, установленные на первом?Как я могу указать минимальный набор пакетов Debian, необходимых для воссоздания набора установленных пакетов?

т.е. если я установил простой сервер Ubuntu, выбрал вариант Sshd во время установки, а затем установлен встроенный важно, я бы ожидать выход смотреть что-то вроде:

#ubuntu 9.10 server 
openssh-sshd 
build-essential 

Насколько я могу см., все доступные инструменты упаковки будут содержать подробный список пакетов на коробке. Мне не интересны openssh libs, ld, gcc и все другие пакеты, которые были загружены sshd и build-essential, поскольку они будут установлены при установке sshd и build-essential.

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

Возможно ли это?

ответ

11

deborphan, вид. Он создает список каждого пакета в вашей системе, определяет, что от него зависит, и распечатывает пакеты, которые не имеют каких-либо зависимостей. По умолчанию он только печатает библиотеки (чтобы было проще находить библиотеки, которые были установлены другими пакетами и больше не нужны, следовательно, имя). У него есть варианты для того, чтобы делать то, что вы хотите, в основном. Я бегу это нравится:

deborphan -anp required --no-show-section

-a определяет все пакеты (а не только библиотеки)
-n игнорирует «Предлагает» или «рекомендует» проверить зависимость (т.е. просто «зависит»)
-p required списки все пакеты, несмотря на priority
--no-show-section не указывает, в какой части debian он находится, просто хорошая функция форматирования, которая может оказаться полезной для построения списка.

Теперь он будет пропускать пакеты, потому что некоторые пакеты имеют круговые зависимости. Но они, как правило, довольно необычны, поэтому он должен быть достаточно близко.

+0

Почему «deborphan -anp required --no-show-section» включает в себя «gcc» в своем выходе, когда «apt-rdepends build-essential» показывает, что «build-essential» зависит от «gcc»? – fadedbee

+0

Показывает ли определенная версия gcc, например gcc-4.3, или сам пакет gcc? Если это пакет «gcc», возможно, сборка на самом деле не установлена? ... нет хороших догадок, извините. В моем представлении я вижу строжайшую, но не gcc. –

1

Итак, вы хотите, чтобы список пакетов, которые были явно установлены (например, ubuntu-desktop и openssh), а не автозависимости? Я не уверен, но я думаю, что это то, что делает dpkg --get-selections. Таким образом, вы можете сделать

dpkg --get-selections > file 

А потом, на другом компьютере, используйте один и тот же «файл» и запустить

dpkg --set-selections < file 
apt-get dselect-upgrade 

Я не абсолютно уверен, что эти команды просто выбраны вручную пакеты, хотя, и я в настоящее время вдалеке от любых систем на базе Debian для проверки. :)

+0

Нет, похоже, что он отображает пакеты, которые были втянуты в зависимость. На моей машине список включает такие пакеты, как g ++, g ++ - 4.4, gcc ..., которые, как я знаю, были установлены с помощью build-essential. – fadedbee

2

Код, который отправил dannysauer, является началом. После того, как у вас есть список пакетов, который включает зависимости, вы можете использовать apt-rdepends, чтобы найти зависимости для определенного пакета (например, использование this page).

Процедура очертание

  1. Итерация по списку пакетов возвращенного кода dannysauer в
  2. вызовов apt-rdepends на каждом
  3. Удалить все пакеты из списка, которые отображаются на выходе apt-rdepends
+0

Я думаю, что это также приемлемый подход, но он кажется медленнее и более работоспособным, чем deborphan. Есть ли проблема с использованием deborphan, который разрешает apt-rdepends? – fadedbee

+0

IIRC, 'deborphan' только делает список установленных пакетов, которые не имеют ничего, что зависит от них. Возможно, это не то, что вы хотите (см. Комментарий Эрика выше о 'deborphan', возможно, отсутствующих пакетах). Если у вас есть проблемы, я упомянул 'apt-rdepends', потому что вы всегда можете получить полный список всех установленных пакетов на обеих машинах, удалить пакеты, общие для обоих списков, и изучить оставшиеся пакеты с помощью' apt-rdepends' для генерации кратчайший список пакетов, которые воссоздают ваш текущий пакет, установленный на втором компьютере. Это также должно быть легко доступным для сценариев. – bta

0

А именно:

#!/bin/bash 

packages=$(dpkg --get-selections | grep '[[:space:]]install$' | awk '{print $1}') 

for pkg in $packages 
do 
    nr_lines=$(apt-cache -i rdepends $pkg | wc -l) 
    if [ "$nr_lines" = "2" ] 
    then 
     echo $pkg 
    fi 
done 

Хорошо ли работает? Может ли это как-то улучшить?