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
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 oar
método é incrivelmente rápido para grandes arquivos deb! - Obrigado. Isso foi útil. Usando
dpkg-deb -R
os modos foram mantidos edpkg-deb -b
redefiniu ouid:gid
dos arquivos extraídos para0: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.
apt install mc
) – basta pressionar Enter em um arquivo deb