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

15

Estou tentando configurar um ambiente 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 (como no sistema principal) na VM, depois 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

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

O problema é com dpkg --set-selections executado 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 preparação), mas quando executo o último comando acima, recebo cerca de um zilhão de linhas de saída como:

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

para pacotes que realmente deveriam estar disponíveis no sistema básico. Exemplos incluem xterm , yelp e zip .

Agora, para 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, em Wheezy) e depois aplicar essas mudanças? O objetivo é que ambos tenham a mesma lista de pacotes instalados, o ideal é que seja feita uma diff entre as saídas de dpkg --get-selections ou dpkg --list nas duas, sem diferenças.

A parte grep -v deinstall é emprestada de Impede que os pacotes sejam removidos depois de fazer dpkg --set-selections no Ask Ubuntu.

Alterei a fonte na VM para ser a mesma que no sistema principal, também instalando 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, vejo:

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 de linha pareciam estranhos, 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

Observe que entre acl e aglfn são acpi-support-base , acpid e adduser para os quais nenhum erro está sendo relatado . Parece que os pacotes para os quais os erros estão sendo relatados são un de acordo com dpkg -l ou dpkg -l não tem nenhuma idéia sobre eles ( dpkg-query: no packages found matching ... ). Eu sei que existem alguns pacotes instalados localmente, mas não muitos. i386 não figura até gcc-4.7-base:i386 install muito mais abaixo na lista (linha 342 na saída --get-selections).

    
por a CVn 21.03.2015 / 20:01

2 respostas

11

Para clonar uma instalação Debian, use o utilitário apt-clone . Está disponível (como um pacote separado, não faz parte da instalação padrão) no Debian desde wheezy e no Ubuntu desde 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 em que apt-clone não esteja disponível ou se você quiser apenas replicar a lista de pacotes instalados, mas não qualquer arquivo de configuração, veja 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ê tenha sido afetado por uma alteração incompatível no dpkg que o transformou em wheezy. Consulte o bug # 703092 para obter informações.

A história resumida é que dpkg --set-selections agora só aceita nomes de pacotes que estão presentes no arquivo /var/lib/dpkg/status ou /var/lib/dpkg/available . Se você usa o APT apenas para gerenciar pacotes, como a maioria das pessoas, então /var/lib/dpkg/available não é mantido atualizado.

Depois de executar apt-get update e antes de executar dpkg --set-selections e 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 fará o download das listas de pacotes novamente é

dselect update

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

Observe que clonar uma instalação de pacote com dpkg --set-selections não restaura a marca automática / manual no APT. Veja Restaurando todos os dados e dependências do dpkg --set-selections ' * ' para 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
    
por 21.03.2015 / 21:18
0

Como eu fiz isso

  1. No host source :

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

    se preocupe com /etc/apt/sources.list.d se usado ...

    Em seguida, copie o arquivo source.sel para o host de destino.

  2. No host destino :

    vi /etc/apt/sources.list 
    

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

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

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

por 20.12.2017 / 11:03