Desempaque fácilmente DEB, edite postinst y reempaque DEB

129

Estoy intentando instalar el OpenCL SDK de Intel pero los archivos DEB son conversiones defectuosas de RPM (ver aquí para los curiosos). Necesito editar el postinstscript en el DEB que proporcionan.

¿Cómo puedo tomar un DEB existente, extraer el contenido (incluida la información de control) y luego volver a empaquetar el contenido para crear un nuevo DEB? Solo editaré archivos, no se agregarán ni eliminarán archivos.

John Jumper
fuente

Respuestas:

202

El comando principal para manipular los paquetes deb es dpkg-deb.

Para desempaquetar el paquete, cree un directorio vacío y cámbielo, luego ejecútelo dpkg-debpara extraer su información de control y los archivos del paquete. Use dpkg-deb -bpara reconstruir el paquete.

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

Tenga en cuenta que a menos que su script se ejecute como root, los permisos y la propiedad de los archivos se dañarán en la etapa de extracción. Una forma de evitar esto es ejecutar su script en fakeroot. Tenga en cuenta que debe ejecutar toda la secuencia fakeroot, no cada una dpkg-debindividualmente, ya que es el fakerootproceso que mantiene la memoria de los permisos de los archivos que no se pueden crear tal como están.

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

En lugar de meterse con los permisos, puede mantener intacto el archivo de datos y modificar solo el archivo de control. dpkg-debno proporciona una manera de hacer eso. Afortunadamente, los paquetes deb están en un formato estándar: son ararchivos. Por lo tanto, puede usar arpara extraer el archivo de control, modificar sus archivos y arvolver a usarlo para reemplazar el archivo de control por una nueva versión.

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

Debe agregar una entrada de registro de cambios y cambiar el número de versión si modifica algo en el paquete. La infraestructura para manipular los paquetes de Debian supone que si dos paquetes tienen el mismo nombre y versión, son el mismo paquete. Agregue un sufijo a la parte debian_revision al final del número de versión; por razones de clasificación, el sufijo debería comenzar ~, por ejemplo, se 1.2.3-4.1convierte en 1.2.3-4.1~johnjumper1.

En lugar de usar herramientas de shell, puede usar Emacs. El dpkg-dev-elpaquete (que es su propio upstream ya que es un paquete nativo de Debian) contiene modos para editar .debarchivos y editar registros de cambios de Debian. Emacs se puede usar de forma interactiva o con secuencias de comandos.

Gilles
fuente
44
También puede utilizar el -einterruptor de pies por minuto para cambiar el archivo de control: fpm -e -s deb -t deb ../old.deb. Esto abrirá el archivo de control en su editor.
Artefacto
1
por cierto, fakeroot bashe intentar emitir comandos no funcionará con respecto a la propiedad, ¡y el armétodo es increíblemente rápido para archivos de deb grandes!
Acuario Power
1
Gracias. Esto fue útil. El uso de dpkg-deb -Rlos modos se mantuvieron y dpkg-deb -brestablecer la uid:gidde los archivos extraídos 0:0. No necesitaba fakeroot (imagino que podría haber problemas si no se establecieron {u, g} archivos de identificación dentro del archivo, pero ese no fue el caso en mi situación.
PSkocik
2
@PSkocik No solo establece archivos setxid, también, por ejemplo, archivos y directorios que están debajo /etco /varque deben pertenecer a un grupo específico.
Gilles
8

Puede usar fpm con la --after-installopción de reemplazar el postinstscript, así:

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