Como replico as seleções de pacotes instalados de um sistema Debian para outro? (Debian Wheezy)

19

Estou tentando configurar um ambiente de armazenamento temporário em uma VM, para testar as atualizações antes de aplicá-las ao meu sistema principal.

Para fazer isso, eu fiz uma instalação básica do Debian Wheezy (igual ao sistema principal) na VM e, em seguida, executei como root a partir da VM:

# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh me@main-system 'dpkg --get-selections | grep -v deinstall' | \
  dpkg --set-selections

Infelizmente, a arquitetura i386 é necessária no meu caso; o sistema é amd64 nativo.

O problema está em dpkg --set-selectionsexecução na VM. Eu tenho alguns pacotes que requerem tratamento especial (esses são, na verdade, a principal razão pela qual eu quero um ambiente de armazenamento temporário), mas quando executo o último comando acima, recebo um zilhão de linhas de saída como:

dpkg: warning: package not in database at line NNN: package-name

para pacotes que realmente devem estar disponíveis no sistema base. Exemplos incluem xterm, yelpe zip.

Agora, minha pergunta:

Qual é o processo específico para transferir a lista de seleção de pacotes de um sistema Debian para outro (assumindo o mesmo nível de lançamento do Debian, no Wheezy) e depois aplicar essas mudanças posteriormente? O objetivo é que ambos tenham a mesma lista de pacotes instalados, idealmente, fazendo um diffentre as saídas dpkg --get-selectionsou dpkg --listnas duas voltando, sem mostrar diferenças.

A grep -v deinstallparte é emprestada dos pacotes Impedir que sejam removidos depois de repetirdpkg --set-selections o processo no Ask Ubuntu.

Mudei a fonte na VM para ser a mesma do sistema principal, instalando também apt-transport-https:

deb https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb [arch=amd64] http://archive.zfsonlinux.org/debian wheezy main

Olhando para a saída --set-selections, estou vendo:

dpkg: warning: package not in database at line 1: a2ps
dpkg: warning: package not in database at line 1: abiword
dpkg: warning: package not in database at line 1: abiword-common
dpkg: warning: package not in database at line 1: abiword-plugin-grammar
dpkg: warning: package not in database at line 1: abiword-plugin-mathview
dpkg: warning: package not in database at line 1: accountsservice
dpkg: warning: package not in database at line 1: acl
dpkg: warning: package not in database at line 4: aglfn
dpkg: warning: package not in database at line 4: aisleriot
dpkg: warning: package not in database at line 4: alacarte
dpkg: warning: package not in database at line 4: alien
...

Os números das linhas pareciam ímpares, e a parte correspondente da saída de --get-selections é:

a2ps install
abiword install
abiword-common install
abiword-plugin-grammar install
abiword-plugin-mathview install
accountsservice install
acl install
acpi-support-base install
acpid install
adduser install
aglfn install
aisleriot install
alacarte install
alien install

Note que entre acle aglfnsão acpi-support-base, acpide adduser para os quais não erros estão sendo relatados . Parece que os pacotes para os quais os erros estão sendo relatados estão de unacordo dpkg -lou dpkg -lnão têm idéia alguma sobre eles ( dpkg-query: no packages found matching ...). Eu sei que existem alguns pacotes instalados localmente, mas não muitos. i386não aparece até gcc-4.7-base:i386 install muito mais abaixo na lista (linha 342 na saída --get-selections).

um CVn
fonte
dpkg --get-selections … | … dpkg --set-selectionsé a maneira de replicar seleções de pacotes. Se estiver falhando, você precisará fornecer mais informações sobre o motivo. Poste seu conjunto completo de fontes nos dois sistemas, na saída de dpkg --get-selectionse na transcrição completa de dpkg --get-selections(talvez possamos discernir um padrão vendo o que funciona e o que não funciona). Se o sistema principal amd64 ou i386? Funciona se você não adicionar a arquitetura i386?
Gilles 'SO- stop being evil'
@ Gilles Realmente precisa ser a saída completa de dpkg --get-selections(e eu suponho que você quis dizer a dpkg --set-selectionstranscrição?)? Mesmo apenas o primeiro tem mais de 3.600 linhas e cerca de 100 KB.
a CVn
Você precisa postar o suficiente para discernir o padrão de quais pacotes acionam erros e quais não (a menos que você possa descobrir por si mesmo). Uma cópia de /var/lib/dpkg/Packages(que é ainda mais longa) também pode ser útil - isso pode ser um sintoma de um arquivo de Pacotes quebrado.
Gilles 'SO- stop be evil'
@Gilles Ponto interessante. Eu realmente não tinha considerado a possibilidade, mas uso espelhos diferentes nesses. Deixe-me ver se isso ainda acontece se eu apontar a VM para o mesmo espelho Debian. Modo de espera.
a CVn
@ Gilles Isso realmente não fez nenhuma diferença perceptível, mas eu encontrei outra coisa. Veja a pergunta atualizada.
a CVn

Respostas:

17

Para clonar uma instalação Debian, use o apt-cloneutilitário. Está disponível (como um pacote separado, não faz parte da instalação padrão) no Debian desde o wheezy e no Ubuntu desde o 12.04. Na máquina existente, execute

apt-clone clone foo

Isso cria um arquivo foo.apt-clone.tar.gz. Copie-o para a máquina de destino e execute

apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz

Se você estiver trabalhando com um sistema antigo, onde apt-clonenão está disponível, ou apenas deseja replicar a lista de pacotes instalados, mas não qualquer arquivo de configuração, aqui estão as etapas manuais.

  • Na máquina de origem:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • Na máquina de destino:

    cp sources.list /etc/apt/
    apt-get update
    /usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
    dpkg --set-selections <selections.list
    apt-get dselect-upgrade
    xargs apt-mark auto <auto.list
    

Acredito que você seja afetado por uma alteração incompatível no dpkg que primeiro o transformou em chiado. Veja o bug # 703092 para obter mais informações.

A história curta é que dpkg --set-selectionsagora só aceita nomes de pacotes que estão presentes no arquivo /var/lib/dpkg/statusou /var/lib/dpkg/available. Se você usar o APT apenas para gerenciar pacotes, como a maioria das pessoas, ele /var/lib/dpkg/availablenão será atualizado.

Depois de executar apt-get updatee antes de executar dpkg --set-selectionse apt-get -u dselect-upgrade, execute o seguinte comando:

apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail

De Jessie em diante, você pode simplificar isso para

apt-cache dumpavail | dpkg --merge-avail

Como alternativa, execute

/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/

ou ainda mais simples

apt-get install dctrl-tools
sync-available

Outro método simples que não requer a instalação de um pacote adicional, mas faz o download das listas de pacotes novamente é

dselect update

Veja as perguntas frequentes do dpkg para obter mais informações. (Isso é mencionado na página do manual do dpkg, mas mais de uma maneira que lembraria o problema se você já estivesse ciente, não de uma maneira que explique como resolver o problema!)

Observe que a clonagem de uma instalação de pacote com dpkg --set-selectionsnão restaura a marca automática / manual no APT. Consulte Restaurando todos os dados e dependências do dpkg --set-selections '*' para obter mais detalhes. Você pode salvar as marcas no sistema de origem com

apt-mark showauto >auto.list

e restaure-os no sistema de destino com

xargs apt-mark auto <auto.list
Gilles 'SO- parar de ser mau'
fonte
3
Esse problema deve ser muito mais visível do que é. Não acredito que nunca ouvi falar disso antes!
Faheem Mitha
Interessante. Vai dar uma chance a isso. Obrigado!
a CVn
@FaheemMitha Sim, estou surpreso por nunca ter ouvido falar disso antes de hoje. Não acredito que não usei dpkg --set-selectionsdesde antes do chiado!
Gilles 'SO- stop being evil'
Ok, isso deu uma lista muito mais curta de avisos de --set-selections. Agora, como aplico as alterações? Até apt-get -u dist-upgrademenciona apenas um punhado de pacotes (todos relacionados ao ZFS), onde deve haver centenas, senão milhares de pacotes afetados.
a CVn
@ MichaelKjörling That'sapt-get -u dselect-upgrade
Gilles 'SO- stop be evil'
0

Como eu fiz isso

  1. No host de origem :

    apt-get update && apt-get dist-upgrade
    dpkg --get-selection >/tmp/source.sel
    cat /etc/apt/sources.list
    

    se preocupam /etc/apt/sources.list.dse usado ...

    Em seguida, copie o source.selarquivo para o host de destino.

  2. No host de destino :

    vi /etc/apt/sources.list 
    

    adapte sources.list mesmo com espelhos diferentes, mas a mesma lista de componentes .

    apt-get update
    dselect upgrade
    dpkg --set-selection </tmp/source.sel
    dselect install
    

    E agora, meu host de destino está instalando muitas coisas no momento, então eu poderia levar algum tempo para postar isso.

techno
fonte
Talvez 'dselect upgrade' deva ser 'dselect update' na descrição 'Como eu fiz isso' acima.
Jonathan Kimmitt