Disimballa facilmente DEB, modifica postinst e reimballa DEB


129

Sto tentando di installare l'SDK OpenCL di Intel, ma i file DEB sono conversioni errate da RPM (vedi qui per i curiosi). Devo modificare lo postinstscript nel DEB che forniscono.

Come posso prendere un DEB esistente, estrarre i contenuti (comprese le informazioni di controllo), quindi riconfezionare i contenuti per creare un nuovo DEB? Modificherò solo i file, nessun file verrà aggiunto o rimosso.

Risposte:


202

Il comando principale per manipolare i pacchetti deb è dpkg-deb.

Per decomprimere il pacchetto, creare una directory vuota e passare ad esso, quindi eseguire dpkg-debper estrarre le informazioni di controllo e i file del pacchetto. Utilizzare dpkg-deb -bper ricostruire il pacchetto.

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

Fai attenzione che, a meno che lo script non sia in esecuzione come root, le autorizzazioni e la proprietà dei file verranno danneggiate in fase di estrazione. Un modo per evitarlo è eseguire lo script in fakeroot. Si noti che è necessario eseguire l'intera sequenza in fakeroot, non ciascuna dpkg-debindividualmente, poiché è il fakerootprocesso che mantiene la memoria delle autorizzazioni dei file che non possono essere create così come sono.

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

Invece di pasticciare con le autorizzazioni, è possibile mantenere intatto l'archivio dati e modificare solo l'archivio di controllo. dpkg-debnon fornisce un modo per farlo. Fortunatamente, i pacchetti di deb sono in un formato standard: sono ararchivi. Quindi è possibile utilizzare arper estrarre l'archivio di controllo, modificare i suoi file e arriutilizzarlo per sostituire l'archivio di controllo con una nuova versione.

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

È necessario aggiungere una voce del log delle modifiche e modificare il numero di versione se si modifica qualcosa nel pacchetto. L'infrastruttura per manipolare i pacchetti Debian presuppone che se due pacchetti hanno lo stesso nome e versione, sono lo stesso pacchetto. Aggiungi un suffisso alla parte debian_revision alla fine del numero di versione; per motivi di ordinamento il suffisso dovrebbe iniziare con ~, ad esempio 1.2.3-4.1diventa 1.2.3-4.1~johnjumper1.

Invece di usare gli strumenti shell, puoi usare Emacs. Il dpkg-dev-elpacchetto (che è il suo upstream in quanto si tratta di un pacchetto Debian nativo) contiene le modalità per modificare i .debfile e modificare i log delle modifiche Debian. Emacs può essere utilizzato in modo interattivo o tramite script.


4
È inoltre possibile utilizzare l' -einterruttore di FPM per modificare il file di controllo: fpm -e -s deb -t deb ../old.deb. Questo aprirà il file di controllo nel tuo editor.
Artefacto,

1
tra l'altro, fakeroot bashe provare a emettere comandi non funzionerà per quanto riguarda la proprietà, e il armetodo è incredibilmente veloce per file deb di grandi dimensioni!
Aquarius Power,

1
Grazie. Questo è stato utile Utilizzando dpkg-deb -Rle modalità sono state mantenute e dpkg-deb -breimpostate i uid:gidfile estratti su 0:0. Non avevo bisogno di fakeroot (immagino che potrebbero esserci problemi se all'interno dell'archivio fossero presenti file id {u, g} ma non era così nella mia situazione.
PSkocik,

2
@PSkocik Non solo file setxid, ad esempio file e directory in /etco /varche devono appartenere a un gruppo specifico.
Gilles,

8

Puoi usare fpm con l' --after-installopzione per sostituire lo postinstscript, in questo modo:

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

2
Per installare fpm su Debian / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Craig S. Anderson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.