Descompacte facilmente o DEB, edite o postinst e reembale o DEB

93

Eu estou tentando instalar o OpenCL SDK da Intel, mas os arquivos DEB são buggy conversões do RPM (veja aqui para os curiosos). Preciso editar o script postinst no DEB que eles fornecem.

Como posso pegar um DEB existente, extrair o conteúdo (incluindo as informações de controle) e depois reempacotar o conteúdo para criar um novo DEB? Vou apenas editar arquivos, nenhum arquivo será adicionado ou removido.

    
por John Jumper 20.06.2014 / 03:36

2 respostas

158

O principal comando para manipular pacotes deb é dpkg-deb .

Para descompactar o pacote, crie um diretório vazio e alterne para ele, em seguida, execute dpkg-deb para extrair suas informações de controle e os arquivos do pacote. Use dpkg-deb -b para reconstruir o pacote.

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

Tenha em atenção que, a menos que o seu script esteja em execução como raiz, as permissões e a propriedade dos ficheiros serão danificadas no estágio de extração. Uma maneira de evitar isso é executar seu script em fakeroot . Observe que você precisa executar a sequência inteira em fakeroot , não cada dpkg-deb individualmente, pois é o processo fakeroot que mantém a memória das permissões dos arquivos que não podem ser criados como são.

fakeroot sh -c '
  mkdir tmp
  dpkg-deb -R original.deb tmp
  # edit DEBIAN/postinst
  dpkg-deb -b tmp fixed.deb
'

Em vez de mexer com permissões, você pode manter o arquivo de dados intacto e modificar apenas o arquivo de controle. dpkg-deb não fornece uma maneira de fazer isso. Felizmente, os pacotes deb estão em um formato padrão: eles são ar . Portanto, você pode usar ar para extrair o archive de controle, modificar seus arquivos e usar ar novamente para substituir o archive de controle por uma nova versão.

mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

Você deve adicionar uma entrada do changelog e alterar o número da versão se você modificar alguma coisa no pacote . A infra-estrutura para manipular os pacotes Debian assume que, se dois pacotes tiverem o mesmo nome e versão, eles são o mesmo pacote. Adicione um sufixo à parte debian_revision no final do número da versão; Por razões de classificação, o sufixo deve começar com ~ , por ex. 1.2.3-4.1 se torna 1.2.3-4.1~johnjumper1 .

Em vez de usar ferramentas shell, você pode usar o Emacs. O dpkg-dev-el package (que é seu próprio upstream, pois este é um pacote Debian nativo) contém modos para editar .deb arquivos e editar changelogs do Debian. O Emacs pode ser usado interativamente ou com scripts.

    
por 20.06.2014 / 04:18
5

Você pode usar fpm com a opção --after-install para substituir o script postinst , assim:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
    
por 01.10.2015 / 07:20