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-deb
para extraer su información de control y los archivos del paquete. Use dpkg-deb -b
para 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-deb
individualmente, ya que es el fakeroot
proceso 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-deb
no proporciona una manera de hacer eso. Afortunadamente, los paquetes deb están en un formato estándar: son ar
archivos. Por lo tanto, puede usar ar
para extraer el archivo de control, modificar sus archivos y ar
volver 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.1
convierte en 1.2.3-4.1~johnjumper1
.
En lugar de usar herramientas de shell, puede usar Emacs. El dpkg-dev-el
paquete (que es su propio upstream ya que es un paquete nativo de Debian) contiene modos para editar .deb
archivos y editar registros de cambios de Debian. Emacs se puede usar de forma interactiva o con secuencias de comandos.
-e
interruptor 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.fakeroot bash
e intentar emitir comandos no funcionará con respecto a la propiedad, ¡y elar
método es increíblemente rápido para archivos de deb grandes!dpkg-deb -R
los modos se mantuvieron ydpkg-deb -b
restablecer lauid:gid
de los archivos extraídos0: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./etc
o/var
que deben pertenecer a un grupo específico.Puede usar fpm con la
--after-install
opción de reemplazar elpostinst
script, así:fuente