Debianitzem el servidor d'echos

De Wikijoan
Dreceres ràpides: navegació, cerca

Debianitzem el servidor d'echos, és a dir, en farem un paquet Debian

[Basat en un manual del Sergi Tur:

http://atenea.upc.edu/moodle/mod/resource/view.php?id=285373

http://acacha.dyndns.org/mediawiki -> cercar Creación de paquetes Debian

http://www.serni.net/~cosa/doku.php?id=creacio_de_paquets_debian&s=inicial]

Mirar també http://es.wikipedia.org/wiki/Dgb

El format del fitxer .deb és el següent:

<nom_del_paquet>_<numero_de_versio>-<numero_de_revisio_debian>.deb 

Quan descarrego un paquet des de Synaptic o apt-get, els paquests es graben normalment a: /var/cache/apt/archives

el format típic dels paquets és .deb, i si faig doble click em trobo amb els empaquetats tar.gz i un binari (que puc obrir amb gedit per veure què hi ha).

Cada paquet Debian és un arxiu ar compost per:

El fitxer 'control' conté les metadades, que és el mateix que trobaríem amb el Synaptic si escollim un paquet i mirem les metadades.

Els continguts d'aquests fitxers venen regulats per la Debian Policy. La Debian Policy és una de les diferències respecte d'altres distribucions. Són les regles que han de complir els paquets, i garanteix la qualitat dels paquets.

Podem consultar les metadades d'un paquet Debian mitjançant la comanda:

$ dpkg --info talk_0.17-11ubuntu1_i386.deb

El fitxer md5sums conté les sumes de comprovació (checksums) que permeten comprovar que no hi ha cap diferència entre el paquet que tenim i l'original. Per ex,

joan@ubuntu:~$ md5sum xtris_1.15-9_i386.deb 
75787f8144b48de704a059efa844b2f7  xtris_1.15-9_i386.deb

calcula la suma md5 del paquet, i obtinc un número. Amb aquest número puc saber si s'ha modificat el paquet, i quin és el fitxer que s'ha modificat.

Contingut

On s'han d'instal.lar els fitxers?

S'ha de seguir la FHS (File Hyerarchy System)

El binari és el codi objecte (en la terminologia C), no és el codi font. Els binaris dels programes es poden trobar a:

les llibreries van en paquets apart

/usr és la carpeta que ocupa més. No cal fer una còpia d'aquest asxiu perquè amb l'us de les aplicacions el seu contingut no canvia. Si reinstal.lo una aplicació la política sempre és que sempre em respecuarà el fitxer de configuració antic, (o bé m'ho preguntarà, sap que el fitxer de configuració ha canviat gràcies al md5).

A mode d'exemple anem a instal.lar un paquet i veure el rastre que deixa en la màquina. Instal.larem ksnapshot (serveix per fer captura de pantalles)

$ sudo apt-get install ksnapshot
$ dpkg -l # ensenya tots els paquets instal.lats en el sistema
$ dpkg -L ksnapshot # ensenya tots els fitxers instal.lats d'aquesta paquet.
$ dpkg -L ksnapshot | grep bin # miro els executables
$ dpkg -L ksnapshot | grep doc # miro la documentació
$ dpkg -L ksnapshot | grep man # miro si té manual man

Creació del paquet

Tot això, per sort, ho farem amb una eina expressa per a crear paquets, dh_make:

$ sudo apt-get install dh-make #compte perquè el paquet és dh-make però el binari és dh_make
$ man dh_make
NAME
       dh_make - Debianize a regular source archiv

Partim de la carpeta /echoDimoni, que conté les fonts (les fonts originals del paquet estan a https://svn.lafarga.cpl.upc.edu/dades/svn/plinux/sessio10/ (anonymous/anonymous)) Primer de tot instal.lem totes les eines necessàries:

$ sudo apt-get install dh-make fakeroot build-essential devscripts debhelper

debhepler ens proporciona una sèrie de guions de shell que ens ajuden en la creació de paquets debian. Podem obtenir la llista de guions de shell executant:

$ dpkg -L debhelper | grep bin
/usr/bin
/usr/bin/dh_builddeb
/usr/bin/dh_clean
/usr/bin/dh_compress
/usr/bin/dh_desktop
/usr/bin/dh_fixperms
/usr/bin/dh_gconf 
/usr/bin/dh_gencontrol
/usr/bin/dh_iconcache
/usr/bin/dh_install
/usr/bin/dh_installcatalogs
/usr/bin/dh_installchangelogs
/usr/bin/dh_installcron
/usr/bin/dh_installdeb
/usr/bin/dh_installdebconf
/usr/bin/dh_installdirs
/usr/bin/dh_installdocs
/usr/bin/dh_installemacsen
/usr/bin/dh_installexamples
/usr/bin/dh_installinfo
/usr/bin/dh_installinit # aquest és important per instal.lar el paquet com a dimoni
/usr/bin/dh_installlogcheck
/usr/bin/dh_installlogrotate
/usr/bin/dh_installman
/usr/bin/dh_installmanpages
/usr/bin/dh_installmenu
/usr/bin/dh_installmime
/usr/bin/dh_installmodules
/usr/bin/dh_installpam
/usr/bin/dh_installppp
/usr/bin/dh_installudev
/usr/bin/dh_installwm
/usr/bin/dh_installxfonts
/usr/bin/dh_link
/usr/bin/dh_listpackages
/usr/bin/dh_makeshlibs
/usr/bin/dh_md5sums
/usr/bin/dh_movefiles
/usr/bin/dh_perl
/usr/bin/dh_python
/usr/bin/dh_scrollkeeper
/usr/bin/dh_shlibdeps
/usr/bin/dh_strip
/usr/bin/dh_suidregister
/usr/bin/dh_testdir
/usr/bin/dh_testroot
/usr/bin/dh_testversion
/usr/bin/dh_undocumented
/usr/bin/dh_usrlocal   

concretament, per ex, dh_installinit és l'encarregat d'instal.lar el dimoni a la carpeta /etc/init.d

El primer pas és copiar la carpeta echoDimoni a una carpeta que segueixi els convenis de Debian, i ens situem en la nova carpeta (a partir d'ara, totes les operacions les farem des de la carpeta echod-0.1):

$ cd sessio10
$ cp -r echoDimoni echod-0.1
$ cd echod-0.1/
# dh_make -e joan_quintana@yahoo.com --createorig
822-date: avís: This program is deprecated. Please use 'date -R' instead.

Type of package: single binary, multiple binary, library, kernel module or cdbs?
 [s/m/l/k/b] s

Maintainer name : Joan Quintana
Email-Address   : joan_quintana@yahoo.com 
Date            : Sun, 02 Nov 2008 09:57:30 +0100
Package Name    : echod
Version         : 0.1
License         : blank
Type of Package : Single
Hit <enter> to confirm: 
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the echod Makefiles install into $DESTDIR and not in / .

S'ha creat la carpeta debian amb tots els fitxers necessaris. En la man page no hi ha informació sobre l'opció --createorig

En la carpeta /debian es creen tota una sèrie de plantilles que es poden editar i serveixen per configurar el paquet. A mode d'exemple,

També s'ha fet una còpia de l'original a ~/sessio10/echod-0.1.orig

$ ls -la ..
drwxr-xr-x  3 root root       4096 2008-11-02 11:04 echod-0.1
drwxr-xr-x  2 root root       4096 2008-11-02 11:04 echod-0.1.orig
drwxr-xr-x  2 root root       4096 2008-11-02 11:02 echoDimoni

La carpeta echod-0.1.orig serà utilizada més tard per a crear els fitxers font de Debian.

Un cop tenim la carpeta debian, ja estem en condicions de crear un paquet Debian a través de la comanda dpkg-buildpackage. Per tal de crear el paquet s'ha de ser superusuario o millor encara, utilitzar la comanda fakeroot:


$ man dpkg-buildpackage
NAME
       dpkg-buildpackage - build binary or source packages from sources

dins de echod-01, faig fakeroot (root fals), que és un aplicatiu que em dóna un prompt (#), en el que executo dpkg-buildpackage que és el que comença a treballar. Fixar-se que en el prompt em surt root. Al final, exit.

$ fakeroot
$ dpkg-buildpackage # comença a treballar...
...
dpkg-deb: s'està construint el paquet «echod» en «../echod_0.1-1_i386.deb».
 dpkg-genchanges
dpkg-genchanges: including full source code in upload
dpkg-buildpackage: full upload (original source is included)
$ ls -l ..
drwxr-xr-x 4 root root 4096 2008-11-02 11:34 echod-0.1
-rw-r--r-- 1 root root 7532 2008-11-02 11:34 echod_0.1-1.diff.gz
-rw-r--r-- 1 root root  310 2008-11-02 11:34 echod_0.1-1.dsc
-rw-r--r-- 1 root root  746 2008-11-02 11:34 echod_0.1-1_i386.changes
-rw-r--r-- 1 root root 4942 2008-11-02 11:34 echod_0.1-1_i386.deb
-rw-r--r-- 1 root root 4728 2008-11-02 11:34 echod_0.1.orig.tar.gz
drwxr-xr-x 3 root root 4096 2008-11-02 11:30 echoDimoni

Ja tenim el paquet echod_0.1-1_i386.deb i també echod_0.1.orig.tar.gz

Un cop creat el paquet és MOLT IMPORTANT per evitar errors i altres complicacions, sortir del fakeroot amb la comanda exit:

root# exit
joan#

Podem mirar què hi ha a dins del paquet amb el nautilus (obre amb el gestor d'arxius...)

$ nautilus .. #obre el nautilus amb el contingut de la carpeta ..
$ # i amb línia de comandes es pot fer...
$ file-roller /home/joan/sessio10/echod_0.1-1_i386.deb

Per comprovar si un paquet compleix la política de Debian, tenim lintian:

$ sudo apt-get install lintian # paquet per saber si un paquet acompleix la política de Debian
$lintian ../echod_0.1-1_i386.deb
W: echod: binary-without-manpage usr/sbin/echod
W: echod: copyright-lists-upstream-authors-with-dh_make-boilerplate
E: echod: description-is-dh_make-template
W: echod: wrong-bug-number-in-closes l3:#nnnn
E: echod: section-is-dh_make-template

E: error; W: warning

Editem el fitxer de control (/debian/control) , que és on hi ha la informació del paquet:

$ ls -l debian/
$gedit debian/control

Man page

I també creem una man-page. Hi ha diverses maneres de fer la man-page. Els manpages estan en format lattex, sgml (tags) o xml (tags). Però no cal saber lattex si utilizem la plantilla, perquè és fàcil identificar els textos

/debian/manpage.1.ex (lattex), /debian/manpage.sgml.ex (sgml), /debian/manpage.xml.ex (xml)

Les plantilles són:

Son los tres formatos soportados por los ficheros man. Como podeis ver las plantillas siempre acaban con la extensión .ex.

El guión de shell de debhelper que instala los manuales es dh_installman y está activado por defecto en el fichero debian/rules. Los únicos pasos que hemos de seguir son editar alguna de las plantillas, poner un nombre adecuado al fichero (típicamente 'nomcomando.seccion) y crear un fichero debian/manpages con la lista de ficheros manual. Los pasos a seguir:

Copiamos la plantilla:

 $ cp debian/manpage.1.ex debian/echod.1

Y editamos el manual para añadir la documentación a nuestro gusto:

 $ gedit debian/echod.1 &

Y editamos el manual. Una vez editado ejecutamos:

 $ gedit debian/manpages &

Añadir la línea:

 debian/echod.1

Si no tocamos la plantilla el resultado final será:

 $ man echod
 
 ECHOD(SECTION)                                                                                                                               
 ECHOD(SECTION)
 
 NAME
        echod - program to do something
 
 SYNOPSIS
        echod [options] files...
        bar [options] files... 
 
 DESCRIPTION
        This manual page documents briefly the echod and bar commands.
 
        echod is a program that...
 
 OPTIONS
        These  programs  follow  the  usual  GNU  command line syntax, with long options starting with two dashes (‘-’).  A summary of options is  
 included below.  For a complete description, see the Info files. 
 
        -h, --help
               Show summary of options.
 
        -v, --version
               Show version of program.
 
 SEE ALSO
        bar(1), baz(1).
        The programs are documented fully by The Rise and Fall of a Fooish Bar, available via the Info system.
 
 AUTHOR
        echod was written by <upstream author>.
 
        This manual page was written by Sergi Tur Badenas <sergi.tur@upc.edu>, for the Debian project (but may be used by others).
 
                                                                       juny  8, 2007                                                         
 ECHOD(SECTION)

tornem a compilar i a passar el lintian

E: echod: manpage-is-dh_make-template usr/share/man/man1/echod.1.gz
W: echod: manpage-section-mismatch usr/share/man/man1/echod.1.gz:5 1 != SECTION
W: echod: copyright-lists-upstream-authors-with-dh_make-boilerplate
E: echod: extended-description-is-empty
W: echod: wrong-bug-number-in-closes l3:#n

Ara ja reconeix la man-page, tot i que conté errors.

Ara es podria treballar molt configurant el paquet, man-pages, README, copyright,...

Instal.lació i configuració del dimoni

Ara hem d'aconseguir que s'instal.li el dimoni, és a dir, que arranqui en l'inici del sistema i que s'instal.li el script d'inici a /etc/init.d

Hem de recordar que el nostre codi font és el codi font d'un dimoni i que per tant té el seu corresponent script d'inici System V a /etc/init.d/echod. El fitxer ja s'instal.la en la carpeta adequada durant la crida a la norma install, però a més a més deb_helper ens proporciona la comanda dh_installinit. Només hem de descomentar la línia adequada en el fitxer debian/rules:

        dh_testdir
        dh_testroot
        dh_installchangelogs
        dh_installdocs
        dh_installexamples
#       dh_install
#       dh_installmenu
#       dh_installdebconf
#       dh_installlogrotate
#       dh_installemacsen  
#       dh_installpam
#       dh_installmime
#       dh_python
        dh_installinit #aquí!!
#       dh_installcron
#       dh_installinfo
        dh_installman 
        dh_link
        dh_strip
        dh_compress
        dh_fixperms
#       dh_perl
#       dh_makeshlibs
        dh_installdeb
        dh_shlibdeps 
        dh_gencontrol
        dh_md5sums   
        dh_builddeb 

fixem-nos en totes les possibilitats que hi ha... per ex, que s'instal.li en el menu.

[Aquí he tingut problemes] En este punto es donde hemos de introducir nuestro primer hack del fichero debian/rules'. El comando dh_install no hará nada si ya encuentra el fichero /etc/init.d/echod instalado en el sistema (això crec que es refereix a si instal.lem el paquet en la mateixa màquina que compilem). Como que el instalador del código fuente original del programa (norma install del Makefile) ya instala el fichero dh_installinit no hará nada. Podemos solucionar este problema añadiendo la línea:

$ mv $(CURDIR)/debian/echod/etc/init.d/echod $(CURDIR)/debian/echod.init

En la norma install del fichero debian/rules queda de la siguiente forma:

install: build
	dh_testdir
	dh_testroot
	dh_clean -k 
	dh_installdirs

	# Add here commands to install the package into debian/echod.
	$(MAKE) DESTDIR=$(CURDIR)/debian/echod install
  	mv $(CURDIR)/debian/echod/etc/init.d/echod $(CURDIR)/debian/echod.init

Per tal de què tot això funcioni, recordem que he de tenir configurat el script d'inici init.d tal com havíem fet en la secció anterior de demonitzar el servidor d'echos. El fitxer init.d el posarem dins la carpeta /debian, on tenim una plantilla init.d.ex que la renombrem a init.d. Nosaltres copiem el fitxer que teníem (es deia echod, on havíem definit start, stop, restart i reload).

Compte! perquè en el fitxer init.d.ex hi ha un error de sintaxi en les línies 88 i 103. On diu if running then ha de dir if running ; then.

Per tant, finalment l'opció bona és aprofitar el fitxer echod que tenia de la secció anterior (Demonitzar...). Això sí, he de canviar les rutes, doncs ara el binari estarà a /usr/sbin/echod

fitxer /debian/init.d

#!/bin/sh
# modificat Joan Quintana, 30 oct 08
# Start/stop the echod daemon.
#
### BEGIN INIT INFO
# Provides:          echod (servidor d'ecos)
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Servidor d'ecos. Pràctica
# Description:       Servidor d'ecos. Necessita el client 
#                    ./client missatge -> el servidor contesta 'missatge' que el rep altra vegada el client 
### END INIT INFO

#comprovem que existeixi el fitxer
test -f /usr/sbin/echod || exit 0

#LSBNAMES='-l'  # Uncomment for LSB name support in /etc/cron.d/
#no sé què és això
. /lib/lsb/init-functions

case "$1" in
start)  log_daemon_msg "Engegant echod" "echod"
        start-stop-daemon --start --quiet --pidfile /var/run/echod.pid --name echod --startas /usr/sbin/echod -- $LSBNAMES
        log_end_msg $?
        ;;
stop)   log_daemon_msg "Aturant echod" "echod"
        start-stop-daemon --stop --quiet --pidfile /var/run/echod.pid --name echod
        log_end_msg $?
        ;;
restart) log_daemon_msg "Reiniciant echod" "echod" 
        start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/echod.pid --name echod
        start-stop-daemon --start --quiet --pidfile /var/run/echod.pid --name echod --startas /usr/sbin/echod -- $LSBNAMES
        log_end_msg $?
        ;;
*)      log_action_msg "Mode d'us: /etc/init.d/echod {start|stop|restart}"
        exit 2
        ;;
esac
exit 0

Tornem a crear el paquet:

$ fakeroot
root$ dpkg-buildpackage

Però no va bé. Quan faig dpkg-buildpackage em falla per culpa d'aquesta línia que he ficat en el debian/rules. El problema que m'estic trobant tota l'estona és que quan poso en el fitxer debian/rules la línia

$ mv $(CURDIR)/debian/echod/etc/init.d/echod $(CURDIR)/debian/echod.init

em falla. Troba a faltar el fitxer /home/joan/sessio10/echod-0.1/debian/echod/etc/init.d/echod.

Exactament diu:

mv /home/joan/sessio10/echod-0.1/debian/echod/etc/init.d/echod /home/joan/sessio10/echod-0.1/debian/echod.init
mv: no se puede efectuar `stat' sobre «/home/joan/sessio10/echod-0.1/debian/echod/etc/init.d/echod»: No existe el fichero ó directorio

Doncs bé, el fitxer echod en qüestió és el script d'arrencada que està a /debian/init.d i que l'he personalitzat. El copio manualment a /home/joan/sessio10/echod-0.1/debian/echod/etc/init.d/echod i torno a comentar la línia mv en el fitxer debian/rules (que és la que fallava)

$ cp debian/init.d debian/echod/etc/init.d/echod

Torno a compilar, i no oblidar-se de fer exit

i al final després de molt provar-ho he aconseguit que a /etc/init.d hi hagi echod

efectivament, a /etc/rc5.d trobem S20echod (i a rc2.d, rc3.d i rc4.d)

joan@ubuntu:~/sessio10$ sudo /etc/init.d/echod stop
 * Aturant echod echod                                                                                                 [ OK ] 
joan@ubuntu:~/sessio10$ sudo /etc/init.d/echod start
 * Engegant echod echod                                                                                                [ OK ] 
joan@ubuntu:~/sessio10$ sudo /etc/init.d/echod restart
 * Reiniciant echod echod  

Ara bé la prova de foc, reinicio la màquina i a veure si arrenca... Sí, ja funciona!!

Inspeccionem el que hem fet

Dins del paquet Debian hi ha el control.tar.gz, que conté entre d'altres els scripts de manteniment: preinst, postint, prermv, postrmv, que s'executaran abans i després d'una instal.lació o desinstal.lació del paquet. Per ex, com que és un dimoni, volem que després de la instal.lació arrenqui el dimoni tot seguit.

Tots els fitxers que s'empaquetaran es van creant en el directori debian/echod:

$ ls -R debian/echod
debian/echod:
DEBIAN  etc  usr

debian/echod/DEBIAN:
conffiles  control  md5sums  postinst  postrm  prerm

debian/echod/etc:
echod  init.d

debian/echod/etc/echod:
port

debian/echod/etc/init.d:
echod

debian/echod/usr:
bin  sbin  share

debian/echod/usr/bin:

debian/echod/usr/sbin:
echod

debian/echod/usr/share:
doc  man

debian/echod/usr/share/doc:
echod

debian/echod/usr/share/doc/echod:
changelog.Debian.gz  copyright  README.Debian

debian/echod/usr/share/man:
man1

debian/echod/usr/share/man/man1:
echod.1.gz


Per exemple, el fitxer echod.postinst.debhelper es crea quan en el procés de creació del paquet cridem a dh_installinit.

~/sessio10/echod-0.1/debian$ cat echod.postinst.debhelper 
# Automatically added by dh_installinit
if [ -x "/etc/init.d/echod" ]; then
	update-rc.d echod defaults >/dev/null
	if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
		invoke-rc.d echod start || exit $?
	else
		/etc/init.d/echod start || exit $?
	fi
fi
# End automatically added section

veiem que la idea d'aquest script és arrencar el servei.

A la carpeta debian existeix la plantilla postinst.ex que puc editar i renombrar-la a postinst:

#!/bin/sh
# postinst script for echod
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <postinst> `configure' <most-recently-configured-version>
#        * <old-postinst> `abort-upgrade' <new version>
#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
#          <new-version>
#        * <postinst> `abort-remove'
#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
#          <failed-install-package> <version> `removing'
#          <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package


case "$1" in
    configure)
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)
    ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

la unió d'aquests dos scripts formaran el script de mantenimiento final postinst que trobarem en el fitxer control.tar.gz del paquete debian final.

Per veure tots els fitxers que instal.la el paquet echod:

$ dpkg -L echod
/.
/etc
/etc/echod
/etc/echod/port
/etc/init.d
/etc/init.d/echod
/usr
/usr/bin
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/echod.1.gz
/usr/share/doc
/usr/share/doc/echod
/usr/share/doc/echod/changelog.Debian.gz
/usr/share/doc/echod/README.Debian
/usr/share/doc/echod/copyright
/usr/sbin
/usr/sbin/echod

I doncs? on està el fitxer postinst que s'ha creat i que existeix en el paquet? No apareix a la llista, però està a

/var/lib/dpkg/info/echod.postinst

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines