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

StackOverflow https://stackoverflow.com/questions/2273836

  •  20-09-2019
  •  | 
  •  

Вопрос

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

т. е.Если бы я установил обычный сервер Ubuntu, выбрал опцию sshd во время установки, затем установил build-essential, я бы ожидал, что результат будет выглядеть примерно так:

#ubuntu 9.10 server
openssh-sshd
build-essential

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

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

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

Это было полезно?

Решение

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

deborphan -anp required --no-show-section

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

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

Другие советы

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

Описание процедуры

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

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

dpkg --get-selections > file

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

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

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

А как насчет этого:

#!/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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top