Mittwoch, 7. November 2012

vi Mikro-Referenz

vi Mikro-Referenz

Diese "vi Mikro-Referenz", habe ich erstellt, um eine knappe Übersicht der grundsätzlichen vi Befehle einfach darzustellen. In diesem Beitrag sind alle Befehle beschrieben um den vi Unfallfrei zu bedienen und um damit Dateien zu Öffnen, Inhalte zu speichern und die Texte zu editieren (Hinzufügen von Text, Löschen von Text, Zeilen kopieren und löschen).

Zu diesem Eintrag habe ich mich entschieden, da ich während der letzten Monaten häufiger nach bestimmten Befehlen bzw. der grundsätzlichen Bedienung von vi gefragt wurde. 

Bedienung


Im Vorfeld ist es wichtig zu wissen, dass es drei Moden gibt. Dabei handelt es sich um den Kommandomodus, den Eingabemodus und den Befehlszeilenmodus.

vi startet immer im Kommandomodus, welcher auch der Modus ist, in den wir durch das drücken von  ESC  immer wieder zurück kommen. Von diesem Modus aus können wir den Eingabemodus und den Befehlszeilenmodus starten.

Wichtig: Wenn man nicht weiter kommt, zwei mal ESC drücken! 

Der Kommandomodus ist erst gestartet, wenn -- INSERT --, -- REPLACE --, oder andere Bezeichnungen wie z.B: :" nicht mehr in der letzten Zeile stehen.

Datei öffnen / Datei neu anlegen
desktop:~ # vi <Dateiname>

Insert-Modus starten
Bitte im vi nach während des Kommandomodus folgendes eintippen:
i  
In der letzten Zeile des vi erscheint der Begriff: -- INSERT --. Danach kann nach Auswahl des Cursors ein beliebiger Text eingegeben werden.

Zeichen löschen
Kommandomodus durch aufrufen von ESC öffnen.
Den Cursor mit den Pfeiltasten zur auf das zu entfernende Zeichen bewegen:
x oder ENTF drücken um das ausgewählte Zeichen zu löschen.

Datei Speichern
Kommandomodus starten. Die aktuell geöffnete Datei wird durch starten des Befehlszeilenmodus durch den Doppelpunkt und Eingabe von w für write gepeichert.
:w Enter 

Kommt es zu Problemen mit der Schreibberechtigung im Dateisystem kann ein Ausrufezeichen dem entgegenwirken:

:w! Enter 


Datei schliessen
Solange eine Datei nicht editiert wurde, kann der vi durch den folgenden Befehl beendet werden. q steht hierbei für Quit.
:q Enter 

Sollte die Datei bearbeitet worden sein und man möchte sie ohne Änderung schliessen, hilft auch hier wieder ein Ausrufezeichen weiter:
:q! Enter


Nice to Know


Zeile löschen
Will man eine ganze Zeile löschen kann man dies im Kommandomodus nach Auswahl der Zeile mit dem Cursor wie folgt durchführen:
dd 

Mehrere Zeilen löscht man mit der Folgenden Eingabe:
<Anzahl der Zeilen> dd 

Zeile Kopieren und Einfügen
Eine komplette Zeile kann unter vi nach Auswahl der Zeile mit dem Cursor im Kommandomodus wie folgt kopiert werden. 
yy 

Möchte man mehrere Zeilen kopieren funktioniert dies wie folgt:
<Anzahl der Zeilen>yy 

Bsp: 3yy  kopiert 3 Zeilen.

Um die kopierte Zeile wieder einzufügen reicht die Eingabe des folgendes Befehls im Kommandomodus:
p 

Freitag, 2. November 2012

cat - Howto Grundlegende Systembefehle

Nachdem ich mir heute den Filesystem Hierarchy Standard angeschaut habe um mir den Unterschied zwischen /bin und /sbin anzueignen sind mir die folgenden, auf allen Unix-System vorhandenen Befehle ins Auge gefallen. Diese sind über die Linux Standard Base (lsb), welches den FHS beinhaltet vorgegeben.

In diesem mehrteiligem Howto möchte ich diese grundlegenden Befehle einmal beschreiben und fange der Einfachheit halber alphabetisch mit dem Befehl cat an.


cat

cat ist ein Programm zur Ausgabe von Inhalten von Dateien. 

Wichtig zur Benutzung:

Dateien können wie folgt ausgegeben werden:
cat <Dateiname>

Beispiel:
# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/bin/bash 
daemon:x:2:2:Daemon:/sbin:/bin/bash 
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash 
...

Um Dateien besser analysieren zu können gibt es noch weitere Möglichkeiten sich zusätzliche Inhalte der Datei anzeigen zu lassen. Um nicht auf alle Parameter einzugehen gibt es einen umfassenden Parameter, welcher einen Großteil zusammenfasst. Dieser lautet, wie häufig unter Linux "-A".

Der Vorteil hierbei ist, dass wir sehen können ob eine Datei einen korrekten Inhalt hat. Sinnvoll ist dies, wenn z.B. Dateien von einem Windows System kopiert wurden und diese eine inkompatible Formatierung haben, welche aber über vi oder dem normalen cat Befehl nicht sichtbar ist. Häufig liegt die Fehlerursache an einem anderen nicht sichtbaren Zeilenende.

Über diesen Parameter kann man überprüfen ob die Datei im richtigen Format gespeichert ist. 
# cat -A /etc/hosts

127.0.0.1^Ilocalhost.localdomain^Ilocalhost$
::1^Idesktop^Ilocalhost6.localdomain6^Ilocalhost6$
127.0.1.1^Idesktop$
$
#


Zum Vergleich gibt cat ohne den Parameter folgendes aus:
# cat /etc/hosts

127.0.0.1       localhost.localdomain   localhost
::1             desktop  localhost6.localdomain6 localhost6
127.0.1.1       desktop

#

Nice to Know

Bei einigen Systemen bin ich auf Probleme gestoßen, welche erst nach intensiver Suche auf ein falsches Datei-Format hinwiesen. Eine normale Ausgabe von cat zeigt die fehlerhaften Steuerzeichen in einer Datei nicht an.

Sollte z.B. eine Datei unter Windows erstellt oder editiert worden sein, kann es bei einigen Programmen zu Problemen wegen des falschen Zeilenumbruchs kommen. Dieser verrät sich durch ein Zusätzliches ^M vor dem Zeilenende.


127.0.0.1^Ilocalhost.localdomain^Ilocalhost^M$
$
::1^I^Idesktop^Ilocalhost6.localdomain6^Ilocalhost6$
^M$
127.0.1.1^Idesktop^M$
^M$
$
$

Sollte die Datei wie oben gezeigt aussehen gibt es zwei Möglichkeiten. Entweder die Datei wird neu unter Linux erstellt oder, nicht ganz so schlimm, ein Programm zum Ändern des Formats wird genutzt. Hierbei hat mir recode immer gute Dienste erwiesen.



cat chgrp chmod chown cp date dd df dmesg echo false
hostname kill ln login ls mkdir mknod more mount mv ps
pwd rm rmdir sed sh stty su sync true umount uname

Weitere Informationen zum Thema grundlegende Systembefehle:

http://goo.gl/HxZ1N

Dienstag, 23. Oktober 2012

Datenrettung bei I/O Fehlern mit ddrescue

In den letzten Wochen sind bei mir drei Festplatten ausgefallen, von denen ich die Daten gerne behalten wollte. Deshalb habe ich mich entschieden einen Blogeintrag zu dem Thema zu schreiben, wie ich die Daten wieder hergestellt habe.

Sollte es bei normalen SATA Platten zu seltsamen Geräuschen auf der Festplatte kommen ist dies meistens auf einen Defekt zurückzuführen. Dies kann unter allen Linux Distributionen über die "dmesg" Ausgabe einfach kontrolliert werden. 

Sollten häufiger Meldungen wie die folgende Auftauchen, wird es höchste Zeit die Daten von der Festplatte zu sichern, das dies (auch ohne Geräusche) auf einen Hardwaredefekt hinweist:

Descriptor sense data with sense descriptors (in hex):
[  495.124588]         72 03 11 04 00 00 00 0a 00 0c 80 00 00 00 00 00
[  495.124595]         10 cc 51 dd
[  495.124598] sd 4:0:0:0: [sdd]  Add. Sense: Unrecovered read error - auto reallocate failed
[  495.124602] sd 4:0:0:0: [sdd] CDB: Read(10): 28 00 10 ec 51 dc 00 00 04 00
[  495.124609] end_request: I/O error, dev sdd, sector 283922909
[  495.124612] Buffer I/O error on device sdd6, logical block 81850
[  495.124623] ata5: EH complete

Für einige Daten der Festplatte kann es jetzt bereits zu spät sein, um zu versuchen einen Großteil der Daten zu retten sollten jetzt folgende Schritte beachtet werden:
  • Den Computer ausschalten bzw. die betroffene Festplatte aus dem System umounten!
  • Eine System mit gleich großer Platten-Kapazität suchen und dort die Festplatte einbauen
  • Start eines Rescue Systems, bzw. einer aktuellen Knoppix Version
  • Die Software ddrescue (Paketname: gddrescue) und optional screen installieren.
  • Bei Bedarf die Konfiguration eines Netzwerkzugangs.
Nun kann der Restoreversuch beginnen.

Es kann im "Extremfall" mehrere Tage dauern um die Daten der Festplatte zu sichern, weshalb  ich als Voraussetzung der Softwarepakete screen empfohlen habe. Dies ist hilfreich um bei einem Rettungsversuch über das Netzwerk nicht die SSH-Session die ganze Zeit geöffnet zu haben. Wie dies genutzt werden kann, habe ich in dem folgenden Blogeintrag erwähnt.

Nun kann die Wiederherstellung der Daten beginnen.

Erst schauen wir uns über fdisk -l an, welche Partitionen sich auf der Festplatte befinden.

Disk /dev/sdd: 250.1 GB, 250059350016 bytes
255 Köpfe, 63 Sektoren/Spur, 30401 Zylinder, zusammen 488397168 Sektoren
Einheiten = Sektoren von 1 Ã 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0xeaefeaef

   Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/sdd1   *          63    40965749    20482843+   7  HPFS/NTFS/exFAT
/dev/sdd2        40965750   488375999   223705125    f  W95 Erw. (LBA)
/dev/sdd5        40965813   283595444   121314816    7  HPFS/NTFS/exFAT
/dev/sdd6       283595508   488375999   102390246    7  HPFS/NTFS/exFAT

In diesem Fall handelt es sich um eine Festplatte mit mehreren vorhandenen Windows NTFS Partitionen. Wiederhergestellt werden können aber sämtliche Filesysteme, die Linux einlesen kann. Dazu gehören ext3, ext4, reiserfs, xfs und viele mehr.

Aber vorerst fangen wir mit der Sicherung der Partitionen an, um zu vermeiden, dass bei einem direkten Datenrestore noch mehr zerstört wird. Auf diese Sicherung können wir später direkt zugreifen und beanspruchen damit die original Festplatte nicht mehr.

Das Programm
ddrescue liest erst alle fehlerfreien Sektoren aus und überspringt die fehlerhaften. Diese fehlerhaften Sektoren werden in einer Logdatei, falls angegeben, gespeichert und nach dem ersten Durchlauf erneut eingelesen. Dies kann bei einer Defekten Festplatte einen größeren Zeitraum in Anspruch nehmen. Bei einer Rücksicherung habe ich den Vorgang nach etwa 24 Std. abgebrochen und hatte somit einen Großteil der Daten gesichert.

Um ein Restore zu erzeugen führe ich den Befehl wie folgt aus:
root@system:~# # Wechsel in ein Verzeichnis welches 
root@system:~# # groß genug für die zu sichernde 
root@system:~# # Partition ist
root@system:~# cd /mnt/backup
root@system:~# ddrescue /dev/sdd1 sdd1.dd rescued.log

Press Ctrl-C to interrupt
rescued:     1688 MB,  errsize:       0 B,  current rate:    6684 kB/s
   ipos:     1688 MB,   errors:       0,    average rate:    9023 kB/s
   opos:     1688 MB,     time from last successful read:       0 s
Finished

Danach kann das Backup als Loop-Device normal geöffnet werden, ohne auf die defekte Festplatte zuzugreifen:
root@system:~# mkdir /mnt/sdd1
root@system:~# mount -o loop /mnt/backup/sdd1.dd /mnt/sdd1
root@system:~# cd /mnt/sdd1


root@system:/mnt/sdd1# ls
boot.ini MSDOS.SYS     CONFIG.SYS
WINDOWS Dokumente und Einstellungen pagefile.sys
...
root@system:/mnt/sdd1#

Aus diesem Verzeichnis können nun alle Daten mit den Standard Linux-Tools ausgelesen und gesichert werden.

Sollte es bei dem oben genannten ddrescue Befehl zu Problemen kommen, können die Parameter noch angepasst werden. Hier ein Beispiel zum wiederherstellen von cgsecurity.org:

#Erfasse zuerst die meisten fehlerfreien Bereiche auf die Schnelle:
ddrescue -B -n /dev/old_disk /dev/new_disk rescued.log
#Versuche dann soviel wie möglich von den heiklen Bereichen wiederherzustellen:
ddrescue -B -r 1 /dev/old_disk /dev/new_disk rescued.log
http://www.cgsecurity.org/wiki/Besch%C3%A4digte_Festplatte







Dienstag, 16. Oktober 2012

screen - Einsatz virtueller Konsolen

Virtuelle Konsolen nutze ich immer, wenn Programme ausgeführt werden sollen, die eine längere Zeit laufen z.B. LVM Migrationen und man nicht die ganze Zeit eine direkte Verbindung zum Server hat. Dies kann durch eine entsprechende Netzwerkkonfiguration gegeben sein, indem die Verbindung nach mehreren Minuten Inaktivität gekappt wird, oder auch über einen VPN Zugang notwendig sein, der sich jede halbe Stunde vom Netz trennt.

Der Vorteil von virtuellen Konsolen über screen liegt darin, dass man eine Session im Hintergrund weiter läuft und Stunden später wieder an dem Punkt aufgerufen werden kann, an dem man sich disconnected hat. Weiterhin kann man mit einer direkt Verbindung auf dem System mit mehreren Sessions arbeiten, was zur Reduktion der SSH Verbindungen führt.

Auf einigen Distributionen ist screen nicht in der Standard-Installation vorhanden, kann aber einfach über das Paketmanagement nachinstalliert werden. Das Paket sollte auf allen Distributionen auch screen lauten.

Der Start erfolgt durch die einfache Eingabe von screen. Danach befinden wir uns bereits in einer Virtuellen Session.

root@system:~# screen

Screen version 4.00.03jw4 (FAU) 2-May-06

Copyright (c) 1993-2002 Juergen Weigert, Michael Schroeder
Copyright (c) 1987 Oliver Laumann

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program (see the file COPYING); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to
screen@uni-erlangen.de


                  [Press Space for next page; Return to end.]

Eingabe Enter oder Space


root@system:~#

Diese neu erzeuge Session können wir über einen Parameter von screen anzeigen lassen:

root@system:~# screen -ls
There are screens on:
        3247.pts-2.system       (06.10.2012 10:04:31)   (Attached)
1 Sockets in /var/run/screen/S-root.

Um für die nächsten Schritte eine bessere Übersicht zu bekommen geben wir im Nächsten Schritt folgenden Befehl ein:

root@system:~# echo "Virtuelle Instanz"

Virtuelle Instanz
root@system:~#


Nun trennen wir die Sitzung (detach) um sie in den Hintergrund zu schicken. Dies wird etwas trickreicher als bisher unter Linux gewohnt.

Um dies zu erreichen müssen folgende Tasten gleichzeitig gedrückt werden:  Strg+a und d  für die Kommandoübergabe an Screen um die Instanz in den Hintergrund zu schicken.

root@system:~# screen
[detached from 3247.pts-2.system]
root@system:~#

Über die erneute Eingabe von screen -ls sehen wir nun, dass die Screen Session nun getrennt ist  und somit im Hintergrund läuft:

root@system:~# screen -ls
There is a screen on:
        3247.pts-2.system       (06.10.2012 10:04:31)   (Detached)
1 Socket in /var/run/screen/S-root.


Um jetzt wieder auf die vorherige Session zu kommen erreichen wir dies durch den Parameter -r von Screen und unter angabe der Session-ID 3247.pts-2.system:

root@system:~# screen -r 3247.pts-2.system

Als Ergebnis präsentiert sich folgendes uns bereits bekanntes Bild der vorherigen Session:

root@desktop-system:~# screen -ls
There is a screen on:
        3247.pts-2.system       (06.10.2012 10:04:31)   (Attached)
1 Socket in /var/run/screen/S-root.

root@desktop-system:~# echo "Virtuelle Instanz"
Virtuelle Instanz
root@desktop-system:~#