Creazione di un pacchetto debian .deb
| Attenzione questo articolo è ancora incompleto. Sentiti libero di contribuire cliccando sul tasto edit. |
CERCA/SOSTITUISCI export PKGHOME="~/debian-packages" => export PKGHOME=~/debian-packages
Installazione pacchetti sviluppatore
apt-get install dpkg-dev file gcc g++ libc6-dev make patch perl dh-make fakeroot devscripts lintian linda
Metodo veloce per script o dati
Questo metodo crea un pacchetto rozzissimo.
- creare la directory che conterrà i files da installare:
cd ~ mkdir mypackage
- Copiarci i files nelle posizioni dove dovranno essere messi, ad esempio
mypackage
+etc
| +-mypackage
| +mypackage.conf
|
+-usr/bin/myscript
- Creare al cartella
mypackage/DEBIAN
- Crearci il file control
vi mypackage/DEBIAN/control
Package: squidguard-blacklist Version: 1.0.0-2011111801 Section: net Priority: optional Architecture: all Depends: squidguard (>=1.4) Maintainer: Gabriele Vivinetto <gabriele.mailing@rvmgroup.it> Description: Blacklist for squidguard This is the blacklist from http://squidguard.mesd.k12.or.us/blacklists.tgz
- Creare l'eventuale elenco dei files di configurazione (che così non verranno sovrascritti in caso di upgrade):
vi mypackage/DEBIAN/conffiles
/etc/mypackage/mypackage.conf
- Creare l'eventuale script da eseguire al termine:
vi mypackage/DEBIAN/postinst
#!/bin/bash /usr/bin/squidGuard -C all /bin/chown -R proxy:proxy /var/lib/squidguard/db
chmod +x mypackage/DEBIAN/postinst
- Creare il pacchetto:
cd ~ fakeroot dpkg-deb --build squidguard-blacklist/ .
- Se si vuole firmarlo:
sudo apt-get install dpkg-sig
dpkg-sig --sign builder squidguard-blacklist_1.0.0-2011111801_any.deb
Riferimenti
- Creating simple Debian packages « Electricmonk.nl weblog
- Debian Binary Package Building HOWTO
- Creating your own Signed APT Repository and Debian Packages « /etc/scotbofh
- Rolling your own Debian packages (part 1)
- Rolling your own Debian packages (part 2)
- How to create a Debian .deb package - Server Density Blog
Creazione di un pacchetto per uno script
Si supponga di voler installare:
- uno script
- un file di configurazione
- un file di cron
Supponiamo che lo script si chiami backup-remoto legga la sua configurazione da backup-remoto.conf e sia eseguito tutte le notti alle 20:00
Preparazione delle directory
export PKGHOME=~/debian-packages
export PKGNAME="backup-remoto"
export PKGVER="1.0.0"
mkdir -p ${PKGHOME}/${PKGNAME}/${PKGNAME}-${PKGVER}
cd ${PKGHOME}/${PKGNAME}/${PKGNAME}-${PKGVER}
Copiare in questa directory lo script ed il file di configurazione.
Preparazione del Makefile
Occorre creare un Makefile funzionante per l'installazione, in quanto viene usate da dpkg per installare il pacchetto.
Un esempio è:
export PKGHOME="~/debian-packages"
export PKGNAME=backup-remoto
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0
cat | unexpand --first-only > Makefile <<'EOFile'
SBIN = $(DESTDIR)/usr/sbin
ETC = $(DESTDIR)/etc
DOC = $(DESTDIR)/usr/share/doc
PKG = backup-remoto
.PHONY: all install clean
all: ;
clean: ;
install:
install -d $(SBIN)
install -m 755 ./$(PKG) $(SBIN)/$(PKG)
# installa l'eseguibile
install -d $(DOC)/$(PKG)
#install -m 644 ./README $(DOC)/$(PKG)/README
# installa la documentazione
install -d $(ETC)/$(PKG)
install -m 644 ./$(PKG).conf $(ETC)/$(PKG)/$(PKG).conf
#installa il file di configurazione
install -d $(ETC)/cron.d
install -m 644 ./$(PKG).cron $(ETC)/cron.d/$(PKG)
#installa il file di cron
EOFile
Preparazione del file cron
Questo è un file di esempio:
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0 cat > $PKGNAME.cron <<EOFile #m h dom mon dow user command 0 20 * * * root /usr/sbin/$PKGNAME > /dev/null EOFile
Creazione della tarball
export PKGHOME="$HOME/debian-packages" export PKGNAME="backup-remoto" cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0 cd .. tar cvzf $PKGNAME-1.0.0.tar.gz $PKGNAME-1.0.0
Debianizzazione
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0 export DEBFULLNAME="Gabriele Vivinetto" export DEBEMAIL=gabriele.mailing@rvmgroup.it dh_make -e gabriele.mailing@rvmgroup.it -f ../$PKGNAME-1.0.0.tar.gz
Ora la situazione dovrebbe essere:
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" cd $PKGHOME/$PKGNAME ls total 28 drwxr-xr-x 3 mnt.vvngrl mnt.vvngrl 4096 2006-03-16 19:58 . drwxr-xr-x 3 mnt.vvngrl mnt.vvngrl 4096 2006-03-16 19:58 .. -rwxr-xr-x 1 mnt.vvngrl mnt.vvngrl 2023 2006-03-16 19:43 backup-remoto -rw-r--r-- 1 mnt.vvngrl mnt.vvngrl 1158 2006-03-16 19:46 backup-remoto.conf -rw-r--r-- 1 mnt.vvngrl mnt.vvngrl 140 2006-03-16 19:47 backup-remoto.cron drwxr-xr-x 2 mnt.vvngrl mnt.vvngrl 4096 2006-03-16 19:58 debian -rw-r--r-- 1 mnt.vvngrl mnt.vvngrl 452 2006-03-16 19:09 Makefile
Customizazione del file control
Il file control contiene i parametri essenziali per la descrizione del pacchetto, il suo tagging e soprattutto le dipendenze.
Analizare lo script, e per ogni binario richiamato, trovare il pacchetto corrispondente e la versione.
Ad esempio, nello script si usa ilcomando "ssh", quindi, utiliando i comandi di seguito, si ottengono le stringe da inserire come dipendenze, seprate da ", ":
export BIN_NAME="ssh" export COLUMNS=132 DEBPKG_NAME=$(dpkg -S $(which $BIN_NAME) | cut -f 1 --delim=":") DEBPKG_VERSION=$(dpkg -l $(dpkg -S $(which $BIN_NAME) | cut -f 1 --delim=":") | grep $(dpkg -S $(which $BIN_NAME) | cut -f 1 --delim=":") | tr -s " " | cut -f 3 --delim=" ") echo "$DEBPKG_NAME (>= $DEBPKG_VERSION)"
Inserire le dipendenze nella riga
Depends:
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0/debian vi control
Inserire *una* breve Descrizione nella riga
Description:
Inserire di seguito, indentando di una colonna una descrizione al massimo di 60 caratteri.
Attenzione: andare a capo manualmente, scrivere ogni riga terminata da <invio>
Customizazione del file copyright
Questo file di solito è sufficente
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0/debian cat > copyright <<EOFile This package was debianized by Gabriele Vivinetto <gabriele.mailing@rvmgroup.it> on $(date -R) It was downloaded from http://people.rvmgroup.it/gabriele.vivinetto Copyright Holder: Gabriele Vivinetto <gabriele.mailing@rvmgroup.it> License: GNU GPL EOFile
Modifica del file README.Debian
Inserire in questo files le note relative al pacchetto.
Altre personalizzazioni
Se si vuole è possibile modifcare anche il file changelog
Pulizia della deirectory debian/
Eliminare i files di esempio:
rm -f *.ex; rm -f *.EX
Creazione del pacchetto
Creare il pacchetto:
export PKGHOME=~/debian-packages export PKGNAME="backup-remoto" cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0 dpkg-buildpackage -rfakeroot -kF6D289F6
Se tutto procede bene, le ultime righe saranno:
... dpkg-deb: building package `backup-remoto' in `../backup-remoto_1.0.0-1_i386.deb'. dpkg-genchanges dpkg-genchanges: including full source code in upload dpkg-buildpackage: full upload (original source is included)
Debianizzazione di un pacchetto binario esistente
Preparazione Directory e Archivio Esistente
Preparare le directory:
export PKGHOME="~/debian-packages" export PKGNAME="mcafee-virusscan" mkdir -p $PKGHOME/$PKGNAME cd $PKGHOME/$PKGNAME
Prendere la tarball esistente e rinominarla secondo lo schema packagename-x.y.z.tar.{gz|Z}
Estrazione dei files
Estrarre i files in una directory con nome packagename-x.y.z
ATTENZIONE, conservare l'archivio originale al di fuori della cartella, in quanto serve alla compilazione del pacchetto E per gli upgrade.
Debianizzazione
export PKGHOME="~/debian-packages" export PKGNAME="mcafee-virusscan" export PKGVER="4.4.0" cd $PKGHOME/$PKGNAME/$PKGNAME-$PKGVER export DEBFULLNAME="Gabriele Vivinetto" export DEBEMAIL=gabriele.mailing@rvmgroup.it dh_make -e gabriele.mailing@rvmgroup.it -f ../$PKGNAME-$PKGVER.tar.*
Preparazione / Personalizzazione del Makefile
cat > Makefile <<'EOFile'
SBIN = $DESTDIR/usr/sbin
ETC = $DESTDIR/etc
DOC = $DESTDIR/usr/share/doc
install: odmrd-target
install -d $(SBIN)
install -m755 ./odmrd09rc9.pl $(SBIN)/odmrd
install -m755 ./odmrspool $(SBIN)/odmrspool
install -d ./odmrd.conf $(ETC)/odmrd/odmrd.conf
install -d $(DESTDIR)/usr/share/doc/odmrd
cp -a readme.html $(DESTDIR)/usr/share/doc/odmrd
adduser --system odmr
addgroup --system odmr
EOFile
Se nel makefile ci sono dei link, occorre toglierli e metterli in un file debian/package.links indicando
path/sorgente path/destinazione
Vedi
man dh_links
Preparazione del pacchetto in formato tar.gz
lynx plonk.de mkdir odmrd09rc9 cd odmrd09rc9 tar xvzf ../odmrd09rc9.tar.gz cd .. mv odmrd09rc9 odmrd-0.9.0rc9 cd odmrd-0.9.0rc9 wget http://plonk.de/sw/odmr/odmrspool.pl
Creazione del control file
cd debian
cat > control <<'EOFile'
Source: odmrd
Section: mail
Priority: extra
Maintainer: Gabriele Vivinetto <gabriele.mailing@rvmgroup.it-f>
Build-Depends: debhelper (>= 4.0.0)
Standards-Version: 3.6.1
Package: odmrd
Architecture: all
Depends: postfix (>= 2.1.5-9), libmime-perl (>= 5.417-1), libdbd-mysql-perl (>= 2.9006-1) ${shlibs:Depends}, ${misc:Depends}
Description: An On Demad Mail Relay Daemon that uses ATRN to deliver Mail
ODMR is "SMTP with Dynamic IP Addresses". It uses an "Authenticated TURN"
(ATRN) to deliver queued mail to a mailserver with a dynamic IP address.
It works with Postfix (and Exim too).
EOFile
Preparazione degli altri file
cat >copyright <<'EOFile' This package was debianized by Gabriele Vivinetto <gabriele.mailing@rvmgroup.it-f> on Fri, 17 Jun 2005 17:12:48 +0200. It was downloaded from http://plonk.de/sw/odmr/ Copyright Holder: Jakob Hirsch <odmrd@plonk.de> License: GNU GPL EOFile
Creazione del pacchetto
Firma del pacchetto
Nel caso si voglia firmare il pacchetto, procedere come segue, altrimenti saltare la sezione.
- Creare una chiave GPG apposita
- Creare il file
vi ~/.devscripts ... DEBEMAIL="gabriele.mailing@rvmgroup.it" DEBFULLNAME="Gabriele Vivinetto" DEBSIGN_KEYID="XXXXXXXX" ..
Purtroppo sembra non funzionare.
Esportare le prime due variabili da
vi ~/.bashrc ... export DEBEMAIL="gabriele.mailing@rvmgroup.it" export DEBFULLNAME="Gabriele Vivinetto" ...
Costruire il pacchetto
Con il comando seguente viene scritto il pacchetto.
Se non dovesse chiedere la password per firmarlo, specificare la chiave GPG da usare con -k:
cd .. dpkg-buildpackage -rfakeroot -kXXXXXXXX
Aggiornamento del pacchetto
Aggiornamento in caso di correzione BUG
Modificare il Changelog:
export DEBFULLNAME="Gabriele Vivinetto" export DEBEMAIL=gabriele.mailing@rvmgroup.it dch -i
Applicare le correzioni necessarie ai sorgenti.
Riscostruire il pacchetto:
dpkg-buildpackage -rfakeroot -kF6D289F6 -tc
Ora si può caricare nel repository il pacchetto costruito, che avrà versione x.y.z-+1
Aggiornamento con Nuova Versione
- Scaricare la nuova versione
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" export LASTVER="1.38" export NEWVER="1.52" wget http://www.example.com/$PKGNAME-$NEWVER.tar.gz
- Creare il sorgente della vecchia versione se none esistente
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" export LASTVER="1.38" export NEWVER="1.52" cd $PKGHOME dpkg-source -b $PKGNAME-$LASTVER
- Si avranno così i files .dsc .tar.gz e .orig.tar.bz2
- Lanciare l'upgrade
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" export LASTVER="1.38" cd $PKGHOME/$PKGNAME/$PKGNAME-$LASTVER uupdate -u ../$PKGNAME-$NEWVER.tar.gz
Così si creerà la nuova directory di versione, e sarà possibile costruire il nuovo pacchetto con:
export PKGHOME="~/debian-packages" export PKGNAME="backup-remoto" export NEWVER="1.52" cd $PKGHOME/$PKGNAME/$PKGNAME-$NEWVER dpkg-buildpackage -rfakeroot -kF6D289F6
- Se dalla directory della nuova versione si vogliono produrr ei pacchetti source (dsc tar.gz e .orig.tar.bz2), usare
dpkg-source -b $PKGNAME-$NEWVER
Script di upload dei pacchetti
ATTENZIONE: QUESTO SCRIPT NON È PIÙ VALIDO, PERCHÈ SI USA UN REPOSITORY FIRMATO.
Questo script è utile per caricare via scp i pacchetti creati sul proprio repository.
#!/bin/bash
test $1 || {
echo "Usage: upload-debrvm package.deb"
exit 1
}
SHORTNAME=$(echo $1 | cut -f 1 --delim="_")
echo "* Uploading $SHORTNAME"
scp -pq $1 support.rvmgroup.it:/var/www/rvmgroup.it/support/html/debian/binary
echo "* Cleaning up and updating repository"
#scp -pq /home/mnt.vvngrl/bin/update_repository support.rvmgroup.it:/var/www/rvmgroup.it/support/html/debian/
cat | ssh support.rvmgroup.it "
cat > /var/www/rvmgroup.it/support/html/debian/update_repository;
cd /var/www/rvmgroup.it/support/html/debian;
chmod +x ./update_repository;
./update_repository $SHORTNAME;
rm -f ./update_repository;
dpkg-scanpackages binary/ /dev/null | gzip -9c > binary/Packages.gz" <<'EOFile'
#!/bin/bash
cd /var/www/rvmgroup.it/support/html/debian
SHORTNAME=$1
RIGHE=$(/bin/ls -1 binary/$SHORTNAME* | sort -n | wc -l)
RIGHE_DA_CANC=$(($RIGHE - 1))
if (( $RIGHE > 0 ))
then
for DATA in $( find . -name $SHORTNAME\* | sort -n | head -n $RIGHE_DA_CANC)
do
echo "* Deleting $DATA"
rm -f $DATA
done
fi
EOFile