Estou tentando instalar o SDK OpenCL da Intel, mas os arquivos DEB são conversões com erros de RPM (consulte 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 reembalar o conteúdo para fazer um novo DEB? Vou apenas editar arquivos, nenhum arquivo será adicionado ou removido.

Comentários

  • a parte de descompactação pode ser feita a partir do midnight commander (apt install mc) – basta pressionar Enter em um arquivo deb

Resposta

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

Para descompactar o pacote, crie um diretório vazio e mude para ele, então execute dpkg-deb para extrair suas informações de controle e os arquivos de 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 

Cuidado, a menos que seu script seja executado como root, os arquivos ” permissões e propriedade serão corrompidos no estágio de extração. Uma maneira de evitar isso é executar seu script em fakeroot . Observe que você precisa executar toda a sequência em fakeroot, não cada dpkg-deb individualmente, uma vez que “é o fakeroot processo que mantém a memória das permissões dos arquivos que não podem ser criados como estão.

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

Em vez de bagunçar 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 “re ar arquivos. Portanto, você pode usar ar para extrair o arquivo de controle, modificar seus arquivos e usar ar novamente para substituir o arquivo 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 qualquer coisa no pacote. A infraestrutura para manipular 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 motivos de classificação, o sufixo deve começar com ~, por ex. 1.2.3-4.1 torna-se 1.2.3-4.1~johnjumper1.

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

Comentários

  • Você também pode usar a -e switch de fpm para alterar o arquivo de controle: fpm -e -s deb -t deb ../old.deb. Isso abrirá o arquivo de controle em seu editor.
  • btw, fakeroot bash e tentar emitir comandos não funcionará com relação à propriedade e o ar método é incrivelmente rápido para grandes arquivos deb!
  • Obrigado. Isso foi útil. Usando dpkg-deb -R os modos foram mantidos e dpkg-deb -b redefiniu o uid:gid dos arquivos extraídos para 0:0. Não ' precisava do fakeroot (imagino que poderia haver problemas se houvesse arquivos de id {u, g} configurados dentro do arquivo, mas não fosse ' é o caso na minha situação.
  • @PSkocik Não apenas arquivos setxid, também, por exemplo, arquivos e diretórios em /etc ou /var que precisam pertencer a um grupo específico.
  • Obrigado pela ótima resposta. Existe uma maneira de garantir que o pacote reconstruído vs pacote original tenha o mesmo md5sum?

Resposta

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

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb 

Comentários

  • Para instalar fpm no Debian / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem install fpm

Resposta

Se você deseja apenas extrair arquivos de um arquivo .deb le, 7-Zip é conveniente. 7-Zip suporta arquivos “ar” para “descompactar apenas”. (Não há necessidade de renomear o arquivo; ele abre * .deb como “ar” e mostra “data.tar” dentro.)

Comentários

  • Bem-vindo ao site, e obrigado por sua contribuição.Observe que o OP solicitou especificamente " desempacotar o DEB … e reempacotar o DEB ". Talvez você possa editar sua postagem para abordar esse assunto também.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *