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

129

Estou tentando instalar o OpenCL SDK da Intel, mas os arquivos DEB são conversões de bugs do RPM (veja aqui os curiosos). Preciso editar o postinstscript 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 posteriormente para criar um novo DEB? Editarei apenas arquivos, nenhum arquivo será adicionado ou removido.

John Jumper
fonte

Respostas:

202

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

Para descompactar o pacote, crie um diretório vazio e mude para ele, depois execute dpkg-debpara extrair suas informações de controle e os arquivos do pacote. Use dpkg-deb -bpara 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 esteja sendo executado como root, as permissões e a propriedade dos arquivos serão corrompidas 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 uma dpkg-debindividualmente, pois é o fakerootprocesso 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 mexer nas permissões, você pode manter intacto o arquivo de dados e modificar apenas o arquivo de controle. dpkg-debnão fornece uma maneira de fazer isso. Felizmente, os pacotes deb estão em um formato padrão: são ararquivos. Portanto, você pode usar arpara extrair o arquivo de controle, modificar seus arquivos e usar arnovamente 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 no changelog e alterar o número da versão se modificar alguma coisa no pacote. A infraestrutura para manipular pacotes Debian pressupõe que, se dois pacotes tiverem o mesmo nome e versão, eles serã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 exemplo, 1.2.3-4.1torna-se 1.2.3-4.1~johnjumper1.

Em vez de usar ferramentas de shell, você pode usar o Emacs. O dpkg-dev-elpacote (que é o seu próprio upstream, pois é um pacote Debian nativo) contém modos para editar .debarquivos e editar os registros de alterações da Debian. O Emacs pode ser usado interativamente ou com script.

Gilles
fonte
4
Você também pode usar o -einterruptor de fpm para mudar o arquivo de controle: fpm -e -s deb -t deb ../old.deb. Isso abrirá o arquivo de controle no seu editor.
Artefacto 30/06
1
btw, fakeroot bashe tentar emitir comandos não funcionará em relação à propriedade, e o armétodo é incrivelmente rápido para grandes arquivos deb!
Poder de Aquário
1
Obrigado. Isso foi útil. Usando dpkg-deb -Ros modos foram mantidos e dpkg-deb -bredefinir os uid:gidarquivos extraídos para 0:0. Não precisava fakeroot (imagino que pode haver problemas se não foram definidos {u, g} arquivos de identificação dentro do pacote, mas que não era o caso na minha situação.
PSkocik
2
@PSkocik Não são apenas arquivos setxid, também, por exemplo, arquivos e diretórios abaixo /etcou /varque precisam pertencer a um grupo específico.
Gilles
8

Você pode usar o fpm com a --after-installopção de substituir o postinstscript, assim:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Juancho
fonte
2
Para instalar o fpm no Debian / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Craig S. Anderson