Die größten installierten DEB Pakete zu finden kann sehr nützlich sein, wenn wenig Festplattenkapazität verfügbar ist.

dpkg-query -Wf '${Installed-Size}t${Package}n' | sort -n

Das größte installierte DEB Paket befindet sich ganz unten. Das kleinste folglich ganz oben.

Keine Kommentare »
 

Auf der Suche nach einem Backup Shell Script für meinen Debian Server wurde ich in den weiten des Internets nicht fündig. Zumindest fand ich kein Script das genau das tat was ich wollte. Also machte ich mich selbst ans Werk. Vorweg: Das Script erstellt nicht einfach eine simple Kopie des Festplatteninhalts. Dies verbraucht meiner Meinung nach zu viel Speicherplatz. Sämtliche Debian Binarys müssen nämlich nicht gesichert werden. Denn diese sind von den Servern aus der sources.list abrufbar. Einzig und allein die Binarys unter /usr/local/ werden, neben den Konfigurationsdateien unter /etc/ und den Dateien unter /var/ /home/ und /root/, gesichtert. Natürlich können diese Verzeichnisse geändert werden. Es reicht die Variable TOBACKUP im Konfigurationsteil des Scriptes um die entsprechenden Verzeichnisse zu erweitern oder mit Hilfe der Variable TOEXCLUDE Unterverzeichnisse vom Backup auszuschließen. Die Kernel Version, Distribution, Architektur und der Installationszeitpunkt des Systems werden nochmals seperat in der Datei uname.txt gesichert.

Ebenso erstellt das Script SQL Dumps von allen MySQL Datenbanken des Servers und läd das gesamte Backup, verschlüsselt oder nur komprimiert, optional auch auf einen FTP Space übertragen. Wichtig ist das das Verzeichnis das in OUTDIR eingetragen ist exisitert. Sowohl bei lokalem speichern des Backups als auch beim remote Backup Vorgang auf den FTP Space. Eine Übertragung auf einen FTP Backup Space erfolgt nur, wenn FTP Zugangsdaten hinterlegt sind. Sollte etwas in die Option BACKUPPASS eingetragen sein verschlüsselt das Script die Daten mit GnuPG.

Die Kommentare im Script habe ich in englisch gehalten. Damit sollte eigentlich jeder zurecht kommen und ich muss das Script nicht mehrsprachig kommentiert online stellen. Auf alle Konfigurationsoptionen möchte ich hier im Text nicht weiter eingehen. Die Variablenbezeichnungen sowie die Kommentare sollten alles erklären.

#!/bin/sh
 
##
## <Configuration>
##
 
## Backup prefix
PREFIX="yourprefix_"
 
## Dirs which should be backed
TOBACKUP="/root/ /home/ /etc/ /var/ /usr/local/"
 
## Dirs which shouldn't be backed
TOEXCLUDE="/yourdirstoexclude/"
 
## MySQL login data
MYSQLUSER="yoursqluser"
MYSQLPASS="yoursqlpass"
MYSQLHOST="yoursqlhost"
 
## Dir to save backup
OUTDIR="yourdirtosave"
 
## FTP login form the backup FTP server (optional)
FTPHOST="optionalyourftphost"
FTPUSER="optionalyourftpuser"
FTPPASS="optionalyourftppss"
 
## Backup password (optional)
BACKUPPASS="optionalyourpassword"
 
## Working dir
WORKINGDIR="/tmp/"
 
## Logfile
LOGFILE="/var/log/${PREFIX}backup.log"
 
##
## </Configuration>
##
 
if [ -n "$OUTDIR" ]; then
 
	## Set prozess priority
	renice -19 -p $$ 1> /dev/null 2>> $LOGFILE
 
	## Set I/O priority
	ionice -c2 -n1 -p $$ 1> /dev/null 2>> $LOGFILE
 
	## Date and time
	DATE=$(date "+%Y-%m-%d-%H-%M-%S")
 
	## Create and enter working dir
	mkdir ${WORKINGDIR}${PREFIX}${DATE}
	cd ${WORKINGDIR}${PREFIX}${DATE}
 
	## Save version
	uname -a > "uname.txt"
	TOBACKUP="${TOBACKUP} uname.txt"
 
	## Create a list with installed deb pakets
	dpkg --get-selections > "deb.list"
	TOBACKUP="${TOBACKUP} deb.list"
 
	## Create MySQL dump environment
	mkdir mysqldumps/
	TOBACKUP="${TOBACKUP} mysqldumps/"
 
	## Create MySQL dumps from all databases
	DBS="$(mysql  -h $MYSQLHOST -u $MYSQLUSER -p$MYSQLPASS -Bse 'show databases' 2>> $LOGFILE)"	
	if [ $? -ne 0 ]; then
 
		## Delete temporary files
		rm -r ${WORKINGDIR}${PREFIX}${DATE}
		exit 1
	fi
	for DB in $DBS; do
		mysqldump --skip-lock-tables -h $MYSQLHOST -u $MYSQLUSER -p$MYSQLPASS $DB > "mysqldumps/${DB}.sql"
	done
 
        ## Exclude dirs
	if [ -n "$TOEXCLUDE" ]; then
 
		TOEXCLUDE="--exclude ${TOEXCLUDE}"
	fi
 
	## Compress and / or encrypt files
	if [ -n "$BACKUPPASS" ]; then	
 
		VAR_EXTENSION=".tar.bz2.gpg"
		tar -cf - $TOBACKUP $TOEXCLUDE 2> /dev/null | gpg --symmetric --bzip2-compress-level 9 --passphrase ${BACKUPPASS}  > "${PREFIX}${DATE}${VAR_EXTENSION}"
	else
 
		VAR_EXTENSION=".tar.bz2"
		tar -cf - $TOBACKUP $TOEXCLUDE 2> /dev/null | bzip2 -c --best > "${PREFIX}${DATE}${VAR_EXTENSION}"
	fi
 
	if [ -n "$FTPHOST" ] && [ -n "$FTPUSER" ] && [ -n "$FTPPASS" ]; then
 
		## Save backup on FTP server
		ncftpput -u $FTPUSER -p $FTPPASS $FTPHOST $OUTDIR "${PREFIX}${DATE}${VAR_EXTENSION}" 2>> $LOGFILE
 
	else
 
		## Save backup lokal
		cp "${PREFIX}${DATE}${VAR_EXTENSION}" "$OUTDIR" 2>> $LOGFILE
	fi
 
	## Delete temporary files
	rm -r ${WORKINGDIR}${PREFIX}${DATE}
 
	if [ $? -ne 0 ]; then		
		exit 1
	else	
		exit 0
	fi
else
	echo "Error: Output dir is empty" >> $LOGFILE 
	exit 1
fi

Der Name des komprimierten Backups setzt sich wie folgt zusammen: %Präfix%%Jahr%-%Monat%-%Tag%-%Stunde%-%Minute%-%Sekunde%.tar.bz2. Die Log Datei des Scripts findest du unter /var/log/%Präfix%backup.log. Enthalten sind dort Statistiken und Fehler zur FTP Übertragung sowie kritische Konfigurationsfehler.

Im Script werden Prozess und I/O Priorität angepasst um den Server nicht an seiner regulären Arbeit zu hindern. Beachte dabei das ein Ausführen von nice nur mit root Rechten möglich ist.

Mögliche Probleme mit Paketabhängigkeiten sollten sich nach dem erfolgreichen ausführen dieses Befehls erledigt haben:

sudo apt-get install ncftp bzip2 gnupg

Sowohl date als auch tar, nice, ionice dpkg und mysql / mysqldump sind normalerweise auf dem Server vorhanden.

Bei Fragen oder Problemen scheue nicht die Kommentarfunktion zu verwenden.

17 Kommentare »
 

In diesem Artikel veröffentliche ich ein Script, das es schnell und einfach ermöglicht zu prüfen ob ein Paket installiert ist. Dieses Script kann auf allen Distributionen die den Debian Package Manager (kurz dpkg) als Programm zur Paketverwaltung verwenden eingesetzt werden. Auf jeden Fall ist es also auf Debian und Ubuntu funktional. Es wird mit Hilfe von dpkg und grep geprüft ob ein deb Paket den Suchstring im Namen hat.

Der Inhalt meines Scriptes dpkgcheck.sh:

#! /bin/sh
 
if [ -n "$1" ]; then
	dpkg --get-selections | xargs -n 1 | grep "$1"
	exit 0
else
	echo "#n# dpkgcheck.sh - searchs installed deb pakagesn# Usage: ./dpkgcheck.sh <name> n#"
	exit 1
fi

Sollte das Script keine Ausgabe haben ist kein Paket installiert das den erforderlichen Suchstring im Paketname hat. Vergesst nicht dem Script vor dem Ausführen x zu geben (chmod +x <name>).

Keine Kommentare »