2009-05-26 13 views
6

Ho un file project.init nella directory debian (insieme a rules, control, ecc), e ho dh_installinit nel mio file rules (nella regola binary-arch).package.init non è sempre installato

Al termine di dpkg-buildpackage, lo script di inizializzazione è stato copiato su debian/project/etc/init.d/project e sono stati creati vari script di pre/post.

Tuttavia, quando installo il .deb (con dpkg -i), lo script init.d non viene installato, quindi è necessario che manchi una parte di questo processo. Lo "New Maintainer's Guide" è piuttosto scarso sui dettagli di init.d (in pratica dice di non usarli, perché sono troppo avanzati).

L'output dettagliato del comando dh_installinit è:

dh_installinit 
    install -p -m755 debian/project.init debian/project/etc/init.d/project 
    echo "# Automatically added by dh_installinit">> debian/project.postinst.debhelper 
    sed "s/#SCRIPT#/project/;s/#INITPARMS#/defaults/;s/#ERROR_HANDLER#/exit \$?/" /usr/share/debhelper/autoscripts/postinst-init >> debian/project.postinst.debhelper 
    echo '# End automatically added section' >> debian/project.postinst.debhelper 
    echo "# Automatically added by dh_installinit">> debian/project.prerm.debhelper 
    sed "s/#SCRIPT#/project/;s/#INITPARMS#/defaults/;s/#ERROR_HANDLER#/exit \$?/" /usr/share/debhelper/autoscripts/prerm-init >> debian/project.prerm.debhelper 
    echo '# End automatically added section' >> debian/project.prerm.debhelper 
    echo "# Automatically added by dh_installinit">> debian/project.postrm.debhelper 
    sed "s/#SCRIPT#/project/;s/#INITPARMS#/defaults/;s/#ERROR_HANDLER#/exit \$?/" /usr/share/debhelper/autoscripts/postrm-init >> debian/project.postrm.debhelper 
    echo '# End automatically added section' >> debian/project.postrm.debhelper 
+2

Che cosa esattamente cosa si intende per "non avere installato"? Non esiste nel deb, non è installato in /etc/init.d o non vengono creati collegamenti start/stop? –

+0

Non so come testare se si trova nel .deb o meno. Non appare in /etc/init.d (e quindi ovviamente i collegamenti start/stop non vengono creati). –

+0

Avevo un problema molto simile, in cui uno script upstart era incluso nel pacchetto (lo si poteva vedere anche se elencato con dpkg -c), ma non si installava. Alla fine ho provato a cambiare la versione compat (usando 7 e l'ho cambiata in 8) e poi l'ho installata bene. –

risposta

1

A questo punto vorrei controllare il contenuto del file .deb che viene creato. È possibile utilizzare dpkg-deb -c per questo scopo.

Se lo script di init è in .deb, si dovrebbe ottenere installato in /etc/init.d, proprio come questo:

 
... 
drwxr-xr-x root/root   0 2009-06-03 14:01 ./etc/ 
drwxr-xr-x root/root   0 2009-06-03 14:01 ./etc/init.d/ 
-rwxr-xr-x root/root  2558 2009-02-13 11:27 ./etc/init.d/balance 
... 

Se la eseguire una versione recente di Debian, il contenuto del tuo il pacchetto può essere generato da debian/tmp invece che da debian/project come ci si aspetta. È possibile spostare i file da debian/projet a debian/tmp utilizzando dh_install.

+0

Buona teoria, ma nel mio caso 'dpkg-deb -c' mostra che il file è presente in' .deb'. – Mikel

+0

così appare lo script di init quando si estrae il pacchetto? qualcosa come 'mkdir/tmp/foo; dpkg -x packge.deb/tmp/foo; ls -l/tmp/foo/etc/init.d' –

0

Solo un'ipotesi, stai usando un'opzione -P per altri script dh_ * ma non questo? Se usi questa opzione, devi usarla su tutti gli script dh_ *.

2

Credo che dovresti guardare lo script di utilità "update-rc.d" che si occupa di creare/rimuovere i collegamenti simbolici in /etc/init.d/.

Utilizzare questo script nei file di controllo DEBIAN "postinst" & "postrm".

E.g. per "postinst": update-rc.d mswitch start 20 2 3 4 5. stop 0 1 6.

E.g. per "postrm": update-rc.d mswitch remove

+1

Non ero il downvoter, ma probabilmente lo hanno downvoted perché non è la risposta giusta, e generalmente non è un buon consiglio di packaging. Lo strumento 'dh_installinit' si occuperà di inserire le giuste chiamate' update-rc.d' in postinst e postrm, incluso assicurandosi che gli script del manutentore vengano chiamati durante le opportune transizioni di stato. –

+0

Grazie per la nota, "il paul". Si noti che questa procedura ha funzionato per me, ma prendo nota che c'è un modo migliore. – jldupont

8

Il pacchetto contiene una voce per lo script di init sotto il blocco Conffiles in /var/lib/dpkg/status, ad es.

Package: <project> 
... 
Conffiles: 
/etc/init.d/<project> d41d8cd98f00b204e9800998ecf8427e 

e fa /var/lib/dpkg/info/<project>.conffiles contengono /etc/init.d/<project>?

Ecco cosa sta succedendo ...

script di init sono contrassegnati come file di configurazione di default, dal momento che vivono sotto /etc.

Suppongo che tu abbia installato il pacchetto, rimosso il file di inizializzazione, quindi reinstallato il pacchetto.

In questo caso, la rimozione del file di init conta come modificandolo e dpkg si rifiuta di "sovrascrivere" il "file di configurazione".

Si dovrebbe essere in grado di risolvere il problema rimuovendo la sezione Conffiles da /var/lib/dpkg/status.

Note:

  1. conffiles - Debian New Maintainer's Guide
  2. Un file vuoto ha MD5sum d41d8cd98f00b204e9800998ecf8427e, ma qualsiasi checksum non corrispondenti causerà lo stesso comportamento
+1

Invece di rimuovere le voci di conffiles (e modificare un comportamento previsto), forse è meglio chiedere a 'apt' di forzare l'installazione dei conffiles:' sudo apt-get -o Dpkg :: Options :: = "- force- confmiss "install --reinstall ' –

+0

Ho installato un pacchetto personalizzato usando dpkg-scanpackges e apt-get update/install (con il flag --force-confnew). Poi l'ho disinstallato usando apt-get remove. Poi ho cancellato i miei file di configurazione/log rimasti in seguito. Quindi ho reinstallato il pacchetto nello stesso modo, ma i file di configurazione non sono stati installati affatto. La rimozione della sezione Conffiles ha risolto anche il mio problema, grazie! – wrapperapps

+1

Ho anche usato "--force-confmiss" per risolvere un problema simile ma separato con il mio script init che non viene installato dopo averlo cancellato, come suggerito da @RaelGugelminCunha – wrapperapps

0

ho avuto successo, quando ho messo solo il progetto .init file in debian-folder e non aggiungi alcun vincolo speciale al file rules. Dopo che questo passaggio funziona, prova ad aggiungere i tuoi vincoli speciali.

Per controllare il successo in debian-cartella cat *.postinst.debhelper contiene:

# Automatically added by dh_installinit 
if [ -x "/etc/init.d/<packagename>" ]; then 
    if [ ! -e "/etc/init/<packagename>.conf" ]; then 
     update-rc.d <packagename> defaults >/dev/null 
    fi 
    invoke-rc.d <packagename> start || exit $? 
fi