EMU – Everybody Meet Unix

October 23, 2011

SRTM-Höhendaten und Openstreetmap

Filed under: how to's,technik — Tags: , , , , , , , , , , — Martin @ 5:36 pm

Openstreetmap hat mir schon oft in Städten und/oder beim finden von Wegen auf dem Land gute Dienste erwiesen, oft ist OSM aktueller als die meisten anderen kostenfreien Onlineangebote. Allerdings sind OSM-Karten für Wildniswanderungen kaum zu gebrauchen. Um es kurz zu fassen: Es fehlen Höhenlinien, wie sie auf jeder guten topografischen Wanderkarte zu finden sind, aber zum Glück hat die Nasa in den neunziger Jahren ein Projekt zur Elevationsmessung durchgeführt und stellt die Daten unter public Domain zur Verfügung. Mit Hilfe dieser Karten und Openstreetmap lassen sich so Karten erstellen, welche auf dem Handy oder Ausgedruckt als Unterstützung für eine topografische Wanderkarte dienen können.

Ist man ein Anfänger in Sachen Navigation und Kartenkunde, so empfehle ich die Lektüre folgender Fachbücher:

http://www.lehmanns.de/shop/sachbuch-ratgeber/13590801-9783866863132-karte-kompass-gps

http://www.lehmanns.de/shop/reisen/19853769-9783768833141-orientierung-mit-karte-kompass-gps

Ich beschränke mich hier auf die Erstellung von Karten für gpsmid, ein sehr beliebtes routingfähiges Navigationsprogramm für die J2ME-Plattform. Es wandelt die OSM-Karten in ein eigenes Vektorformat um. was neben der Routingfähigkait auch Platzersparnis bringt.

Grund für diesen Post ist mein neues mobiles Fernfunksprechgerät Samsung B2710 und meine diesjährige sechswöchige Reise durch Skandinavien. Die für dieses Handy erstellten Karten und die Handhabung können natürlich nicht mit einem professionellem Garmin-Gerät mithalten, aber die Karten stehen unter CreativeCommons und das B2710 hat lediglich 100€ (+25€ Ersatzakku und Datenkabel) gekostet. Testberichte und Funktionsvielfalt können in unzähligen Beiträgen im Netz eingesehen werden, daher werde ich mich hier nur mit der Software zur Kartenerstellung (mit Höhenlinien) befassen.
Voraussetzung ist ein sicheres Umgehen mit der Kommandozeile. Als Host-System benutze ich ein Debian-GNU/Linux System, aber die Kommandozeilen für Osmosis und srtm2osm können aber auch analog auf anderen Systemen benutzt werden.

Für die folgenden Abläufe habe ich mir eine kleine Toolchain angelegt, ich empfehle die gleichen Versionen der Werkzeuge zu verwenden:

Osmosis (Java):

Kommandozeilenwerkzeug für die Bearbeitung von Karten im Openstreetmap Format. Versionen (0.39 und 0.35!)
srtm2osm (.net(mono)):

Werkzeug für die Kommandozeile, welches srtm Daten (.hrt) lesen kann und diese in eine .osm Datei exportiert (Achtung Tool verwendet Api 0.5 (aktuell: 0.6))
osm2gpsmid (Java):

Tool mit GUI, wandelt die OSM-Datei in ein Jar-File für gpsmid um.
[Maperative (.net (mono)]:

Programm zum bearbeiten von OSM-Karten und zum Export in Bitmap und SVG (Druckvorbereitung) Version: Build 1219]

Zu allererst benötigt man eine Openstreetmap im .osm format. Da allerdings der Export von Openstreetmap.org die meisten Downloads größer als 10km² Fläche nicht zulässt und man nicht unbedingt den ganzen Datenbankdump von Openstreetmap laden möchte, existieren unter geofabrik.de auch schon voreditierte Karten für bestimmte Gebiete. Ansonsten ist es möglich Karten über das Webfrontend oder aber per JOSM herunterzuladen.

1. Karte besorgen!

Ich empfehle allerdings die Karte von geofabrik.de zu besorgen. Man hat die Auswahl ein ganzen Kontinent als OSM-Karte herunterzuladen, einzelne Staaten oder in Deutschland sogar einzelne Karten der Bundesländer.
http://download.geofabrik.de/osm/

Nachdem eine lokale Kopie existiert muss die Karte noch dekomprimiert werden (Achtung die Datei ist extrahiert um ein Vielfaches größer: circa Faktor 8 bis 9).

2. Karte mit osmosis Beschneiden

Ist eine Karte von geofabrik.net heruntergeladen, so kann man diese auf den lediglich benötigten Kartenausschnitt zuschneiden. Wenn man nicht die genauen Grenzkoordinaten kennt, so empfehle ich eine visuele Markierung des ungefähr benötigten Bereiches im Export-Webfrontend von OSM um sich so die Grenzkoordinaten zu besorgen (Tip für Fortgeschrittene: OSM-Karten und deren Koordinaten verwenden das Kartendatum WGS84/ETRS89 und geografische Koordinaten, nicht UTM und auch nicht Gauß-Krüger-Geoide). Sind die vier Grenzkoordinaten besorgt, wird nun mit Hilfe des Werkzeuges Osmosis die Karte von Geofabrik zugeschnitten:

./osmosis/osmosis-0.39/bin/osmosis --read-xml geofabrik/finland.osm --bounding-box top="69.25" bottom="68.58" left="26.64" right="27.94" --write-xml ~/akt_karte/Inari-See.osm

3. Prüfen ob SRTM-Daten für Bereich zur Verfügung stehen
Weiterführende Informationen zu SRTM-Daten bietet Wikipedia an: http://de.wikipedia.org/wiki/SRTM-Daten

Für unsere Zwecke reicht es zu wissen, dass es sich um Höhendaten für große Teile unserer schönen Kugel handelt. Diese Daten müssen nicht zwangsweise mit extraterrestrischen Mitteln ermittelt werden, im Gegenteil, sie können von schon vorhandenen topografischen Karten stammen von denen die Höheninformationen in das SRTM-Format konvertiert werden.

Es stehen leider nicht für alle Gebiete auf der Erde SRTM-Daten zur Verfügung. In folgenden Dokumenten kann in Erfahrung gebracht werden, ob für die Zielkarte SRTM-Daten von der Nasa zur Verfügung gestellt werden. In der PDF Datei werden auch Angaben zur Genauigkeit auf den verschiedenen Kontinenten gemacht:

(http://dds.cr.usgs.gov/srtm/version2_1/Documentation/Continent_def.gif)
(http://dds.cr.usgs.gov/srtm/version2_1/Documentation/SRTM_Topo.pdf)

Für viele andere Gebiete existieren SRTM-Daten vom VIEWFINDERS-Projekt, inbesondere für Island, Skandinavien und Russland.

Abdeckung der SRTM-Daten vom Viewfinders Projekt:

VIWEFINDERS: http://www.viewfinderpanoramas.org/Coverage%20map%20viewfinderpanoramas_org3.htm

Gedownloadet werden die SRTM-Daten des Viewfinders-projekt hier, die NASA-SRTM-Daten werden von dem Werkzeug srtm2osm selbst vom Nasa-Server heruntergeladen:

4. Webserver einrichten und Ordnerstruktur erstellen

(mkdir Australia Eurasia Africa Islands North_America South_America)
(Daten Entpacken –> Eurasia (z.B. Eurasia) und zippen “for i in `ls -1` ; do zip $i.zip $i  ; done”)

Sollten keine NASA-SRTM-Daten für das Zielgebiet zur Verfügung stehen, so lädt man sich die benötigten .zip Dateien vom Viewfinders-Projekt herunter und richtet sich ein lokal laufenden Webserver ein. Damit srtm2osm auch die korrekten SRTM-Daten findet, muss die gleiche Verzeichnisstruktur wie auf dem NASA-Webserver eingerichtet werden und die Dateien aus den ZIP-Archiven in das richtige Verzeichnis kopiert werden und wieder gezipped werden, nur so kann srtm2osm mit den Daten umgehen.

5.Erstellen einer Karte mit Höhenlinien für bestimmte Grenzkoordinaten

mono strm-nasa-evelation/Srtm2Osm/Srtm2Osm.exe -large -bounds1 68.58 26.64 69.25 27.94 -o ~/akt_karte/Inari-See_srtm_V5.osm -source 'http://localhost/srtm/version2_1/SRTM3/'

6.Daten in Version 6 Konvertieren:

Dazu benötigt: ältere Version von OSMOSIS wegen alter API 0.35!!!!!!! (http://dev.openstreetmap.org/~bretth/osmosis-build/osmosis-bin-0.35.tgz)

./osmosis/osmosis-0.35/bin/osmosis --read-xml-0.5 enableDateParsing=no ~/akt_karte/Inari-See_srtm_V5.osm --migrate --wx ~/akt_karte/Inari-See_srtm_V6.osm

7. Die beiden Daten verschmelzen (wieder mit Version 0.39):

./osmosis/osmosis-0.39/bin/osmosis --rx ~/akt_karte/Inari-See.osm --sort --rx ~/akt_karte/Inari-See_srtm_V6.osm --sort --merge --wx ~/akt_karte/Inari-See_FINAL.osm

8. Style-File für osm2gpsmid bearbeiten:

8.1 Style-File aus der .jar Datei extrahieren: Dazu am besten das ganze Jar-Paket in das aktuelle verzeichnis extrahieren:

jar xf *.jar

8.2 style-file.xml in dem Tag <Way> um folgenden Tag erweitern:

<keyW tag = “contour”>
<Wvalue name =”elevation”>
<description desc = “Meter”/>
<namekey tag = “ele”/>
<isArea area = “false”/>
<scale scale = “17″/>
<lineColor color = “009C004B” />
<lineStyle dashed = “false” />
<wayWidth width=”1″ />
</Wvalue>
</keyW>

8.3 osm2gpsmid über ein neues Startskript starten, auf 64 Bit z.B. damit:

java -Xmx4096m -XX:+UseCompressedOops -jar Osm2GpsMid-0.7.6-map67.jar

8.4 Style-File und finale Karte wählen und ein Midlet daraus erstellen.

8.5 Auf das Handy kopieren und als Karte wählen oder Midlet installieren.

9. Beachte
Das ersetzt auf keinen Fall eine aktuelle topografische Karte!

April 10, 2011

hide your data

Filed under: how to's,technik — Tags: , , , — Martin @ 10:27 am

Immer wieder wird durch Contentfilter (GenuGate, McAfee,IT-Watch, …) versucht (sofern die Filter nicht nur auf die Dateiendungen achten) bestimmte Dateitypen zu blocken, sodass diese nicht in das Firmennetz gelangen können. Dies ist insofern sinnvoll, da man 95% der Nutzer damit abschreckt und eine gewisse Pseudosicherheit vorgaukelt. Für sogenannte “Poweruser” kann es aber auch hinderlich sein, wenn man sich seine Arbeiten nicht in dem benötigten Format nach Hause oder an einen externen Rechner senden kann und auf die (eventuell) beschränkten Mittel in der Firma angewiesen ist.

Aus diesem Grund möchte ich heute ein kleines Tool vorstellen, es nennt sich steghide und arbeitet nach dem Prinzip der Steganographie und verschlüsselt die eingebetteten Daten zusätzlich mit einem symmetrischen Kryptoalgorithmus. Steghide unterstützt leider als einziges sinnvolles Containerformat JPG, aber dieses wird von den wenigsten mir bekannten Contentfiltern bei Firmen/Behörden o.ä. geblockt.

Verwendung

Die Verwendung ist denkbar einfach, steghide besitzt mehrere Modi:

  • info : Anzeige der eingebetteten Daten sowie die Maximalgröße der einzubettenden Daten
  • embed: Modi zum Einbetten und Verschlüsseln der einzubettenden Daten
  • extract : Extrahieren und Entschlüsseln der eingebetteten Daten

In diesem Bild lassen sich insgesamt 331,1 KB an Daten verstecken. Mit folgendem Befehl lässt sich das mit dem Parasit gnuplot.pdf (256KiB) bewerkstelligen, da steghide gegen libmcrypt gelinkt ist, hat man sogar die Qual der Wahl welchen Verschlüsselungsalgorithmus man verwenden möchte, ich entscheide mich für Twofisch.

steghide embed -cf Hund_Katze.jpg -ef gnuplot.pdf -e twofish
Man wird zur Eingabe der Passphrase aufgefordert und die Datei Hund_Katze.jpg wird mit den eingebetteten Informationen ersetzt: parasitäre Bilddatei

Möchte man den Parasiten wieder extrahieren reicht folgender Befehl:
steghide extract -sf Hund_Katze_Parasit.jpg -xf dokument.pdf
[update]Das Passwort lautet: 1234567890 [/update]

Achtung

JPG-Dateien enthalten sogenannte Exif- (und Andere) Informationen, die Auskunft über Herkunft, Autor, Rechner, Bearbeitungsprogramm und Aufnahmedatum geben. Um lediglich die Bildinformationen in einem .JPG zu behalten empfehle ich folgendes Werkzeug mit dem entsprechendem Parameter:

jhead -purejpg Hund_Katze.jpg

January 20, 2011

raid, der alte weg (squeeze)

Filed under: how to's,technik — Martin @ 7:45 pm

Nachdem mir Grub2 bei meinem neuen MD-Raid-System ein Strich durch die Rechnung gemacht hat, habe ich mich halt für die gute alte /boot-Partition entschieden. Nachdem erstellen des neuen Partitionslayout auf der neuen Festplatte, dem erstellen des Raid-Arrays und dem anschließenden kopieren aller Daten auf die neuen Dateisysteme, musste ich leider feststellen, dass sich Debian-Squeeze nicht von einem degraded-Array booten lässt. Der initramfs wurden die benötigten Kernel-Module mitgegeben und auch eine aktuelle mdadm.conf existiert, dennoch möchten die Skripte nicht meine /dev/md0-Root-Partition erkennen und einbinden.
Der erste Lösungsansatz bezog sich auf den Fakt, dass es sich um ein degraded-Array handelt und so habe ich dem Kernel folgenden Parameter übergeben:

md-mod.start_dirty_degraded=1

ohne Erfolg. Nach einigen Probieren und der Lektüre der initramfs-Skripte, bin ich zudem Schluss gekommen, dass eigentlich alles funktionieren müsste…
Letztendlich hat nur folgender mdamd-Aufruf am Ende des Skripts /usr/share/initramfs-tools/scripts/local-top/mdadm geholfen:

/sbin/mdadm --assemble --scan --auto=yes
geholfen. Das hätte eigentlich genau dieses Skript erledigen sollen, doch genau dazu kommt es nicht; wo genau das Skript die falschen Entscheidungen trifft konnte ich nicht herausfinden.

Auch ein normales raid1-Array konnten die initramfs-Skripte nicht einbinden, obwohl die Partitionen auf den Typ 0xfd gesetzt sind und eine saubere mdadm.conf existiert! Somit verbleibt diese unsaubere Lösung in meiner Initramfs.

January 17, 2011

Grub2: “Error: fd0 read error”

Filed under: how to's,technik — Martin @ 10:37 pm

Vor einiger Zeit hat der smartd-Dienst auf meiner Debian-GNU/Linux-Workstation eine Änderung gemeldet, der Reallocated_Sector_Count wurde um einen Wert inkrementiert (auf 1). Das bedeutet, dass ein Sektor nicht mehr gelesen werden konnte und ein Ersatzsektor aus dem Ersatzsektorvorrat der Festplatte die LBA-Adresse des defekten Sektors zugewiesen bekommen hat. Dieser Fehler deutet häufig auf einen mittelfristigen Ausfall der Festplatte hin, wobei ich bei Ausfall Datenverlust meine.

Also beschloss ich eine weitere Festplatte zu kaufen und diese dann, zusammen mit der älteren, in einem Software-Raid1-Verbund laufen zu lassen. Gesagt getan, eine weitere Seagate gekauft, Modell 7200.12.
Wichtig zu erwähnen wäre hier, dass auf der Festplatte mein / zu finden ist, eine weitere /boot-Partition ist nicht vorhanden.

Nun hat Grub2 ein super Feature von seinen Entwicklern geschenkt bekommen: natives booten von einer GNU/Linux MD-Raid – Partition! Super Sache, bei einem Festplattenausfall bootet das System dennoch ohne Probleme und man wird dann lediglich per Mail informiert das eine Platte im Raidverbund Fehler wirft/ausgefallen ist. Nach dem Erhalt der Platte habe ich mich schnellstmöglich an die Konfiguration begeben, jedoch musste ich nach einiger Zeit feststellen, dass es gar nicht so einfach ist … Grub hat mir schon manchmal ein Strich durch die Rechnung gemacht, aber meistens konnte ich es noch halbwegs wieder hinbiegen.

Hier mal ein kleiner Abriss der Arbeiten, die erledigt werden mussten, um das Raid1 lauffähig und viel wichtiger bootfähig zu bekommen (ich habe mich da teilweise an die Anweisungen aus dieser Anleitung gehalten, besonders was die Grub2 Konfiguration angeht.):

1. Neue Platte nach neuen Bedürfnissen Partitioniert (lvm ist meines erachtens nicht zwingend notwendig bei einer so kleinen Installation)

2. Neue Raid-Arrays erstellt, mit einer Platte als missing(derzeitige Systemplatte) erstellt und anschließend mit ext4 formatiert.
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1

3. Einbinden der neuen Partition und Kopieren der Daten auf der Systempartition auf das neue Raid-Array:
mount /dev/md0 /mnt/newroot/
cp -dpRx / /mnt/newroot/
mount --bind /proc /mnt/newroot/proc
mount --bind /dev /mnt/newroot/dev
mount --bind /sys /mnt/newroot/sys
chroot newroot

4.Innerhalb der Chroot-Umgebung muss man zuerst die Datei device.map neu erstellen, damit Grub alle neuen Fesplatten/Array erkennt.
grub-mkdevicemap --no-floppy
Vorsicht! MD-Raid-Arrays werden müssen per Hand nachgetragen werden z.B. diese Zeile:
/boot/grub/device.map:
(md0) /dev/disk/by-id/md-uuid-11bb8dd5:95973df2:95ef38ca:33f5f579
Welche UUID das Array besitzt erfährt man hierdurch:
mdadm --detail /dev/md0

5. Die Grub Konfiguration habe ich aus oben genannten How-To übernommen etc/grub.d/09_swraid1_setup:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry 'Debian from RAID1' --class gnu-linux --class gnu --class os {
        recordfail
        insmod raid
        insmod mdraid
        insmod ext2
        set root='(md0)'
        linux   /boot/vmlinuz-2.6.32-5-amd64 root=/dev/md0 ro  nouveau.modeset=0
        initrd  /boot/initrd.img-2.6.32-5-amd64
}

update-grub2
grub-install /dev/sdb --no-floppy

6. Nun ist das System meines Erachtens für einen Neustart von der neuen Platte bereit:

– - – FAIL – - –

Error: fd0 read Error

…. mehr sagt Grub2 nicht mehr … fd0? Ist doch überhaupt nicht in der device.map?

Nachfolgende Bugs beschreiben das Problem, das blöde ist nur, dass diese nicht gefixt werden und die angegebenen Workarounds nicht funktionieren. Alles probiert, vom Deaktivieren des Controllers, des Floppy-Laufwerks, des USB-Controllers – nichts hat geholfen.
Das Problem betrifft nur die raid und lvm Module von Grub2 und das auch nicht auf allen Rechnern, allerdings sind es doch gerade die Module die Grub2 so interessant machen, insbesondere für den professionellen Einsatz!

Bug-Historie
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=550083
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/568720
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/396564

Derzeitig verwendete GRUB2-Version: 1.98+20100804-13 (Debian Squeeze – unstable)

January 9, 2011

Aus der Rumpelkiste

Filed under: funny things,technik — Martin @ 5:34 pm

Heute habe ich ein bisschen in Angleslayers Rumpelkiste gestöbert, da bin auf folgenden Eintrag gestoßen. Da hat mich die Neugier gepackt, und ich wollte wissen was dort codiert ist. Leider war der Code, den Angleslayer im Nachfolgenden Post verfasst hat, für mich unslesbar. Scheint sich wohl um die Skriptsprache eines exotischen Betriebssystems zu handeln ;).

Habe dann mal das Problem, einer ASCII-Kodierten Textdatei voller 0..F zu lesbaren Text umwandeln, in Pascal gelöst:

Geht sicher auch kürzer und weniger kompliziert, aber soll für diese Zwecke reichen.

Ich weiß jetzt über die größte Hollywoodlüge bescheid, danke Angleslayer.

program HextToASCII (input,output);
{reads PSEUDO-HEX from STDIN}
    var
    inHex : text;
    procedure convert (var inFile : text);
    {converts a ascii-formated File with a bunch of Hex-digits to readable text}
        type
        tIndex = 0..maxint;
        tcurrentDec = array [tIndex] of integer;
        var
        i : integer;
        currentDec : tcurrentDec;
        aktChar : char;
        function toDec ( inChar : char ) : integer;
        { got a Hex-char an gives a Dec integer }
            const
            HEXVAL='0123456789ABCDEF';
        begin
           toDec := pos(upcase(inChar),HEXVAL) -1 ;
        end;
    begin
        i := 1;
        while (not eof(inFile)) and (i < maxint) do
        begin
            read(inFile,aktChar);
            if (aktChar = char(10)) and odd(i) then
            begin
                {if you want a LineFeed(unix only)}
                {write(char(10));}
                i := i - 1;
            end
            else
            begin
                currentDec[i] := toDec(aktChar);
                    if not odd(i) then
                        write(char((currentDec[i-1] * 16 ) + currentDec[i]))
            end;
        i := i + 1;
       end
    end;
begin
    Assign(inHex,'');
    Reset(inHex);
    convert(inHex);
    writeln();
end.

November 1, 2009

Heizwerk, ein Hackerspace in Halle

Filed under: Neuigkeiten,technik,Wichtig — Martin @ 1:05 pm

Ich freue mich, dass es jetzt konkrete Pläne für einen Hackerspace in meiner Heimatstadt Halle an der Saale gibt.
Das Projekt nennt sich Heizwerk und wird vom Verein Terminal21 realisiert. Dazu wurde tatsächlich die Halle eines alten Heizwerkes gemietet und soll nun hergerichtet werden. Jeder kann natürlich seine Ideen einbringen und mithelfen, auch um Spenden wird gebeten (egal ob finanziell oder materiell). Genauere Infos erhaltet ihr auf der Terminal21 Projekthomepage:

http://heizwerk.terminal21.de/

Ich hoffe das sich einige Hallenser und nicht Hallenser an diesem Projekt beteiligen, denn wie man am Metalab(Wien) oder an der C-Base(Berlin) sieht kann so ein Projekt durchaus einen großen Erfolg haben.
Ich freue mich schon darauf, wenn ich wiedermal in Halle bin, dass Heizwerk zu besuchen. Daher kann ich auch leider nicht tatkräftig mit anpacken, unterstütze das Projekt aber mit ein paar Talern.

Ich wünsche dem Terminal21 Team alles Gute bei dem Vorhaben Heizwerk.

July 22, 2008

Redundante USB – Sticks mittels ZFS

Filed under: how to's,technik — Martin @ 12:44 pm

Hallo, kennt ihr das auch? Ihr speichert wichtige Daten auf euren USB – Stick, steckt ihn zwei Wochen später in einen anderen Rechner und die Datei ist nicht aufzufinden. Das trifft häufig Windows – User, da deren Sticks meist mit dem archaischen FAT – Dateisystem versehen sind und wenig Datenintegrität bieten. Bei Flashspeicherchips fallen gerne einmal Blöcke aus, insbesondere wenn sie unter vielen Zugriffen zu leiden haben. Es gibt zwar spezielle Dateisysteme für Flashchips, allerdings ist deren Verbereitung nicht erwähnenswert. Was kann man also machen? Man könnte ein Dateisystem mit einem Journal benutzen (ext3, xfs, jfs oder ntfs), da hat man dann zumindest eine minimale Sicherheit.
Oder man entscheidet sich für einen ganz neuen Weg, dem Weg ZFS. ZFS ist ein relativ neues Dateisystem aus dem Hause SUN Microsystems und bietet eine Fülle an einzigartigen Features, diese wären z.B.:

  • einfache Administrierbarkeit
  • hohe Datenintegrität
  • Raid5 oder Raid6 ähnliches Softwareraid (raidz1/2)
  • dynamische Plattenverwaltung ähnlich LVM
  • Integritätsprüfung ohne das Dateisysteme ausgehangen werden müssen
  • Integrität wird über Checksumen geprüft (SHA-1 oder SHA-256)
  • die Möglichkeit Snapshots zu erzeugen (Dateisystembasierende Backups)
  • sehr schnelle live Komprimierung (über ZFS eigenes Verfahren oder bis hin zu gzip -9)
  • und und und …

Man kann nun ein USB – Stick mit ZFS betreiben, allerdings ist man da auch nicht gegen Hardwareausfälle geschützt. Wenn man also wirklich sensible Daten hat die transportiert werden sollen und man 100% sichergehen möchte das sie so ankommen wie sie gespeichert wurden, dann kann man sich einfach mittels einigen gängigen USB – Sticks und eines USB – Hubs einen Raid – Verbund bauen. Das ganze natürlich, wer hätte es gedacht, mit OpenSolaris und ZFS. Dazu natürlich noch eine Sparc Workstation oder ein x86 kompatibler Rechner.

Kostenpunkte:

  • passiver USB – Hub (4 Port) – Preis: 7€
  • 4 x 2 Gbyte USB – Sticks – Preis pro Stick: 6€

Das macht in der Summe 31€, natürlich geht es auch nur mit 3 USB – Sticks … oder mit mehr ;). Auf meinem System läuft die Opensolaris Community Edition x86 (Build 93), allerdings wird ZFS Seit Solaris 10 unterstützt. Solaris 10 und verschiedene Opensolaris Distributionen können von der Sun Homepage kostenfrei heruntergeladen werden. ZFS befindet sich auch für andere Betriebsysteme in der Entwicklung (allerdings sind alle Implementation noch Experimentel (Stand 07/2008)), so z.B. für Linux, FreeBSD und NetBSD. Für Windows ist mir nichts bekannt und für OpenBSD wird es hoffentlich bald implementiert.

Also, fangen wir an:

Als erstes schließt man den Hub an einen freien USB 2.0 Port an, der Solaris Kernel sollte ihn ohne Probleme als solchen erkennen, eine beispielhafter Eintrag in /var/adm/messages könnte demnach so aussehen:


Jul 22 12:04:42 gorn usba: [ID 349649 kern.info] USB2.0 Hub
Jul 22 12:04:42 gorn genunix: [ID 936769 kern.info] hubd0 is /pci@0,0/pci1043,808c@10,3/hub@2
...

Nun verbindet man die einzelnen USB – Sticks mit dem Hub. Sind alle USB – Sticks verbunden so kann man mittels dem Befehl rmformat die jeweiligen Gerätedateien die zu den USB – Sticks gehören identifizieren:


root@gorn:~# rmformat
...
2. Logical Node: /dev/rdsk/c3t0d0p0
Physical Node: /pci@0,0/pci1043,808c@10,3/hub@2/storage@4/disk@0,0
Connected Device: Sharkoon Flexi-Drive EC2 1100
Device Type: Removable
Bus: USB
Size: 1,9 GB
Label:
Access permissions: Medium ist nicht schreibgeschützt.
...

Uns interessiert demnach nur, dass dieser USB – Stick unter c3t0d0p0 zu finden ist, also jeweils für die einzelnen Sticks merken! In meinem Fall ganz einfach: c3t0d0p0, c4t0d0p0, c5t0d0p0 und c6t0d0p0.

Machen wir uns an das erstellen von unserem zPool, allerdings solle es nicht nur ein einfacher zPool sein, sondern auch Redundanz bieten. Das ist dank ZFS kein Problem, wir sagen dem Programm zpool einfach er soll uns beim erstellen des Pools gleichzeitig ein raidz erzeugen.


root@gorn:~# zpool create -f usbpool raidz c3t0d0p0 c4t0d0p0 c5t0d0p0 c6t0d0p0

Das war es schon, der zPool ist erstellt. Wir haben jetzt eine Redundanz ähnlich Raid 5, d.h. ein kompletter USB – Stick kann ausfallen, ohne das Datenverlust entsteht. Möchte man noch weiter gehen, so kann man auch ein raidz2 erstellen, dann hat man eine Redundanz ähnlich der von Raid 6, was allerdings nur bei einer größeren Menge an Platten Sinn macht.

schauen wir uns unseren neu erstellten zPool mit raidz einmal an:


root@gorn:~# zpool status usbpool
Pool: usbpool
Status: ONLINE
scrub: Keine erforderlich
config:
NAME STATE READ WRITE CKSUM
usbpool ONLINE 0 0 0
raidz1 ONLINE 0 0 0
c3t0d0p0 ONLINE 0 0 0
c4t0d0p0 ONLINE 0 0 0
c5t0d0p0 ONLINE 0 0 0
c6t0d0p0 ONLINE 0 0 0
Fehler: Keine bekannten Datenfehler
root@gorn:~# zfs list
...
usbpool 126K 5,48G 26,9K /usbpool

Er kann jetzt unter dem Pfad /usbpool genutzt werden. Man hat 5,5 Gbyte Speicher zur freien Verfügung und die zusätzliche Redundanz eines USB – Sticks. Es kann also irgendein Stick ausfallen und die Datenintegrität bleibt bestehen, man kann auch einen Stick hinzufügen um die Kapazität zu erhöhen.

Um die USB – Sticks vom Hub zu entfernen müssen sie zuerst ungemountet werden, dass geschieht mittels:


root@gorn:~# zpool export usbpool

Nun kann man die USB – Stick entfernen und zu einem Späteren Zeitpunkt wieder anschließen, dabei kommt es nicht auf die Reihenfolge an. ZFS sucht seine Geräte die zu dem jeweiligen Pool gehören selbst.


root@gorn:~# zpool import usbpool

Nachdem der Pool wieder importiert wurde kann man sich daran machen die Dateisystemintegrität zu testen:

Die Datenintegrität lässt sich mit ZFS im laufenden betrieb untersuchen:


root@gorn:~# zpool scrub usbpool
root@gorn:~# zpool status
Pool: usbpool
Status: ONLINE
scrub: scrub in progress for 0h0m, 19,37% done, 0h0m to go
config:
NAME STATE READ WRITE CKSUM
usbpool ONLINE 0 0 0
raidz1 ONLINE 0 0 0
c6t0d0p0 ONLINE 0 0 0
c3t0d0p0 ONLINE 0 0 0
c5t0d0p0 ONLINE 0 0 0
c4t0d0p0 ONLINE 0 0 0
Fehler: Keine bekannten Datenfehler

Man sieht hier deutlich das die Geräteadressen nun durcheinander gewürfelt sind, es ist halt egal wo man nach dem exportieren des zPools die Sticks anschließt.

Wenn man ein Stick im laufenden Betrieb entfernt, wird dies nur sichtbar wenn man scrub auf den zPool anwendet und sich danach den Status anzeigen lässt:


root@gorn:~# zpool scrub usbpool
root@gorn:~# zpool status
...
c6t0d0p0 ENTFERNT 0 0 0
...

Man kann den Stick ohne Probleme wieder anschließen und ZFS bindet ihn wieder in das bestehende raidz ein. Fällt ein USB – Stick mal aus und ein anderer wird eingesetzt, so verwendet man die Befehle “zpool clear” und “zpool replace” (mehr dazu in den Manpages).

möglicher Verwendungszweck

5,5 Gbyte hört sich nicht gerade viel an! Dem kann ich zustimmen, allerdings kann man sich mit so einem sehr günstigen Raid auch eine private Backupstrategie ausdenken. An sich passt auf dieses kleine Raid gerade so ein DVD – Image, allerdings nehmen meine E-Mails (mehrere tausend, bzip2 komprimiert) weniger als 400 Mbyte platz weg. Des weiteren könnte man alle wichtigen config – dateien aus dem home darauf sichern und wer hindert einen daran ein CVS oder ein SVN in so einem Pool zu speichern. Wenn man sowieso nur über FastEthernet zugreift können die Sticks die Leitung voll auslasten, da ja von jeweils drei USB – Sticks gleichzeitig gelesen und auf 3 gleichzeitig geschrieben werden kann (1/4 der Bandbreite sind Paritätsinformationen).

und so sieht das Ganze dann aus:

Wichtige Links im Umgang mit ZFS

Einführung OpenSolaris

OpenSolaris Homepages

“The last word in Filesystems”

Und in erster Linie die Manpages!

January 25, 2008

UMTS/HSDPA – Erfahrungsbericht

Filed under: technik — Martin @ 3:56 pm

Bin gerade auf der Bahnstrecke Magdeburg – Leipzig unterwegs und muss sagen ich bin positiv überrascht. In diesem Abschnitt hatte ich keinen einzigen Verbindungsabbruch zu meinem Provider Vodafone. Meine Novatel X870 ist lediglich zweimal auf EDGE ausgewichen. Ich hätte eher gedacht die UMTS-Flächenabdeckung wäre in den westlichen Ballungszentren besser. Falsch, sobald ich aus Lübeck, Hamburg, Hannover und Braunschweig raus war kam keine Verbindung mehr zu stande. Aber hier, mitten in Sachsen Anhalt scheint die Abdeckung fast vollständig ausgebaut zu sein, auch wenn nicht überall HSDPA zur Verfügung steht.

Powered by WordPress