Verteilte Generierung von Zufallszahlen
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
--Gehrke (Diskussion) 07:39, 6. Jan. 2015 (CET)
Für die Generierung von Zufallszahlen bietet Linux die beiden Pseudo-Devices 'random' und 'urandom' an. Sie unterscheiden sich in der Qualität des Ergebnisses und der Performance. So bietet 'random' eine bessere Zufälligkeit, ist aber sehr viel langsamer und blockiert bei mangelnder Entropie auch mal komplett für längere Zeit. Bei Dimensionen aktueller Datenträger im Terabyte-Bereich ist das viel zu langsam, so dass häufig 'urandom' zum Einsatz kommt.
Aber selbst damit kann mit handelsüblichen Prozessoren das Beschreiben einer solchen Festplatte mehrere Tage dauern. Abhilfe kann es sein, diese Aufgabe auf mehrere Rechner zu verteilen und die Ergebnisse über das Netz auf die Festplatte zu schreiben, wodurch die Gesamtdauer des Prozesses verkürzt wird. Hierzu kann neben 'dd' das Tool ssh verwendet werden, dessen Aufgabe es ist, die Daten über das Netzwerk zu transportieren und an den dd-Prozess auf dem Zielsystem zu übergeben. Dieses Verfahren ist skalierbar, so dass mehrere Computer an der Berechnung der Zufallszahlen beteiligt werden können.
Beispiel:
In diesem Beispiel ist '/dev/sdf' die Festplatte auf dem Zielsystem 'j4', welche beschrieben werden soll. Feststellen der Festplatten-Kapazität:
[root@j4 ~]# fdisk -l /dev/sdf | grep 'Platte /dev/sdf:' Platte /dev/sdf: 4000.8 GByte, 4000787030016 Byte
Bei einer gewählten Blockgröße von 8 Kilobytes bzw. 8x1024 Bytes (bs=8K) teilt sich die Gesamtkapazität in 488377323 Blöcke auf. Diese müssen auf die Anzahl der teilnehmenden Rechner verteilt werden. Je nach Leistungsstärke der beteiligten Systeme muss hierbei nicht unbedingt eine Gleichverteilung angestrebt werden. Im vorliegenden Fall sollen neben dem Server 'j4' noch 2 weitere Rechner ('j2', 'j3') für diese Aufgabe verwendet werden. In vorigen Versuchen wurde die Leistungsfähigkeit der einzelnen Systeme bestimmt und die Anteile berechnet:
System | Durchsatz urandom [MB/sec] | Anteil [%] | Anzahl Blöcke | Start-Block | End-Block |
---|---|---|---|---|---|
j2 | 11,1 | 44,6 | 217710373 | 0 | 217710373 |
j3 | 6,1 | 24,5 | 119642637 | 217710373 | 337353010 |
j4 | 7,7 | 31,0 | 151024313 | 337353010 | 488377323 |
Gesamt | 24,9 | 100 | 488377323 |
Zuerst wird auf 'j4' der Prozess ohne Netzwerk gestartet:
[root@j4 ~]# dd bs=8K seek=337353010 count=151024313 if=/dev/urandom of=/dev/sdf
Auf den anderen beiden Systemen wird der Prozess über ssh getunnelt:
gehrke@j2:~> BS=8K; dd if=/dev/urandom bs=$BS | ssh root@j4 "dd of=/dev/sdf bs=$BS seek=0 count=217710373"
gehrke@j3:~> BS=8K; dd if=/dev/urandom bs=$BS | ssh root@j4 "dd of=/dev/sdf bs=$BS seek=217710373 count=119642637"
Hinweise:
- Parametrisierung: Positionierung innerhalb des Datenstroms
- Fortschrittsanzeige via Signal 10 (SIGUSR1)
Achtung: |
Für die hier vorgestellte Methode ist es notwendig, dass der ssh-Zugang für den root-User gegeben ist. Dies kann je nach Anwendungsfall ein Sicherheitsrisiko darstellen. Es sollten entsprechende Maßnahmen ergriffen werden, die daraus resultierenden Gefahren abzuwehren (beispielsweise per Firewall-Regel, PublicKey-Authentifizierung, IP-basierter Konfiguration oder temporärer Zulassung). |