{"id":72,"date":"2010-09-20T11:49:44","date_gmt":"2010-09-20T09:49:44","guid":{"rendered":"https:\/\/caipirinha.spdns.org\/wp\/?p=72"},"modified":"2019-09-29T20:42:11","modified_gmt":"2019-09-29T18:42:11","slug":"backup","status":"publish","type":"post","link":"https:\/\/caipirinha.spdns.org\/wp\/?p=72","title":{"rendered":"Backup"},"content":{"rendered":"\n<p>Ich denke, \u00fcber den Sinn von Backups muss hier nichts erz\u00e4hlt \nwerden. Dennoch empfehle ich zun\u00e4chst die Lekt\u00fcre folgender Quellen: <a href=\"http:\/\/de.wikipedia.org\/wiki\/Datensicherung\">[1]<\/a>, <a href=\"http:\/\/www.ostc.de\/howtos\/unix-backup-HOWTO.html\">[2]<\/a>, <a href=\"http:\/\/gradha.sdf-eu.org\/textos\/dar-differential-backup-mini-howto.en.html\">[3]<\/a> und <a href=\"http:\/\/caipirinha.homelinux.org\/usr\/share\/doc\/packages\/dar\/\">[4]<\/a>.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Internes Backup<\/h2>\n\n\n\n<p>Auf dem Caipirinha-Server hatte ich zun\u00e4chst viele Jahre lange einfach mit <strong>tar<\/strong>\n gesichert und dabei f\u00fcr Dokumente, Konfigurationsdateien und \nProjektdaten einzelne tar-, tgz- und tbz-Dateien erzeugt, und zwar \nVoll-Backups. Da sich nun aber auf dem Caipirinha-Server doch t\u00e4glich \neinige Dateien \u00e4ndern, bin ich nach einer l\u00e4ngeren Durchsicht \nverschiedener Methoden darauf gekommen, Backups mit <strong>dar<\/strong> zu machen. <strong>dar<\/strong> funktioniert \u00e4hnlich wie <strong>tar<\/strong>, kann aber differentielle Backups machen. Aber betrachten wir zun\u00e4chst einmal das Backup-Skript, welches \u00fcber einen <strong>cron<\/strong>-Job jede Nacht ausgef\u00fchrt wird:\n<\/p>\n\n\n\n<p><strong>\/root\/bin\/backup_new.sh<\/strong>:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>#!\/bin\/bash\n# Automated backup script for important data on CAIPIRINHA\n# Gabriel R\u00fceck, 20.09.2010\n\n# Set appropriate umask.\numask 0077\n\n# Create a directory for the backups if it does not already exist.\nBACKUP_DIR='\/backup\/Backup-'$(date +%b)\ntest -d $BACKUP_DIR || mkdir $BACKUP_DIR\n\n# Delete old backup directories.\nfind \/backup -maxdepth 1 -daystart -mtime +62 -and -type d -name \"Backup-*\" -exec rm -rf {} \\;\n\n# Get the day of the month and determine whether full or incremental backups will be done. The first day will always result in a full backup.\nDAY=$(date +%d)\nif [ $DAY -eq 1 ]; then\n   # Do a full backup every beginning of a month.\n   dar -Q       -R\/home\/public\/Audio       -c${BACKUP_DIR}\/Audio-full       -u\"user.Beagle\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q    -D -R\/home\/public\/Bilder      -c${BACKUP_DIR}\/Bilder-full      -u\"user.Beagle\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Dokumente   -c${BACKUP_DIR}\/Dokumente-full   -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\"c't\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/GroupOffice -c${BACKUP_DIR}\/GroupOffice-full -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Linux       -c${BACKUP_DIR}\/Linux-full       -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -X\"*.iso\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/home\/public\/Mail        -c${BACKUP_DIR}\/Mail-full        -u\"user.Beagle\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Software    -c${BACKUP_DIR}\/Software-full    -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -X\"*.iso\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Spiele      -c${BACKUP_DIR}\/Spiele-full      -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -X\"fearcombat_en_*\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public             -c${BACKUP_DIR}\/Rest-full        -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\"Audio\" -P\"Bilder\" -P\"BitTorrent\" -P\"Datenbank*\" -P\"Dokumente\" -P\"GroupOffice\" -P\"Linux\" -P\"Mail\" -P\"Software\" -P\"Spiele\" -P\"Streaming\" -P\"Video\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/etc                     -c${BACKUP_DIR}\/etc-full         -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/srv\/www\/htdocs          -c${BACKUP_DIR}\/www-full         -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\"mrtg\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q       -R\/var\/spool\/cron\/tabs     -c${BACKUP_DIR}\/cron_tables-full -u\"user.Beagle\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n\n   dar -Q -y    -R\/root                    -c${BACKUP_DIR}\/root_files-full  -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\".adobe\" -P\".strigi\" -P\".mozilla\" -P\".thumbnails\" -P\".tvbrowser\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/home                    -c${BACKUP_DIR}\/user_files-full  -u\"user.Beagle\" -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -Z\"*.mpg\" -Z\"*.avi\" -Z\"*.mkv\" -P\"ftp\" -P\"mailowner\" -P\"public\" -P\"tmp\" -P\"*\/.adobe\" -P\"*\/.strigi\" -P\"*\/.google\" -P\"*\/.mozilla\" -P\"*\/.thumbnails\" -P\"*\/.tvbrowser\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n\n   # Check the integrity of the backup files.\n   dar -Q -t${BACKUP_DIR}\/Audio-full       >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Bilder-full      >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Dokumente-full   >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/GroupOffice-full >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Linux-full       >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Mail-full        >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Software-full    >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Spiele-full      >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Rest-full        >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/etc-full         >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/www-full         >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/cron_tables-full >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n\n   dar -Q -t${BACKUP_DIR}\/root_files-full  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/user_files-full  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\nelse\n   # Do an incremental backup on all remaining days of the month.\n   dar -Q       -R\/home\/public\/Audio       -c${BACKUP_DIR}\/Audio-${DAY}       -u\"user.Beagle\" -A${BACKUP_DIR}\/Audio-full       >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q    -D -R\/home\/public\/Bilder      -c${BACKUP_DIR}\/Bilder-${DAY}      -u\"user.Beagle\" -A${BACKUP_DIR}\/Bilder-full      >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Dokumente   -c${BACKUP_DIR}\/Dokumente-${DAY}   -u\"user.Beagle\" -A${BACKUP_DIR}\/Dokumente-full   -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\"c't\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/GroupOffice -c${BACKUP_DIR}\/GroupOffice-${DAY} -u\"user.Beagle\" -A${BACKUP_DIR}\/GroupOffice-full -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Linux       -c${BACKUP_DIR}\/Linux-${DAY}       -u\"user.Beagle\" -A${BACKUP_DIR}\/Linux-full       -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -X\"*.iso\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/home\/public\/Mail        -c${BACKUP_DIR}\/Mail-${DAY}        -u\"user.Beagle\" -A${BACKUP_DIR}\/Mail-full        >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Software    -c${BACKUP_DIR}\/Software-${DAY}    -u\"user.Beagle\" -A${BACKUP_DIR}\/Software-full    -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -X\"*.iso\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public\/Spiele      -c${BACKUP_DIR}\/Spiele-${DAY}      -u\"user.Beagle\" -A${BACKUP_DIR}\/Spiele-full      -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -X\"fearcombat_en_*\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y -D -R\/home\/public             -c${BACKUP_DIR}\/Rest-${DAY}        -u\"user.Beagle\" -A${BACKUP_DIR}\/Rest-full        -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\"Audio\" -P\"Bilder\" -P\"BitTorrent\" -P\"Datenbank*\" -P\"Dokumente\" -P\"GroupOffice\" -P\"Linux\" -P\"Mail\" -P\"Software\" -P\"Spiele\" -P\"Streaming\" -P\"Video\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/etc                     -c${BACKUP_DIR}\/etc-${DAY}         -u\"user.Beagle\" -A${BACKUP_DIR}\/etc-full         -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/srv\/www\/htdocs          -c${BACKUP_DIR}\/www-${DAY}         -u\"user.Beagle\" -A${BACKUP_DIR}\/www-full         -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\"mrtg\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q       -R\/var\/spool\/cron\/tabs     -c${BACKUP_DIR}\/cron_tables-${DAY} -u\"user.Beagle\" -A${BACKUP_DIR}\/cron_tables-full >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n                                                                                              \n   dar -Q -y    -R\/root                    -c${BACKUP_DIR}\/root_files-${DAY}  -u\"user.Beagle\" -A${BACKUP_DIR}\/root_files-full  -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\".adobe\" -P\".strigi\" -P\".mozilla\" -P\".thumbnails\" -P\".tvbrowser\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R\/home                    -c${BACKUP_DIR}\/user_files-${DAY}  -u\"user.Beagle\" -A${BACKUP_DIR}\/user_files-full  -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -Z\"*.mpg\" -Z\"*.avi\" -Z\"*.mkv\" -P\"ftp\" -P\"mailowner\" -P\"public\" -P\"tmp\" -P\"*\/.adobe\" -P\"*\/.strigi\" -P\"*\/.google\" -P\"*\/.mozilla\" -P\"*\/.thumbnails\" -P\"*\/.tvbrowser\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n\n   # Check the integrity of the backup files.\n   dar -Q -t${BACKUP_DIR}\/Audio-${DAY}       >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Bilder-${DAY}      >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Dokumente-${DAY}   >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/GroupOffice-${DAY} >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Linux-${DAY}       >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Mail-${DAY}        >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Software-${DAY}    >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Spiele-${DAY}      >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/Rest-${DAY}        >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/etc-${DAY}         >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/www-${DAY}         >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/cron_tables-${DAY} >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n\n   dar -Q -t${BACKUP_DIR}\/root_files-${DAY}  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/user_files-${DAY}  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\nfi\n\n# MySQL login information\nreadonly MYSQL_USERNAME='root'\nreadonly MYSQL_PASSWORD='geheimes_passwort'\n\n# Create a directory for the database backups if it does not already exist.\nMYSQL_BACKUP_DIR='\/backup\/MySQL-Backup_KW'$(date +%U)\ntest -d $MYSQL_BACKUP_DIR || mkdir $MYSQL_BACKUP_DIR\nPGSQL_BACKUP_DIR='\/backup'\n\n# Delete old backup directories.\nfind \/backup -maxdepth 1 -daystart -mtime +31 -and -type d -name \"MySQL-Backup_KW*\" -exec rm -rf {} \\;\nfind \/backup -maxdepth 1 -daystart -mtime +31 -and -type f -name \"postgres_KW*\" -exec rm {} \\;\n\n# Database backups will be done once per week, in the early morning of Sunday.\nWEEKDAY=$(date +%u)\nif [ $WEEKDAY -eq 7 ]; then\n   # Scan the MySQL Server for valid databases and create a dump file for each database found.\n   DATABASE_LIST=$(mysql -e 'show databases' -u$MYSQL_USERNAME -p$MYSQL_PASSWORD)\n   DATABASE_LIST=$(echo $DATABASE_LIST | cut -d \" \" -f2-)\n   for DATABASE in $DATABASE_LIST\n   for DATABASE in CCPM_Test PCBA nonCCPM_Test\n       do mysqldump -BC --hex-blob -u$MYSQL_USERNAME -p$MYSQL_PASSWORD $DATABASE | gzip -n9 | cat - > ${MYSQL_BACKUP_DIR}\/${DATABASE}.sql.gz\n   done\n\n   # Backup the Postgres Server\n   su -l postgres -c \"pg_dumpall -c | gzip -n9 | cat - > $PGSQL_BACKUP_DIR\/postgres_KW$(date +%U).sql.gz\"\nfi<\/code><\/pre>\n\n\n\n<p>Alle Backups werden auf eine separate Festplatte geschrieben, die als <strong>\/backup<\/strong>\n eingebunden ist. Diese Festplatte befindet sich im Server selbst, und \ndeswegen bietet ein Backup dorthin lediglich Schutz gegen Ausfall der \nSystemplatten oder versehentliches L\u00f6schen von Daten in den \nentsprechenden Verzeichnissen der Systemplatte, nicht aber gegen \nBlitzschlag, Sabotage oder Diebstahl der Maschine.\n<\/p>\n\n\n\n<p>Nach dem Aufrufen werden zun\u00e4chst die <strong>umask<\/strong> entsprechend gesetzt. Danach pr\u00fcft das Skript, ob ein Verzeichnis <strong>\/backup\/Backup-xyz<\/strong> existiert, wobei <strong>xyz<\/strong>\n die Abk\u00fcrzung des aktuellen Monatsnamens ist. Existiert ein solches \nVerzeichnis nicht, dann wird es erzeugt. Nun pr\u00fcft das Skript, ob solche\n Verzeichnisse existieren, die \u00e4lter als <strong>62d<\/strong> sind. Diese werden \nallesamt gel\u00f6scht, denn auf der Backup-Festplatte ist nat\u00fcrlich nur \nbegrenzt viel Platz. Der weitere Verlauf des Skripts h\u00e4ngt nun davon ab,\n ob der aktuelle Tag der erste Tag eines Monats ist.\n<\/p>\n\n\n\n<p>Am <strong>ersten Tag eines Monats<\/strong> wird ein Voll-Backup gemacht, \nan allen Folgetagen des Monats ein differentielles Backup; und zwar \ndifferentiell zum Voll-Backup des Monatsanfangs. Dabei wird der <strong>dar<\/strong>-Befehl eingesetzt, dessen Optionen auf der man-Page (<code>man dar<\/code>) gut beschrieben sind. Einige Punkte sind hierbei hervorzuheben:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Die Option <strong>-u&#8221;user.Beagle&#8221;<\/strong> bewirkt, dass die erweiterten Attribute jeder Datei, welche durch <a href=\"http:\/\/beagle-project.org\/Main_Page\">Beagle<\/a> ge\u00e4ndert worden sind, nicht ber\u00fccksichtigt werden. Dies ist nat\u00fcrlich nur f\u00fcr diejenigen wichtig, die auch den <a href=\"http:\/\/beagle-project.org\/Main_Page\">Beagle<\/a>-Dienst\n auf ihrem Linux-Server laufen haben. Dieser Suchdienst durchforstet \nperiodisch alle Dateien in den eingestellten Verzeichnissen und legt \nseine Daten als <a href=\"http:\/\/en.wikipedia.org\/wiki\/Extended_file_attributes\">erweitertes Attribut<\/a> ab. Dadurch \u00e4ndert sich jedes Mal die Datei, jedenfalls aus Sicht von <strong>dar<\/strong>, und wenn man die <a href=\"http:\/\/en.wikipedia.org\/wiki\/Extended_file_attributes\">erweiterten Attribute<\/a> nicht ausnimmt, kann es vorkommen, dass <strong>dar<\/strong>\n dann t\u00e4glich ein Vollbackup macht, obwohl sich lediglich die \nBeagle-Informationen, nicht aber die Dateiinhalte ge\u00e4ndert haben. Alles \nselbst erlebt.<\/li><li>Am Ende jedes <strong>dar<\/strong>-Kommandos wird die Ausgabe von <strong>dar<\/strong> nach <strong>\/dev\/null<\/strong>\n geschickt, denn das Skript soll im fehlerfreien Fall keine Ausgabe \nerzeugen. Um aber festzustellen, ob ein Fehler aufgetreten ist und in \nwelcher Zeile des Skripts ein solcher Fehler aufgetreten ist, gibt es \ndie Sequenz &#8220;<code>[ $? -eq 0 ] || echo ...<\/code>&#8221; nach jedem <strong>dar<\/strong>-Befehl. Das ist zwar nicht besonders elegant, daf\u00fcr aber zweckm\u00e4\u00dfig.<\/li><li>Viele Verzeichnisse enthalten sowohl komprimierbare Dateien als auch\n Dateien, die bereits komprimiert sind (zip, jpg, tgz, &#8230;). Hier macht \nes Sinn, beim <strong>dar<\/strong>-Kommando die Option &#8220;<strong>-y<\/strong>&#8221; zu nutzen, dann aber f\u00fcr die entsprechenden Dateien die Komprimierung mit der Option &#8220;<strong>-Z<\/strong>&#8221; abzuschalten. Sonst verschwendet man nur Rechenzeit, weil <strong>dar<\/strong> versucht, eine bereits komprimierte Datei nochmals mit <a href=\"http:\/\/de.wikipedia.org\/wiki\/Bzip2\">bzip2<\/a> zu komprimieren.<\/li><\/ul>\n\n\n\n<p>Nach den Backups wird die Integrit\u00e4t der Backup-Dateien gepr\u00fcft. \n<\/p>\n\n\n\n<p> An allen Folgetagen des Monats wird nur eine differentielle Sicherung  durchgef\u00fchrt, und zwar differentiell in Bezug auf die Sicherung vom  Monatsanfang. Damit erreicht man an allen Folgetagen des Monats k\u00fcrzere  Backup-Zeiten. Zum n\u00e4chsten Monatsanfang l\u00e4\u00dft man dann alle ge\u00e4nderten  Dateien in ein neues Voll-Backup einflie\u00dfen, und die differentiellen  Backups werden dann wieder klein. <\/p>\n\n\n\n<p>Danach kommt die Sicherung der <a href=\"http:\/\/localhost\/mediawiki\/index.php\/MySQL\">MySQL<\/a>&#8211; und der <a href=\"http:\/\/localhost\/mediawiki\/index.php?title=Postgres&amp;action=edit&amp;redlink=1\">Postgres<\/a>-Datenbanken.\n Die Datenbanken werden jeden Sonntag gesichert. Dieser Teil des \nBackup-Skripts folgt also einem anderen Rhythmus als der erste Teil mit \nden <strong>dar<\/strong>-Kommandos. F\u00fcr die <a href=\"http:\/\/localhost\/mediawiki\/index.php\/MySQL\">MySQL<\/a>-Datenbanken wird zun\u00e4chst ein Verzeichnis namens <strong>\/backup\/MySQL-Backup_KWxy<\/strong> erstellt, wobei <strong>xy<\/strong>\n die aktuelle Kalenderwoche ist. Existiert ein solches Verzeichnis \nnicht, dann wird es erzeugt. Alte Verzeichnisse werden nach einiger Zeit\n (<strong>31d<\/strong>) wieder gel\u00f6scht. F\u00fcr die <a href=\"http:\/\/localhost\/mediawiki\/index.php\/MySQL\">MySQL<\/a>-Datenbanken wird eine Liste aller Datenbanken erstellt, jede Datenbank mit dem Kommando <strong>mysqldump<\/strong> ausgelesen, komprimiert und in dem zu der aktuellen Kalenderwoche geh\u00f6rigen Verzeichnis abgelegt. Die <a href=\"http:\/\/localhost\/mediawiki\/index.php?title=Postgres&amp;action=edit&amp;redlink=1\">Postgres<\/a>-Datenbanken werden mit dem Befehl <strong>pg_dumpall<\/strong> ausgelesen, komprimiert und mit einem entsprechenden Namen, der die aktuelle Kalenderwoche beinhaltet, in <strong>\/backup<\/strong> abgelegt. Da diese Sicherung als Benutzer <em>postgres<\/em> abl\u00e4uft, muss das Verzeichnis <strong>\/backup<\/strong>\n entweder f\u00fcr alle Benutzer beschreibbar sein, was ein gewisses \nSicherheitsrisiko darstellt. Oder man erzeugt alternativ ein separates \nVerzeichnis in <strong>\/backup<\/strong>, welches dem Benutzer <em>postgres<\/em> geh\u00f6rt und sichert die Dateien dort hinein.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backup einer entfernten Maschine<\/h2>\n\n\n\n<p>Auf dem Caipirinha-Server werden auch Backups der entfernten Maschine <a href=\"http:\/\/rueeck.name\">rueeck.name<\/a> erstellt. Dazu dient dieses Skript:\n<\/p>\n\n\n\n<p><strong>\/root\/bin\/backup_1blu.sh<\/strong>: \n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n# Dieses Skript synchronisert wichtige Verzeichnisse des 1blu-Servers mit einem tempor\u00e4ren Verzeichnis und erzeugt Backups.\n# Gabriel R\u00fceck, 10.08.2010\n\nreadonly SOURCE='v37829.1blu.de'\nreadonly SYNCDIR='\/backup\/1blu\/sync\/'\n\n# Wichtige Verzeichnisse synchronisieren\nrsync -azq --rsh=ssh --delete --exclude=\"coppermine\/\" --exclude=\"mediawiki\/\" --exclude=\"mrtg\/\" --exclude=\"phpPgAdmin\/\" --exclude=\"webalizer\/\"    ${SOURCE}:\/srv\/www\/htdocs\/    ${SYNCDIR}\/srv\/\nrsync -azq --rsh=ssh --delete    ${SOURCE}:\/home\/public\/GroupOffice       ${SYNCDIR}\nrsync -azq --rsh=ssh --delete    ${SOURCE}:\/etc                           ${SYNCDIR}\nrsync -azq --rsh=ssh --delete    ${SOURCE}:\/var\/spool\/cron\/tabs           ${SYNCDIR}\nrsync -azq --rsh=ssh --delete    ${SOURCE}:\/root                          ${SYNCDIR}\n\n# Set appropriate umask.\numask 0077\n\n# Create a directory for the backups if it does not already exist.\nBACKUP_DIR='\/backup\/1blu\/dar\/Backup-'$(date +%b)\ntest -d $BACKUP_DIR || mkdir $BACKUP_DIR\n\n# Delete old backup directories.\nfind \/backup\/1blu\/dar -maxdepth 1 -daystart -mtime +62 -and -type d -name \"Backup-*\" -exec rm -rf {} \\;\n\n# Get the day of the month and determine whether full or incremental backups will be done. The first day will always result in a full backup.\nDAY=$(date +%d)\nif [ $DAY -eq 1 ]; then\n   # Do a full backup every beginning of a month.\n   dar -Q -y -D -R${SYNCDIR}GroupOffice -c${BACKUP_DIR}\/GroupOffice-full  -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R${SYNCDIR}etc         -c${BACKUP_DIR}\/etc-full          -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q       -R${SYNCDIR}tabs        -c${BACKUP_DIR}\/cron_tables-full  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R${SYNCDIR}root        -c${BACKUP_DIR}\/root_files-full   -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\".adobe\" -P\".strigi\" -P\".mozilla\" -P\".thumbnails\" -P\".tvbrowser\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R${SYNCDIR}srv         -c${BACKUP_DIR}\/srv_files-full    -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n\n   # Check the integrity of the backup files.\n   dar -Q -t${BACKUP_DIR}\/GroupOffice-full >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/etc-full         >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/cron_tables-full >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/root_files-full  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/srv_files-full   >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\nelse\n   # Do an incremental backup on all remaining days of the month.\n   dar -Q -y -D -R${SYNCDIR}GroupOffice -c${BACKUP_DIR}\/GroupOffice-${DAY} -A${BACKUP_DIR}\/GroupOffice-full  -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R${SYNCDIR}etc         -c${BACKUP_DIR}\/etc-${DAY}         -A${BACKUP_DIR}\/etc-full          -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q       -R${SYNCDIR}tabs        -c${BACKUP_DIR}\/cron_tables-${DAY} -A${BACKUP_DIR}\/cron_tables-full  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R${SYNCDIR}root        -c${BACKUP_DIR}\/root_files-${DAY}  -A${BACKUP_DIR}\/root_files-full   -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" -P\".adobe\" -P\".strigi\" -P\".mozilla\" -P\".thumbnails\" -P\".tvbrowser\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -y    -R${SYNCDIR}srv         -c${BACKUP_DIR}\/srv_files-${DAY}   -A${BACKUP_DIR}\/root_files-full   -Z\"*.zip\" -Z\"*.bz2\" -Z\"*.gz\" -Z\"*.tgz\" -Z\"*.jpg\" -Z\"*.png\" >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n\n   # Check the integrity of the backup files.\n   dar -Q -t${BACKUP_DIR}\/GroupOffice-${DAY} >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/etc-${DAY}         >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/cron_tables-${DAY} >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/root_files-${DAY}  >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\n   dar -Q -t${BACKUP_DIR}\/srv_files-${DAY}   >\/dev\/null; [ $? -eq 0 ] || echo 'In Zeile '$LINENO' ist ein Fehler aufgetreten!'\nfi\n\n# MySQL login information\nreadonly MYSQL_USERNAME='root'\nreadonly MYSQL_PASSWORD='geheimes_passwort'\n\n# Create a directory for the database backups if it does not already exist.\nMYSQL_BACKUP_DIR='\/backup\/1blu\/mysql\/Backup-KW'$(date +%U)\ntest -d $MYSQL_BACKUP_DIR || mkdir $MYSQL_BACKUP_DIR\nPGSQL_BACKUP_DIR='\/backup\/1blu\/pgsql'\n\n# Delete old backup directories.\nfind \/backup\/1blu\/mysql -maxdepth 1 -daystart -mtime +62 -and -type d -name \"Backup-KW*\" -exec rm -rf {} \\;\nfind \/backup\/1blu\/pgsql -maxdepth 1 -daystart -mtime +62 -and -type f -name \"Backup-KW*\" -exec rm {} \\;\n\n# Database backups will be done once per week, in the early morning of Sunday.\nWEEKDAY=$(date +%u)\nif [ $WEEKDAY -eq 7 ]; then\n   # Save MySQL databases\n   DATABASE_LIST=$(ssh ${SOURCE} \"mysql -e 'show databases' -u$MYSQL_USERNAME -p$MYSQL_PASSWORD\")\n   DATABASE_LIST=$(echo $DATABASE_LIST | cut -d \" \" -f2-)   for DATABASE in $DATABASE_LIST\n       do ssh ${SOURCE} \"mysqldump -BC --hex-blob -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} ${DATABASE} | gzip -n9\" > ${MYSQL_BACKUP_DIR}\/${DATABASE}.sql.gz\n   done\n\n   # Backup the Postgres Server\n   ssh ${SOURCE} \"su -l postgres -c 'pg_dumpall -c | gzip -n9'\" > $PGSQL_BACKUP_DIR\/postgres_KW$(date +%U).sql.gz\nfi<\/pre>\n\n\n\n<p>Dieses Skript ist \u00e4hnlich aufgebaut wie dasjenige im Abschnitt <a href=\"http:\/\/localhost\/mediawiki\/index.php\/Backup#Internes_Backup\">Backup#Internes_Backup<\/a>. Zu Beginn des Skripts werden die zu sichernden Verzeichnisse der entfernten Maschine mit dem <a href=\"http:\/\/de.wikipedia.org\/wiki\/Rsync\"><strong>rsync<\/strong><\/a>-Kommando in ein lokales &#8220;Schattenverzeichnis&#8221; (<strong>\/backup\/1blu\/sync\/<\/strong>) synchronisiert. Das Sichern mit <a href=\"http:\/\/de.wikipedia.org\/wiki\/Rsync\"><strong>rsync<\/strong><\/a> hat mehrere Vorteile:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/de.wikipedia.org\/wiki\/Rsync\"><strong>rsync<\/strong><\/a> funktioniert gut \u00fcber schwankende oder instabile Netzwerkverbindungen.<\/li><li>Es werden immer nur die ge\u00e4nderten Dateien \u00fcbermittelt.<\/li><li>Die \u00dcbermittlung erfolgt verschl\u00fcsselt mit <strong>ssh<\/strong>.<\/li><\/ul>\n\n\n\n<p> Man kann erkennen, dass sich der Benutzer <em>root<\/em> des Caipirinha-Servers offensichtlich ohne Passwort als Benutzer <em>root<\/em> auf der Maschine <a href=\"http:\/\/rueeck.name\">v37829.1blu.de<\/a> einloggen kann. Wie das funktioniert, ist beispielsweise in <a href=\"http:\/\/linuxproblem.org\/art_9.html\">[5]<\/a> und in <a href=\"http:\/\/sial.org\/howto\/openssh\/publickey-auth\/\">[6]<\/a> beschrieben. Danach werden die Unterverzeichnisse in <strong>\/backup\/1blu\/sync\/<\/strong> mit dem Kommando <strong>dar<\/strong> nach dem gleichen Prinzip gesichert wie im Abschnitt <a href=\"http:\/\/localhost\/mediawiki\/index.php\/Backup#Internes_Backup\">Backup#Internes_Backup<\/a> beschrieben. Danach folgen die Backups der Datenbanken <a href=\"http:\/\/localhost\/mediawiki\/index.php\/MySQL\">MySQL<\/a> und <a href=\"http:\/\/localhost\/mediawiki\/index.php?title=Postgres&amp;action=edit&amp;redlink=1\">Postgres<\/a>,  deren Prinzip ebenfalls bereits beschrieben wurde. Neu ist lediglich,  dass die entsprechenden Kommandos jetzt auf der entfernten Maschine <a href=\"http:\/\/rueeck.name\">v37829.1blu.de<\/a> ausgef\u00fchrt werden m\u00fcssen und deshalb in entsprechende <code><strong>ssh ${SOURCE} \"...\"<\/strong><\/code>-Sequenzen eingesetzt werden m\u00fcssen. <\/p>\n\n\n\n<p>Dieses Prinzip funktioniert nur dann, wenn man es sich leisten \nkann, ein lokales Schattenverzeichnis zu bevorraten. Ist der \nPlattenplatz knapp, so muss man die elegantere L\u00f6sung w\u00e4hlen, einen \nexternen Katalog des Voll-Backups durch <strong>dar<\/strong> erstellen zu lassen, \nan Hand dessen man dann gleich auf der entfernten Maschine ein \ndifferentielles Backup ansto\u00dfen kann, denn den Katalog kann man ja auf \nder entfernten Maschine bekannt machen. Diese M\u00f6glichkeit habe ich aber \nnoch nicht ausprobiert.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Synchronisation mit einer entfernten Maschine<\/h2>\n\n\n\n<p>Wie es der Teufel so will, stirbt der Server zu Hause in der Wohnung,\n w\u00e4hrend man gerade in Urlaub weilt oder aus sonstigen Gr\u00fcnden nicht \ngleich Hand an die betroffene Maschine anlegen kann. Dagegen hilft nur, \neinen zweiten oder gar dritten Server in Betrieb zu halten, auf den \nregelm\u00e4\u00dfig gesichert wird und auf dem die gleichen Applikationen \ninstalliert sind. Dann kann man selbst im Urlaub noch schnell auf die \nandere Maschine &#8220;umschalten&#8221;. Eine solche Synchronisation wird \nbeispielsweise zwischen den Maschinen <a href=\"http:\/\/caipirinha.homelinux.org\">caipirinha.homelinux.org<\/a>, <a href=\"http:\/\/caipiroska.homelinux.org\">caipiroska.homelinux.org<\/a> und <a href=\"http:\/\/rueeck.name\">rueeck.name<\/a> durchgef\u00fchrt, und zwar ebenfalls einmal pro Nacht. Das entsprechende Skript ist:\n<\/p>\n\n\n\n<p><strong>\/root\/bin\/server_sync.sh<\/strong>:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n# Dieses Skript dient der Synchronisation des schwarzen Caipirinha-Servers mit dem blauen Caipirinha-Server und mit dem 1blu-Server\n# Gabriel R\u00fceck, 10.08.2010\n\nreadonly BLU='v37829.1blu.de'\nreadonly CAIPIROSKA='caipiroska.homelinux.org'\nreadonly USER='Gabriel'\nreadonly RSYNC_PWD_FILE='\/root\/rsync_caipiroska.txt'\n\n# \u00d6ffentliche Verzeichnisse synchronisieren\nrsync -aq  --rsh=ssh --delete   \/home\/public\/Bilder                  ${CAIPIROSKA}:\/home\/public\/\nrsync -azq --rsh=ssh --delete   \/home\/public\/Dokumente               ${CAIPIROSKA}:\/home\/public\/\nrsync -azq --rsh=ssh --delete   ${BLU}:\/home\/public\/GroupOffice      \/home\/public\/\nrsync -azq --rsh=ssh --delete   ${BLU}:\/home\/public\/Mail             \/home\/public\/\nrsync -aq  --rsh=ssh --delete   \/home\/public\/Mail-Indizierung        ${CAIPIROSKA}:\/home\/public\/\nrsync -aq  --rsh=ssh --delete   \/home\/public\/Software                ${CAIPIROSKA}:\/home\/public\/\nrsync -aq  --rsh=ssh --delete   \/home\/public\/Unterhaltung            ${CAIPIROSKA}:\/home\/public\/\n\n# Webserver-Verzeichnisse synchronisieren\nrsync -azq --rsh=ssh --delete   ${BLU}:\/srv\/www\/htdocs\/coppermine    \/srv\/www\/htdocs\/\n#rsync -azv --rsh=ssh --delete   ${BLU}:\/srv\/www\/htdocs\/groupoffice   \/srv\/www\/htdocs\/\nrsync -azq --rsh=ssh --delete   ${BLU}:\/srv\/www\/htdocs\/mediawiki     \/srv\/www\/htdocs\/\n\n# Pers\u00f6nliche Verzeichnisse synchronisieren\nrsync -azv --rsh=ssh --delete --exclude=\"nohup.out\" --exclude=\".*\"   \/home\/gabriel\/       ${CAIPIROSKA}:\/home\/gabriel\/\nrsync -azv --rsh=ssh --delete --exclude=\"nohup.out\" --exclude=\".*\"   \/home\/joselia\/       ${CAIPIROSKA}:\/home\/joselia\/\n\n# tmp- und dav-Ordner synchronisieren\nunison caipiroska.prf\nunison 1blu.prf\n\n# Verzeichnisse \u00fcber den rsyncd auf caipiroska synchronisieren\nssh ${CAIPIROSKA} '\/etc\/init.d\/rsyncd start' >\/dev\/null\nrsync -aq  --delete --password-file=${RSYNC_PWD_FILE}     \/home\/public\/6502\/         ${USER}@${CAIPIROSKA}::6502\nrsync -aq  --delete --password-file=${RSYNC_PWD_FILE}     \/home\/public\/Audio\/        ${USER}@${CAIPIROSKA}::Audio\nrsync -azq --delete --password-file=${RSYNC_PWD_FILE}     \/home\/public\/B\u00fccher\/       ${USER}@${CAIPIROSKA}::B\u00fccher\nrsync -azq --delete --password-file=${RSYNC_PWD_FILE}     \/home\/public\/Datenbl\u00e4tter\/ ${USER}@${CAIPIROSKA}::Datenbl\u00e4tterrsync -aq  --delete --password-file=${RSYNC_PWD_FILE}     \/home\/public\/Linux\/        ${USER}@${CAIPIROSKA}::Linux\nrsync -aq  --delete --password-file=${RSYNC_PWD_FILE}     \/home\/public\/Spiele\/       ${USER}@${CAIPIROSKA}::Spiele\nssh ${CAIPIROSKA} '\/etc\/init.d\/rsyncd stop' >\/dev\/null<\/pre>\n\n\n\n<p>In diesem Skript werden Verzeichnisse zwischen den genannten drei Maschinen synchronisiert. Dabei kommen die Kommandos <a href=\"http:\/\/de.wikipedia.org\/wiki\/Rsync\"><strong>rsync<\/strong><\/a> f\u00fcr eine unidirektionale und <a href=\"http:\/\/de.wikipedia.org\/wiki\/Unison_(Programm)\"><strong>unison<\/strong><\/a> f\u00fcr eine bidirektionale Synchronisation zum Einsatz. Des Weiteren wird <a href=\"http:\/\/de.wikipedia.org\/wiki\/Rsync\"><strong>rsync<\/strong><\/a> in zwei Betriebsarten eingesetzt:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Remote Shell<\/strong>: In dieser Betriebsart (erster Block an rsync-Anweisungen) werden auf dem Quell- und auf dem Zielrechner je eine <a href=\"http:\/\/de.wikipedia.org\/wiki\/Rsync\"><strong>rsync<\/strong><\/a>-Instanz gestartet. Die Daten\u00fcbertragung erfolgt durch eine gesicherte Verbindung (<strong>ssh<\/strong>).\n Dieser Modus ist geeignet f\u00fcr Daten, die auch auf ihrem \u00dcbertragungsweg\n nicht abgefangen werden d\u00fcrfen, weil sie vertraulich sind.<\/li><li><strong>Rsync-D\u00e4mon<\/strong>: In dieser Betriebsart hat entweder der Quell- oder der Zielrechner einen rsync-Dienst (\u00fcblicherweise auf Port <strong>873<\/strong>)\n aktiv. Dieser Dienst beinhaltet eine Konfigurationsdatei, in der \nVerzeichnisse aufgef\u00fchrt sind. Mit diesen Verzeichnissen kann \nsynchronisiert werden. Die Anmeldung ist zwar verschl\u00fcsselt, der \nDatentransfer aber nicht mehr. Diese Art der Synchronisation eignet sich\n also nur f\u00fcr Daten, die auch mitgelesen werden k\u00f6nnen, weil sie keine \nvertraulichen Informationen enthalten. Der Vorteil ist, dass wegen der \nfehlenden Verschl\u00fcsselung weniger Maschinenlast erzeugt wird.<\/li><\/ul>\n\n\n\n<p> Die hier zum Einsatz kommende Konfigurationsdatei des rsync-Dienstes sieht so aus: <\/p>\n\n\n\n<p><strong>\/etc\/rsyncd.conf<\/strong>:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">log file = \/var\/log\/rsyncd.log\nlog format =\u00a0%h\u00a0%o\u00a0%f\u00a0%l\u00a0%b\nmax connections = 4\npid file = \/var\/run\/rsyncd.pid\nread only = false\nslp refresh = 300\ntimeout = 600\ntransfer logging = true\nuid = gabriel\nuse chroot = true\nuse slp = false\n\n[6502]\npath = \/home\/public\/6502\nauth users = Gabriel\nsecrets file = \/etc\/rsyncd.secrets\ngid = users\n\n[Audio]\npath = \/home\/public\/Audio\nauth users = Gabriel\nsecrets file = \/etc\/rsyncd.secrets\ngid = relationship\n\n[B\u00fccher]\npath = \/home\/public\/B\u00fccher\nauth users = Gabriel\nsecrets file = \/etc\/rsyncd.secrets\ngid = users\n\n[Datenbl\u00e4tter]\npath = \/home\/public\/Datenbl\u00e4tter\nauth users = Gabriel\nsecrets file = \/etc\/rsyncd.secrets\ngid = users\n\n[Linux]\npath = \/home\/public\/Linux\nauth users = Gabriel\nsecrets file = \/etc\/rsyncd.secrets\ngid = users\n\n[Spiele]\npath = \/home\/public\/Spiele\nauth users = Gabriel\nsecrets file = \/etc\/rsyncd.secrets\ngid = users<\/pre>\n\n\n\n<p>In der Datei <strong>\/etc\/rsyncd.secrets<\/strong> sind alle zul\u00e4ssigen Benutzer des <a href=\"http:\/\/de.wikipedia.org\/wiki\/Rsync\"><strong>rsync<\/strong><\/a>-Dienstes und deren Passwort im Klartext ausgef\u00fchrt. Deshalb darf diese Datei nur f\u00fcr <em>root<\/em> lesbar sein. Es muss auch klar sein, dass man eben deswegen <strong>auf keinen Fall<\/strong> das System-Passwort verwenden darf.\n<\/p>\n\n\n\n<p>Auch f\u00fcr <a href=\"http:\/\/de.wikipedia.org\/wiki\/Unison_(Programm)\"><strong>unison<\/strong><\/a> werden Konfigurationsdateien ben\u00f6tigt, n\u00e4mlich die beiden hier im Skript angegebenen Dateien <strong>\/root\/.unison\/caipiroska.prf<\/strong> und <strong>\/root\/.unison\/1blu.prf<\/strong>,\n welche die Verzeichnisse festlegen, die zwischen den beteiligten \nMaschinen bidirektional synchronisiert werden sollen. Sie sehen so aus:\n<\/p>\n\n\n\n<p><strong>\/root\/.unison\/caipiroska.prf<\/strong>:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Synchronisation zwischen CAIPIRINHA und CAIPIROSKA\n\nroot = ssh:\/\/caipiroska.homelinux.org\/\/home\/\nroot = \/home\/\n\nsshargs = -C -o ConnectTimeout=300\nfastcheck = yes\nmaxthreads = 1\nperms = -1\nbatch = true\nsilent = true\nowner = true\ngroup = true\nlogfile = \/var\/log\/unison\n\n# Prioirit\u00e4t festlegen\nprefer = \/home\/\n\n# Zu synchronisierende Pfade\npath = tmp\n\nignore = Path tmp\/Blue-Ray\/*<\/pre>\n\n\n\n<p><strong>\/root\/.unison\/1blu.prf<\/strong>:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Synchronisation zwischen CAIPIRINHA und 1BLU\n\nroot = ssh:\/\/rueeck.name\/\/home\/public\/\nroot = \/home\/public\/\n\nsshargs = -C -o ConnectTimeout=300\nfastcheck = yes\nmaxthreads = 1\nperms = -1\nbatch = true\nsilent = true\nowner = true\ngroup = true\nlogfile = \/var\/log\/unison\n\n# Prioirit\u00e4t festlegen\nprefer = ssh:\/\/rueeck.name\/\/home\/public\/\n\n# Zu synchronisierende Pfade\npath = Dropbox\n\nignore = Name .*<\/pre>\n\n\n\n<p>Durch das Sichern auf externe Maschinen verschafft man sich einen \nSchutz gegen Feuer-, Wasser-, Kriegssch\u00e4den und gegen einen m\u00f6glichen \nDiebstahl des Servers. Ein Saboteur, dem ein Einloggen als <em>root<\/em> \nauf einer der Maschinen gelingt, k\u00f6nnte wegen der automatischen \nSynchronisation aber weiterhin alle Daten sabotieren. Dagegen hilft \nwirklich nur ein Backup auf eine externe Festplatte, die nach dem Backup\n von der Maschine getrennt und sicher verwahrt wird. Eine solche externe\n Festplatte sollte nat\u00fcrlich (wie auch die Server-Platten) verschl\u00fcsselt\n sein, und idealerweise hat man mehrere davon, so dass man immer noch \nein Backup zur Verf\u00fcgung hat, wenn beim Sichern gerade der Blitz in den \nServer und die angeschlossene externe Festplatte schl\u00e4gt und alles \nfutsch ist.\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich denke, \u00fcber den Sinn von Backups muss hier nichts erz\u00e4hlt werden.<\/p>\n","protected":false},"author":1,"featured_media":73,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35],"tags":[56,58,57],"class_list":["post-72","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it","tag-backup","tag-dar","tag-tar"],"_links":{"self":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=72"}],"version-history":[{"count":1,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions"}],"predecessor-version":[{"id":74,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions\/74"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/media\/73"}],"wp:attachment":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}