Einführung: Schnittstelle Kommandozeile Teil 4

von Peter Kelly (critter)

Prozesse

Wenn Sie eine ausführbare Datei starten, entweder durch das anklicken des Symbols oder durch die Eingabe des Namens in der Konsole/Terminal, so kennt man das unter Linux als Prozess. Dies kann wiederum andere Prozesse starten, oder eine Reihe von Prozessen. Andere Prozesse werden während der Systemstart-Sequenz oder automatisch durch das System gestartet.

Ein Prozess wirkt auf Dateien und Daten, die wiederum Dateien beinhalten. Linux ist ein Multi-Tasking und Multi-User-Betriebssystem. Auf diesem System können Sie sich und auch andere Benutzer anmelden und eine Vielfalt von Anwendungen in einer eigenen Sitzung nutzen, die sogenannten Prozesse starten. Natürlich hat Linux auch ein Verfahren zur Kontrolle und einen Überblick über alle Prozesse.

Jeder Prozess erhält eine eindeutige Identität, wenn er gestartet wird. Der Prozess bekommt eine ID-Nummer, oder PID, zugeordnet und hat einen festen Platz im Speicher. In diesem bestimmten System-Ressourcen kann sich der Prozess austoben ohne andere Prozesse zu stören. Beim Booten des Systems, ist der erste Prozess der gestartet wird, immer init, und dieser erhält die PID-Nummer 1. Um eine grafische Darstellung der Prozesse, die gegenwärtig auf Ihrem System aktiv sind zu erhalten tippen wir in die Konsole/Terminal folgenden Befehl:

pstree -p

Die Option -p zeigt die PIDs.

Der erste Prozess der von einer Anwendung gestartet wird nennt man parent(Eltern Prozess), und alle weitere Prozesse, die von diesem Prozess hervorgebracht werden, werden als child processes (Kind Prozesse bezeichnet. Moderne Systeme verwenden Threads, oder Light Weight Processes (LWP) wo praktisch die Ressourcen der Eltern- und Kind Prozesse geteilt werden. Die Kommunikation zwischen dem System und den Prozessen wird durch Signale geführt und das ganze Verfahren wird von dem Steuerprogramm aufgezeichnet.

In der Regel geschieht dies alles unter der Haube, und wir brauchen uns nicht daran zu stören. Jedoch kann gelegentlich mal etwas schief laufen und das System startet schwerfällig, das ein Eingreifen des Benutzers erforderlich macht. Hierbei werden die Kenntnisse mit der Kommandozeile eine große Rolle spielen.

pic1

Öffnen Sie eine Konsole/Terminal und geben ein:

glxgears > /dev/null &

Dies ist eine relativ Ressourcen intensive Anwendung (in der Regel wird dies für Systemvergleiche angewandt), wir benötigen aber die Ausgabe nicht und schicken sie ins nirgendwo (/dev/null). Das & Zeichen führt diesen Prozess im Hintergrund aus, so dass wir die Kontrolle über unsere Konsole/Terminal zurück erhalten. Später befassen wir uns mit Hintergrund-Aufgaben.

Geben Sie nun ein:

top

pic2

Da kommen eine Menge an Informationen zum Vorschein. Doch keine Angst wir brauchen nicht alle. Schauen Sie unter Command nach der Anwendung glxgears  (die letzte Spalte im Bild). Die erste Spalte trägt die Beschreibung PID und die glxgears Anwendung hat den Wert 8534 bekommen, das ist für uns wichtig.

Angenommen diese Anwendung läuft und lässt sich nicht mehr beenden. Tippen Sie k in der Anwendung top ein und Sie bekommen angezeigt "PID to kill:". Geben Sie den Wert 8534 ein. Sofort wird diese Zeile angezeigt Kill PID 8534 with signal [15]:

Geben Sie nun n ein, so wird der Befehl nicht ausgeführt. Bei der Eingabe von y sendet die Anwendung als Vorgabe das Signal 15. Signal 15 wird als SIGTERM erkannt und ist das normale Signal zum beenden der jeweiligen Anwendung. Nach Erhalt dieses Signals wird die Anwendung geschlossen und angewiesen alle Ressourcen des Systems wieder frei zu geben. Gelegentlich trifft man auf einen Unruhestifter  der einfach nicht beenden möchte. Dann können Sie das stärkste Signal aller Signale senden, Signal 9 bekannt als SIGKILL. Dies ist wie eine Kugel in den Kopf. Es funktioniert ohne Zweifel, kann aber, bei längerem Sitzungsverlauf mehr Ärger machen und sollte wenn möglich vermieden werden.

Es stehen eine Vielzahl von Signalen bereit, aber das sind die beiden einzigen, die Sie wahrscheinlich jemals manuell in einer Konsole/Terminal verwenden müssen. Top ist ein sehr umfangreiches Programm, das einzelne Buchstaben-Befehle verwendet. h bringt die Hilfedatei zum Vorschein, A für die alternative Anzeige in Feldgruppen, z wechselt die Farbe der aktuellen Gruppe und W speichert Ihre Einstellungen. Um mehr zu diesem Programm zu erfahren, rufen Sie die Hilfedatei auf. Denken Sie daran, dass Linux zwischen Groß-und Kleinschreibung unterscheidet und die Befehle  unterschiedliche Ergebnisse hervorrufen.

pic3

Ein weiteres Werkzeug zum bearbeiten von Prozessen ist ps (process status). Um eine Liste von den Prozessen nach Usern gelistet zu erhalten, nutzen Sie den Befehl ps ux (dieser Befehl ist für den normalen Benutzer gedacht, um ihn als root aus zu führen verwenden Sie den su Befehl dazu).

Beachten Sie, dass der senkrechte Bindestrich in der Regel erforderlich ist, um Optionen für ein weiteren Befehl anzugeben, um den eigentlichen Befehl zu erweitern.

Auch wenn Sie denken, dass Sie nichts tun, erhalten Sie eine ziemlich lange Liste. Scrollen Sie bis an die Spitze der Liste und Sie erhalten in der Kopfzeile die Beschreibung der verschiedenen Spalten. Die zweite Spalte ist die PID, und die letzte Spalte ist der Befehl, der benutzt wird, um den Vorgang zu starten. Wenn, wie im Beispiel schon angegeben, den Pid Wert des glxgears suchen würden dann mit diesen Befehl

ps ux | grep glxgears

pic4

Wir erhalten zwei Ergebnisse. Das erste ist das wo nach wir suchen der PID Wert 11730. Das zweite ist vom grep-Befehl und wird als Filter Ausgabe angezeigt. Warum aber grep ---color? Woher kommt das denn? PCLinuxOS bietet ein Alias für den Befehl grep, so dass die Treffer farblich hervorgehoben werden (oder, wenn Sie in Großbritannien leben, werden diese in voller Farbenpracht angezeigt). Gib den Befehl alias | grep grep in die Konsole/Terminal ein um es zu sehen.

pic5

Der Befehl grep hat außerdem die Header-Zeile gefiltert, so dass wir "glxgears" nicht zu ordnen könnten.

Um den laufenden Prozess loswerden, verwenden wir den kill Befehl:

kill 11730

Wir könnten ein Signal einfügen, kill -s 9 11730, jedoch denke ich das die Vorgabe, das nicht festgelegte Signal 15 völlig ausreichend ist.

Ein Signal kann nach Name oder Nummer gesendet werden. Um eine komplette Liste des Signal-Namen und der Typennummern anzuzeigen, geben Sie folgenden Befehl ein:

kill -l

Sie können nur Ihre eigenen Prozesse beenden, deshalb seien Sie besonders vorsichtig bei der Ausführung des Befehls mit Root-Rechten.

Bei der Arbeit in einer GUI, starten Sie eine weitere Anwendung durch das anklicken auf das entsprechende Symbol und es wird ein neues Fenster geöffnet. Für die Arbeit mit der Kommandozeile, können Sie einen weiteren Terminal-Emulator öffnen. Aber was, wenn Sie auf einem einzigen Terminal angemeldet sind oder was machen Sie, wenn das System abgestürzt ist? Gelegentlich starten Sie einen Prozess, der viel Zeit in Anspruch nehmen kann und Sie dabei wollen Sie einen anderen Befehl zum ausführen eingeben.

Ein Weg, um die Konsole/Terminal frei zu geben ist das kaufmännische (&), Zeichen, wie wir es bei der glxgears Anwendung angegeben haben. Damit läuft der Prozess im Hintergrund und die Steuerung für die Kommandozeile für den Benutzer ist frei gegeben. Wenn der Prozess bereits ausgeführt wird, kann er folgender weise in den Hintergrund versetzt werden, verwenden Sie den Befehl control + z, was den laufenden Prozess in den Vordergrund holt, und dann verwenden Sie den Befehl bg was bewirkt, dass der Prozess wieder im Hintergrund fortgesetzt wird.

Um Prozesse in der laufende Konsole/Terminal anzuzeigen, verwenden Sie folgenden Befehl jobs.

pic6

Jeder laufende Job bekommt in der Shell ist eine Nummer zugeordnet, die in einer eckigen Klammern angezeigt wird, zusammen mit der PID. Hier hat Job 1 PID 8319. Der Befehl jobs zeigt die Job-Nummer, deren Status (läuft, gestoppt oder beendet), und den Befehl der diesen Prozess eingeleitet hat. Um einen Job zu beenden, verwenden wir den Befehl kill, wie im folgenden:

kill %N && fg wobei N die Job-Nummer ist.

Der && Teil wird verwendet, um der Shell mitzuteilen, das der Befehl kill abzuwarten ist, und wenn dies geschehen  ist, die Kommandozeile wieder frei zu geben. Wenn wir das so nicht machen, wird zwar der Job beendet, jedoch nicht von der Job-Liste entfernt. Aufräumen ist nicht verkehrt.

Ich weiß, das klingt alles ziemlich kompliziert, doch noch einmal zusammengefasst:

  • Command &: startet einen Prozess 'job' im Hintergrund
  • Control + z: verschiebt den aktuell laufenden Hntergrundprozess
  • bg N:  lässt den zuvor gestoppten Prozess N im Hintergrund weiterlaufen
  • fg N: holt den angehaltenen Prozess N in den Vordergrund
  • jobs: Listet alle Hintergrundprozesse 'jobs' der aktiven Shell auf
  • kill %N && fg: beendet den Prozess N

Beim 'glxgears' Beispiel, verbannten wir die erzeugte Ausgabe nach /dev/null. Ein laufender Hintergrund Prozess produziert auch sogenannte Ausgaben, dieses ist für Verwendung weiterer Befehle wichtig. So ist es eine gute Idee diese Ausgaben in Log-Dateien bzw. Fehlerberichten zu speichern.

e.g., find /usr -iname *.ogg > musicfiles 2>/dev/null &

Die gefundenen Namen der Dateien werden in der Datei "musivfiles" abgelegt, dabei wird der Dateiname und Speicherort angegeben. Fehlermeldungen, wie zum Beispiel kein Zugriff auf Verzeichnisse werden ignoriert. Wollen Sie keine Ausgaben der Anwendung, dann nutzen Sie dieses spezielles Konstrukt, das alles packt und nach /dev/null schickt.

command 2>&1 /dev/null

Gemeint ist STDERR nach STDOUT, anzuhängen und beide werden an den gleichen Ort gesendet Machen Sie sich keine Sorgen darüber, wenn Ihnen dies nicht sehr intuitiv erscheint. Es ist ein sehr häufig verwendeter Ausdruck, aber Sie wäre erstaunt darüber, wie viele erfahrene Benutzer es verwenden und nicht verstehen!

Sichern und Archivieren

Das Problem beim Datensichern ist, das viele es nicht tun. Einige halten es für nicht nötig, andere vergessen es und andere finden das zu umständlich ist. Oder machen es nicht regelmäßig. Selbst jene, die regelmäßig ihre Daten sichern, jedoch nicht kontrollieren, ob diese wiederhergestellt werden können. Wenn Sie zu der geringen Minderheit gehören, die in keine der Kategorien passt, dann können Sie den nächsten Teil überspringen.

Für den Rest von uns sei gesagt, es gibt gute Neuigkeiten. Es gibt genügend Software die all unsere Sicherungen macht, ohne diese zu vergessen und auch gleichzeitig prüft, ob diese auch wieder hergestellt werden kann. Das beste daran ist, diese Software ist freie Software und steht jedem zu Verfügung. Der Name ist Linux.

Bevor wir sichern, sollten wir uns überlegen, was wir sichern wollen, wie oft und wohin. Es gibt verschiedene Arten der Sicherung.

  • Full — Wie der Name schon sagt
  • Differential — sichert nur was seit dem letzten gesamten Backup geändert wurde
  • Incremental — sichert nur was seit dem letzten Backup (egal welcher Art) geändert wurde
  • Clone — wird in der Regel zur Sicherung des gesamten Dateisystems verwendet und kopiert alles gedankenlos Block für Block
  • Synchronized — macht eine exakte Kopie aller Daten von einem Ort, gegebenenfalls löscht es Daten im vorgegebenen Zielverzeichnis, die nicht mehr Bestandteil des Quellverzeichnisses sind.

Bei jeder Anwendung gibt es Vor- und Nachteile und es gibt genügend Möglichkeiten Ihre Sicherungen so auszuführen, wie Sie es benötigen.
Das Linux/Unix-System erlaubt es, mehrere kleine Anwendungen zu nutzen um komplexe Aufgaben zu erfüllen und dabei ein automatisiertes Backup-System zu erstellen. Zunächst einmal einen Blick auf einige Anwendungen, die zur Verfügung stehen. Alle folgenden sind entweder Standard gemäß installiert oder können aus den PCLinuxOS Repositories installiert werden.

cp: Ja, der einfache Kopierbefehl, wenn er in Verbindung mit der Option -a (Archiv) verwendet wird, ist ein einfaches, (jedoch nicht Effizientes) Sicherungsprogramm.

tar: Eins der ältesten Werkzeuge, der Name bedeutet 'tabe archiv' und es nimmt einfach eine Liste von Dateien und verbindet diese. Aus diesem Grund wird die daraus resultierende Datei oft als "Tarball" bezeichnet. Es wird oft in Verbindung mit einem Packprogramm wie gzip oder bzip2 verwendet, und erkennt diese automatisch. Um ein komprimiertes Archiv mit allen Dateien im aktuellen Verzeichnis zu erstellen (hier nehme ich mal an, dass sich Jane im Verzeichnis Bilder befindet) und es in einen Ordner in Janes Homeverzeichnis mit dem Namen junk zu schreiben, verwenden wir den Befehl

tar -czf ~/junk/mypics.tar.gz *

  • -c  erstellt ein Archiv
  • -z  gibt an, das es mit gzip komprimiert werden soll
  • -f  verwendet den folgenden Dateinamen für das Archiv

Obwohl unter Linux nicht die Dateiname Erweiterungen angegeben werden müssen wie unter DOS z.B. Exe oder. Zip, um den Dateityp zu bestimmen (diese Angaben sind in den Meta-Daten, der Dateien enthalten), so wird es doch durch das tar-Kommando erstellt, dies ist hilfreich und wird üblicherweise auch so gemacht. Wenn ich jetzt -z ersetze durch -j, dann wird das tar bzip2-Dienstprogramm verwendet. Dann wird in der Regel die Erweiterung Tar.bz verwendet.

Um die Dateien in dem Archiv aufzulisten verwenden Sie:

tar -tvf mypics.tar.gz

Zum extrahieren bzw. auspacken der Dateien, benutzen Sie folgendes:

tar -xf mypics.tar.gz {list of file names}

Wird kein Dateiname angegeben, so werden alle Dateien entpackt. Tar ist wirklich nur für das Sichern einer kleinen Anzahl von Dateien geeignet. Für größere oder vollständige Sicherungen gibt es bessere Werkzeuge. Bei der Verwendung von Komprimierungswerkzeugen sollte bewusst sein, dass sie nicht sehr fehlertolerant sind und der Verlust von nur einem Byte kann das gesamte Archiv unlesbar machen. Dies ist eine sehr reelle Gefahr bei der Verwendung von Medien wie Disketten oder CDs.

pic7

dd gehört zu der Klon Kategorie und ist ein sehr brauchbares Kommando, wenn man weiß wie.

Es gibt eine Menge Optionen für diesen Befehl, jedoch brauchen sie meistens nur diese vier:

  • if={Name der Quelldatei}
  • of={Name der Zeildatei}
  • bs=(Block Größe}
  • count={Anzahl der Blöcke zum übertragen}

Beachten Sie, dass die = Zeichen in den Optionen unbedingt notwendig sind. Wichtig bei der Verwendung von dd ist sorgfältiges arbeiten um die Eingabedatei und die Ausgabedatei nicht zu verwechseln, da Sie von dd keine Aufforderungen erhalten, sondern nur blinden Gehorsam. Also, wenn Sie eine Partition auf eine leere Partition kopieren wollen, diese aber verwechseln, dann wird die leere Partition ohne Nachfrage die volle Partition überschreiben.

Um eine einzelne Datei zu kopieren:

dd if=/home/jane/contacts2 of=/home/jane/junk/contacts

pic8

Um eine ganze Partition zu kopieren (stellen Sie sicher, dass der Zielort groß genug ist):

dd if=/dev/hda1 of=/dev/hdf1 to do a partition to partition copy

oder

dd if=/dev/hda1 of=/backup/hda1.img wird eine Image-Datei von der Partition erstellen.

Auf die folgende Weise können ganze Dateisysteme geklont und wieder hergestellt werden:

dd if=/backup/hda1.img of=/dev/hda1

/dev/hda1 sollte nicht eingebunden und auch nicht Teil eines laufendem System sein. Wenn Sie ein 1 TB-Festplatte haben, dann bereiten Sie sich auf eine lange Wartezeit vor.

Die ersten 512 bytes einer Festplatte beinhaltet den MBR oder Master Boot Record und die Partition Tabelle. Ist dieser Beschädigt kann das System nicht mehr gestartet werden. Da das System nicht weiß, wo was ist. Dies kann aber einfach gelöst werden, wenn Sie eine Sicherung des MBR machen. Hierzu ist dd ideal, um den MBR zu sichern, geben Sie mit rootrechten folgendes ein:

dd if=/dev/hda of=/backup/hda_mbr.img bs=512  count=1

pic9

Dies bedeutet, kopiere den ersten Block der 512 bytes von /dev/hda zu der Image-Datei /backup/hda_mbr.img. (Hinweis: Es wird keine Partition-Nummer eingegeben, da sich der MBR auf das gesamte Laufwerk bezieht, und nicht auf eine bestimmte Partition).

Wenn nun ein Problem auftritt, können Sie einfach die 512 bytes wiederherstellen. Um den MBR wiederherzustellen sollte auf dem Laufwerk das Betriebssystem nicht ausgeführt werden.

  • Starten Sie von einer LiveCD.
  • In der Konsole geben Sie su ein um rootrechte zu erhalten.
  • Erstellen Sie ein Verzeichnis z.B.: mkdir /mnt/hda,
  • Binden Sie das Laufwerk dort ein, mount /dev/hda /mnt/hda
  • Stellen Sie sicher, dass die Image-Datei sich dort befindet, wo Sie sie vermuten z.B.: /backup/hda_mbr.img, da von der LiveCD das Verzeichnis nicht Sichtbar ist.
  • dd if=/backup/hda_mbr.img of=/mnt/hda bs=512 count=1
pic10

Stopp und lesen Sie diesen Befehl ruhig zwei-dreimal durch, bevor Sie Enter drücken.

Sie sollten nun in der Lage sein, das originale System zu starten.

Um den MBR anzuschauen, (es gibt nicht viel zu sehen) geben Sie ein:

cat /backup/hda_mbr.img

Sie werden eine Menge an Kauderwelsch auf dem Terminal zu sehen bekommen. Wenn das der Fall ist keine Panik. Geben Sie einfach ein:

reset

ein und alles wird gut.

Mondo Archive ist ein ausgezeichnetes und zuverlässiges Werkzeug für eine vollständige Sicherung über die Kommandozeile, und umfasst eine grafische Schnittstelle in der Konsole. Eine aufschlussreiche Schritt-für-Schritt-Anleitung aus dem PCLinuxOS Forum von catlord17 gibt es unter (http://www.pclinuxos.com/forum/index.php/topic,59705.0.html).

Rsync ist einer meiner ständigen Favoriten. Es dient zum Synchronisieren von zwei Datensätzen, entweder lokal oder auf entfernten Rechnern, auch wenn diese Tausende von Kilometern voneinander entfernt sind. Es bietet Optionen für die Komprimierung. Dateien können aus dem Zielverzeichnis gelöscht werden, sofern diese auch nicht mehr in der Quelle vorhanden sind. Außerdem kann es über SSH (Secure Shell) verwendet werden. Das Beste ist das es nur die Unterschiede zwischen den Dateien zwischen Quell-und Zielverzeichnis überträgt und dort weiter macht wo es unterbrochen wurde. Um Ihnen eine Vorstellung von der Leistung dieses Befehls zu erhalten, schlage ich vor, eine Kopie der PCLinuxOS Repositories auf einer lokale Festplatte zu speichern und diese in den frühen Morgenstunden, wenn das Netzwerk kaum genutzt wird automatisch aktualisieren zu lassen. Die vollständige Repository liegt derzeit bei rund 17 GB, aber ich lade nur die Änderungen herunter und lösche die veralteten Pakete. Der Befehl ist ziemlich lang, da es aber automatisch geht, brauche ich mir diesen Befehl nicht zu merken. Der Befehl sieht wie folgt aus:

rsync -aPvz --stats --delete  --log-file=/home/pete/update.log --exclude=SRPM* ftp.heanet.ie::pub/pclinuxos/apt/pclinuxos/2007/ /data/repo/2007/

partimage ist ein weiteres Programm für die Kommandozeile, welches eine grafische Schnittstelle zur Verfügung stellt und dadurch leicht zu handhaben ist. Es erstellt ein Image von nicht eingebundenen Partitionen, kann bei Bedarf eine Komprimierung verwenden und kopiert nur Blockweise. Es ermöglicht Ihnen das einfügen von Kommentaren was bei der Wiederherstellung sehr hilfreich sein kann. z.B. kann die Größe und der Typ des Dateisystems der originalen Partition angegeben werden. Ebenfalls ist das aufteilen des Images möglich, sodass es auf mehreren CD's oder DVD's gespeichert werden kann.

Erstellen einer Sicherung

Nun kennen wir ein paar Anwendungen und es wird Zeit uns Gedanken zu machen, was gespeichert werden sollte und wohin. Die zu sichernde Datenmenge wird die Frage nach dem Wohin mitbeeinflussen. Idealerweise sollten Sie auf einen anderen Datenträger schreiben als den, der die Originaldaten enthält. Wenn Ihre Platte sich verabschiedet (beschädigt wird), werden Sie froh sein, wenn Ihre Sicherung noch verfügbar ist. Wenn Sie eine komplette Systemsicherung durchführen wollen sind wahrscheinlich mondo archive oder partimage die Instrumente der ersten Wahl. Wenn Sie incrementell sichern wollen, d. h. Sicherung von bestimmten Dateien auf einen Datenträger, die während einer festgelegten Zeitspanne Veränderungen unterworfen sind, müssen Sie zunächst eine Liste dieser Dateien erstellen. Das Hilfsmittel "find" beinhaltet eine Option, den Speicherort von Dateien mit Bezug auf ihre letzte Ver(änderung) zu finden. In einem gegebenen Verzeichnis finden Sie alle Dateien, die während der letzten Woche verändert wurden mit

find /home/jane/ -mtime -7 \! -type d

wobei -mtime den Veränderungszeitpunkt ermittelt.

Dabei habe ich Dateien des type Verzeichnisses mit \! type d. ausgeschlossen.

Das Ausrufungszeichen ! bedeutet "nicht". Ihm muss ein back slash "\"vorangestellt werden, um zu vermeiden, dass die Shell es als ein Sonderzeichen interpretiert. Diesen Vorgang nennt man "escaping" (ein Zeichen vor dem shell interpreter verstecken).

Für Dateien, die innerhalb des letzten Tages geändert wurden verwendet man

find /home/jane/ -mtime -1 \! -type d

Die Ausgabe dieses Befehls können wir in eine Datei umleiten und diese an den "tar" Befehl übergeben:

find /home/jane/ -mtime -1 \! -type d > /tmp/newfiles

tar -cv -T /tmp/newfiles -f /backup/newfiles.tar

Die Option -T teilt dem Hilfsprogramm mit, die Dateiliste aus der nachstehenden Datei einzulesen.

Heutzutage ist es einfach und geht relativ schnell, ein Linux System neu einzurichten. Will man allerdings exakt alles so wiederherstellen (und aussehen lassen), wie man es vorher eingerichtet hatte, kann man schon auch mal Kopfschmerzen bekommen. Alle Ihre persönlichen Einstellungen sind im Verzeichnis /home/{user_name} abgelegt. Das ist bequem, hat aber den Nachteil, dass Sie als Eigentümer der Dateien alles mit ihnen machen können, was Sie wollen; oder eben auch was Sie eigentlich nicht wollen. Genau dies machen neue Benutzer in der Regel und auch erfahrene Nutzer, die es eigentlich besser wissen müssten, tun dies auch immer noch recht häufig. In jedem Fall ist dieses Verzeichnis der Hauptkandidat für eine regelmässige automatische Sicherung an sicherem Ort. Das klingt nach einer Aufgabe für rsync.

Zunächst müssen wir jedoch einige Informationen sammeln. Benutzer- und Gruppenrechte, Links und Zeiten von Dateiänderungen müssen erhalten bleiben. Auch wollen wir zwar das Verzeichnis /home/jane sichern, aber eben auch nicht alles aus diesem Verzeichnis. Den Inhalt des Verzeichnisses /junk, in dem jane zeitweise Unwichtiges ablegt, wollen wir nicht sichern. Auf dem Rechner gibt es eine zweite Festplatte, die unter /backup eingebunden (gemountet) ist. Auf dieser wollen wir unsere Sicherung abspeichern.

Da wir hierfür einen automatischen Ablauf einsetzen wollen, sollten wir die Ausgaben des Programms in eine Logdatei leiten. Wir verwenden keine Datenkompression, das Wichtigste ist Datenintegrität und auf dem Ziellaufwerk sollen mehrere Hundert GB verfügbar sein. Veraltete Dateien sollen gelöscht werden.

Die Datensicherung soll täglich um 1Uhr 30 (nachts) starten und einmal wöchentlich am Sonntag um 3 Uhr (nachts), jeweils unter einem anderen Namen. Das lässt uns eine Woche Zeit, darüber nachzudenken, ob wir an den Grundeinstellungen der Datensicherung etwas ändern wollen. Die Nachtzeiten haben wir gewählt, weil das System da wahrscheinlich nur gering belastet ist und um Konflikte durch Änderungen der Tageszeiten zu vermeiden.

Die Sicherung an sich ist eine einfache Sache.

Der Befehl dafür sieht folgendermassen aus:

rsync --archive --exclude=junk/* --delete --log-file=/backup/daily/jane-log /home/jane /backup/daily/

Das muss alles in einer Zeile stehen. Wenn Ihr Befehl viele Optionen enthält und Ihr Editor nicht alles in eine Zeile schreiben kann, müssen Sie die Zeilenverlängerungssequenz einsetzen

\enter.

Das funktioniert folgendermaßen: Wenn Sie normalerweise ans Ende einer Zeile kommen und die "enter" Taste drücken, fügt die bash ein unsichtbares Zeichen zu, das als "neue Zeile" interpretiert wird. Wenn Sie dem "enter" drücken ein "\" voranstellen, wird das Wechseln zu einer neuen Zeile ignoriert "escaped". Das hat zur Folge, dass Sie sehr lange Befehle eingeben können, die die Bash als einzeilig interpreziert. Die Grenze sind wahrscheinlich 2048 Zeichen. Die habe ich allerdings nie erreicht, obwohl ich manchmal ziemlich lange Befehle eingegeben habe.

Im obigen Beispiel sind die Langversionen aller Optionen angeführt. Die Sicherung erfolgt automatisch und das verwendete Format erlaubt es, auf einfache Weise, später nachvollzogen zu werden.

Der slash, der Verzeichnisnamen voransteht ist wichtig.

So wird /home/jane das Verzeichnis jane und alle Dateien und Unterverzeichnisse, die es enthält, im Verzeichnis /backup/daily gesichert.

Dagegen wird /home/jane/ kein Verzeichnis "jane" erstellen, sondern den gesamten Inhalt in das Verzeichnis /backup/daily kopiert.

Auf dieselbe Weise wollen wir zwar das Verzeichnis junk/ einrichten, damit es für die Sicherung verfügbar ist, aber wir wollen seine Inhalte nicht kopieren. Dies erreichen wir mit junk/*.

Wenn Sie eine lange Befehlszeile eingegeben haben, wollen Sie sie bestimmt nicht jedes mal wieder neu eingeben. Sie könnten ein "alias" erstellen, aber besser und mächtiger ist es, sie in ein Script einzubinden. Scripts können sehr lang und kompliziert sein, aber auch kurz und zielführend.

Erzeuge 2 Verzeichnisse im Ziellaufwerk - in unserem Fall ist das Ziel /backup:

mkdir /backup/{daily,weekly}

Die geschwungenen Klammern beinhalten eine durch Kommas getrennte Liste für zu erstellende Unterverzeichnisse.

Öffnen Sie jetzt ein Textverarbeitungsprogramm Ihrer Wahl und geben Sie Folgendes ein (copy and paste aus Zeitschriftartikeln funktioniert manchmal nicht, weil sie unsichtbare Zeichen enthalten können, die für das Layout des Artikels notwendig sind):

#!/bin/bash
#Script to back up my home directory
rsync --archive --exclude=junk/* --delete --log-file=/backup/daily/jane-log /home/jane /backup/daily/

Vergessen Sie nicht, dass dieser lange rsync Befehl in einer einzigen Zeile stehen muss!

Die jetzt noch eigenartigen Bedeutungen am Anfang des Befehls erläutere ich später, wenn wir weiter entwickelte Scripts behandeln.

Sichern Sie unter einem beliebigen Namen (z. B. home-bkup) in Ihr Heimverzeichnis (home directory). Das hat auch den Vorteil, dass die Sicherungen ihrerseits gesichert werden – Eigensicherung.

Änderm Sie die Benutzerrechte der Dateien und machen Sie sie ausführbar.

pic11

Geben Sie ./home-bkup ein. Jetzt sollte das Skript ausgeführt werden. Probieren Sie es aus - ./ teilt der bash mit die Datei zuallererst an dem angegebenen Ort zu suchen. Normalerweise sucht die bash woanders.

ls -al /backup/daily

pic12

Kopieren Sie diese Datei mit neuem Namen für die wöchentliche Dateisicherung.

cp home-bkup home-bkup-weekly

Öffnen Sie diese Datei in einem Editor und ändern Sie das Ausgabeziel in der Befehlszeile wie folgt:

rsync --archive --exclude=junk/* --delete --log-file=/backup/weekly/jane-log /home/jane /backup/weekly/

Speichern Sie die Datei.

Überprüfen Sie, ob es bis hierher funktioniert hat. Sie sollten eine Kopie Ihres Heimatverzeichnisses vorfinden und eine log-Datei, die in jedem der neu erzeugten Verzeichnisse, /backup/ - daily und weekly erzeugt wurde.

Um nun Ihr persönliches 'home directory' zu sichern müssen Sie nur das Script starten. Daran scheitern jedoch viele Backup-Strategien, weil man sich daran erinnern muss. Also sollte man dieses automatisieren. Um das zu erreichen nutzen wir das Hilfsmittel cron. Cron teilt dem System mit, wann was zu welcher Zeit laufen soll, wie z. B die Aktualisierung der Datenbank, die vom 'locate' Befehl angesprochen wird.

Um cron entsprechend einzurichten geben wir als root (su) ein:

crontab -e

Mit der Option -e kommen wir in den Editor Modus von vi.

In der Kopfzeile der Datei wird ihr notwendiges Format angezeigt. In den ersten 5 Spalten kann angegeben werden, wann ein Befehl ausgeführt werden soll. Dabei bedeutet ein Stern(*) von früher (vorne) nach später (hinten). In der Spalte 'Wochentag' bedeuten 0 und 7 Sonntag.

Also, um unsere 2 Scripts jeden Morgen um 1:30 (nachts) und Sonntags um 3 Uhr (nachts) auszuführen, fügen wir nachstehende Zeilen an.

Um eine neue Zeile unterhalb der obersten einzufügen Zeile geben Sie o ein. In 2 dieser neu erzeugten Zeilen geben Sie ein:

30 1 * * * /home/jane/home-bkup
0 3 * * 7 /home/jane/home-bkup-weekly

Drücken Sie die 'escape' Taste und dann die Leertaste. Sie erhalten eine Eingabeaufforderung am unteren Ende des Bildschirms. Geben Sie wq (write then quit) ein, um die Datei zu sichern und verlassen Sie vi.

pic13

Zur Überprüfung Ihrer Eingaben geben Sie crontab -l ein.

Morgen werden wir sehen, ob alles funktioniert hat.