Como posso listar o conjunto mínimo de pacotes Debian necessários para recriar um conjunto de pacotes instalados?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Existe uma maneira de obter DPKG, apt-get ou aptidão para produzir uma lista dos pacotes que precisam ser instalados em uma segunda máquina para duplicar os pacotes instalados no primeiro?

ou seja, se eu instalei um servidor Ubuntu simples, escolhi a opção SSHD no horário de instalação e, em seguida, instalei o essencial do Build, eu esperaria que a saída pareça algo como:

#ubuntu 9.10 server
openssh-sshd
build-essential

Até onde eu posso ver, todas as ferramentas de embalagem disponíveis produzirão uma lista detalhada dos pacotes em uma caixa. Não estou interessado em OpenSsh Libs, LD, GCC e todos os outros pacotes atraídos pelo SSHD e Build-Besencial, pois eles serão instalados quando eu instalar o SSHD e o Build-ESTENS.

Gostaria de ver apenas a lista do pacote que preciso instalar para recriar meu conjunto atual de pacotes em outra máquina.

Isso é possível?

Foi útil?

Solução

deborphan, tipo de. Ele constrói uma lista de cada pacote do seu sistema, descobre o que depende de quê e imprime os pacotes que não têm nenhuma dependência. Por padrão, ele imprime apenas as bibliotecas (para facilitar a localização de bibliotecas instaladas por outros pacotes e não é mais necessário, daí o nome). Tem opções para fazer o que você deseja, principalmente. Eu corro como:

deborphan -anp required --no-show-section

-a Especifica todos os pacotes (não apenas bibliotecas)
-n ignora "sugere" ou "recomenda" a verificação de dependência (ou seja, apenas "depende")
-p required lista todos os pacotes, apesar da prioridade
--no-show-section Não indica em que parte do Debian está, apenas um bom recurso de formatação que você pode achar útil para a criação de uma lista.

Agora, ele perderá os pacotes, porque alguns pacotes têm dependências circulares. Mas esses tendem a ser bastante incomuns, então deve chegar ao você o suficiente.

Outras dicas

O código que Dannysauer postou é um começo. Depois de ter uma lista de pacotes que incluem dependências, você pode usar apt-rdepends Para encontrar as dependências para um pacote específico (ver esta página por exemplo, uso e saída).

Esboço do procedimento

  1. Itera através da lista de pacotes devolvidos pelo código de Dannysauer
  2. Ligar apt-rdepends em cada
  3. Exclua todos os pacotes da lista que aparecem na saída de apt-rdepends

Então, você deseja a lista de pacotes que foram explicitamente instalados (como, digamos, Ubuntu-Desktop e OpenSsh), e não as dependências automáticas? Não tenho certeza, mas acho que é isso dpkg --get-selections faz. Então, você pode fazer

dpkg --get-selections > file

E então, no outro computador, use o mesmo "arquivo" e execute

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

Eu não sou absolutamente positivo que esses comandos apenas selecionam pacotes manualmente e, atualmente, estou longe de qualquer sistema baseado em Debian para verificar. :)

Que tal isso:

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

Funciona bem? Pode ser melhorado de alguma forma?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top