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
- ein Debian Paket mit meinem Skript
- 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 |
bash Skript und Multicore Prozessoren
Wenn man viel mit bash-Skripten macht, kommt man oft an das Problem, dass man Multicore-Prozessoren nicht richtig ausreizen kann. Nehmen wir das Beispiel, dass man alle *.tif Bilder in einem Ordner mit Hilfe von imagemagick zu TIFF/JPEG komprimieren moechte. Das Skript:
for i in *.tif ; do convert $i -compress JPEG $i; done |
macht dieses, ein Bild nacheinander. Man koennte das ganze nun schneller machen, indem man einfach jeden convert in eine Subshell packt:
for i in *.tif ; do convert $i -compress JPEG $i &; done |
kommt dann aber sehr schnell in Schwierigkeiten, wenn dann nen Ordner mit z.B. 500 Bildern hat und dann auch 500 Subshells. Eine elegantere Loesung ist, eine maximale Anzahl von Prozessen anzugeben die nicht ueberschritten wird und dann abzuarbeiten. Dafuer laesst sich xargs gut benutzen. Wenn man z.B. maximal vier Prozesse haben moechte geht das mit:
find *.tif -print0 | xargs -0 -I {} -P 4 convert -compress JPEG {} {} |
Dabei bedeuten die Parameter bei find:
- -print0 -> print the full file name on the standard output, followed by a null character
und bei xargs:
- -0 -> Input items are terminated by a null character instead of by whitespace
- -I {} -> Replace string
- -P 4 -> Run up to max-procs processes at a time
Der String replace wird genutzt um zweimal das gleiche Argument zu uebergeben. Arbeitet man mit -n 2 werden zwei aufeinanderfolgende Argumente uebergeben.
LDAP-Backup erstellen
Ich bin ein Freund vom Plain text. Damit laesst sich IMHO immer noch am besten Arbeiten. Man kann es in alle denkbaren Formate umwandeln, umbiegen, exportieren, was auch immer, und ist deswegen was Backups angeht das Ziel meiner Wahl. Natuerlich habe ich bei dem LDAP-Server das /var/lib/ldap/ im Backuppath mit drin, aber es geht nichts ueber eine Textdatei in der die Werte nochmal als Plain text drinstehen; gleiches gilt uebrigens fuer MySQL-Datenbanken...
Die Backupdatei erstelle ich mit slapcat. Wichtig dabei ist zu beachten, dass die slap* Tools ganz anders arbeiten als die entsprechenden ldap* Gegenstuecke. Beispiel slapadd und ldapadd. Die ldap* Tools sind LDAP-Clients die ueber das LDAP-Protokoll auf die Datenbank zugreifen. Die slap* Befehle aber greifen direkt auf die lokalen Datenbankdateien zu, die Berkley DB = *.bdb Dateien in /var/lib/ldap/. Da die slap* Befehle direkt darauf zugreifen koennen Sie natuerlich nur auf dem Rechner ausgefuehrt werden auf dem der LDAP-Server laeuft, und es ist wichtig, dass der LDAP-Daemon nicht laeuft. Entsprechend ist auch das Backup-Skript was fuer den LDAP laeuft, einmal taeglich per Cron aufgerufen:
#!/bin/bash SLAPCAT=/usr/sbin/slapcat GZIP=/bin/gzip BACKUPDIR=/root/ldapbackup/ # Daemon stoppen /etc/init.d/slapd stop > /dev/null 2>&1 if [ $? != "0" ]; then logger -t "LDAP-Backup:" "Fehler beim Stoppen des slapd Daemons." exit 1 fi # Backup in Textdatei erzeugen $SLAPCAT > $BACKUPDIR/$(date +%Y%m%d)-ldapbackup.ldif if [ $? != "0" ]; then logger -t "LDAP-Backup:" "Fehler beim Schreiben der Backupdatei mit slapcat." exit 1 fi # Textdatei komprimieren $GZIP $BACKUPDIR/$(date +%Y%m%d)-ldapbackup.ldif if [ $? != "0" ]; then logger -t "LDAP-Backup:" "Fehler beim Komprimieren der erstellten Backupdatei." exit 1 fi # Daemon starten und wenn es ueberall keine Probleme gab dann Erfolgsmeldung in syslog /etc/init.d/slapd start > /dev/null 2>&1 if [ $? != "0" ]; then logger -t "LDAP-Backup:" "Fehler beim Starten des slapd Daemons." exit 1 else logger -t "LDAP-Backup:" "Das Backup der LDAP-Datenbank wurde erfolgreich durchgefuehrt." fi |
