16.4.2016 - Asterisk Teil 2

Asterisk installieren und konfigurieren

Wie fast immer unter Linux ist die Installation trivial:

sudo apt-get install asterisk

Danach wird es allerdings schwierig. Die Konfiguration von Asterisk findet mittels Textdateien in /etc/asterisk statt. Die Installation erstellt ungefähr hundert davon. Man könnte diese Dateien als Ausgangspunkt verwenden, aber, ehrlich gesagt: Da steht so viel drin, dass kein Mensch versteht, was eigentlich vorgeht. Am besten erstellt man die Dateien, die man braucht, neu. Sicherheitshalber verschiebt man zuvor die Originale an einen sicheren Ort.

mkdir /home/pi/asterisk-etc-backup
sudo mv /etc/asterisk/sip.conf /home/pi/asterisk-etc-backup
sudo mv /etc/asterisk/extensions.conf /home/pi/asterisk-etc-backup

Mit diesen beiden Konfigurationsdateien können wir im Prinzip anfangen. Aber zuerst mal sollte man sich überlegen, was man eigentlich braucht. Für den Anfang definieren wir folgendes:

  • Ein Telefon am Empfang
  • Ein Telefon im Zimmer 1
  • Ein Telefon im Zimmer 2
  • Eine Linie nach Aussen, zu einem SIP Provider. Telefonate von aussen sollen zuerst in der Zentrale klingeln, dann, wenn niemand abnimmt, im Zimmer 1. Wenn dort auch niemand abnimmt, soll eine Sprachnachricht abgespielt werden.
  • Alle Telefone sollen direkt nach aussen telefonieren können.
  • Jedes Gespräch soll von jedem Telefon auf jedes andere weiter verbunden werden können. Mit oder ohne Rücksprache.
  • Von jedem Telefon soll man auf jedes andere anrufen können.
  • Die Anlage soll später leicht um weitere Telefone erweitert werden können.

Um dieses Anforderungpsprofil in eine für Asterisk verständliche Form zu übersetzen, brauchen wir zwei Dinge:

  • Eine Channel-Konfiguration. Ein Channel ist in Asterisk jeder Weg, auf dem Telefonate übertragen werden können. Wir beschränken uns zunächst auf SIP Telefonate. Dazu müssen wir die Datei ‘sip.conf’ erstellen.
  • Einen Dialplan. Das ist gewissermassen das Herz von Asterisk. Im Dialplan wird festgelegt, wie die Channels ins System gelangen, was dort mit ihnen geschieht, und wie sie auf der anderen Seite hinausgelangen (wenn überhaupt). In Asterisk ist jedes Telefonat konzeptuell in zwei Telefonate aufgesplittet: Eins von Teilnehmer A zu Asterisk und eins von Teilnehmer B zu Asterisk. Asterisk verbindet diese beiden Channels so, dass A den Eindruck hat, direkt mit B verbunden zu sein und umgekehrt. Daher können auch völlig verschiedene Technologien (z.B. ISDN und VOIP) nahtlos via Asterisk verbunden werden. Der Dialplan wird in der Datei ‘extensions.conf’ definiert.

sip.conf:

[general]
;Hierher kommen globale Einstellungen
port=5060
udpbindaddr=0.0.0.0
language=de_CH
tcpenable=no   ; Wir wollen keine TCP Verbindungen, nur UDP
nat=force_rport,comedia ; Asterisk ist hinter einem NAT

; Beim SIP-Provider anmelden.
; Format: username:passwort@server/username
register => 415555555:abcde@sub.domain.tld/415555555

; Schablone für alle internen Telefone
[interne-telefone](!)
type=friend     ; Das definiert die Art der Authentisierung
host=dynamic    ; Die Telefone haben keine fixe IP
context=praxis  ; Kontext für den Dialplan

[10](interne-telefone) ; Empfang
secret=extremgeheim

[20](interne-telefone) ; Zimmer 1
secret=nochgeheimer

[30](interne-telefone) ; Zimmmer 2
secret=totalgeheim

; SIP account
[ext-sip-account]
type=friend
context=sipcall
defaultuser=415555555 ; username des SIP-Accounts
fromuser=415555555
secret=abcde          ; Passwort des SIP-Accounts
host=sub.domain.tld   ; url des SIP Servers
fromdomain=sub.domain.tld
qualify=yes
insecure=port,invite
nat=force_rport,comedia

Dies ist also quasi die Hardware-Seite. Wir haben 3 interne Telefone und ein “virtuelles” Telefon in Form des SIP-Accounts definiert. Letzteres meldet sich beim Programmstart automatisch beim Provider an (mit der Zeile “register => …”). Dieser Anmeldeprozess ist möglicherweise nicht bei allen Anbietern gleich. Im Zweifelsfall hilft Google oder Nachfragen.

Im Moment haben wir noch gar keine echten Telefone, wir behelfen uns mit Softphones. Das sind SIP Telefone, die auf Computern und Handys laufen. Google hilft dabei, welche zu finden, ein Beispiel ist X-Lite, aber es gibt viele andere, die man nicht nur im Internet, sondern auch im Apple-Store, Google-Android Store usw. findet. Achten Sie nur darauf, dass es das SIP Protokoll beherrscht (was ungefähr 99% davon tun).

Jedes Softphone muss mit Adresse der Servers (Das ist die IP-Adresse unseres Raspi im LAN), username und Passwort konfiguriert werden. Der Username ist die “Telefonnumer”, also z.B. 10 für das Telefon am Empfang. Passwort ist das oben genannte ‘secret’. Sie sollten diese Secrets ernster nehmen, als es hier scheint, da ziemlich üble Dinge geschehen können, wenn ein Bösewicht sich von aussen für eins Ihrer Telefone ausgeben kann. (Er kann zum Beispiel eine kostenpflichtige Nummer, die ihm gehört, für 9.99 pro Minute die ganze Nacht anrufen). Also ein kompliziertes Passwort wählen. Man muss es ja nur beim Einrichten des Telefons angeben.

Wenn Asterisk mit dieser sip.conf läuft, sollte sich jedes korrekt konfigurierte Telefon sofort verbinden und im seinem Status “verbunden” anzeigen. Wir warten aber im Moment noch mit Starten, weil Asterisk ohne Dialplan nicht viel anfangen kann.

extensions.conf

Das ist der vielbeschworene und beliebig komplizierte Dialplan. Wir fangen mal ganz klein an.

[globals]
HAUPTNUMMER=SIP/10
ZIMMER1=SIP/20
ZIMMER2=SIP/30

; Das ist der Kontext "Praxis". Bei der Definition der Telefone in
; sip.conf haben wir diesen Kontext mit 'context=praxis' genannt.
; Dieser Teil des Dialplans gilt also für alle Geräte dieses Kontexts

[praxis]

exten => 99,1,Answer()
    same => n,Playback(hello-world)
    same => n,Hangup()

exten => 10,1,Dial(${HAUPTNUMMER})

exten => 20,1,Dial(${ZIMMER1})

exten => 30,1,Dial(${ZIMMER2})

Gar nicht so schwierig, nicht wahr? Am Anfang definieren wir ein paar Variablen, die wir weiter unten referenzieren, und im Kontext [praxis] stehen dann ein paar seltsame Zeilen. Jetzt ist es soweit: Wir müssen Asterisk starten.

Das heisst: Wenn Sie Asterisk so wie oben gezeigt installiert haben, dann läuft es bereits im Hintergrund. Raspian installiert es nämlich als Service, der automatisch gestartet wird. Für unsere Zwecke hier wollen wir den Service zunächst stoppen:

sudo service asterisk stop

Und dann als Vordergrundprogramm wieder starten:

sudo asterisk -cv

Starten Sie jetzt Ihr Softphone im Zimmer 1 und wählen Sie dort 20. Wow! Das Telefon in Zimmer 2 klingelt. Sie können jetzt bereits abnehmen und miteinander sprechen.

Dann wählen Sie spasseshalber mal die 99. Der Anrufbeantworter müsste sich melden. In der Raspi-Konsole sehen Sie ein paar Zeilen durch rasen, die mehr oder weniger unverständlich erläutern, was Asterisk gerade tut, um die Gespräche zu vermitteln.

Fazit

Nun gut. Mit viel Mühe haben wir jetzt also eine Holzversion von Skype installiert? Ist das alles? Natürlich nicht. Aber mehr gibt es erst später.

15.4.2016 - Asterisk Teil 1

Eine neue Telefonanlage

ISDN wird per Ende 2017 eingestellt. Schon jetzt gibt es kaum noch brauchbare Endgeräte. Unsere Telefone spucken immer mal wieder, aber eine neue Anlage auf ISDN-Basis lohnt sich definitiv nicht. Also was tun?

  • Eine Telefonanlage fürs Analognetz?
  • Eines der verschiedenen VOIP-Komplettangebote von Swisscom oder Sunrise?
  • Ein VirtualPBX
  • Eine selbstgebastelte PBX-Anlage auf Asterisk-Basis

Da dies ein Amateur-Blog ist, ist es klar, dass wir uns am Ende für die Bastel-Lösung entscheiden. Telefonanlagen fürs Analognetz sind zu teuer, aussserdem weiss niemand, wie lange es das Anaolgnetz noch gibt. Die Angebote von Swisscom und Sunrise sind sehr schwierig zu verstehen. Ich brauche keinen Fernseher bei der Arbeit, aber dafür mehrere Telefone und die Möglichkeit, weiterzuverbinden und mehrere Nummern zu führen. Dafür braucht man dann die teuren Business-Varianten.

Für VirtualPBX gibt es Angebote z.B. von Swisscom, Sunrise, Sipcall, e-fon und VTX. Was mir dabei stinkt ist, dass keiner der Anbieter seine Preise auf der Website wirklich transparent offenlegt. Alle behaupten gleichermassen, sie seien “günstig”. Intensiveres Nachforschen und Offerteneinholung bringt dann zu Tage, dass der Grundpreis wohl irgendwo zwischen 15 und 30 Franken pro Endgerät und Monat liegt, Kosten für die Telefonnummern und Gespräche noch nicht eingerechnet. Zu teuer.

Anforderungsprofil

Wir benötigen mindestens:

  • Vier Telefonnummern, davon eine Sammelnummer, eine Faxnummer und zwei Direktwahl-Nummern.
  • Vier Telefone, die alle auf die Sammelnummer hören, zwei sollen zusätzlich auf eine der Direktwahl-Nummern hören.
  • Ein Faxgerät, das auf die Faxnummer hört.
  • Zwei Anrufbeantworter.

Von jedem Telefon muss eine Weiterleitung auf jedes der anderen möglich sein, mit oder ohne Rückfrage.

Asterisk

Wer nach Telefonanlagen googelt, stösst früher oder später auf ‘Asterisk’. Nein, damit ist nicht der kleine Gallier gemeint, der schreibt sich hinten mit x. Aber vermutlich ist der Anklang an dessen sprichwörtliche Schlauheit und Stärke nicht ganz unwillkommen. Ursprünglich stammt der Name aber von der Sterntaste ( * ) am Telefon. Die heisst nämlich so. Und sie dient dazu, erweiterte Telefonfunktionen anzusteuern.

Hier soll es nun aber weder um Gallier noch um Telefontasten gehen, sondern um die PBX-Software Asterisk. Ich weiss, was Sie jetzt denken. Sie denken: “Was soll jetzt PBX bedeuten?” Mit Abkürzungen werden Sie sich abfinden müssen. Die Telefon-Leute scheinen nur per Abkürzungen miteinander zu reden. Sogar in Anfängerbüchern wird man mit Abkürzungen erschlagen.

PBX heisst ‘Private Branch eXchange’ und bedeutet frei übersetzt: ‘Nebenstellenanlage’. Also eine Software zum Betreiben einer Telefon-Nebenstellenanlage.

Auf den ersten Blick genau das, was wir wollen. Und praktischerweise kostet Asterisk nichts (ausser Schweiss, Tränen und sehr viel Zeit). Vielleicht wird dieser Artikel ja helfen, letztere etwas abzukürzen.

Planung und Hardware

Asterisk läuft unter Linux, also brauchen wir einen Linux-Computer. Der Server im Keller würde sich anbieten, der läuft eh immer und ist eh nie ganz ausgelastet, und er läuft natürlich unter Linux.

Bei nochmaligem Nachdenken verliert diese Idee aber schnell an Glanz: Man will nicht wirklich, dass man bei einem Serverproblem auch gleich noch ohne Telefon dasteht. Und man will umgekehrt auch nicht, dass eine Asterisk-Fehlkonfiguration den Server in den Abgrund reisst.

Guter Rat ist hier ausnahmsweise billig: Ein Raspberry Pi Model 3 hat bei weitem ausreichend Power für eine Anlage mit bis zu ungefähr 10 parallelen Gesprächen. Er hat alle Anschlüsse, die man braucht, er ist billig, leise und mit einem Verbrauch von unter 4 Watt auch sparsam. Und da er sehr einfach aufgebaut ist, gilt er allgemein auch als zuverlässig und langlebig.

Der Pi kommt irgendwo ans Netzwerk, eigentlich egal wo, aus praktischen Gründen stellen wir ihn einfach im Keller auf den Server.

Die Internet-Anbindung muss für VoIP stabil sein und pro Gespräch mindestens 90 kB/s in jede Richtung übertragen können. Das derzeit kleinste Angebot von Swisscom (Vivo XS) hat eine Nenn-Bandbreite von 10MB/s, würde also theoretisch für mehr als 100 parallele Gespräche ausreichen. Zu bedenken ist allerdings, dass die von den Anbietern genannte Bandbreite idR eher unter- als überschritten wird (nicht nur Autohersteller habn Mühe mit der Angabe von technischen Daten), und dass Sie das Internet ja nicht nur zum Telefonieren brauchen werden. Später werden wir sehen, wie man VoIP priorisieren kann, so dass nicht die Telefonanlage zusammenbricht, wenn die Sekräterin Webradio hört. Schwerer als die Geschwindigkeit wiegt die Frage der Zuverlässigkeit. Wir sind ganz selbstverständlich gewohnt, dass das Telefon “immer” geht. Auch bei Stromausfall, auch bei Zusammenbruch des Internets. Das ist bei VoIP nicht der Fall. Bei einem Ausfall des Internet kann man auch nicht mehr telefonieren.

Sonst brauchen wir eigentlich nichts. Später mal Telefone, aber für den Anfang tun es Soft-Phones. Ich komme nachher gleich darauf.

Raspberry Pi aufsetzen

  • Achtung: Dieser Abschnitt wurde gändert, weil die Dinge beim Raspbian sich 2017 geändert haben

Am besten kauft man den Pi zusammen mit Gehäuse, Netzteil und vorkonfigurierter NOOBS-MicroSD. Dann passt gleich alles zusammen, die Installation geht schnell, und man braucht nicht einmal Bildschirm und Tastatur an den Raspi anzuschliessen:

  • NOOBS-MicroSD an einen Desktop-Computer anschliessen, und die Datei ‘recovery.cmdline’ editieren: Am Ende ‘silentinstall’ (ohne die Anführungszeichen) anhängen. Im Ordner /os alles ausser ‘raspbian’ entfernen.
  • Die MicroSD in den Raspi einsetzen, LAN-Kabel und zuletzt Stromversorgung anschliessen. Sie werden nicht viel sehen oder hören, aber der Raspi installiert jetzt Raspbian und bootet anschliessend ins frisch installierte System. Gönnen Sie ihm etwa 30 Minuten Zeit dafür. Bei neueren Raspi-Modellen erkennen Sie daran, dass die gelbe “Disk” leuchte ausgeht, dass er fertig ist.
  • Trennen Sie ihn wieder vom Strom, nehmen Sie die SD Karte heraus und stecken Sie diese nochmal in Ihren Computer. erstellen Sie in der Partition “/boot/” eine datei namens ssh mit beliebigem Inhalt. Nur dann können Sie den Raspi später erreichen 1.
  • Finden Sie die IP-Adresse Ihres eben frisch installierten Raspi heraus. Am Sichersten geht das über die DHCP-Clientliste Ihres Routers. Sie können aber auch einfach mal arp -a probieren, das spuckt oft die Adresse schon aus. Oder, falls nmap installiert ist, nmap -sP 192.168.0.* (für die IP-Adresse natürlich Ihre echte Netzadresse eingeben). Nmap erkennt den raspbi meist direkt als “Raspberry Pi”. Wenn nicht, kann man anhand der MAC-Adresse eingrenzen: Raspis fangen immer mit B8: an.
  • Sobald Sie die Adresse wissen, können Sie mit ssh pi@<raspi-adresse>2 einloggen. Die Frage nach dem Passwort beantworten Sie mit raspberry. Und schon sind Sie ‘drin’.
  • Als Erstes würde ich empfehlen, das Passwort zu ändern. Sie werden nicht wollen, dass später jeder in Ihre Telefonzentrale einbrechen kann, weil Sie bei der Installation nicht mehr an diesen Schritt gedacht haben. Das Kommando dazu heisst passwd.
  • Dann ist es empfehlenswert, sudo raspi-config auszuführen.
    • Unter “Boot-Options” können Sie einstellen, dass beim Start nicht der Desktop, sondern nur eine Kommandozeile (CLI) geladen wird. Der Desktop ist überflüssig, da wir den Raspi sowieso nicht an einen Bildschirm anschliessen werden.
    • Unter “Interfacing Options” sollten Sie den SSH Server einschalten. Sonst müssen Sie nämlich für jeden Start den Trick mit der “ssh”-Datei im Boot-Ordner ausführen - die gilt nämlich aus Sicherheitsgründen immer nur für einen Start und wird anschliessend wieder gelöscht.
    • Unter “localization options” sollten Sie das locale ‘de_CH-UTF-8’ einstellen und die richtige Zeitzone konfigurieren. Falls Sie WiFi benutzen, unbedingt auch die richtige WIFI-Region einstellen.
  • Beim Beenden von raspi-config will der Computer einen Reboot. Danach können Sie sich wieder per SSH einloggen (aber diesmal mit dem usernamen “pi” und dem vorhin neu eingestellten Passwort) 3.
  • Bevor Sie zu Ihrem wohlverdienten Kaffee kommen, sollten Sie die folgenden Kommandos absetzen: sudo apt-get update && sudo apt-get upgrade -y Danach ist der Raspi ein halbes Stündchen oder so mit Updates beschäftigt.

In der nächsten Folge wird Asterisk installiert.


  1. Wie so oft haben leichtsinnige Menschen alles für Alle ein wenig schwieriger gemacht: Weil diese Leute das Standard-Passwort auch dann beliessen, wenn der Raspi von aussen erreichbar war, wurden viele Raspis gehackt und als Spam-Schleudern oder DDos-Zombies missbraucht. Daher ist seit 2017 der SSH-Server standardmässig abgeschaltet. 

  2. Wenn Sie Linux nutzen, wird diese Zeile Sie nicht vor Probleme stellen. Als Mac-User öffnen Sie die Anwendung “Terminal”, die Sie unter Programme/Dienstprogramme finden. Alles in dieser Artikelfolge geht davon aus, dass Sie eine solche Konsole geöffnet haben. Unter Windows brauchen Sie ein Zusatzprogramm für SSH-Verbindungen, zum Beispiel Putty. Achten Sie darauf, bei der Verbindungskonfiguration Typ ‘SSH’, die IP des Raspi als Adresse, “pi” als Name und “raspberry” als Passwort einzutragen. Alles andere können Sie unverändert lassen. 

  3. An dieser Stelle sei auch die Frage aufgeworfen, wie man einen Raspberry ohne Tastatur und Bildschirm abschaltet oder rebooptet, wenn man nicht durch ein Programm dazu aufgefordert wird. Ganz einfach: sudo reboot macht einen Neustart und sudo halt fährt den Raspi herunter (Danach kann man ihn allersings nur durch Trennen und Wiederanschliessen der Stromzufuhr neu starten - tun Sie das also nicht aus der Ferne). 

20.9.2015 - Datensicherheit

Festplattenredundanz mit RAID & Co.

Festplatten sind heutzutage sehr zuverlässig. Nur etwa 2% aller preiswerten Consumer-Festplatten gehen innerhalb des ersten Jahres kaputt, und werden dann auf Garantie ersetzt. In den folgenden Jahren steigt die Wahrscheinlichkeit allerdings an. Nach 5 Jahren werden etwa 30% dieser Platten kaputt sein.

Unabhängig davon existiert auch bei funktionierenden Platten das Risiko eines Bit-Fehlers: Etwa eines von 10 hoch 13 Bit wird falsch gelesen. Das kann durch magnetische Störungen oder durch kosmische Strahlung oder durch Spannungsschwankungen geschehen, aber jedenfalls ist es seit Jahren ungefähr bei dieser Rate. 10^13 Bit, das sind ca. 12 Terabyte. Also wenn man 12 Terabyte liest, dann wird im Schnitt ein Bit falsch sein. Ein Bit, das bedeutet, dass die Prüfsumme des Sektors nicht mehr stimmt, in dem es sich befindet, und das wiederum bedeutet, dass die Platte sich weigert, den Sektor herauszurücken. Und das wiederum bedeutet, dass die Datei, die diesen Sektor belegt hat, nicht mehr lesbar ist. Sie hat nicht einfach ein defekltes Bit, was ja bei einem Text oder einen Bild oder einem Film oder einem Musikstück kein grosses Problem wäre, sondern sie ist ganz weg.

RAID-5

Aber wir sind ja intelligente Leute und schützen uns vor solchen Pannen, indem wir die Disks als RAID anordnen. Zum Beispiel kaufen wir 4 Disks zu 4TB und ordnen die zu einem RAID-5 an, das heisst, wir haben dann total eine Kapazität von 12 TB (Ja, ich habe absichtlich diese Zahl gewählt :)), und das System verkraftet den Totalausfall von einer beliebigen dieser Platten ohne jeden Datenverlust.

Nun ist die Wahrscheinlichkeit, dass keine dieser Platten ausfällt, im ersten Jahr immerhin 0.98⁴. Nach drei Jahren haben wir aber schon eine solide 20-30%ige Chance, dass mindestens eine der Platten ausfällt. Dann tritt der RAID-Ernstfall ein, denn genau dafür haben wir ja das RAID gekauft und 4TB der gekauften Plattenkapazität der Redundanz geopfert.

Wir tauschen also frohen Mutes die defekte Platte aus und überlassen das RAID eine Nacht lang sich selber, um sich zu rekonstruieren. Am nächsten Morgen überrascht uns eine kryptische Meldung, die uns, wenn wir sie entschlüsseln, klar macht, dass leider alle Daten verloren sind.

Warum denn das? Nun, um die Daten zu rekonstruieren, musste das RAID sämtliche Sektoren aller Platten auslesen, um daraus die Daten der fehlenden Platte zu rekonstruieren (So funktioniert RAID nun einmal: Redundanzinformationen werden über alle Platten verteilt, so dass irgendeine ausfallen und rekonstruiert werden kann).

Beim Lesen dieser 12 TB stolperte mindestens eine der Platten aber über das 10 hoch 13-Bit-Problem und meldete den Sektor als unlesbar. Damit ist im Fall von RAID die ganze Platte unbrauchbar und da ein RAID_5 den Ausfall von zwei Platten nicht verkraftet, sind somit alle Daten futsch.

Natürlich spreche ich hier von statistsichen Mittelwerten. Das 10 hoch 13-Bit-Problem kann auch schon nach 10 hoch 10 Bit auftreten, oder erst nach 10 hoch 15. Aber das Prinzip sollte klar sein. Zum Glück haben wir uns nicht nur aufs RAID verlassen, sondern haben auch noch ein Backup.

Und über ein zweites Problem habe ich noch gar nicht gesprochen: Da wir alle vier Platten gleichzeitig gekauft haben, und sie vermutlich zum gleichen Typ gehören, wird mit relativ hoher Wahrscheinlichkeit bald nach der ersten auch eine zweite Platte total ausfallen.

Dann eben RAID-6

Mit RAID-6 lösen wir dieses Problem zunächst: RAID-6 verkraftet den Ausfall von zwei Platten, statt nur einer. Allerdings auf Kosten der Kapazität. Um auf dieselben 12TB zu kommen, brauchen wir nun 5 Platten à 4 TB. Es ist aber ohne erneute mathematische Herleitung einsichtig, dass das Problem damit nur aufgeschoben und nicht aufgehoben ist: Je grösser die Kapazität unseres Speichers ist, desto grösser wird die Wahrscheinlichkeit, dass auch zwei Platten Lesefehler haben.

Mirroring!

Wenn wir RAID-1, also Mirroring, betreiben, dann enthält jede Platte alle Daten. Der Ausfall einer Platte ändert also zunächst mal gar nichts, alles bleibt lesbar. Allerdings brauchen wir bei Mirroring 6 Platten à 4 TB, um auf 12 TB Kapazität zu kommen. Es besteht natürlich immer noch die Möglichkeit, dass eine Platte ausfällt, und eine andere einen Bitfehler aufweist. Immerhin bleiben jetzt aber die Daten aller nicht-betroffenen Platten vollständig erhalten, und auch bei der Platte mit Bit-Fehler kann man vermutlich die nicht betroffenen Sektoren mit einem gewissen Aufwand noch retten.

Was tun?

Ich denke, was man aus obigem sehr gut sieht ist, dass RAID keinesfalls ein Ersatz für Backup ist. Wenn man ein aktuelles Backup hat, sind die ausfallenden Platten und Bitfehler ein wesentlich kleineres Problem, das sich im Kauf von neuen Platten und dem Zeitaufwand fürs Rückspielen des BAckups erschöpft.

Wie soll man also vorgehen?

  • Wenn ein Raid (egal ob Mirror oder RAID-1 oder RAID5/6) einen Fehler meldet, keinesfalls als erstes die kauptte Platte ersetzen, sondern als erstes ein neues Backup erstellen. Beim Backup werden nicht alle Sektoren gelesen, sondern nur die, welche Nutzdaten enthalten. Die Belastung der verbleibenden Platten ist also kleiner, und man hat anschliessend ein aktuelles Backup.

  • Dann erst die defekte Platte ersetzen und abwarten, was passiert. Wenn das rebuild scheitert, würde ich alle Platten ersetzen und das Backup einspielen.

  • Auf keinen Fall sollte man die Methode des “hot spare” anwenden. Manche Kontroller bieten einem an, eine Reserveplatte von vornherein im System einzubinden, und diese dann automatisch zu nutzen, wenn eine Nutzplatte ausfällt. Das ist gefährlich, weil man dann keine Chance hat, vor dem Rebuild die Daten zu retten. Mit einiger Wahrscheinlichkeit findet man anstelle einer Fehlermeldung eines Morgens einfach ein kaputtes RAID mit einer halb beschriebenen, nutzlosen hot spare Platte vor.

  • Gegen Bitfehler kann auch ein Dateisystem helfen, das eigene Prüfsummen und Redundanzen mitbringt, zum Beispiel ZFS. Ein solches Dateisystem kann Bitfehler in manchen Fällen selbst korrigieren und somit die Wahrscheinlichkeit eines nicht behebbaren Fehlers reduzieren.

4.9.2015 - PACS

Wie man ein PACS betreibt

Die kurze Story:

sudo docker run -d -v /mnt/usb4t/pacs:/config -p 8100:8080 -p 11112:11112 --name pacs sparklyballs/pacs
  • Danach den Browser auf http://<docker addresse>:8100/dcm4chee-web3 richten,

  • sich mit admin/admin einloggen

  • unter ‘Benutzer’ einstellen, wer das Web-Interface benutzen darf

  • unter ‘AE-Verwaltung’ einstellen, welche DICOM-Nodes zugreifen dürfen

  • unter ‘Passwort’ dem Admin ein anderes Passwort geben.

Und schon ist man stolzer Besitzer und Admin eines medizinischen Bilddatenbank-Systems.

Die lange Story:

Präludium

Seit einiger Zeit benutze ich auf dem Mac OsiriX als Dicom-Viewer und auf den Windows-PC’s irgendwelche Gratisprogramme von den DVDs der Röntgeninstitute. Osirix nervt ein wenig mit den aufpoppenden Warnmeldungen, dass es nicht für medizinische Befundung zertifiziert sei (Die funktionell identische Kaufversion aber schon), und dass man deswegen auf ebendiese Kaufversion upgraden soll.

Aber das ist ok. Es ist ein Gratisprogramm, da darf der Hersteller ruhig ein wenig nerven, um einen Kaufanreiz zu setzen. Mit zunehmender Nutzung fing ich auch an, die Bilder gleich in OsiriX zu speichern, OsiriX also als internes PACS zu benutzen. Das funktionierte, und ich fand es nun an der Zeit, den Hersteller zu bezahlen.

Der Preis ist mit $699 für nur zwei erlaubte Arbeitsstationen ein wenig happig (verglichen mit entsprechenden Windows-Programmen), aber noch akzeptabel. Aber auf der Website dann die böse Überraschung: aus den US$ 699 (== CHF 685) werden flugs, sobald man sich als in der Schweiz lebender Mensch outet, CHF 800.-. Also mehr als hundert Franken Aufschlag bloss wegen der Tatsache, dass man sich im selben Land befindet, wie der Programmhersteller (Pixmeo ist eine Genfer Firma). Und damit nicht genug: Nachdem ich mich mit dem (irgendwie ja auch gewohnten) Schweiz-Aufschlag abgefunden hatte, und zur Kasse ging, schlugen die Brüder noch einmal 20% “VAT” drauf, womit der Gesamtpreis auf CHF 960.- stieg. Vermutlich hätten sie für den Download noch Porto und Verpackung verrechnet, wenn mir an der Stelle nicht der Hut hochgegangen wäre.

Jedenfalls habe ich die Site dann verlassen und holte mir erst mal den Quellcode. (Hey, OsiriX ist ja immerhin OpenSource!) Da ich ja stolzer Besitzer einer aktuellen Version von Xcode bin, sollte das dann kein Problem sein. Denkste. Das Kompilieren klappt erst mal gar nicht. Und selbst wenn man es zum klappen bringt, kann man noch lange nicht für den aktuellen Mac mit 64 Bit compilieren. Man braucht eine alte Version mit 32 Bit. Die bietet Apple aber nicht mehr an. Und warum? Weil Pixmeo einige Komponenten nur als 32-Bit-Kompilat beilegt - in Verletzung der LGPL, unter der OsiriX publiziert ist.

Intermezzo

Heutzutage gibts ja Google. Und der spuckt bei der Suche nach freien OsiriX-Varianten zum Beispiel Osiri-LXIV und Horos aus. Beides sind 64-Bit Varianten von OsiriX, und beide funktionieren einwandfrei, wobei der von “64 Bit” erwartete Geschwindigeitsvorteil für mich zumindest nicht erkennbar ist. Aber Achtung:

  • Osiri-LXIV konvertiert beim ersten Start klammheimlich die OsiriX-Datenbank, so dass sie anschliessend von OsiriX nicht mehr lesbar ist

  • Horos legt eine eigene Datenbank an und berührt die von OsiriX nicht. Man kann aber einfach per copy&paste alles aus der OsiriX Datenbank in die Horos Datenbank kopieren, und dann macht Horos beim ersten Start ebenfalls die Konvertierung, lässt aber OsiriX lauffähig (wenn auch ein wenig redundant)

Crescendo

Je mehr Bilder man ansammelt, desto träger und wackliger wird OsiriX. Ein Versprechen der 64-Bit Version ist ja, dass sie besser mit grossen Fallzahlen zurechtkommt. Das bewahrheitet sich zumindest für Horos und Osiri-LXIV nicht. Während sie als Viewer durchaus brauchbar sind, sind sie doch immer noch kein “erwachsenes” PACS. Kein Wunder, bei der darunterliegenden SQLite-Datenbank, die nicht wirklich für viele grosse Dateien geeignet ist.

Glissando

Es gibt ein durchaus für fast beliebig grosse Datenbanken geeignetes PACS, das erst noch gratis ist. Es hat nur zwei Nachteile: Einen etwas sperrigen Namen (dcm4chee) und eine für unsereinen kaum verständliche Dokumentation. Dcm4chee ist noch viel mehr, als nur ein Dicom-Server, aber eben, es ist auch ein brauchbarer Dicom-Server.

Wenn man heutzutage eine Serveranwendung ohne allzuviel Stress installieren will, dann lohnt es sich, erstmal auf Dockerhub nachzusehen. Über Docker habe ich an anderer Stelle schon berichtet. Und wie so oft wird man recht schnell fündig: Es gibt einen fixfertig konfigurierten Dcm4chee-Server, den der freundliche User mit dem schönen Namen ‘sparklyballs’ gratis bereitstellt.

Finale

Damit ergänzt sich also nun meine docker-compose.yml um folgenden Eintrag:

     pacs:
       image: sparklyballs/pacs
       ports:
         - 8100:8080
         - 11112:11112
       volumes:
         - /mnt/usb4t/pacs:/config

So kommt die PACS-Datenbank auf meinem gespiegelten ZFS-Laufwerk zu liegen und wird so hoffentlich nicht gleich beim ersten Lesekopfschnupfen in die ewigen Jagdgründe geschickt. (Und wenn doch, habe ich selbstverständlich immer noch ein Backup)

Um nun mit meiner Arbeitsstation darauf zuzugreifen, muss man immer beiden Seiten des Dicom-Transfers die jeweils andere Seite bekannt machen. Also in OsiriX/Osiri-LXIV/Horos muss man in Preferences-Locations den Node “DCM4CHEE” auf 192.168.0.1 (oder wo auch immer) eintippen und die Modalitäten ‘Q&R’ und ‘Send’ aktivieren. Und man muss in http://192.168.0.1:8100/dcm4chee-web3 unter “AE-Verwaltung” den ‘AET’ ‘Horos’ oder was immer an der Adresse 192.168.0.12 (oder was immer) angeben. Erst dann klappt die Kommunikation (Es müssen Name, Adresse un Port des jeweiligen Nodes übereinstimmen).

Wenn man das gemacht hat, kann man die Serien aus der OsiriX Datenbank ganz einfach mit Drag&Drop auf den neuen PACS schieben und fortan von dort aus auch wieder holen.