Eigene Debian Pakete erstellen – preinst und postinst

Vor kurzem habe ich darueber geschrieben wie man eigene Debian-Pakete und ein eigenes Repository dafuer erstellt. Ich moechte nun hinzufuegen, wie man Skripte vor- und nach der Installation ausfuehrt. Basis ist hier das Debian-Paket fuer das pregoBackup.sh Skript was in dem verlinkten Post steht.

Um Skripte vor und nach der Installation auszufuehren werden die beiden Dateien

./DEBIAN/preinst
./DEBIAN/postinst

benoetigt. Dieses koennen einfach Bash-Skripte sein, die dann bei der Installation aufgerufen werden. Nehmen wir an, ich moechte vor der Installation eine 100MB grosse Datei erstellen, und nach der erfolgreichen Installation des Paketes diese Datei wieder loeschen, koennten die beiden Skripte z.B. wie folgt aussehen:

preinst:

    #!/bin/bash
    echo "creating 100mb file..."
    dd if=/dev/zero of=/tmp/100megsofzero bs=1024 count=100000

    postinst:

      #!/bin/bash
      echo "deleting 100mb file..."
      rm -f /tmp/100megsofzero

      Paket erzeugen und ausprobieren…

      Eigene Debian-Pakete und Repository erstellen

      Sobald als man Admin mehrere Server zu administrieren hat, kommt man in den Genuss ein- und das dasselbe auf viele Servern immer wieder machen zu muessen. Heute moechte ich mich dem Thema widmen auf vielen Servern z.B. eine neue Version des Backupskriptes einzuspielen. Dafuer brauche ich zwei Dinge

      1. ein Debian Paket mit meinem Skript
      2. ein Debian Repository ueber das das Paket verteilt wird

      Der hier im folgenden vorgestellte Weg ist sehr simpel und rudimentaer gehalten und behandelt explizit Dinge wie SecureApt nicht.

      Erstellen eines eigenen Debian-Paketes

      Zum Erstellen des eigenen Debian Paketes benoetige ich nun zwei Dinge. Einmal mein Backupskript pregoBackup.sh und einmal eine control-Datei, die Informationen ueber das Debian Paket enthaelt. Die control Datei koennte z.B. wie folgt aussehen:

      Package: pregoBackup
      Version: 0.5
      Section: server
      Priority: optional
      Architecture: all
      Essential: no
      Installed-size: 1024
      Maintainer: prego presto
      Description: pregos Backup Skript zum Sichern des Servers

      Das ganze vorgehen jetzt in Worte zu fassen waere sehr umstaendlich. Deswegen in kurz: die control Datei liegt in dem Unterordner ./DEBIAN und neben das DEBIAN Verzeichnis packe ich das Skript an die Stelle, wo ich es im Dateisystem liegen haben moechte:

      cd /tmp
      mkdir pregoBackup
      cd pregoBackup
      mkdir ./DEBIAN
      mkdir -p ./root/skripte
      cp control ./DEBIAN
      cp pregoBackup.sh ./root/skripte

      Als naechstes wird das Debian-Paket erstellt:

      cd /tmp
      dpkg-deb --build pregoBackup

      Danach sollten wir die Datei /tmp/pregoBackup.deb haben. Was darin enthalten ist koennen wir uns mit:

      dpkg-deb --contents pregoBackup.deb

      anzeigen lassen, und wer moechte kann es auch spasseshalber mal mit

      dpkg -i pregoBackup.deb
      aptitude show pregoBackup
      aptitude purge pregoBackup

      installieren, angucken und deinstallieren.

      Anlegen eines Debian Repositories

      An zweiter Stelle lege ich nun ein Repository an. Dafuer erstelle ich zuerst eine Verzeichnisstruktur dafuer:

      mkdir -p /srv/myrepository/{binary,source}

      Anschliessend lege ich einen simplen Apache vhost an mit einer Zugangsbeschraenkung fuer das Repository auf mein lokales Netz:

          ServerAdmin webmaster@example.net
          ServerName myrepository.example.net
          DocumentRoot /srv/myrepository/
       
                      AllowOverride None
                      Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
                      Order Deny,Allow
                      Deny from all
                      Allow from 192.168.0.0/255.255.0.0

      Nun kann ich mein frisch erstelltes Debian-Paket in die Repository Dateisystemstruktur kopieren:

      cp /tmp/pregoBackup.deb /srv/myrepository/binary/

      Zu guter letzt muss noch der Repository Index erstellt werden. Dafuer muss das Paket dpkg-dev vorhanden sein:

      aptitude install dpkg-dev
      cd /srv/myrepository
      dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz
      dpkg-scansources source /dev/null | gzip -9c > source/Sources.gz

      Wenn das alles fertig ist, brauche ich nur noch auf meinem Server die entsprechenden Zeilen in die /etc/apt/sources.conf eintragen, die Liste der verfuegbaren Pakete von den apt-Quellen erneuern und dann kann das Paket installiert werden.

      ## my personal repository
      deb http://myrepository.example.net binary/
      deb-src http://myrepository.example.net source/
      aptitude update
      aptitude install pregoBackup

      Howto: virsh console

      Bei XEN gibt es den praktischen Befehl xm console domU-name und man hat von der physikalischen Maschine eine Konsole zu der virtuellen.

      KVM bringt mit dem Befehl virsh console maschinenname die gleiche Funktion ebenfalls mit. Damit das ganze funktioniert muss – zumindest bei Debian – noch etwas nachgeholfen werden.  In der /etc/inittab muss die folgende Zeile relativ am Ende einkommentiert und entsprechend angepasst werden (change 9600 to 115200) werden:

      T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100

      Anschliessend noch in der /boot/grub/menu.lst in der Zeile die mit #kopt beginnt die folgenden Optionen anhaengen:

      console=tty0 console=ttyS0,115200

      und die Aenderungen mit dem Befehl update-grub uebernehmen.

      Die erste Anpassung in der inittab bewirkt, dass man in ein fertig gestartetes Linuxsystem kommt. Die Anpassung mit der Kerneloption bewirkt, dass man auch vorher beim Systemstart bereits eine Konsole bekommt.

      Hinaus kommt man dort  uebrigens wieder mit der Tastenkombination Strg+Alt Gr+9  … wie damals, good old telnet times.

      ext2/3: fuer root reservierte Bloecke freigeben

      Bei ueblichen Distributionen wie Debian oder Ubuntu wird bei dem formatieren einer Festplatte mit ext2 oder ext3 immer ein Bereich von ~5% fuer root reserviert. Dieses fuehrt dazu, dass die Festplatten einen kleineren Bereich zur Verfuegung haben, als sie eigentlich Besitzen. Gerade bei grossen Festplatten oder entsprechenden RAIDs koennen die 5% ganz schoen viel werden.

      Wieviel Speicher reserviert ist kann man mit dem Tool tune2fs herausfinden. Der Befehl:

      tune2fs -l /dev/mydevice

      gibt mir u.a. die Werte „Reserved block count“ und „Block size“ aus. Multipliziert man nun diese beiden Zahlen bekommt man heraus, wieviele Bytes benutzt sind.

      Den Speicher freigeben kann man ebenfalls mit dem Programm tune2fs:

      tune2fs -m 0 /dev/mydevice

      Den Unterschied kann man z.B mit dem Tool df angucken, wenn man es vorher und nachher aufruft. Interessant ist nicht der „Size“ sondern der „Avail“ Wert.