[Next] [Up] [Previous]
Hoch: www.jonietz.de

LorM-Logo
LORD OF READONLY MEDIA

ENTWICKLUNG EINES
LOW-COST-CD-SERVERS

Ansgar Jonietz[+]

Dezember 1999

Inhalt

1 Einleitung.

Viele Programme werden auf einer oder mehreren CD-ROMs ausgeliefert. Häufig wird bei der Installation dieser Programme nur ein Bruchteil der Daten auf die Festplatte kopiert; um den vollständigen Datenbestand nutzen zu können, muss die entsprechende CD in das Laufwerk eingelegt werden. Einige Enzyklopädien sind auf mehreren CDs untergebracht, bei Suchanfragen und Recherchen müssen diese CDs häufig gewechselt werden.

Als ich diese Anwendungen - zum Teil auch gleichzeitig - einsetzte, wurde ich schnell zu einem unfreiwilligen ,,Disk-Jockey``. Da diese ständigen CD-Zugriffe nicht nur meine Nerven, sondern auch die Laufwerksmechanik belasten, begann ich, nach Alternativen zu diesen ständigen CD-Wechseln zu suchen.

Um CDs seltener wechseln zu müssen, kann man natürlich zusätzliche CD-Laufwerke einbauen. Dann könnte zum Beispiel die Betriebssystem-CD immer in einem Laufwerk eingelegt bleiben. Diese Idee scheitert aber an der durch Schnittstellen und Gehäuseplätze beschränkten Anzahl an Laufwerken.

Eine andere Möglichkeit besteht in sogenannten ,,CD-Server``. Sie werden von verschiedenen Firmen angeboten und haben mehrere CD-Laufwerke, auf die über ein lokales Netz zugegriffen werden kann. Diese Systeme haben den großen Vorteil, dass durch die Netzwerkfähigkeit auch mehrere Benutzer gleichzeitig auf dieselben oder verschiedene CDs zugreifen können. Während diese Funktion bei privater Nutzung seltener gebraucht wird, ist sie in Firmen oder auch in Schulen besonders wichtig. Dort kann durch den Verzicht auf lokale Laufwerke gespart werden; ausserdem wird (besonders in der Schule) die Installation von Spielen etc. eingeschränkt.[+] Der Nachteil dieser CD-Server ist ihr hoher Preis. So bietet beispielsweise die Fa. AXIS COMMUNICATIONS einen CD-Server mit 7 Laufwerken und 10 MBit Netzinterface für 3995,- DM an, mit 10/100 MBit Netzkarte kostet er 4995,- DM.[+] Diese Preise sind vielleicht für Firmen akzeptabel, für den privaten Einsatz aber zu hoch.

,,CD-Jukeboxen`` stellen eine Abwandlung dieser CD-Server dar, sie verfügen intern über ein mechanisches Wechselsystem und nur wenige Laufwerke. Dadurch bedingt ist die Anzahl der gleichzeitig genutzten CDs begrenzt und die Wechselzeit zwischen verschiedenen CDs ist recht hoch. Doch auch diese Systeme sind teuer; so kostet eine CD-Jukebox der Fa. SONY mit zwei Laufwerken für 100 CDs etwa 5900,- DM (siehe [3]).

Preiswerter sind reine Softwarelösungen: Dabei wird erst von jeder CD ein Image auf der Festplatte angelegt. Auf dieses Image kann wie auf ein echtes CD-Laufwerk zugegriffen werden. Begrenzt ist hier die Anzahl der verfügbaren CDs neben der Festplattenkapazität nur durch die Laufwerksbuchstaben, von denen oft etwa 20 zur Verfügung stehen. Der Vorteil dieser Software ist der geringe Preis: Die Firma MICROTEST bietet das Programm ,,VIRTUAL CD`` für nur 89,90 DM an (s. [4]). Diese Programme bieten aber meist keine Netzwerkfähigkeit, so dass auf jedem Computer im Netz die CD-Images vorhanden sein müssen.

Ideal wäre also ein Netzwerkserver, der viele CD-ROMs möglichst schnell in einem lokalen Netz zur Verfügung stellen kann und nebenbei auch leicht zu bedienen ist. Ziel dieser Arbeit ist es, einen preisgünstigen (,,low-cost``) CD-Server mit diesen Eigenschaften zu entwickeln. Diesem Server habe ich den Namen ,,LorM`` gegeben. ,,LorM`` steht für Lord of readonly Media. (Dt. etwa: Herr der nur lesbaren Medien.)

2 Vorüberlegungen.

2.1 Möglichkeiten zur Abbilderstellung.

Der Zugriff auf die CDs kann erheblich beschleunigt werden, wenn jede CD auf die Festplatte des Servers kopiert wird, denn die Leseköpfe von Festplatten können sich viel schneller bewegen als die von CD-Laufwerken. Der Server braucht dazu nur ein CD-Laufwerk, allerdings zusätzlich eine große Festplatte.

Zur Abbilderstellung gibt es zwei Möglichkeiten:

2.2 Hardware.

Die meisten der kommerziellen CD-Server sind aus teuren Spezial-Bauteilen zusammengesetzt. Bei der Benutzung eines Standard-PC's können jedoch einzelne Elemente - nicht nur vom Fachmann - modular ausgewechselt werden. Solch ein PC kann sich als CD-Server auf das Notwendigste beschränken: er braucht neben Hauptplatine, Prozessor und Speicherbausteinen eine Festplatte, eine Netzkarte und ein CD-Laufwerk. Eine Grafikkarte ist nur zur Installation nötig, alle Einstellungen können später über das Netz von einem anderen Computer aus vorgenommen werden.

Da beim Erstellen von Kopien auf die Festplatte nur ein CD-Laufwerk benötigt wird, kann auch beim Controller gespart werden: auf der Hauptplatine ist oft bereits ein IDE-Controller vorhanden, mit dem sich bis zu vier Laufwerke ansteuern lassen. Sollen mehr Laufwerke angeschlossen werden, muss das teurere SCSI-System[+] verwendet werden. Mein CD-Server kann also auf SCSI verzichten und einen Onboard-IDE-Controller verwenden.

2.3 Software.

Die Anforderungen an das Betriebssystem sind recht hoch: es muss Netzfunktionen haben, möglichst stabil und sicher laufen und preisgünstig sein. DOS scheidet wegen der fehlenden Netzfunktionen aus, MS WINDOWS bietet diese zwar, aber ein ,,stabiles und sicheres`` System ist es mit Sicherheit nicht.[+] Ideal scheint hier Linux[+] aus dem Freeware-Bereich. Das PC-Unix hat sehr vielfältige Netzfunktionen, läuft sehr stabil und sicher. Linux wird unter der GNU General Public License vertrieben und ist kostenlos erhältlich.

Linux kann von Haus aus neben normalen Kopien auch Images erstellen, auf anderen Systemen müsste ich für diese Funktionen auf Produkte von Drittanbietern zurückgreifen oder mir selbst eine Lösung programmieren. Desweiteren verfügt es mit der bash[+] über eine Shell mit einer sehr leistungsfähigen Skript-Sprache, die alle Standardelemente einer Programmiersprache wie Variablen, Schleifen etc. beherrscht (s. [1]). Dadurch kann ich auf eine zusätzliche Sprache verzichten. Linux ist ein Multiuser-System; es kann von verschiedenen Benutzern mit unterschiedlichen Rechten benutzen werden. Für den CD-Server ist das notwendig, da nur die Administratoren CDs anlegen oder löschen dürfen sollen, der normale Benutzer soll nur lesend zugreifen dürfen.

In dieser Shell-Sprache schreibe ich - wie unter Linux üblich - ein Programm, das vorerst nur über die Kommandozeile bedient werden kann. Grafische Benutzeroberflächen, z.B. ein Webinterface, können auf dieses Programm im Hintergrund zugreifen.

Mit diesem Skript soll es möglich sein, CDs auf Festplatte zu speichern und wieder zu löschen. Weiterhin ist eine Möglichkeit zur Auflistung aller eingespielten CDs sinnvoll.

Auf der Client-Seite kommt als Betriebssystem am häufigsten MS WINDOWS in den verschiedensten Versionen vor. Für Linux gibt es das Paket SAMBA, mit dem ein Windows-Server simuliert wird. Dadurch können alle Betriebssysteme, für die es einen Client für das MICROSOFT NETZWERK gibt, auf die CDs zugreifen. Zu diesen Systemen zählen zum Beispiel WINDOWS 3.11, WINDOWS 95/98, WINDOWS NT und WINDOWS 2000. Auch andere Linux-Rechner können (z.B. über einen SAMBA-Client) den Server nutzen.

Unter Linux müssen die erstellten Images zur Benutzung noch in den Verzeichnisbaum eingehängt (,,angemountet``) werden, dazu werden die sogenannten Loop-Devices verwendet. Dabei wird für jedes Image eines dieser Devices gebraucht. Doch die Anzahl der Loop-Devices ist beschränkt, so stehen unter den meisten Distributionen nur 8 zur Verfügung. Mit einer Änderung im frei verfügbaren Quellcode von Linux kann man diese Anzahl auch erhöhen, doch danach muss der Kernel neu compiliert werden. Dies ist allerdings sehr aufwendig. Da dieses Problem bei einfachen Kopien nicht auftritt, da auf die CDs direkt und ohne Anmounten zugegriffen werden kann, möchte ich sowohl Kopien als auch Images in meine Programme implementieren. Dem Benutzer soll freigestellt sein, welche der Methoden er verwenden möchte.

2.4 Vereinbarungen.

Auf dem Server verwende ich SUSE LINUX in der Version 6.1, andere Distributionen sollten sich ähnlich verwenden lassen. Als Stammverzeichnis für den CD-Server habe ich /cdroms festgelegt. Unterhalb dieses Verzeichnisses sollen alle CDs, Programme und Konfigurationsdateien gespeichert werden. Sollen diese Daten vom System getrennt auf einer zweiten Festplatte oder Partition liegen, so muss diese Partition auf /cdroms gemountet werden.

Wie die meisten anderen Linux-Programme soll auch mein Skript wichtige Aktivitäten und Ereignisse in einer Datei (/var/log/cdrom/cdrom.log) protokollieren. Zu jedem Vermerk soll auch das Datum und die Uhrzeit geschrieben werden.

Zur Verwaltung der CD-ROMs führt der Server im Verzeichnis /cdroms eine Konfigurationsdatei cdroms.conf, in der alle eingespielten CDs vermerkt sind. Dabei entspricht jede Zeile einer CD, die einzelnen Werte sind durch Doppelpunkte voneinander getrennt. Eine Zeile hat folgendes Format:

CD-Name:Label:Kommentar:Aktiviert

Dabei meint ,,CD-Name`` den Namen der CD, über den sie auch im Netz zur Verfügung steht. ,,Label`` ist die Zeichenkette, die ein Programm beim Zugriff auf die Datenträgerbezeichnung einer CD erhält. Manche Programme benutzen diese Bezeichnung als Kopierschutz. In der Variablen ,,Kommentar`` können zu jeder CD ergänzende Informationen angegeben werden. ,,Aktiviert`` kann die Werte y (yes) und n (no) erhalten. Damit können CDs vorübergehend nicht zur Verfügung gestellt werden. Dabei ist es nicht nötig, die CD zu löschen und danach neu anzulegen, stattdessen muß sie lediglich deaktiviert werden.

  Überbluck
Abbildung 1: Schematischer Aufbau des CD-Servers.

Abbildung 1 zeigt das prinzipielle Schema meines CD-Servers LorM. Einem Client unter dem Betriebssystem MS WINDOWS werden mittels SAMBA die in sharecds aufgeführten CD-ROMs zur Verfügung gestellt. Dazu liest der Server eine CD vom CD-Laufwerk ein und legt davon entweder eine Kopie oder ein Image auf seiner Festplatte an. Die zugehörigen Parameter werden ermittelt und in cdroms.conf eingetragen.

3 Kommandozeilen-Tools.

3.1 Hilfsprogramme.

Da Linux ein sehr sicheres System ist, gestattet es dem normalen Anwender nicht, sicherheitsrelevante Programme auszuführen. So darf beispielsweise nur der Superuser root Images anlegen. Da der Verwalter des CD-Servers nicht immer als root eingeloggt sein sollte, müssen diese Dienste auch anderen Benutzern zur Verfügung gestellt werden. Zu diesem Zweck benutze ich das Paket sudo, mit dem normale User bestimmte (von root festgelegte) Befehle mit root-Rechten ausführen dürfen.

Daher schreibe ich vorab einige kleinere Skripte, die vom Hauptprogramm mittels sudo aufgerufen werden. Da diese Skripte nur intern benutzt werden, kann ich hier auf Sicherheitsüberprüfungen der übergebenen Parameter verzichten.

Die Quelltexte der Hilfsprogramme sind vollständig im Anhang A.1 ab Seite [*] abgedruckt.

3.2 Hauptprogramm.

Das Hauptprogramm befindet sich in der Datei /cdroms/cdrom und ist im Anhang A.2 auf Seite [*] abgedruckt.

Das Skript soll nie zweimal gleichzeitig aufgerufen werden. So vermeide ich Probleme, die beispielsweise dann entstehen würden, wenn eine CD, die gerade angelegt wird, von einem anderen Benutzer gelöscht wird. Dazu legt es eine Linux-typische ,,Lock``-Datei /var/lock/cdrom/locked an. Wenn diese Datei beim Programmstart bereits existiert, verweigert es seinen Dienst und notiert es in der Log-Datei. Gibt es sie nicht, so wird sie angelegt und beim Beenden des Skriptes wieder gelöscht.[+]

Nach dieser Überprüfung beginnt eine Fallunterscheidung des ersten Parameters; er bestimmt, welche Funktion des Skriptes genutzt wird. Ich habe jeweils mehrere Möglichkeiten definiert, so kann z.B. die Kurzschreibweise mit - oder die ausführliche mit - angegeben werden. Diese mehreren Möglichkeiten sind bei der Angabe der Syntax durch das Zeichen | getrennt, das als ,,oder`` gelesen werden kann. Platzhalter kennzeichne ich durch spitze Klammern <Variable>.

3.2.1 Kopie anlegen: cdrom -add|add|-a|a|+ <name>

Die Funktion zum Erstellen einer Kopie erwartet als zweiten Parameter den Namen der Kopie, fehlt dieser, so bricht das Programm ab. Als nächstes wird überprüft, ob es schon eine CD mit gleichem Namen gibt, dazu wird die erste Spalte von cdroms.conf durchsucht. Falls der angegebene CD-Name einen Doppelpunkt enthält, wird ebenfalls abgebrochen, da dieser Doppelpunkt als Trennzeichen in cdroms.conf verstanden wird.

Dann wird das CD-Laufwerk mit dem Kommando mount angemountet, wie bei den meisten Befehlen wird danach überprüft, ob ein Fehler aufgetreten ist. Wenn dies der Fall ist, so wird die Lock-Datei gelöscht und das Programm mit einem Fehlercode beendet. Andernfalls werden die Daten von der CD-ROM mit cp kopiert und danach die CD mit umount wieder abgemountet.

Mit dem Hilfsprogramm rights werden dann die Rechte der entstandenen Kopie geändert. Da die Images noch an einen Mountpoint (cdroms/mntpoints) gemountet werden müssen, dies bei Kopien aber nicht nötig ist, wird hier ein sogenannter ,,Link`` erstellt. Dieser Link wird mit ln in /cdroms/mntpoints angelegt und verweist auf die Kopie in /cdroms/images. Dadurch kann man immer auf die Verzeichnisse in .../mntpoints zugreifen und erhält den CD-Inhalt, sowohl bei Images als auch bei Kopien.

Anschließend wird noch eine Zeile an die Konfigurationsdatei cdroms.conf angehängt, dort wird als CD-Name der mit dem zweiten Parameter angegebene Name verwendet, Label und Kommentar werden von der CD ausgelesen, dazu werden dem Skript readinfo die Zahlen 32808 und 32 bzw. 33086 und 128 übergeben. Diese Zahlen ergeben die Datenträgerbezeichnung und die Firma, die die CD hergestellt hat. Standardmäßig wird jede CD aktiviert. Nach dieser Änderung wird noch das Skript refresh aufgerufen, dann steht die CD im Netz zur Verfügung.

3.2.2 Image erstellen: cdrom -addimage|addimage|-ai|ai|+i <name>

Das Verfahren zum Erstellen von Images ist weitgehend mit dem Anlegen einer Kopie identisch. Hier wird das CD-Laufwerk allerdings nicht an- und abgemountet, denn zum Erstellen von Images wird direkt auf das Gerät zugegriffen. Das Image wird mit dem über sudo gestarteten Hilfsprogramm makeimage erstellt. Als nächstes wird das Verzeichnis /cdroms/mntpoints/$2 als Mountpoint angelegt, $2 als Mountpoint angelegt, $2 steht für den zweiten Parameter. Dann wird das Image durch das Skript mountimage angemountet und die Konfigurationsdatei wie oben geändert. Nach einem refresh-Aufruf kann auf die CD-ROM zugegriffen werden.

3.2.3 Entfernen von CDs: cdrom -remove|remove|-rm|rm|- <name>

Bei der Funktion zum Löschen einer CD wird ähnlich wie beim Anlegen von Images und Kopien zunächst überprüft, ob ein zweiter Parameter angegeben ist und eine CD mit diesem Namen tatsächlich existiert. Dann wird überprüft, ob die CD ein Image oder eine Kopie ist, dazu wird, wie beim Skript refresh, getestet, ob /cdroms/images/$2 eine Datei ist. Wenn das so ist, dann ist die CD in einem Image gespeichert und dieses wird mit umountimage abgemountet. Danach wird der Mountpoint /cdroms/mntpoints/$2 eine Datei ist. Wenn das so ist, dann ist die CD in einem Image gespeichert und dieses wird mit umountimage abgemountet. Danach wird der Mountpoint /cdroms/mntpoints/$2 gelöscht. Hier brauche ich keine Fallunterscheidung, da sowohl das Verzeichnis des Images als auch der Link der Kopie so gelöscht werden kann. Auch die CD selbst kann so gelöscht werden, denn auch die Unterverzeichnisse der Kopie werden mitgelöscht.

Nun muss noch die entsprechende Zeile aus cdrom.conf entfernt werden; dazu kopiere ich die Datei erst in die Datei cdroms.temp.conf, um sie danach zeilenweise neu aus ihr zu erstellen. Dabei lasse ich die gesuchte Zeile einfach weg. Anschliessend wird die temporäre Datei wieder gelöscht und refresh ausgeführt.

3.2.4 Umbenennen von CDs:
cdrom -rename|rename|-rn|rn <altname> <neuname>

Zum Umbenennen von Images oder Kopien muss der alte und der neue Name der CD angegeben werden. Als erstes wird hier getestet, ob alle Parameter angegeben sind, ob es die umzubenennende CD überhaupt gibt, ob es schon eine CD mit dem neuen Namen gibt und ob dieser neue Name Doppelpunkte enthält. Dann wird überprüft, ob die CD in einer Image-Datei gespeichert ist oder einfach kopiert wurde.

Bei einem Image wird dieses zuerst mit umountimage abgemountet. Dann werden Mountpoint und die Image-Datei umbenannt. Wenn das Image in cdroms.conf als aktiviert angegeben ist, wird es danach wieder angemountet.

Bei einer Kopie wird zuerst der Mountpoint bzw. der Link gelöscht, dann wird die CD in /cdroms/images/2 mit dem Kommando mv (move) umbenannt. Anschliessend wird ein neuer Link erstellt.

Danach muss die Konfigurationsdatei noch geändert werden. Dazu wird die Zeile mit den Einstellungen für die CD in der Variable oldconfstring gespeichert. Dann wird wie beim Löschen einer CD die gesamte Zeile aus der Datei gelöscht und anschließend wieder neu angefügt - allerdings mit dem neuen Namen in der ersten Spalte. Das hat den Vorteil, dass die anderen Einstellungen wie Kommentar etc. beibehalten werden.

3.2.5 Reparieren der Konfiguration: cdrom -repair|repair|-r|r

Falls bei der Ausführung einer der vorherigen Funktionen ein Fehler auftreten sollte, wird sofort das Skript beendet, aber der Urzustand wird nicht wiederhergestellt. So kann es zum Beispiel vorkommen, dass nach dem Erstellen einer Kopie einer CD diese durch einen Fehler nicht in cdroms.conf eingetragen wird. Auch wenn der Benutzer manuell eingreift und z.B. Dateien löscht, oder wenn der Rechner abstürzt, kann es zu Fehlern kommen. Deswegen schreibe ich eine zentrale Funktion, die nach solchen Fehlern sucht und sie gegebenfalls korrigiert. Die Benutzung dieser Funktion wird in der Log-Datei protokolliert. Sollte auch bei einem Korrekturversuch ein Fehler auftreten, so soll sich das Skript nicht wie bei den anderen Funktionen beenden, sondern nur die Fehler auf den Bildschirm und in cdrom.log schreiben.

Als erstes wird für alle CDs in cdroms.conf überprüft, ob es überhaupt ein Abbild mit dem angegebenen Namen gibt. Existiert es nicht, dann wird der Eintrag in cdroms.conf entfernt. Existiert es, so wird geprüft, ob ein Mountpoint existiert. Wenn dies nicht der Fall ist, so wird er erstellt. Dabei wird wiederum unterschieden, ob ein Verzeichnis für ein Image oder ein Link für eine Kopie erstellt wird.

Dann wird überprüft, ob jedes Image und jede Kopie in /cdroms/images in die Konfigurationsdatei eingetragen ist. Wenn nicht, wird es getan; dabei werden für CD-Name, Label und Kommentar jeweils der Name der CD angegeben.

Als nächstes wird untersucht, ob jedes Image angemountet ist. Dazu wird die Ausgabe des Befehls mount, der ohne Parameter alle angemounteten Dateisysteme anzeigt, nach jedem Image-Namen durchsucht. Die Images, die nicht angemountet sind, werden mit mountimage angemountet.

Schließlich wird noch überprüft, ob zu jedem Mountpoint eine CD gehört. Wenn es einen Eintrag in /cdroms/mntpoints gibt, für den es kein Image und keine Kopie mit gleichem Namen gibt, dann wird dieses Verzeichnis oder der Link gelöscht.

Damit die Änderungen an der Konfigurationsdatei wirksam werden, wird anschließend refresh aufgerufen.

3.2.6 Auflisten aller CDs: cdrom -list|list|-l|l

Mit einem der obigen Parameter wird eine Liste aller CDs auf die Standardausgabe geschrieben. Neben dem CD-Namen werden das Label und der Kommentar angezeigt. Ausserdem wird für jede CD angegeben, ob sie aktiviert ist oder nicht und ob sie als Image oder Kopie gespeichert ist.

Dazu werden die einzelnen Zeilen in /cdroms/cdroms.conf ausgegeben; statt der Doppelpunkte zur Trennung der Spalten werden wegen der besseren Lesbarkeit allerdings Kommata verwendet. Wie oben schon beschrieben wird dann noch getestet, ob jede CD ein Image oder eine Kopie ist und das Ergebnis ausgegeben.

3.2.7 Anzeigen des Hilfe-Screens: cdrom -help|help|-h|h|-?|?|-

Wenn der Anwender einen unbekannten Parameter * angibt, wird eine Liste aller möglichen Parameter und der weiteren Syntax angezeigt. Dieser Hilfe-Screen kann auch direkt über spezielle Parameter erreicht werden, die Ausgabe kann dem Quelltext im Anhang A.2 entnommen werden.

4 Geschwindigkeit.

Besonders interessant ist die erreichte Übertragungsgeschwindigkeit bei CD-Zugriffen, denn - wie schon beschrieben - liest mein Server die Daten von seiner Festplatte und nicht wie die meisten herkömmlichen CD-Server direkt von CD-Laufwerken. Um die Geschwindigkeit zu messen, überlegte ich mir einige Testaufbauten mit verschiedenen Servern und verschiedenen Clients. Die Tabellen mit den Messwerten sind im Anhang B ab Seite [*] abgedruckt.

Bei allen Versuchen verwendete ich dieselbe CD: ,,Das große Wörterbuch der deutschen Rechtschreibung`` von der mediaGlobe GmbH Düsseldorf. Ich wählte diese CD aus, da sie neben einer sehr großen Datei mit etwa 142 MByte kleinere Dateien verschiedenster Größen enthält.[+]

4.1 AXIS Storpoint versus LorM.

In einer ersten Versuchsreihe vergleiche ich meinen Server mit Storpoint, einem CD-Server der Fa. AXIS COMMUNICATIONS. Dieser Server verfügt über sieben CD-Laufwerke, auf die direkt über eine 10 MBit/s-Netzkarte zugegriffen wird. Der Server wurde mir freundlicherweise vom St.-Willibrord-Gymnasium Bitburg für meine Tests zur Verfügung gestellt.[+]

Meine selbstentwickelte Serversoftware läuft auf einem etwas betagten 486er mit 80 MHz Taktfrequenz und 24 MByte Hauptspeicher. Als Festplatte verwende ich ebenfalls ein älteres Modell mit 1,6 GByte Kapazität, von denen Linux 800 MByte zur Verfügung stehen. Auch hier ist eine 10 MBit/s-Netzkarte eingebaut.

Als Client benutze ich in beiden Versuchen einen Rechner mit einem MOBILE PENTIUM III 500-Prozessor und 128 MByte Hauptspeicher. Als Netzkarte kommt eine 10/100 MBit/s-Karte im PCMCIA-Format zum Einsatz, als Betriebssystem wird MS WINDOWS 98 verwendet.

Für die Tests habe ich eine DOS-Batchdatei geschrieben, sie ist im Anhang A.4 auf Seite [*] abgedruckt. Diese Datei speichert zuerst die aktuelle Uhrzeit in die Datei startz, kopiert dann die mit dem ersten Parameter angegebene Datei nach nul, also irgendwohin ins ,,Datennirvana``, speichert wieder die Zeit (in stopz) und gibt beide Uhrzeiten auf dem Bildschirm aus. Aus diesen beiden Uhrzeiten errechne ich dann die Differenz und erfahre so die Übertragungszeit der angegebenen Datei.

Der Server ist bei jedem Test über ein gekreuztes Twisted-Pair-Kabel direkt mit dem Client verbunden, die Daten gehen nicht über einen Hub. So vermeide ich Verfälschungen der Messergebnisse, z.B. durch Kollisionen mit Paketen anderer Rechner. Vom Client aus habe ich dann 4 Dateien mit unterschiedlichster Größe kopiert, jeweils die Übertragungszeit gemessen und die Übertragungsrate errechnet.

Ursprünglich wollte ich jede Datei mehrfach hintereinander übertragen und dann die durchschnittliche Übertragungszeit berechnen, doch ich musste feststellen, dass WINDOWS die Dateien in einem Cache zwischenspeichert. Für richtige Ergebnisse kann ich jede Datei nur einmal pro Sitzung vom gleichen Client laden.

  Diagramm 1
Abbildung 2: Übertragungsraten bei unterschiedlichen Dateigrößen.

Wie aus Abbildung 2 ersichtlich, erreicht mein Server bei kleinen Dateien eine erheblich höhere Übertragungsrate als der Storpoint. Dies erkläre ich mir damit, dass der Storpoint erst sein CD-Laufwerk hochfahren muss, während von Festplatte direkt gelesen werden kann. Bei sehr großen Dateien hat mein Server eine etwas niedrigere Übertragungsrate, dies ist wahrscheinlich durch die von mir verwendete alte Hardware bedingt.

Bei Ethernet wird von einer praktischen maximalen Übertragungsrate von 40 % der theoretischen Leistung ausgegangen (siehe [7]). Bei einem 10 MBit/s-Ethernet können also tatsächlich nur 4 MBit in der Sekunde übertragen werden, das entspricht 512 kByte/s. Diese praktische maximale Übertragungsrate habe ich als Linie eingezeichnet. In dieser Rate sind aber schon die im normalen Netzbetrieb auftretenden Kollisionen miteingerechnet, die bei meinen Tests wegen der direkten Verbindung nicht auftraten, deswegen konnte ich höhere Übertragungsraten erreichen. Im normalen Betrieb haben diese höheren Übertragungsraten keinen Nutzen, da das Netz mit seinen Kollisionen das langsamste Glied ist, es bremst den Server aus. Erst in einem 100 MBit/s-Netz bringen diese Übertragungsraten eine höhere Geschwindigkeit.

4.2 Gleichzeitiger Zugriff mit mehreren Clients.

In einer zweiten Versuchsreihe möchte ich herausfinden, wie die Übertragungsrate mit der Anzahl der Clients abnimmt. Für diesen Test durfte ich freundlicherweise den Rechnerraum der Realschule Speicher nutzen.

Als Server kommt hier ein PENTIUM II zum Einsatz, der mit 450 MHz getaktet ist. Der Server hat 256 MByte Hauptspeicher und verfügt über eine moderne IDE-Festplatte und eine 100 MBit/s-Netzkarte. Er wird hauptsächlich als Datei- und Kommunikationsserver genutzt. Daher stehen, will ich ihn als CD-Server nutzen, nur ein Teil der Ressourcen zur Verfügung.

Als Clients kommt eine unterschiedliche Anzahl von baugleichen Geräten zum Einsatz. Sie verfügen über einen PENTIUM II 400 und haben 128 MByte Hauptspeicher. Auch sie haben eine 100 MBit/s-Netzkarte. Als Betriebssystem benutze ich hier MS-DOS.

Alle Geräte sind über einen Dualspeed-Hub sternförmig miteinander verbunden; dieser Aufbau entspricht einem normalen Netzbetrieb, so dass hier auch Kollisionen auftreten.

Da alle Clients gleichzeitig eine Datei vom Server kopieren sollen, überlegte ich mir, wie ich diesen synchronen Programmstart realisieren kann. Ich kam auf die Idee, ein Turbo-Pascal-Programm zu schreiben, das nur auf eine bestimmte Uhrzeit wartet und sich dann beendet. Verwende ich es in einer Batchdatei, so wird nach dem Beenden des Programms ein weiteres gestartet, z.B. zum Starten des Messvorgangs. Voraussetzung hierfür ist, dass alle Clients die gleiche Uhrzeit haben. Dies erreichte ich, indem ich alle internen Uhren (mit dem Befehl net time /set) mit der des Servers abgleiche. Das Pascal-Programm wait ist im Anhang A.4 abgedruckt. Es erwartet als Parameter die Uhrzeit im Format HH MM SS.

  Diagramm 2
Abbildung 3: Übertragungsraten bei mehreren Clients.

  Diagramm 3
Abbildung 4: Übertragungsraten bei unterschiedlichen Dateigrößen mit mehreren Clients.

5 Web-Interface.

Bis jetzt erfolgt die Verwaltung des CD-Servers wenig komfortabel über die Kommandozeile - um einen Kommentar zu einer CD einzugeben, muss der Anwender sogar Änderungen in der Konfigurationsdatei vornehmen. Wünschenswert wäre deshalb eine grafische Oberfläche, mit der man von jedem Client alle Einstellungen vornehmen kann. Diese Oberfläche soll plattformunabhängig sein, ein einfaches Windows-Programm kommt daher nicht in Frage.

Ideal ist hier ein Web-Interface, so kann man mit jedem Browser im Netz die Konfiguration ändern. Dazu gibt der Anwender im Browser einen URL der Form http://server-name ein und kommt direkt auf die Startseite des CD-Servers.

Dies wird durch einen Web-Server ermöglicht, der diese Web-Seiten im Intranet[+] zur Verfügung stellt. Mein Server benutzt wie die meisten anderen Linux-Rechner den Webserver APACHE, der ebenfalls unter der GPL steht und damit frei verfügbar ist.

Im Intranet soll z.B. der Serverstatus abgefragt werden können. Dazu wird die entsprechende Webseite - sobald sie angefordert wird - von einem Skript sofort mit aktuellen Daten generiert. So wird beispielsweise die Hauptspeicherauslastung mit dem Befehl mem abgefragt und das Ergebnis übersichtlich in die Webseite eingefügt. Diese Skripte nennt man CGI-Skripte[+], sie können - je nach den Möglichkeiten des Webservers - in den verschiedensten Sprachen programmiert werden. Ich verwende auch hier die Skriptsprache der bash. Diese Skripte geben den HTML-Code[+] aus, aus dem der Browser später die Seite aufbaut.

  Web-Interface
Abbildung 5: Schematischer Aufbau des Web-Interfaces.

Mit Formularen kann der Anwender im Browser auch Daten eingeben und vom Server bearbeiten lassen; so kann z.B. der Name für eine Kopie angegeben werden, die erstellt werden soll. Das CGI-Skript erhält diese Angaben als Parameter und kann sie weiterverarbeiten, beispielsweise um den Befehl zum Erstellen der Kopie zu geben.

Das Funktionsschema des Web-Interfaces habe ich in Abbildung 5 zusammengefasst. Die Daten, die der Anwender in HTML-Formulare eingibt, werden über TCP/IP an den Webserver übermittelt. Dieser gibt sie an ein Skript weiter, das sie weiterverarbeitet und aus den Ergebnissen eine Webseite generiert. Diese wird wieder über den Webserver an den Browser gesendet, er stellt die Seite dann dar.

Über das Web-Interface sind alle Funktionen des Kommandozeilen-Programmes cdrom nutzbar. Desweiteren können Einstellungen wie das Label einer CD verändert werden, das ist sonst nur durch eine Änderung in der Datei cdroms.conf möglich. Neben diesen Einstellungen direkt für den CD-Server könnten auch noch weitere systemweite Daten wie der Servername oder die IP-Adresse verändert werden. Dadurch könnte der Server ohne jegliche Linux-Kenntnisse auch an verschiedene Umgebungen angepasst werden. Durch diese zusätzlichen Einstellmöglichkeiten kann auf einen Monitor am Server vollständig verzichtet werden.

Da der Server nicht einfach ausgeschaltet werden darf, ist eine Funktion zum Herunterfahren von Linux sinnvoll; dadurch kann z.B. bei längerer Abwesenheit Strom gespart werden.

Aus Sicherheitsgründen sollten diese Webseiten natürlich nur nach Eingabe eines Passwortes zu erreichen sein, APACHE bietet auch dafür eine Möglichkeit (s. [8]). Diesen Schutz habe ich auf Teile des Web-Interfaces angewendet, andere Teile wie z.B. der Serverstatus sind ohne Passwort erreichbar. Natürlich bietet auch das Passwort keinen vollständigen Schutz, da alle Daten unverschlüsselt übers Netz übertragen werden, doch das Eindringen in den Server wird erschwert.

Das Web-Interface bietet auch die Möglichkeit, das CD-Laufwerk nur anzumounten und eine CD so temporär zur Verfügung zu stellen. Wird eine CD-ROM nur einmalig benötigt, muss so kein Abbild erstellt werden, der Zugriff direkt aufs Laufwerk wird ermöglicht.

6 Schlussbetrachtungen.

Ein nach meinem Prinzip gebauter CD-Server hat keine hohen Hardwareanforderungen, selbst ein alter 486er reicht vollkommen aus. Probleme dürfte es bei solch alten Geräten allerdings mit der notwendigen großen Festplatte geben. Deswegen hier eine kurze Aufstellung der Kosten für einen dedizierten CD-Server:[+]
Prozessor Intel Celeron 433 MHz 155,00 DM
Hauptplatine ASUS ME99 165,00 DM
Hauptspeicher DIMM 128 MByte 299,00 DM
Festplatte Seagate 20400 MByte, 8 ms, 7200 U/min 399,00 DM
Netzkarte D-Link 530TX, 10/100 MBit/s, RJ45, PCI 79,90 DM
CD-Laufwerk Acer 40fach 89,00 DM
Gehäuse Top IT TC 29K 159,00 DM
Summe 1345,90 DM

Teilweise habe ich hier sogar hochwertige Markenkomponenten berechnet, obwohl auch preiswertere Bauteile ausreichen. Gespart wird auch dadurch, dass keine Lizenzgebühren für die Software gezahlt werden müssen, da Linux unter der GPL steht und daher frei verfügbar ist. Auf die hier angegebene schnelle Festplatte lassen sich mindestens 31 CD-ROMs kopieren, doch da die meisten CDs ihre maximale Speicherkapazität von 650 MByte nicht ausnutzen noch etliche mehr.

Oft ist auch schon ein Linux-Server für andere Zwecke vorhanden, der dann auch die Funktion des CD-Servers übernehmen kann, es ist kein zweiter Server nötig. Der beschriebene Server der Realschule Speicher kann nun auf diese Weise als CD-Server mitgenutzt werden.

Selbstverständlich müssen bei den CDs, die anderen Computern zur Verfügung gestellt werden, die Bedingungen der erworbenen Lizenz beachtet werden. Für den Zugriff von mehreren Geräten muss meist eine Netzwerklizenz vorhanden sein. Die von mir benutzte Test-CD der Firma mediaGlobe GmbH habe ich nur exemplarisch genannt und den rechtlichen Hintergrund nicht überprüft. Sollte für eine CD nur eine beschränkte Anzahl an Lizenzen zur Verfügung stehen, so kann mit dem SAMBA-Befehl max connections die Anzahl der gleichzeitigen Zugriffe auf eine CD beschränkt werden, eine Idee für die nächste Version meiner Serversoftware.

Ein Vorteil anderer CD-Server ist, dass sie meist einfach ausgeschaltet werden können, während mein Server vorher übers Netz von einem anderen Rechner heruntergefahren werden sollte, damit Linux sich ordnungsgemäß beendet. Deshalb würde der Server wohl immer eingeschaltet bleiben. Da er aber nur einen Teil der Zeit genutzt wird, wäre es sinnvoll, wenn er sich selbständig in einen Energiesparmodus schalten würde. Moderne Hardware hat schon diese Funktionen, doch leider scheitert es noch an der Software, da insbesondere Linux momentan nur sehr begrenzt mit dieser Hardware umgehen kann.[+]

Ich sehe daher das Ziel meiner Arbeit erreicht: Der von mir entwickelte CD-Server steht den existierenden kommerziellen Angeboten weder in der Anwenderfreundlichkeit noch in der Zugriffsgeschwindigkeit auf die CDs nach, er kann mehr CDs speichern und kostet nur einen Bruchteil.

A Die Quelltexte.

Weil einige der Quelltext-Zeilen länger sind als eine DIN A4-Seite breit ist, habe ich die Zeilen umgebrochen. Diese Stellen sind mit einem %-Zeichen gekennzeichnet. Die Original-Dateien dürfen an diesen Stellen unter keinen Umständen Zeilenumbrüche enthalten.

A.1 Hilfsprogramme.

 

makeimage
#!/bin/bash
dd if=/dev/cdrom of=/cdroms/images/$1
temp=$?
chown cdromadmin.cdromadmins /cdroms/images/$1
chmod g+w /cdroms/images/$1
exit $temp

restartsamba
#!/bin/bash
for i in `ps ax | grep "smbd" | grep -v "grep" | %
% cut -d" " -f3`; do
    kill -1 $i
done
exit $?

rights
#!/bin/bash
echo "Aendere die Rechte fuer '$1'..."
chmod 775 /cdroms/images/$1
chmod 775 /cdroms/images/$1/*

refresh
#!/bin/bash
echo "Lege Mount-Skript fuer Rechnerstart an."
echo "#!/bin/bash" > /cdroms/mountimages
for i in `cat /cdroms/cdroms.conf | grep ":y$"`; do
    j=`echo $i | cut -d":" -f1`
    if test -f /cdroms/images/$j; then
	echo "mount -t iso9660 /cdroms/images/$j %
        % /cdroms/mntpoints/$j -o loop,unhide" %
        % >> /cdroms/mountimages
    fi
done

IFS="
"

echo "Lege smb.conf-Ergaenzung zum Freigeben der CD's an."
echo "# Automatisch generierte Datei zum Freigeben von %
    % CD-Images" > /cdroms/sharecds
for i in `cat /cdroms/cdroms.conf | grep ":y$"`; do
    j=`echo $i | cut -d":" -f1`
    echo "[$j]" >> /cdroms/sharecds
    echo "comment = `echo $i | cut -d":" -f3`" >> /cdroms/sharecds
    echo "path = /cdroms/mntpoints/$j" >> /cdroms/sharecds
    echo "read only = yes" >> /cdroms/sharecds
    echo "locking = no" >> /cdroms/sharecds
    echo "volume = `echo $i | cut -d":" -f2`" >> /cdroms/sharecds
    echo "guest ok = yes" >> /cdroms/sharecds
    echo "" >> /cdroms/sharecds
done

echo "Starte Samba neu."
sudo /cdroms/restartsamba
if test $? -eq 0; then
    echo "Neustart war erfolgreich."
    echo `date "+%d:%m:%Y %T"` "Samba neu gestartet" %
    % >> /var/log/cdrom/cdrom.log
else
    echo "Fehler beim Neustarten von Samba."
    echo `date "+%d:%m:%Y %T"` "Fehler beim Neustarten %
    % von Samba" >> /var/log/cdrom/cdrom.log
    rm /var/lock/cdrom/locked
    exit 5
fi

readinfo
#!/bin/bash
echo "`dd if=/dev/cdrom bs=1 skip=$1 count=$2 %
% 2> /dev/null | col | cut -f1`"
mountimage
#!/bin/bash
mount -t iso9660 /cdroms/images/$1 %
% /cdroms/mntpoints/$1 -o loop,unhide
exit $?

umountimage
#!/bin/bash
umount /cdroms/images/$1
exit $?

A.2 Hauptprogramm.

 

#!/bin/bash
echo ""

if test -e /var/lock/cdrom/locked; then
    echo "Programm wird schon benutzt."
    echo `date "+%d:%m:%Y %T"` "Versuch, das Programm mehrfach %
    % aufzurufen" >> /var/log/cdrom/cdrom.log
    exit 10
else
    echo "/cdroms/cdrom wird benutzt" > /var/lock/cdrom/locked
fi

IFS="
"

case $1 in
add|--add|-a|a|+)
    if test $# -ne 2; then
	echo "Fehlender Parameter."
	rm /var/lock/cdrom/locked
	exit 1
    fi
    echo `date "+%d:%m:%Y %T"` "Kopiere CD $2" %
    % >> /var/log/cdrom/cdrom.log
    if cat /cdroms/cdroms.conf | grep "^$2:" > /dev/null; then
	echo "CD '$2' existiert bereits."
	echo `date "+%d:%m:%Y %T"` "CD existiert bereits" %
        % >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 9
    fi
    if test "`echo "$2" | grep ":"`" = "$2"; then
        echo "CD-Name darf keine Doppelpunkte enthalten."
        rm /var/lock/cdrom/locked
        exit 29
    fi	
    echo "Mounte CD-Laufwerk."
    mount /cdrom
    if test $? -eq 0; then
	echo "Laufwerk gemountet."
    else
	echo "Fehler beim Mounten des Laufwerkes."
	echo `date "+%d:%m:%Y %T"` "Fehler beim Anmounten %
        % des CD-Laufwerkes" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 22
    fi
    echo "Kopiere Daten.	(Das kann etwas dauern...)"
    cp -Rd /cdrom /cdroms/images/$2
    if test $? -eq 0; then
	echo "Daten kopiert."
    else
	echo "Fehler beim kopieren der Daten."
	echo `date "+%d:%m:%Y %T"` "Fehler beim Anmounten %
        % des CD-Laufwerkes" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 23
    fi
    echo "Mounte CD-Laufwerk ab."
    umount /cdrom
    if test $? -eq 0; then
	echo "Laufwerk abgemountet."
    else
	echo "Fehler beim Abmounten des Laufwerkes."
	echo `date "+%d:%m:%Y %T"` "Fehler beim Abmounten %
        % des CD-Laufwerkes" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 23
    fi
    rights $2
    echo "Erstelle Link."
    ln -s /cdroms/images/$2 /cdroms/mntpoints/$2
    if test $? -eq 0; then
	echo "Link erstellt."
    else
	echo "Fehler beim Erstellen des Links."
	rm /var/lock/cdrom/locked
	exit 24
    fi
    echo "Aendere cdroms.conf."
    echo "$2:`sudo /cdroms/readinfo 32808 32`:`sudo %
    % /cdroms/readinfo 33086 128`:y" >> /cdroms/cdroms.conf
    if test $? -eq 0; then
	echo "cdroms.conf erfolgreich geaendert."
    else
	echo "Fehler bei Aenderung von cdroms.conf."
	echo `date "+%d:%m:%Y %T"` "Fehler bei Aenderung %
        % von cdroms.conf" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 20
    fi
    refresh
    echo "Fertig."
    ;;
addimage|--addimage|-ai|ai|+i)
    if test $# -ne 2; then
	echo "Fehlender Parameter."
	rm /var/lock/cdrom/locked
	exit 1
    fi
    echo `date "+%d:%m:%Y %T"` "Lege Image $2 an" %
    % >> /var/log/cdrom/cdrom.log
    if cat /cdroms/cdroms.conf | grep "^$2:" > /dev/null; then
	echo "CD '$2' existiert bereits."
	echo `date "+%d:%m:%Y %T"` "CD existiert bereits" %
        % >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 9
    fi
    if test "`echo "$2" | grep ":"`" = "$2"; then
        echo "Imagename darf keine Doppelpunkte enthalten."
        rm /var/lock/cdrom/locked
        exit 29
    fi	
    echo "Erstelle neues CD-Image '$2'.    %
    % (Das kann etwas dauern...)"
    sudo /cdroms/makeimage $2
#    if test $? -eq 0; then
#	echo "Image erfolgreich angelegt."
#    else
#	echo "Fehler beim Anlegen des Images."
#	echo `date "+%d:%m:%Y %T"` "Fehler beim Anlegen" %
        % >> /var/log/cdrom/cdrom.log
#	rm /var/lock/cdrom/locked
#	exit 2
#    fi
    echo "Lege Verzeichnis '$2' als Mountpoint an."
    mkdir /cdroms/mntpoints/$2 
    if test $? -eq 0; then
	echo "Verzeichnis erfolgreich angelegt."
    else
	echo "Fehler beim Anlegen des Verzeichnisses."
	echo `date "+%d:%m:%Y %T"` "Fehler beim Anlegen %
        % des Mountpoints" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 3
    fi    
    echo "Mounte das Image '$2' an."
    sudo /cdroms/mountimage $2
    if test $? -eq 0; then
	echo "Image erfolgreich angemountet."
    else
	echo "Fehler beim Anmounten des Images."
	echo `date "+%d:%m:%Y %T"` "Fehler beim Anmounten" %
        % >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 4
    fi
    echo "Aendere cdroms.conf."
    echo "$2:`sudo /cdroms/readinfo 32808 32`:`sudo %
    % /cdroms/readinfo 33086 128`:y" >> /cdroms/cdroms.conf
    if test $? -eq 0; then
	echo "cdroms.conf erfolgreich geaendert."
    else
	echo "Fehler bei Aenderung von cdroms.conf."
	echo `date "+%d:%m:%Y %T"` "Fehler bei Aenderung %
        % von cdroms.conf" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 20
    fi
    refresh
    echo "Fertig."
    ;;
remove|--remove|-rm|rm|-)
    if test $# -ne 2; then
	echo "Fehlender Parameter."
	rm /var/lock/cdrom/locked
	exit 1
    fi
    echo `date "+%d:%m:%Y %T"` "Loesche CD $2" %
    % >> /var/log/cdrom/cdrom.log
    if cat /cdroms/cdroms.conf | grep "^$2:" > /dev/null; then
	echo "Loesche Image '$2'."
    else
	echo "CD '$2' existiert nicht."
	echo `date "+%d:%m:%Y %T"` "CD existiert nicht" %
        % >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 9
    fi
    if test -f /cdroms/images/$2; then
	if test "`cat /cdroms/cdroms.conf | grep "^$2:" | %
        % cut -d":" -f4`" = y; then
    	    echo "Mounte Image '$2' ab."
	    sudo /cdroms/umountimage $2
	    if test $? -eq 0; then
		echo "Image erfolgreich abgemountet."
	    else
		echo "Fehler beim abmounten des Images."
		echo `date "+%d:%m:%Y %T"` "Fehler %
                % beim Abmounten" >> /var/log/cdrom/cdrom.log
		rm /var/lock/cdrom/locked
		exit 6
	    fi
	fi
    fi
    echo "Entferne Mountpoint."
    rm -Rf /cdroms/mntpoints/$2
    if test $? -eq 0; then
	echo "Loeschen war erfolgreich."
    else
	echo "Fehler beim Loeschen des Verzeichnisses."
	echo `date "+%d:%m:%Y %T"` "Fehler beim Loeschen %
        % des Mountpoints" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 7
    fi
    echo "Loesche CD."
    rm -Rf /cdroms/images/$2
    if test $? -eq 0; then
        echo "CD geloescht."
    else
	echo "Fehler beim Loeschen der CD."
	echo `date "+%d:%m:%Y %T"` "Fehler beim Loeschen %
        % der CD" >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 8
    fi
    echo "Aendere cdroms.conf."
    cp /cdroms/cdroms.conf /cdroms/cdroms.temp.conf
    rm /cdroms/cdroms.conf    
    for i in `cat /cdroms/cdroms.temp.conf | grep -v "$2"`; do
	echo $i >> /cdroms/cdroms.conf
    done
    rm /cdroms/cdroms.temp.conf
    refresh
    echo "Fertig."    
    ;;
rename|--rename|-rn|rn)
    if test $# -ne 3; then
	echo "Fehlender Parameter."
	rm /var/lock/cdrom/locked
	exit 1
    fi
    echo `date "+%d:%m:%Y %T"` "Benenne CD $2 in $3 um" %
    % >> /var/log/cdrom/cdrom.log
    if cat /cdroms/cdroms.conf | grep "^$3:" > /dev/null; then
	echo "CD '$3' existiert bereits."
	echo `date "+%d:%m:%Y %T"` "CD existiert bereits" %
        % >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 9
    fi
    if test "`echo "$3" | grep ":"`" = "$3"; then
        echo "CD-Name darf keine Doppelpunkte enthalten."
        rm /var/lock/cdrom/locked
        exit 29
    fi	
    if cat /cdroms/cdroms.conf | grep "^$2:" > /dev/null; then
	echo "Benenne '$2' in '$3' um."
    else
	echo "CD '$2' existiert nicht."
	echo `date "+%d:%m:%Y %T"` "CD existiert nicht" %
        % >> /var/log/cdrom/cdrom.log
	rm /var/lock/cdrom/locked
	exit 9
    fi
    if test -f /cdroms/images/$2; then
	if test "`cat /cdroms/cdroms.conf | grep "^$2:" | %
        % cut -d":" -f4`" = y; then
    	    echo "Mounte Image '$2' ab."
	    sudo /cdroms/umountimage $2
	    if test $? -eq 0; then
		echo "Image erfolgreich abgemountet."
	    else
		echo "Fehler beim abmounten des Images."
		echo `date "+%d:%m:%Y %T"` "Fehler %
                % beim Abmounten" >> /var/log/cdrom/cdrom.log
		rm /var/lock/cdrom/locked
		exit 6
	    fi
	fi
	echo "Benenne Mountpoint um."
	mv /cdroms/mntpoints/$2 /cdroms/mntpoints/$3
	if test $? -eq 0; then
	    echo "Mountpoint erfolgreich umbenannt."
	else
	    echo "Fehler beim Umbenennen des Mountpoints."
	    echo `date "+%d:%m:%Y %T"` "Fehler beim Umbennen %
            % des Mountpoints" >> /var/log/cdrom/cdrom.log
	    rm /var/lock/cdrom/locked
	    exit 4
	fi
	echo "Benenne Image um."
	mv /cdroms/images/$2 /cdroms/images/$3
	if test $? -eq 0; then
	    echo "Image erfolgreich umbenannt."
	else
	    echo "Fehler beim Umbenennen des Images."
	    echo `date "+%d:%m:%Y %T"` "Fehler beim Umbennen %
            % des Images" >> /var/log/cdrom/cdrom.log
	    rm /var/lock/cdrom/locked
	    exit 5
	fi
	if test "`cat /cdroms/cdroms.conf | grep "^$2:" | %
        % cut -d":" -f4`" = y; then
	    echo "Mounte das Image '$3' an."
	    sudo /cdroms/mountimage $3
	    if test $? -eq 0; then
		echo "Image erfolgreich angemountet."
	    else
		echo "Fehler beim Anmounten des Images."
		echo `date "+%d:%m:%Y %T"` "Fehler %
                % beim Anmounten" >> /var/log/cdrom/cdrom.log
		rm /var/lock/cdrom/locked
		exit 4
	    fi
	fi
    else
	echo "Entferne Mountpoint."
	rm -R /cdroms/mntpoints/$2
	if test $? -eq 0; then
	    echo "Loeschen war erfolgreich."
	else
	    echo "Fehler beim Loeschen des Verzeichnisses."
	    echo `date "+%d:%m:%Y %T"` "Fehler beim Loeschen %
            % des Mountpoints" >> /var/log/cdrom/cdrom.log
	    rm /var/lock/cdrom/locked
	    exit 7
	fi
	echo "Benenne CD um."
	mv /cdroms/images/$2 /cdroms/images/$3
	if test $? -eq 0; then
	    echo "CD erfolgreich umbenannt."
	else
	    echo "Fehler beim Umbenennen der CD."
	    echo `date "+%d:%m:%Y %T"` "Fehler beim Umbennen %
            % der CD" >> /var/log/cdrom/cdrom.log
	    rm /var/lock/cdrom/locked
	    exit 5
	fi	
	echo "Erstelle Link."
	ln -s /cdroms/images/$3 /cdroms/mntpoints/$3
	if test $? -eq 0; then
	    echo "Link erstellt."
	else
	    echo "Fehler beim Erstellen des Links."
	    rm /var/lock/cdrom/locked
	    exit 24
	fi
    fi
    echo "Aendere cdroms.conf."
    oldconfstring=`cat /cdroms/cdroms.conf | grep "^$2:"`
    cp /cdroms/cdroms.conf /cdroms/cdroms.temp.conf
    rm /cdroms/cdroms.conf    
    for i in `cat /cdroms/cdroms.temp.conf | grep -v "$2"`; do
        echo $i >> /cdroms/cdroms.conf
    done
    rm /cdroms/cdroms.temp.conf
    echo -n "$3:" >> /cdroms/cdroms.conf
    echo -n "`echo $oldconfstring | cut -d":" -f2`" %
    % >> /cdroms/cdroms.conf
    echo -n ":" >> /cdroms/cdroms.conf
    echo -n "`echo $oldconfstring | cut -d":" -f3`" %
    % >> /cdroms/cdroms.conf
    echo -n ":" >> /cdroms/cdroms.conf
    echo "`echo $oldconfstring | cut -d":" -f4`" %
    % >> /cdroms/cdroms.conf
    refresh
    echo "Fertig."
    ;;
repair|--repair|-r|r)
    echo `date "+%d:%m:%Y %T"` "Ueberpruefe Konfiguration" %
    % >> /var/log/cdrom/cdrom.log
    echo "Ueberpruefe cdroms.conf."
    for i in `cat /cdroms/cdroms.conf | cut -d":" -f1`; do
	if test -e /cdroms/images/$i; then
	    echo "$i existiert."
	    if test -e /cdroms/mntpoints/$i; then
		echo "Mountpoint fuer $i existiert."
	    else
		echo "Mountpoint fuer $i existiert nicht."
		echo `date "+%d:%m:%Y %T"` "Mountpoint fuer $i %
                % existiert nicht; lege an" %
                % >> /var/log/cdrom/cdrom.log
		if test -f /cdroms/images/$i; then
		    mkdir /cdroms/mntpoints/$i
		else
		    ln -s /cdroms/images/$i /cdroms/mntpoints/$i
		    if test $? -eq 0; then
			echo "Link erstellt."
		    else
			echo "Fehler beim Erstellen des Links."
		    fi
		fi
	    fi	
	else
	    echo "$i existiert nicht."
	    echo `date "+%d:%m:%Y %T"` "$i existiert nicht; %
            % loesche Eintrag" >> /var/log/cdrom/cdrom.log
	    cp /cdroms/cdroms.conf /cdroms/cdroms.temp.conf
	    rm /cdroms/cdroms.conf    
	    for i in `cat /cdroms/cdroms.temp.conf | %
            % grep -v "$i"`; do
		echo $i >> /cdroms/cdroms.conf
	    done
	    rm /cdroms/cdroms.temp.conf
	fi
    done
    echo "Pruefe, ob jede CD in cdroms.conf eingetragen ist."
    for i in `ls -A /cdroms/images`; do
	if cat /cdroms/cdroms.conf | grep "^$i:" > /dev/null; then
	    echo "$i ist eingetragen."
	else
	    echo "$i ist nicht eingetragen."
	    echo `date "+%d:%m:%Y %T"` "$i nicht in cdroms.conf %
            % eingetragen; trage es ein" %
            % >> /var/log/cdrom/cdrom.log
	    echo "$i:$i:$i:y" >> /cdroms/cdroms.conf
	    if test $? -eq 0; then
		echo "Erfolgreich eingetragen."
	    else
		echo "Fehler beim Eintragen."
		echo `date "+%d:%m:%Y %T"` "Fehler beim %
                % Eintragen" >> /var/log/cdrom/cdrom.log
	    fi
	fi
    done
    echo "Pruefe, ob alle verfuegbaren Images angemountet sind."
    for i in `cat /cdroms/cdroms.conf | cut -d":" -f1`; do
	if test -f /cdroms/images/$i; then
	    if test "`cat /cdroms/cdroms.conf | grep "^$i:" | %
            % cut -d":" -f4`" = y; then
		if mount | grep "^/cdroms/images/$i " %
                % > /dev/null; then
		    echo "$i ist angemountet."
		else
		    echo "$i ist nicht angemountet."
		    echo `date "+%d:%m:%Y %T"` "$i nicht %
                    % angemountet; mounte es an" >> %
                    % /var/log/cdrom/cdrom.log
		    echo "Mounte das Image '$i' an."
		    sudo /cdroms/mountimage $i
		    if test $? -eq 0; then
			echo "Image erfolgreich angemountet."
		    else
			echo "Fehler beim Anmounten des Images."
			echo `date "+%d:%m:%Y %T"` "Fehler beim %
                        % Anmounten" >> /var/log/cdrom/cdrom.log
		    fi
		fi
	    fi
	fi
    done
    echo "Ueberpruefe, ob fuer jeden Mountpoint ein Image %
    % vorhanden ist."
    for i in `ls -A /cdroms/mntpoints`; do
	if test -e /cdroms/images/$i; then
	    echo "Image $i existiert."
	else
	    echo "Image $i existiert nicht."
	    echo `date "+%d:%m:%Y %T"` "Image $i fehlt, %
            % loesche Mountpoint" >> /var/log/cdrom/cdrom.log
	    if test -f /cdroms/mntpoints/$i; then
		echo "Loesche Mountpoint $i."
		rmdir /cdroms/mntpoints/$i 
	    else
		echo "Loesche Link $i."
		rm /cdroms/mntpoints/$i
	    fi
	    if test $? -eq 0; then
		echo "Mountpoint erfolgreich entfernt."
	    else
		echo "Fehler beim Loeschen des Mountpoints."
		echo `date "+%d:%m:%Y %T"` "Fehler beim Loeschen %
                % des Verzeichnisses" >> /var/log/cdrom/cdrom.log
	    fi
	fi
    done
    refresh
    echo "Fertig."
    ;;
list|--list|-l|l)
    echo "CD-Name:    Label,  Kommentar,  Aktiviert,  %
    % [Kopie/Image]"
    echo ""
    for i in `cat /cdroms/cdroms.conf`; do
	echo -n "`echo $i | cut -d":" -f1`:    "
	echo -n "`echo $i | cut -d":" -f2`,  "
	echo -n "`echo $i | cut -d":" -f3`,  "
	echo -n "`echo $i | cut -d":" -f4`,  "
	if test -f /cdroms/images/`echo $i | cut -d":" -f1`; then
	    echo "Image"
	else
	    echo "Kopie"
	fi
    done
    ;;
*|help|--help|-h|h|-?|?)
    echo "Skript zur Verwaltung eines CD-Servers"
    echo "(c) Ansgar Jonietz 1999.                     %
    % eMail: ansgar@jonietz.de"
    echo "                                             %
    % WWW: http://www.jonietz.de"
    echo ""
    echo "cdrom add|--add|-a|a|+ <name>                %
    % Kopiert die CD <name>."
    echo "      addimage|--addimage|-ai|ai|+i <name>   %
    % Fuegt das Image <name> hinzu."
    echo "      remove|--remove|-rm|rm|- <name>        %
    % Entfernt die CD <name>."
    echo "      rename|--rename|-rn|rn <name1> <name2> 
    % Benennt <name1> in <name2> um."
    echo "      list|--list|-l|l                       %
    % Zeigt die CD's an."
    echo "      repair|--repair|-r|r                   %
    % Ueberprueft und repariert ggf. die"
    echo "                                             %
    % Konfiguration."
    echo "      help|--help|-h|h|-?|?                  %
    % Zeigt diesen Hilfe-Screen."
    echo ""
esac

rm /var/lock/cdrom/locked

A.3 Geänderte Systemdateien.

/sbin/init.d/boot.local

Diese Zeile muss in die Datei boot.local aufgenommen werden, damit alle Images beim Serverstart angemountet werden.

/cdroms/mountimages

/etc/smb.conf

Folgende Zeile muss in die SAMBA-Konfigurationsdatei eingefügt werden:

include = /cdroms/sharecds

/etc/sudoers

Diese Zeilen müssen mit visudo in die sudo-Konfigurationsdatei eingefügt werden:

root		ALL=(ALL) ALL
%cdromadmins	ALL=NOPASSWD: /cdroms/makeimage
%cdromadmins	ALL=NOPASSWD: /cdroms/mountimage
%cdromadmins	ALL=NOPASSWD: /cdroms/restartsamba
%cdromadmins	ALL=NOPASSWD: /cdroms/umountimage
%cdromadmins	ALL=NOPASSWD: /cdroms/readinfo

A.4 Geschwindigkeit..

test.bat

@echo off
time < return > startz
copy %1 nul
time < return > stopz
type startz
type stopz

wait.pas

program
  wait;
uses
  crt, dos;
type
  zeit = array[1..4] of word;
var
  sollzeit : zeit;
  istzeit : zeit;
  i, temp : integer;

begin
  for i:=1 to 3 do
    val(paramstr(i), sollzeit[i], temp);
  repeat
    gettime(istzeit[1], istzeit[2], istzeit[3], istzeit[4]);
  until (sollzeit[1] = istzeit[1]) and
        (sollzeit[2] = istzeit[2]) and
        (sollzeit[3] = istzeit[3]);
end.

Verwendete Formeln.

Um die gemessenen Übertragungszeiten t [s] der verschiedenenen Dateigrößen b [Byte] in Übertragungsraten RÜ [kByte/s] umzurechnen, habe ich folgende Formel aufgestellt:

RÜ = b/t * 1/1024

Ich habe immer beachtet, dass 1 kByte genau 1024 Byte entspricht. Analog gilt:

1 MByte = 1024 kByte = 1024 * 1024 Byte

Ausserdem sind 8 Bit ein Byte.

B Messdaten.

 

B.1 AXIS Storpoint versus LorM.

Dateigröße Übertragungsdauer Übertragungsdauer
[Byte] AXIS [s] LorM [s]
148933315 171,64 248,92
11625472 16,26 20,60
872913 3,73 1,76
66135 3,13 1,60

B.2 Gleichzeitiger Zugriff mit mehreren Clients.

Anzahl Clients, Übertragungsdauer [s]
1 2 3 4 5 6 7 8 9 10
28,89 35,65 52,29 68,05 87,77 99,14 122,47 138,08 146,38 150,60
35,75 52,95 69,70 84,75 99,69 112,16 131,05 148,24 165,55
53,17 70,63 85,08 102,05 120,74 135,87 157,20 174,00
67,51 86,40 99,53 108,64 134,79 148,41 156,04
84,26 103,70 120,73 139,17 158,19 165,22
105,34 119,41 138,74 155,99 162,91
107,65 126,99 149,34 164,28
126,99 155,16 167,41
148,85 174,06
172,74

Anzahl Clients
Dateigröße Übertragungsdauer [s]
[Byte] 1 5 10
11625472 2,53 7,30 13,13
6,20 13,74
7,58 13,51
5,82 13,19
7,03 12,52
12,41
10,55
12,36
12,47
12,80
872913 0,44 0,72 0,71
0,71 0,66
0,77 0,55
0,66 0,60
0,77 0,60
0,71
0,55
0,77
0,39
1,05
66135 0,11 0,44 0,6
0,49 0,55
0,22 0,60
0,11 0,55
0,38 0,39
0,22
0,39
0,33
0,44
0,61

Abbildungsverzeichnis

Literatur

1
Krienke, Rainer: UNIX Shell-Programmierung. Carl Hanser Verlag München Wien, 1997.
2
Muschl, Puschl: Aus Puschl Muschls Bastelkiste. Elektronisches Dokument auf http://members.xoom.com/puschlmuschl.
3
Kuri, Jürgen: CD-Jukebox für Arbeitsgruppen. Erschienen in c't 26/98.
4
Roeschies, Andreas: Simuliertes Laufwerk. Virtual CD von Microtest. Erschienen in c't 7/99.
5
Kirch, John: Microsoft Windows NT Server 4.0 versus UNIX.
Übersetzung J. Trippler, A. Kanese.
Elektronisches Dokument (29.10.1998) auf
http://www.lot-germany.com/magazin/unix-nt.htm.
6
Trümper, Winfried: CD-Writing HOWTO.
4.17: How can the CD-Info be retrieved?
Elektronisches Dokument (V.2.8.13, 17.11.1999) auf
http://www.guug.de/ winni/linux/cdr/html/CD-Writing-4.html#ss4.3.
7
Böing, Markus: Volle Pulle. Mythos und Realität der Geschwindigkeit in Ethernet-Netzen. Erschienen in c't 6/98.
8
WiNShuttle-FAQ: WWW-Seiten mit Passwort schützen. Elektronisches Dokument auf http://www.shuttle.de/infos/faq/geschuetzte_seiten.html.
...Jonietz
ansgar@jonietz.de
...etc. eingeschränkt.
Dazu entfällt in der Schule das ,,Austeilen`` von CDs am Anfang der Stunde.
...DM.
Angaben aus: Katalog September 1999 der ARP DATACON GmbH, Dietzenbach.
...SCSI-System
Small Computer System Interface
...nicht.
,,Windows NT ist in der Tat ein großer Fortschritt gegenüber Windows 3.1 oder Windows 95, aber es hat noch eine lange Entwicklung vor sich, bis es den Grad der Stabilität der freien UNIX-Systeme erreicht.``, siehe [5].
...Linux
,,Linux ...überbiete[t] die Performance von Windows NT um Längen auf weniger leistungsfähiger Hardware und [die Server] laufen unter Umständen genauso schnell oder schneller als NT auf der besten Hardware.``, siehe [5]
...}bash}
Bourne-Again-Shell
...Dämon
Ein Dämon entspricht etwa dem, was unter WINDOWS ,,Systemdienst`` genannt wird.
...gelöscht.
Sollte das System - aus welchen Gründen auch immer - abstürzen, während das Programm benutzt wird, muss der Administrator die Lock-Datei manuell löschen.
...enthält.
Ich musste feststellen, welch großes Problem die Beschaffung einer CD mit einer sehr großen Datei darstellt. In meiner umfangreichen CD-ROM-Sammlung fand ich nur zwei CDs mit einer Datei, die größer als 100 MByte ist. Eine ,,selbstgebrannte`` CD wollte ich nicht verwenden, da CD-Rs meist nicht mit der vollen Geschwindigkeit gelesen werden können; so würde ich Server mit Festplattenzugriff bevorteilen.
...gestellt.
Besonderer Dank gilt Herrn OStR Gerd Zillien für seine Unterstützung.
...Intranet
Ein Intranet ist ein lokales Internet.
...CGI-Skripte
Common Gateway Interface
...HTML-Code
HyperText Markup Language
...CD-Server:
Angaben aus: Anzeige der Computer Profis GmbH, 64347 Griesheim. Abgedruckt in c't 1/2000, S. 201-208.
...kann.
Meines Wissens kennen andere CD-Server allerdings auch keine Energiesparmodi.
 

[Next] [Up] [Previous]
Up: www.jonietz.de

Ansgar Jonietz
St.-Willibrord-Gymnasium Bitburg