Ansgar Jonietz[+]
Dezember 1999
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.)
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:
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.
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.
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

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.
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.
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>.
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.
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.
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.
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.
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.
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.
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.
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.[+]
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.

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.
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.

Abbildung 3: Übertragungsraten bei mehreren Clients.

Abbildung 4: Übertragungsraten bei unterschiedlichen Dateigrößen mit mehreren Clients.
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.

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.
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 |
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.
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.
#!/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
#!/bin/bash
for i in `ps ax | grep "smbd" | grep -v "grep" | %
% cut -d" " -f3`; do
kill -1 $i
done
exit $?
#!/bin/bash echo "Aendere die Rechte fuer '$1'..." chmod 775 /cdroms/images/$1 chmod 775 /cdroms/images/$1/*
#!/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
#!/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 $?
#!/bin/bash umount /cdroms/images/$1 exit $?
#!/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
Diese Zeile muss in die Datei boot.local aufgenommen werden, damit alle Images beim Serverstart angemountet werden.
/cdroms/mountimages
Folgende Zeile muss in die SAMBA-Konfigurationsdatei eingefügt werden:
include = /cdroms/sharecds
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
@echo off time < return > startz copy %1 nul time < return > stopz type startz type stopz
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.
Um die gemessenen Übertragungszeiten [s] der verschiedenenen Dateigrößen [Byte] in Übertragungsraten [kByte/s] umzurechnen, habe ich folgende Formel aufgestellt:
Ich habe immer beachtet, dass 1 kByte genau 1024 Byte entspricht. Analog gilt: Ausserdem sind 8 Bit ein Byte.
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
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