{"id":104,"date":"2014-06-27T11:12:34","date_gmt":"2014-06-27T09:12:34","guid":{"rendered":"http:\/\/spookysworld.no-ip.biz\/wordpress\/?p=104"},"modified":"2022-02-09T00:24:12","modified_gmt":"2022-02-08T23:24:12","slug":"bareos-bacula-und-notebooks","status":"publish","type":"post","link":"https:\/\/mitschio.dynv6.net\/blog\/2014\/06\/27\/bareos-bacula-und-notebooks\/","title":{"rendered":"Bareos \/ Bacula und Notebooks"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"vorwort\"><b>Vorwort<\/b><\/h1>\n\n\n\n<p class=\"has-drop-cap\">Backups sind wichtig. Das wei\u00df mittlerweile jedes Kind. Daher setze ich hier zur Sicherung meiner Server schon seit l\u00e4ngerem Bacula und seit k\u00fcrzerem auf einem zweiten System Bareos, einen Bacula-Fork, ein. Man muss zwar anf\u00e4nglich etwas Hirnschmalz in die Konfiguration investieren, aber dann laufen beide Systeme ohne weiteres Eingreifen und machen genau das was sie sollen. Und das verdammt zuverl\u00e4ssig. F\u00fcr alle Maschinen die sich regelm\u00e4\u00dfig vom Backup-Server erreichen lassen ist diese L\u00f6sung somit optimal.<\/p>\n\n\n\n<p>Aber was macht man mit Ger\u00e4ten, welche sich nicht kontinuierlich im \u201eheimischen Netz\u201c befinden, sondern gerne auch mal auf Reisen und damit auch in anderen Netzen unterwegs sind, sprich Notebooks?<\/p>\n\n\n\n<p>Vor diesem Problem stand ich nun. Google f\u00f6rderte zwar den einen oder anderen L\u00f6sungsvorschlag zu Tage, aber keiner davon gefiel mir wirklich gut. Daher war wieder \u201eHirnschmalz investieren\u201c angesagt, und nun m\u00f6chte ich euch an meiner L\u00f6sung teilhaben lassen. Vielleicht gef\u00e4llt mein Ansatz ja dem einen oder anderen und erspart dann etwas Zeit und M\u00fche. Ich w\u00fcrde mich auf jeden Fall freuen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vorwissen\"><b>Vorwissen<\/b><\/h2>\n\n\n\n<p>Ich setze f\u00fcr den weiteren Text zumindest Grundwissen beim Einrichten und Betrieb von Bacula \/ &nbsp;Bareos voraus, schreibe also kein Einsteigertutorial. Die gibt es zur Gen\u00fcge und auch die Doku beider Systeme ist sehr ergiebig. Ich gehe davon aus, das Bareos bereits l\u00e4uft und auf dem Notebook ein File-Daemon installiert und passend zum Server konfiguriert ist. <br>Au\u00dferdem sollten Grundkenntnisse bei der Arbeit mit Linux und diversen Diensten (z.B. ssh, cron, &#8230;) vorhanden sein.<\/p>\n\n\n\n<p>Auch wenn ich im weiteren Verlauf von Bareos schreibe, gilt alles auch f\u00fcr Bacula.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"lastenheft\"><b>Lastenheft<\/b><\/h2>\n\n\n\n<p>Folgende Punkte sind mir wichtig:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Die Sicherung f\u00fcgt sich, m\u00f6glichst umfassend in das bestehende Sicherungskonzept ein<\/li><li>Die Sicherung erfolgt mit Bareos<\/li><li>Die Sicherung startet automatisch, sobald das Ger\u00e4t das \u201eheimische Netz\u201c betritt<\/li><li>Die Sicherung wird nur einmal t\u00e4glich gestartet, auch wenn das Ger\u00e4t mehrfach das Netz betritt.<\/li><li>Die Sicherung erfolgt mindestens einmal t\u00e4glich, ganz besonders wenn sich das Ger\u00e4t l\u00e4nger im heimischen Netz befindet.<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"die-umsetzung\"><b>Die Umsetzung<\/b><\/h1>\n\n\n\n<p>Grunds\u00e4tzlich wird das Sicherungsintervall ja durch den Bareos-Direktor gesteuert. In dessen Konfiguration wird hinterlegt was wann, wo und wie gesichert wird.<\/p>\n\n\n\n<p>Dieses Vorgehen ist f\u00fcr Server und auch fest installierte Desktop-Rechner spitze, st\u00f6\u00dft bei Notebooks jedoch auf Probleme, wenn diese zum Zeitpunkt der geplanten Sicherung gerade mal wieder unterwegs sind. Bareos wartet hier bei Abwesenheit des Ger\u00e4tes bis zum Timeout und protokolliert dann einen Fehler. Das sieht irgendwie unsch\u00f6n aus und sp\u00e4testens nach der 5 E-Mail vom Bareos-Direktor nervt das auch, und alles nur, weil der Kollege gerade mal wieder einige Tage auf Dienstreise ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"die-idee\"><b>Die Idee<\/b><\/h2>\n\n\n\n<p>Da es, wie gerade beschrieben, problematisch ist das Backup f\u00fcr Notebooks vom Direktor steuern zu lassen, besteht meine Idee jetzt darin, dem Direktor diese Aufgabe zu entziehen und dem Notebook selbst zu \u00fcbertragen.<\/p>\n\n\n\n<p>Dieses kann beim Auftreten bestimmter Ereignisse pr\u00fcfen ob der Bareos-Server erreichbar ist und im Erfolgsfall den Bareos-Direktor anweisen das Backup zu starten.<\/p>\n\n\n\n<p>Als Ereignisse zum Triggern der \u00dcberpr\u00fcfung und des Backupstarts fallen mir jetzt spontan der Aufbau der Netzwerkverbindung oder auch das Timing per Cronjob ein. So soll das nachfolgend auch umgesetzt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"arbeiten-am-bareos-server\"><b>Arbeiten am Bareos-Server<\/b><\/h2>\n\n\n\n<p>Fangen wir mit dem Server an. Wir entziehen dem Bareos-Direktor im ersten Schritt die Steuerung des Backup f\u00fcr das Notebook. Dazu tilgen wir den starren Zeitplan aus der Konfiguration indem wir im entsprechenden Schedule einfach alle \u201eRun-Direktiven\u201c entfernen bzw. auskommentieren. Sollte ein Schedule verwendet werden, welches auch f\u00fcr andere Backup-Jobs ben\u00f6tigt wird, erstellt man&nbsp;einfach ein neues ohne Run-Direktiven und passt die Konfiguration entsprechend an. Nach einem Neustart des Bareos-Direktors, bzw. reload in der bconsole gibt es dann auch keine Meldung mehr \u00fcber fehlgeschlagene Backupversuche bei abwesendem Notebook. Leider wird jetzt aber auch kein automatisches Backup mehr erzeugt. Also erstmal nur die halbe Miete.<\/p>\n\n\n\n<p>Da Bareos selbst keine direkte M\u00f6glichkeit bietet Jobs per Skript zu starten und\/oder zu stoppen, m\u00fcssen wir f\u00fcr das weiter Vorgehen die M\u00f6glichkeit nutzen, das Programm &#8222;bconsole&#8220; per Pipe zu steuern. Dazu habe ich mir ein kleines Bash-Skript \u201ebareos-remote.sh\u201c (Listing 1) geschrieben. Dieses Skript liegt hier im Verzeichnis \/etc\/bareos\/ und nimmt auf der Kommandozeile 2 Parameter entgegen. Einmal die gew\u00fcnschte Aktion (start oder stop) und dann den Namen des entsprechenden Jobs.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Listing 1: <a href=\"https:\/\/raw.githubusercontent.com\/mmo74\/backup-scripts\/main\/bareos-remote.sh\">&#8222;bareos-remote.sh&#8220;<\/a><br>(Das zum Download angebotene Shell-Skript ist ausf\u00fchrlicher kommentiert als das nachfolgende Skript, unterscheidet sich ansonsten aber nicht.)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n\n################################################################\n# this script pipes commands to bconsole to start\n# or cancel a bareos\/bacula job\n#\n# Copyright (C) 2014 Michael Oehme &lt;m.m.oehme@gmail.com&gt;\n#\n# This program is free software: you can redistribute it\n# and\/or modify it under the terms of the GNU General\n# Public License as published by the Free Software Foundation,\n# either version 3 of the License, or (at your option) any \n# later version.\n#\n#\n# This program is distributed in the hope that it will\n# be useful,\n# but WITHOUT ANY WARRANTY; without even the implied\n# warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the\n# GNU General Public License for more details.\n################################################################\n\nMYSELF=$0\nACTION=$1\nJOBTORUN=$2\n\n## Funktion f\u00fcr die Ausgabe der Synopsis (--help)\nfunction usage {\n echo \"Usage: $MYSELF start|stop Job\"\n echo \"\"\n echo \"start|stop Should the given Job be started or stoped?\"\n echo \"Job Which bareos Job should be processed?\"\n}\n\n## Funktion zum Start eine Bareos\/Bacula-Jobs\nfunction start_job {\n  echo \"Job wird gestartet.\"\n  \/usr\/sbin\/bconsole &lt;&lt;EOF\n  run job=$JOBTORUN yes\n  quit\n  EOF\n}\n\n## Funktion zum Abbruch eine Bareos\/Bacula-Jobs\nfunction stop_job {\n  echo \"Job wird abgebrochen!\"\n  \/usr\/sbin\/bconsole &lt;&lt;EOF\n  cancel job=$JOBTORUN\n  EOF\n}\n\n## Funktion zum \u00fcberpr\u00fcfen ob der angegebene Job ein g\u00fcltiger Bareos\/Bacula-Job ist\nfunction check_jobs {\n  AVAILJOBS=`echo -e \"@output \/dev\/null\\nmess\\n@output\\n.jobs\"|\/usr\/sbin\/bconsole `\n  AVAILJOBS=`echo $AVAILJOBS|sed 's\/.*\\.jobs \/\/'`\n  for Job in $(echo $AVAILJOBS); do\n    [ \"$Job\" = \"$JOBTORUN\" ] &amp;&amp; return\n  done\n  echo \"Kein g\u00fcltiger Job angegeben.\"\n  exit 1\n}\n\n## JETZT GEHTS LOHOS, ...\ncase $ACTION in\nstart)\n&nbsp; check_jobs\n&nbsp; start_job\n&nbsp; exit 0\n  ;;\n\nstop)\n&nbsp; check_jobs\n&nbsp; stop_job\n&nbsp; exit 0\n&nbsp; ;;\n\n*)\n  usage\n\nesac\n\nexit 1<\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Einem ersten Testlauf des Skripts steht jetzt nicht mehr im Weg. Somit sollte ein beherzter Aufruf von &#8222;\/etc\/bareos\/bareos-remote.sh start Job-BU-MMOs-Notebook&#8220; die Sicherung des Notebooks anschubsen. Hier muss nat\u00fcrlich der Name des Jobs an die lokalen Gegebenheiten angepasst werden. Wenn alles klar gegangen ist, l\u00e4uft jetzt die Sicherung wie gew\u00fcnscht an, vorausgesetzt nat\u00fcrlich das Notebook ist nicht doch irgendwo auf Reisen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"arbeiten-am-bareos-client-notebook\"><b>Arbeiten am Bareos-Client (Notebook)<\/b><\/h2>\n\n\n\n<p>Wenn im vorangegangenen Abschnitt alles klar gegangen ist, wird es jetzt Zeit, auf das Notebook zu wechseln und dort die weiteren Arbeiten vorzunehmen.<\/p>\n\n\n\n<p>Geplant ist es zuk\u00fcnftig das Skript \u201cbareos-remote.sh\u201d, dieses liegt ja auf dem Server, per SSH zu starten. Damit dies auch vollautomatisch ohne l\u00e4stige Passworteingabe funktioniert, muss SSH so eigerichtet werden, das sich root vom Notebook auf dem Bareos-Server als Benutzer bareos mittels Key anmelden kann.<\/p>\n\n\n\n<p>Sobald SSH entsprechend vorbereitet ist gilt es zu testen, ob der Skriptaufruf richtig funktioniert. Also beherzt in die Tasten gegriffen und als root auf dem Notebook folgendes abgesetzt: ssh -c bareos@bareosserver \u201c\/etc\/bareos\/bareos-remote.sh start Job-BU-MMOs-Notebook\u201d.<\/p>\n\n\n\n<p>Wenn wieder alles klar gegangen ist, dann sollte Bareos auch jetzt das Backup starten und zwar ohne, dass nach dem Absetzen des Kommandos eine Eingabe vom Benutzer erwartet wird.<\/p>\n\n\n\n<p>Soweit so gut. Jetzt gilt es den Skriptaufruf zu triggern. Au\u00dferdem soll vor dem eigentlichen Aufruf gepr\u00fcft werden, ob der Bareos-Server \u00fcberhaupt erreichbar und der letzte Backupstart nicht bereits am Tag des Aufrufs erfolgt ist.<\/p>\n\n\n\n<p>Um das ganze zu Vereinfachen habe ich auch daf\u00fcr ein kleines Bash-Skript geschrieben. Dieses Skript pr\u00fcft erstens ob der Bareos-Server erreichbar ist und zweitens ob am Tag des Aufrufs noch kein Backup gelaufen ist. Wenn beide Bedingungen erf\u00fcllt sind, wird das Skript \u201cbareos-remote.sh\u201d auf dem Bareos-Server gestartet und damit das Backup.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Listing 2: <a href=\"https:\/\/raw.githubusercontent.com\/mmo74\/backup-scripts\/main\/call-bareos.sh\">call-bareos.sh<\/a><br>(Das zum Download angebotene Shell-Skript ist ausf\u00fchrlich kommentiert, anders als das nachfolgende Listing.)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n##################################################################\n# this script calls another script per ssh to start a bacula-job.\n#\n# Copyright (C) 2014 Michael Oehme &lt;m.m.oehme@gmail.com&gt;\n#\n# This program is free software: you can redistribute it\n# and\/or modify it under the terms of the GNU General Public \n# License as published by the Free Software Foundation, \n# either version 3 of the License, or (at your option) any\n# later version.\n#\n# This program is distributed in the hope that it will be\n# useful, but WITHOUT ANY WARRANTY; without even the implied\n# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n# PURPOSE. See the GNU General Public License for more details.\n#\n##################################################################\n\nBAREOSSERVER=\"StaBi-ZB508-01L\"\nBAREOSREMOTESCRIPT=\"\/etc\/bareos\/bareos-remote.sh\"\nBAREOSJOB=\"Job-BU-MMOs-Notebook\"\nLASTRUNFILE=\"\/var\/lib\/bacula\/lastrun\"\n\n\n## IST der Server erreichbar? -&gt; Wenn nicht, dann ENDE\nif ! \/bin\/ping -c 1 $BAREOSSERVER &gt; \/dev\/null\nthen\n\/usr\/bin\/logger info \"BAREOS: Der Server ist nicht erreichbar.\"\nexit 0\nfi\n\n## Liegt das letze Backup l\u00e4nger als einen Tag zur\u00fcck? Wenn nicht, dann ENDE\nif [ $(find $LASTRUNFILE -mtime -1|wc -l) -gt 0 ];\nthen\n\/usr\/bin\/logger info \"BAREOS: Backup heute bereits gelaufen.\"\nexit 0\nfi\n\n##################################################################\n# Da wir bis hierher gekommen sind, sollte das Backup nun auch gestartet werden.\nif ssh $BAREOSSERVER -C \"$BAREOSREMOTESCRIPT start $BAREOSJOB\"\nthen\n\/usr\/bin\/logger info \"BAREOS: Backup wurde in die Warteschlange aufgenommen.\"\ntouch -t `date +%m%d0000` $LASTRUNFILE\nexit 0\nfi\n\n## Wenn wir hier landen, dann ist irgendwas schief gegangen.\n\/usr\/bin\/logger info \"BAREOS: Backup konnte nicht in die Warteschlange aufgenommen werden.\"\nexit 1\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Dieses Skript wird ohne Parameter aufgerufen. Dies ist wichtig, da bei einem der geplanten, automatischen Aufrufe keine Parameter\u00fcbergabe m\u00f6glich ist. &nbsp;&nbsp;Um aber trotzdem einigerma\u00dfen flexibel zu bleiben, wurden am Anfang des Skripts einige Variablen definiert. Diese sollten vor dem Einsatz an die lokalen Gegebenheiten angepasst werden. ich habe versucht einigerma\u00dfen sprechenden Namen zu verwenden.<\/p>\n\n\n\n<p>Wenn ihr wollt, k\u00f6nnt ihr jetzt auch dieses Skript einmal zur Probe laufen lassen. Ist alles richtig eingestellt, sollte zum dritten Mal ein Backup starten.<\/p>\n\n\n\n<p>Nun gilt es tats\u00e4chlich die Trigger zu schalten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"netzwerk\"><b>Netzwerk<\/b><\/h3>\n\n\n\n<p>Wir haben oben geschrieben, das dass Backup automatisch starten soll, sobald das Notebook das heimische Netz betritt. Dazu bietet sich der Start von bareos.sh \u00fcber das Verzeichnis \u201c\/etc\/network\/if-up.d\u201d an.<\/p>\n\n\n\n<p>Ich habe dazu im genannten Verzeichniss einen Link zum eigentlichen Skript hinterlegt. Sobald dann ein Netzwerkinterface aktiviert wird, werden die Skripte in diesem Verzeichnis der Reihe nach aufgerufen und abgearbeitet.<\/p>\n\n\n\n<p>Hinweis: Auf meinem Ubuntu Notebook werden die Skripte per run-parts gestartet. Dies f\u00fchrt dazu, das alles was einen \u201c.\u201d im Dateinamen hat nicht gestartet wird. Daher hei\u00dft der Link bei mir einfach nur bareos, ohne \u201c.sh\u201d. Nach meinem Kenntissstand betrifft dieses Problem nahezu alle Distributionen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cron\"><b>Cron<\/b><\/h3>\n\n\n\n<p>Eine weitere Bedingung war, dass das Backup auch dann mindestens einmal am Tag starten soll wenn es doch mal l\u00e4nger im heimischen Netz verweilt. Der Aufruf \u00fcber \u201cif-up.d\u201d hilft uns hier nicht weiter, da dieser nur beim Aufbau der Netzwerkverbindung aktiv wird.<\/p>\n\n\n\n<p>Allerdings schreit diese weitere Bedingung f\u00f6rmlich nach einem cron-Job.<\/p>\n\n\n\n<p>Also noch schnell einen Link nach \u201c\/etc\/cron.daily\/\u201d angelegt und schon haben wir alle gew\u00fcnschten Punkte abgefr\u00fchst\u00fcckt.<\/p>\n\n\n\n<p>Beim Aufruf per Cron w\u00e4re auch noch die Alternative \u00fcber die Crontab denkbar &#8211; hier k\u00f6nnt man dann sogar noch Parameter an das Skript weitergeben &#8211; aber ein einfacher Link ist sicherlich schneller eingerichtet. Am Ende ist es aber egal.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"zusammenfassung\"><b>Zusammenfassung<\/b><\/h1>\n\n\n\n<p>Nachfolgend noch einmal stichpunktartig eine Zusammenfassung der notwendigen Schritte:<\/p>\n\n\n\n<p><b>auf dem Server<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Skript \u201cbareos-remote.sh\u201d (Listing 1) erstellen<\/li><li>in der Bareosr-Konfiguration im Schedule alle Run-Direktiven deaktivieren<\/li><\/ul>\n\n\n\n<p><b>auf dem Client<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>SSH-Key-Authentifizierung einrichten (Notebook-root muss als Nutzer bareos auf den Server zugreifen)<\/li><li>Skript \u201ccall-bareos.sh\u201d erstellen und anpassen<\/li><li>Skript \u201ccall-bareos.sh\u201d nach \u201c\/etc\/network\/if-up.d\/bareos\u201d verlinken<\/li><li>Skript \u201ccall-bareos.sh\u201d nach \u201c\/etc\/cron.daily\/if-up.d\/bareos\u201d verlinken<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Vorwort Backups sind wichtig. Das wei\u00df mittlerweile jedes Kind. Daher setze ich hier zur Sicherung meiner Server schon seit l\u00e4ngerem Bacula und seit k\u00fcrzerem auf einem zweiten System Bareos, einen Bacula-Fork, ein. Man muss zwar anf\u00e4nglich etwas Hirnschmalz in die Konfiguration investieren, aber dann laufen beide Systeme ohne weiteres Eingreifen und machen genau das was [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[11,12,13,15],"class_list":["post-104","post","type-post","status-publish","format-standard","hentry","category-bits-und-bytes","tag-backup","tag-bacula","tag-bareos","tag-linux"],"_links":{"self":[{"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/posts\/104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/comments?post=104"}],"version-history":[{"count":5,"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/posts\/104\/revisions"}],"predecessor-version":[{"id":761,"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/posts\/104\/revisions\/761"}],"wp:attachment":[{"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/media?parent=104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/categories?post=104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mitschio.dynv6.net\/blog\/wp-json\/wp\/v2\/tags?post=104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}