diff --git a/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml b/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml index 5409bd0dd4..27aa36e960 100644 --- a/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml +++ b/de_DE.ISO8859-1/books/developers-handbook/x86/chapter.sgml @@ -1,6098 +1,6099 @@ x86-Assembler-Programmierung Dieses Kapitel wurde geschrieben von &a.stanislav;. Hagen Kühl Übersetzt von Synopsis Assembler-Programmierung unter &unix; ist höchst undokumentiert. Es wird allgemein angenommen, dass niemand sie jemals benutzen will, da &unix;-Systeme auf verschiedenen Mikroprozessoren laufen, und man deshalb aus Gründen der Portabilität alles in C schreiben sollte. In Wirklichkeit ist die Portabilität von C größtenteils ein Mythos. Auch C-Programme müssen angepasst werden, wenn man sie von einem &unix; auf ein anderes portiert, egal auf welchem Prozessor jedes davon läuft. Typischerweise ist ein solches Programm voller Bedingungen, die unterscheiden für welches System es kompiliert wird. Sogar wenn wir glauben, dass jede &unix;-Software in C, oder einer anderen High-Level-Sprache geschrieben werden sollte, brauchen wir dennoch Assembler-Programmierer: Wer sonst sollte den Abschnitt der C-Bibliothek schreiben, die auf den Kernel zugreift? In diesem Kapitel möchte ich versuchen zu zeigen, wie man Assembler-Sprache verwenden kann, um &unix;-Programme, besonders unter FreeBSD, zu schreiben. Dieses Kapitel erklärt nicht die Grundlagen der Assembler-Sprache. Zu diesem Thema gibt es bereits genug Quellen (einen vollständigen Online-Kurs finden Sie in Randall Hydes Art of Assembly Language; oder falls Sie ein gedrucktes Buch bevorzugen, können Sie einen Blick auf Jeff Duntemanns Assembly Language Step-by-Step werfen). Jedenfalls sollte jeder Assembler-Programmierer nach diesem Kapitel schnell und effizient Programme für FreeBSD schreiben können. Copyright © 2000-2001 G. Adam Stanislav. All rights reserved. Hagen Kühl Übersetzt von Die Werkzeuge Der Assembler Das wichtigste Werkzeug der Assembler-Programmierung ist der Assembler, diese Software übersetzt Assembler-Sprache in Maschinencode. Für FreeBSD stehen zwei verschiedene Assembler zur Verfügung. Der erste ist as1, der die traditionelle &unix;-Assembler-Sprache verwendet. Dieser ist Teil des Systems. Der andere ist /usr/ports/devel/nasm. Dieser benutzt die Intel-Syntax und sein Vorteil ist, dass es Code fü viele Vetriebssysteme übersetzen kann. Er muss gesondert installiert werden, aber ist völlig frei. In diesem Kapitel wird die nasm-Syntax verwendet. Einerseits weil es die meisten Assembler-Programmierer, die von anderen Systemen zu FreeBSD kommen, leichter verstehen werden. Und offen gesagt, weil es das ist, was ich gewohnt bin. Der Linker Die Ausgabe des Assemblers muss, genau wie der Code jedes Compilers, gebunden werden, um eine ausführbare Datei zu bilden. Der Linker ld1 ist der Standard und Teil von FreeBSD. Er funktioniert mit dem Code beider Assembler. Hagen Kühl Übersetzt von Systemaufrufe Standard-Aufrufkonvention Standardmäßig benutzt der FreeBSD-Kernel die C-Aufrufkonvention. Weiterhin wird, obwohl auf den Kernel durch int 80h zugegriffen wird, angenommen, dass das Programm eine Funktion aufruft, die int 80h verwendet, anstatt int 80h direkt aufzurufen. Diese Konvention ist sehr praktisch und der µsoft;-Konvention von &ms-dos; überlegen. Warum? Weil es die &unix;-Konvention jedem Programm, egal in welcher Sprache es geschrieben ist, erlaubt auf den Kernel zuzugreifen. Ein Assembler-Programm kann das ebenfalls. Beispielsweise könnten wir eine Datei öffnen: kernel: int 80h ; Call kernel ret open: push dword mode push dword flags push dword path mov eax, 5 call kernel add esp, byte 12 ret Das ist ein sehr sauberer und portabler Programmierstil. Wenn Sie das Programm auf ein anderes &unix; portieren, das einen anderen Interrupt oder eie andere Art der Parameterübergabe verwendet, müssen sie nur die Prozedur kernel ändern. Aber Assembler-Programmierer lieben es Taktzyklen zu schinden. Das obige Beispiel benötigt eine call/ret-Kombination. Das können wir entfernen, indem wir einen weiteren Parameter mit push übergeben: open: push dword mode push dword flags push dword path mov eax, 5 push eax ; Or any other dword int 80h add esp, byte 16 Die Konstante 5, die wir in EAX ablegen, identifiziert die Kernel-Funktion, die wir aufrufen. In diesem Fall ist das open. Alternative Aufruf-Konvention FreeBSD ist ein extrem flexibles System. Es bietet noch andere Wege, um den Kernel aufzurufen. Damit diese funktionieren muss allerdings die Linux-Emulation installiert sein. Linux ist ein &unix;-artiges System. Allerdings verwendet dessen Kernel die gleiche Systemaufruf-Konvention, bei der Parameter in Registern abgelegt werden, wie &ms-dos;. Genau wie bei der &unix;-Konvetion wird die Nummer der Funktion inEAX abgelegt. Allerdings werden die Parameter nicht auf den Stack gelegt, sondern in die Register EBX, ECX, EDX, ESI, EDI, EBP: open: mov eax, 5 mov ebx, path mov ecx, flags mov edx, mode int 80h Diese Konvention hat einen großen Nachteil gegenüber der von &unix;, was die Assembler-Programmierung angeht: Jedesmal, wenn Sie einen Kernel-Aufruf machen, müssen Sie die Register pushen und sie später popen. Das macht Ihren Code unförmiger und langsamer. Dennoch lässt FreeBSD ihnen die Wahl. Wenn Sie sich für die Linux-Konvention entscheiden, müssen Sie es das System wissen lassen. Nachdem ihr Programm übersetzt und gebunden wurde, müssen Sie die ausführbare Datei kennzeichnen: &prompt.user; brandelf -f Linux filename Welche Konvention Sie verwenden sollten Wenn Sie speziell für FreeBSD programmieren, sollten Sie die &unix;-Konvention verwenden: Diese ist schneller, Sie können globale Variablen in Registern ablegen, Sie müssen die ausführbare Datei nicht kennzeichnen und Sie erzwingen nicht die Installation der Linux-Emulation auf dem Zielsystem. Wenn Sie portablen Programmcode erzeugen wollen, der auch unter Linux funktioniert, wollen Sie den FreeBSD-Nutzern vielleicht dennoch den effizientesten Programmcode bieten, der möglich ist. Ich werde Ihnen zeigen, wie Sie das erreichen können, nachdem ich die Grundlagen erklärt habe. Aufruf-Nummern Um dem Kernel mitzuteilen welchen Dienst Sie aufrufen, legen Sie dessen Nummer in EAX ab. Natürlich müssen Sie dazu wissen welche Nummer die Richtige ist. Die Datei <filename>syscalls</filename> Die Nummer der Funktionen sind in der Datei syscalls aufgeführt. Mittels locate syscalls finden Sie diese in verschiedenen Formaten, die alle auf die gleiche Weise aus syscalls.master erzeugt werden. Die Master-Datei für die &unix;-Standard-Aufrufkonvention finden sie unter /usr/src/sys/kern/syscalls.master. Falls Sie die andere Konvention, die im Linux-Emulations-Modus implementiert ist, verwenden möchten, lesen Sie bitte /usr/src/sys/i386/linux/syscalls.master. FreeBSD und Linux unterscheiden sich nicht nur in den Aufrufkonventionen, sie haben teilweise auch verschiedene Nummern für die gleiche Funktion. syscalls.master beschreibt, wie der Aufruf gemacht werden muss: 0 STD NOHIDE { int nosys(void); } syscall nosys_args int 1 STD NOHIDE { void exit(int rval); } exit rexit_args void 2 STD POSIX { int fork(void); } 3 STD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); } 4 STD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); } 5 STD POSIX { int open(char *path, int flags, int mode); } 6 STD POSIX { int close(int fd); } etc... In der erstm Spalte steht die Nummer, die in EAX abgelegt werden muss. Die Spalte ganz rechts sagt uns welche Parameter wir pushen müssen. Die Reihenfolge ist dabei von rechts nach links. Um beispielsweise eine Datei mittels open zu öffnen, müssen wir zuerst den mode auf den Stack pushen, danach die flags, dann die Adresse an der der path gespeichert ist. Hagen Kühl Übersetzt von Rückgabewerte Ein Systemaufruf wäre meistens nicht sehr nützlich, wenn er nicht irgendeinen Wert zurückgibt: Beispielsweise den Dateideskriptor einer geöffneten Datei, die Anzahl an Bytes die in ienen Puffer gelesen wurde, die Systemzeit, etc. Außerdem muss Sie das System informieren, falls ein Fehler auftritt: Wenn eine Datei nicht existiert, die Systemressourcen erschöpft sind, wir ein ungültiges Argument übergeben haben, etc. Manualpages Der herkömmliche Ort, um nach Informationen über verschiedene Systemaufrufe unter &unix;-Systemen zu suchen, sind die Manualpages. FreeBSD beschreibt seine Systemaufrufe in Abschnitt 2, manchmal auch Abschnitt 3. In open2 steht beispielsweise:
Falls erfolgreich, gibt open() einen nicht negativen Integerwert, als Dateideskriptor bezeichnet, zurück. Es gibt -1 im Fehlerfall zurück und setzt errno um den Fehler anzuzeigen.
Ein Assembler-Programmierer, der neu bei &unix; und FreeBSD ist, wird sich sofort fragen: Wo finde ich errno und wie erreiche ich es? Die Information der Manualpage bezieht sich auf C-Programme. Der Assembler-Programmierer benötigt zusätzliche Informationen.
Wo sind die Rückgabewerdet? Leider gilt: Es kommt darauf an... Für die meisten Systemaufrufe liegt er in EAX, aber nicht für alle. Eine gute Daumenregel, wenn man zum ersten Mal mit einem Systemaufruf arbeitet, ist in EAX nach dem Rückgabewert zu suchen. Wenn er nicht dort ist, sind weitere Untersuchungen nötig. Mir ist ein Systemaufruf bekannt, der den Rückgabewert in EDX ablegt: SYS_fork Alle anderen mit denen ich bisher gearbeitet habe verwenden EAX. Alelrdings habe ich noch nicht mit allen gearbeitet. Wenn Sie die Antwort weder hier, noch irgendwo anders finden, studieren Sie den Qualltext von libc und sehen sich an, wie es mit dem Kernel zusammenarbeitet. Wo ist <varname>errno</varname>? Tatsächlich, nirgendwo... errno ist ein Teil der Sprache C, nicht des &unix;-Kernels. Wenn man direkt auf Kernel-Dienste zugreift, wird der Fehlercode in EAX zurückgegeben, das selbe Register in dem der Rückgabewert, bei einem erfolgreichen Aufruf landet. Das macht auch Sinn. Wenn kein Fehler auftritt, gibt es keinen Fehlercode. Wenn ein Fehler auftritt, gibt es keinen Rückgabewert. Ein einziges Register kann also beides enthalten. Feststellen, dass ein Fehler aufgetreten ist Wenn Sie die Standard FreeBSD-Aufrufkonvention verwenden wird das carry flag gelöscht wenn der Aufruf erfolgreich ist und gesetzt wenn ein Fehler auftritt. Wenn Sie den Linux-Emulationsmodus verwenden ist der vorzeichenbehaftete Wert in EAX nicht negativ, bei einem erfolgreichen Aufruf. Wenn ein Fehler auftritt ist der Wert negativ, also -errno.
Hagen Kühl Übersetzt von Portablen Code erzeugen Portabilität ist im Allgemeinen keine Stärke der Assembler-Programmierung. Dennoch ist es, besonders mit nasm, möglich Assembler-Programme für verschiedene Plattformen zu schreiben. Ich selbst habe bereits Assembler-Bibliotheken geschriebenm die auf so unterschiedlichen Systemen wie &windows; und FreeBSD übersetzt werden können. Das ist um so besser möglich, wenn Ihr Code auf zwei Plattformen laufen soll , die, obwohl sie verschieden sind, auf ähnlichen Architekturen basieren. Beispielsweise ist FreeBSD ein &unix;, während Linux &unix;-artig ist. Ich habe bisher nur drei Unterschiede zwischen beiden (aus Sicht eines Assembler-Programmierers) erwähnt: Die Aufruf-Konvention, die Funktionsnummern und die Art der Übergabe von Rückgabewerten. Mit Funktionsnummern umgehen In vielen Fällen sind die Funktionsnummern die selben. Allerdings kann man auch wenn sie es nicht sind leicht mit diesem Problem umgehen: Anstatt die Nummern in Ihrem Code zu verwenden, benutzen Sie Konstanten, die Sie abhängig von der Zielarchitektur unterschiedlich definieren: %ifdef LINUX %define SYS_execve 11 %else %define SYS_execve 59 %endif Umgang mit Konventionen Sowohl die Aufrufkonventiion, als auch die Rückgabewerte (das errno Problem) kann man mit Hilfe von Makros lösen: %ifdef LINUX %macro system 0 call kernel %endmacro align 4 kernel: push ebx push ecx push edx push esi push edi push ebp mov ebx, [esp+32] mov ecx, [esp+36] mov edx, [esp+40] mov esi, [esp+44] mov ebp, [esp+48] int 80h pop ebp pop edi pop esi pop edx pop ecx pop ebx or eax, eax js .errno clc ret .errno: neg eax stc ret %else %macro system 0 int 80h %endmacro %endif Umgang mit anderen Portabilitätsangelegeneheiten Die oben genannte Lösung funktioniert in den meisten Fällen, wenn man Code schreibt, der zwischen FreeBSD und Linux portierbar sein soll. Allerdings sind die Unterschiede bei einigen Kernel-Diensten tiefgreifender. In diesem Fällen müssen Sie zwei verschiedene Handler für diese Systemaufrufe schreiben und bedingte Assemblierung benutzen, um diese zu übersetzen. Glücklicherweise wird der größte Teil Ihres Codes nicht den Kernel aufrufen und Sie werden deshalb nur wenige solcher bedingten Abschnitte benötigen. Eine Bibliothek benutzen Sie können Portabilitätsprobleme im Hauptteil ihres Codes komplett vermeiden, indem Sie eine Bibliothek für Systemaufrufe schreiben. Erstellen Sie eine Bibliothek für FreeBSD, eine für Linux und weitere für andere Betriebssysteme. Schreiben Sie in ihrer Bibliothek eine gesonderte Funktion (oder Prozedur, falls Sie die traditionelle Assembler-Terminologie bevorzugen) für jeden Systemaufruf. Verwenden Sie dabei die C-Aufrufkonvention um Parameter zu übergeben, aber verwenden Sie weiterhin EAX, für die Aufrufnummer. In diesem Fall kann ihre FreeBSD-Bibliothek sehr einfach sein, da viele scheinbar unterschiedliche Funktionen als Label für den selben Code implementiert sein können: sys.open: sys.close: [etc...] int 80h ret Ihre Linux-Bibliothek wird mehr verschiedene Funktionen benötigen, aber auch hier können Sie Systemaufrufe, welche die Anzahl an Parametern akzeptieren zusammenfassen: sys.exit: sys.close: [etc... one-parameter functions] push ebx mov ebx, [esp+12] int 80h pop ebx jmp sys.return ... sys.return: or eax, eax js sys.err clc ret sys.err: neg eax stc ret Der Bibliotheks-Ansatz mag auf den ersten Blick unbequem aussehen, weil Sie eine weitere Datei erzeugen müssen von der Ihr Code abhängt. Aber er hat viele Vorteile: Zum einen müssen Sie die Bibliothek nur einmal schreiben und können sie dann in allen Ihren Programmen verwenden. Sie können sie sogar von anderen Assembler-Programmierern verwenden lassen, oder eine die von jemand anderem geschrieben wurde verwenden. Aber der vielleicht größte Vorteil ist, dass Ihr Code sogar von anderen Programmierer auf andere Systeme portiert werden kann, einfach indem man eine neue Bibliothek schreibt, völlig ohne Änderungen an Ihrem Code. Falls Ihnen der Gedanke eine Bibliothek zu nutzen nicht gefällt, können Sie zumindest all ihre Systemaufrufe in einer gesonderten Assembler-Datei ablegen und diese mit Ihrem Hauptprogramm zusammen binden. Auch hier müssen alle, die ihr Programm portieren, nur eine neue Objekt-Datei erzeugen und an Ihr Hauptprogramm binden. Eine Include-Datei verwenden Wenn Sie ihre Software als (oder mit dem) Quelltext ausliefern, können Sie Makros definieren und in einer getrennten Datei ablegen, die Sie ihrem Code beilegen. Porter Ihrer Software schreiben dann einfach eine neue Include-Datei. Es ist keine Bibliothek oder eine externe Objekt-Datei nötig und Ihr Code ist portabel, ohne dass man ihn editieren muss. Das ist der Ansatz den wir in diesem Kapitel verwenden werden. Wir werden unsere Include-Datei system.inc nennen und jedesmal, wenn wir einen neuen Systemaufruf verwenden, den entsprechenden Code dort einfügen. Wir können unsere system.inc beginnen indem wir die Standard-Dateideskriptoren deklarieren: %define stdin 0 %define stdout 1 %define stderr 2 Als Nächstes erzeugen wir einen symbolischen Namen für jeden Systemaufruf: %define SYS_nosys 0 %define SYS_exit 1 %define SYS_fork 2 %define SYS_read 3 %define SYS_write 4 ; [etc...] Wir fügen eine kleine, nicht globale Prozedur mit langem Namen ein, damit wir den Namen nicht aus Versehen in unserem Code wiederverwenden: section .text align 4 access.the.bsd.kernel: int 80h ret Wir erzeugen ein Makro, das ein Argument erwartet, die Systemaufruf-Nummer: %macro system 1 mov eax, %1 call access.the.bsd.kernel %endmacro Letztlich erzeugen wir Makros für jeden Systemaufruf. Diese Argumente erwarten keine Argumente. %macro sys.exit 0 system SYS_exit %endmacro %macro sys.fork 0 system SYS_fork %endmacro %macro sys.read 0 system SYS_read %endmacro %macro sys.write 0 system SYS_write %endmacro ; [etc...] Fahren Sie fort, geben das in Ihren Editor ein und speichern es als system.inc. Wenn wir Systemaufrufe besprechen, werden wir noch Ergänzungen in dieser Datei vornehmen. Hagen Kühl Übersetzt von Unser erstes Programm Jetzt sind wir bereit für unser erstes Programm, das übliche Hello, World! 1: %include 'system.inc' 2: 3: section .data 4: hello db 'Hello, World!', 0Ah 5: hbytes equ $-hello 6: 7: section .text 8: global _start 9: _start: 10: push dword hbytes 11: push dword hello 12: push dword stdout 13: sys.write 14: 15: push dword 0 16: sys.exit Hier folgt die Erklärung des Programms: Zeile 1 fügt die Definitionen ein, die Makros und den Code aus system.inc. Die Zeilen 3 bis 5 enthalten die Daten: Zeile 3 beginnt den Datenabschnitt/das Datensegment. Zeile 4 enthält die Zeichenkette "Hello, World!", gefolgt von einem Zeilenumbruch (0Ah). Zeile 5 erstellt eine Konstante, die die Länge der Zeichenkette aus Zeile 4 in Bytes enthält. Die Zeilen 7 bis 16 enthälten den Code. Beachten Sie bitte, dass FreeBSD das Dateiformat elf für diese ausführbare Datei verwendet, bei dem jedes Programm mit dem Label _start beginnt (oder, um genau zu sein, wird dies vom Linker erwartet). Diese Label muss global sein. Die Zeilen 10 bis 13 weisen das System an hbytes Bytes der Zeichenkette hello nach stdout zu schreiben. Die Zeilen 15 und 16 weisen das System an das Programm mit dem Rückgabewert 0 zu beenden. Der Systemaufruf SYS_exit kehrt niemals zurück, somit endet das Programm hier. Wenn Sie von &ms-dos;-Assembler zu &unix; gekommen sind, sind Sie es vielleicht gewohnt direktauf die Video-Hardware zu schreiben. Unter FreeBSD müssen Sie sich darum keine Gedanken machen, ebenso bei jeder anderen Art von &unix;. Soweit es Sie betrifft schreiben Sie in eine Datei namens stdout. Das kann der Bildschirm, oder ein telnet-Terminal, eine wirkliche Datei, oder die Eingabe eines anderen Programms sein. Es liegt beim System herauszufinden, welches davon es tatsächlich ist. Den Code assemblieren Geben Sie den Code (außer den Zeilennummern) in einen Editor ein und speichern Sie ihn in einer Datei namens hello.asm. Um es zu assemblieren benötigen Sie nasm. <application>nasm</application> installieren Wemm Sie nasm nocht nicht installiert haben geben Sie folgendes ein: &prompt.user; su Password:your root password &prompt.root; cd /usr/ports/devel/nasm &prompt.root; make install &prompt.root; exit &prompt.user; Sie können auch make install clean anstatt make install eingeben, wenn Sie den Quelltext von nasm nicht behalten möchten. Auf jeden Fall wird FreeBSD nasm automatisch aus dem Internet herunterladen, es kompilieren und auf Ihrem System installieren. Wenn es sich bei Ihrem System nicht um FreeBSD handelt, müssen Sie nasm von dessen Homepage herunterladen. Sie können es aber dannoch verwenden um FreeBSD code zu assemblieren. Nun können Sie den Code assemblieren, binden und ausführen: &prompt.user; nasm -f elf hello.asm &prompt.user; ld -s -o hello hello.o &prompt.user; ./hello Hello, World! &prompt.user; Hagen Kühl Übersetzt von &unix;-Filter schreiben Ein häufiger Typ von &unix;-Anwendungen ist ein Filter — ein Programm, das Eingaben von stdin liest, sie verarbeitet und das Ergebnis nach stdout schreibt. In diesem Kapitel möchten wir einen einfachen Filter entwickeln und lernen, wie wir von stdin lesen und nach stdout schreiben. Dieser Filter soll jedes Byte seiner Eingabe in eine hexadezimale Zahl gefolgt von einem Leerzeichen umwandeln. %include 'system.inc' section .data hex db '0123456789ABCDEF' buffer db 0, 0, ' ' section .text global _start _start: ; read a byte from stdin push dword 1 push dword buffer push dword stdin sys.read add esp, byte 12 or eax, eax je .done ; convert it to hex movzx eax, byte [buffer] mov edx, eax shr dl, 4 mov dl, [hex+edx] mov [buffer], dl and al, 0Fh mov al, [hex+eax] mov [buffer+1], al ; print it push dword 3 push dword buffer push dword stdout sys.write add esp, byte 12 jmp short _start .done: push dword 0 sys.exit Im Datenabschnitt erzeugen wir ein Array mit Namen hex. Es enthält die 16 hexadezimalen Ziffern in aufsteigender Reihenfolge. Diesem Array folgt ein Puffer, den wir sowohl für die Ein- als auch für die Ausgabe verwenden. Die ersten beiden Bytes dieses Puffers werden am Anfang auf 0 gesetzt. Dorthin schreiben wir die beiden hexadezimalen Ziffern (das erste Byte ist auch die Stelle an die wir die Eingabe lesen). Das dritte Byte ist ein Leerzeichen. Der Code-Abschnitt besteht aus vier Teilen: Das Byte lesen, es in eine hexadezimale Zahl umwandeln, das Ergebnis schreiben und letztendlich das Programm verlassen. Um das Byte zu lesen, bitten wir das System ein Byte von stdin zu lesen und speichern es im ersten Byte von buffer. Das System gibt die Anzahl an Bytes, die gelesen wurden, in EAX zurück. Diese wird 1 sein, wenn eine Eingabe empfangen wird und 0, wenn keine Eingabedaten mehr verfügbar sind. Deshalb überprüfen wir den Wert von EAX. Wenn dieser 0 ist, springen wir zu .done, ansonsten fahren wir fort. Zu Gunsten der Einfachheit ignorieren wir hier die Möglichkeit eines Fehlers. Die Umwandlungsroutine in eine Hexadezimalzahl liest das Byte aus buffer in EAX, oder genaugenommen nur in AL, wobei die übrigen Bits von EAX auf null gesetzt werden. Außerdem kopieren wir das Byte nach EDX, da wir die oberen vier Bits (Nibble) getrennt von den unteren vier Bits umwandeln müssen. Das Ergebnis speichern wir in den ersten beiden Bytes des Puffers. Als Nächstes bitten wir das System die drei Bytes in den Puffer zu schreiben, also die zwei hexadezimalen Ziffern und das Leerzeichen nach stdout. Danach springen wir wieder an den Anfang des Programms und verarbeiten das nächste Byte. Wenn die gesamte Eingabe verarbeitet ist, bitten wie das System unser Programm zu beenden und null zurückzuliefern, welches traditionell die Bedeutung hat, dass unser Programm erfolgreich war. Fahren Sie fort und speichern Sie den Code in eine Datei namens hex.asm. Geben Sie danach folgendes ein (^D bedeutet, dass Sie die Steuerungstaste drücken und dann D eingeben, während Sie Steuerung gedrückt halten): &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come! 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Wenn Sie von &ms-dos; zu &unix; wechseln, wundern Sie sich vielleicht, warum jede Zeile mit 0A an Stelle von 0D 0A endet. Das liegt daran, dass &unix; nicht die CR/LF-Konvention, sondern die "new line"-Konvention verwendet, welches hexadezimal als 0A dargestellt wird. Können wir das Programm verbessern? Nun, einerseits ist es etwas verwirrend, dass die Eingabe, nachdem wir eine Zeile verarbeitet haben, nicht wieder am Anfang der Zeile beginnt. Deshalb können wir unser Programm anpassen um einen Zeilenumbruch an Stelle eines Leerzeichens nach jedem 0A auszugeben: %include 'system.inc' section .data hex db '0123456789ABCDEF' buffer db 0, 0, ' ' section .text global _start _start: mov cl, ' ' .loop: ; read a byte from stdin push dword 1 push dword buffer push dword stdin sys.read add esp, byte 12 or eax, eax je .done ; convert it to hex movzx eax, byte [buffer] mov [buffer+2], cl cmp al, 0Ah jne .hex mov [buffer+2], al .hex: mov edx, eax shr dl, 4 mov dl, [hex+edx] mov [buffer], dl and al, 0Fh mov al, [hex+eax] mov [buffer+1], al ; print it push dword 3 push dword buffer push dword stdout sys.write add esp, byte 12 jmp short .loop .done: push dword 0 sys.exit Wir haben das Leerzeichen im Register CL abgelegt. Das können wir bedenkenlos tun, da &unix;-Systemaufrufe im Gegensatz zu denen von µsoft.windows; keine Werte von Registern ändern in denen sie keine Werte zurückliefern. Das bedeutet, dass wir CL nur einmal setzen müssen. Dafür haben wir ein neues Label .loop eingügt, zu dem wir an Stelle von _start springen, um das nächste Byte einzulesen. Außerdem haben wir das Label .hex eingefügt, somit können wir wahlweise ein Leerzeichen oder einen Zeilenumbruch im dritten Byte von buffer ablegen. Nachdem Sie hex.asm entsprechend der Neuerungen geändert haben, geben Sie Folgendes ein: &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come! 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Das sieht doch schon besser aus. Aber der Code ist ziemlich ineffizient! Wir führen für jeden einzelne Byte zweimal einen Systemaufruf aus (einen zum Lesen und einen um es in die Ausgabe zu schreiben). Hagen Kühl Übersetzt von Gepufferte Eingabe und Ausgabe Wir können die Effizienz unseres Codes erhöhen, indem wir die Ein- und Ausgabe puffern. Wir erzeugen einen Eingabepuffer und lesen dann eine Folge von Bytes auf einmal. Danach holen wir sie Byte für Byte aus dem Puffer. Wir erzeugen ebenfalls einen Ausgabepuffer. Darin speichern wir unsere Ausgabe bis er voll ist. Dann bitten wir den Kernel den Inhalt des Puffers nach stdout zu schreiben. Diese Programm endet, wenn es keine weitere Eingaben gibt. Aber wir müssen den Kernel immernoch bitten den Inhalt des Ausgabepuffers ein letztes Mal nach stdout zu schreiben, denn sonst würde ein Teil der Ausgabe zwar im Ausgabepuffer landen, aber niemals ausgegeben werden. Bitte vergessen Sie das nicht, sonst fragen Sie sich später warum ein Teil Ihrer Ausgabe verschwunden ist. %include 'system.inc' %define BUFSIZE 2048 section .data hex db '0123456789ABCDEF' section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text global _start _start: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer .loop: ; read a byte from stdin call getchar ; convert it to hex mov dl, al shr al, 4 mov al, [hex+eax] call putchar mov al, dl and al, 0Fh mov al, [hex+eax] call putchar mov al, ' ' cmp dl, 0Ah jne .put mov al, dl .put: call putchar jmp short .loop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: push dword BUFSIZE mov esi, ibuffer push esi push dword stdin sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: sub edi, ecx ; start of buffer push ecx push edi push dword stdout sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now ret Als dritten Abschnitt im Quelltext haben wir .bss. Dieser Abschnitt wird nicht in unsere ausführbare Datei eingebunden und kann daher nicht initialisiert werden. Wir verwenden resb anstelle von db. Dieses reserviert einfach die angeforderte Menge an uninitialisiertem Speicher zu unserer Verwendung. Wir nutzen, die Tatsache, dass das System die Register nicht verändert: Wir benutzen Register, wo wir anderenfalls globale Variablen im Abschnitt .data verwenden müssten. Das ist auch der Grund, warum die &unix;-Konvention, Parameter auf dem Stack zu übergeben, der von Microsoft, hierfür Register zu verwenden, überlegen ist: Wir können Register für unsere eigenen Zwecke verwenden. Wir verwenden EDI und ESI als Zeiger auf das nächste zu lesende oder schreibende Byte. Wir verwenden EBX und ECX, um die Anzahl der Bytes in den beiden Puffern zu zählen, damit wir wissen, wann wir die Ausgabe an das System übergeben, oder neue Eingabe vom System entgegen nehmen müssen. Lassen Sie uns sehen, wie es funktioniert: &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! Here I come! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Nicht was Sie erwartet haben? Das Programm hat die Ausgabe nicht auf dem Bildschirm ausgegeben bis sie ^D gedrückt haben. Das kann man leicht zu beheben indem man drei Zeilen Code einfügt, welche die Ausgabe jedesmal schreiben, wenn wir einen Zeilenumbruch in 0A umgewandelt haben. Ich habe die betreffenden Zeilen mit > markiert (kopieren Sie die > bitte nicht mit in Ihre hex.asm). %include 'system.inc' %define BUFSIZE 2048 section .data hex db '0123456789ABCDEF' section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text global _start _start: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer .loop: ; read a byte from stdin call getchar ; convert it to hex mov dl, al shr al, 4 mov al, [hex+eax] call putchar mov al, dl and al, 0Fh mov al, [hex+eax] call putchar mov al, ' ' cmp dl, 0Ah jne .put mov al, dl .put: call putchar > cmp al, 0Ah > jne .loop > call write jmp short .loop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: push dword BUFSIZE mov esi, ibuffer push esi push dword stdin sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: sub edi, ecx ; start of buffer push ecx push edi push dword stdout sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now ret Lassen Sie uns jetzt einen Blick darauf werfen, wie es funktioniert. &prompt.user; nasm -f elf hex.asm &prompt.user; ld -s -o hex hex.o &prompt.user; ./hex Hello, World! 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come! 48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user; Nicht schlecht für eine 644 Byte große Binärdatei, oder? Dieser Ansatz für gepufferte Ein- und Ausgabe enthält eine Gefahr, auf die ich im Abschnitt Die dunkle Seite des Buffering eingehen werde. Ein Zeichen ungelesen machen Das ist vielleicht ein etwas fortgeschrittenes Thema, das vor allem für Programmierer interessant ist, die mit der Theorie von Compilern vertraut sind. Wenn Sie wollen, können Sie zum nächsten Abschnitt springen und das hier vielleicht später lesen. Unser Beispielprogramm benötigt es zwar nicht, aber etwas anspruchsvollere Filter müssen häufig vorrausschauen. Mit anderen Worten, sie müssen wissen was das nächste Zeichen ist (oder sogar mehrere Zeichen). Wenn das nächste Zeichen einen bestimmten Wert hat, ist es Teil des aktuellen Tokens, ansonsten nicht. Zum Beispiel könnten Sie den Eingabestrom für eine Text-Zeichenfolge parsen (z.B. wenn Sie einen Compiler einer Sprache implementieren): Wenn einem Buchstaben ein anderer Buchstabe oder vielleicht eine Ziffer folgt, ist er ein Teil des Tokens, das Sie verarbeiten. Wenn ihm ein Leerzeichen folgt, oder ein anderer Wert, ist er nicht Teil des aktuellen Tokens. Das führt usn zu einem interessanten Problem: Wie kann man ein Zeichen zurück in den Eingabestrom geben, damit es später noch einmal geleseni werden kann? Eine mögliche Lösung ist, das Zeichen in einer Variable zu speichern und ein Flag zu setzen. Wir können getchar so anpassen, dass es das Flag überprüft und, wenn es gesetzt ist, das Byte aus der Variable anstatt dem Eingabepuffer liest und das Flag zurück setzt. Aber natürlich macht uns das langsamer. Die Sprache C hat eine Funktion ungetc() für genau diesen Zweck. Gibt es einen schnellen Weg, diese in unserem Code zu implementieren? Ich möchte Sie bitten nach oben zu scrollen und sich die Prozedur getchar anzusehen und zu versuchen eine schöne und schnelle Lösung zu finden, bevor Sie den nächsten Absatz lesen. Kommen Sie danach hierher zurück und schauen sich meine Lösung an. Der Schlüssel dazu ein Zeichen an den Eingabestrom zurückzugeben, liegt darin, wie wir das Zeichen bekommen: Als erstes überprüfen wir, ob der Puffer leer ist, indem wir den Wert von EBX testen. Wenn er null ist, rufen wir die Prozedur read auf. Wenn ein Zeichen bereit ist verwenden wir lodsb, dann verringern wir den Wert von EBX. Die Anweisung lodsb ist letztendlich identisch mit: mov al, [esi] inc esi Das Byte, welches wir abgerufen haben, verbleibt im Puffer bis read zum nächsten Mal aufgerufen wird. Wir wissen nicht wann das passiert, aber wir wissen, dass es nicht vor dem nächsten Aufruf von getchar passiert. Daher ist alles was wir tun müssen um das Byte in den Strom "zurückzugeben" ist den Wert von ESI zu verringern und den von EBX zu erhöhen: ungetc: dec esi inc ebx ret Aber seien Sie vorsichtig! Wir sind auf der sicheren Seite, solange wir immer nur ein Zeichen im Voraus lesen. Wenn wir mehrere kommende Zeichen betrachten und ungetc mehrmals hintereinander aufrufen, wird es meistens funktionieren, aber nicht immer (und es wird ein schwieriger Debug). Warum? Solange getchar read nicht aufrufen muss, befinden sich alle im Voraus gelesenen Bytes noch im Puffer und ungetc arbeitet fehlerfrei. Aber sobald getchar read aufruft verändert sich der Inhalt des Puffers. Wir können uns immer darauf verlassen, dass ungetc auf dem zuletzt mit getchar gelesenen Zeichen korrekt arbeitet, aber nicht auf irgendetwas, das davor gelesen wurde. Wenn Ihr Programm mehr als ein Byte im Voraus lesen soll, haben Sie mindestens zwei Möglichkeiten: Die einfachste Lösung ist, Ihr Programm so zu ändern, dass es immer nur ein Byte im Voraus liest, wenn das möglich ist. Wenn Sie diese Möglichkeit nicht haben, bestimmen Sie zuerst die maximale Anzahl an Zeichen, die Ihr Programm auf einmal an den Eingabestrom zurückgeben muss. Erhöhen Sie diesen Wert leicht, nur um sicherzugehen, vorzugsweise auf ein Vielfaches von 16—damit er sich schön ausrichtet. Dann passen Sie den .bss Abschnitt Ihres Codes an und erzeugen einen kleinen Reserver-Puffer, direkt vor ihrem Eingabepuffer, in etwa so: section .bss resb 16 ; or whatever the value you came up with ibuffer resb BUFSIZE obuffer resb BUFSIZE Außerdem müssen Sie ungetc anpassen, sodass es den Wert des Bytes, das zurückgegeben werden soll, in AL übergibt: ungetc: dec esi inc ebx mov [esi], al ret Mit dieser Änderung können Sie sicher ungetc bis zu 17 Mal hintereinander gqapaufrufen (der erste Aufruf erfolgt noch im Puffer, die anderen 16 entweder im Puffer oder in der Reserve). Fabian Ruch Übersetzt von Kommandozeilenparameter Unser hex-Programm wird nützlicher, wenn es die Dateinamen der Ein- und Ausgabedatei über die Kommandozeile einlesen kann, d.h., wenn es Kommandozeilenparameter verarbeiten kann. Aber... Wo sind die? Bevor ein &unix;-System ein Programm ausführt, legt es einige Daten auf dem Stack ab (push) und springt dann an das _start-Label des Programms. Ja, ich sagte springen, nicht aufrufen. Das bedeutet, dass auf die Daten zugegriffen werden kann, indem [esp+offset] ausgelesen wird oder die Daten einfach vom Stack genommen werden (pop). Der Wert ganz oben auf dem Stack enthält die Zahl der Kommandozeilenparameter. Er wird traditionell argc wie "argument count" genannt. Die Kommandozeilenparameter folgen einander, alle argc. Von diesen wird üblicherweise als argv wie "argument value(s)" gesprochen. So erhalten wir argv[0], argv[1], ... und argv[argc-1]. Dies sind nicht die eigentlichen Parameter, sondern Zeiger (Pointer) auf diese, d.h., Speicheradressen der tatsächlichen Parameter. Die Parameter selbst sind durch NULL beendete Zeichenketten. Der argv-Liste folgt ein NULL-Zeiger, was einfach eine 0 ist. Es gibt noch mehr, aber dies ist erst einmal genug für unsere Zwecke. Falls Sie von der &ms-dos;-Programmierumgebung kommen, ist der größte Unterschied die Tatsache, dass jeder Parameter eine separate Zeichenkette ist. Der zweite Unterschied ist, dass es praktisch keine Grenze gibt, wie viele Parameter vorhanden sein können. Ausgerüstet mit diesen Kenntnissen, sind wir beinahe bereit für eine weitere Version von hex.asm. Zuerst müssen wir jedoch noch ein paar Zeilen zu system.inc hinzufügen: Erstens benötigen wir zwei neue Einträge in unserer Liste mit den Systemaufrufnummern: %define SYS_open 5 %define SYS_close 6 Zweitens fügen wir zwei neue Makros am Ende der Datei ein: %macro sys.open 0 system SYS_open %endmacro %macro sys.close 0 system SYS_close %endmacro Und hier ist schließlich unser veränderter Quelltext: %include 'system.inc' %define BUFSIZE 2048 section .data fd.in dd stdin fd.out dd stdout hex db '0123456789ABCDEF' section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text align 4 err: push dword 1 ; return failure sys.exit align 4 global _start _start: add esp, byte 8 ; discard argc and argv[0] pop ecx jecxz .init ; no more arguments ; ECX contains the path to input file push dword 0 ; O_RDONLY push ecx sys.open jc err ; open failed add esp, byte 8 mov [fd.in], eax pop ecx jecxz .init ; no more arguments ; ECX contains the path to output file push dword 420 ; file mode (644 octal) push dword 0200h | 0400h | 01h ; O_CREAT | O_TRUNC | O_WRONLY push ecx sys.open jc err add esp, byte 12 mov [fd.out], eax .init: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer .loop: ; read a byte from input file or stdin call getchar ; convert it to hex mov dl, al shr al, 4 mov al, [hex+eax] call putchar mov al, dl and al, 0Fh mov al, [hex+eax] call putchar mov al, ' ' cmp dl, 0Ah jne .put mov al, dl .put: call putchar cmp al, dl jne .loop call write jmp short .loop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: push dword BUFSIZE mov esi, ibuffer push esi push dword [fd.in] sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer ; close files push dword [fd.in] sys.close push dword [fd.out] sys.close ; return success push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: sub edi, ecx ; start of buffer push ecx push edi push dword [fd.out] sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now ret In unserem .data-Abschnitt befinden sich nun die zwei neuen Variablen fd.in und fd.out. Hier legen wir die Dateideskriptoren der Ein- und Ausgabedatei ab. Im .text-Abschnitt haben wir die Verweise auf stdin und stdout durch [fd.in] und [fd.out] ersetzt. Der .text-Abschnitt beginnt nun mit einer einfachen Fehlerbehandlung, welche nur das Programm mit einem Rückgabewert von 1 beendet. Die Fehlerbehandlung befindet sich vor _start, sodass wir in geringer Entfernung von der Stelle sind, an der der Fehler auftritt. Selbstverständlich beginnt die Programmausführung immer noch bei _start. Zuerst entfernen wir argc und argv[0] vom Stack: Sie sind für uns nicht von Interesse (sprich, in diesem Programm). Wir nehmen argv[1] vom Stack und legen es in ECX ab. Dieses Register ist besonders für Zeiger geeignet, da wir mit jecxz NULL-Zeiger verarbeiten können. Falls argv[1] nicht NULL ist, versuchen wir, die Datei zu öffnen, die der erste Parameter festlegt. Andernfalls fahren wir mit dem Programm fort wie vorher: Lesen von stdin und Schreiben nach stdout. Falls wir die Eingabedatei nicht öffnen können (z.B. sie ist nicht vorhanden), springen wir zur Fehlerbehandlung und beenden das Programm. Falls es keine Probleme gibt, sehen wir nun nach dem zweiten Parameter. Falls er vorhanden ist, öffnen wir die Ausgabedatei. Andernfalls schreiben wir die Ausgabe nach stdout. Falls wir die Ausgabedatei nicht öffnen können (z.B. sie ist zwar vorhanden, aber wir haben keine Schreibberechtigung), springen wir auch wieder in die Fehlerbehandlung. Der Rest des Codes ist derselbe wie vorher, außer dem Schließen der Ein- und Ausgabedatei vor dem Verlassen des Programms und, wie bereits erwähnt, die Benutzung von [fd.in] und [fd.out]. Unsere Binärdatei ist nun kolossale 768 Bytes groß. Können wir das Programm immer noch verbessern? Natürlich! Jedes Programm kann verbessert werden. Hier finden sich einige Ideen, was wir tun könnten: Die Fehlerbehandlung eine Warnung auf stderr ausgeben lassen. Den Lese- und Schreibfunkionen eine Fehlerbehandlung hinzufügen. Schließen von stdin, sobald wir eine Eingabedatei öffnen, von stdout, sobald wir eine Ausgabedatei öffnen. Hinzufügen von Kommandozeilenschaltern wie zum Beispiel -i und -o, sodass wir die Ein- und Ausgabedatei in irgendeiner Reihenfolge angeben oder vielleicht von stdin lesen und in eine Datei schreiben können. Ausgeben einer Gebrauchsanweisung, falls die Kommandozeilenparameter fehlerhaft sind. Ich beabsichtige, diese Verbesserungen dem Leser als Übung zu hinterlassen: Sie wissen bereits alles, das Sie wissen müssen, um die Verbesserungen durchzuführen. Fabian Ruch Übersetzt von Die &unix;-Umgebung Ein entscheidendes Konzept hinter &unix; ist die Umgebung, die durch Umgebungsvariablen festgelegt wird. Manche werden vom System gesetzt, andere von Ihnen und wieder andere von der shell oder irgendeinem Programm, das ein anderes lädt. Umgebungsvariablen herausfinden Ich sagte vorher, dass wenn ein Programm mit der Ausführung beginnt, der Stack argc gefolgt vom durch NULL beendeten argv-Array und etwas Anderem enthält. Das "etwas Andere" ist die Umgebung oder, um genauer zu sein, ein durch NULL beendetes Array von Zeigern auf Umgebungsvariablen. Davon wird oft als env gesprochen. Der Aufbau von env entspricht dem von argv, eine Liste von Speicheradressen gefolgt von NULL (0). In diesem Fall gibt es kein "envc"—wir finden das Ende heraus, indem wir nach dem letzten NULL suchen. Die Variablen liegen normalerweise in der Form name=value vor, aber manchmal kann der =value-Teil fehlen. Wir müssen diese Möglichkeit in Betracht ziehen. webvars Ich könnte Ihnen einfach etwas Code zeigen, der die Umgebung in der Art vom &unix;-Befehl env ausgibt. Aber ich dachte, dass es interessanter sei, ein einfaches CGI-Werkzeug in Assembler zu schreiben. CGI: Ein kurzer Überblick Ich habe eine detaillierte CGI-Anleitung auf meiner Webseite, aber hier ist ein sehr kurzer Überblick über CGI: Der Webserver kommuniziert mit dem CGI-Programm, indem er Umgebungsvariablen setzt. Das CGI-Programm schreibt seine Ausgabe auf stdout. Der Webserver liest von da. Die Ausgabe muss mit einem HTTP-Kopfteil gefolgt von zwei Leerzeilen beginnen. Das Programm gibt dann den HTML-Code oder was für einen Datentyp es auch immer verarbeitet aus. Während bestimmte Umgebungsvariablen Standardnamen benutzen, unterscheiden sich andere, abhägngig vom Webserver. Dies macht webvars zu einem recht nützlichen Werkzeug. Der Code Unser webvars-Programm muss also den HTTP-Kopfteil gefolgt von etwas HTML-Auszeichnung versenden. Dann muss es die Umgebungsvariablen eine nach der anderen auslesen und sie als Teil der HTML-Seite versenden. Nun der Code. Ich habe Kommentare und Erklärungen direkt in den Code eingefügt: ;;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Copyright (c) 2000 G. Adam Stanislav ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions ; are met: ; 1. Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; 2. Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ; SUCH DAMAGE. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Version 1.0 ; ; Started: 8-Dec-2000 ; Updated: 8-Dec-2000 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' section .data http db 'Content-type: text/html', 0Ah, 0Ah db '<?xml version="1.0" encoding="UTF-8"?>', 0Ah db '<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML Strict//EN" ' db '"DTD/xhtml1-strict.dtd">', 0Ah db '<html xmlns="http://www.w3.org/1999/xhtml" ' db 'xml.lang="en" lang="en">', 0Ah db '<head>', 0Ah db '<title>Web Environment</title>', 0Ah db '<meta name="author" content="G. Adam Stanislav" />', 0Ah db '</head>', 0Ah, 0Ah db '<body bgcolor="#ffffff" text="#000000" link="#0000ff" ' db 'vlink="#840084" alink="#0000ff">', 0Ah db '<div class="webvars">', 0Ah db '<h1>Web Environment</h1>', 0Ah db '<p>The following <b>environment variables</b> are defined ' db 'on this web server:</p>', 0Ah, 0Ah db '<table align="center" width="80" border="0" cellpadding="10" ' db 'cellspacing="0" class="webvars">', 0Ah httplen equ $-http left db '<tr>', 0Ah db '<td class="name"><tt>' leftlen equ $-left middle db '</tt></td>', 0Ah db '<td class="value"><tt><b>' midlen equ $-middle undef db '<i>(undefined)</i>' undeflen equ $-undef right db '</b></tt></td>', 0Ah db '</tr>', 0Ah rightlen equ $-right wrap db '</table>', 0Ah db '</div>', 0Ah db '</body>', 0Ah db '</html>', 0Ah, 0Ah wraplen equ $-wrap section .text global _start _start: ; First, send out all the http and xhtml stuff that is ; needed before we start showing the environment push dword httplen push dword http push dword stdout sys.write ; Now find how far on the stack the environment pointers ; are. We have 12 bytes we have pushed before "argc" mov eax, [esp+12] ; We need to remove the following from the stack: ; ; The 12 bytes we pushed for sys.write ; The 4 bytes of argc ; The EAX*4 bytes of argv ; The 4 bytes of the NULL after argv ; ; Total: ; 20 + eax * 4 ; ; Because stack grows down, we need to ADD that many bytes ; to ESP. lea esp, [esp+20+eax*4] cld ; This should already be the case, but let's be sure. ; Loop through the environment, printing it out .loop: pop edi or edi, edi ; Done yet? je near .wrap ; Print the left part of HTML push dword leftlen push dword left push dword stdout sys.write ; It may be tempting to search for the '=' in the env string next. ; But it is possible there is no '=', so we search for the ; terminating NUL first. mov esi, edi ; Save start of string sub ecx, ecx not ecx ; ECX = FFFFFFFF sub eax, eax repne scasb not ecx ; ECX = string length + 1 mov ebx, ecx ; Save it in EBX ; Now is the time to find '=' mov edi, esi ; Start of string mov al, '=' repne scasb not ecx add ecx, ebx ; Length of name push ecx push esi push dword stdout sys.write ; Print the middle part of HTML table code push dword midlen push dword middle push dword stdout sys.write ; Find the length of the value not ecx lea ebx, [ebx+ecx-1] ; Print "undefined" if 0 or ebx, ebx jne .value mov ebx, undeflen mov edi, undef .value: push ebx push edi push dword stdout sys.write ; Print the right part of the table row push dword rightlen push dword right push dword stdout sys.write ; Get rid of the 60 bytes we have pushed add esp, byte 60 ; Get the next variable jmp .loop .wrap: ; Print the rest of HTML push dword wraplen push dword wrap push dword stdout sys.write ; Return success push dword 0 sys.exit Dieser Code erzeugt eine 1.396-Byte große Binärdatei. Das meiste davon sind Daten, d.h., die HTML-Auszeichnung, die wir versenden müssen. Assemblieren Sie es wie immer: &prompt.user; nasm -f elf webvars.asm &prompt.user; ld -s -o webvars webvars.o Um es zu benutzen, müssen Sie webvars auf Ihren Webserver hochladen. Abhängig von Ihrer Webserver-Konfiguration, müssen Sie es vielleicht in einem speziellen cgi-bin-Verzeichnis ablegen oder es mit einer .cgi-Dateierweiterung versehen. Schließlich benötigen Sie Ihren Webbrowser, um sich die Ausgabe anzusehen. Um die Ausgabe auf meinem Webserver zu sehen, gehen Sie bitte auf http://www.int80h.org/webvars/. Falls Sie neugierig sind, welche zusätzlichen Variablen in einem passwortgeschützten Webverzeichnis vorhanden sind, gehen Sie auf http://www.int80h.org/private/ unter Benutzung des Benutzernamens asm und des Passworts programmer. Paul Keller Übersetzt von Fabian Borschel Arbeiten mit Dateien Wir haben bereits einfache Arbeiten mit Dateien gemacht: Wir wissen wie wir sie öffnen und schliessen, oder wie man sie mit Hilfe von Buffern liest und schreibt. Aber &unix; bietet viel mehr Funktionalität wenn es um Dateien geht. Wir werden einige von ihnen in dieser Sektion untersuchen und dann mit einem netten Datei Konvertierungs Werkzeug abschliessen. In der Tat, Lasst uns am Ende beginnen, also mit dem Datei Konvertierungs Werkzeug. Es macht Programmieren immer einfacher, wenn wir bereits am Anfang wissen was das End Produkt bezwecken soll. Eines der ersten Programme die ich für &unix; schrieb war tuc, ein Text-Zu-&unix; Datei Konvertierer. Es konvertiert eine Text Datei von einem anderen Betriebssystem zu einer &unix; Text Datei. Mit anderen Worten, es ändert die verschiedenen Arten von Zeilen Begrenzungen zu der Zeilen Begrenzungs Konvention von &unix;. Es speichert die Ausgabe in einer anderen Datei. Optional konvertiert es eine &unix; Text Datei zu einer DOS Text Datei. Ich habe tuc sehr oft benutzt, aber nur von irgendeinem anderen OS nach &unix; zu konvertieren, niemals anders herum. Ich habe mir immer gewünscht das die Datei einfach überschrieben wird anstatt das ich die Ausgabe in eine andere Datei senden muss. Meistens, habe ich diesen Befehl verwendet: &prompt.user; tuc myfile tempfile &prompt.user; mv tempfile myfile Es wäre schö ein ftuc zu haben, also, fast tuc, und es so zu benutzen: &prompt.user; ftuc myfile In diesem Kapitel werden wir dann, ftuc in Assembler schreiben (das Original tuc ist in C), und verschiedene Datei-Orientierte Kernel Dienste in dem Prozess studieren. Auf erste Sicht, ist so eine Datei Konvertierung sehr simpel: Alles was du zu tun hast, ist die Wagen Rückläfe zu entfernen, richtig? Wenn du mit ja geantwortet hast, denk nochmal darüber nach: Dieses Herrangehen wird die meiste Zeit funktionieren (zumindest mit MSDOS Text Dateien), aber gelegentlich fehlschlagen. Das Problem ist das nicht alle &unix; Text Dateien ihre Zeilen mit einer Wagen Rücklauf / Zeilenvorschub Sequenz beenden. Manche benutzen Wagenrücklauf ohne Zeilenvorschub. Andere kombinieren mehrere leere Zeilen in einen einzigen Wagenrücklauf gefolgt von mehreren Zeilenvorschüben. Und so weiter. Ein Text Datei Konvertierer muss dann also in der Lage sein mit allen möglichen Zeilenenden umzugehen: Wagenrücklauf / Zeilenvorschub Wagenrücklauf Zeilenvorschub / Wagenrücklauf Zeilenvorschub Es sollte außerdem in der Lage sein mit Dateien umzugehen die irgendeine Art von Kombination der oben stehenden Möglichkeiten verwendet. (z.B., Wagenrücklauf gefolgt von mehreren Zeilenvorschüben). Endlicher Zustandsautomat Das Problem wird einfach gelöst in dem man eine Technik benutzt die sich Endlicher Zustandsautomat nennt, ursprünglich wurde sie von den Designern digitaler elektronischer Schaltkreise entwickelt. Eine Endlicher Zustandsautomat ist ein digitaler Schaltkreis dessen Ausgabe nicht nur von der Eingabe abhängig ist sondern auch von der vorherigen Eingabe, d.h., von seinem Status. Der Mikroprozessor ist ein Beispiel für einen Endlichen Zustandsautomaten : Unser Assembler Sprach Code wird zu Maschinensprache übersetzt in der manche Assembler Sprach Codes ein einzelnes Byte produzieren, während andere mehrere Bytes produzieren. Da der Microprozessor die Bytes einzeln aus dem Speicher liest, ändern manche nur seinen Status anstatt eine Ausgabe zu produzieren. Wenn alle Bytes eines OP Codes gelesen wurden, produziert der Mikroprozessor eine Ausgabe, oder ändert den Wert eines Registers, etc. Aus diesem Grund, ist jede Software eigentlich nur eine Sequenz von Status Anweisungen für den Mikroprozessor. Dennoch, ist das Konzept eines Endlichen Zustandsautomaten auch im Software Design sehr hilfreich. Unser Text Datei Konvertierer kann als Endlicher Zustandsautomat mit 3 möglichen Stati desgined werden. Wir könnten diese von 0-2 benennen, aber es wird uns das Leben leichter machen wenn wir ihnen symbolische Namen geben: ordinary cr lf Unser Programm wird in dem ordinary Status starten. Während dieses Status, hängt die Aktion des Programms von seiner Eingabe wie folgt ab: Wenn die Eingabe etwas anderes als ein Wagenrücklauf oder einem Zeilenvorschub ist, wird die Eingabe einfach nur an die Ausgabe geschickt. Der Status bleibt unverändert. Wenn die Eingabe ein Wagenrücklauf ist, wird der Status auf cr gesetzt. Die Eingabe wird dann verworfen, d.h., es entsteht keine Ausgabe. Wenn die Eingabe ein Zeilenvorschub ist, wird der Status auf lf gesetzt. Die Eingabe wird dann verworfen. Wann immer wir in dem cr Status sind, ist das weil die letzte Eingabe ein Wagenrücklauf war, welcher nicht verarbeitet wurde. Was unsere Software in diesem Status macht hängt von der aktuellen Eingabe ab: Wenn die Eingabe irgendetwas anderes als ein Wagenrücklauf oder ein Zeilenvorschub ist, dann gib einen Zeilenvorschub aus, dann gib die Eingabe aus und dann ändere den Status zu ordinary. Wenn die Eingabe ein Wagenrücklauf ist, haben wir zwei (oder mehr) Wagenrückläufe in einer Reihe. Wir verwerfen die Eingabe, wir geben einen Zeilenvorschub aus und lassen den Status unverändert. Wenn die Eingabe ein Zeilenvorschub ist, geben wir den Zeilenvorschub aus und ändern den Status zu ordinary. Achte darauf das, dass nicht das gleiche wie in dem Fall oben drüber ist – würden wir versuchen beide zu kombinieren, würden wir zwei Zeilenvorschübe anstatt einen ausgeben. Letztendlich, sind wir in dem lf Status nachdem wir einen Zeilenvorschub empfangen haben der nicht nach einem Wagenrücklauf kam. Das wird passieren wenn unsere Datei bereits im &unix; Format ist, oder jedesmal wenn mehrere Zeilen in einer Reihe durch einen einzigen Wagenrücklauf gefolgt von mehreren Zeilenvorschüben ausgedrückt wird, oder wenn die Zeile mit einer Zeilenvorschub / Wagenrücklauf Sequenz endet. Wir sollten mit unserer Eingabe in diesem Status folgendermasen umgehen: Wenn die Eingabe irgendetwas anderes als ein Wagenrücklauf oder ein Zeilenvorschub ist, geben wir einen Zeilenvorschub aus, geben dann die Eingabe aus und ändern dann den Status zu ordinary. Das ist exakt die gleiche Aktion wie in dem cr Status nach dem Empfangen der selben Eingabe. Wenn die Eingabe ein Wagenrücklauf ist, verwerfen wir die Eingabe, geben einen Zeilenvorschub aus und ändern dann den Status zu ordinary. Wenn die Eingabe ein Zeilenvorschub ist, geben wir den Zeilenvorschub aus und lassen den Status unverändert. Der Endgültige Status Der obige Endliche Zustandsautomat funktioniert für die gesamte Datei, aber lässt die Möglichkeit das die letzte Zeile ignoriert wird. Das wird jedesmal passieren wenn die Datei mit einem einzigen Wagenrücklauf oder einem einzigen Zeilenvorschub endet. Daran habe ich nicht gedacht als ich tuc schrieb, nur um festzustellen das,dass letzte Zeilenende gelegentlich weggelassen wird. Das Problem wird einfach dadurch gelöst, indem man den Status überprüft nachdem die gesamte Datei verarbeitet wurde. Wenn der Status nicht ordinary ist, müssen wir nur den letzten Zeilenvorschub ausgeben. Nachdem wir unseren Algorithmus nun als einen Endlichen Zustandsautomaten formuliert haben, könnten wir einfach einen festgeschalteten digitalen elektronischen Schaltkreis (einen "Chip") designen, der die Umwandlung für uns übernimmt. Natürlich wäre das sehr viel teurer, als ein Assembler Programm zu schreiben. Der Ausgabe Zähler Weil unser Datei Konvertierungs Programm möglicherweise zwei Zeichen zu einem kombiniert, müssen wir einen Ausgabe Zähler verwenden. Wir initialisieren den Zähler zu 0 und erhöhen ihn jedes mal wenn wir ein Zeichen an die Ausgabe schicken. Am Ende des Programms, wird der Zähler uns sagen auf welche Grösse wir die Datei setzen müssen. Implementieren von EZ als Software Der schwerste Teil beim arbeiten mit einer Endlichen Zustandsmaschine ist das analysieren des Problems und dem ausdrücken als eine Endliche Zustandsmaschine. That geschafft, schreibt sich die Software fast wie von selbst. In eine höheren Sprache, wie etwa C, gibt es mehrere Hauptansätze. Einer wäre ein switch Angabe zu verwenden die auswählt welche Funktion genutzt werden soll. Zum Beispiel, switch (state) { default: case REGULAR: regular(inputchar); break; case CR: cr(inputchar); break; case LF: lf(inputchar); break; } Ein anderer Ansatz ist es ein Array von Funktions Zeigern zu benutzen, etwa wie folgt: (output[state])(inputchar); Noch ein anderer ist es aus state einen Funktions Zeiger zu machen und ihn zu der entsprechenden Funktion zeigen zu lassen: (*state)(inputchar); Das ist der Ansatz den wir in unserem Programm verwenden werden, weil es in Assembler sehr einfach und schnell geht. Wir werden einfach die Adresse der Prozedur in EBX speichern und dann einfach das ausgeben: call ebx Das ist wahrscheinlich schneller als die Adresse im Code zu hardcoden weil der Mikroprozessor die Adresse nicht aus dem Speicher lesen muss—es ist bereits in einer der Register gespeichert. Ich sagte wahrscheinlich weil durch das Cachen neuerer Mikroprozessoren beide Varianten in etwa gleich schnell sind. Speicher abgebildete Dateien Weil unser Programm nur mit einzelnen Dateien funktioniert, können wir nicht den Ansatz verwedenden der zuvor funktioniert hat, d.h., von einer Eingabe Datei zu lesen und in eine Ausgabe Datei zu schreiben. &unix; erlaubt es uns eine Datei, oder einen Bereich einer Datei, in den Speicher abzubilden. Um das zu tun, müssen wir zuerst eine Datei mit den entsprechenden Lese/Schreib Flags öffnen. Dann benutzen wir den mmap system call um sie in den Speicher abzubilden. Ein Vorteil von mmap ist, das es automatisch mit virtuellem Speicher arbeitet: Wir können mehr von der Datei im Speicher abbilden als wir überhaupt physikalischen Speicher zur Verfügung haben, noch immer haben wir aber durch normale OP Codes wie mov, lods, und stos Zugriff darauf. Egal welche Änderungen wir an dem Speicherabbild der Datei vornehmen, sie werden vom System in die Datei geschrieben. Wir müssen die Datei nicht offen lassen: So lange sie abgebildet bleibt, können wir von ihr lesen und in sie schreiben. Ein 32-bit Intel Mikroprozessor kann auf bis zu vier Gigabyte Speicher zugreifen – physisch oder virtuell. Das FreeBSD System erlaubt es uns bis zu der Hälfte für die Datei Abbildung zu verwenden. Zur Vereinfachung, werden wir in diesem Tutorial nur Dateien konvertieren die in ihrere Gesamtheit im Speicher abgebildet werden können. Es gibt wahrscheinlich nicht all zu viele Text Dateien die eine Grösse von zwei Gigabyte überschreiben. Falls unser Programm doch auf eine trifft, wird es einfach eine Meldung anzeigen mit dem Vorschlag das originale tuc statt dessen zu verwenden. Wenn du deine Kopie von syscalls.master überprüfst, wirst du zwei verschiedene Systemaufrufe finden die sich mmap nennen. Das kommt von der Entwicklung von &unix;: Es gab das traditionelle BSD mmap, Systemaufruf 71. Dieses wurde durch das &posix; mmap ersetzt, Systemaufruf 197. Das FreeBSD System unterstützt beide, weil ältere Programme mit der originalen BSD Version geschrieben wurden. Da neue Software die &posix; Version nutzt, werden wir diese auch verwenden. Die syscalls.master Datei zeigt die &posix; Version wie folgt: 197 STD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \ int flags, int fd, long pad, off_t pos); } Das weicht etwas von dem ab was mmap 2 sagt. Das ist weil mmap 2 die C Version beschreibt. Der Unterschiede liegt in dem long pad Argument, welches in der C Version nicht vorhanden ist. Wie auch immer, der FreeBSD Systemaufruf fügt einen 32-bit Block ein nachdem es ein 64-Bit Argument auf den Stack gepusht hat. In diesem Fall, ist off_t ein 64-Bit Wert. Wenn wir fertig sind mit dem Arbeiten einer im Speicher abgebildeten Datei, entfernen wir das Speicherabbild mit dem munmap Systemaufruf: Für eine detailiert Behandlung von mmap, sieh in W. Richard Stevens' Unix Network Programming, Volume 2, Chapter 12 nach. Feststellen der Datei Grösse Weil wir mmap sagen müssen wie viele Bytes von Datei wir im Speicher abbilden wollen und wir außerdem die gesamte Datei abbilden wollen, müssen wir die Grösse der Datei feststellen. Wir können den fstat Systemaufruf verwenden um alle Informationen über eine geöffnete Datei zu erhalten die uns das System geben kann. Das beinhaltet die Datei Grösse. Und wieder, zeigt uns syscalls.master zwei Versionen von fstat, eine traditionelle (Systemaufruf 62), und eine &posix; (Systemaufruf 189) Variante. Natürlich, verwenden wir die &posix; Version: 189 STD POSIX { int fstat(int fd, struct stat *sb); } Das ist ein sehr unkomplizierter Aufruf: Wir übergeben ihm die Adresse einer stat Structure und den Deskriptor einer geöffneten Datei. Es wird den Inhalt der stat Struktur ausfüllen. Ich muss allerdings sagen, das ich versucht habe die stat Struktur in dem .bss Bereich zu deklarieren, und fstat mochte es nicht: Es setzte das Carry Flag welches einen Fehler anzeigt. Nachdem ich den Code veränderte so dass er die Struktur auf dem Stack anlegt, hat alles gut funktioniert. Ändern der Dateigrösse Dadurch das unser Programm Wagenrücklauf/Zeilenvorschub-Sequenzen in einfache Zeilenvorschübe zusammenfassen könnte, könnte unsere Ausgabe kleiner sein als unsere Eingabe. Und da wir die Ausgabe in dieselbe Datei um, aus der wir unsere Eingabe erhalten, müssen wir eventuell die Dateigrösse anpassen. Der Systemaufruf ftruncate erlaubt uns, dies zu tun. Abgesehen von dem etwas unglücklich gewählten Namen ftruncate können wir mit dieser Funktion eine Datei vergrössern, oder verkleinern. Und ja, wir werden zwei Versionen von ftruncate in syscalls.master finden, eine ältere (130) und eine neuere (201). Wir werden die neuere Version verwenden: 201 STD BSD { int ftruncate(int fd, int pad, off_t length); } Beachten Sie bitte, dass hier wieder int pad verwendet wird. ftuc Wir wissen jetzt alles nötige, um ftuc zu schreiben. Wir beginnen, indem wir ein paar neue Zeilen der Datei system.inc hinzufügen. Als erstes definieren wir irgendwo am Anfang der Datei einige Konstanten und Strukturen: ;;;;;;; open flags %define O_RDONLY 0 %define O_WRONLY 1 %define O_RDWR 2 ;;;;;;; mmap flags %define PROT_NONE 0 %define PROT_READ 1 %define PROT_WRITE 2 %define PROT_EXEC 4 ;; %define MAP_SHARED 0001h %define MAP_PRIVATE 0002h ;;;;;;; stat structure struc stat st_dev resd 1 ; = 0 st_ino resd 1 ; = 4 st_mode resw 1 ; = 8, size is 16 bits st_nlink resw 1 ; = 10, ditto st_uid resd 1 ; = 12 st_gid resd 1 ; = 16 st_rdev resd 1 ; = 20 st_atime resd 1 ; = 24 st_atimensec resd 1 ; = 28 st_mtime resd 1 ; = 32 st_mtimensec resd 1 ; = 36 st_ctime resd 1 ; = 40 st_ctimensec resd 1 ; = 44 st_size resd 2 ; = 48, size is 64 bits st_blocks resd 2 ; = 56, ditto st_blksize resd 1 ; = 64 st_flags resd 1 ; = 68 st_gen resd 1 ; = 72 st_lspare resd 1 ; = 76 st_qspare resd 4 ; = 80 endstruc Wir definieren die neuen Systemaufrufe: %define SYS_mmap 197 %define SYS_munmap 73 %define SYS_fstat 189 %define SYS_ftruncate 201 Wir fügen die Makros hinzu: %macro sys.mmap 0 system SYS_mmap %endmacro %macro sys.munmap 0 system SYS_munmap %endmacro %macro sys.ftruncate 0 system SYS_ftruncate %endmacro %macro sys.fstat 0 system SYS_fstat %endmacro Und hier ist unser Code: ;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Started: 21-Dec-2000 ;; Updated: 22-Dec-2000 ;; ;; Copyright 2000 G. Adam Stanislav. ;; All rights reserved. ;; ;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' section .data db 'Copyright 2000 G. Adam Stanislav.', 0Ah db 'All rights reserved.', 0Ah usg db 'Usage: ftuc filename', 0Ah usglen equ $-usg co db "ftuc: Can't open file.", 0Ah colen equ $-co fae db 'ftuc: File access error.', 0Ah faelen equ $-fae ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah ftllen equ $-ftl mae db 'ftuc: Memory allocation error.', 0Ah maelen equ $-mae section .text align 4 memerr: push dword maelen push dword mae jmp short error align 4 toolong: push dword ftllen push dword ftl jmp short error align 4 facerr: push dword faelen push dword fae jmp short error align 4 cantopen: push dword colen push dword co jmp short error align 4 usage: push dword usglen push dword usg error: push dword stderr sys.write push dword 1 sys.exit align 4 global _start _start: pop eax ; argc pop eax ; program name pop ecx ; file to convert jecxz usage pop eax or eax, eax ; Too many arguments? jne usage ; Open the file push dword O_RDWR push ecx sys.open jc cantopen mov ebp, eax ; Save fd sub esp, byte stat_size mov ebx, esp ; Find file size push ebx push ebp ; fd sys.fstat jc facerr mov edx, [ebx + st_size + 4] ; File is too long if EDX != 0 ... or edx, edx jne near toolong mov ecx, [ebx + st_size] ; ... or if it is above 2 GB or ecx, ecx js near toolong ; Do nothing if the file is 0 bytes in size jecxz .quit ; Map the entire file in memory push edx push edx ; starting at offset 0 push edx ; pad push ebp ; fd push dword MAP_SHARED push dword PROT_READ | PROT_WRITE push ecx ; entire file size push edx ; let system decide on the address sys.mmap jc near memerr mov edi, eax mov esi, eax push ecx ; for SYS_munmap push edi ; Use EBX for state machine mov ebx, ordinary mov ah, 0Ah cld .loop: lodsb call ebx loop .loop cmp ebx, ordinary je .filesize ; Output final lf mov al, ah stosb inc edx .filesize: ; truncate file to new size push dword 0 ; high dword push edx ; low dword push eax ; pad push ebp sys.ftruncate ; close it (ebp still pushed) sys.close add esp, byte 16 sys.munmap .quit: push dword 0 sys.exit align 4 ordinary: cmp al, 0Dh je .cr cmp al, ah je .lf stosb inc edx ret align 4 .cr: mov ebx, cr ret align 4 .lf: mov ebx, lf ret align 4 cr: cmp al, 0Dh je .cr cmp al, ah je .lf xchg al, ah stosb inc edx xchg al, ah ; fall through .lf: stosb inc edx mov ebx, ordinary ret align 4 .cr: mov al, ah stosb inc edx ret align 4 lf: cmp al, ah je .lf cmp al, 0Dh je .cr xchg al, ah stosb inc edx xchg al, ah stosb inc edx mov ebx, ordinary ret align 4 .cr: mov ebx, ordinary mov al, ah ; fall through .lf: stosb inc edx ret Verwenden Sie dieses Programm nicht mit Dateien, die sich auf Datenträgern befinden, welche mit &ms-dos; oder &windows; formatiert wurden. Anscheinend gibt es im Code von FreeBSD einen subtilen Bug, wenn mmap auf solchen Datenträgern verwendet wird: Wenn die Datei eine bestimmte Grösse überschreitet, füllt mmap den Speicher mit lauter Nullen, und überschreibt damit anschliessend den Dateiinhalt. Daniel Seuffert Übersetzt von One-Pointed Mind Als ein Zen-Schüler liebe ich die Idee eines fokussierten Bewußtseins: Tu nur ein Ding zur gleichen Zeit, aber mache es richtig. Das ist ziemlich genau die gleiche Idee, welche &unix; richtig funktionieren lässt. Während eine typische &windows;-Applikation versucht alles Vorstellbare zu tun (und daher mit Fehler durchsetzt ist), versucht eine &unix;-Applikation nur eine Funktion zu erfüllen und das gut. Der typische &unix;-Nutzer stellt sich sein eigenes System durch Shell-Skripte zusammen, die er selbst schreibt, und welche die Vorteile bestehender Applikationen dadurch kombinieren, indem sie die Ausgabe eines Programmes als Eingabe in ein anderes Programm durch eine Pipe übergeben. Wenn Sie ihre eigene &unix;-Software schreiben, ist es generell eine gute Idee zu betrachten, welcher Teil der Problemlösung durch bestehende Programme bewerkstelligt werden kann. Man schreibt nur die Programme selbst, für die keine vorhandene Lösung existiert. CSV Ich will dieses Prinzip an einem besonderen Beispiel aus der realen Welt demonstrieren, mit dem ich kürzlich konfrontiert wurde: Ich mußte jeweils das elfte Feld von jedem Datensatz aus einer Datenbank extrahieren, die ich von einer Webseite heruntergeladen hatte. Die Datenbank war eine CSV-Datei, d.h. eine Liste von Komma-getrennten Werten. Dies ist ein ziemlich gewöhnliches Format für den Code-Austausch zwischen Menschen, die eine unterschiedliche Datenbank-Software nutzen. Die erste zeile der Datei enthält eine Liste der Felder durch Kommata getrennt. Der Rest der Datei enthält die einzelnen Datensätze mit durch Kommata getrennten Werten in jeder Zeile. Ich versuchte awk unter Nutzung des Kommas als Trenner. Da aber einige Zeilen durch in Bindestriche gesetzte Kommata getrennt waren, extrahierte awk das falsche Feld aus diesen Zeilen. Daher mußte ich meine eigene Software schreiben, um das elfte Feld aus der CSV-Datei auszulesen. Aber durch Anwendung der &unix;-Philosophie mußte ich nur einen einfachen Filter schreiben, das Folgende tat: Entferne die erste Zeile aus der Datei. Ändere alle Kommata ohne Anführungszeichen in einen anderen Buchstaben. Entferne alle Anführungszeichen. Streng genommen könnte ich sed benutzen, um die erste Zeile der Datei zu entfernen, aber das zu Bewerkstelligen war in meinem Programm sehr einfach, also entschloss ich mich dazu und reduzierte dadurch die Größe der Pipeline. Unter Berücksichtigung aller Faktoren kostete mich das Schreiben dieses Progammes ca. 20 Minuten. Das Schreiben eines Programmes, welches jeweils das elfte Feld aus einer CSV-Datei extrahiert hätte wesentlich länger gedauert und ich hätte es nicht wiederverwenden können, um ein anderes Feld zu extrahieren aus irgendeiner anderen Datenbank. Diesmal entschied ich mich dazu, etwas mehr Arbeit zu investieren, als man normalerweise für ein typisches Tutorial verwenden würde: Es parst die Kommandozeilen nach Optionen. Es zeigt die richtige Nutzung an, falls es ein falsches Argument findet. Es gibt vernünftige Fehlermeldungen aus. Hier ist ein Beispiel für seine Nutzung: Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>] Alle Parameter sind optional und können in beliebiger Reihenfolge auftauchen. Der -t-Parameter legt fest, was zu die Kommata zu ersetzen sind. Der tab ist die Vorgabe hierfür. Zum Beispiel wird -t; alle unquotierten Kommata mit Semikolon ersetzen. Ich brauche die -c-Option nicht, aber sie könnte zukünftig nützlich sein. Sie ermöglicht mir festzulegen, daß ich einen anderen Buchstaben als das Kommata mit etwas anderem ersetzen möchte. Zum Beispiel wird der Parameter -c@ alle @-Zeichen ersetzen (nützlich, falls man eine Liste von EmAil-Adressen in Nutzername und Domain aufsplitten will). Die -p-Option erhält die erste Zeile, d.h. die erste Zeile der Datei wird nicht gelöscht. Als Vorgabe löschen wir die erste Zeile, weil die CSV-Datei in der ersten Zeile keine Daten, sondern Feldbeschreibungen enthält. Die Parameter -i- und -o-Optionen erlauben es mir, die Ausgabe- und Eingabedateien festzulegen. Vorgabe sind stdin und stdout, also ist es ein regulärer &unix;-Filter. Ich habe sichergestellt, daß sowohl -i filename und -ifilename akzeptiert werden. Genauso habe ich dafür Sorge getragen, daß sowohl Eingabe- als auch Ausgabedateien festgelegt werden können. Um das elfte Feld jeden Datensatzes zu erhalten kann ich nun folgendes eingeben: &prompt.user; csv '-t;' data.csv | awk '-F;' '{print $11}' Der Code speichert die Optionen (bis auf die Dateideskriptoren) in EDX: Das Kommata in DH, den neuen Feldtrenner in DL und das Flag für die -p-Option in dem höchsten Bit von EDX. Ein kurzer Abgleich des Zeichens wird uns also eine schnelle Entscheidung darüber erlauben, was zu tun ist. Hier ist der Code: ;;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Convert a comma-separated file to a something-else separated file. ; ; Started: 31-May-2001 ; Updated: 1-Jun-2001 ; ; Copyright (c) 2001 G. Adam Stanislav ; All rights reserved. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' %define BUFSIZE 2048 section .data fd.in dd stdin fd.out dd stdout usg db 'Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]', 0Ah usglen equ $-usg iemsg db "csv: Can't open input file", 0Ah iemlen equ $-iemsg oemsg db "csv: Can't create output file", 0Ah oemlen equ $-oemsg section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE section .text align 4 ierr: push dword iemlen push dword iemsg push dword stderr sys.write push dword 1 ; return failure sys.exit align 4 oerr: push dword oemlen push dword oemsg push dword stderr sys.write push dword 2 sys.exit align 4 usage: push dword usglen push dword usg push dword stderr sys.write push dword 3 sys.exit align 4 global _start _start: add esp, byte 8 ; discard argc and argv[0] mov edx, (',' << 8) | 9 .arg: pop ecx or ecx, ecx je near .init ; no more arguments ; ECX contains the pointer to an argument cmp byte [ecx], '-' jne usage inc ecx mov ax, [ecx] .o: cmp al, 'o' jne .i ; Make sure we are not asked for the output file twice cmp dword [fd.out], stdout jne usage ; Find the path to output file - it is either at [ECX+1], ; i.e., -ofile -- ; or in the next argument, ; i.e., -o file inc ecx or ah, ah jne .openoutput pop ecx jecxz usage .openoutput: push dword 420 ; file mode (644 octal) push dword 0200h | 0400h | 01h ; O_CREAT | O_TRUNC | O_WRONLY push ecx sys.open jc near oerr add esp, byte 12 mov [fd.out], eax jmp short .arg .i: cmp al, 'i' jne .p ; Make sure we are not asked twice cmp dword [fd.in], stdin jne near usage ; Find the path to the input file inc ecx or ah, ah jne .openinput pop ecx or ecx, ecx je near usage .openinput: push dword 0 ; O_RDONLY push ecx sys.open jc near ierr ; open failed add esp, byte 8 mov [fd.in], eax jmp .arg .p: cmp al, 'p' jne .t or ah, ah jne near usage or edx, 1 << 31 jmp .arg .t: cmp al, 't' ; redefine output delimiter jne .c or ah, ah je near usage mov dl, ah jmp .arg .c: cmp al, 'c' jne near usage or ah, ah je near usage mov dh, ah jmp .arg align 4 .init: sub eax, eax sub ebx, ebx sub ecx, ecx mov edi, obuffer ; See if we are to preserve the first line or edx, edx js .loop .firstline: ; get rid of the first line call getchar cmp al, 0Ah jne .firstline .loop: ; read a byte from stdin call getchar ; is it a comma (or whatever the user asked for)? cmp al, dh jne .quote ; Replace the comma with a tab (or whatever the user wants) mov al, dl .put: call putchar jmp short .loop .quote: cmp al, '"' jne .put ; Print everything until you get another quote or EOL. If it ; is a quote, skip it. If it is EOL, print it. .qloop: call getchar cmp al, '"' je .loop cmp al, 0Ah je .put call putchar jmp short .qloop align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx ret read: jecxz .read call write .read: push dword BUFSIZE mov esi, ibuffer push esi push dword [fd.in] sys.read add esp, byte 12 mov ebx, eax or eax, eax je .done sub eax, eax ret align 4 .done: call write ; flush output buffer ; close files push dword [fd.in] sys.close push dword [fd.out] sys.close ; return success push dword 0 sys.exit align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: jecxz .ret ; nothing to write sub edi, ecx ; start of buffer push ecx push edi push dword [fd.out] sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now .ret: ret Vieles daraus ist aus hex.asm entnommen worden. Aber es gibt einen wichtigen Unterschied: Ich rufe nicht länger write auf, wann immer ich eine Zeilenvorschub ausgebe. Nun kann der Code sogar interaktiv genutzt werden. Ich habe eine bessere Lösung gefunden für das Interaktivitätsproblem seit ich mit dem Schreiben dieses Kapitels begonnen habe. Ich wollte sichergehen, daß jede Zeile einzeln ausgegeben werden kann, falls erforderlich. Aber schlussendlich gibt es keinen Bedarf jede Zeile einzeln auszugeben, falls nicht-interaktiv genutzt. Die neue Lösung besteht darin, die Funktion write jedesmal aufzurufen, wenn ich den Eingabepuffer leer vorfinde. Auf diesem Wege liest das Programm im interaktiven Modus eine Zeile aus der Tastatur des Nutzers, verarbeitet sie und stellt fest, ob deren Eingabepuffer leer ist, dann leert es seine Ausgabe und liest die nächste Zeile. Die dunkle Seite des Buffering Diese Änderung verhindert einen mysteriösen Aufhänger in einem speziellen Fall. Ich bezeichne dies als die dunkle Seite des Buffering, hauptsächlich, weil es eine nicht offensichtliche Gefahr darstellt. Es ist unwahrscheinlich, daß dies mit dem csv-Programm oben geschieht aber lassen Sie uns einen weiteren Filter betrachten: Nehmen wir an ihre Eingabe sind rohe Daten, die Farbwerte darstellen, wie z.B. die Intensität eines Pixel mit den Farben rot, grün und blau. Unsere Ausgabe wird der negative Wert unserer Eingabe sein. Solch ein Filter würde sehr einfach zu schreiben sein. Der größte Teil davon würde so aussehen wie all die anderen Filter, die wir bsiher geschrieben haben, daher beziehe ich mich nur auf den Kern der Prozedur: .loop: call getchar not al ; Create a negative call putchar jmp short .loop Da dieser Filter mit rohen Daten arbeitet ist es unwahrscheinlich, daß er interaktiv genutzt werden wird. Aber das Programm könnte als Bildbearbeitssoftware tituliert werden. Wenn es nicht write vor jedem Aufruf von read durchführt, ist die Möglichkeit gegeben, das es sich aufhängt. Dies könnte passieren: Der Bildeditor wird unseren Filter laden mittels der C-Funktion popen(). Er wird die erste Zeile von Pixeln laden aus einer Bitmap oder Pixmap. Er wird die erste Zeile von Pixeln geschrieben in die Pipe, welche zur Variable fd.in unseres Filters führt. Unser Filter wird jeden Pixel auslesen von der Eingabe, in in seinen negativen Wert umkehren und ihn in den Ausgabepuffer schreiben. Unser Filter wird die Funktion getchar aufrufen, um das nächste Pixel abzurufen. Die Funktion getchar wird einen leeren Eingabepuffer vorfinden und daher die Funktion read aufrufen. read wird den Systemaufruf SYS_read starten. Der Kernel wird unseren Filter unterbrechen, bis der Bildeditor mehr Daten zur Pipe sendet. Der Bildedior wird aus der anderen Pipe lesen, welche verbunden ist mit fd.out unseres Filters, damit er die erste Zeile des auszugebenden Bildes setzen kann bevor er uns die zweite Zeile der Eingabe einliest. Der Kernel unterbricht den Bildeditor, bis er eine Ausgabe unseres Filters erhält, um ihn an den Bildeditor weiterzureichen. An diesem Punkt wartet unser Filter auf den Bildeditor, daß er ihm mehr Daten zur Verarbeitung schicken möge. Gleichzeitig wartet der Bildeditor darauf, daß unser Filter das Resultat der Berechnung ersten Zeile sendet. Aber das Ergebnis sitzt in unserem Ausgabepuffer. Der Filter und der Bildeditor werden fortfahren bis in die Ewigkeit aufeinander zu warten (oder zumindest bis sie per kill entsorgt werden). Unsere Software hat den eine Race Condition erreicht. Das Problem tritt nicht auf, wenn unser Filter seinen Ausgabepuffer leert bevor er vom Kernel mehr Eingabedaten anfordert. Fabian Borschel Übersetzt von Die <acronym>FPU</acronym> verwenden Seltsamerweise erwähnt die meiste Literatur zu Assemblersprachen nicht einmal die Existenz der FPU, oder floating point unit (Fließkomma-Recheneinheit), geschweige denn, daß auf die Programmierung mit dieser eingeganen wird. Dabei kann die Assemblerprogrammierung gerade bei hoch optimiertem FPU-Code, der nur mit einer Assemblersprache realisiert werden kann, ihre große Stärke ausspielen. Organisation der <acronym>FPU</acronym> Die FPU besteht aus 8 80–bit Fließkomma-Registern. Diese sind in Form eines Stacks organisiert—Sie können einen Wert durch den Befehl push auf dem TOS (top of stack) ablegen, oder durch pop von diesem holen. Da also die Befehle push und pop schon verwendet werden, kann es keine op-Codes in Assemblersprache mit diesen Namen geben. Sie können mit einen Wert auf dem TOS ablegen, indem Sie fld, fild, und fbld verwenden. Mit weiteren op-Codes lassen sich Konstanten—wie z.B. Pi—auf dem TOS ablegen. Analog dazu können Sie einen Wert holen, indem Sie fst, fstp, fist, fistp, und fbstp verwenden. Eigentlich holen (pop) nur die op-Codes, die auf p enden, einen Wert, während die anderen den Wert irgendwo speichern (store) ohne ihn vom TOS zu entfernen. Daten können zwischen dem TOS und dem Hauptspeicher als 32–bit, 64–bit oder 80–bit real, oder als 16–bit, 32–bit oder 64–bit Integer, oder als 80–bit packed decimal übertragen werden. Das 80–bit packed decimal-Format ist ein Spezialfall des binary coded decimal-Formates, welches üblicherweise bei der Konvertierung zwischen der ASCII- und FPU-Darstellung von Daten verwendet wird. Dieses erlaubt die Verwendung von 18 signifikanten Stellen. Unabhängig davon, wie Daten im Speicher dargestellt werden, speichert die FPU ihre Daten immer im 80–bit real-Format in den Registern. Ihre interne Genauigkeit beträgt mindestens 19 Dezimalstellen. Selbst wenn wir also Ergebnisse im ASCII-Format mit voller 18–stelliger Genauigkeit darstellen lassen, werden immer noch korrekte Werte angezeigt. Des weiteren können mathematische Operationen auf dem TOS ausgeführt werden: Wir können dessen Sinus berechnen, wir können ihn skalieren (z.B. können wir ihn mit dem Faktor 2 Multiplizieren oder Dividieren), wir können dessen Logarithmus zur Basis 2 nehmen, und viele weitere Dinge. Wir können auch FPU-Register multiplizieren, dividieren, addieren und subtrahieren, sogar einzelne Register mit sich selbst. Der offizielle Intel op-Code für den TOS ist st und für die Register st(0)st(7). st und st(0) beziehen sich dabei auf das gleiche Register. Aus welchen Gründen auch immer hat sich der Originalautor von nasm dafür entschieden, andere op-Codes zu verwenden, nämlich st0st7. Mit anderen Worten, es gibt keine Klammern, und der TOS ist immer st0, niemals einfach nur st. Das Packed Decimal-Format Das packed decimal-Format verwendet 10 Bytes (80 Bits) zur Darstellung von 18 Ziffern. Die so dargestellte Zahl ist immer ein Integer. Sie können durch Multiplikation des TOS mit Potenzen von 10 die einzelnen Dezimalstellen verschieben. Das höchste Bit des höchsten Bytes (Byte 9) ist das Vorzeichenbit: Wenn es gesetzt ist, ist die Zahl negativ, ansonsten positiv. Die restlichen Bits dieses Bytes werden nicht verwendet bzw. ignoriert. Die restlichen 9 Bytes enthalten die 18 Ziffern der gepeicherten Zahl: 2 Ziffern pro Byte. Die signifikantere Ziffer wird in der oberen Hälftes (4 Bits) eines Bytes gespeichert, die andere in der unteren Hälfte. Vielleicht würden Sie jetzt annehmen, das -1234567 auf die folgende Art im Speicher abgelegt wird (in hexadezimaler Notation): 80 00 00 00 00 00 01 23 45 67 Dem ist aber nicht so! Bei Intel werden alle Daten im little–endian-Format gespeichert, auch das packed decimal-Format. Dies bedeutet, daß -1234567 wie folgt gespeichert wird: 67 45 23 01 00 00 00 00 00 80 Erinnern Sie sich an diesen Umstand, bevor Sie sich aus lauter Verzweiflung die Haare ausreißen. Das lesenswerte Buch—falls Sie es finden können—ist Richard Startz' 8087/80287/80387 for the IBM PC & Compatibles. Obwohl es anscheinend die Speicherung der packed decimal im little–endian-Format für gegeben annimmt. Ich mache keine Witze über meine Verzweifelung, als ich den Fehler im unten stehenden Filter gesucht habe, bevor mir einfiel, daß ich einfach mal versuchen sollte, das little–endian-Format, selbst für diesen Typ von Daten, anzuwenden. Ausflug in die Lochblendenphotographie Um sinvolle Programme zu schreiben, müssen wir nicht nur unsere Programmierwerkzeuge beherrschen, sondern auch das Umfeld, für das die Programme gedacht sind. Unser nächster Filter wird uns dabei helfen, wann immer wir wollen, eine Lochkammera zu bauen. Wir brauchen also etwas Hintergrundwissen über die Lochblendenphotographie, bevor wir weiter machen können. Die Kamera Die einfachste Form, eine Kamera zu beschreiben, ist die eines abgeschlossenen, lichtundurchlässigen Raumes, in dessen Abdeckung sich ein kleines Loch befindet. Die Abdeckung ist normalerweise fest (z.B. eine Schachtel), manchmal jedoch auch flexibel (z.B. ein Balgen). Innerhalb der Kamera ist es sehr dunkel. Nur durch ein kleines Loch kann Licht von einem einzigen Punkt aus in den Raum eindringen (in manchen Fällen sind es mehrere Löcher). Diese Lichtstrahlen kommen von einem Bild, einer Darstellung von dem was sich außerhalb der Kamera, vor dem kleinen Loch, befindet. Wenn ein lichtempfindliches Material (wie z.B. ein Film) in der Kamera angebracht wird, so kann dieses das Bild einfangen. Das Loch enthält häufig eine Linse, oder etwas linsenartiges, häufig auch einfach Objektiv genannt. Die Lochblende Streng genommen ist die Linse nicht notwendig: Die ursprünglichen Kameras verwendeten keine Linse, sondern eine Lochblende. Selbst heutzutage werden noch Lochblenden verwendet, zum einen, um die Funktionsweise einer Kamera zu erlernen, und zum anderen, um eine spezielle Art von Bildern zu erzeugen. Das Bild, das von einer Lochblende erzeugt wird, ist überall scharf. Oder unscharf. Es gibt eine ideale Größe für eine Lochblende: Wenn sie größer oder kleiner ist, verliert das Bild seine Schärfe. Brennweite Dieser ideale Lochblendendurchmesser ist eine Funktion der Quadratwurzel der Brennweite, welche dem Abstand der Lochblende von dem Film entspricht. D = PC * sqrt(FL) Hier ist D der ideale Durchmesser der Lochblende, FL die Brennweite und PC eine Konstante der Brennweite. Nach Jay Bender hat die Konstante den Wert 0.04, nach Kenneth Connors 0.037. Andere Leute haben andere Werte vorgeschlagen. Des weiteren gelten diese Werte nur für Tageslicht: Andere Arten von Licht benötigen andere konstante Werte, welche nur durch Experimente bestimmt werden können. Der f–Wert Der f–Wert ist eine sehr nützliche Größe, die angibt, wieviel Licht den Film erreicht. Ein Belichtungsmesser kann dies messen, um z.B. für einen Film mit einer Empfindlichkeit von f5.6 eine Belichtungsdauer von 1/1000 Sekunden auszurechnen. Es spielt keine Rolle, ob es eine 35–mm- oder eine 6x9cm-Kamera ist, usw. Solange wir den f–Wert kennen, können wir die benötigte Belichtungszeit berechnen. Der f–Wert läßt sich einfach wie folgt berechnen: F = FL / D Mit anderen Worten, der f–Wert ergibt sich aus der Brennweite (FL), dividiert durch den Durchmesser (D) der Lochblende. Ein großer f–Wert impliziert also entweder eine kleine Lochblende, oder eine große Brennweite, oder beides. Je größer also der f–Wert ist, um so länger muß die Belichtungszeit sein. Des weiteren sind der Lochblendendurchmesser und die Brennweite eindimensionale Meßgrößen, während der Film und die Lochblende an sich zweidimensionale Objekte darstellen. Das bedeutet, wenn man für einen f–Wert A eine Belichtungsdauer t bestimmt hat, dann ergibt sich daraus für einen f–Wert B eine Belichtungszeit von: t * (B / A)² Normalisierte f–Werte Während heutige moderne Kameras den Durchmesser der Lochblende, und damit deren f–Wert, weich und schrittweise verändern können, war dies früher nicht der Fall. Um unterschiedliche f–Werte einstellen zu können, besaßen Kameras typischerweise eine Metallplatte mit Löchern unterschiedlichen Durchmessers als Lochblende. Die Durchmesser wurden entsprechend obiger Formel gewählt, daß der resultierende f–Wert ein fester Standardwert war, der für alle Kameras verwendet wurde. Z.B. hat eine sehr alte Kodak Duaflex IV Kamera in meinem Besitz drei solche Löcher für die f–Werte 8, 11 und 16. Eine neuere Kamera könnte f–Werte wie 2.8, 4, 5.6, 8, 11, 16, 22, und 32 (und weitere) besitzen. Diese Werte wurden nicht zufällig ausgewählt: Sie sind alle vielfache der Quadratwurzel aus 2, wobei manche Werte gerundet wurden. Der f–Stopp Eine typische Kamera ist so konzipiert, daß die Nummernscheibe bei den normalisierten f–Werten einrastet. Die Nummernscheibe stoppt an diesen Positionen. Daher werden diese Positionen auch f–Stopps genannt. Da die f–Werte bei jedem Stopp vielfache der Quadratwurzel aus 2 sind, verdoppelt die Drehung der Nummernscheibe um einen Stopp die für die gleiche Belichtung benötigte Lichtmenge. Eine Drehung um 2 Stopps vervierfacht die benötigte Belichtungszeit. Eine Drehung um 3 Stopps verachtfacht sie, etc. Entwurf der Lochblenden-Software Wir können jetzt festlegen, was genau unsere Lochblenden-Software tun soll. Verarbeitung der Programmeingaben Da der Hauptzweck des Programms darin besteht, uns beim Entwurf einer funktionierenden Lochkamera zu helfen, wird die Brennweite die Programmeingabe sein. Dies ist etwas, das wir ohne zusätzliche Programme feststellen können: Die geeignete Brennweite ergibt sich aus der Größe des Films und der Art des Fotos, ob dieses ein "normales" Bild, ein Weitwinkelbild oder ein Telebild sein soll. Die meisten bisher geschriebenen Programme arbeiteten mit einzelnen Zeichen, oder Bytes, als Eingabe: Das hex-Programm konvertierte einzelne Bytes in hexadezimale Werte, das csv-Programm ließ entweder einzelne Zeichen unverändert, löschte oder veränderte sie, etc. Das Programm ftuc verwendete einen Zustandsautomateni, um höchstens zwei gleichzeitig eingegebene Bytes zu verarbeiten. Das pinhole-Programm dagegen kann nicht nur mit einzelnen Zeichen arbeiten, sondern muß mit größeren syntaktischen Einheiten zurrecht kommen. Wenn wir z.B. möchten, daß unser Programm den Lochblendendurchmesser (und weitere Werte, die wir später noch diskutieren werden) für die Brennweiten 100 mm, 150 mm und 210 mm berechnet, wollen wir etwa folgendes eingeben: 100, 150, 210 Unser Programm muß mit der gleichzeitigen Eingabe von mehr als nur einem einzelnen Byte zurecht kommen. Wenn es eine 1 erkennt, muß es wissen, daß dies die erste Stelle einer dezimalen Zahl ist. Wenn es eine 0, gefolgt von einer weiteren 0 sieht, muß es wissen, daß dies zwei unterschiedliche Stellen mit der gleichen Zahl sind. Wenn es auf das erste Komma trifft, muß es wissen, daß die folgenden Stellen nicht mehr zur ersten Zahl gehören. Es muß die Stellen der ersten Zahl in den Wert 100 konvertieren können. Und die Stellen der zweiten Zahl müssen in den Wert 150 konvertiert werden. Und die Stellen der dritten Zahl müssen in den Wert 210 konvertiert werden. Wir müssen festlegen, welche Trennsymbole zulässig sind: Sollen die Eingabewerte durch Kommas voneinander getrennt werden? Wenn ja, wie sollen zwei Zahlen behandelt werden, die durch ein anderes Zeichen getrennt sind? Ich persönlich mag es einfach. Entweder etwas ist eine Zahl, dann wird es verarbeitet, oder es ist keine Zahl, dann wird es verworfen. Ich mag es nicht, wenn sich der Computer bei der offensichtlichen Eingabe eines zusätzlichen Zeichens beschwert. Duh! Zusätzlich erlaubt es mir, die Monotonie des Tippens zu durchbrechen, und eine Anfrage anstelle einer simplen Zahl zu stellen: Was ist der beste Lochblendendurchmesser bei einer Brennweite von 150? Es gibt keinen Grund dafür, die Ausgabe mehrerer Fehlermeldungen aufzuteilen: Syntax error: Was Syntax error: ist Syntax error: der Syntax error: beste Et cetera, et cetera, et cetera. Zweitens mag ich das #-Zeichen, um Kommentare zu markieren, die ab dem Zeichen bis zum Ende der jeweiligen Zeile gehen. Dies verlangt nicht viel Programmieraufwand, und ermöglicht es mir, Eingabedateien für meine Programme als ausführbare Skripte zu handhaben. In unserem Fall müssen wir auch entscheiden, in welchen Einheiten die Dateneingabe erfolgen soll: Wir wählen Millimeter, da die meisten Photographen die Brennweite in dieser Einheit messen. Letztendlich müssen wir noch entscheiden, ob wir die Verwendung des dezimalen Punktes erlauben (in diesem Fall müssen wir berücksichtigen, daß in vielen Ländern der Welt das dezimale Komma verwendet wird). In unserem Fall würde das Zulassen eines dezimalen Punktes/Kommas zu einer fälschlicherweise angenommenen, höheren Genauigkeit führen: Der Unterschied zwischen den Brennweiten 50 und 51 ist fast nicht wahrnehmbar. Die Zulassung von Eingaben wie 50.5 ist also keine gute Idee. Beachten Sie bitte, das dies meine Meinung ist. In diesem Fall bin ich der Autor des Programmes. Bei Ihren eigenen Programmen müssen Sie selbst solche Entscheidungen treffen. Optionen anbieten Das wichtigste, was wir zum Bau einer Lochkamera wissen müssen, ist der Durchmesser der Lochblende. Da wir scharfe Bilder schießen wollen, werden wir obige Formel für die Berechnung des korrekten Durchmessers zu gegebener Brennweite verwenden. Da Experten mehrere Werte für die PC-Konstante anbieten, müssen wir uns hier für einen Wert entscheiden. In der Programmierung unter &unix; ist es üblich, zwei Hauptvarianten anzubieten, um Parameter an Programme zu übergeben, und des weiteren eine Standardeinstellung für den Fall zu haben, das der Benutzer gar keine Parameter angibt. Warum zwei Varianten, Parameter anzugeben? Ein Grund ist, eine (relativ) feste Einstellung anzubieten, die automatisch bei jedem Programmaufruf verwendet wird, ohne das wir diese Einstellung immer und immer wieder mit angeben müssen. Die feste Einstellung kann in einer Konfigurationsdatei gespeichert sein, typischerweise im Heimatverzeichnis des Benutzers. Die Datei hat üblicherweise denselben Namen wie das zugehörige Programm, beginnt jedoch mit einem Punkt. Häufig wird "rc" dem Dateinamen hinzugefügt. Unsere Konfigurationsdatei könnte also ~/.pinhole oder ~/.pinholerc heißen. (Die Zeichenfolge ~/ steht für das Heimatverzeichnis des aktuellen Benutzers.) Konfigurationsdateien werden häfig von Programmen verwendet, die viele konfigurierbare Parameter besitzen. Programme, die nur eine (oder wenige) Parameter anbieten, verwenden häufig eine andere Methode: Sie erwarten die Parameter in einer Umgebungsvariablen. In unserem Fall könnten wir eine Umgebungsvariable mit dem Namen PINHOLE benutzen. Normalerweise verwendet ein Programm entweder die eine, oder die andere der beiden obigen Methoden. Ansonsten könnte ein Programm verwirrt werden, wenn eine Konfigurationsdatei das eine sagt, die Umgebungsvariable jedoch etwas anderes. Da wir nur einen Parameter unterstützen müssen, verwenden wir die zweite Methode, und benutzen eine Umgebungsvariable mit dem Namen PINHOLE. Der andere Weg erlaubt uns, ad hoc Entscheidungen zu treffen: "Obwohl ich normalerweise einen Wert von 0.039 verwende, will ich dieses eine Mal einen Wert von 0.03872 anwenden." Mit anderen Worten, dies erlaubt uns, die Standardeinstellung außer Kraft zu setzen. Diese Art der Auswahl wird häufig über Kommandozeilenparameter gemacht. Schließlich braucht ein Programm immer eine Standardeinstellung. Der Benutzer könnte keine Parameter angeben. Vielleicht weiß er auch gar nicht, was er einstellen sollte. Vielleicht will er es "einfach nur ausprobieren". Vorzugsweise wird die Standardeinstellung eine sein, die die meisten Benutzer sowieso wählen würden. Somit müssen diese keine zusätzlichen Parameter angeben, bzw. können die Standardeinstellung ohne zusätzlichen Aufwand benutzen. Bei diesem System könnte das Programm widersprüchliche Optionen vorfinden, und auf die folgende Weise reagieren: Wenn es eine ad hoc-Einstellung vorfindet (z.B. ein Kommandozeilenparameter), dann sollte es diese Einstellung annehmen. Es muß alle vorher festgelegten sowie die standardmäßige Einstellung ignorieren. Andererseits, wenn es eine festgelegte Option (z.B. eine Umgebungsvariable) vorfindet, dann sollte es diese akzeptieren und die Standardeinstellung ignorieren. Ansonsten sollte es die Standardeinstellung verwenden. Wir müssen auch entscheiden, welches Format unsere PC-Option haben soll. Auf den ersten Blick scheint es einleuchtend, das Format PINHOLE=0.04 für die Umgebungsvariable, und -p0.04 für die Kommandozeile zu verwenden. Dies zuzulassen wäre eigentlich eine Sicherheitslücke. Die PC-Konstante ist eine sehr kleine Zahl. Daher würden wir unsere Anwendung mit verschiedenen, kleinen Werten für PC testen. Aber was würde passieren, wenn jemand das Programm mit einem sehr großen Wert aufrufen würde? Es könnte abstürzen, weil wir das Programm nicht für den Umgang mit großen Werten entworfen haben. Oder wir investieren noch weiter Zeit in das Programm, so daß dieses dann auch mit großen Zahlen umgehen kann. Wir könnten dies machen, wenn wir kommerzielle Software für computertechnisch unerfahrene Benutzer schreiben würden. Oder wir könnten auch sagen "Pech gehabt! Der Benutzer sollte es besser wissen." Oder wir könnten es für den Benutzer unmöglich machen, große Zahlen einzugeben. Dies ist die Variante, die wir verwenden werden: Wir nehmen einen impliziten 0.-Präfix an. Mit anderen Worten, wenn der Benutzer den Wert 0.04 angeben will, so muß er entweder -p04 als Parameter angeben, oder PINHOLE=04 als Variable in seiner Umgebung definieren. Falls der Benutzer -p9999999 angibt, so wird dies als 0.9999999 interpretiert—zwar immer noch sinnlos, aber zumindest sicher. Zweitens werden viele Benutzer einfach die Konstanten von Bender oder Connors benutzen wollen. Um es diesen Benutzern einfacher zu machen, werden wir -b als -p04, und -c als -p037 interpretieren. Die Ausgabe Wir müssen festlegen, was und in welchem Format unsere Anwendung Daten ausgeben soll. Da wir als Eingabe beliebig viele Brennweiten erlauben, macht es Sinn, die Ergebnisse in Form einer traditionellen Datenbank–Ausgabe darzustellen, bei der zeilenweise zu jeder Brennweite der zugehörige berechnete Wert, getrennt durch ein tab-Zeichen, ausgegeben wird. Optional sollten wir dem Benutzer die Möglichkeit geben, die Ausgabe in dem schon beschriebenen CSV-Format festzulegen. In diesem Fall werden wir zu Beginn der Ausgabe eine Zeile einfügen, in der die Beschreibungen der einzelnen Felder, durch Kommas getrennt, aufgelistet werden, gefolgt von der Ausgabe der Daten wie schon beschrieben, wobei das tab-Zeichen durch ein Komma ersetzt wird. Wir brauchen eine Kommandozeilenoption für das CSV-Format. Wir können nicht -c verwenden, da diese Option bereits für verwende Connors Konstante steht. Aus irgendeinem seltsamen Grund bezeichnen viele Webseiten CSV-Dateien als "Excel Kalkulationstabelle" (obwohl das CSV-Format älter ist als Excel). Wir werden daher -e als Schalter für die Ausgabe im CSV-Format verwenden. Jede Zeile der Ausgabe wird mit einer Brennweite beginnen. Dies mag auf den ersten Blick überflüssig erscheinen, besonders im interaktiven Modus: Der Benutzer gibt einen Wert für die Brennweite ein, und das Programm wiederholt diesen. Der Benutzer kann jedoch auch mehrere Brennweiten in einer Zeile angeben. Die Eingabe kann auch aus einer Datei, oder aus der Ausgabe eines anderen Programmes, kommen. In diesen Fällen sieht der Benutzer die Eingabewerte überhaupt nicht. Ebenso kann die Ausgabe in eine Datei umgelenkt werden, was wir später noch untersuchen werden, oder sie könnte an einen Drucker geschickt werden, oder auch als Eingabe für ein weiteres Programm dienen. Es macht also wohl Sinn, jede Zeile mit einer durch den Benutzer eingegebenen Brennweite beginnen zu lassen. Halt! Nicht, wie der Benutzer die Daten eingegeben hat. Was passiert, wenn der Benutzer etwas wie folgt eingibt: 00000000150 Offensichtlich müssen wir die führenden Nullen vorher abschneiden. Wir müssen also die Eingabe des Benutzers sorgfältig prüfen, diese dann in der FPU in die binäre Form konvertieren, und dann von dort aus ausgeben. Aber... Was ist, wenn der Benutzer etwas wie folgt eingibt: 17459765723452353453534535353530530534563507309676764423 Ha! Das packed decimal-Format der FPU erlaubt uns die Eingabe einer 18–stelligen Zahl. Aber der Benutzer hat mehr als 18 Stellen eingegeben. Wie gehen wir damit um? Wir könnten unser Programm so modifizieren, daß es die ersten 18 Stellen liest, der FPU übergibt, dann weitere 18 Stellen liest, den Inhalt des TOS mit einem Vielfachen von 10, entsprechend der Anzahl der zusätzlichen Stellen multipliziert, und dann beide Werte mittels add zusammen addiert. Ja, wir könnten das machen. Aber in diesem Programm wäre es unnötig (in einem anderen wäre es vielleicht der richtige Weg): Selbst der Erdumfang in Millimetern ergibt nur eine Zahl mit 11 Stellen. Offensichtlich können wir keine Kamera dieser Größe bauen (jedenfalls jetzt noch nicht). Wenn der Benutzer also eine so große Zahl eingibt, ist er entweder gelangweilt, oder er testet uns, oder er versucht, in das System einzudringen, oder er spielt— indem er irgendetwas anderes macht als eine Lochkamera zu entwerfen. Was werden wir tun? Wir werden ihn ohrfeigen, gewissermaßen: 17459765723452353453534535353530530534563507309676764423 ??? ??? ??? ??? ??? Um dies zu erreichen, werden wir einfach alle führenden Nullen ignorieren. Sobald wir eine Ziffer gefunden haben, die nicht Null ist, initialisieren wir einen Zähler mit 0 und beginnen mit drei Schritten: Sende die Ziffer an die Ausgabe. Füge die Ziffer einem Puffer hinzu, welchen wir später benutzen werden, um den packed decimal-Wert zu erzeugen, den wir an die FPU schicken können. Erhöhe den Zähler um eins. Während wir diese drei Schritte wiederholen, müssen wir auf zwei Bedingungen achten: Wenn der Zähler den Wert 18 übersteigt, hören wir auf, Ziffern dem Puffer hinzuzufügen. Wir lesen weiterhin Ziffern und senden sie an die Ausgabe. Wenn, bzw. falls, das nächste Eingabezeichen keine Zahl ist, sind wir mit der Bearbeitung der Eingabe erst einmal fertig. Übrigends können wir einfach Zeichen, die keine Ziffern sind, verwerfen, solange sie kein #-Zeichen sind, welches wir an den Eingabestrom zurückgeben müssen. Dieses Zeichen markiert den Beginn eines Kommentars. An dieser Stelle muß die Erzeugung der Ausgabe fertig sein, und wir müssen mit der Suche nach weiteren Eingabedaten fortfahren. Es bleibt immer noch eine Möglichkeit unberücksichtigt: Wenn der Benutzer eine Null (oder mehrere) eingibt, werden wir niemals eine von Null verschiedene Zahl vorfinden. Wir können solch einen Fall immer anhand des Zählerstandes feststellen, welcher dann immer bei 0 bleibt. In diesem Fall müssen wir einfach eine 0 an die Ausgabe senden, und anschließend dem Benutzer erneut eine "Ohrfeige" verpassen: 0 ??? ??? ??? ??? ??? Sobald wir die Brennweite ausgegeben, und die Gültigkeit dieser Eingabe verifiziert haben, (größer als 0 und kleiner als 18 Zahlen) können wir den Durchmesser der Lochblende berechnen. Es ist kein Zufall, daß Lochblende das Wort Loch enthält. In der Tat ist eine Lochblende buchstäblich eine Loch Blende, also eine Blende, in die mit einer Nadel vorsichtig ein kleines Loch gestochen wird. Daher ist eine typische Lochblende sehr klein. Unsere Formel liefert uns das Ergebnis in Millimetern. Wir werden dieses mit 1000 multiplizieren, so daß die Ausgabe in Mikrometern erfolgt. An dieser Stelle müssen wir auf eine weitere Falle achten: Zu hohe Genauigkeit. Ja, die FPU wurde für mathematische Berechnungen mit hoher Genauigkeit entworfen. Unsere Berechnungen hier erfordern jedoch keine solche mathematische Genauigkeit. Wir haben es hier mit Physik zu tun (Optik, um genau zu sein). Angenommen, wir wollten aus eine Lastkraftwagen eine Lochkamera bauen (wir wären dabei nicht die ersten, die das versuchen würden!). Angenommen, die Länge des Laderaumes beträgt 12 Meter lang, so daß wir eine Brennweite von 12000 hätten. Verwenden wir Benders Konstante, so erhalten wir durch Multiplizieren von 0.04 mit der Quadratwurzel aus 12000 einen Wert von 4.381780460 Millimetern, oder 4381.780460 Micrometern. So oder so ist das Rechenergebnis absurd präzise. Unser Lastkraftwagen ist nicht genau 12000 Millimeter lang. Wir haben diese Länge nicht mit einer so hohen Genauigkeit gemessen, weswegen es falsch wäre zu behaupten, unser Lochblendendurchmesser müsse exakt 4.381780460 Millimeter sein. Es reicht vollkommen aus, wenn der Durchmesser 4.4 Millimeter beträgt. Ich habe in obigem Beispiel das Rechenergebnis "nur" auf 10 Stellen genau angegeben. Stellen Sie sich vor, wie absurd es wäre, die vollen uns zur Verfügung stehenden, 18 Stellen anzugeben! Wir müssen also die Anzahl der signifikanten Stellen beschränken. Eine Möglichkeit wäre, die Mikrometer durch eine ganze Zahl darzustellen. Unser Lastkraftwaren würde dann eine Lochblende mit einem Durchmesser von 4382 Mikrometern benötigen. Betrachten wir diesen Wert, dann stellen wir fest, das 4400 Mikrometer, oder 4.4 Millimeter, immer noch genau genug ist. Zusätzlich können wir noch, unabhägig von der Größe eines Rechenergebnisses, festlegen, daß wir nur vier signifikante Stellen anzeigen wollen (oder weniger). Leider bietet uns die FPU nicht die Möglichkeit, das Ergebnis automatisch bis auf eine bestimmte Stelle zu runden (sie sieht die Daten ja nicht als Zahlen, sondern als binäre Daten an). Wir müssen also selber einen Algorithmus entwerfen, um die Anzahl der signifikanten Stellen zu reduzieren. Hier ist meiner (ich denke er ist peinlich—wenn Ihnen ein besserer Algorithmus einfällt, verraten sie ihn mir bitte): Initialisiere einen Zähler mit 0. Solange die Zahl größer oder gleich 10000 ist, dividiere die Zahl durch 10, und erhöhe den Zähler um eins. Gebe das Ergebnis aus. Solange der Zähler größer als 0 ist, gebe eine 0 aus, und reduziere den Zähler um eins. Der Wert 10000 ist nur für den Fall, daß Sie vier signifikante Stellen haben wollen. Für eine andere Anzahl signifikanter Stellen müssen Sie den Wert 10000 mit 10, hoch der Anzahl der gewünschten signifikanten Stellen, ersetzen. Wir können so den Lochblendendurchmesser, auf vier signifikante Stellen gerundet, ausgeben. An dieser Stellen kennen wir nun die Brennweite und den Lochblendendurchmesser. Wir haben also jetzt genug Informationen, um den f–Wert zu bestimmen. Wir werden den f–Wert, auf vier signifikante Stellen gerundet, ausgeben. Es könnte passieren, daß diese vier Stellen recht wenig aussagen. Um die Aussagekraft des f–Wertes zu erhöhen, könnten wir den nächstliegenden, normalisierten f–Wert bestimmen, also z.B. das nächstliegende Vielfache der Quadratwurzel aus 2. Wir erreichen dies, indem wir den aktuellen f–Wert mit sich selbst multiplizieren, so daß wir dessen Quadrat (square) erhalten. Anschließend berechnen wir den Logarithmus zur Basis 2 von dieser Zahl. Dies ist sehr viel einfacher, als direkt den Logarithmus zur Basis der Quadratwurzel aus 2 zu berechnen! Wir runden dann das Ergebnis auf die nächstliegende ganze Zahl. Genau genommen können wir mit Hilfe der FPU diese Berechnung beschleunigen: Wir können den op-Code fscale verwenden, um eine Zahl um 1 zu "skalieren", was dasselbe ist, wie eine Zahl mittels shift um eine Stelle nach links zu verschieben. Am Ende berechnen wir noch die Quadratwurzel aus allem, und erhalten dann den nächstliegenden, normalisierten f–Wert. Wenn das alles jetzt viel zu kompliziert wirkt—oder viel zu aufwendig—wird es vielleicht klarer, wenn man den Code selber betrachtet. Wir benötigen insgesamt 9 op-Codes: fmul st0, st0 fld1 fld st1 fyl2x frndint fld1 fscale fsqrt fstp st1 Die erste Zeile, fmul st0, st0, quadriert den Inhalt des TOS (Top Of Stack, was dasselbe ist wie st, von nasm auch st0 genannt). Die Funktion fld1 fügt eine 1 dem TOS hinzu. Die nächste Zeile, fld st1, legt das Quadrat auf dem TOS ab. An diesem Punkt befindet sich das Quadrat sowohl in st als auch in st(2) (es wird sich gleich zeigen, warum wir eine zweite Kopie auf dem Stack lassen.) st(1) enthält die 1. Im nächsten Schritt, fyl2x, wird der Logarithmus von st zur Basis 2 berechnet, und anschließend mit st(1) multipliziert. Deshalb haben wir vorher die 1 in st(1) abgelegt. An dieser Stelle enthält st den gerade berechneten Logarithmus, und st(1) das Quadrat des aktuellen f–Wertes, den wir für später gespeichert haben. frndint rundet den TOS zur nächstliegenden ganzen Zahl. fld1 legt eine 1 auf dem Stack ab. fscale shiftet die 1 auf dem TOS um st(1) Stellen, wodurch im Endeffekt eine 2 in st(1) steht. Schließlich berechnet fsqrt die Quadratwurzel des Rechenergebnisses, also des nächstliegenden, normalisierten f–Wertes. Wir haben nun den nächstliegenden, normalisierten f–Wert auf dem TOS liegen, den auf den Logarithmus zur Basis 2 gerundeten, nächstliegenden ganzzahligen Wert in st(1), und das Quadrat des aktuellen f–Wertes in st(2). Wir speichern den Wert für eine spätere Verwendung in st(2). Aber wir brauchen den Inhalt von st(1) gar nicht mehr. Die letzte Zeile, fstp st1, plaziert den Inhalt von st in st(1), und erniedrigt den Stackpointer um eins. Dadurch ist der Inhalt von st(1) jetzt st, der Inhalt von st(2) jetzt st(1) usw. Der neue st speichert jetzt den normalisierten f–Wert. Der neue st(1) speichert das Quadrat des aktuellen f–Wertes für die Nachwelt. Jetzt können wir den normalisierten f–Wert ausgeben. Da er normalisiert ist, werden wir ihn nicht auf vier signifikante Stellen runden, sondern stattdessen mit voller Genauigkeit ausgeben. Der normalisierte f–Wert ist nützlich, solange er so klein ist, daß wir ihn auf einem Photometer wiederfinden können. Ansonsten brauchen wir eine andere Methode, um die benötigten Belichtungsdaten zu bestimmen. Wir haben weiter oben eine Formel aufgestellt, über die wir einen f–Wert mit Hilfe eines anderen f–Wertes und den zugehörigen Belichtungsdaten bestimmen können. Jedes Photometer, das ich jemals gesehen habe, konnte die benötigte Belichtungszeit für f5.6 berechnen. Wir werden daher einen "f5.6 Multiplizierer" berechnen, der uns den Faktor angibt, mit dem wir die bei f5.6 gemessene Belichtungszeit für unsere Lochkamera multiplizieren müssen. Durch die Formel wissen wir, daß dieser Faktor durch Dividieren unseres f–Wertes (der aktuelle Wert, nicht der normalisierte) durch 5.6 und anschließendes Quadrieren, berechnen können. Mathematisch äquivalent dazu wäre, wenn wir das Quadrat unseres f–Wertes durch das Quadrat von 5.6 dividieren würden. Numerisch betrachtet wollen wir nicht zwei Zahlen quadrieren, wenn es möglich ist, nur eine Zahl zu quadrieren. Daher wirkt die erste Variante auf den ersten Blick besser. Aber... 5.6 ist eine Konstante. Wir müssen nicht wertvolle Rechenzeit der FPU verschwenden. Es reicht aus, daß wir die Quadrate der einzelnen f–Werte durch den konstanten Wert 5.6² dividieren. Oder wir können den jeweiligen f–Wert durch 5.6 dividieren, und dann das Ergebnis quadrieren. Zwei Möglichkeiten, die gleich erscheinen. Aber das sind sie nicht! Erinnern wir uns an die Grundlagen der Photographie weiter oben, dann wissen wir, daß sich die Konstante 5.6 aus dem 5-fachen der Quadratwurzel aus 2 ergibt. Eine irrationale Zahl. Das Quadrat dieser Zahl ist exakt 32. 32 ist nicht nur eine ganze Zahl, sondern auch ein Vielfaches von 2. Wir brauchen also gar nicht das Quadrat eines f–Wertes durch 32 zu teilen. Wir müssen lediglich mittels fscale den f–Wert um fünf Stellen nach rechts shiften. Aus Sicht der FPU müssen wir also fscale mit st(1), welcher gleich -5 ist, auf den f–Wert anwenden. Dies ist sehr viel schneller als die Division. Jetzt wird es auch klar, warum wir das Quadrat des f–Wertes ganz oben auf dem Stack der FPU gespeichert haben. Die Berechnung des f5.6 Multiplizierers ist die einfachste Berechnung des gesamten Programmes! Wir werden das Ergebnis auf vier signifikante Stellen gerundet ausgeben. Es gibt noch eine weitere nützliche Zahl, die wir berechnen können: Die Anzahl der Stopps, die unser f–Wert von f5.6 entfernt ist. Dies könnte hilfreich sein, wenn unser f–Wert außerhalb des Meßbereiches unseres Photometers liegt, wir aber eine Blende haben, bei der wir unterschiedliche Geschwindigkeiten einstellen können, und diese Blende Stopps benutzt. Angenommen, unser f–Wert ist 5 Stopps von f5.6 entfernt, und unser Photometer sagt uns, daß wir eine Belichtungszeit von 1/1000 Sek. einstellen sollen. Dann können wir unsere Blende auf die Geschwindigkeit 1/1000 einstellen, und unsere Skala um 5 Stopps verschieben. Diese Rechnung ist ebenfalls sehr einfach. Alles, was wir tun müssen, ist, den Logarithmus des f5.6 Multiplizierers, den wir schon berechnet haben (wobei wir dessen Wert vor der Rundung nehmen müssen) zur Basis 2 zu nehmen. Wir runden dann das Ergebnis zur nächsten ganzen Zahl hin, und geben dies aus. Wir müssen uns nicht darum kümmern, ob wir mehr als vier signifikante Stellen haben: Das Ergebnis besteht höchstwahrscheinlich nur aus einer oder zwei Stellen. FPU Optimierungen In Assemblersprache können wir den Code für die FPU besser optimieren, als in einer der Hochsprachen, inklusive C. Sobald eine C-Funktion die Berechnung einer Fließkommazahl durchführen will, lädt sie erst einmal alle benötigten Variablen und Konstanten in die Register der FPU. Dann werden die Berechnungen durchgeführt, um das korrekte Ergebnis zu erhalten. Gute C-Compiler können diesen Teil des Codes sehr gut optimieren. Das Ergebnis wird "zurückgegeben", indem dieses auf dem TOS abgelegt wird. Vorher wird aufgeräumt. Sämtliche Variablen und Konstanten, die während der Berechnung verwendet wurden, werden dabei aus der FPU entfernt. Was wir im vorherigen Abschnitt selber getan haben, kann so nicht durchgeführt werden: Wir haben das Quadrat des f–Wertes berechnet, und das Ergebnis für eine weitere Berechnung mit einer anderen Funktion auf dem Stack behalten. Wir wußten, daß wir diesen Wert später noch einmal brauchen würden. Wir wußten auch, daß auf dem Stack genügend Platz war (welcher nur Platz für 8 Zahlen bietet), um den Wert dort zu speichern. Ein C-Compiler kann nicht wissen, ob ein Wert auf dem Stack in naher Zukunft noch einmal gebraucht wird. Natürlich könnte der C-Programmierer dies wissen. Aber die einzige Möglichkeit, die er hat, ist, den Wert im verfügbaren Speicher zu halten. Das bedeutet zum einen, daß der Wert mit der FPU-internen, 80-stelligen Genauigkeit in einer normalen C-Variable vom Typ double (64 Bit) oder vom Typ single (32 Bit) gespeichert wird. Dies bedeutet außerdem, daß der Wert aus dem TOS in den Speicher verschoben werden muß, und später wieder zurück. Von allen Operationen mit der FPU ist der Zugriff auf den Speicher die langsamste. Wann immer also mit der FPU in einer Assemblersprache programmiert wird, sollte nach Möglichkeiten gesucht werden, Zwischenergebnisse auf dem Stack der FPU zu lassen. Wir können mit dieser Idee noch einen Schritt weiter gehen! In unserem Programm verwenden wir eine Konstante (die wir PC genannt haben). Es ist unwichtig, wieviele Lochblendendurchmesser wir berechnen: 1, 10, 20, 1000, wir verwenden immer dieselbe Konstante. Daher können wir unser Programm so optimieren, daß diese Konstante immer auf dem Stack belassen wird. Am Anfang unseres Programmes berechnen wir die oben erwähnte Konstante. Wir müssen die Eingabe für jede Dezimalstelle der Konstanten durch 10 dividieren. Multiplizieren geht sehr viel schneller als Dividieren. Wir teilen also zu Beginn unseres Programmes 1 durch 10, um 0.1 zu erhalten, was wir auf dem Stack speichern: Anstatt daß wir nun für jede einzelne Dezimalstelle die Eingabe wieder durch 10 teilen, multiplizieren wir sie stattdessen mit 0.1. Auf diese Weise geben wir 0.1 nicht direkt ein, obwohl wir dies könnten. Dies hat einen Grund: Während 0.1 durch nur eine einzige Dezimalstelle dargestellt werden kann, wissen wir nicht, wieviele binäre Stellen benötigt werden. Wir überlassen die Berechnung des binären Wertes daher der FPU, mit dessen eigener, hoher Genauigkeit. Wir verwenden noch weitere Konstanten: Wir multiplizieren den Lochblendendurchmesser mit 1000, um den Wert von Millimeter in Micrometer zu konvertieren. Wir vergleichen Werte mit 10000, wenn wir diese auf vier signifikante Stellen runden wollen. Wir behalten also beide Konstanten, 1000 und 10000, auf dem Stack. Und selbstverständlich verwenden wir erneut die gespeicherte 0.1, um Werte auf vier signifikante Stellen zu runden. Zu guter letzt behalten wir -5 noch auf dem Stack. Wir brauchen diesen Wert, um das Quadrat des f–Wertes zu skalieren, anstatt diesen durch 32 zu teilen. Es ist kein Zufall, daß wir diese Konstante als letztes laden. Dadurch wird diese Zahl die oberste Konstante auf dem Stack. Wenn später das Quadrat des f–Wertes skaliert werden muß, befindet sich die -5 in st(1), also genau da, wo die Funktion fscale diesen Wert erwartet. Es ist üblich, einige Konstanten per Hand zu erzeugen, anstatt sie aus dem Speicher zu laden. Genau das machen wir mit der -5: fld1 ; TOS = 1 fadd st0, st0 ; TOS = 2 fadd st0, st0 ; TOS = 4 fld1 ; TOS = 1 faddp st1, st0 ; TOS = 5 fchs ; TOS = -5 Wir können all diese Optimierungen in einer Regel zusammenfassen: Behalte wiederverwendbare Werte auf dem Stack! &postscript; ist eine Stack-orientierte Programmiersprache. Es gibt weit mehr Bücher über &postscript;, als über die Assemblersprache der FPU: Werden Sie in &postscript; besser, dann werden Sie auch automatisch in der Programmierung der FPU besser. <application>pinhole</application>—Der Code ;;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Find various parameters of a pinhole camera construction and use ; ; Started: 9-Jun-2001 ; Updated: 10-Jun-2001 ; ; Copyright (c) 2001 G. Adam Stanislav ; All rights reserved. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %include 'system.inc' %define BUFSIZE 2048 section .data align 4 ten dd 10 thousand dd 1000 tthou dd 10000 fd.in dd stdin fd.out dd stdout envar db 'PINHOLE=' ; Exactly 8 bytes, or 2 dwords long pinhole db '04,', ; Bender's constant (0.04) connors db '037', 0Ah ; Connors' constant usg db 'Usage: pinhole [-b] [-c] [-e] [-p <value>] [-o <outfile>] [-i <infile>]', 0Ah usglen equ $-usg iemsg db "pinhole: Can't open input file", 0Ah iemlen equ $-iemsg oemsg db "pinhole: Can't create output file", 0Ah oemlen equ $-oemsg pinmsg db "pinhole: The PINHOLE constant must not be 0", 0Ah pinlen equ $-pinmsg toobig db "pinhole: The PINHOLE constant may not exceed 18 decimal places", 0Ah biglen equ $-toobig huhmsg db 9, '???' separ db 9, '???' sep2 db 9, '???' sep3 db 9, '???' sep4 db 9, '???', 0Ah huhlen equ $-huhmsg header db 'focal length in millimeters,pinhole diameter in microns,' db 'F-number,normalized F-number,F-5.6 multiplier,stops ' db 'from F-5.6', 0Ah headlen equ $-header section .bss ibuffer resb BUFSIZE obuffer resb BUFSIZE dbuffer resb 20 ; decimal input buffer bbuffer resb 10 ; BCD buffer section .text align 4 huh: call write push dword huhlen push dword huhmsg push dword [fd.out] sys.write add esp, byte 12 ret align 4 perr: push dword pinlen push dword pinmsg push dword stderr sys.write push dword 4 ; return failure sys.exit align 4 consttoobig: push dword biglen push dword toobig push dword stderr sys.write push dword 5 ; return failure sys.exit align 4 ierr: push dword iemlen push dword iemsg push dword stderr sys.write push dword 1 ; return failure sys.exit align 4 oerr: push dword oemlen push dword oemsg push dword stderr sys.write push dword 2 sys.exit align 4 usage: push dword usglen push dword usg push dword stderr sys.write push dword 3 sys.exit align 4 global _start _start: add esp, byte 8 ; discard argc and argv[0] sub esi, esi .arg: pop ecx or ecx, ecx je near .getenv ; no more arguments ; ECX contains the pointer to an argument cmp byte [ecx], '-' jne usage inc ecx mov ax, [ecx] inc ecx .o: cmp al, 'o' jne .i ; Make sure we are not asked for the output file twice cmp dword [fd.out], stdout jne usage ; Find the path to output file - it is either at [ECX+1], ; i.e., -ofile -- ; or in the next argument, ; i.e., -o file or ah, ah jne .openoutput pop ecx jecxz usage .openoutput: push dword 420 ; file mode (644 octal) push dword 0200h | 0400h | 01h ; O_CREAT | O_TRUNC | O_WRONLY push ecx sys.open jc near oerr add esp, byte 12 mov [fd.out], eax jmp short .arg .i: cmp al, 'i' jne .p ; Make sure we are not asked twice cmp dword [fd.in], stdin jne near usage ; Find the path to the input file or ah, ah jne .openinput pop ecx or ecx, ecx je near usage .openinput: push dword 0 ; O_RDONLY push ecx sys.open jc near ierr ; open failed add esp, byte 8 mov [fd.in], eax jmp .arg .p: cmp al, 'p' jne .c or ah, ah jne .pcheck pop ecx or ecx, ecx je near usage mov ah, [ecx] .pcheck: cmp ah, '0' jl near usage cmp ah, '9' ja near usage mov esi, ecx jmp .arg .c: cmp al, 'c' jne .b or ah, ah jne near usage mov esi, connors jmp .arg .b: cmp al, 'b' jne .e or ah, ah jne near usage mov esi, pinhole jmp .arg .e: cmp al, 'e' jne near usage or ah, ah jne near usage mov al, ',' mov [huhmsg], al mov [separ], al mov [sep2], al mov [sep3], al mov [sep4], al jmp .arg align 4 .getenv: ; If ESI = 0, we did not have a -p argument, ; and need to check the environment for "PINHOLE=" or esi, esi jne .init sub ecx, ecx .nextenv: pop esi or esi, esi je .default ; no PINHOLE envar found ; check if this envar starts with 'PINHOLE=' mov edi, envar mov cl, 2 ; 'PINHOLE=' is 2 dwords long rep cmpsd jne .nextenv ; Check if it is followed by a digit mov al, [esi] cmp al, '0' jl .default cmp al, '9' jbe .init ; fall through align 4 .default: ; We got here because we had no -p argument, ; and did not find the PINHOLE envar. mov esi, pinhole ; fall through align 4 .init: sub eax, eax sub ebx, ebx sub ecx, ecx sub edx, edx mov edi, dbuffer+1 mov byte [dbuffer], '0' ; Convert the pinhole constant to real .constloop: lodsb cmp al, '9' ja .setconst cmp al, '0' je .processconst jb .setconst inc dl .processconst: inc cl cmp cl, 18 ja near consttoobig stosb jmp short .constloop align 4 .setconst: or dl, dl je near perr finit fild dword [tthou] fld1 fild dword [ten] fdivp st1, st0 fild dword [thousand] mov edi, obuffer mov ebp, ecx call bcdload .constdiv: fmul st0, st2 loop .constdiv fld1 fadd st0, st0 fadd st0, st0 fld1 faddp st1, st0 fchs ; If we are creating a CSV file, ; print header cmp byte [separ], ',' jne .bigloop push dword headlen push dword header push dword [fd.out] sys.write .bigloop: call getchar jc near done ; Skip to the end of the line if you got '#' cmp al, '#' jne .num call skiptoeol jmp short .bigloop .num: ; See if you got a number cmp al, '0' jl .bigloop cmp al, '9' ja .bigloop ; Yes, we have a number sub ebp, ebp sub edx, edx .number: cmp al, '0' je .number0 mov dl, 1 .number0: or dl, dl ; Skip leading 0's je .nextnumber push eax call putchar pop eax inc ebp cmp ebp, 19 jae .nextnumber mov [dbuffer+ebp], al .nextnumber: call getchar jc .work cmp al, '#' je .ungetc cmp al, '0' jl .work cmp al, '9' ja .work jmp short .number .ungetc: dec esi inc ebx .work: ; Now, do all the work or dl, dl je near .work0 cmp ebp, 19 jae near .toobig call bcdload ; Calculate pinhole diameter fld st0 ; save it fsqrt fmul st0, st3 fld st0 fmul st5 sub ebp, ebp ; Round off to 4 significant digits .diameter: fcom st0, st7 fstsw ax sahf jb .printdiameter fmul st0, st6 inc ebp jmp short .diameter .printdiameter: call printnumber ; pinhole diameter ; Calculate F-number fdivp st1, st0 fld st0 sub ebp, ebp .fnumber: fcom st0, st6 fstsw ax sahf jb .printfnumber fmul st0, st5 inc ebp jmp short .fnumber .printfnumber: call printnumber ; F number ; Calculate normalized F-number fmul st0, st0 fld1 fld st1 fyl2x frndint fld1 fscale fsqrt fstp st1 sub ebp, ebp call printnumber ; Calculate time multiplier from F-5.6 fscale fld st0 ; Round off to 4 significant digits .fmul: fcom st0, st6 fstsw ax sahf jb .printfmul inc ebp fmul st0, st5 jmp short .fmul .printfmul: call printnumber ; F multiplier ; Calculate F-stops from 5.6 fld1 fxch st1 fyl2x sub ebp, ebp call printnumber mov al, 0Ah call putchar jmp .bigloop .work0: mov al, '0' call putchar align 4 .toobig: call huh jmp .bigloop align 4 done: call write ; flush output buffer ; close files push dword [fd.in] sys.close push dword [fd.out] sys.close finit ; return success push dword 0 sys.exit align 4 skiptoeol: ; Keep reading until you come to cr, lf, or eof call getchar jc done cmp al, 0Ah jne .cr ret .cr: cmp al, 0Dh jne skiptoeol ret align 4 getchar: or ebx, ebx jne .fetch call read .fetch: lodsb dec ebx clc ret read: jecxz .read call write .read: push dword BUFSIZE mov esi, ibuffer push esi push dword [fd.in] sys.read add esp, byte 12 mov ebx, eax or eax, eax je .empty sub eax, eax ret align 4 .empty: add esp, byte 4 stc ret align 4 putchar: stosb inc ecx cmp ecx, BUFSIZE je write ret align 4 write: jecxz .ret ; nothing to write sub edi, ecx ; start of buffer push ecx push edi push dword [fd.out] sys.write add esp, byte 12 sub eax, eax sub ecx, ecx ; buffer is empty now .ret: ret align 4 bcdload: ; EBP contains the number of chars in dbuffer push ecx push esi push edi lea ecx, [ebp+1] lea esi, [dbuffer+ebp-1] shr ecx, 1 std mov edi, bbuffer sub eax, eax mov [edi], eax mov [edi+4], eax mov [edi+2], ax .loop: lodsw sub ax, 3030h shl al, 4 or al, ah mov [edi], al inc edi loop .loop fbld [bbuffer] cld pop edi pop esi pop ecx sub eax, eax ret align 4 printnumber: push ebp mov al, [separ] call putchar ; Print the integer at the TOS mov ebp, bbuffer+9 fbstp [bbuffer] ; Check the sign mov al, [ebp] dec ebp or al, al jns .leading ; We got a negative number (should never happen) mov al, '-' call putchar .leading: ; Skip leading zeros mov al, [ebp] dec ebp or al, al jne .first cmp ebp, bbuffer jae .leading ; We are here because the result was 0. ; Print '0' and return mov al, '0' jmp putchar .first: ; We have found the first non-zero. ; But it is still packed test al, 0F0h jz .second push eax shr al, 4 add al, '0' call putchar pop eax and al, 0Fh .second: add al, '0' call putchar .next: cmp ebp, bbuffer jb .done mov al, [ebp] push eax shr al, 4 add al, '0' call putchar pop eax and al, 0Fh add al, '0' call putchar dec ebp jmp short .next .done: pop ebp or ebp, ebp je .ret .zeros: mov al, '0' call putchar dec ebp jne .zeros .ret: ret Der Code folgt demselben Aufbau wie alle anderen Filter, die wir bisher gesehen haben, bis auf eine Kleinigkeit:
Wir nehmen nun nicht mehr an, daß das Ende der Eingabe auch das Ende der nötigen Arbeit bedeutet, etwas, das wir für zeichenbasierte Filter automatisch angenommen haben. Dieser Filter verarbeitet keine Zeichen. Er verarbeitet eine Sprache (obgleich eine sehr einfache, die nur aus Zahlen besteht). Wenn keine weiteren Eingaben vorliegen, kann das zwei Ursachen haben: Wir sind fertig und können aufhören. Dies ist dasselbe wie vorher. Das Zeichen, das wir eingelesen haben, war eine Zahl. Wir haben diese am Ende unseres ASCII –zu–float Kovertierungspuffers gespeichert. Wir müssen nun den gesamten Pufferinhalt in eine Zahl konvertieren, und die letzte Zeile unserer Ausgabe ausgeben. Aus diesem Grund haben wir unsere getchar - und read-Routinen so angepaßt, daß sie das carry flag clear immer dann zurückgeben, wenn wir ein weiteres Zeichen aus der Eingabe lesen, und das carry flag set immer dann zurückgeben, wenn es keine weiteren Eingabedaten gibt. Selbstverständlich verwenden wir auch hier die Magie der Assemblersprache! Schauen Sie sich getchar näher an. Dieses gibt immer das carry flag clear zurück. Dennoch basiert der Hauptteil unseres Programmes auf dem carry flag, um diesem eine Beendigung mitzuteilen—und es funktioniert. Die Magie passiert in read. Wann immer weitere Eingaben durch das System zur Verfügung stehen, ruft diese Funktion getchar auf, welche ein weiteres Zeichen aus dem Eingabepuffer einliest, und anschließend das carry flag cleart. Wenn aber read keine weiteren Eingaben von dem System bekommt, ruft dieses nicht getchar auf. Stattdessen addiert der op-Code add esp, byte 4 4 zu ESP hinzu, setzt das carry flag, und springt zurück. Wo springt diese Funktion hin? Wann immer ein Programm den op-Code call verwendet, pusht der Mikroprozessor die Rücksprungandresse, d.h. er speichert diese ganz oben auf dem Stack (nicht auf dem Stack der FPU, sondern auf dem Systemstack, der sich im Hauptspeicher befindet). Wenn ein Programm den op-Code ret verwendet, popt der Mikroprozessor den Rückgabewert von dem Stack, und springt zu der Adresse, die dort gespeichert wurde. Da wir aber 4 zu ESP hinzuaddiert haben (welches das Register der Stackzeiger ist), haben wir effektiv dem Mikroprzessor eine kleine Amnesie verpaßt: Dieser erinnert sich nun nicht mehr daran, daß getchar durch read aufgerufen wurde. Und da getchar nichts vor dem Aufruf von read auf dem Stack abgelegt hat, enthält der Anfang des Stacks nun die Rücksprungadresse von der Funktion, die getchar aufgerufen hat. Soweit es den Aufrufer betrifft, hat dieser getchar gecallt, welche mit einem gesetzten carry flag returned.
Des weiteren wird die Routine bcdload bei einem klitzekleinen Problem zwischen der Big–Endian- und Little–Endian-Codierung aufgerufen. Diese konvertiert die Textrepräsentation einer Zahl in eine andere Textrepräsentation: Der Text wird in der Big–Endian-Codierung gespeichert, die packed decimal-Darstellung jedoch in der Little–Endian-Codierung. Um dieses Problem zu lösen haben wir vorher den op-Code std verwendet. Wir machen diesen Aufruf später mittels cld wieder rückgängig: Es ist sehr wichtig, daß wir keine Funktion mittels call aufrufen, die von einer Standardeinstellung des Richtungsflags abhängig ist, während std ausgeführt wird. Alles weitere in dem Programm sollte leicht zu verstehen sein, vorausgesetzt, daß Sie das gesamte vorherige Kapitel gelesen haben. Es ist ein klassisches Beispiel für das Sprichwort, daß das Programmieren eine Menge Denkarbeit, und nur ein wenig Programmcode benötigt. Sobald wir uns über jedes Detail im klaren sind, steht der Code fast schon da.
Das Programm <application>pinhole</application> verwenden Da wir uns bei dem Programm dafür entschieden haben, alle Eingaben, die keine Zahlen sind, zu ignorieren (selbst die in Kommentaren), können wir jegliche textbasierten Eingaben verarbeiten. Wir müssen dies nicht tun, wir könnten aber. Meiner bescheidenen Meinung nach wird ein Programm durch die Möglichkeit, anstatt einer strikten Eingabesyntax textbasierte Anfragen stellen zu können, sehr viel benutzerfreundlicher. Angenommen, wir wollten eine Lochkamera für einen 4x5 Zoll Film bauen. Die standardmäßige Brennweite für diesen Film ist ungefähr 150mm. Wir wollen diesen Wert optimieren, so daß der Lochblendendurchmesser eine möglichst runde Zahl ergibt. Lassen Sie uns weiter annehmen, daß wir zwar sehr gut mit Kameras umgehen können, dafür aber nicht so gut mit Computern. Anstatt das wir nun eine Reihe von Zahlen eingeben, wollen wir lieber ein paar Fragen stellen. Unsere Sitzung könnte wie folgt aussehen: &prompt.user; pinhole Computer, Wie groß müßte meine Lochblende bei einer Brennweite von 150 sein? 150 490 306 362 2930 12 Hmmm... Und bei 160? 160 506 316 362 3125 12 Laß uns bitte 155 nehmen. 155 498 311 362 3027 12 Ah, laß uns 157 probieren... 157 501 313 362 3066 12 156? 156 500 312 362 3047 12 Das ist es! Perfekt! Vielen Dank! ^D Wir haben herausgefunden, daß der Lochblendendurchmesser bei einer Brennweite von 150 mm 490 Mikrometer, oder 0.49 mm ergeben würde. Bei einer fast identischen Brennweite von 156 mm würden wir einen Durchmesser von genau einem halben Millimeter bekommen. Skripte schreiben Da wir uns dafür entschieden haben, das Zeichen # als den Anfang eines Kommentares zu interpretieren, können wir unser pinhole-Programm auch als Skriptsprache verwenden. Sie haben vielleicht schon einmal shell-Skripte gesehen, die mit folgenden Zeichen begonnen haben: #! /bin/sh ...oder... #!/bin/sh ... da das Leerzeichen hinter dem #! optional ist. Wann immer &unix; eine Datei ausführen soll, die mit einem #! beginnt, wird angenommen, das die Datei ein Skript ist. Es fügt den Befehl an das Ende der ersten Zeile an, und versucht dann, dieses auszuführen. Angenommen, wir haben unser Programm pinhole unter /usr/local/bin/ installiert, dann können wir nun Skripte schreiben, um unterschiedliche Lochblendendurchmesser für mehrere Brennweiten zu berechnen, die normalerweise mit 120er Filmen verwendet werden. Das Skript könnte wie folgt aussehen: #! /usr/local/bin/pinhole -b -i # Find the best pinhole diameter # for the 120 film ### Standard 80 ### Wide angle 30, 40, 50, 60, 70 ### Telephoto 100, 120, 140 Da ein 120er Film ein Film mittlerer Größe ist, könnten wir die Datei medium nennen. Wir können die Datei ausführbar machen und dann aufrufen, als wäre es ein Programm: &prompt.user; chmod 755 medium &prompt.user; ./medium &unix; wird den letzten Befehl wie folgt interpretieren: &prompt.user; /usr/local/bin/pinhole -b -i ./medium Es wird den Befehl ausführen und folgendes ausgeben: 80 358 224 256 1562 11 30 219 137 128 586 9 40 253 158 181 781 10 50 283 177 181 977 10 60 310 194 181 1172 10 70 335 209 181 1367 10 100 400 250 256 1953 11 120 438 274 256 2344 11 140 473 296 256 2734 11 Lassen Sie uns nun das folgende eingeben: &prompt.user; ./medium -c &unix; wird dieses wie folgt behandeln: &prompt.user; /usr/local/bin/pinhole -b -i ./medium -c Dadurch erhält das Programm zwei widersprüchliche Optionen: -b und -c (Verwende Benders Konstante und verwende Connors Konstante). Wir haben unser Programm so geschrieben, daß später eingelesene Optionen die vorheringen überschreiben—unser Programm wird also Connors Konstante für die Berechnungen verwenden: 80 331 242 256 1826 11 30 203 148 128 685 9 40 234 171 181 913 10 50 262 191 181 1141 10 60 287 209 181 1370 10 70 310 226 256 1598 11 100 370 270 256 2283 11 120 405 296 256 2739 11 140 438 320 362 3196 12 Wir entscheiden uns am Ende doch für Benders Konstante. Wir wollen die Ergebnisse im CSV-Format in einer Datei speichern: &prompt.user; ./medium -b -e > bender &prompt.user; cat bender focal length in millimeters,pinhole diameter in microns,F-number,normalized F-number,F-5.6 multiplier,stops from F-5.6 80,358,224,256,1562,11 30,219,137,128,586,9 40,253,158,181,781,10 50,283,177,181,977,10 60,310,194,181,1172,10 70,335,209,181,1367,10 100,400,250,256,1953,11 120,438,274,256,2344,11 140,473,296,256,2734,11 &prompt.user;
Daniel Seuffert Übersetzt von Vorsichtsmassnahmen Assembler-Programmierer, die aufwuchsen mit &ms-dos; und windows &windows; neigen oft dazu Shotcuts zu verwenden. Das Lesen der Tastaur-Scancodes und das direkte Schreiben in den Grafikspeicher sind zwei klassische Beispiele von Gewohnheiten, die unter &ms-dos; nicht verpönt sind, aber nicht als richtig angesehen werden. Warum dies? Sowohl das PC-BIOS als auch &ms-dos; sind notorisch langsam bei der Ausführung dieser Operationen. Sie mögen versucht sein ähnliche Angewohnheiten in der &unix;-Umgebung fortzuführen. Zum Beispiel habe ich eine Webseite gesehen, welche erklärt, wie man auf einem beliebten &unix;-Ableger die Tastatur-Scancodes verwendet. Das ist generell eine sehr schlechte Idee in einer &unix;-Umgebung! Lassen Sie mich erklären warum. &unix; ist geschützt Zum Einen mag es schlicht nicht möglich sein. &unix; läuft im Protected Mode. Nur der Kernel und Gerätetreiber dürfen direkt auf die Hardware zugreifen. Unter Umständen erlaubt es Ihnen ein bestimmter &unix;-Ableger Tastatur-Scancodes auszulesen, aber ein wirkliches &unix;-Betriebssystem wird dies zu verhindern wissen. Und falls eine Version es Ihnen erlaubt wird es eine andere nicht tun, daher kann eine sorgfältig erstellte Software über Nacht zu einem überkommenen Dinosaurier werden. &unix; ist eine Abstraktion Aber es gibt einen viel wichtigeren Grund, weshalb Sie nicht versuchen sollten, die Hardware direkt anzusprechen (natürlich nicht, wenn Sie einen Gerätetreiber schreiben), selbst auf den &unix;-ähnlichen Systemen, die es Ihnen erlauben: &unix; ist eine Abstraktion! Es gibt einen wichtigen Unterschied in der Design-Philosophie zwischen &ms-dos; und &unix;. &ms-dos; wurde entworfen als Einzelnutzer-System. Es läuft auf einem Rechner mit einer direkt angeschlossenen Tastatur und einem direkt angeschlossenem Bildschirm. Die Eingaben des Nutzers kommen nahezu immer von dieser Tastatur. Die Ausgabe Ihres Programmes erscheint fast immer auf diesem Bildschirm. Dies ist NIEMALS garantiert unter &unix;. Es ist sehr verbreitet für ein &unix;, daß der Nutzer seine Aus- und Eingaben kanalisiert und umleitet: &prompt.user; program1 | program2 | program3 > file1 Falls Sie eine Anwendung program2 geschrieben haben, kommt ihre Eingabe nicht von der Tastatur, sondern von der Ausgabe von program1. Gleichermassen geht Ihre Ausgabe nicht auf den Bildschirm, sondern wird zur Eingabe für program3, dessen Ausgabe wiederum in file1 endet. Aber es gibt noch mehr! Selbst wenn Sie sichergestellt haben, daß Ihre Eingabe und Ausgabe zum Terminal kommt bzw. gelangt, dann ist immer noch nicht garantiert, daß ihr Terminal ein PC ist: Es mag seinen Grafikspeicher nicht dort haben, wo Sie ihn erwarten, oder die Tastatur könnte keine PC-ähnlichen Scancodes erzeugen können. Es mag ein &macintosh; oder irgendein anderer Rechner sein. Sie mögen nun den Kopf schütteln: Mein Programm ist in PC-Assembler geschrieben, wie kann es auf einem &macintosh; laufen? Aber ich habe nicht gesagt, daß Ihr Programm auf &macintosh; läuft, nur sein Terminal mag ein &macintosh; sein. Unter &unix; muß der Terminal nicht direkt am Rechner angeschlossen sein, auf dem die Software läuft, er kann sgar auf einem anderen Kontinent sein oder sogar auf einem anderen Planeten. Es ist nicht ungewöhnlich, daß ein &macintosh;-Nutzer in Australien sich auf ein &unix;-System in Nordamerika (oder sonstwo) mittels telnet verbindet. Die Software läuft auf einem Rechner während das Terminal sich auf einem anderen Rechner befindet: Falls Sie versuchen sollten die Scancodes auszulesen werden Sie die falschen Eingaben erhalten! Das Gleiche gilt für jede andere Hardware: Eine Datei, welche Sie einlesen, mag auf einem Laufwerk sein, auf das Sie keinen direkten Zugriff haben. Eine Kamera, deren Bilder Sie auslesen, befindet sich möglicherweise in einem Space Shuttle, durch Satelliten mit Ihnen verbunden. Das sind die Gründe, weshalb Sie niemals unter &unix; Annahmen treffen dürfen, woher Ihre Daten kommen oder gehen. Lassen Sie immer das System den physischen Zugriff auf die Hardware regeln. Das sind Vorsichtsmassnahmen, keine absoluten Regeln. Ausnahmen sind möglich. Wenn zum Beispiel ein Texteditor bestimmt hat, daß er auf einer lokalen Maschine läuft, dann mag er die Tastatur-Scancodes direkt auslesen, um eine bessere Kontrolle zu gewährleisten. Ich erwähne diese Vorsichtsmassnahmen nicht, um Ihnen zu sagen, was sie tun oder lassen sollen, ich will Ihnen nur bewusst machen, daß es bestimmte Fallstrcike gibt, die Sie erwarten, wenn Sie soeben ihn &unix; von &ms-dos; angelangt sind. Kreative Menschen brechen oft Regeln und das ist in Ordnung, solange sie wissen welche Regeln und warum. Daniel Seuffert Übersetzt von Danksagungen Dieses Handbuch wäre niemals möglich gewesen ohne die Hilfe vieler erfahrener FreeBSD-Programmierer aus &a.hackers;. Viele dieser Personen haben geduldig meine Fragen beantwortet und mich in die richtige Richtung gewiesen bei meinem Versuch, die tieferen liegenden Mechanismen der &unix;-Systemprogrammierung zu erforschen im Allgemeinen und bei FreeBSD im Besonderen. Thomas M. Sommers öffnete die Türen für - mich. Seine Wie + mich. Seine Wie schreibe ich "Hallo Welt" in FreeBSD-Assembler? Webseite war mein erster Kontakt mit Assembler-Programmierung unter FreeBSD. Jake Burkholder hat die Tür offen gehalten durch das bereitwillige Beantworten all meiner Fragen und das Zurverfügungstellen von Assembler-Codebeispielen. Copyright © 2000-2001 G. Adam Stanislav. Alle Rechte vorbehalten.
diff --git a/de_DE.ISO8859-1/books/handbook/advanced-networking/chapter.sgml b/de_DE.ISO8859-1/books/handbook/advanced-networking/chapter.sgml index 6e3be74ae7..37a55a8be1 100644 --- a/de_DE.ISO8859-1/books/handbook/advanced-networking/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/advanced-networking/chapter.sgml @@ -1,5931 +1,6206 @@ Johann Kois Übersetzt von Weiterführende Netzwerkthemen Übersicht Dieses Kapitel beschreibt verschiedene weiterführende Netzwerkthemen. Nachdem Sie dieses Kapitel gelesen haben, werden Sie Die Grundlagen von Gateways und Routen kennen. - Bluetooth- sowie drahtlose, der Norm IEEE 802.11 + &bluetooth;- sowie drahtlose, der Norm &ieee; 802.11 entsprechende, Geräte mit FreeBSD verwenden können. Eine Bridge unter FreeBSD einrichten können. Einen plattenlosen Rechner über das Netzwerk starten können. Wissen, wie man NAT (Network Address Translation) einrichtet. Zwei Computer über PLIP verbinden können. IPv6 auf einem FreeBSD-Rechner einrichten können. ATM einrichten können. - CARP, das Common Access Redundancy Protocol, unter + CARP, das Common Address Redundancy Protocol, unter &os; einsetzen können. Bevor Sie dieses Kapitel lesen, sollten Sie Die Grundlagen der /etc/rc-Skripte verstanden haben. Mit der grundlegenden Netzwerkterminologie vertraut sein. Einen neuen FreeBSD-Kernel konfigurieren und installieren können (). Wissen, wie man zusätzliche Softwarepakete von Drittherstellern installiert (). Coranth Gryphon Beigetragen von Gateways und Routen Routing Gateway Subnetz Damit ein Rechner einen anderen über ein Netzwerk finden kann, muss ein Mechanismus vorhanden sein, der beschreibt, wie man von einem Rechner zum anderen gelangt. Dieser Vorgang wird als Routing bezeichnet. Eine Route besteht aus einem definierten Adressenpaar: Einem Ziel und einem Gateway. Dieses Paar zeigt an, dass Sie über das Gateway zum Ziel gelangen wollen. Es gibt drei Arten von Zielen: Einzelne Rechner (Hosts), Subnetze und das Standardziel. Die Standardroute wird verwendet, wenn keine andere Route zutrifft. Wir werden Standardrouten später etwas genauer behandeln. Außerdem gibt es drei Arten von Gateways: Einzelne Rechner (Hosts), Schnittstellen (Interfaces, auch als Links bezeichnet), sowie Ethernet Hardware-Adressen (MAC-Adressen). Ein Beispiel Um die verschiedenen Aspekte des Routings zu veranschaulichen, verwenden wir folgende Ausgaben von netstat: &prompt.user; netstat -r Routing tables Destination Gateway Flags Refs Use Netif Expire default outside-gw UGSc 37 418 ppp0 localhost localhost UH 0 181 lo0 test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77 10.20.30.255 link#1 UHLW 1 2421 example.com link#1 UC 0 0 host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0 host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 => host2.example.com link#1 UC 0 0 224 link#1 UC 0 0 Defaultroute Die ersten zwei Zeilen geben die Standardroute (die wir im nächsten Abschnitt behandeln), sowie die localhost Route an. Loopback-Gerät Das in der Routingtabelle für localhost festgelegte Interface (Netif-Spalte) lo0, ist auch als loopback-Gerät (Prüfschleife) bekannt. Das heißt, dass der ganze Datenverkehr für dieses Ziel intern (innerhalb des Gerätes) bleibt, anstatt ihn über ein Netzwerk (LAN) zu versenden, da das Ziel dem Start entspricht. Ethernet MAC-Adresse Der nächste auffällige Punkt sind die mit 0:e0: beginnenden Adressen. Es handelt sich dabei um Ethernet Hardwareadressen, die auch als MAC-Adressen bekannt sind. FreeBSD identifiziert Rechner im lokalen Netz automatisch (im Beispiel test0) und fügt eine direkte Route zu diesem Rechner hinzu. Dies passiert über die Ethernet-Schnittstelle ed0. Außerdem existiert ein Timeout (in der Spalte Expire) für diese Art von Routen, der verwendet wird, wenn dieser Rechner in einem definierten Zeitraum nicht reagiert. Wenn dies passiert, wird die Route zu diesem Rechner automatisch gelöscht. Rechner im lokalen Netz werden durch einen als RIP (Routing Information Protocol) bezeichneten Mechanismus identifiziert, der den kürzesten Weg zu den jeweiligen Rechnern bestimmt. Subnetz FreeBSD fügt außerdem Subnetzrouten für das lokale Subnetz hinzu (10.20.30.255 ist die Broadcast-Adresse für das Subnetz 10.20.30, example.com ist der zu diesem Subnetz gehörige Domainname). Das Ziel link#1 bezieht sich auf die erste Ethernet-Karte im Rechner. Sie können auch feststellen, dass keine zusätzlichen Schnittstellen angegeben sind. Routen für Rechner im lokalen Netz und lokale Subnetze werden automatisch durch den routed Daemon konfiguriert. Ist dieser nicht gestartet, sind nur statisch definierte (explizit eingegebene) Routen vorhanden. Die Zeile host1 bezieht sich auf unseren Rechner, der durch seine Ethernetadresse bekannt ist. Da unser Rechner der Sender ist, verwendet FreeBSD automatisch das Loopback-Gerät (lo0), anstatt den Datenverkehr über die Ethernetschnittstelle zu senden. Die zwei host2 Zeilen sind ein Beispiel dafür, was passiert, wenn wir ein &man.ifconfig.8; Alias verwenden (Lesen Sie dazu den Abschnitt über Ethernet, wenn Sie wissen wollen, warum wir das tun sollten.). Das Symbol => (nach der lo0-Schnittstelle) sagt aus, dass wir nicht nur das Loopbackgerät verwenden (da sich die Adresse auf den lokalen Rechner bezieht), sondern dass es sich zusätzlich auch um ein Alias handelt. Solche Routen sind nur auf Rechnern vorhanden, die den Alias bereitstellen; alle anderen Rechner im lokalen Netz haben für solche Routen nur eine einfache link#1 Zeile. Die letzte Zeile (Zielsubnetz 224) behandelt das Multicasting, das wir in einem anderen Abschnitt besprechen werden. Schließlich gibt es für Routen noch verschiedene Attribute, die Sie in der Spalte Flags finden. Nachfolgend finden Sie eine kurze Übersicht von einigen dieser Flags und ihrer Bedeutung: U Up: Die Route ist aktiv. H Host: Das Ziel der Route ist ein einzelner Rechner (Host). G Gateway: Alle Daten, die an dieses Ziel gesendet werden, werden von diesem System an ihr jeweiliges Ziel weitergeleitet. S Static: Diese Route wurde manuell konfiguriert, das heißt sie wurde nicht automatisch vom System erzeugt. C Clone: Erzeugt eine neue Route, basierend auf der Route für den Rechner, mit dem wir uns verbinden. Diese Routenart wird normalerweise für lokale Netzwerke verwendet. W WasCloned: Eine Route, die automatisch konfiguriert wurde. Sie basiert auf einer lokalen Netzwerkroute (Clone). L Link: Die Route beinhaltet einen Verweis auf eine Ethernetkarte (MAC-Adresse). Standardrouten Defaultroute Standardroute Defaultroute Wenn sich der lokale Rechner mit einem entfernten Rechner verbinden will, wird die Routingtabelle überprüft, um festzustellen, ob bereits ein bekannter Pfad vorhanden ist. Gehört dieser entfernte Rechner zu einem Subnetz, dessen Pfad uns bereits bekannt ist (Cloned route), dann versucht der lokale Rechner über diese Schnittstelle eine Verbindung herzustellen. Wenn alle bekannten Pfade nicht funktionieren, hat der lokale Rechner eine letzte Möglichkeit: Die Standardroute (Defaultroute). Bei dieser Route handelt es sich um eine spezielle Gateway-Route (gewöhnlich die einzige im System vorhandene), die im Flags-Feld immer mit C gekennzeichnet ist. Für Rechner im lokalen Netzwerk ist dieses Gateway auf welcher Rechner auch immer eine Verbindung nach außen hat gesetzt (entweder über eine PPP-Verbindung, DSL, ein Kabelmodem, T1 oder eine beliebige andere Netzwerkverbindung). Wenn Sie die Standardroute für einen Rechner konfigurieren, der selbst als Gateway zur Außenwelt funktioniert, wird die Standardroute zum Gateway-Rechner Ihres Internetanbieter (ISP) gesetzt. Sehen wir uns ein Beispiel für Standardrouten an. So sieht eine übliche Konfiguration aus: [Local2] <--ether--> [Local1] <--PPP--> [ISP-Serv] <--ether--> [T1-GW] Die Rechner Local1 und Local2 befinden sich auf Ihrer Seite. Local1 ist mit einem ISP über eine PPP-Verbindung verbunden. Dieser PPP-Server ist über ein lokales Netzwerk mit einem anderen Gateway-Rechner verbunden, der über eine Schnittstelle die Verbindung des ISP zum Internet herstellt. Die Standardrouten für Ihre Maschinen lauten: Host Standard Gateway Schnittstelle Local2 Local1 Ethernet Local1 T1-GW PPP Eine häufig gestellte Frage lautet: Warum (oder wie) sollten wir T1-GW als Standard-Gateway für Local1 setzen, statt den (direkt verbundenen) ISP-Server zu verwenden?. Bedenken Sie, dass die PPP-Schnittstelle für die Verbindung eine Adresse des lokalen Netzes des ISP verwendet. Daher werden Routen für alle anderen Rechner im lokalen Netz des ISP automatisch erzeugt. Daraus folgt, dass Sie bereits wissen, wie Sie T1-GW erreichen können! Es ist also unnötig, einen Zwischenschritt über den ISP-Server zu machen. Es ist üblich, die Adresse X.X.X.1 als Gateway-Adresse für ihr lokales Netzwerk zu verwenden. Für unser Beispiel bedeutet dies Folgendes: Wenn Ihr lokaler Klasse-C-Adressraum 10.20.30 ist und Ihr ISP 10.9.9 verwendet, sehen die Standardrouten so aus: Rechner (Host) Standardroute Local2 (10.20.30.2) Local1 (10.20.30.1) Local1 (10.20.30.1, 10.9.9.30) T1-GW (10.9.9.1) Sie können die Standardroute ganz einfach in der Datei /etc/rc.conf festlegen. In unserem Beispiel wurde auf dem Rechner Local2 folgende Zeile in /etc/rc.conf eingefügt: defaultrouter="10.20.30.1" Die Standardroute kann über &man.route.8; auch direkt gesetzt werden: &prompt.root; route add default 10.20.30.1 Weitere Informationen zum Bearbeiten von Netzwerkroutingtabellen finden Sie in &man.route.8;. - + Rechner mit zwei Heimatnetzen - Dual-Homed-Hosts Es gibt noch eine Konfigurationsmöglichkeit, die wir besprechen sollten, und zwar Rechner, die sich in zwei Netzwerken befinden. Technisch gesehen, zählt jeder als Gateway arbeitende Rechner zu den Rechnern mit zwei Heimatnetzen (im obigen Beispiel unter Verwendung einer PPP-Verbindung). In der Praxis meint man damit allerdings nur Rechner, die sich in zwei lokalen Netzen befinden. Entweder verfügt der Rechner über zwei Ethernetkarten und jede dieser Karten hat eine Adresse in einem separaten Subnetz, oder der Rechner hat nur eine Ethernetkarte und verwendet &man.ifconfig.8; Aliasing. Die erste Möglichkeit wird verwendet, wenn zwei physikalisch getrennte Ethernet-Netzwerke vorhanden sind, die zweite, wenn es nur ein physikalisches Ethernet-Netzwerk gibt, das aber aus zwei logisch getrennten Subnetzen besteht. In beiden Fällen werden Routingtabellen erstellt, damit jedes Subnetz weiß, dass dieser Rechner als Gateway zum anderen Subnetz arbeitet (inbound route). Diese Konfiguration (der Gateway-Rechner arbeitet als Router zwischen den Subnetzen) wird häufig verwendet, wenn es darum geht, Paketfilterung oder eine Firewall (in eine oder beide Richtungen) zu implementieren. Soll dieser Rechner Pakete zwischen den beiden Schnittstellen weiterleiten, müssen Sie diese Funktion manuell konfigurieren und aktivieren. Lesen Sie den nächsten Abschnitt, wenn Sie weitere Informationen zu diesem Thema benötigen. Einen Router konfigurieren Router Ein Netzwerkrouter ist einfach ein System, das Pakete von einer Schnittstelle zur anderen weiterleitet. Internetstandards und gute Ingenieurspraxis sorgten dafür, dass diese Funktion in FreeBSD in der Voreinstellung deaktiviert ist. Sie können diese Funktion aktivieren, indem Sie in &man.rc.conf.5; folgende Änderung durchführen: - gateway_enable=YES # Auf YES setzen, wenn der Rechner als Gateway arbeiten soll + gateway_enable="YES" # Auf YES setzen, wenn der Rechner als Gateway arbeiten soll Diese Option setzt die &man.sysctl.8;-Variable net.inet.ip.forwarding auf 1. Wenn Sie das Routing kurzzeitig unterbrechen wollen, können Sie die Variable auf 0 setzen. BGP RIP OSPF Ihr neuer Router benötigt nun noch Routen, um zu wissen, wohin er den Verkehr senden soll. Haben Sie ein (sehr) einfaches Netzwerk, können Sie statische Routen verwenden. FreeBSD verfügt über den Standard BSD-Routing-Daemon &man.routed.8;, der RIP (sowohl Version 1 als auch Version 2) und IRDP versteht. BGP v4, OSPF v2 und andere Protokolle werden von net/zebra unterstützt. Es stehen auch kommerzielle Produkte wie gated zur Verfügung. - + Al Hoang Beigetragen von Statische Routen einrichten Manuelle Konfiguration Nehmen wir an, dass wir über folgendes Netzwerk verfügen: INTERNET | (10.0.0.1/24) Default Router to Internet | |Interface xl0 |10.0.0.10/24 +------+ | | RouterA | | (FreeBSD gateway) +------+ | Interface xl1 | 192.168.1.1/24 | +--------------------------------+ Internal Net 1 | 192.168.1.2/24 | +------+ | | RouterB | | +------+ | 192.168.2.1/24 | Internal Net 2 RouterA, ein &os;-Rechner, dient als Router für den Zugriff auf das Internet. Die Standardroute ist auf 10.0.0.1 gesetzt, damit ein Zugriff auf das Internet möglich wird. Wir nehmen nun an, dass RouterB bereits konfiguriert ist und daher weiß, wie er andere Rechner erreichen kann. Dazu wird die Standardroute von RouterB auf 192.168.1.1 gesetzt, da dieser Rechner als Gateway fungiert. Sieht man sich die Routingtabelle für RouterA an, erhält man folgende Ausgabe: &prompt.user; netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 10.0.0.1 UGS 0 49378 xl0 127.0.0.1 127.0.0.1 UH 0 6 lo0 10.0.0/24 link#1 UC 0 0 xl0 192.168.1/24 link#2 UC 0 0 xl1 Mit dieser Routingtabelle kann RouterA unser internes Netz 2 nicht erreichen, da keine Route zum Rechner 192.168.2.0/24 vorhanden ist. Um dies zu korrigieren, kann die Route manuell gesetzt werden. Durch den folgenden Befehl wird das interne Netz 2 in die Routingtabelle des Rechners RouterA aufgenommen, indem 192.168.1.2 als nächster Zwischenschritt verwenden wird: &prompt.root; route add -net 192.168.2.0/24 192.168.1.2 Ab sofort kann RouterA alle Rechner des Netzwerks 192.168.2.0/24 erreichen. Routen dauerhaft einrichten Das obige Beispiel ist für die Konfiguration einer statischen Route auf einem laufenden System geeignet. Diese Information geht jedoch verloren, wenn der &os;-Rechner neu gestartet werden muss. Um dies zu verhindern, wird diese Route in /etc/rc.conf eingetragen: # Add Internal Net 2 as a static route static_routes="internalnet2" route_internalnet2="-net 192.168.2.0/24 192.168.1.2" Die Variable static_routes enthält eine Reihe von Strings, die durch Leerzeichen getrennt sind. Jeder String bezieht sich auf den Namen einer Route. In unserem Beispiel hat static_routes internalnet2 als einzigen String. Zusätzlich verwendet man die Konfigurationsvariable route_internalnet2, in der alle sonstigen an &man.route.8; zu übergebenden Parameter festgelegt werden. In obigen Beispiel hätte man folgenden Befehl verwendet: &prompt.root; route add -net 192.168.2.0/24 192.168.1.2 Daher wird "-net 192.168.2.0/24 192.168.1.2" als Parameter der Variable route_ angegeben. Wie bereits erwähnt, können bei static_routes auch mehrere Strings angegeben werden. Dadurch lassen sich mehrere statische Routen anlegen. Durch folgende Zeilen werden auf einem imaginären Rechner statische Routen zu den Netzwerken 192.168.0.0/24 sowie 192.168.1.0/24 definiert: static_routes="net1 net2" route_net1="-net 192.168.0.0/24 192.168.0.1" route_net2="-net 192.168.1.0/24 192.168.1.1" - + Verteilung von Routing-Informationen - routing propagation Wir haben bereits darüber gesprochen, wie wir unsere Routen zur Außenwelt definieren, aber nicht darüber, wie die Außenwelt uns finden kann. Wir wissen bereits, dass Routing-Tabellen so erstellt werden können, dass sämtlicher Verkehr für einen bestimmten Adressraum (in unserem Beispiel ein Klasse-C-Subnetz) zu einem bestimmten Rechner in diesem Netzwerk gesendet wird, der die eingehenden Pakete im Subnetz verteilt. Wenn Sie einen Adressraum für Ihre Seite zugewiesen bekommen, richtet Ihr Diensteanbieter seine Routingtabellen so ein, dass der ganze Verkehr für Ihr Subnetz entlang Ihrer PPP-Verbindung zu Ihrer Seite gesendet wird. Aber woher wissen die Seiten in der Außenwelt, dass sie die Daten an Ihren ISP senden sollen? Es gibt ein System (ähnlich dem verbreiteten DNS), das alle zugewiesenen Adressräume verwaltet und ihre Verbindung zum Internet-Backbone definiert und dokumentiert. Der Backbone ist das Netz aus Hauptverbindungen, die den Internetverkehr in der ganzen Welt transportieren und verteilen. Jeder Backbone-Rechner verfügt über eine Kopie von Haupttabellen, die den Verkehr für ein bestimmtes Netzwerk hierarchisch vom Backbone über eine Kette von Diensteanbietern bis hin zu Ihrer Seite leiten. Es ist die Aufgabe Ihres Diensteanbieters, den Backbone-Seiten mitzuteilen, dass sie mit Ihrer Seite verbunden wurden. Durch diese Mitteilung der Route ist nun auch der Weg zu Ihnen bekannt. Dieser Vorgang wird als Bekanntmachung von Routen (routing propagation) bezeichnet. - + Problembehebung - traceroute Manchmal kommt es zu Problemen bei der Bekanntmachung von Routen, und einige Seiten sind nicht in der Lage, Sie zu erreichen. Vielleicht der nützlichste Befehl, um festzustellen, wo das Routing nicht funktioniert, ist &man.traceroute.8;. Er ist außerdem sehr nützlich, wenn Sie einen entfernten Rechner nicht erreichen können (lesen Sie dazu auch &man.ping.8;). &man.traceroute.8; wird mit dem zu erreichenden Rechner (Host) ausgeführt. Angezeigt werden die Gateway-Rechner entlang des Verbindungspfades. Schließlich wird der Zielrechner erreicht oder es kommt zu einem Verbindungsabbruch (beispielsweise durch Nichterreichbarkeit eines Gateway-Rechners). Weitere Informationen finden Sie in &man.traceroute.8;. - + Multicast-Routing - Multicast-Routing Kerneloptionen MROUTING &os; unterstützt sowohl Multicast-Anwendungen als auch Multicast-Routing. Multicast-Anwendungen müssen nicht konfiguriert werden, sie laufen einfach. Multicast-Routing muss in der Kernelkonfiguration aktiviert werden: options MROUTING Zusätzlich muss &man.mrouted.8;, der Multicast-Routing-Daemon, über die Datei /etc/mrouted.conf eingerichtet werden, um Tunnel und DVMRP zu aktivieren. Weitere Informationen zu diesem Thema finden Sie in &man.mrouted.8;. Ab &os; 7.0 ist &man.mrouted.8; (der Multicast Routing Daemon) nicht mehr im Basissystem enthalten. Dieser Daemon verwendet das DVMRP Multicast Routing Protocol, das inzwischen in den meisten Multicast-Installationen durch &man.pim.4; ersetzt wurde. Die mit dem Daemon in Verbindung stehenden Werkzeuge &man.map-mbone.8; und &man.mrinfo.8; wurden ebenfalls aus dem Basissystem entfernt. All diese Programme sind aber weiterhin über die &os;-Ports-Sammlung (genauer den Port net/mrouted) verfügbar. Loader Marc Fonvieille Murray Stokely Drahtlose Netzwerke Netzwerke, drahtlos 802.11 drahtlose Netzwerke Grundlagen Die meisten drahtlosen Netzwerke basieren auf dem - Standard IEEE 802.11. Sie bestehen aus Stationen, die + Standard &ieee; 802.11. Sie bestehen aus Stationen, die in der Regel im 2,4 GHz- oder im 5 GHz-Band miteinander kommunizieren. Es ist aber auch möglich, dass regional andere Frequenzen, beispielsweise im 2,3 GHz- oder 4,9 GHz-Band, verwendet werden. 802.11-Netzwerke können auf zwei verschiedene Arten aufgebaut sein: Im Infrastruktur-Modus agiert eine Station als Master, mit dem sich alle andere Stationen verbinden. Die Summe aller Stationen wird als BSS (Basic Service Set), die Master-Station hingegen als Access Point (AP) bezeichnet. In einem BSS läuft jedwede Kommunikation über den Access Point. Die zweite Form drahtloser Netzwerke sind die sogenannten Ad-hoc-Netzwerke (auch als IBSS bezeichnet), in denen es keinen Access Point gibt und in denen die Stationen direkt miteinander kommunizieren. Die ersten 802.11-Netzwerke arbeiteten im 2,4 GHz-Band und nutzten dazu Prokolle der - IEEE-Standards 802.11 sowie 802.11b. Diese Standards + &ieee;-Standards 802.11 sowie 802.11b. Diese Standards legen unter anderem Betriebsfrequenzen sowie Merkmale des MAC-Layers (wie Frames und Transmissionsraten) fest. Später kam der Standard 802.11a hinzu, der im 5 GHz-Band, im Gegensatz zu den ersten beiden Standards aber mit unterschiedlichen Signalmechanismen und höheren Transmissionsraten arbeitet. Der neueste Standard 802.11g implementiert die Signal- und Transmissionsmechanismen von 802.11a im 2,4 GHz-Band, ist dabei aber abwärtskompatibel zu 802.11b-Netzwerken. Unabhängig von den zugrundeliegenden Transportmechanismen verfügen 802.11-Netzwerke über diverse Sicherheitsmechanismen. Der ursprüngliche 802.11-Standard definierte lediglich ein einfaches Sicherheitsprotokoll namens WEP. Dieses Protokoll verwendet einen fixen (gemeinsam verwendeten) Schlüssel sowie die RC4-Kryptografie-Chiffre, um Daten verschlüsselt über das drahtlose Netzwerk zu senden. Alle Stationen des Netzwerks müssen sich auf den gleichen fixen Schlüssel einigen, um miteinander kommunizieren zu können. Dieses Schema ist sehr leicht zu knacken und wird deshalb heute kaum mehr eingesetzt. Aktuelle Sicherheitsmechanismen - bauen auf dem Standard IEEE 802.11i auf, der neue + bauen auf dem Standard &ieee; 802.11i auf, der neue kryptografische Schlüssel (Chiffren), ein neues Protokoll für die Anmeldung von Stationen an einem Access Point sowie Mechanismen zum Austausch von Schlüsseln als Vorbereitung der Kommunikation zwischen verschiedenen Geräten festlegt. Kryptografische Schlüssel werden regelmäßig getauscht. Außerdem gibt es Mechanismen, um Einbruchsversuche zu entdecken (und Gegenmaßnahmen ergreifen zu können). Ein weiteres häufig verwendetes Sicherheitsprotokoll ist WPA. Dabei handelt es sich um einen Vorläufer von 802.11i, der von einem Industriekonsortium als Zwischenlösung bis zur endgültigen Verabschiedung von 802.11i entwickelt wurde. WPA definiert eine Untergruppe der Anforderungen des 802.11i-Standards und ist für den Einsatz in älterer Hardware vorgesehen. WPA benötigt nur den (auf dem ursprünglichen WEP-Code basierenden) TKIP-Chiffre. 802.11i erlaubt zwar auch die Verwendung von TKIP, fordert aber zusätzlich eine stärkere Chiffre (AES-CCM) für die Datenverschlüsselung. (AES war für WPA nicht vorgesehen, weil man es als zu rechenintensiv für den Einsatz in älteren Geräten ansah.) Neben den weiter oben erwähnten Standards ist auch der Standard 802.11e von großer Bedeutung. Dieser definiert Protokolle zur Übertragung von Multimedia-Anwendungen wie das Streaming von Videodateien oder Voice-over-IP (VoIP) in einem 802.11-Netzwerk. Analog zu 802.11i verfügt auch 802.11e über eine vorläufige Spezifikation namens WMM (ursprünglich WME), die von einem Industriekonsortium als Untergruppe von 802.11e spezifiziert wurde, um Multimedia-Anwendungen bereits vor der endgültigen Verabschiedung des 802.11e-Standards implementieren zu können. 802.11e sowie WME/WMM erlauben eine Prioritätenvergabe beim Datentransfer im einem drahtlosen Netzwerk. Möglich wird dies durch den Einsatz von Quality of Service-Protokollen (QoS) und erweiterten Medienzugriffsprotokollen. Werden diese Protokolle korrekt implementiert, erlauben sie daher hohe Datenübertragungsraten und einen priorisierten Datenfluss. &os; unterstützt seit der Version 6.0 die Standards 802.11a, 802.11b, sowie 802.11g. Ebenfalls unterstützt werden WPA sowie die Sicherheitsprotokolle gemäß 802.11i (dies sowohl für 11a, 11b als auch 11g). QoS und Verkehrpriorisierung, die von den WME/WMM-Protokollen benötigt werden, werden ebenfalls (allerdings nicht für alle drahtlosen Geräte) unterstützt. Basiskonfiguration Kernelkonfiguration Um ein drahtloses Netzwerk zu nutzen, benötigen Sie eine drahtlose Netzkarte und einen Kernel, der drahtlose Netzwerke unterstützt. Der &os;-Kernel unterstützt den Einsatz von Kernelmodulen. Daher müssen Sie nur die Unterstützung für die von Ihnen verwendeten Geräte aktivieren. Als Erstes benötigen Sie ein drahtloses Gerät. Die meisten drahtlosen Geräte verwenden Bauteile von Atheros und werden deshalb vom &man.ath.4;-Treiber unterstützt. Um diesen Treiber zu verwenden, nehmen Sie die folgende Zeile in die Datei /boot/loader.conf auf: if_ath_load="YES" Der Atheros-Treiber besteht aus drei Teilen: dem Treiber selbst (&man.ath.4;), dem Hardware-Support-Layer für die chip-spezifischen Funktionen (&man.ath.hal.4;) sowie einem Algorithmus zur Auswahl der korrekten Frame-Übertragungsrate (ath_rate_sample). Wenn Sie die Unterstützung für diesen Treiber als Kernelmodul laden, kümmert sich dieses automatisch um diese Aufgaben. Verwenden Sie ein Nicht-Atheros-Gerät, so müssen Sie hingegen das für dieses Gerät geeignete Modul laden, beispielsweise if_wi_load="YES" für Geräte, die auf Bauteilen von Intersil Prism basieren und daher den Treiber &man.wi.4; voraussetzen. In den folgenden Abschnitten wird der &man.ath.4;-Treiber verwendet. Verwenden Sie ein anderes Gerät, müssen Sie diesen Wert daher an Ihre Konfiguration anpassen. Eine Liste aller verfügbaren Treiber für drahtlose Geräte finden Sie in der Manualpage &man.wlan.4;. Gibt es keinen nativen &os;-Treiber für Ihr drahtloses Gerät, können Sie möglicherweise mit NDIS einen &windows;-Treiber verwenden. Neben dem korrekten Treiber benötigen Sie auch die Unterstützung für 802.11-Netzwerke. Für den &man.ath.4;-Treiber werden dazu mindestens die Module &man.wlan.4;, wlan_scan_ap sowie wlan_scan_sta benötigt. Das &man.wlan.4;-Kernelmodul wird automatisch mit dem Treiber des drahtlosen Geräts geladen, die beiden anderen Module werden jeweils durch einen Eintrag in der Datei /boot/loader.conf beim Systemstart geladen: wlan_scan_ap_load="YES" wlan_scan_sta_load="YES" + + Die beiden Module wlan_scan_ap und + wlan_scan_sta werden von &os; 7.X + benötigt, andere &os; Versionen brauchen diese hingegen + nicht. + + Zusätzlich benötigen Sie noch Module zur Verschlüsselung ihres drahtlosen Netzwerks. Diese werden normalerweise dynamisch vom &man.wlan.4;-Modul geladen. Im folgenden Beispiel erfolgt allerdings eine manuelle Konfiguration. Folgende Module sind verfügbar: &man.wlan.wep.4;, &man.wlan.ccmp.4; sowie &man.wlan.tkip.4;. Sowohl &man.wlan.ccmp.4; als auch &man.wlan.tkip.4; werden nur benötigt, wenn Sie WPA und/oder die Sicherheitsprotokolle von 802.11i verwenden wollen. Wollen Sie Ihr Netzwerk hingegen offen betreiben (also völlig ohne Verschlüsselung), benötigen Sie nicht einmal die &man.wlan.wep.4;-Unterstützung. Um alle drei Module beim Systemstart zu laden, fügen Sie folgende Zeilen in die Datei /boot/loader.conf ein: wlan_wep_load="YES" wlan_ccmp_load="YES" wlan_tkip_load="YES" + Die beiden Module wlan_scan_ap und + wlan_scan_sta werden von &os; 7.X + benötigt, andere &os; Versionen brauchen diese hingegen + nicht. + Danach müssen Sie Ihr &os;-System neu starten. Alternativ können Sie die Kernelmodule aber auch manuell mit &man.kldload.8; laden. Wollen Sie keine Kernelmodule verwenden, können Sie die benötigten Treiber auch in Ihren Kernel kompilieren. Daz nehmen Sie folgende Zeilen in Ihre Kernelkonfigurationsdatei auf: device ath # Atheros IEEE 802.11 wireless network driver device ath_hal # Atheros Hardware Access Layer -device ath_rate_sample # John Bicket's SampleRate control algorithm. -device wlan # 802.11 support (Required) +options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors +device ath_rate_sample # SampleRate tx rate control for ath +device wlan # 802.11 support device wlan_scan_ap # 802.11 AP mode scanning device wlan_scan_sta # 802.11 STA mode scanning -device wlan_wep # WEP crypto support for 802.11 devices -device wlan_ccmp # AES-CCMP crypto support for 802.11 devices -device wlan_tkip # TKIP and Michael crypto support for 802.11 devices +device wlan_wep # 802.11 WEP support +device wlan_ccmp # 802.11 CCMP support +device wlan_tkip # 802.11 TKIP support Danach bauen Sie den neuen Kernel und starten Ihr &os;-System neu. Während des Systemstarts sollten nun einige Informationen ähnlich den folgenden über das von Ihnen verwendete drahtlose Gerät ausgegeben werden: ath0: <Atheros 5212> mem 0xff9f0000-0xff9fffff irq 17 at device 2.0 on pci2 ath0: Ethernet address: 00:11:95:d5:43:62 ath0: mac 7.9 phy 4.5 radio 5.6 Infrastruktur-Modus Drahtlose Netzwerke werden in der Regel im Infrastruktur-Modus (auch BSS-Modus genannt) betrieben. Dazu werden mehrere drahtlose Access Points zu einem gemeinsamen drahtlosen Netzwerk verbunden. Jedes dieser drahtlosen Netzwerke hat einen eigenen Namen, der als SSID bezeichnet wird. Alle Clients eines drahtlosen Netzwerks verbinden sich in diesem Modus mit einem Access Point. &os;-Clients Einen Access Point finden Um nach drahtlosen Netzwerken zu suchen, verwenden Sie ifconfig. Dieser Scanvorgang kann einige Zei in Anspruch nehmen, da dazu jede verfügbare Frequenz auf verfügbare Access Points hin überprüft werden muss. Um die Suche zu starten, müssen Sie als Super-User angemeldet sein: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS dlinkap 00:13:46:49:41:76 6 54M 29:3 100 EPS WPA WME freebsdap 00:11:95:c3:0d:ac 1 54M 22:1 100 EPS WPA Ihre Netzwerkkarte muss in den Status versetzt werden, bevor Sie den ersten Scanvorgang starten können. Für spätere Scans ist dies aber nicht mehr erforderlich. Als Ergebnis erhalten Sie eine Liste mit allen gefundenen BSS/IBSS-Netzwerken. Zusätzlich zur SSID (dem Namen des Netzwerks) wird auch die BSSID ausgegeben. Dabei handelt es sich um MAC-Adresse des Access Points. Das Feld CAPS gibt den Typ des Netzwerks sowie die Fähigkeiten der Stationen innerhalb des Netzwerks an: E Extended Service Set (ESS). Zeigt an, dass die Station Teil eines Infrastruktur-Netzwerks ist (und nicht eines IBSS/Ad-hoc-Netzwerks). I IBSS/Ad-hoc-Netzwerk. Die Station ist Teil eines Ad-hoc-Netzwerks (und nicht eines ESS-Netzwerks). P Privacy. Alle Datenframes, die innerhalb des BSS ausgetauscht werden, sind verschlüsselt. Dieses BSS verwendet dazu kryptografische Verfahren wie WEP, TKIP oder AES-CCMP. S Short Preamble. Das Netzwerk verwendet eine kurze Präambel (definiert in 802.11b High Rate/DSSS PHY). Eine kurze Präambel verwendet ein 56 Bit langes Sync-Feld (im Gegensatz zu einer langen Präambel, die ein 128 Bit langes Sync-Feld verwendet). s Short slot time. Das 802.11g-Netzwerk verwendet eine kurze Slotzeit, da es in diesem Netzwerk keine veralteten (802.11b) Geräte gibt. Um eine Liste der bekannten Netzwerke auszugeben, verwenden Sie den folgenden Befehl: &prompt.root; ifconfig ath0 list scan Diese Liste kann entweder automatisch durch das drahtlose Gerät oder manuell durch eine -Aufforderung aktualisiert werden. Veraltete Informationen werden dabei automatisch entfernt. Basiseinstellungen Dieser Abschnitt beschreibt, wie Sie ein einfaches drahtloses Netzerk ohne Verschlüsselung unter &os; einrichten. Nachdem Sie sich mit den Informationen dieses Abschnitts vertraut gemacht haben, sollten Sie Ihr drahtloses Netzwerk mit WPA verschlüsseln. Das Einrichten eines drahtlosen Netzwerks erfolgt in drei Schritten: Der Auswahl eines Access Points, der Anmeldung Ihrer Station sowie der Konfiguration Ihrer IP-Adresse. Einen Access Point auswählen Im Normalfall wird sich Ihre Station automatisch mit einem der zur Verfügung stehenden Access Points verbinden. Sie müssen dazu lediglich Ihr drahtloses Gerät aktivieren. Alternativ können Sie auch einen Eintrag ähnlich dem folgenden in /etc/rc.conf aufnehmen: ifconfig_ath0="DHCP" Wollen Sie sich hingegen mit einem bestimmten Access Point verbinden, müssen Sie dessen SSID angeben: ifconfig_ath0="ssid Ihre_SSID DHCP" Gibt es in Ihrem Netzwerk mehrere Access Points mit der gleichen SSID (was der Einfachheit wegen häufig der Fall ist), können Sie sich dennoch mit einem bestimmten Access Point verbinden. Dazu müssen Sie lediglich die BSSID des Access Points angeben (die Angabe der SSID ist in diesem Fall nicht erforderlich): ifconfig_ath0="ssid Ihre_SSID bssid xx:xx:xx:xx:xx:xx DHCP" Es gibt noch weitere Möglichkeiten, den Zugriff auf bestimmte Access Point zu beschränken, beispielsweise durch die Begrenzung der Frequenzen, auf denen eine Station nach einem Acces Point sucht. Sinnvoll ist ein solches Vorgehen beispielsweise, wenn Ihr drahtloses Gerät in verschiedenen Frequenzbereichen arbeiten kann, da in diesem Fall das Prüfen aller Frequenzen sehr zeitintensiv ist. Um nur innerhalb eines bestimmten Frequenzbereichs nach einem Access Point zu suchen, verwenden Sie die Option : ifconfig_ath0="mode 11g ssid Ihre_SSID DHCP" Dadurch sucht Ihr drahtloses Gerät nur im 2,4 GHz-Band (802.11g), aber nicht innerhalb des 5 GHz-Bandes nach einem Access Point. Mit der Option können Sie eine bestimmte Frequenz vorgeben, auf der gesucht werden soll. Die Option erlaubt die Angabe mehrerer erlaubter Frequenzen. Eine umfassende Beschreibung dieser Optionen finden Sie in der Manualpage &man.ifconfig.8;. Authentifizierung Wenn Sie einen Access Point gefunden haben, muss sich Ihrem Station am Access Point anmelden, bevor Sie Daten übertragen kann. Dazu gibt es verschiedene Möglichkeiten. Am häufigsten wird nach wie vor die sogenannte offene Authentifizierung verwendet. Dabei wird es jeder Station erlaubt, sich mit einem Netzwerk zu verbinden und Daten zu übertragen. Aus Sicherheitsgründen sollte diese Methode allerdings nur zu Testzwecken bei der erstmaligen Einrichtung eines drahtlosen Netzwerks verwendet werden. Andere Authentifizierungsmechanismen erfordern den Austausch kryptografischer Informationen, bevor Sie die Übertragung von Daten erlauben. Dazu gehören der Austausch fixer (vorher vereinbarter) Schlüssel oder Kennwörter sowie der Einsatz komplexerer Verfahren mit Backend-Diensten wie RADIUS. Die meisten Netzwerke nutzen allerdings nach wie vor die offene Authentifizierung, da dies die Voreinstellung ist. Am zweithäufigsten kommt das weiter unten beschriebene WPA-PSK (das auch als WPA Personal bezeichnet wird) zum Einsatz. Verwenden Sie eine &apple; &airport; Extreme-Basisstation als Access Point, benötigen Sie wahrscheinlich sowohl die Shared-Key-Authentifizierung als auch einen WEP-Schlüssel. Die entsprechende Konfiguration erfolgt entweder in der Datei /etc/rc.conf oder über das Programm &man.wpa.supplicant.8;. Verwenden Sie nur eine einzige &airport;-Basisstation, benötigen Sie einen Eintrag ähnlich dem folgenden: ifconfig_ath0="authmode shared wepmode on weptxkey 1 wepkey 01234567 DHCP" Normalerweise sollten Sie Shared-Key-Authentifizierung aber nicht verwenden, da diese die Sicherheit des WEP-Schlüssel noch weiter verringert. Müssen Sie WEP einsetzen (beispielsweise weil Sie zu veralteten Geräten kompatibel bleiben müssen), sollten Sie WEP nur zusammen mit der offenen Authentifizierung (open authentication) verwenden. WEP wird im näher beschrieben. Eine IP-Adresse über DHCP beziehen Nachdem Sie einen Access Point gefunden und sich authentifiziert haben, benötigen Sie noch eine IP-Adresse, die Sie in der Regel über DHCP zugewiesen bekommen. Dazu müssen Sie lediglich die Option DHCP in Ihre in der Datei /etc/rc.conf vorhandene Konfiguration Ihres drahtlosen Geräts aufnehmen: ifconfig_ath0="DHCP" Nun können Sie Ihr drahtloses Gerät starten: &prompt.root; /etc/rc.d/netif start Nachdem Sie das Gerät aktiviert haben, können Sie mit ifconfig den Status des Geräts ath0 abfragen: &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/54Mbps) status: associated ssid dlinkap channel 6 bssid 00:13:46:49:41:76 authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 status: associated besagt, dass sich Ihr Gerät mit dem drahtlosen Netzwerk verbunden hat (konkret mit dem Netzwerk dlinkap). bssid 00:13:46:49:41:76 gibt die MAC-Adresse Ihres Access Points aus und die Zeile mit authmode informiert Sie darüber, dass Ihre Kommunikation nicht verschlüsselt wird (OPEN). Statische IP-Adressen Alternativ zu dynamischen IP-Adressen können Sie auch eine statische IP-Adresse verwenden. Dazu ersetzen Sie in Ihrer Konfiguration DHCP durch die zu verwendende IP-Adresse. Beachten Sie dabei, dass Sie die anderen Konfigurationsparameter nicht versehentlich verändern: ifconfig_ath0="ssid Ihre_ssid inet 192.168.1.100 netmask 255.255.255.0" + WPA Bei WPA (Wi-Fi Protected Access) handelt es sich um ein Sicherheitsprotokoll, das in 802.11-Netzwerken verwendet wird, um die Nachteile von WEP (fehlende Authentifizierung und schwache Verschlüsselung) zu vermeiden. WPA stellt das aktuelle 802.1X-Authentifizierungsprotokoll dar und verwendet eine von mehreren Chiffren, um die Datensicherheit zu gewährleisten. Die einzige Chiffre, die von WPA verlangt wird, ist TKIP (Temporary Key Integrity Protocol), eine Chiffre, die die von WEP verwendete RC4-Chiffre um Funktionen zur Prüfung der Datenintegrität und zur Erkennung und Bekämpfung von Einbruchsversuchen erweitert. TKIP ist durch Softwaremodifikationen auch unter veralteter Hardware lauffähig. Im Vergleich zu WEP ist WPA zwar sehr viel sicherer, es ist aber dennoch nicht völlig immun gegen Angriffe. WPA definiert mit AES-CCMP noch eine weitere Chiffre als Alternative zu TKIP. AES-CCMP (das häufig als WPA2 oder RSN bezeichnet wird) sollte, wenn möglich, eingesetzt werden. WPA definiert Authentifizierungs- und Verschlüsselungsprotokolle. Die Authentifizierung erfolgt in der Regel über eine der folgenden Techniken: 802.1X gemeinsam mit einem Backend-Authentifizierungsdienst wie RADIUS, oder durch einen Minimal-Handshake zwischen der Station und dem Access Point mit einem vorher vereinbarten gemeinsamen Schlüssel. Die erste Technik wird als WPA Enterprise, die zweite hingegen als WPA Personal bezeichnet. Da sich der Aufwand für das Aufsetzen eines RADIUS-Backend-Servers für die meisten drahtlosen Netzwerke nicht lohnt, wird WPA in der Regel als WPA-PSK (WPA, Pre-Shared-Key) konfiguriert. Die Kontrolle der drahtlosen Verbindung sowie die vorangehende Authentifizierung (über Schlüssel oder durch die Kommunikation mit einem Server) erfolgt über das Programm &man.wpa.supplicant.8;, das über die Datei /etc/wpa_supplicant.conf eingerichtet wird. Ausführliche Informationen zur Konfiguration des Programms finden sich in der Manualpage &man.wpa.supplicant.conf.5;. WPA-PSK WPA-PSK oder WPA-Personal basiert auf einem gemeinsamen (vorher vereinbarten) Schlüssel (PSK), der aus einem Passwort generiert und danach als Master-Key des drahtlosen Netzwerks verwendet wird. Jeder Benutzer des drahtlosen Netzwerks verwendet daher den gleichen Schlüssel. WPA-PSK sollte nur in kleinen Netzwerken eingesetzt werden, in denen die Konfiguration eines Authentifizierungsservers nicht möglich oder erwünscht ist. Achten Sie darauf, dass Sie immer starke Passwörter verwenden, die ausreichend lang sind und, wenn möglich, auch Sonderzeichen enthalten, damit diese nicht leicht erraten und/oder geknackt werden können. Der erste Schritt zum Einsatz von WPA-PSK ist die Konfiguration der SSID und des gemeinsamen Schlüssels Ihres Netzwerks in der Datei /etc/wpa_supplicant.conf: network={ ssid="freebsdap" psk="freebsdmall" } Danach geben Sie in /etc/rc.conf an, dass WPA zur Verschlüsselung eingesetzt werden soll und dass die IP-Adresse über DHCP bezogen wird: ifconfig_ath0="WPA DHCP" Nun können Sie Ihr Netzgerät aktivieren: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 5 DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 6 DHCPOFFER from 192.168.0.1 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 Alternativ können Sie die Konfiguration von WPA-PSK auch manuell durchführen, wobei Sie wiederum die Konfigurationsdatei /etc/wpa_supplicant.conf verwenden: &prompt.root; wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf Trying to associate with 00:11:95:c3:0d:ac (SSID='freebsdap' freq=2412 MHz) Associated with 00:11:95:c3:0d:ac WPA: Key negotiation completed with 00:11:95:c3:0d:ac [PTK=TKIP GTK=TKIP] Im zweiten Schritt starten Sie nun dhclient, um eine IP-Adresse vom DHCP-Server zu beziehen: &prompt.root; dhclient ath0 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/48Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 Enthält Ihre /etc/rc.conf bereits die Zeile ifconfig_ath0="DHCP", müssen Sie dhclient nicht mehr manuell aufrufen, da dhclient in diesem Fall automatisch gestartet wird, nachdem wpa_supplicant die Schlüssel übergibt. Sollte der Einsatz von DHCP nicht möglich sein, können Sie auch eine statische IP-Adresse angeben, nachdem wpa_supplicant Ihre Station authentifiziert hat: &prompt.root; ifconfig ath0 inet 192.168.0.100 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 Verwenden Sie DHCP nicht, müssen Sie zusätzlich noch das Standard-Gateway sowie den/die Nameserver manuell festlegen: &prompt.root; route add default your_default_router &prompt.root; echo "nameserver your_DNS_server" >> /etc/resolv.conf WPA und EAP-TLS Die zweite Möglichkeit, WPA einzusetzen, ist die Verwendung eines 802.1X-Backend-Authentifizierungsservers. Diese Variante wird als WPA-Enterprise bezeichnet, um sie vom weniger sicheren WPA-Personal abzugrenzen, das auf dem Austausch gemeinsamer (und vorher vereinbarter Schlüssel) basiert. Die bei WPA-Enterprise verwendete Authentifizierung basiert auf EAP (Extensible Authentication Protocol). EAP selbst bietet keine Verschlüsselung, sondern operiert in einem verschlüsselten Tunnel. Es gibt verschiedene, auf EAP basierende Authentifizierungsmethoden, darunter EAP-TLS, EAP-TTLS sowie EAP-PEAP. Bei EAP-TLS (EAP with Transport Layers Security) handelt es sich um sehr gut unterstütztes Authentifizierungsprotokoll, da es sich dabei um die erste EAP-Methode handelt, die von der Wi-Fi Alliance zertifiziert wurde. EAP-TLS erfordert drei Zertifikate: Das (auf allen Rechnern installierte) CA-Zertifikat, das Server-Zertifikat Ihres Authentifizierungsservers, sowie ein Client-Zertifikat für jeden drahtlosen Client. Sowohl der Authentifizierungsservers als auch die drahtlosen Clients authentifizieren sich gegenseitig durch ihre Zertifikate, wobei sie überprüfen, ob diese Zertifikate auch von der Zertifizierungs-Authorität (CA) des jeweiligen Unternehmens signiert wurden. Die Konfiguration erfolgt (analog zu WPA-PSK) über die Datei /etc/wpa_supplicant.conf: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=TLS identity="loader" ca_cert="/etc/certs/cacert.pem" client_cert="/etc/certs/clientcert.pem" private_key="/etc/certs/clientkey.pem" private_key_passwd="freebsdmallclient" } Der Name des Netzwerks (die SSID). - Das RSN/WPA2-Protokoll (IEEE 802.11i) wird + Das RSN/WPA2-Protokoll (&ieee; 802.11i) wird verwendet. Die key_mgmt-Zeile bezieht sich auf das verwendete Key-Management-Protokoll. In diesem Beispiel wird WPA gemeinsam mit der EAP-Authentifizierung verwendet (WPA-EAP). Die für die Verbindung verwendete EAP-Methode. Das identity-Feld enthält den von EAP verwendeten Identifizierungsstring. Das Feld ca_cert gibt den Pfad zum CA-Zertifikat an. Dieses Datei wird benötigt, um das Server-Zertifikat zu verifizieren. Die client_cert-Zeile gibt den Pfad zum Client-Zertifikat an. Jeder Client hat ein eigenes, innerhalb des Netzwerks eindeutiges Zertifikat. Das Feld private_key gibt den Pfad zum privaten Schlüssel des Client-Zertifikat an. Das Feld private_key_passwd enthält die Passphrase für den privaten Schlüssel. Danach fügen Sie die folgende Zeile in /etc/rc.conf ein: ifconfig_ath0="WPA DHCP" Nun können Sie Ihr drahtloses Gerät über das rc.d-System aktivieren: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 Alternativ können Sie Ihr drahtloses Gerält wiederum manuell über wpa_supplicant und ifconfig aktivieren. WPA und EAP-TTLS Bei EAP-TLS müssen sowohl der Authentifizierungsserver als auch die Clients jeweils ein eigenes Zertifikat aufweisen. Setzen Sie hingegen EAP-TTLS (EAP-Tunneled Transport Layer Security) ein, ist das Client-Zertifikat optional. EAP-TTLS geht dabei ähnlich vor wie verschlüsselte Webseiten, bei denen der Webserver einen sicheren SSL-Tunnel erzeugen kann, ohne dass der Besucher dabei über ein client-seitiges Zertifikat verfügen muss. EAP-TTLS verwendet einen verschlüsselten TLS-Tunnel zum sicheren Transport der Authentifizierungsdaten. Die Konfiguration von EAP-TTLS erfolgt in der Datei /etc/wpa_supplicant.conf: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=TTLS identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase2="auth=MD5" } Die für die Verbindung verwendete EAP-Methode. Das identity-Feld enthält den Identifizierungsstring für die EAP-Authentifizierung innerhalb des verschlüsselten TlS-Tunnels. Das password-Feld enthält die Passphrase für die EAP-Authentifizierung. Das Feld ca_cert gibt den Pfad zum CA-Zertifikat an, das benötigt wird, um das Server-Zertifikat zu verifizieren. Die innerhalb des verschlüsselten TLS-Tunnels verwendete Authentifizierungsmethode. In unserem Beispiel handelt es sich dabei um EAP und MD5. Diese Phase der inneren Authentifizierung wird oft als phase2 bezeichnet. Folgende Zeile muss zusätzlich in die Datei /etc/rc.conf aufgenommen werden: ifconfig_ath0="WPA DHCP" Nun können Sie Ihr drahtloses Gerät aktivieren: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 WPA und EAP-PEAP PEAP (Protected EAP) wurde als Alternative zu EAP-TTLS entwickelt. Es gibt zwei verschiedene PEAP-Methoden, wobei es sich bei PEAPv0/EAP-MSCHAPv2 um die häufiger verwendete Methode handelt. In den folgenden Ausführungen wird der Begriff PEAP synonym für diese EAP-Methode verwendet. PEAP ist nach EAP-TLS der am häufigsten verwendete und am besten unterstützte EAP-Standard. PEAP arbeitet ähnlich wie EAP-TTLS: Es verwendet ein server-seitiges Zertifikat, um einen verschlüsselten TLS-Tunnel zu erzeugen, über den die sichere Authentifizierung zwischen den Clients und dem Authentifizierungsserver erfolgt. In Sachen Sicherheit unterscheiden sich EAP-TTLS und PEAP allerdings: PEAP überträgt den Benutzernamen im Klartext und verschlüsselt nur das Passwort, während EAP-TTLS sowohl den Benutzernamen als auch das Passwort über den TLS-Tunnel überträgt. Um EAP-PEAP einzurichten, müssen Sie die Konfigurationsdatei /etc/wpa_supplicant.conf anpassen: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=PEAP identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase1="peaplabel=0" phase2="auth=MSCHAPV2" } Die für die Verbindung verwendete EAP-Methode. Das identity-Feld enthält den Identifizierungsstring für die innerhalb des verschlüsselten TLS-Tunnels erfolgende EAP-Authentifizierung. Das Feld password enthält die Passphrase für die EAP-Authentifizierung. Das Feld ca_cert gibt den Pfad zum CA-Zertifikat an, das zur Verifizierung des Server-Zertifikats benötigt wird. Dieses Feld enthält die Parameter für die erste Phase der Authentifizierung (also den TLS-Tunnel). Je nach dem, welchen Authentifizierungsserver Sie verwenden, müssen Sie hier einen unterschiedlichen Wert angeben. In den meisten Fällen wird dieses Feld den Wert client EAP encryption aufweisen, der durch die Angabe von peaplabel=0 gesetzt wird. Weitere Informationen zur Konfiguration von PEAP finden Sie in der Manualpage &man.wpa.supplicant.conf.5;. Das innerhalb des verschlüsselten TLS-Tunnels verwendete Authentifizierungsprotokoll. In unserem Beispiel handelt es sich dabei um auth=MSCHAPV2. Danach fügen Sie die folgende Zeile in /etc/rc.conf ein: ifconfig_ath0="WPA DHCP" Zuletzt müssen Sie die Netzkarte noch aktivieren: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 WEP WEP (Wired Equivalent Privacy) ist Teil des ursprünglichen 802.11-Standards. Es enthält keinen Authentifzierungsmechanismus und verfügt lediglich über eine schwache Zugriffskontrolle, die sehr leicht geknackt werden kann. WEP kann über ifconfig aktiviert werden: &prompt.root; ifconfig ath0 ssid my_net wepmode on weptxkey 3 wepkey 3:0x3456789012 \ inet 192.168.1.100 netmask 255.255.255.0 Mit weptxkey geben Sie an, welcher WEP-Schlüssel für für die Datenübertragung verwendet wird (in unserem Beispiel ist dies der dritte Schlüssel). Der gleiche Schlüssel muss auch am Access Point eingestellt sein. Kennen Sie den vom Access Point verwendeten Schlüssel nciht, sollten Sie zuerst den Wert 1 (d.h. den ersten Schlüssel) für diese Variable verwenden. Mit wepkey legen Sie den zu verwendenden WEP-Schlüssel in der Form Nummer:Schlüssel fest. Ist der Schlüssel "Nummer" nicht vorhanden, wird automatisch Schlüssel 1 verwendet. Die Angabe von "Nummer" ist zwingend nötig, wenn Sie einen anderen als den ersten Schlüssel verwenden wollen. In Ihrer Konfiguration müssen Sie 0x3456789012 durch den an Ihrem Access Point konfigurierten Schlüssel ersetzen. Weitere Informationen finden Sie in der Manualpage &man.ifconfig.8;. Das Programm wpa_supplicant eignet sich ebenfalls dazu, WEP für Ihr drahtloses Gerät zu aktivieren. Obige Konfiguration lässt sich dabei durch die Aufnahme der folgenden Zeilen in die Datei /etc/wpa_supplicant.conf realisieren: network={ ssid="my_net" key_mgmt=NONE wep_key3=3456789012 wep_tx_keyidx=3 } Danach müssen Sie das Programm noch aufrufen: &prompt.root; wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf Trying to associate with 00:13:46:49:41:76 (SSID='dlinkap' freq=2437 MHz) Associated with 00:13:46:49:41:76 Ad-hoc-Modus Der IBSS-Modus (auch als Ad-hoc-Modus bezeichnet), ist für Punkt-zu-Punkt-Verbindungen vorgesehen. Um beispielsweise eine Ad-hoc-Verbindung zwischen den Rechnern A und B aufzubauen, benötigen Sie lediglich zwei IP-Adressen und eine SSID. Auf dem Rechner A geben Sie Folgendes ein: &prompt.root; ifconfig ath0 ssid freebsdap mediaopt adhoc inet 192.168.0.1 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4 ether 00:11:95:c3:0d:ac media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>) status: associated ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 Der adhoc-Parameter gibt an, dass die Schnittstelle im IBSS-Modus läuft. Rechner B sollte nun in der Lage sein, Rechner A zu finden: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS freebsdap 02:11:95:c3:0d:ac 2 54M 19:3 100 IS Der Wert I (Spalte CAPS) gibt an, dass sich Rechner A im Ad-hoc-Modus befindet. Nun müssen Sie nur noch Rechner B eine unterschiedliche IP-Adresse zuweisen: &prompt.root; ifconfig ath0 ssid freebsdap mediaopt adhoc inet 192.168.0.2 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>) status: associated ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 Damit sind die Rechner A und B bereit und können untereinander Daten austauschen. &os; Host Access Points Dieser Abschnitt ist noch nicht übersetzt. Lesen Sie bitte das Original in englischer Sprache. Wenn Sie helfen wollen, diesen Abschnitt zu übersetzen, senden Sie bitte eine E-Mail an die Mailingliste &a.de.translators;. Problembehandlung Die folgenden Auflistung zeigt, wie Sie einige häufig auftretende Probleme bei der Einrichtung Ihres drahtlosen Netzwerks beheben können. Wird Ihr Access Point bei der Suche nicht gefunden, sollten Sie überprüfen, ob Sie bei Konfiguration Ihres drahtlosen Geräts die Anzahl der Kanäle beschränkt haben. Wenn Sie sich nicht mit Ihrem Access Point verbinden können, sollten Sie überprüfen, ob die Konfiguration Ihrer Station auch der des Access Points entspricht. Achten Sie dabei speziell auf die Authentifzierungsmethode und die Sicherheitsprotokolle. Halten Sie Ihre Konfiguration so einfach wie möglich. Verwenden Sie ein Sicherheitsprotokoll wie WPA oder WEP, sollten Sie testweise Ihren Access Point auf offene Authentifizierung und keine Sicherheit einstellen. Danach versuchen Sie sich erneut mit Ihren Access Point zu verbinden. Nachdem Sie sich mit dem Access Point verbinden können, prüfen Sie die Sicherheitseinstellungen, beginnend mit einfachen Werkzeugen wie &man.ping.8;. Das Programm wpa_supplicant kann Ihnen bei der Fehlersuche helfen. Dazu starten Sie es manuell mit der Option und durchsuchen anschließend die Protokollinformationen nach eventuellen Fehlermeldungen. Zusätzlich gibt es auch zahlreiche Low-Level-Debugging-Werkzeuge. Die Ausgabe von Debugging-Informationen des 802.11 Protocol Support Layers lassen sich mit dem Programm wlandebug (das sich unter /usr/src/tools/tools/net80211 befindet) aktivieren. Um beispielsweise während der Suche nach Access Points und des Aufbaus von 802.11-Verbindungen (Handshake) auftretende Systemmeldungen auf die Konsole auszugeben, verwenden Sie den folgenden Befehl: &prompt.root; wlandebug -i ath0 +scan+auth+debug+assoc net.wlan.0.debug: 0 => 0xc80000<assoc,auth,scan> Der 802.11-Layer liefert umfangreiche Statistiken, die Sie mit dem Werkzeug wlanstats abrufen können. Diese Statistiken sollten alle Fehler identifizieren, die im 802.11-Layer auftreten. Beachten Sie aber, dass einige Fehler bereits im darunterliegenden Gerätetreiber auftreten und daher in diesen Statistiken nicht enthalten sind. Wie Sie Probleme des Gerätetreibers identifizieren, entnehmen Sie bitte der Dokumentation Ihres Gerätetreibers. Können Sie Ihr Problem durch diese Maßnahmen nicht lösen, sollten Sie einen Problembericht (PR) erstellen und die Ausgabe der weiter oben genannten Werkzeuge in den Bericht aufnehmen. Pav Lucistnik Beigetragen von
pav@FreeBSD.org
Bluetooth Bluetooth Übersicht Bluetooth ermöglicht die Bildung von persönlichen Netzwerken über drahtlose Verbindungen bei einer maximalen Reichweite von 10 Metern und operiert im unlizensierten 2,4-GHz-Band. Solche Netzwerke werden normalerweise spontan gebildet, wenn sich mobile Geräte, wie Mobiltelefone, Handhelds oder Notebooks miteinander verbinden. Im Gegensatz zu Wireless LAN ermöglicht Bluetooth auch höherwertige Dienste, wie FTP-ähnliche Dateiserver, Filepushing, Sprachübertragung, Emulation von seriellen Verbindungen und andere mehr. Der Bluetooth-Stack von &os; verwendet das Netgraph-Framework (&man.netgraph.4;). Viele Bluetooth-USB-Adapter werden durch den &man.ng.ubt.4;-Treiber unterstützt. Auf dem Chip BCM2033 von Broadcom basierende Bluetooth-Geräte werden von den Treibern &man.ubtbcmfw.4; sowie &man.ng.ubt.4; unterstützt. Die Bluetooth-PC-Card 3CRWB60-A von 3Com verwendet den &man.ng.bt3c.4;-Treiber. Serielle sowie auf UART basierende Bluetooth-Geräte werden von &man.sio.4;, &man.ng.h4.4; sowie &man.hcseriald.8; unterstützt. Dieses Kapitel beschreibt die Verwendung von USB-Bluetooth-Adaptern. Die Bluetooth-Unterstützung aktivieren Bluetooth-Unterstützung ist in der Regel als Kernelmodul verfügbar. Damit ein Gerät funktioniert, muss der entsprechende Treiber im Kernel geladen werden: &prompt.root; kldload ng_ubt Ist das Bluetooth-Gerät beim Systemstart angeschlossen, kann das entsprechende Modul auch von /boot/loader.conf geladen werden: ng_ubt_load="YES" Schließen Sie Ihren USB-Adapter an, sollte eine Meldung ähnlich der folgenden auf der Konsole (oder in syslog) erscheinen: ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2 ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2 ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3, wMaxPacketSize=49, nframes=6, buffer size=294 Zum Starten und Beenden des Bluetooth-Stacks verwenden Sie das Skript /etc/rc.d/bluetooth. Es ist empfehlenswert, den Bluetooth-Stack zu beenden, bevor Sie den Adapter entfernen. Selbst wenn Sie dies nicht tun, kommt es (normalerweise) zu keinem fatalen Fehler. Wenn Sie den Bluetooth-Stack starten, erhalten Sie eine Meldung ähnlich der folgenden: &prompt.root; /etc/rc.d/bluetooth start ubt0 BD_ADDR: 00:02:72:00:d4:1a Features: 0xff 0xff 0xf 00 00 00 00 00 <3-Slot> <5-Slot> <Encryption> <Slot offset> <Timing accuracy> <Switch> <Hold mode> <Sniff mode> <Park mode> <RSSI> <Channel quality> <SCO link> <HV2 packets> <HV3 packets> <u-law log> <A-law log> <CVSD> <Paging scheme> <Power control> <Transparent SCO data> Max. ACL packet size: 192 bytes Number of ACL packets: 8 Max. SCO packet size: 64 bytes Number of SCO packets: 8 HCI Das Host Controller Interface (HCI) Das Host Controller Interface (HCI) bietet eine Befehlsschnittstelle zum Basisbandcontroller und Linkmanager, sowie Zugriff auf den Hardwarestatus und die Kontrollregister. Dadurch wird ein einheitlicher Zugriff auf die Fähigkeiten des Bluetooth-Basisbands möglich. Die HCI-Layer des Rechners tauschen Daten und Befehle mit der HCI-Firmware der Bluetooth-Geräte aus. Über den Host Controller Transport Layer-Treiber (also den physikalischen Bus) können beide HCI-Layer miteinander kommunizieren. Eine einzelne Netgraph-Gerätedatei vom Typ hci wird für ein einzelnes Bluetooth-Gerät erzeugt. Die HCI-Gerätedatei ist normalerweise mit der Bluetooth-Gerätetreiberdatei (downstream) sowie der L2CAP-Gerätedatei (upstream) verbunden. Alle HCI-Operationen müssen über die HCI-Gerätedatei und nicht über die Treiberdatei erfolgen. Der Standardname für die HCI-Gerätedatei (die in &man.ng.hci.4; beschrieben wird) lautet devicehci. Eine der wichtigsten Aufgaben ist das Auffinden von sich in Reichweite befindenden Bluetooth-Geräten. Diese Funktion wird als inquiry bezeichnet. Inquiry sowie andere mit HCI in Verbindung stehende Funktionen werden von &man.hccontrol.8; zur Verfügung gestellt. Das folgende Beispiel zeigt, wie man herausfindet, welche Bluetooth-Geräte sich in Reichweite befinden. Eine solche Abfrage dauert nur wenige Sekunden. Beachten Sie, dass ein Gerät nur dann antwortet, wenn es sich im Modus discoverable befindet. &prompt.user; hccontrol -n ubt0hci inquiry Inquiry result, num_responses=1 Inquiry result #0 BD_ADDR: 00:80:37:29:19:a4 Page Scan Rep. Mode: 0x1 Page Scan Period Mode: 00 Page Scan Mode: 00 Class: 52:02:04 Clock offset: 0x78ef Inquiry complete. Status: No error [00] BD_ADDR stellt, ähnlich der MAC-Adresse einer Netzkarte, die eindeutige Adresse eines Bluetooth-Gerätes dar. Diese Adresse ist für die Kommunikation mit dem Gerät nötig. Es ist aber auch möglich, BD_ADDR einen Klartextnamen zuzuweisen. Die Datei /etc/bluetooth/hosts enthält Informationen über die bekannten Bluetooth-Rechner. Das folgende Beispiel zeigt, wie man den Klartextnamen eines entfernten Geräts in Erfahrung bringen kann: &prompt.user; hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4 BD_ADDR: 00:80:37:29:19:a4 Name: Pav's T39 Wenn Sie ein entferntes Bluetooth-Gerät abfragen, wird dieses Ihren Rechner unter dem Namen your.host.name (ubt0) finden. Dieser Name kann aber jederzeit geändert werden. Bluetooth ermöglicht Punkt-zu-Punkt-Verbindungen (an denen nur zwei Bluetooth-Geräte beteiligt sind), aber auch Punkt-zu-Multipunkt-Verbindungen, bei denen eine Verbindung von mehreren Bluetooth-Geräten gemeinsam genutzt wird. Das folgende Beispiel zeigt, wie man die aktiven Basisbandverbindungen des lokalen Gerätes anzeigen kann: &prompt.user; hccontrol -n ubt0hci read_connection_list Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State 00:80:37:29:19:a4 41 ACL 0 MAST NONE 0 0 OPEN Ein connection handle ist für die Beendigung einer Basisbandverbindung nützlich. Im Normalfall werden inaktive Verbindungen aber automatisch vom Bluetooth-Stack getrennt. &prompt.root; hccontrol -n ubt0hci disconnect 41 Connection handle: 41 Reason: Connection terminated by local host [0x16] Rufen Sie hccontrol help auf, wenn Sie eine komplette Liste aller verfügbaren HCI-Befehle benötigen. Die meisten dieser Befehle müssen nicht als root ausgeführt werden. L2CAP Das Logical Link Control and Adaptation Protocol (L2CAP) Das Logical Link Control and Adaptation Protocol (L2CAP) bietet höherwertigen Protokollen verbindungsorientierte und verbindungslose Datendienste an. Dazu gehören auch Protokollmultiplexing, Segmentierung und Reassemblierung. L2CAP erlaubt höherwertigen Protokollen und Programmen den Versand und Empfang von L2CAP-Datenpaketen mit einer Länge von bis zu 64 Kilobytes. L2CAP arbeitet kanalbasiert. Ein Kanal ist eine logische Verbindung innerhalb einer Basisbandverbindung. Jeder Kanal ist dabei an ein einziges Protokoll gebunden. Mehrere Geräte können an das gleiche Protokoll gebunden sein, es ist aber nicht möglich, einen Kanal an mehrere Protokolle zu binden. Jedes über einen Kanal ankommende L2CAP-Paket wird an das entsprechende höherwertige Protokoll weitergeleitet. Mehrere Kanäle können sich die gleiche Basisbandverbindung teilen. Eine einzelne Netgraph-Gerätedatei vom Typ l2cap wird für ein einzelnes Bluetooth-Gerät erzeugt. Die L2CAP-Gerätedatei ist normalerweise mit der Bluetooth-HCI-Gerätedatei (downstream) sowie der Bluetooth-Socket-Gerätedatei (upstream) verbunden. Der Standardname für die L2CAP-Gerätedatei, die in &man.ng.l2cap.4; beschrieben wird, lautet devicel2cap. Ein nützlicher Befehl zum Anpingen von anderen Geräten ist &man.l2ping.8;. Einige Bluetooth-Geräte senden allerdings nicht alle erhaltenen Daten zurück. Die Ausgabe 0 bytes ist also kein Fehler: &prompt.root; l2ping -a 00:80:37:29:19:a4 0 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0 Das Programm &man.l2control.8; liefert Informationen über L2CAP-Dateien. Das folgende Beispiel zeigt, wie man die Liste der logischen Verbindungen (Kanäle) sowie die Liste der Basisbandverbindungen abfragen kann: &prompt.user; l2control -a 00:02:72:00:d4:1a read_channel_list L2CAP channels: Remote BD_ADDR SCID/ DCID PSM IMTU/ OMTU State 00:07:e0:00:0b:ca 66/ 64 3 132/ 672 OPEN &prompt.user; l2control -a 00:02:72:00:d4:1a read_connection_list L2CAP connections: Remote BD_ADDR Handle Flags Pending State 00:07:e0:00:0b:ca 41 O 0 OPEN &man.btsockstat.1; ist ein weiteres Diagnoseprogramm. Es funktioniert analog zu &man.netstat.1;, arbeitet aber mit Bluetooth-Datenstrukturen. Das folgende Beispiel zeigt die gleiche Liste der logischen Verbindungen wie &man.l2control.8; im vorherigen Beispiel. &prompt.user; btsockstat Active L2CAP sockets PCB Recv-Q Send-Q Local address/PSM Foreign address CID State c2afe900 0 0 00:02:72:00:d4:1a/3 00:07:e0:00:0b:ca 66 OPEN Active RFCOMM sessions L2PCB PCB Flag MTU Out-Q DLCs State c2afe900 c2b53380 1 127 0 Yes OPEN Active RFCOMM sockets PCB Recv-Q Send-Q Local address Foreign address Chan DLCI State c2e8bc80 0 250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3 6 OPEN Das RFCOMM-Protokoll RFCOMM Das RFCOMM-Protokoll emuliert serielle Verbindungen über das L2CAP-Protokoll. Es basiert auf dem ETSI-Standard TS 07.10. Bei RFCOMM handelt es sich um ein einfaches Transportprotokoll, das um Funktionen zur Emulation der 9poligen Schaltkreise von mit RS-232 (EIATIA-232-E) kompatiblen seriellen Ports ergänzt wurde. RFCOMM erlaubt bis zu 60 simultane Verbindungen (RFCOMM-Kanäe) zwischen zwei Bluetooth-Geräten. Eine RFCOMM-Kommunikation besteht aus zwei Anwendungen (den Kommunikationsendpunkten), die über das Kommunikationssegment miteinander verbunden sind. RFCOMM unterstützt Anwendungen, die auf serielle Ports angewiesen sind. Das Kommunikationssegment entspricht der (direkten) Bluetooth-Verbindung zwischen den beiden Geräten. RFCOMM kümmert sich um die direkte Verbindung von zwei Geräten, oder um die Verbindung zwischen einem Gerät und einem Modem (Netzwerkverbindung). RFCOMM unterstützt auch andere Konfigurationen. Ein Beispiel dafür sind Module, die drahtlose Bluetooth-Geräte mit einer verkabelten Schnittstelle verbinden können. Unter &os; wurde das RFCOMM-Protokoll im Bluetooth Socket-Layer implementiert. Pairing Erstmaliger Verbindungsaufbau zwischen zwei Bluetooth-Geräten (<foreignphrase>Pairing</foreignphrase>) In der Voreinstellung nutzt Bluetooth keine Authentifizierung, daher kann sich jedes Bluetoothgerät mit jedem anderen Gerät verbinden. Ein Bluetoothgerät (beispielsweise ein Mobiltelefon) kann jedoch für einen bestimmten Dienst (etwa eine Einwählverbindung) eine Authentifizierung anfordern. Bluetooth verwendet zu diesem Zweck PIN-Codes. Ein PIN-Code ist ein maximal 16 Zeichen langer ASCII-String. Damit eine Verbindung zustande kommt, muss auf beiden Geräten der gleiche PIN-Code verwendet werden. Nachdem der Code eingegeben wurde, erzeugen beide Geräte einen link key, der auf den Geräten gespeichert wird. Beim nächsten Verbindungsaufbau wird der zuvor erzeugte Link Key verwendet. Diesen Vorgang bezeichnet man als Pairing. Geht der Link Key auf einem Gerät verloren, muss das Pairing wiederholt werden. Der &man.hcsecd.8;-Daemon verarbeitet alle Bluetooth-Authentifzierungsanforderungen und wird über die Datei /etc/bluetooth/hcsecd.conf konfiguriert. Der folgende Ausschnitt dieser Datei zeigt die Konfiguration für ein Mobiltelefon, das den PIN-Code 1234 verwendet: device { bdaddr 00:80:37:29:19:a4; name "Pav's T39"; key nokey; pin "1234"; } Von der Länge abgesehen, unterliegen PIN-Codes keinen Einschränkungen. Einige Geräte, beispielsweise Bluetooth-Headsets, haben einen festen PIN-Code eingebaut. Die Option sorgt dafür, dass der &man.hcsecd.8;-Daemon im Vordergrund läuft. Dadurch kann der Ablauf einfach verfolgt werden. Stellen Sie das entfernte Gerät auf receive pairing und initiieren Sie die Bluetoothverbindung auf dem entfernten Gerät. Sie erhalten die Meldung, dass Pairing akzeptiert wurde und der PIN-Code benötigt wird. Geben Sie den gleichen PIN-Code ein, den Sie in hcsecd.conf festgelegt haben. Ihr Computer und das entfernte Gerät sind nun miteinander verbunden. Alternativ können Sie das Pairing auch auf dem entfernten Gerät initiieren. Unter &os; 5.5, 6.1 und neuer können Sie hcsecd durch das Einfügen der folgenden Zeile in /etc/rc.conf beim Systemstart automatisch aktivieren: hcsecd_enable="YES" Es folgt nun eine beispielhafte Ausgabe des hcsecd-Daemons: hcsecd[16484]: Got Link_Key_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', link key doesn't exist hcsecd[16484]: Sending Link_Key_Negative_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Got PIN_Code_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', PIN code exists hcsecd[16484]: Sending PIN_Code_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4 SDP Das Service Discovery Protocol (SDP) Das Service Discovery Protocol (SDP) erlaubt es Clientanwendungen, von Serveranwendungen angebotene Dienste sowie deren Eigenschaften abzufragen. Zu diesen Eigenschaften gehören die Art oder die Klasse der angebotenen Dienste sowie der Mechanismus oder das Protokoll, die zur Nutzung des Dienstes notwendig sind. SDP ermöglicht Verbindungen zwischen einem SDP-Server und einem SDP-Client. Der Server enthält eine Liste mit den Eigenschaften der vom Server angebotenen Dienste. Jeder Eintrag beschreibt jeweils einen einzigen Serverdienst. Ein Client kann diese Informationen durch eine SDP-Anforderung vom SDP-Server beziehen. Wenn der Client oder eine Anwendung des Clients einen Dienst nutzen will, muss eine seperate Verbindung mit dem Dienstanbieter aufgebaut werden. SDP bietet einen Mechanismus zum Auffinden von Diensten und deren Eigenschaften an, es bietet aber keine Mechanismen zur Verwendung dieser Dienste. Normalerweise sucht ein SDP-Client nur nach Diensten, die bestimmte geforderte Eigenschaften erfüllen. Es ist aber auch möglich, anhand der Dienstbeschreibungen eine allgemeine Suche nach den von einem Server angebotenen Diensten durchzuführen. Diesen Vorgang bezeichnet man als Browsing. Der Bluetooth-SDP-Server &man.sdpd.8; und der Kommandozeilenclient &man.sdpcontrol.8; sind bereits in der Standardinstallation von &os; enthalten. Das folgende Beispiel zeigt, wie eine SDP-Abfrage durchgeführt wird: &prompt.user; sdpcontrol -a 00:01:03:fc:6e:ec browse Record Handle: 00000000 Service Class ID List: Service Discovery Server (0x1000) Protocol Descriptor List: L2CAP (0x0100) Protocol specific parameter #1: u/int/uuid16 1 Protocol specific parameter #2: u/int/uuid16 1 Record Handle: 0x00000001 Service Class ID List: Browse Group Descriptor (0x1001) Record Handle: 0x00000002 Service Class ID List: LAN Access Using PPP (0x1102) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 1 Bluetooth Profile Descriptor List: LAN Access Using PPP (0x1102) ver. 1.0 ... und so weiter. Beachten Sie, dass jeder Dienst eine Liste seiner Eigenschaften (etwa den RFCOMM-Kanal) zurückgibt. Je nach dem, welche Dienste Sie benötigen, sollten Sie sich einige dieser Eigenschaften notieren. Einige Bluetooth-Implementationen unterstützen kein Service Browsing und geben daher eine leere Liste zurück. Ist dies der Fall, ist es dennoch möglich, nach einem bestimmten Dienst zu suchen. Das folgende Beispiel demonstriert die Suche nach dem OBEX Object Push (OPUSH) Dienst: &prompt.user; sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH Unter &os; ist es die Aufgabe des &man.sdpd.8;-Servers, Bluetooth-Clients verschiedene Dienste anzubieten. Unter &os; 5.5, 6.1 und neuer können Sie dazu die folgende Zeile in die Datei /etc/rc.conf einfügen: sdpd_enable="YES" Nun kann der sdpd-Daemon durch folgene Eingabe gestartet werden: &prompt.root; /etc/rc.d/sdpd start Der lokale Server, der den entfernten Clients Bluetooth-Dienste anbieten soll, bindet diese Dienste an den lokalen SDP-Daemon. Ein Beispiel für eine solche Anwendung ist &man.rfcomm.pppd.8;. Einmal gestartet, wird der Bluetooth-LAN-Dienst an den lokalen SDP-Daemon gebunden. Die Liste der vorhandenen Dienste, die am lokalen SDP-Server registriert sind, lässt sich durch eine SDP-Abfrage über einen lokalen Kontrollkanal abfragen: &prompt.root; sdpcontrol -l browse Einwahlverbindungen (Dial-Up Networking (DUN)) oder Netzwerkverbindungen mit PPP (LAN)-Profilen einrichten Das Dial-Up Networking (DUN)-Profil wird vor allem für Modems und Mobiltelefone verwendet. Dieses Profil ermöglicht folgende Szenarien: Die Verwendung eines Mobiltelefons oder eines Modems durch einen Computer als drahtloses Modem, um sich über einen Einwahlprovider mit dem Internet zu verbinden oder andere Einwahldienste zu benutzen. Die Verwendung eines Mobiltelefons oder eines Modems durch einen Computers, um auf Datenabfragen zu reagieren. Der Zugriff auf ein Netzwerk über das PPP (LAN)-Profil kann in folgenden Situationen verwendet werden: Den LAN-Zugriff für ein einzelnes Bluetooth-Gerät Den LAN-Zugriff für mehrere Bluetooth-Geräte Eine PC-zu-PC-Verbindung (unter Verwendung einer PPP-Verbindung über eine emulierte serielle Verbindung) Beide Profile werden unter &os; durch &man.ppp.8; sowie &man.rfcomm.pppd.8; implementiert - einem Wrapper, der RFCOMM Bluetooth-Verbindungen unter PPP nutzbar macht. Bevor ein Profil verwendet werden kann, muss ein neuer PPP-Abschnitt in /etc/ppp/ppp.conf erzeugt werden. Beispielkonfigurationen zu diesem Thema finden Sie in &man.rfcomm.pppd.8;. Im folgenden Beispiel verwenden wir &man.rfcomm.pppd.8;, um eine RFCOMM-Verbindung zu einem entfernten Gerät mit der BD_ADDR 00:80:37:29:19:a4 auf dem RFCOMM-Kanal DUN aufzubauen. Die aktuelle RFCOMM-Kanalnummer erhalten Sie vom entfernten Gerät über SDP. Es ist auch möglich, manuell einen RFCOMM-Kanal festzulegen. In diesem Fall führt &man.rfcomm.pppd.8; keine SDP-Abfrage durch. Verwenden Sie &man.sdpcontrol.8;, um die RFCOMM-Kanäle des entfernten Geräts herauszufinden. &prompt.root; rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup Der &man.sdpd.8;-Server muss laufen, damit ein Netzzugriff mit dem PPP (LAN)-Profil möglich ist. Außerdem muss für den LAN-Client ein neuer Eintrag in /etc/ppp/ppp.conf erzeugt werden. Beispielkonfigurationen zu diesem Thema finden Sie in &man.rfcomm.pppd.8;. Danach starten Sie den RFCOMM PPP-Server über eine gültige RFCOMM-Kanalnummer. Der RFCOMM PPP-Server bindet dadurch den Bluetooth-LAN-Dienst an den lokalen SDP-Daemon. Das folgende Beispiel zeigt Ihnen, wie man den RFCOMM PPP-Server startet. &prompt.root; rfcomm_pppd -s -C 7 -l rfcomm-server OBEX Das Profil OBEX-Push (OPUSH) OBEX ist ein häufig verwendetes Protokoll für den Dateitransfer zwischen Mobilgeräten. Sein Hauptzweck ist die Kommunikation über die Infrarotschnittstelle. Es dient daher zum Datentransfer zwischen Notebooks oder PDAs sowie zum Austausch von Visitenkarten oder Kalendereinträgen zwischen Mobiltelefonen und anderen Geräten mit PIM-Funktionen. Server und Client von OBEX werden durch das Softwarepaket obexapp bereitgestellt, das als Port comms/obexapp verfügbar ist. Mit dem OBEX-Client werden Objekte zum OBEX-Server geschickt oder angefordert. Ein Objekt kann etwa eine Visitenkarte oder ein Termin sein. Der OBEX-Client fordert über SDP die Nummer des RFCOMM-Kanals vom entfernten Gerät an. Dies kann auch durch die Verwendung des Servicenamens anstelle der RFCOMM-Kanalnummer erfolgen. Folgende Dienste werden unterstützt: IrMC, FTRN und OPUSH. Es ist möglich, den RFCOMM-Kanal als Nummer anzugeben. Es folgt nun ein Beispiel für eine OBEX-Sitzung, bei der ein Informationsobjekt vom Mobiltelefon angefordert und ein neues Objekt (hier eine Visitenkarte) an das Telefonbuch des Mobiltelefons geschickt wird: &prompt.user; obexapp -a 00:80:37:29:19:a4 -C IrMC obex> get telecom/devinfo.txt Success, response: OK, Success (0x20) obex> put new.vcf Success, response: OK, Success (0x20) obex> di Success, response: OK, Success (0x20) Um OBEX-Push-Dienste anbieten zu können, muss der sdpd-Server gestartet sein. Ein Wurzelverzeichnis, in dem alle ankommenden Objekt gespeichert werden, muss zusätzlich angelegt werden. In der Voreinstellung ist dies /var/spool/obex. Starten Sie den OBEX-Server mit einer gültigen Kanalnummer. Der OBEX-Server registriert nun den OBEX-Push-Dienst mit dem lokalen SDP-Daemon. Um den OBEX-Server zu starten, geben Sie Folgendes ein: &prompt.root; obexapp -s -C 10 Das Profil Serial-Port (SPP) Durch dieses Profil können Bluetooth-Geräte RS232- (oder damit kompatible) serielle Kabelverbindungen emulieren. Anwendungen sind dadurch in der Lage, über eine virtuelle serielle Verbindung Bluetooth als Ersatz für eine Kabelverbindung zu nutzen. Das Profil Serial-Port wird durch &man.rfcomm.sppd.1; verwirklicht. Pseudo-tty wird hier als virtuelle serielle Verbindung verwendet. Das folgende Beispiel zeigt, wie man sich mit einem entfernten Serial-Port-Dienst verbindet. Beachten Sie, dass Sie den RFCOMM-Kanal nicht angeben müssen, da &man.rfcomm.sppd.1; diesen über SDP vom entfernten Gerät abfragen kann. Wenn Sie dies nicht wollen, können Sie einen RFCOMM-Kanal auch manuell festlegen. &prompt.root; rfcomm_sppd -a 00:07:E0:00:0B:CA -t /dev/ttyp6 rfcomm_sppd[94692]: Starting on /dev/ttyp6... Sobald die Verbindung hergestellt ist, kann pseudo-tty als serieller Port verwenden werden. &prompt.root; cu -l ttyp6 Problembehandlung Ein entferntes Gerät kann keine Verbindung aufbauen Einige ältere Bluetooth-Geräte unterstützen keinen Rollentausch. Wenn &os; eine neue Verbindung akzeptiert, wird versucht, die Rolle zu tauschen, um zum Master zu werden. Geräte, die dies nicht unterstützen, können keine Verbindung aufbauen. Beachten Sie, dass der Rollentausch ausgeführt wird, sobald eine neue Verbindung aufgebaut wird, daher ist es nicht möglich, das entfernte Gerät zu fragen, ob es den Rollentausch unterstützt. Dieses Verhalten von &os; kann aber durch eine HCI-Option geändert werden: &prompt.root; hccontrol -n ubt0hci write_node_role_switch 0 Wo finde ich genaue Informationen darüber, was schiefgelaufen ist? Verwenden Sie hcidump, das Sie über den Port comms/hcidump installieren können. hcidump hat Ähnlichkeiten mit &man.tcpdump.1;. Es dient zur Anzeige der Bluetooth-Pakete in einem Terminal oder zur Speicherung der Pakete in einer Datei (Dump).
Andrew Thompson Geschrieben von LAN-Kopplung mit einer Bridge Einführung Subnetz Bridge Manchmal ist es nützlich, ein physikalisches Netzwerk (wie ein Ethernetsegment) in zwei separate Netzwerke aufzuteilen, ohne gleich IP-Subnetze zu erzeugen, die über einen Router miteinander verbunden sind. Ein Gerät, das zwei Netze auf diese Weise verbindet, wird als Bridge bezeichnet. Jedes FreeBSD-System mit zwei Netzkarten kann als Bridge fungieren. Die Bridge arbeitet, indem sie die MAC Layeradressen (Ethernet Adressen) der Geräte in ihren Netzwerksegmenten lernt. Der Verkehr wird nur dann zwischen zwei Segmenten weitergeleitet, wenn sich Sender und Empfänger in verschiedenen Netzwerksegmenten befinden. In vielerlei Hinsicht entspricht eine Bridge daher einem Ethernet-Switch mit sehr wenigen Ports. Situationen, in denen <emphasis>Bridging</emphasis> angebracht ist Es gibt zahlreiche Situationen, in denen der Einsatz einer Bridge sinnvoll ist: Verbinden von Netzwerken Die Hauptaufgabe einer Bridge ist die Verbindung von zwei oder mehreren Netzwerksegmenten zu einem gemeinsamen Netzwerk. Es ist oft sinnvoller, eine hostbasierte Bridge anstelle normaler Netzwerkkomponenten (wie Kabelverbindungen), Firewalls oder Pseudonetzwerken über die Schnittstelle einer virtuellen Maschine einzusetzen. Eine Bridge kann außerdem ein drahtloses Gerät mit einem Kabelnetzwerk verbinden. Diese Fähigkeit der Bridge wird als HostAP-Modus bezeichnet. Die Bridge agiert in diesem Fall als Access Point für das drahtlose Gerät. Filtering/Traffic Shaping Firewall Firewall NAT Häufig kommt es vor, dass Firewallfunktionen benötigt werden, ohne dass Routing oder Network Adress Translation (NAT) verwendet werden soll. Ein Beispiel dafür wäre ein kleines Unternehmen, das über DSL oder ISDN an seinen ISP angebunden ist. Es verfügt über 13 weltweit erreichbare IP-Adressen, sein Netzwerk besteht aus 10 Rechnern. In dieser Situation ist der Einsatz von Subnetzen sowie einer routerbasierten Firewall schwierig. Router DSL ISDN Eine brigdebasierte Firewall kann konfiguriert und in den ISDN/DSL-Downstreampfad ihres Routers eingebunden werden, ohne dass Sie sich um IP-Adressen kümmern müssen. Netzwerküberwachung Eine Bridge kann zwei Netzwerksegmente miteinander verbinden und danach alle Ethernet-Rahmen überprüfen, die zwischen den beiden Netzwerksegmenten ausgetauscht werden. Dazu verwendet man entweder &man.bpf.4;/&man.tcpdump.1; auf dem Netzgerät der Bridge oder schickt Kopien aller Rahmen an ein zusätzliches Netzgerät (den sogenannten Span Port). Layer 2-VPN Zwei Ethernetnetzwerke können über einen IP-Link miteinander verbunden werden, indem Sie die beiden Netzwerke über einen EtherIP-Tunnel koppeln oder eine &man.tap.4;-basierte Lösung wie OpenVPN einsetzen. Layer 2-Redundanz Die Systeme eines Netzwerks können redundant miteinander verbunden sein. In diesem Fall verwenden Sie das Spanning Tree Protocol, um redundante Pfade zu blockieren. Damit ein Ethernetnetzwerk korrekt arbeitet, darf immer nur ein aktiver Pfad zwischen zwei Geräten des Netzwerks existieren. Aufgabe des Spanning Tree Protocols ist es daher, Schleifen zu entdecken und redundante Links in den Status blockiert zu versetzen. Fällt ein aktiver Link aus, so berechnet das Protokoll einen neuen Pfad. Dazu wird ein blockierter Pfad in den Status aktiv versetzt, damit alle Systeme des Netzwerks wieder miteinander kommunizieren können. Kernelkonfiguration Dieser Abschnitt beschreibt nur die &man.if.bridge.4;-Bridge-Implementierung. Ein Netgraph-Bridge-Treiber ist ebenfalls verfügbar, wird hier aber nicht behandelt. Lesen Sie die Manualpage &man.ng.bridge.4;, wenn Sie diesen Treiber einsetzen wollen. Bei diesem Treiber handelt es sich um ein Kernelmodul, das von &man.ifconfig.8; automatisch geladen wird, wenn ein Bridge-Interface erzeugt wird. Alternativ ist es aber auch möglich, die Unterstützung für den Treiber in Ihren Kernel zu kompilieren. Dazu fügen Sie die Zeile device if_bridge in Ihre Kernelkonfigurationsdatei ein und bauen danach den Kernel neu. Paketfilter können mit allen Firewallpaketen verwendet werden, die das &man.pfil.9;-Framework benutzen. Die Firewall kann dabei entweder als Kernelmodul geladen oder in den Kernel kompiliert werden. Eine Bridge kann auch als Traffic Shaper verwendet werden, wenn Sie &man.altq.4; oder &man.dummynet.4; einsetzen. Die LAN-Kopplung aktivieren Eine Bridge wird durch das Klonen von Schnittstellen erzeugt. Um eine Bridge zu erzeugen, verwenden Sie den Befehl &man.ifconfig.8;. Ist der Bridge-Treiber nicht in Ihren Kernel kompiliert, wird er automatisch geladen. &prompt.root; ifconfig bridge create bridge0 &prompt.root; ifconfig bridge0 bridge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 96:3d:4b:f1:79:7a id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200 root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0 Im obigen Beispiel wird die Bridge erzeugt und erhält automatisch eine zufällig generierte Ethernet-Adresse zugewiesen. Die Parameter maxaddr sowie timeout legen fest, wie viele MAC-Adressen die Bridge in ihrer Forward-Tabelle halten kann beziehungsweise wie viele Sekunden jeder Eintrag erhalten bleiben soll, nachdem er zuletzt verwendet wurde. Die restlichen Parameter sind für die Konfiguration von Spanning Tree notwendig. Im nächsten Schritt werden die Schnittstellen, die die Bridge verbinden soll, zugewiesen. Damit die Bridge Datenpakete weiterleiten kann, müssen sowohl die Bridge als auch die Schnittstellen (der zu verbindenden Netzwerksegmente) aktiviert sein: &prompt.root; ifconfig bridge0 addm fxp0 addm fxp1 up &prompt.root; ifconfig fxp0 up &prompt.root; ifconfig fxp1 up Danach ist die Bridge in der Lage, Ethernet-Rahmen zwischen den Schnittstellen fxp0 und fxp1 weiterzuleiten. Um diese Konfiguration beim Systemstart automatisch zu aktivieren, müssen Sie folgende Einträge in die Datei /etc/rc.conf aufnehmen: cloned_interfaces="bridge0" ifconfig_bridge0="addm fxp0 addm fxp1 up" ifconfig_fxp0="up" ifconfig_fxp1="up" Benötigen Sie für die Bridge eine IP-Adresse, müssen Sie diese der Schnittstelle der Bridge zuweisen (und nicht einer der Schnittstellen der gekoppelten Netzwerksegmente). Dabei können Sie die IP-Adresse sowohl statisch als auch dynamisch über DHCP zuweisen: &prompt.root; ifconfig bridge0 inet 192.168.0.1/24 Sie können der Bridge-Schnittstelle auch eine IPv6-Adresse zuweisen. Firewalls firewall Nachdem ein Paketfilter aktiviert wurde, können Datenpakete, die von den Schnittstellen der gekoppelten Netzwerksegmente gesendet und empfangen werden, über die Bridge weitergeleitet oder nach bestimmten Regeln gefiltert oder auch komplett geblockt werden. Ist die Richtung des Paketflusses wichtig, ist es am besten, eine Firewall auf den Schnittstellen der einzelnen Netzwerksegmente einzurichten und nicht auf der Bridge selbst. Eine Bridge verfügt über verschiedene Optionen, über die Sie die Weiterleitung von Nicht-IP- und ARP-Paketen sowie den Einsatz von Layer 2-Firewalls (mit IPFW) steuern können. Lesen Sie die Manualpage &man.if.bridge.4;, wenn Sie diese Funktionen benötigen. Spanning Tree Der Bridge-Treiber implementiert das Rapid Spanning Tree Protocol (RSTP oder 802.1w), das abwärtskompatibel zum veralteten Spanning Tree Protocol (STP) ist. Spanning Tree dient dazu, Schleifen in einer Netzwerktopologie zu entdecken und zu entfernen. RSTP arbeitet dabei schneller als das veraltete STP. RSTP tauscht Informationen mit benachbarten Switchen aus, um Pakete korrekt weiterzuleiten und eine Schleifenbildung zu verhindern. Die folgende Tabelle listet die von den verschiedenen &os;-Versionen unterstützten Betriebsmodi auf: &os;-Version STP-Modus Standardmodus &os; 5.4—&os; 6.2 STP STP &os; 6.3+ RSTP oder STP STP &os; 7.0+ RSTP oder STP RSTP Spanning Tree kann auf den Schnittstellen der durch die Bridge verbundenen Netzwerksegmente über die Option stp aktiviert werden. Für eine Bridge, die die Schnittstellen fxp0 und fxp1 verbindet, aktivieren Sie STP wie folgt: &prompt.root; ifconfig bridge0 stp fxp0 stp fxp1 bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether d6:cf:d5:a0:94:6d id 00:01:02:4b:d4:50 priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200 root id 00:01:02:4b:d4:50 priority 32768 ifcost 0 port 0 member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 3 priority 128 path cost 200000 proto rstp role designated state forwarding member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 4 priority 128 path cost 200000 proto rstp role designated state forwarding Diese Bridge hat die Spanning-Tree-ID 00:01:02:4b:d4:50 und die Priorität 32768. Da diese ID mit der Root-ID identisch ist, handelt es sich um die Root-Bridge dieses Netzwerks. Auf einer anderen Bridge des Netzwerks ist Spanning Tree ebenfalls aktiviert: bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 96:3d:4b:f1:79:7a id 00:13:d4:9a:06:7a priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200 root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4 member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 4 priority 128 path cost 200000 proto rstp role root state forwarding member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 5 priority 128 path cost 200000 proto rstp role designated state forwarding Die Zeile root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4 zeigt an, dass die Root-Bridge wie im obigen Beispiel die ID 00:01:02:4b:d4:50 hat. Die Pfadkosten hin zur Root-Bridge betragen 400000, wobei der Pfad zur Root-Bridge über Port 4 geht (der wiederum der Schnittstelle fxp0 entspricht). Fortgeschrittene Funktionen Den Datenfluss rekonstruieren Die Bridge unterstützt den Monitormodus. Dabei werden alle Pakete verworfen, nachdem sie von &man.bpf.4; verarbeitet wurden. In diesem Modus erfolgt keine weitere Bearbeitung und auch keine Weiterleitung von Datenpaketen. Es ist daher möglich, die Eingabe von zwei oder mehr Netzwerkschnittstellen in einen einzigen gemeinsamen &man.bpf.4;-Stream zu vereinen. Ein solcher Datenstrom ist beispielsweise nützlich, um den Datenverkehr für ""network taps"" zu rekonstruieren, die ihre RX/TX-Signale über verschiedene Schnittstellen senden. Um die Eingabe von vier Netzwerkschnittstellen in einzigen gemeinsamen Datenstrom zu vereinen, geben Sie Folgendes ein: &prompt.root; ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 monitor up &prompt.root; tcpdump -i bridge0 Span Ports Eine Kopie jedes Ethernet-Rahmens, der an der Bridge ankommt, wird über einen festgelegten Span Port verschickt. Auf einer Bridge können beliebig viele Span Ports festgelegt werden. Wird eine Schnittstelle als Span Port konfiguriert, kann sie nicht mehr als normaler Bridge-Port verwendet werden. Eine derartige Konfiguration ist beispielsweise sinnvoll, um den Datenverkehr, der in einem Netzwerk über die Bridge läuft, auf einen Rechner zu übertragen, der mit einem Span Port der Bridge verbunden ist. Um eine Kopie aller Ethernet-Rahmen über die Schnittstelle fxp4 zu verschicken, geben Sie Folgendes ein: &prompt.root; ifconfig bridge0 span fxp4 Private Schnittstellen Eine private Schnittstelle leitet keine Daten an einen Port weiter, bei dem es sich ebenfalls um eine private Schnittstelle handelt. Der Datenverkehr wird dabei komplett blockiert, auch Ethernet-Rahmen und ARP-Pakete werden nicht weitergeleitet. Wollen Sie hingegen nur spezifische Datenpakete blockieren, sollten Sie eine Firewall einsetzen. Schnittstellen als <foreignphrase>sticky</foreignphrase> kennzeichnen Wenn die Schnittstelle eines über eine Bridge verbundenen Netzwerksegments als sticky gekennzeichnet wird, werden alle dynamisch gelernten Adressen als statische Adressen behandelt, sobald sie in den Forward-Cache der Bridge aufgenommen wurden. Sticky-Einträge werden niemals aus dem Cache entfernt oder ersetzt. Selbst dann nicht, wenn die Adresse von einer anderen Schnittstelle verwendet wird. Sie können dadurch die Vorteile statischer Adresseinträge nutzen, ohne die Forward-Tabelle vor dem Einsatz der Bridge mit statischen Einträgen füllen zu müssen. Clients, die sich in einem bestimmten von der Bridge verwalteten Segmente befinden, können dabei nicht in ein anderes Segment wechseln. Ein weiteres Beispiel für den Einsatz von Sticky-Adressen wäre die Kombination einer Bridge mit mehreren VLANs, um einen Router zu konfigurieren, der in in der Lage ist, einzelne Kundennetzwerke voneinander zu trennen, ohne IP-Adressbereiche zu verschwenden. Für das folgende Beispiel nehmen wir an, dass sich der Client CustomerA im VLAN vlan100 und der Client CustomerB im VLAN vlan101 befinden. Die Bridge hat die IP-Adresse 192.168.0.1 und ist als Internet-Router konfiguriert. &prompt.root; ifconfig bridge0 addm vlan100 sticky vlan100 addm vlan101 sticky vlan101 &prompt.root; ifconfig bridge0 inet 192.168.0.1/24 Beide Clients sehen 192.168.0.1 als Ihr Default-Gateway. Da der Brücken-Cache sticky ist, sind Sie nicht dazu in der Lage, die MAC-Adresse des anderen Kunden zu spoofen und dessen Datenverkehr abzufangen. Sie können die Kommunikation zwischen den VLANs vollständig unterbinden, wenn Sie private Schnittstellen (oder eine Firewall) einsetzen: &prompt.root; ifconfig bridge0 private vlan100 private vlan101 Die Kunden sind nun komplett voneinander isoliert und der komplette /24-Adressbereich kann zugewiesen werden, ohne dass Sie Subnetze einsetzen müssen. Adressen-Limitierung Die maximale mögliche Anzahl an eindeutigen MAC-Adressen hinter einer Schnittstelle kann festgelegt werden. Sobald das Limit erreicht ist, werden Pakete mit einer unbekannten Quell-Adresse solange verworfen, bis ein exisitierender Eintrag gelöscht wird oder abläuft. Das folgende Beispiel setzt die maximale Anzahl von Netzgeräten für CustomerA für das VLAN vlan100 auf 10. &prompt.root; ifconfig bridge0 ifmaxaddr vlan100 10 SNMP-Monitoring Die Schnittstelle der Bridge sowie die STP-Parameter können durch den bereits im Basissystem enthaltenen SNMP-Daemon überwacht werden. Die exportierten Bridge-MIBs entsprechen den IETF-Standards, daher können Sie einen beliebigen SNMP-Client oder ein beliebiges Monitoring-Werkzeug einsetzen, um die benötigten Daten zu erhalten. Auf dem Rechner, auf dem die Bridge konfiguriert ist, aktivieren Sie die Zeile begemotSnmpdModulePath."bridge" = "/usr/lib/snmp_bridge.so" in der Datei /etc/snmp.config und starten danach den bsnmpd-Daemon. Eventuell benötigen Sie noch weitere Konfigurationsparameter wie Community-Namen und Zugriffslisten. Die Konfiguration dieser Parameter wird in den Manualpages &man.bsnmpd.1; sowie &man.snmp.bridge.3; beschrieben. Die folgenden Beispiele verwenden das Softwarepaket Net-SNMP (net-mgmt/net-snmp), um die Bridge abzufragen. Alternativ können Sie dafür auch den Port net-mgmt/bsnmptools einsetzen. Auf dem SNMP-Client fügen Sie danach die folgenden Zeilen in die Datei $HOME/.snmp/snmp.conf ein, um die MIB-Definitionen der Bridge in Net-SNMP zu importieren: mibdirs +/usr/share/snmp/mibs mibs +BRIDGE-MIB:RSTP-MIB:BEGEMOT-MIB:BEGEMOT-BRIDGE-MIB Um eine einzelne Bridge über den IETF BRIDGE-MIB (RFC4188) zu überwachen, geben Sie Folgendes ein: &prompt.user; snmpwalk -v 2c -c public bridge1.example.com mib-2.dot1dBridge BRIDGE-MIB::dot1dBaseBridgeAddress.0 = STRING: 66:fb:9b:6e:5c:44 BRIDGE-MIB::dot1dBaseNumPorts.0 = INTEGER: 1 ports BRIDGE-MIB::dot1dStpTimeSinceTopologyChange.0 = Timeticks: (189959) 0:31:39.59 centi-seconds BRIDGE-MIB::dot1dStpTopChanges.0 = Counter32: 2 BRIDGE-MIB::dot1dStpDesignatedRoot.0 = Hex-STRING: 80 00 00 01 02 4B D4 50 ... BRIDGE-MIB::dot1dStpPortState.3 = INTEGER: forwarding(5) BRIDGE-MIB::dot1dStpPortEnable.3 = INTEGER: enabled(1) BRIDGE-MIB::dot1dStpPortPathCost.3 = INTEGER: 200000 BRIDGE-MIB::dot1dStpPortDesignatedRoot.3 = Hex-STRING: 80 00 00 01 02 4B D4 50 BRIDGE-MIB::dot1dStpPortDesignatedCost.3 = INTEGER: 0 BRIDGE-MIB::dot1dStpPortDesignatedBridge.3 = Hex-STRING: 80 00 00 01 02 4B D4 50 BRIDGE-MIB::dot1dStpPortDesignatedPort.3 = Hex-STRING: 03 80 BRIDGE-MIB::dot1dStpPortForwardTransitions.3 = Counter32: 1 RSTP-MIB::dot1dStpVersion.0 = INTEGER: rstp(2) Der Wert der Variable dot1dStpTopChanges.0 ist hier 2, die STP-Topologie der Bridge wurde also bereits zweimal geändert. Unter einer Änderung versteht man dabei die Anpassung eines oder mehrerer Links und die Kalkulation eines neuen Baums. Der Wert der Variable dot1dStpTimeSinceTopologyChange.0 gibt an, wann dies zuletzt geschah. Um mehrere Bridge-Schnittstellen zu überwachen, können Sie den privaten BEGEMOT-BRIDGE-MIB einsetzen: &prompt.user; snmpwalk -v 2c -c public bridge1.example.com enterprises.fokus.begemot.begemotBridge BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge0" = STRING: bridge0 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge2" = STRING: bridge2 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge0" = STRING: e:ce:3b:5a:9e:13 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge2" = STRING: 12:5e:4d:74:d:fc BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge0" = INTEGER: 1 BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge2" = INTEGER: 1 ... BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge0" = Timeticks: (116927) 0:19:29.27 centi-seconds BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge2" = Timeticks: (82773) 0:13:47.73 centi-seconds BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge0" = Counter32: 1 BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge2" = Counter32: 1 BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge0" = Hex-STRING: 80 00 00 40 95 30 5E 31 BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge2" = Hex-STRING: 80 00 00 50 8B B8 C6 A9 Um die über den mib-2.dot1dBridge-Subtree überwachte Bridge-Schnittstelle zu ändern, geben Sie Folgendes ein: &prompt.user; snmpset -v 2c -c private bridge1.example.com BEGEMOT-BRIDGE-MIB::begemotBridgeDefaultBridgeIf.0 s bridge2 - Link Aggregation and Failover - - Dieser Abschnitt ist noch nicht übersetzt. - Lesen Sie bitte - das Original in englischer Sprache. Wenn Sie helfen - wollen, diesen Abschnitt zu übersetzen, senden Sie bitte - eine E-Mail an die Mailingliste &a.de.translators;. + + + + Andrew + Thompson + Written by + + + + + + Benedict + Reuschling + Übersetzt von + + + Sharon + Bahagi + + + + Link Aggregation und Failover + + lagg + failover + fec + lacp + loadbalance + roundrobin + + + Einleitung + Die &man.lagg.4;-Schnittstelle erlaubt die Aggregation von + mehreren Netzwerkadaptern als eine virtuelle Schnittstelle mit dem + Ziel, Ausfallsicherheit (Failover) und Hochgeschwindigkeitsverbindungen + bereitzustellen. + + + + Anwendungsoptionen + + + + Ausfallsicherheit (Failover) + + + Sendet und empfängt Netzwerkverkehr nur auf dem + Masterport. Sollte der Masterport nicht zur Verfügung stehen, + wird der nächste aktive Port verwendet. Der zuerst + hinzugefügte Adapter wird zum Masterport, jeder weitere Adapter + dient als Gerät zur Ausfallsicherheit. + + + + &cisco; Fast ðerchannel; + + + &cisco; Fast ðerchannel; (FEC), ist eine statische + Konfiguration und handelt weder Aggregation mit der Gegenstelle aus, + noch werden Frames zur Überwachung der Verbindung ausgetauscht. + Wenn der Switch LACP unterstützt, sollte diese Option auch + verwendet werden. + + FEC balanciert den ausgehenden Verkehr + über die aktiven Ports, basierend auf gehashten + Protokollheaderinformationen und akzeptiert eingehenden Verkehr auf + jedem aktiven Port. Der Hash enthält die Ethernet-Quell- und + Zieladresse, und, falls verfügbar, den VLAN-Tag, sowie die + IPv4/IPv6 Quell- und Zieladresse. + + + + LACP + + + Das &ieee; 802.3ad Link Aggregation Control Protokoll + (LACP) und das Marker Protocol. LACP wird eine Menge von + aggregierbaren Verbindungen mit der Gegenstelle in einer oder + mehreren Link Aggregated Groups (LAG) aushandeln. Jede LAG besteht + aus Ports der gleichen Geschwindigkeit, eingestellt auf + Voll-Duplex-Betrieb. Der Verkehr wird über die Ports + in der LAG mit der größten Gesamtgeschwindigkeit + balanciert, in den meisten Fällen wird es nur eine LAG geben, + die alle Ports enthält. Im Falle von Änderungen in der + physischen Anbindung wird die Link Aggregation schnell zu einer + neuen Konfiguration konvergieren. + + LACP balanciert ausgehenden Verkehr + über die aktiven Ports basierend auf der gehashten + Protokollheaderinformation und akzeptiert eingehenden Verkehr auf + jedem aktiven Port. Der Hash beinhaltet die Ethernet-Quell- und + Zieladresse, und, soweit verfügbar, den VLAN-Tag, sowie die + IPv4/IPv6 Quell- und Zieladresse. + + + + Lastverteilung (Loadbalance) + + + Dabei handelt es sich um einen Alias des + FEC-Modus. + + + + Round-Robin + + + Verteilt ausgehenden Verkehr mittels einer Round-Robin-Zuteilung + über alle aktiven Ports und akzeptiert eingehenden Verkehr auf + jedem aktiven Port. Dieser Modus verletzt die Reihenfolge von + Ethernet-Frames und sollte mit Vorsicht eingesetzt werden. + + + + + + + Beispiele + + + LACP Aggregation mit einem Switch von &cisco; + + Dieses Beispiel verbindet zwei Adapter auf einer &os;-Maschine + mit dem Switch als eine einzelne, lastverteilte und ausfallsichere + Verbindung. Weitere Adapter können hinzugefügt werden, um + den Durchsatz zu erhöhen und die Ausfallsicherheit zu steigern. + Da die Reihenfolge der Frames bei Ethernet zwingend eingehalten + werden muss, fließt auch jeglicher Verkehr zwischen zwei + Stationen über den gleichen physischen Kanal, was die maximale + Geschwindigkeit der Verbindung auf die eines einzelnen Adapters + beschränkt. Der Übertragungsalgorithmus versucht, so viele + Informationen wie möglich zu verwenden, um die verschiedenen + Verkehrsflüsse zu unterscheiden und balanciert diese über + die verfügbaren Adapter. + + Fügen Sie auf dem &cisco;-Switch die Adapter + FastEthernet0/1 und + FastEthernet0/2 zu der + channel-group 1 hinzu: + + interface FastEthernet0/1 + channel-group 1 mode active + channel-protocol lacp +! +interface FastEthernet0/2 + channel-group 1 mode active + channel-protocol lacp + + Auf der Maschine mit &os; erstellen Sie die + &man.lagg.4;-Schnittstelle unter Verwendung von + fxp0 und + fxp1: + + &prompt.root; ifconfig lagg0 create +&prompt.root; ifconfig lagg0 up laggproto lacp laggport fxp0 laggport fxp1 + + Überprüfen Sie den Status der Schnittstelle, indem + Sie folgendes eingeben: + + &prompt.root; ifconfig lagg0 + + Ports, die als ACTIVE markiert sind, sind + Teil der aktiven Aggregations-Gruppe, die mit dem Switch + ausgehandelt wurde und der Verkehr wird über diese + übertragen und empfangen. Benutzen Sie die ausführliche + Ausgabe von &man.ifconfig.8;, um sich die LAG-Identifikatoren + anzeigen zu lassen. + + lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 + options=8<VLAN_MTU> + ether 00:05:5d:71:8d:b8 + media: Ethernet autoselect + status: active + laggproto lacp + laggport: fxp1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> + laggport: fxp0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> + + Um den Status der Ports auf dem Switch anzuzeigen, geben Sie + show lacp neighbor ein: + + switch# show lacp neighbor +Flags: S - Device is requesting Slow LACPDUs + F - Device is requesting Fast LACPDUs + A - Device is in Active mode P - Device is in Passive mode + +Channel group 1 neighbors + +Partner's information: + + LACP port Oper Port Port +Port Flags Priority Dev ID Age Key Number State +Fa0/1 SA 32768 0005.5d71.8db8 29s 0x146 0x3 0x3D +Fa0/2 SA 32768 0005.5d71.8db8 29s 0x146 0x4 0x3D + + Benutzen Sie das Kommando show lacp neighbor + detail, um weitere Informationen zu erhalten. + + + Ausfallsicherer Modus + + Der ausfallsichere Modus kann verwendet werden, um zu einer + zweiten Schnittstelle zu wechseln, sollte die Verbindung mit der + Master-Schnittstelle ausfallen. Erstellen und konfigurieren Sie die + lagg0-Schnittstelle, mit + fxp0 als Master und + fxp1 als die sekundäre + Schnittstelle: + + &prompt.root; ifconfig lagg0 create +&prompt.root; ifconfig lagg0 up laggproto failover laggport fxp0 laggport fxp1 + + Die Schnittstelle wird so ähnlich wie im folgenden + aussehen, mit dem großen Unterschied, dass die + MAC-Adresse und die Gerätenamen + unterschiedlich sein werden: + + &prompt.root; ifconfig lagg0 +lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 + options=8<VLAN_MTU> + ether 00:05:5d:71:8d:b8 + media: Ethernet autoselect + status: active + laggproto failover + laggport: fxp1 flags=0<> + laggport: fxp0 flags=5<MASTER,ACTIVE> + + Der Verkehr wird auf fxp0 + übertragen und empfangen. Wenn die Verbindung auf + fxp0 abbricht, so wird + fxp1 die Verbindung übernehmen. + Sobald die Verbindung auf der Master-Schnittstelle wiederhergestellt + ist, wird diese auch wieder als aktive Schnittstelle genutzt. + + Jean-François Dockès Aktualisiert von Alex Dupre Reorganisiert und erweitert von Start und Betrieb von FreeBSD über ein Netzwerk plattenloser Arbeitsplatz plattenloser Betrieb FreeBSD kann über ein Netzwerk starten und arbeiten, ohne eine lokale Festplatte zu verwenden, indem es Dateisysteme eines NFS-Servers in den eigenen Verzeichnisbaum einhängt. Dazu sind, von den Standardkonfigurationsdateien abgesehen, keine Systemänderungen nötig. Ein solches System kann leicht installiert werden, da alle notwendigen Elemente bereits vorhanden sind: Es gibt mindestens zwei Möglichkeiten, den Kernel über das Netzwerk zu laden: PXE: Das Preboot eXecution Environment System von &intel; ist eine Art intelligentes Boot-ROM, das in einigen Netzkarten oder Hauptplatinen verwendet wird. Weitere Informationen finden Sie in &man.pxeboot.8;. Der Port Etherboot (net/etherboot) erzeugt ROM-fähigen Code, um einen Kernel über das Netzwerk zu laden. Dieser Code kann entweder auf ein Boot-PROM einer Netzkarte gebrannt werden, was von vielen Netzkarten unterstützt wird. Oder er kann von einer lokalen Diskette, Festplatte oder von einem laufenden &ms-dos;-System geladen werden. Das Beispielskript /usr/share/examples/diskless/clone_root erleichtert die Erzeugung und die Wartung des root-Dateisystems auf dem Server. Das Skript muss wahrscheinlich angepasst werden, dennoch werden Sie schnell zu einem Ergebnis kommen. Die Startdateien, die einen plattenlosen Systemstart erkennen und unterstützen, sind nach der Installation in /etc vorhanden. Dateiauslagerungen können sowohl via NFS als auch auf die lokale Platte erfolgen. Es gibt verschiedene Wege, einen plattenlosen Rechner einzurichten. Viele Elemente sind daran beteiligt, die fast immer an den persönlichen Geschmack angepasst werden können. Im folgenden Abschnitt wird die Installation eines kompletten Systems beschrieben, wobei der Schwerpunkt auf Einfachheit und Kompatibilität zu den Standardstartskripten von FreeBSD liegt. Das beschriebene System hat folgende Eigenschaften: Die plattenlosen Rechner haben ein gemeinsames /- sowie ein gemeinsames /usr-Dateisystem, die jeweils schreibgeschützt sind. Das root-Dateisystem ist eine Kopie eines Standardwurzelverzeichnisses von FreeBSD (üblicherweise das des Servers), bei dem einige Konfigurationsdateien durch für den plattenlosen Betrieb geeignete Versionen ersetzt wurden. Für die Bereiche des root-Dateisystems, die beschreibbar sein müssen, werden mit &man.md.4; virtuelle Dateisysteme erzeugt. Dies bedeutet aber auch, dass alle Veränderungen verloren gehen, wenn das System neu gestartet wird. Der Kernel wird, in Abhängigkeit von der jeweiligen Situation, entweder von Etherboot oder von PXE transferiert und geladen. Das hier beschriebene System ist nicht sicher. Es sollte nur in einem gesicherten Bereich eines Netzwerks verwendet werden und für andere Rechner nicht erreichbar sein. Alle Informationen in diesem Abschnitt wurden unter &os; 5.2.1-RELEASE getestet. Hintergrundinformationen Die Einrichtung von plattenlosen Rechnern ist einfach, aber auch fehleranfällig. Der Grund dafür sind auftretende Fehler, die sich oft nur schwer zuordnen lassen. Unter anderem sind dafür folgende Umstände verantwortlich: Kompilierte Optionen haben zur Laufzeit unterschiedliche Auswirkungen. Fehlermeldungen sind oft kryptisch oder fehlen vollständig. Daher ist es nützlich, über die im Hintergrund ablaufenden Mechanismen Bescheid zu wissen. Dadurch wird es einfacher, eventuell auftretende Fehler zu beheben. Verschiedene Operationen müssen ausgeführt werden, um ein System erfolgreich zu starten: Der Rechner benötigt einige Startparameter, wie seine IP-Adresse, die Namen ausführbarer Dateien, den Servernamen sowie den root-Pfad. Für die Übermittlung dieser Informationen wird entweder das DHCP- oder das BOOTP-Protokoll verwendet. Bei DHCP handelt es sich um eine abwärtskompatible Erweiterung von BOOTP, die die gleichen Portnummern und das gleiche Paketformat verwendet. Es ist möglich, das System so zu konfigurieren, dass es nur BOOTP verwendet. Das Serverprogramm &man.bootpd.8; ist bereits im &os;-Basissystem enthalten. DHCP hat im Vergleich zu BOOTP allerdings mehrere Vorteile (bessere Konfigurationsdateien, die Möglichkeit zur Verwendung von PXE, sowie viele andere, die nicht in direktem Zusammenhang mit dem plattenlosen Betrieb stehen). Dieser Abschnitt beschreibt die Konfiguration mittels DHCP. Wenn möglich, werden aber entsprechende Beispiele für &man.bootpd.8; angeführt. Die Beispielkonfiguration nutzt das Softwarepaket ISC DHCP. Der Rechner muss ein oder mehrere Programme in den lokalen Speicher laden. Dazu wird entweder TFTP oder NFS verwendet. Die Auswahl zwischen TFTP und NFS erfolgt über das Setzen von verschiedenen Kompilieroptionen. Ein häufig gemachter Fehler ist es, Dateinamen für das falsche Protokoll anzugeben: TFTP transferiert normalerweise alle Dateien aus einem einzigen Verzeichnis des Servers, und erwartet einen Pfad relativ zu diesem Verzeichnis. NFS verlangt hingegen absolute Dateipfade. Die möglichen Bootstrap-Programme und der Kernel müssen initialisiert und ausgeführt werden. Dabei gibt es zwei Möglichkeiten: PXE lädt &man.pxeboot.8;. Dabei handelt es sich um eine modifizierte Version des &os;-Laders der Boot-Phase drei. Der &man.loader.8; beschafft alle für den Systemstart notwendigen Parameter, und hinterlegt diese in der Kernelumgebung, bevor er die Kontrolle übergibt. Es ist hier möglich, den GENERIC-Kernel zu verwenden. Etherboot lädt den Kernel hingegen direkt. Dafür müssen Sie allerdings einen Kernel mit spezifischen Optionen erzeugen. PXE und Etherboot sind zwar im Großen und Ganzen gleichwertig, da der Kernel aber viele Aufgaben an &man.loader.8; übergibt, sollte bevorzugt PXE eingesetzt werden. Wenn Ihr BIOS und Ihre Netzkarten PXE unterstützen, sollten Sie es auch verwenden. Zuletzt muss der Rechner auf seine Dateisysteme zugreifen können. Dafür wird stets NFS verwendet. Weitere Informationen finden Sie in &man.diskless.8;. Installationsanweisungen Konfiguration unter Verwendung von <application>ISC DHCP</application> DHCP plattenloser Betrieb Der ISC DHCP-Server kann Anfragen sowohl von BOOTP als auch von DHCP beantworten. isc-dhcp 3.0 ist nicht Teil des Basissystems. Sie müssen es daher zuerst installieren. Verwenden Sie dazu den Port - net/isc-dhcp3-server + net/isc-dhcp30-server oder das entsprechende Paket. Nachdem ISC DHCP installiert ist, muss das Programm konfiguriert werden (normalerweise in /usr/local/etc/dhcpd.conf). Im folgenden Beispiel verwendet Rechner margaux Etherboot, während Rechner corbieres PXE verwendet: default-lease-time 600; max-lease-time 7200; authoritative; option domain-name "example.com"; option domain-name-servers 192.168.4.1; option routers 192.168.4.1; subnet 192.168.4.0 netmask 255.255.255.0 { use-host-decl-names on; option subnet-mask 255.255.255.0; option broadcast-address 192.168.4.255; host margaux { hardware ethernet 01:23:45:67:89:ab; fixed-address margaux.example.com; next-server 192.168.4.4; filename "/tftpboot/kernel.diskless"; option root-path "192.168.4.4:/data/misc/diskless"; } host corbieres { hardware ethernet 00:02:b3:27:62:df; fixed-address corbieres.example.com; next-server 192.168.4.4; filename "pxeboot"; option root-path "192.168.4.4:/data/misc/diskless"; } } Diese Option weist dhcpd an, den Wert der host-Deklaration als Rechnernamen des plattenlosen Rechners zu senden. Alternativ kann man der host-Deklaration Folgendes hinzufügen: option host-name margaux Die Anweisung next-server bestimmt den TFTP- oder NFS-Server, von dem der Loader oder der Kernel geladen werden (in der Voreinstellung ist das der DHCP-Server selbst). Die Anweisung filename bestimmt die Datei, die Etherboot als nächstes lädt. Das genaue Format hängt von der gewählten Transfermethode ab. Etherboot kann sowohl mit NFS als auch mit TFTP kompiliert werden. In der Voreinstellung wird der &os;-Port mit NFS-Unterstützung kompiliert. PXE verwendet TFTP, daher wird im Beispiel ein relativer Dateipfad verwendet. Dies kann aber, je nach Konfiguration des TFTP-Servers, auch anders sein. Beachten Sie, dass PXE pxeboot lädt, und nicht den Kernel. Es ist auch möglich, das Verzeichnis /boot einer &os;-CD-ROM von pxeboot laden zu lassen. &man.pxeboot.8; kann einen GENERIC-Kernel laden, dadurch ist es möglich, PXE von einer entfernten CD-ROM zu starten. Die Option root-path bestimmt den Pfad des root-Dateisystems in normaler NFS-Schreibweise. Wird PXE verwendet, ist es möglich, die IP-Adresse des Rechners wegzulassen, solange nicht die Kerneloption BOOTP aktiviert wird. Der NFS-Server entspricht in diesem Fall dem TFTP-Server. Konfiguration bei Verwendung von BOOTP BOOTP plattenloser Betrieb Es folgt nun eine der Konfiguration von DHCP entsprechende Konfiguration (für einen Client) für bootpd. Zu finden ist die Konfigurationsdatei unter /etc/bootptab. Beachten Sie bitte, dass Etherboot mit der Option NO_DHCP_SUPPORT kompiliert werden muss, damit BOOTP verwendet werden kann. PXE hingegen benötigt DHCP. Der einzige offensichtliche Vorteil von bootpd ist, dass es bereits im Basissystem vorhanden ist. .def100:\ :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\ :sm=255.255.255.0:\ :ds=192.168.4.1:\ :gw=192.168.4.1:\ :hd="/tftpboot":\ :bf="/kernel.diskless":\ :rp="192.168.4.4:/data/misc/diskless": margaux:ha=0123456789ab:tc=.def100 Ein Startprogramm unter Verwendung von <application>Etherboot</application> erstellen Etherboot Die Internetseite von Etherboot enthält ausführliche Informationen, die zwar vor allem für Linux gedacht sind, aber dennoch nützliche Informationen enthalten. Im Folgenden wird daher nur grob beschrieben, wie Sie Etherboot auf einem FreeBSD-System einsetzen können. Als Erstes müssen Sie net/etherboot als Paket oder als Port installieren. Sie können Etherboot so konfigurieren, dass TFTP anstelle von NFS verwendet wird, indem Sie die Datei Config im Quellverzeichnis von Etherboot bearbeiten. Für unsere Installation verwenden wir eine Startdiskette. Für Informationen zu anderen Methoden (PROM oder &ms-dos;-Programme) lesen Sie bitte die Dokumentation zu Etherboot. Um eine Startdiskette zu erzeugen, legen Sie eine Diskette in das Laufwerk des Rechners ein, auf dem Sie Etherboot installiert haben. Danach wechseln Sie in das Verzeichnis src des Etherboot-Verzeichnisbaums und geben Folgendes ein: &prompt.root; gmake bin32/devicetype.fd0 devicetype hängt vom Typ der Ethernetkarte ab, über die der plattenlose Rechner verfügt. Lesen Sie dazu NIC im gleichen Verzeichnis, um den richtigen Wert für devicetype zu bestimmen. Das System mit <acronym>PXE</acronym> starten In der Voreinstellung lädt der &man.pxeboot.8;-Loader den Kernel über NFS. Soll stattdessen TFTP verwendet werden, muss beim Kompilieren die Option LOADER_TFTP_SUPPORT in der Datei /etc/make.conf eingetragen sein. Sehen Sie sich die Datei /usr/share/examples/etc/make.conf für weitere Anweisungen an. Es gibt zwei Optionen für make.conf, die nützlich sein können, wenn Sie eine plattenlose serielle Konsole einrichten wollen: BOOT_PXELDR_PROBE_KEYBOARD, und BOOT_PXELDR_ALWAYS_SERIAL. Um PXE beim Systemstart zu verwenden, müssen Sie im BIOS des Rechner die Option Über das Netzwerk starten aktivieren. Alternativ können Sie während der PC-Initialisierung auch eine Funktionstaste drücken. Serverkonfiguration - <acronym>TFTP</acronym> und <acronym>NFS</acronym> TFTP plattenloser Betrieb NFS plattenloser Betrieb Wenn Sie PXE oder Etherboot so konfiguriert haben, dass diese TFTP verwenden, müssen Sie auf dem Dateiserver tftpd aktivieren: Erzeugen Sie ein Verzeichnis, in dem tftpd seine Dateien ablegt, beispielsweise /tftpboot. Fügen Sie folgende Zeile in /etc/inetd.conf ein: tftp dgram udp wait root /usr/libexec/tftpd tftpd -s /tftpboot Anscheinend benötigen zumindest einige PXE-Versionen die TCP-Version von TFTP. Sollte dies bei Ihnen der Fall sein, fügen Sie eine zweite Zeile ein, in der Sie dgram udp durch stream tcp ersetzen. Weisen Sie inetd an, seine Konfiguration erneut einzulesen (Damit der folgende Befehl funktioniert, muss die Option in der Datei /etc/rc.conf vorhanden sein.): &prompt.root; /etc/rc.d/inetd restart Sie können das Verzeichnis /tftpboot an einem beliebigen Ort auf dem Server ablegen. Stellen Sie aber sicher, dass Sie diesen Ort sowohl in inetd.conf als auch in dhcpd.conf eingetragen haben. Außerdem müssen Sie NFS aktivieren und die entsprechenden Verzeichnisse exportieren. Fügen Sie folgende Zeile in /etc/rc.conf ein: nfs_server_enable="YES" Exportieren Sie das Verzeichnis, in dem sich das Wurzelverzeichnis für den plattenlosen Betrieb befindet, indem Sie folgende Zeile in /etc/exports einfügen (passen Sie dabei den mountpoint an und ersetzen Sie margaux corbieres durch den Namen Ihres plattenlosen Rechners): /data/misc -alldirs -ro margaux Weisen sie nun mountd an, seine Konfigurationsdatei erneut einzulesen. Wenn Sie NFS erst in der Datei /etc/rc.conf aktivieren mussten, sollten Sie stattdessen den Rechner neu starten. Dadurch wird die Konfigurationsdatei ebenfalls neu eingelesen. &prompt.root; /etc/rc.d/mountd restart Einen plattenlosen Kernel erzeugen plattenloser Betrieb Kernelkonfiguration Wenn Sie Etherboot verwenden, müssen Sie in die Kernelkonfigurationsdatei Ihres plattenlosen Clients zusätzlich folgende Optionen einfügen: options BOOTP # Use BOOTP to obtain IP address/hostname options BOOTP_NFSROOT # NFS mount root file system using BOOTP info Außerdem können Sie die Optionen BOOTP_NFSV3, BOOT_COMPAT sowie BOOTP_WIRED_TO verwenden (sehen Sie sich dazu auch die Datei NOTES an). Die Namen dieser Optionen sind historisch bedingt. Sie ermöglichen eine unterschiedliche Verwendung von DHCP und BOOTP innerhalb des Kernels. Es ist auch möglich, eine strikte Verwendung von BOOTP oder DHCP zu erzwingen. Erzeugen Sie den neuen Kernel (lesen Sie dazu auch ) und kopieren Sie ihn an den in dhcpd.conf festgelegten Ort. Wenn Sie PXE verwenden, ist die Erzeugung eines Kernels zwar nicht unbedingt nötig, sie wird allerdings dennoch empfohlen. Die Aktivierung dieser Optionen bewirkt, dass die Anzahl der möglichen DHCP-Anforderungen während des Kernelstarts erhöht wird. Ein kleiner Nachteil sind eventuell auftretende Inkonsistenzen zwischen den neuen Werten und den von &man.pxeboot.8; erhaltenen Werten. Der große Vorteil dieser Variante ist es, dass dabei der Rechnername gesetzt wird, den Sie ansonsten durch eine andere Methode, beispielsweise in einer clientspezifischen rc.conf-Datei festlegen müssten. Damit der Kernel von Etherboot geladen werden kann, müssen device hints im Kernel einkompiliert sein. Dazu setzen Sie normalerweise folgende Option in die Kernelkonfigurationsdatei (sehen Sie sich dazu auch die kommentierte Datei NOTES an): hints "GENERIC.hints" Das root-Dateisystem erzeugen Root-Dateisystem plattenloser Betrieb Sie müssen für den plattenlosen Rechner ein root-Dateisystem erzeugen, und zwar an dem in dhcpd.conf als root-path festgelegten Ort. <command>make world</command> zum Füllen des Dateisystems einsetzen Diese schnelle Methode installiert ein komplettes jungfräuliches System (und nicht nur ein root-Dateisystem) nach DESTDIR. Dazu müssen Sie lediglich das folgende Skript ausführen: #!/bin/sh export DESTDIR=/data/misc/diskless mkdir -p ${DESTDIR} cd /usr/src; make buildworld && make buildkernel cd /usr/src/etc; make distribution Danach müssen Sie noch die dadurch in DESTDIR erzeugten Dateien /etc/rc.conf sowie /etc/fstab Ihren Wünschen anpassen. Den Auslagerungsbereich konfigurieren Falls nötig, kann eine auf dem NFS-Server liegende Datei als Auslagerungsdatei eingerichtet werden. Eine <acronym>NFS</acronym>-Auslagerungsdatei einrichten Der Kernel unterstützt beim Systemstart keine NFS-Auslagerungsdatei. Diese muss daher in den Startskripten aktiviert werden, indem ein beschreibbares Dateisystem eingehängt wird, um dort die Auslagerungsdatei zu erzeugen und zu aktivieren. Um eine Auslagerungsdatei zu erzeugen, gehen Sie wie folgt vor: &prompt.root; dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000 Um die Auslagerungsdatei zu aktivieren, fügen Sie folgende Zeile in rc.conf ein: swapfile=/path/to/swapfile Verschiedenes Schreibgeschütztes Dateisystem <filename>/usr</filename> plattenloser Betrieb /usr schreibgeschützt Wenn am plattenlosen Rechner X läuft, müssen Sie die Konfigurationsdatei von XDM anpassen, da Fehlermeldungen in der Voreinstellung auf /usr geschrieben werden. Der Server läuft nicht unter FreeBSD Wenn das root-Dateisystem nicht auf einem FreeBSD-Rechner liegt, muss das Dateisystem zuerst unter FreeBSD erzeugt werden. Anschließend wird es beispielsweise mit tar oder cpio an den gewünschten Ort kopiert. Dabei kann es Probleme mit den Gerätedateien in /dev geben, die durch eine unterschiedliche Darstellung der Major- und Minor-Number von Geräten auf beiden Systemen hervorgerufen werden. Eine Problemlösung besteht darin, das root-Verzeichnis auf einem FreeBSD-Rechner einzuhängen und die Gerätedateien dort mit &man.devfs.5; zu erzeugen. ISDN – diensteintegrierendes digitales Netzwerk ISDN Eine gute Quelle für Informationen zu ISDN ist die ISDN-Seite von Dan Kegel. Welche Informationen finden Sie in diesem Abschnitt? Wenn Sie in Europa leben, könnte der Abschnitt über ISDN-Karten für Sie interessant sein. Wenn Sie ISDN hauptsächlich dazu verwenden wollen, um sich über einen Anbieter ins Internet einzuwählen, sollten Sie den Abschnitt über Terminaladapter lesen. Dies ist die flexibelste Methode, die auch die wenigsten Probleme verursacht. Wenn Sie zwei Netzwerke miteinander verbinden, oder sich über eine ISDN-Standleitung mit dem Internet verbinden wollen, finden Sie entsprechende Informationen im Abschnitt über Router und Bridges. Bei der Wahl der gewünschten Lösung sind die entstehenden Kosten ein entscheidender Faktor. Die folgenden Beschreibungen reichen von der billigsten bis zur teuersten Variante. Hellmuth Michaelis Beigetragen von ISDN-Karten ISDN Karten Das ISDN-Subsystem von FreeBSD unterstützt den DSS1/Q.931- (oder Euro-ISDN)-Standard nur für passive Karten. Zusätzlich werden aber auch einige aktive Karten unterstützt, bei denen die Firmware auch andere Signalprotokolle unterstützt; dies schließt auch die erste ISDN-Karte mit Primärmultiplex-Unterstützung mit ein. isdn4bsd ermöglicht es Ihnen, sich unter Nutzung von IP over raw HDLC oder synchronem PPP mit anderen ISDN-Routern zu verbinden. Dazu verwenden Sie entweder Kernel-&man.ppp.8; (via isppp, einem modifizierten sppp-Treiber), oder Sie benutzen User-&man.ppp.8;. Wenn Sie User-&man.ppp.8; verwenden, können Sie zwei oder mehrere ISDN-B-Kanäle bündeln. Im Paket enthalten ist auch ein Programm mit Anrufbeantworterfunktion sowie verschiedene Werkzeuge, wie ein Softwaremodem, das 300 Baud unterstützt. FreeBSD unterstützt eine ständig wachsende Anzahl von PC-ISDN-Karten, die weltweit erfolgreich eingesetzt werden. Von FreeBSD unterstützte passive ISDN-Karten enthalten fast immer den ISAC/HSCX/IPAC ISDN-Chipsatz von Infineon (ehemals Siemens). Unterstützt werden aber auch Karten mit Cologne Chip (diese allerdings nur für den ISA-Bus), PCI-Karten mit Winbond W6692 Chipsatz, einige Karten mit dem Tiger 300/320/ISAC Chipsatz sowie einige Karten mit einem herstellerspezifischen Chipsatz, wie beispielsweise die Fritz!Card PCI V.1.0 und die Fritz!Card PnP von AVM. An aktiven ISDN-Karten werden derzeit die AVM B1 BRI-Karten (ISA und PCI-Version) sowie die AVM T1 PRI-Karten (PCI-Version) unterstützt. Informationen zu isdn4bsd finden Sie im Verzeichnis /usr/share/examples/isdn/ Ihres FreeBSD-Systems, oder auf der Internetseite von isdn4bsd. Dort finden Sie auch Verweise zu Tipps, Korrekturen, sowie weiteren Informationen, wie dem isdn4bsd-Handbuch. Falls Sie an der Unterstützung eines zusätzlichen ISDN-Protokolls, einer weiteren ISDN-Karte oder an einer anderen Erweiterung von isdn4bsd interessiert sind, wenden Sie sich bitte an &a.hm;. Für Fragen zur Installation, Konfiguration und zu sonstigen Problemen von isdn4bsd gibt es die Mailingliste &a.isdn.name;. ISDN-Terminaladapter Terminaladapter Terminaladapter (TA) sind für ISDN, was Modems für analoge Telefonleitungen sind. Modem Die meisten Terminaladapter verwenden den Standardbefehlssatz für Modems von Hayes (AT-Kommandos) und können daher als Modemersatz verwendet werden. Ein Terminaladapter funktioniert prinzipiell wie ein Modem, allerdings erfolgt der Verbindungsaufbau um einiges schneller. Die Konfiguration von PPP entspricht dabei exakt der eines Modems. Stellen Sie dabei allerdings die serielle Geschwindigkeit so hoch wie möglich ein. PPP Der Hauptvorteil bei der Verwendung eines Terminaladapters zur Verbindung mit einem Internetanbieter ist die Möglichkeit zur Nutzung von dynamischem PPP. Da IP-Adressen immer knapper werden, vergeben die meisten Provider keine statischen IP-Adressen mehr. Die meisten Router unterstützen allerdings keine dynamische Zuweisung von IP-Adressen. Der PPP-Daemon bestimmt die Stabilität und Eigenschaften der Verbindung, wenn Sie einen Terminaladapter verwenden. Daher können Sie unter FreeBSD einfach von einer Modemverbindung auf eine ISDN-Verbindung wechseln, wenn Sie PPP bereits konfiguriert haben. Allerdings bedeutet dies auch, das bereits bestehende Probleme mit PPP auch unter ISDN auftreten werden. Wenn Sie an maximaler Stabilität interessiert sind, verwenden Sie Kernel-PPP, und nicht das User-PPP. Folgende Terminaladapter werden von FreeBSD unterstützt: Motorola BitSurfer und Bitsurfer Pro Adtran Die meisten anderen Terminaladapter werden wahrscheinlich ebenfalls funktionieren, da die Hersteller von Terminaladaptern darauf achten, dass ihre Produkte den Standardbefehlssatz möglichst gut unterstützen. Das wirkliche Problem mit einem externen Terminaladapter ist, dass, ähnlich wie bei Modems, eine gute serielle Karte eine Grundvoraussetzung ist. Sie sollten sich die Anleitung für die Nutzung serieller Geräte unter FreeBSD ansehen, wenn Sie detaillierte Informationen über serielle Geräte und die Unterschiede zwischen asynchronen und synchronen seriellen Ports benötigen. Ein Terminaladapter, der an einem (asynchronen) seriellen Standardport angeschlossen ist, beschränkt Sie auf 115,2 Kbs. Dies selbst dann, wenn Sie eine Verbindung mit 128 Kbs haben. Um die volle Leistungsfähigkeit von ISDN (128 Kbs) nutzen zu können, müssen Sie den Terminaladapter daher an eine synchrone serielle Karte anschließen. Kaufen Sie keinen internen Terminaladapter in der Hoffnung, damit das synchron/asynchron-Problem vermeiden zu können. Interne Terminaladapter haben einen (asynchronen) seriellen Standardportchip eingebaut. Der einzige Vorteil interner Terminaladapter ist es, dass Sie ein serielles sowie ein Stromkabel weniger benötigen. Eine synchrone Karte mit einem Terminaladapter ist mindestens so schnell wie ein autonomer ISDN-Router, und, in Kombination mit einem einfachen 386-FreeBSD-System, wahrscheinlich flexibler. Die Entscheidung zwischen synchroner Karte/Terminaladapter und einem autonomen ISDN-Router ist beinahe eine religiöse Angelegenheit. Zu diesem Thema gibt es viele Diskussionen in den Mailinglisten. Suchen Sie in den Archiven danach, wenn Sie an der kompletten Diskussion interessiert sind. ISDN-Bridges und Router ISDN Autonome Bridge/Router ISDN-Bridges und Router sind keine Eigenheit von FreeBSD oder eines anderen Betriebssystems. Für eine vollständigere Beschreibung von Routing und Netzwerkkopplungen mit einer Bridge informieren Sie sich bitte durch weiterführende Literatur. In diesem Abschnitt werden die Begriffe Router und Bridge synonym verwendet. ISDN-Router und Bridges werden immer günstiger und damit auch immer beliebter. Ein ISDN-Router ist eine kleine Box, die direkt an Ihr lokales Ethernet-Netzwerk angeschlossen wird und sich mit einem Router oder einer Bridge verbindet. Die eingebaute Software ermöglicht die Kommunikation über PPP oder andere beliebte Protokolle. Ein Router ermöglicht einen deutlich höheren Datendurchsatz als ein herkömmlicher Terminaladapter, da er eine vollsynchrone ISDN-Verbindung nutzt. Das Hauptproblem mit ISDN-Routern und Bridges ist, dass die Zusammenarbeit zwischen Geräten verschiedener Hersteller nach wie vor ein Problem ist. Wenn Sie sich auf diese Weise mit einem Internetanbieter verbinden wollen, klären Sie daher vorher ab, welche Anforderungen Ihre Geräte erfüllen müssen. Eine ISDN-Bridge ist eine einfache und wartungsarme Lösung, zwei Netze, beispielsweise Ihr privates Netz und Ihr Firmennetz, miteinander zu verbinden. Da Sie die technische Ausstattung für beide Seiten kaufen müssen, ist sichergestellt, dass die Verbindung funktionieren wird. Um beispielsweise einen privaten Computer oder eine Zweigstelle mit dem Hauptnetzwerk zu verbinden, könnte folgende Konfiguration verwendet werden: Kleines Netzwerk (Privatnetz) 10 base 2 Das Netzwerk basiert auf der Bustopologie mit 10base2 Ethernet (Thinnet). Falls nötig, stellen Sie die Verbindung zwischen Router und Netzwerkkabel mit einem AUI/10BT-Transceiver her. ---Sun Workstation | ---FreeBSD Rechner | ---Windows 95 | Autonomer Router | ISDN BRI Verbindung 10Base2 - Ethernet Wenn Sie nur einen einzelnen Rechner verbinden wollen, können Sie auch ein Twisted-Pair-Kabel (Cross-Over) verwenden, das direkt an den Router angeschlossen wird. Großes Netzwerk (Firmennetz) 10 base T Dieses Netzwerk basiert auf der Sterntopologie und 10baseT Ethernet (Twisted Pair). -------Novell Server | H | | ---Sun | | | U ---FreeBSD | | | ---Windows 95 | B | |___---Autonomer Router | ISDN BRI Verbindung ISDN Netzwerkdiagramm Ein großer Vorteil der meisten Router und Bridges ist es, dass man gleichzeitig zwei unabhängige PPP-Verbindungen zu zwei verschiedenen Zielen aufbauen kann. Diese Funktion bieten die meisten Terminaladapter nicht. Die Ausnahme sind spezielle (meist teure) Modelle, die über zwei getrennte serielle Ports verfügen. Verwechseln Sie dies aber nicht mit Kanalbündelung oder MPP. Dies kann sehr nützlich sein, wenn Sie eine ISDN-Standleitung in Ihrem Büro haben, die sie aufteilen wollen, ohne eine zusätzliche ISDN-Leitung zu installieren. Ein ISDN-Router kann über einen B-Kanal (64 Kbps) eine dedizierte Verbindung ins Internet aufbauen, und gleichzeitig den anderen B-Kanal für eine separate Datenverbindung nutzen. Der zweite B-Kanal kann beispielsweise für ein- oder ausgehende Verbindungen verwendet werden. Sie können ihn aber auch dynamisch mit dem ersten B-Kanal bündeln, um Ihre Bandbreite zu erhöhen. IPX/SPX Eine Ethernet-Bridge kann Daten nicht nur im IP-Protokoll, sondern auch in beliebigen anderen Protokollen versenden. Chern Lee Beigetragen von NAT - Network Address Translation Überblick natd &man.natd.8;, der Network-Address-Translation-Daemon von FreeBSD, akzeptiert ankommende Raw-IP-Pakete, ändert den Sender der Daten in den eigenen Rechner und leitet diese Pakete in den ausgehenden IP-Paketstrom um, indem IP-Adresse und Port des Senders so geändert werden, dass bei einer Antwort der ursprüngliche Sender wieder bestimmt und die Daten an ihn weitergeleitet werden können. Internet connection sharing NAT Der häufigste Grund für die Verwendung von NAT ist die gemeinsame Nutzung einer Internetverbindung. Einrichtung Wegen der begrenzten Verfügbarkeit von IPv4-Adressen und der gestiegenen Anzahl von Breitbandverbindungen über Kabelmodem oder DSL, wird die gemeinsame Nutzung von Internetverbindungen immer wichtiger. Der &man.natd.8;-Daemon ermöglicht die Anbindung von mehreren Rechnern an das Internet unter Nutzung einer gemeinsamen Verbindung und einer IP-Adresse. Häufig soll ein über Kabelmodem oder DSL und eine IP-Adresse an das Internet angebundener Rechner mehreren Rechnern eines lokalen Netzwerks Internetdienste anbieten. Um dies zu ermöglichen, muss der FreeBSD-Rechner als Gateway fungieren. Dazu sind zwei Netzkarten notwendig. Eine für die Verbindung zum Internet, die zweite für die Verbindung mit dem lokalen Netzwerk. Sämtliche Rechner des lokalen Netzwerks sind über einen Hub oder einen Switch miteinander verbunden. Es gibt verschiedene Möglichkeiten, ein LAN über ein &os;-Gateway an das Internet anzubinden. Das folgende Beispiel beschreibt ein Gateway, das zumindest zwei Netzwerkkarten enthält. _______ __________ ________ | | | | | | | Hub |-----| Client B |-----| Router |----- Internet |_______| |__________| |________| | ____|_____ | | | Client A | |__________| Network Layout Eine derartige Netzwerkkonfiguration wird vor allem zur gemeinsamen Nutzung einer Internetverbindung verwendet. Ein Rechner des lokalen Netzwerks (LAN) ist mit dem Internet verbunden. Alle anderen Rechner des lokalen Netzwerks haben nur über diesen Gateway-Rechner Zugriff auf das Internet. + + + boot loader + configuration + + + Boot Loader Konfiguration + + Die Kerneleigenschaften für Network Address Translation mit + &man.natd.8; sind im GENERIC-Kernel nicht + aktiviert, können aber bereits zur Bootzeit geladen werden, indem + ein paar Zeilen in die Datei /boot/loader.conf + hinzugefügt werden: + + ipfw_load="YES" +ipdivert_load="YES" + + Zusätzlich kann die Option + net.inet.ip.fw.default_to_accept auf + 1 gesetzt werden: + + net.inet.ip.fw.default_to_accept="1" + + + Es ist eine gute Idee, diese Option während den ersten + Versuchen, eine Firewall und ein NAT-Gateway aufzusetzen, zu + aktivieren. Damit ist die Standardvorgehensweise von &man.ipfw.8; + diejenige, allow ip from any to any, anstatt der + weniger freizügigen deny ip from any to any. + Es wird dadurch etwas schwieriger, sich aus Versehen nach einem + Neustart aus dem System auszusperren. + + + + Kernelkonfiguration Kernel Konfiguration - Kernelkonfiguration - - Folgende Optionen müssen in die - Kernelkonfigurationsdatei eingetragen werden: + Wenn Module nicht in Frage kommen oder Sie bevorzugen, alle + notwendigen Eigenschaften in den laufenden Kernel einzubauen, + müssen die folgenden Optionen in die Kernelkonfigurationsdatei + eingetragen werden: options IPFIREWALL options IPDIVERT Die folgende Optionen können ebenfalls eingetragen werden: options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_VERBOSE + - In /etc/rc.conf tragen Sie Folgendes - ein: + + System Bootkonfiguration + + Um Firewall- und NAT-Unterstützung zur Bootzeit zu aktivieren, + tragen Sie Folgendes in /etc/rc.conf ein: gateway_enable="YES" firewall_enable="YES" firewall_type="OPEN" natd_enable="YES" natd_interface="fxp0" natd_flags="" Richtet den Rechner als Gateway ein. Die Ausführung von sysctl net.inet.ip.forwarding=1 hätte den gleichen Effekt. Aktiviert die Firewallregeln in /etc/rc.firewall beim Systemstart. Ein vordefinierter Satz von Firewallregeln, der alle Pakete durchlässt. Sehen Sie sich /etc/rc.firewall an, wenn Sie diese Option verwenden wollen. Die Netzkarte, die Pakete weiterleitet (und mit dem Internet verbunden ist). Zusätzliche Konfigurationsoptionen, die beim Systemstart an &man.natd.8; übergeben werden. Durch die Definition dieser Optionen in /etc/rc.conf wird die Anweisung natd -interface fxp0 beim Systemstart ausgeführt. Dies kann aber auch manuell erfolgen. Falls Sie viele Optionen an &man.natd.8; übergeben müssen, können Sie auch eine Konfigurationsdatei verwenden. Dazu fügen Sie folgende Zeile in /etc/rc.conf ein: natd_flags="-f /etc/natd.conf" Die Datei /etc/natd.conf enthält verschiedene Konfigurationsoptionen, wobei jede Option in einer Zeile steht. Das Beispiel im nächsten Abschnitt würde folgende Konfigurationsdatei verwenden: redirect_port tcp 192.168.0.2:6667 6667 redirect_port tcp 192.168.0.3:80 80 Wenn Sie eine Konfigurationsdatei verwenden wollen, sollten Sie sich die Handbuchseite zu &man.natd.8; durchlesen, insbesondere den Abschnitt über die Nutzung der Option . Jedem Rechner und jeder Schnittstelle des lokalen Netzwerks sollte eine IP-Adresse des im RFC 1918 definierten privaten Adressraums zugewiesen werden. Der Standardgateway entspricht der internen IP-Adresse des natd-Rechners. Im Beispiel werden den LAN-Clients A und B die IP-Adressen 192.168.0.2 und 192.168.0.3 zugewiesen, während die LAN-Netzkarte des natd-Rechners die IP-Adresse 192.168.0.1 erhält. Der natd-Rechner mit der IP-Adresse 192.168.0.1 wird als Standardgateway für die Clients A und B gesetzt. Die externe Netzkarte des natd-Rechners muss für die korrekte Funktion von &man.natd.8; nicht konfiguriert werden. Ports umleiten Wenn Sie &man.natd.8; verwenden, sind Ihre LAN-Clients von aussen nicht erreichbar. LAN-Clients können zwar Verbindungen nach aussen aufbauen, sind aber für ankommende Verbindungen nicht erreichbar. Wenn Sie Internetdienste auf einem LAN-Client anbieten wollen, haben Sie daher ein Problem. Eine einfache Lösung ist die Umleitung von bestimmten Internetports des natd-Rechners auf einen LAN-Client. Beispielsweise könnte ein IRC-Server auf Client A und ein Webserver auf Client B laufen. Damit diese Konfiguration funktioniert, müssen Verbindungen, die auf den Ports 6667 (IRC) und 80 (Web) ankommen, auf die entsprechenden Clients umgeleitet werden. Dazu wird die Option unter Nutzung folgender Syntax an &man.natd.8; übergeben: -redirect_port proto targetIP:targetPORT[-targetPORT] [aliasIP:]aliasPORT[-aliasPORT] [remoteIP[:remotePORT[-remotePORT]]] Für unser Beispiel heißt das: -redirect_port tcp 192.168.0.2:6667 6667 -redirect_port tcp 192.168.0.3:80 80 Dadurch werden die entsprechenden tcp-Ports auf die jeweiligen LAN-Clients umgeleitet. Mit können auch ganze Portbereiche statt einzelner Ports umgeleitet werden. So werden mit tcp 192.168.0.2:2000-3000 2000-3000 alle Verbindungen, die auf den Ports 2000 bis 3000 ankommen, auf die entsprechenden Ports des Clients A umgeleitet. Diese Optionen können während des Betriebs von &man.natd.8; oder über die Option natd_flags="" in /etc/rc.conf gesetzt werden. Eine ausführliche Konfigurationsanleitung finden Sie in &man.natd.8;. Adressen umleiten address redirection Die Umleitung von Adressen ist nützlich, wenn mehrere IP-Adressen verfügbar sind, die aber alle auf einem Rechner verbleiben sollen. In diesem Fall kann &man.natd.8; jedem LAN-Client eine eigene externe IP-Adresse zuweisen. Ausgehende Pakete eines LAN-Clients werden so der entsprechenden externen IP-Adresse des Clients zugeordnet. Ankommender Verkehr für diese IP-Adresse wird automatisch an den entsprechenden LAN-Client weitergeleitet. Diesen Vorgang bezeichnet man auch als statisches NAT. Dem natd-Gatewayrechner könnten beispielsweise die IP-Adressen 128.1.1.1, 128.1.1.2 sowie 128.1.1.3 zugewiesen werden. 128.1.1.1 wird als die externe IP-Adresse des natd-Gatewayrechners verwendet, während 128.1.1.2 und 128.1.1.3 an die LAN-Clients A und B weitergegeben werden. benutzt folgende Syntax: -redirect_address localIP publicIP localIP Die interne IP-Adresse des LAN-Clients publicIP Die externe IP-Adresse des LAN-Clients Für unser Beispiel hieße dies: -redirect_address 192.168.0.2 128.1.1.2 -redirect_address 192.168.0.3 128.1.1.3 Analog zur Option können Sie diese Argumente auch in der Option natd_flags="" in /etc/rc.conf angeben. Bei der Nutzung der Adressumleitung ist die Portumleitung überflüssig, weil alle für eine bestimmte IP-Adresse ankommenden Daten umgeleitet werden. Die externe IP-Adresse des natd-Rechners muss aktiv sein und der externen Netzkarte zugewiesen sein. Weitere Informationen zu diesem Thema finden Sie in &man.rc.conf.5;. PLIP – Parallel Line IP PLIP Parallel Line IP PLIP PLIP ermöglicht TCP/IP-Verbindungen zwischen zwei Rechnern, die über ihre parallelen Schnittstellen verbunden sind. Eine solche Verbindung ist nützlich, wenn zwei Rechner nicht mit Netzkarten ausgestattet sind, oder wenn eine Installation auf einem Laptop erfolgen soll. Dieser Abschnitt behandelt folgende Themen: Die Herstellung eines parallelen (Laplink-) Kabels Die Verbindung von zwei Computern über PLIP Ein paralleles Kabel herstellen Ein paralleles (Laplink-)Kabel können Sie in fast jedem Computergeschäft kaufen. Falls dies nicht möglich sein sollte, oder Sie einfach wissen wollen, wie ein solches Kabel aufgebaut ist, sollten Sie sich die folgende Tabelle ansehen. Sie beschreibt die Herstellung eines parallelen Netzwerkkabels aus einem gewöhnlichen parallelen Druckerkabel. Die Netzwerk-Verdrahtung eines parallelen Kabels A-Name A-Ende B-Ende Beschreibung Post/Bit DATA0 -ERROR 2 15 15 2 Data 0/0x01 1/0x08 DATA1 +SLCT 3 13 13 3 Data 0/0x02 1/0x10 DATA2 +PE 4 12 12 4 Data 0/0x04 1/0x20 DATA3 -ACK 5 10 10 5 Strobe 0/0x08 1/0x40 DATA4 BUSY 6 11 11 6 Data 0/0x10 1/0x80 GND 18-25 18-25 GND -
PLIP einrichten Als Erstes benötigen Sie ein Laplink-Kabel. Danach müssen Sie sicherstellen, dass beide Computerkernel den &man.lpt.4;-Treiber unterstützen: &prompt.root; grep lp /var/run/dmesg.boot lpt0: <Printer> on ppbus0 lpt0: Interrupt-driven port Der Parallelport muss Interrupt-gesteuert sein, daher sollte die Datei /boot/device.hints zwei Zeilen ähnlich den folgenden enthalten: hint.ppc.0.at="isa" hint.ppc.0.irq="7" Danach überprüfen Sie, ob die Kernelkonfigurationsdatei die Zeile device plip enthält, oder ob das Kernelmodul plip.ko geladen wurde. In beiden Fällen sollte die parallele Schnittstelle von &man.ifconfig.8; angezeigt werden: &prompt.root; ifconfig plip0 plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 Verbinden Sie die parallelen Schnittstellen der beiden Computer über das (Laplink-)Kabel. Konfigurieren Sie die Netzwerkparameter auf beiden Rechnern als root. Wenn Sie beispielsweise den Rechner host1 mit dem Rechner host2 verbinden wollen, gehen Sie folgendermaßen vor: host1 <-----> host2 IP Address 10.0.0.1 10.0.0.2 Richten Sie die parallele Schnittstelle von host1 ein, indem Sie Folgendes eingeben: &prompt.root; ifconfig plip0 10.0.0.1 10.0.0.2 Danach richten Sie die parallele Schnittstelle von host2 ein: &prompt.root; ifconfig plip0 10.0.0.2 10.0.0.1 Sie sollten nun über eine funktionierende Verbindung verfügen. Bei Problemen lesen Sie bitte die Hilfeseiten &man.lp.4; sowie &man.lpt.4;. Zusätzlich sollten beide Rechner in /etc/hosts eingetragen werden: 127.0.0.1 localhost.my.domain localhost 10.0.0.1 host1.my.domain host1 -10.0.0.2 host2.my.domain +10.0.0.2 host2.my.domain host2 Um die Verbindung zu überprüfen, pingen Sie jeden Rechner vom anderen Rechner aus an. Auf host1 gehen Sie dazu folgendermaßen vor: &prompt.root; ifconfig plip0 plip0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.1 --> 10.0.0.2 netmask 0xff000000 &prompt.root; netstat -r Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire host2 host1 UH 0 0 plip0 &prompt.root; ping -c 4 host2 PING host2 (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=2.774 ms 64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.530 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=255 time=2.556 ms 64 bytes from 10.0.0.2: icmp_seq=3 ttl=255 time=2.714 ms --- host2 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms
Aaron Kaplan Beigetragen von Tom Rhodes Überarbeitet und erweitert von Brad Davis Erweitert von IPv6 – Internet Protocol Version 6 Bei IPv6 (auch als IPng oder IP next generation bekannt) handelt es sich um die neueste Version des bekannten IP-Protokolls (das auch als IPv4 bezeichnet wird). FreeBSD enthält, genauso wie die anderen frei erhältlichen BSD-Systeme, die IPv6-Referenzimplementation von KAME. FreeBSD erfüllt damit bereits alle für die Nutzung von IPv6 nötigen Voraussetzungen. Dieser Abschnitt konzentriert sich daher auf die Konfiguration und den Betrieb von IPv6. Anfang der 90er Jahre wurde man auf den stark steigenden Verbrauch von IPv4-Adressen aufmerksam. Im Hinblick auf das Wachstums des Internets gab es zwei Hauptsorgen: Die drohende Knappheit von IPv4-Adressen. Dieses Problem konnte durch die Einführung von privaten Adressräumen gemäß RFC1918 (mit Adressen wie 10.0.0.0/8, 172.16.0.0/12, oder 192.168.0.0/16) sowie der Entwicklung von Network Address Translation (NAT) weitestgehend entschärft werden. Die immer größer werdenden Einträge in Router-Tabellen. Dieses Problem ist auch heute noch aktuell. IPv6 ist in der Lage, diese, aber auch viele andere Probleme zu lösen: IPv6 hat einen 128 Bit großen Adressraum. Es sind also theoretisch 340.282.366.920.938.463.463.374.607.431.768.211.456 Adressen verfügbar. In anderen Worten: Für jeden Quadratmeter der Erdoberfläche sind etwa 6,67 * 10^27 IPv6-Adressen verfügbar. Router speichern nur noch Netzwerk-Aggregationsadressen in Ihren Routingtabellen. Dadurch reduziert sich die durchschnittliche Größe einer Routingtabelle auf 8192 Einträge. Weitere nützliche Eigenschaften von IPv6 sind: Die automatische Konfiguration von Adressen, die im RFC2462 beschrieben wird. Anycast-Adressen (eine-von-vielen) Verpflichtende Multicast-Adressen Die Unterstützung von IPsec (IP-Security) Eine vereinfachte Headerstruktur Mobile IP-Adressen Die Umwandlung von IPv4- in IPv6-Adressen Weitere Informationsquellen: Beschreibung von IPv6 auf playground.sun.com KAME.net Hintergrundinformationen zu IPv6-Adressen Es gibt verschiedene Arten von IPv6-Adressen: Unicast-, Anycast- und Multicast-Adressen. Unicast-Adressen sind die herkömlichen Adressen. Ein Paket, das an eine Unicast-Adresse gesendet wird, kommt nur an der Schnittstelle an, die dieser Adresse zugeordnet ist. Anycast-Adressen unterscheiden sich in ihrer Syntax nicht von Unicast-Adressen, sie wählen allerdings aus mehreren Schnittstellen eine Schnittstelle aus. Ein für eine Anycast-Adresse bestimmtes Paket kommt an der nächstgelegenen (entsprechend der Router-Metrik) Schnittstelle an. Anycast-Adressen werden nur von Routern verwendet. Multicast-Adressen bestimmen Gruppen, denen mehrere Schnittstellen angehören. Ein Paket, das an eine Multicast-Adresse geschickt wird, kommt an allen Schnittstellen an, die zur Multicast-Gruppe gehören. Die von IPv4 bekannte Broadcast-Adresse (normalerweise xxx.xxx.xxx.255) wird bei IPv6 durch Multicast-Adressen verwirklicht. Reservierte IPv6-Adressen IPv6-Adresse Präfixlänge Beschreibung Anmerkungen :: 128 Bit nicht festgelegt entspricht 0.0.0.0 bei IPv4 ::1 128 Bit Loopback-Adresse entspricht 127.0.0.1 bei IPv4 ::00:xx:xx:xx:xx 96 Bit Eingebettete IPv4-Adresse Die niedrigen 32 Bit entsprechen der IPv4-Adresse. Wird auch als IPv4-kompatible IPv6-Adresse bezeichnet. ::ff:xx:xx:xx:xx 96 Bit Eine auf IPv6 abgebildete IPv4-Adresse Die niedrigen 32 Bit entsprechen der IPv4-Adresse. Notwendig für Rechner, die IPv6 nicht unterstützen. fe80:: - feb:: 10 Bit link-local Entspricht der Loopback-Adresse bei IPv4 fec0:: - fef:: 10 Bit site-local   ff:: 8 Bit Multicast   001 (im Dualsystem) 3 Bit Globaler Unicast Alle globalen Unicastadressen stammen aus diesem Pool. Die ersten 3 Bit lauten 001.
IPv6-Adressen verstehen Die kanonische Form von IPv6-Adressen lautet x:x:x:x:x:x:x:x, jedes x steht dabei für einen 16-Bit-Hexadezimalwert. Ein Beispiel für eine IPv6-Adresse wäre etwa FEBC:A574:382B:23C1:AA49:4592:4EFE:9982. Eine IPv6-Adresse enthält oft Teilzeichenfolgen aus lauter Nullen. Eine solche Zeichenfolge kann zu :: verkürzt werden. Bis zu drei führende Nullen eines Hexquads können ebenfalls weggelassen werden. fe80::1 entspricht also der Adresse fe80:0000:0000:0000:0000:0000:0000:0001. Eine weitere Möglichkeit ist die Darstellung der letzten 32 Bit in der bekannten (dezimalen) IPv4-Darstellung, bei der Punkte (.) zur Trennung verwendet werden. 2002::10.0.0.1 ist also nur eine andere Schreibweise für die (hexadezimale) kanonische Form 2002:0000:0000:0000:0000:0000:0a00:0001, die wiederum der Adresse 2002::a00:1 entspricht. Sie sollten nun in der Lage sein, die folgende Ausgabe zu verstehen: &prompt.root; ifconfig rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255 inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1 ether 00:00:21:03:08:e1 media: Ethernet autoselect (100baseTX ) status: active Bei fe80::200:21ff:fe03:8e1%rl0 handelt es sich um eine automatisch konfigurierte link-local-Adresse. Sie wird im Rahmen der automatischen Konfiguration aus der MAC-Adresse erzeugt. Weitere Informationen zum Aufbau von IPv6-Adressen finden Sie im RFC3513. Eine IPv6-Verbindung herstellen Es gibt derzeit vier Möglichkeiten, sich mit anderen IPv6-Rechnern oder Netzwerken zu verbinden: Fragen Sie Ihren Internetprovider, ob er IPv6 bereits unterstützt. SixXS bietet weltweit IPv6-Tunnelverbindungen an. Die Verwendung eines 6-nach-4-Tunnels (RFC3068). Die Verwendung des Ports /usr/ports/net/freenet6 bei der Einwahl ins Internet. DNS in der IPv6-Welt Ursprünglich gab es zwei verschiedene DNS-Einträge für IPv6. Da A6-Einträge von der IETF für obsolet erklärt wurden, sind AAAA-Einträge nun Standard. Weisen Sie die erhaltene IPv6-Adresse Ihrem Rechnernamen zu, indem Sie den Eintrag MYHOSTNAME AAAA MYIPv6ADDR in Ihre primäre DNS-Zonendatei einfügen. Falls Sie nicht für Ihre DNS-Zone verantwortlich sind, bitten Sie den dafür Zuständigen, diese Änderung durchzuführen. Die aktuellen Versionen von bind (Version 8.3 oder 9) sowie dns/djbdns (bei Verwendung des IPv6-Patches) unterstützen AAAA-Einträge. <filename>/etc/rc.conf</filename> für die Nutzung von IPv6 anpassen Einen Client unter IPv6 einrichten Dieser Abschnitt beschreibt die Konfiguration eines Rechners, der in Ihrem LAN als Client, aber nicht als Router verwendet wird. Um die Schnittstelle während des Systemstarts mit &man.rtsol.8; automatisch einzurichten, fügen Sie folgende Zeile in /etc/rc.conf ein: ipv6_enable="YES" Durch die folgende Zeile weisen Sie Ihrer Schnittstelle fxp0 die statische IP-Adresse 2001:471:1f11:251:290:27ff:fee0:2093 zu: ipv6_ifconfig_fxp0="2001:471:1f11:251:290:27ff:fee0:2093" Um 2001:471:1f11:251::1 als Standardrouter festzulegen, fügen Sie folgende Zeile in /etc/rc.conf ein: ipv6_defaultrouter="2001:471:1f11:251::1" Gateways und Router unter IPv6 einrichten Dieser Abschnitt beschreibt, wie Sie Ihren Rechner mit Hilfe der von Ihrem Tunnel-Anbieter erhaltenen Anweisungen dauerhaft für die Nutzung von IPv6 einrichten. Um den Tunnel beim Systemstart wiederherzustellen, passen Sie /etc/rc.conf wie folgt an: Listen Sie die einzurichtenden Tunnelschnittstellen (hier gif0) auf: gif_interfaces="gif0" Um den lokalen Endpunkt MY_IPv4_ADDR über diese Schnittstelle mit dem entfernten Endpunkt REMOTE_IPv4_ADDR zu verbinden, verwenden Sie folgende Zeile: gifconfig_gif0="MY_IPv4_ADDR REMOTE_IPv4_ADDR" Um die Ihnen zugewiesene IPv6-Adresse als Endpunkt Ihres IPv6-Tunnels zu verwenden, fügen Sie folgende Zeile ein: ipv6_ifconfig_gif0="MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR" Nun müssen Sie nur noch die IPv6-Standardroute angeben. Diese legt das andere Ende des IPv6-Tunnels fest. ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR" Einen IPv6-Tunnel einrichten Wenn Ihr Server IPv6-Verkehr zwischen Ihrem Netzwerk und der Außenwelt routen muss, benötigen Sie zusätzlich die folgenden Zeilen in Ihrer /etc/rc.conf: ipv6_gateway_enable="YES" Bekanntmachung von Routen und automatische Rechnerkonfiguration Dieser Abschnitt beschreibt die Einrichtung von &man.rtadvd.8;, das Sie bei der Bekanntmachung der IPv6-Standardroute unterstützt. Um &man.rtadvd.8; zu aktivieren, fügen Sie folgende Zeile in /etc/rc.conf ein: rtadvd_enable="YES" Es ist wichtig, die Schnittstelle anzugeben, über die IPv6-Routen bekanntgemacht werden sollen. Soll &man.rtadvd.8; fxp0 verwenden, ist folgender Eintrag nötig: rtadvd_interfaces="fxp0" Danach erzeugen Sie die Konfigurationsdatei /etc/rtadvd.conf. Dazu ein Beispiel: fxp0:\ :addrs#1:addr="2001:471:1f11:246::":prefixlen#64:tc=ether: Ersetzen Sie dabei fxp0 durch die zu verwendende Schnittstelle. Anschließend ersetzen Sie 2001:471:1f11:246:: durch das Präfix der Ihnen zugewiesenen Verbindung. Wenn Sie eine /64-Netzmaske verwenden, müssen Sie keine weiteren Anpassungen vornehmen. Anderenfalls müssen Sie prefixlen# auf den korrekten Wert setzen.
Harti Brandt Beigetragen von ATM - Asynchronous Transfer Mode <foreignphrase>Classical IP over ATM</foreignphrase> als PVC-Verbindung einrichten Classical IP over ATM (CLIP) ist die einfachste Möglichkeit, um IP-Verkehr über ATM (Asynchronous Transfer Mode-Verbindungen zu übertragen. CLIP kann sowohl mit geschalteten Verbindungen (SVCs) als auch mit permanenten Verbindungen (PVCs) verwendet werden. Dieser Abschnitt beschreibt die Einrichtung eines PVC-basierten Netzwerks. Ein vollständig vermaschtes Netzwerk aufbauen Bei einem vollständig vermaschten (fully meshed) Netzwerk ist jeder Rechner über eine dezidierte Verbindung mit jedem anderen Rechner des Netzwerks verbunden. Die Konfiguration ist - vor allem für kleinere Netzwerke - relativ einfach. Unser Beispielnetzwerk besteht aus vier Rechnern, die jeweils über eine ATM-Adapterkarte mit dem ATM-Netzwerk verbunden sind. Als ersten Konfigurationsschritt planen wir die Vergabe von IP-Adressen sowie die anzulegenden ATM-Verbindungen: Rechner IP-Adresse hostA 192.168.173.1 hostB 192.168.173.2 hostC 192.168.173.3 hostD 192.168.173.4 Um ein vollständiges Netz aufzubauen, benötigen wir für jedes Rechnerpaar eine eigene ATM-Verbindung: Rechnerpaar VPI.VCI-Paar hostA - hostB 0.100 hostA - hostC 0.101 hostA - hostD 0.102 hostB - hostC 0.103 hostB - hostD 0.104 hostC - hostD 0.105 Die Werte VPI und VCI an den Verbindungsenden können natürlich unterschiedlich sein. Wir nehmen hier aber an, dass sie gleich sind. Nun müssen wir die ATM-Schnittstellen auf jedem Rechner einrichten: hostA&prompt.root; ifconfig hatm0 192.168.173.1 up hostB&prompt.root; ifconfig hatm0 192.168.173.2 up hostC&prompt.root; ifconfig hatm0 192.168.173.3 up hostD&prompt.root; ifconfig hatm0 192.168.173.4 up Dabei setzen wir voraus, dass hatm0 auf allen Rechnern die ATM-Schnittstelle darstellt. Danach werden, beginnend mit hostA, die PVCs auf den einzelnen Rechnern eingerichtet (Wir nehmen an, dass die PVCs auf den ATM-Switches bereits eingerichet sind. Lesen Sie die entsprechenden Handbücher, wenn Sie einen Switch einrichten müssen.): hostA&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 100 llc/snap ubr hostA&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 101 llc/snap ubr hostA&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 102 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 100 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 103 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 104 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 101 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 103 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 105 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 102 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 104 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 105 llc/snap ubr Statt UBR können auch andere traffic contracts verwendet werden. Voraussetzung ist allerdings, dass diese von Ihrem ATM-Adapter unterstützt werden. Ist dies der Fall, folgen auf den Namen des traffic contracts die entsprechenden Konfigurationsparameter. Weitere Informationen zur Konfiguration von ATM-Adapterkarten erhalten Sie über den Befehl &prompt.root; atmconfig help natm add oder durch das Lesen von &man.atmconfig.8;. Die Konfiguration von ATM-Adaptern kann auch über die Datei /etc/rc.conf erfolgen. Für hostA sähe die Konfiguration so aus: network_interfaces="lo0 hatm0" ifconfig_hatm0="inet 192.168.173.1 up" natm_static_routes="hostB hostC hostD" route_hostB="192.168.173.2 hatm0 0 100 llc/snap ubr" route_hostC="192.168.173.3 hatm0 0 101 llc/snap ubr" route_hostD="192.168.173.4 hatm0 0 102 llc/snap ubr" Mit dem folgenden Befehl lässt sich der derzeitige Status aller CLIP-Routen anzeigen: hostA&prompt.root; atmconfig natm show Tom Rhodes Beigetragen von - CARP - Common Access Redundancy Protocol + CARP - Common Address Redundancy Protocol CARP - Common Access Redundancy Protocol (CARP) + Common Address Redundancy Protocol (CARP) - Das Common Access Redundancy + Das Common Address Redundancy Protocol (CARP) erlaubt es, mehreren Rechnern die gleiche IP-Adresse zuzuweisen. Durch ein solches Vorgehen läßt sich beispielsweise die Verfügbarkeit bestimmter Dienste verbessern oder die Last zwischen einzelnen Systemen besser verteilen. Den auf diese Art und Weise konfigurierten Systemen kann zusätzlich eine eigene (im Netzwerk eindeutige) IP-Adresse zugewiesen werden (wie dies auch im folgenden Beispiel erfolgt). Um CARP zu aktivieren, müssen Sie die &os;-Kernelkonfigurationsdatei um die folgende Option erweitern und danach den &os;-Kernel neu bauen: device carp Danach ist CARP auf Ihrem System verfügbar und kann über verschiedene sysctl-Optionen (OIDs) gesteuert werden. OID Beschreibung net.inet.carp.allow Akzeptiert ankommende CARP-Pakete. In der Voreinstellung aktiviert. net.inet.carp.preempt Diese Option deaktiviert alle CARP-Geräte, sobald eines von ihnen ausfällt. In der Voreinstellung deaktiviert. net.inet.carp.log Hat diese Variable den Wert 0, wird kein Protokoll generiert, während mit dem Wert 1 nur inkorrekte CARP-Pakete protokolliert werden. Hat die Variable einen Wert größer 1, werden nur die Statuswechsel von CARP-Geräten protokolliert. In der Voreinstellung hat diese Variable den Wert 1. net.inet.carp.arpbalance Gleicht die Netzwerklast im lokalen Netzwerk durch den Einsatz von ARP aus. In der Voreinstellung deaktiviert. net.inet.carp.suppress_preempt Eine nur lesbare OID, die den Preemption Suppression-Status anzeigt. Preemption kann verhindert werden. Dies auch dann, wenn ein Gerät ausfällt. Hat die Variable den Wert 0, bedeutet dies, dass Preemption nicht verhindert wird. Tritt ein Problem auf, wird der Wert dieser OID um 1 erhöht. Das CARP-Gerät selbst erzeugen Sie mit dem ifconfig-Befehl: &prompt.root; ifconfig carp0 create Damit Sie dieses Protokoll in Ihrem Netzwerk einsetzen können, muss jede Netzkarte eine eindeutige Identifikationsnummer, die sogenannte VHID (Virtual Host Identification), besitzen, da sich ansonsten die Rechner Ihres Netzwerks nicht voneinander unterscheiden lassen. Die Serververfügbarkeit mit CARP verbessern Wie bereits weiter oben erwähnt wurde, können Sie CARP dazu verwenden, die Verfübarkeit Ihrer Server zu verbessern. Im folgenden Bespiel werden insgesamt drei Server (mit jeweils eigener, eindeutiger IP-Adresse), die alle den gleichen Inhalt anbieten, in einer Round Robin DNS-Konfiguration eingerichtet. Der Backup-Server verfügt über zwei CARP-Schnittstellen (für die beiden IP-Adressen der Content-Server). Tritt bei einem Content-Server ein Problem auf, übernimmt der Backup-Server die IP-Adresse des ausgefallenen Servers. Dadurch sollte die Auswahl eines Servers vom Anwender nicht bemerkt werden. Der Backup-Server muss identisch konfiguriert sein und die gleichen Daten und Dienste anbieten wie das System, das er ersetzen soll. Die beiden Content-Server werden (abgesehen von ihren jeweiligen Hostnamen und VHIDs) identisch konfiguriert und heißen in unserem Beispiel hosta.example.org beziehungsweise hostb.example.org. Damit Sie CARP einsetzen können, müssen Sie als Erstes die Datei rc.conf auf beiden Systemen anpassen. Für das System hosta.example.org nehmen Sie dazu folgende Zeilen in rc.conf auf: hostname="hosta.example.org" ifconfig_fxp0="inet 192.168.1.3 netmask 255.255.255.0" cloned_interfaces="carp0" ifconfig_carp0="vhid 1 pass testpass 192.168.1.50/24" Für das System hostb.example.org benötigen Sie zusätzlich folgende Zeilen in rc.conf: hostname="hostb.example.org" ifconfig_fxp0="inet 192.168.1.4 netmask 255.255.255.0" cloned_interfaces="carp0" ifconfig_carp0="vhid 2 pass testpass 192.168.1.51/24" Achten Sie unbedingt darauf, dass die durch die Option an ifconfig übergebenen Passwörter auf beiden Systemen identisch sind, da carp-Geräte nur mit Systemen kommunizieren können, die über ein korrektes Passwort verfügen. Beachten Sie weiters, dass sich die VHIDs der beiden Systeme unterscheiden müssen. Nun richten Sie noch das dritte System, provider.example.org, ein, das aktiviert wird, wenn eines der beiden zuvor konfigurierten Systeme ausfällt. Dieses dritte System benötigt zwei carp-Geräte, um bei Bedarf eines der beiden anderen Systeme ersetzen zu können. Dazu konfigurieren Sie rc.conf analog zur folgenden Beispielkonfiguration: hostname="provider.example.org" ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0" cloned_interfaces="carp0 carp1" ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24" ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24" Durch die beiden carp-Geräte ist es provider.example.org möglich, festzustellen, ob eines der beiden anderen Systeme nicht mehr reagiert. In diesem Fall übernimmt provider.example.org die IP-Adresse des betroffenen Systems. Ist im installierten &os;-Kernel die Option "preemption" aktiviert, kann es sein, dass provider.example.org die übernommene IP-Adresse nicht mehr an den Content-Server zurückgibt (wenn dieser wieder funktioniert). In diesem Fall muss ein Administrator die entsprechende Schnittstelle dazu zwingen, dies zu tun. Dazu gibt er auf dem Rechner provider.example.org den folgenden Befehl ein: &prompt.root; ifconfig carp0 down && ifconfig carp0 up Dieser Befehl muss auf das carp-Gerät ausgeführt werden, das dem betroffenen System zugeordnet ist. Damit ist CARP vollständig konfiguriert und der Testbetrieb kann beginnen. Zuvor müssen Sie allerdings noch alle Systeme neu starten (beziehungsweise die Netzwerkkonfiguration auf allen Systemen neu einlesen), um die Einstelllungen zu übernehmen. Für weitere Informtionen lesen Sie bitte die Manualpage &man.carp.4;.
diff --git a/de_DE.ISO8859-1/books/handbook/basics/chapter.sgml b/de_DE.ISO8859-1/books/handbook/basics/chapter.sgml index 73e5542b93..44e7a0aff4 100644 --- a/de_DE.ISO8859-1/books/handbook/basics/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/basics/chapter.sgml @@ -1,2922 +1,2922 @@ Chris Shumway Umgeschrieben von Uwe Pierau Übersetzt von Grundlagen des UNIX Betriebssystems Übersicht Das folgende Kapitel umfasst die grundlegenden Kommandos und Funktionsweisen des Betriebssystems FreeBSD. Viel von dem folgenden Material gilt auch für jedes andere &unix;-artige System. Falls Sie mit dem Material schon vertraut sind, können Sie dieses Kapitel überlesen. Wenn FreeBSD neu für Sie ist, dann sollten Sie dieses Kapitel auf jeden Fall aufmerksam lesen. Dieser Abschnitt behandelt die folgenden Themen: virtuelle Konsolen, Zugriffsrechte unter &unix; sowie Datei-Flags unter &os;, Zugriffskontrolllisten für Dateisysteme, die Verzeichnisstruktur von &os;, Organisation von Dateisystemen unter &os;, Ein- und Abhängen von Dateisystemen, Prozesse, Dämonen und Signale, Shells und die Login-Umgebung, Texteditoren, Geräte und Gerätedateien, Binärformate unter &os; und wie Sie in den Manualpages nach weiteren Informationen suchen können. Virtuelle Konsolen und Terminals virtuelle Konsole Terminals Sie können FreeBSD mit einem Terminal benutzen, der nur Text darstellen kann. Wenn Sie FreeBSD auf diese Weise benutzen, stehen Ihnen alle Möglichkeiten eines &unix; Betriebssystems zur Verfügung. Dieser Abschnitt beschreibt was Terminals und Konsolen sind und wie sie unter FreeBSD eingesetzt werden. Die Konsole Konsole Wenn Ihr FreeBSD-System ohne eine graphische Benutzeroberfläche startet, wird am Ende des Systemstarts, nachdem die Startskripten gelaufen sind, ein Anmeldeprompt ausgegeben. Die letzten Startmeldungen sollten ähnlich wie die Folgenden aussehen: Additional ABI support:. Local package initialization:. Additional TCP options:. Fri Sep 20 13:01:06 EEST 2002 FreeBSD/i386 (pc3.example.org) (ttyv0) login: Beachten Sie die letzten beiden Zeilen der Ausgabe, die vorletzte lautet: FreeBSD/i386 (pc3.example.org) (ttyv0) Diese Zeile enthält einige Informationen über das gerade gestartete System. Die Ausgabe stammt von der FreeBSD-Konsole einer Maschine mit einem Intel oder Intel-kompatiblen Prozessor der x86-Architektur Genau das ist mit i386 gemeint. Auch wenn Ihr System keine Intel 386 CPU besitzt, wird i386 ausgegeben. Es wird immer die Architektur und nicht der Typ des Prozessors ausgegeben. . Der Name des Systems (jedes &unix; System besitzt einen Namen) ist pc3.example.org und die Ausgabe stammt von der Systemkonsole, dem Terminal ttyv0. Das Ende der Ausgabe ist immer die Aufforderung zur Eingabe eines Benutzernamens: login: Der Anmeldevorgang wird im nächsten Abschnitt erläutert. Der Anmeldevorgang FreeBSD ist ein Mehrbenutzersystem, das Multitasking unterstützt. Das heißt mehrere Benutzer können gleichzeitig viele Programme auf einem System laufen lassen. Jedes Mehrbenutzersystem muss die Benutzer voneinander unterscheiden können. Bei FreeBSD und allen anderen &unix;-artigen Betriebssystemen wird dies dadurch erreicht, dass sich die Benutzer anmelden müssen, bevor sie Programme laufen lassen können. Jeder Benutzer besitzt einen eindeutigen Namen (den Account) und ein dazugehörendes Passwort, die beide bei der Anmeldung abgefragt werden. Startskripten Nachdem FreeBSD gestartet ist und die Startskripten Startskripten sind Programme, die FreeBSD automatisch bei jedem Startvorgang ausführt. Der Zweck der Skripte besteht darin, das System zu konfigurieren und nützliche Dienste im Hintergrund zu starten. , gelaufen sind, erscheint eine Aufforderung zur Eingabe des Benutzernamens: login: Wenn Ihr Benutzername beispielsweise john ist, geben Sie jetzt john gefolgt von Enter ein. Sie sollten dann eine Aufforderung zur Eingabe des Passworts erhalten: login: john Password: Geben Sie jetzt das Passwort von john gefolgt von Enter ein. Das Passwort wird aus Sicherheitsgründen nicht auf dem Bildschirm angezeigt. Wenn Sie das richtige Passwort eingegeben haben, sind Sie am System angemeldet und können nun alle verfügbaren Kommandos absetzen. Anmgemeldet sind Sie, wenn Sie die Tagesmeldungen (message of today) gefolgt von einer Eingabeaufforderung (dem Zeichen #, $ oder %) gesehen haben. Virtuelle Konsolen Da FreeBSD mehrere Programme gleichzeitig laufen lassen kann, ist eine einzige Konsole, an der Kommandos abgesetzt werden können, zu wenig. Abhilfe schaffen virtuelle Konsolen, die mehrere Konsolen zur Verfügung stellen. Die Anzahl der virtuellen Konsolen unter FreeBSD können Sie einstellen. Zwischen den einzelnen Konsolen können Sie mit speziellen Tastenkombinationen wechseln. Jede Konsole verfügt über einen eigenen Ausgabekanal und FreeBSD ordnet die Tastatureingaben und Monitorausgaben der richtigen Konsole zu, wenn Sie zwischen den Konsolen wechseln. Zum Umschalten der Konsolen stellt FreeBSD spezielle Tastenkombinationen bereit Eine recht technische und genaue Beschreibung der FreeBSD-Konsole und der Tastatur-Treiber finden Sie in den Hilfeseiten &man.syscons.4;, &man.atkbd.4;, &man.vidcontrol.1; und &man.kbdcontrol.1;. Lesen Sie diese Seiten, wenn Sie an den Einzelheiten interessiert sind. . Benutzen Sie AltF1, AltF2 bis AltF8, um zwischen den verschiedenen Konsolen umzuschalten. Wenn Sie zu einer anderen Konsole wechseln, sichert FreeBSD den Bildschirminhalt und gibt den Bildschirminhalt der neuen Konsole aus. Dies erzeugt die Illusion mehrerer Bildschirme und Tastaturen, an denen Sie Kommandos absetzen können. Wenn eine Konsole nicht sichtbar ist, weil Sie auf eine andere Konsole gewechselt haben, laufen die dort abgesetzten Kommandos weiter. <filename>/etc/ttys</filename> In der Voreinstellung stehen unter FreeBSD acht virtuelle Konsolen zur Verfügung, deren Anzahl Sie leicht erhöhen oder verringern können. Die Anzahl und Art der Konsolen wird in /etc/ttys eingestellt. Jede Zeile in /etc/ttys, die nicht mit # anfängt, konfiguriert einen Terminal oder eine virtuelle Konsole. In der Voreinstellung werden in dieser Datei neun virtuelle Konsolen definiert, von denen acht aktiviert sind. Die Konsolen sind in den Zeilen, die mit ttyv beginnen, definiert: # name getty type status comments # ttyv0 "/usr/libexec/getty Pc" cons25 on secure # Virtual terminals ttyv1 "/usr/libexec/getty Pc" cons25 on secure ttyv2 "/usr/libexec/getty Pc" cons25 on secure ttyv3 "/usr/libexec/getty Pc" cons25 on secure ttyv4 "/usr/libexec/getty Pc" cons25 on secure ttyv5 "/usr/libexec/getty Pc" cons25 on secure ttyv6 "/usr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure Die Hilfeseite &man.ttys.5; enthält eine ausführliche Beschreibung der Spalten dieser Datei und der Optionen, die Sie zum Konfigurieren der virtuellen Konsolen benutzen können. Die Konsole im Single-User-Modus Eine eingehende Beschreibung des Single-User-Modus finden Sie in . Im Single-User-Modus steht Ihnen nur eine Konsole zur Verfügung. Die Definition dieser Konsole befindet sich ebenfalls in /etc/ttys. Suchen Sie nach einer Zeile, die mit console beginnt: # name getty type status comments # # If console is marked "insecure", then init will ask for the root password # when going to single-user mode. console none unknown off secure In der Zeile, die mit console beginnt, können Sie secure durch insecure ersetzen. Wenn Sie danach in den Single-User-Modus booten, verlangt das System ebenfalls die Eingabe des root-Passworts. Setzen Sie insecure nicht leichtfertig ein. Wenn Sie das Passwort von root vergessen, wird es schwierig, in den Single-User-Modus zu gelangen, wenn Sie den FreeBSD-Boot-Prozess nicht genau verstehen. Den Videomodus der Konsole anpassen Der Standard-Videomodus der FreeBSD-Konsole kann auf jeden Modus eingestellt werden, der von Ihrer Grafikkarte und Ihrem Monitor unterstützt wird (beispielsweise 1024x768 oder 1280x1024). Wollen Sie eine andere Einstellung verwenden, müssen Sie Ihren Kernel neu kompilieren, nachdem Sie die zwei folgenden Zeilen in Ihre Kernelkonfigurationsdatei aufgenommen haben: OPTIONS VESA options SC_PIXEL_MODE Nachdem Sie den Kernel mit diesen zwei Optionen neu kompiliert haben, bestimmen Sie die möglichen Videomodi mit dem Werkzeug &man.vidcontrol.1;. Um beispielsweise einer Liste aller unterstützten Modi zu erhalten, verwenden Sie den folgenden Befehl: &prompt.root; vidcontrol -i mode Als Ergebnis erhalten Sie eine Liste aller Videomodi, die von Ihrer Hardware unterstützt werden. Sie wählen einen neuen Modus aus, indem Sie den entsprechenden Wert (wiederum als Benutzer root) an &man.vidcontrol.1; übergeben: &prompt.root; vidcontrol MODE_279 Um diese Einstellung dauerhaft zu speichern, müssen Sie die folgende Zeile in die Datei /etc/rc.conf aufnehmen: allscreens_flags="MODE_279" Zugriffsrechte UNIX FreeBSD, das ein direkter Abkömmling von BSD &unix; ist, stützt sich auf mehrere Grundkonzepte von &unix; Systemen. Das erste und ausgeprägteste: FreeBSD ist ein Mehrbenutzer-Betriebssystem. Das System ermöglicht, dass mehrere Benutzer gleichzeitig an völlig verschiedenen und unabhängigen Aufgaben arbeiten können. Es ist verantwortlich für eine gerechte Auf- und Zuteilung von Nachfragen nach Hardware- und Peripheriegeräten, Speicher und CPU-Zeit unter den Benutzern. Da das System mehrere Benutzer unterstützt, hat alles, was das System verwaltet, einen Satz von Rechten, die bestimmen, wer die jeweilige Ressource lesen, schreiben oder ausführen darf. Diese Zugriffsrechte stehen in drei Achtergruppen, die in drei Teile unterteilt sind: einen für den Besitzer der Datei, einen für die Gruppe, zu der die Datei gehört und einen für alle anderen. Die numerische Darstellung sieht wie folgt aus: Zugriffsrechte Dateizugriffsrechte Wert Zugriffsrechte Auflistung im Verzeichnis 0 Kein Lesen, Kein Schreiben, Kein Ausführen --- 1 Kein Lesen, Kein Schreiben, Ausführen --x 2 Kein Lesen, Schreiben, Kein Ausführen -w- 3 Kein Lesen, Schreiben, Ausführen -wx 4 Lesen, Kein Schreiben, Kein Ausführen r-- 5 Lesen, Kein Schreiben, Ausführen r-x 6 Lesen, Schreiben, Kein Ausführen rw- 7 Lesen, Schreiben, Ausführen rwx ls Verzeichnisse Sie können auf der Kommandozeile von &man.ls.1; angeben, um eine ausführliche Verzeichnisauflistung zu sehen, die in einer Spalte die Zugriffsrechte für den Besitzer, die Gruppe und alle anderen enthält. Die Ausgabe von ls -l könnte wie folgt aussehen: &prompt.user; ls -l total 530 -rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile -rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile -rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt ... Die erste Spalte der Ausgabe enthält die Zugriffsrechte: -rw-r--r-- Das erste Zeichen von links ist ein Symbol, welches angibt, ob es sich um eine normale Datei, ein Verzeichnis, ein zeichenorientiertes Gerät, ein Socket oder irgendeine andere Pseudo-Datei handelt. In diesem Beispiel zeigt - eine normale Datei an. Die nächsten drei Zeichen, dargestellt als rw-, ergeben die Rechte für den Datei-Besitzer. Die drei Zeichen danach r-- die Rechte der Gruppe, zu der die Datei gehört. Die letzten drei Zeichen, r--, geben die Rechte für den Rest der Welt an. Ein Minus bedeutet, dass das Recht nicht gegeben ist. In diesem Fall sind die Zugriffsrechte also: der Eigentümer kann die Datei lesen und schreiben, die Gruppe kann lesen und alle anderen können auch nur lesen. Entsprechend obiger Tabelle wären die Zugriffsrechte für diese Datei 644, worin jede Ziffer die drei Teile der Zugriffsrechte dieser Datei verkörpert. Das ist alles schön und gut, aber wie kontrolliert das System die Rechte von Hardware-Geräten? FreeBSD behandelt die meisten Hardware-Geräte als Dateien, welche Programme öffnen, lesen und mit Daten beschreiben können wie alle anderen Dateien auch. Diese Spezial-Dateien sind im Verzeichnis /dev gespeichert. Verzeichnisse werden ebenfalls wie Dateien behandelt. Sie haben Lese-, Schreib- und Ausführ-Rechte. Das Ausführungs-Bit hat eine etwas andere Bedeutung für ein Verzeichnis als für eine Datei. Die Ausführbarkeit eines Verzeichnisses bedeutet, dass in das Verzeichnis zum Beispiel mit cd gewechselt werden kann. Das bedeutet auch, dass in dem Verzeichnis auf Dateien, deren Namen bekannt sind, zugegriffen werden kann, vorausgesetzt die Zugriffsrechte der Dateien lassen dies zu. Das Leserecht auf einem Verzeichnis erlaubt es, sich den Inhalt des Verzeichnisses anzeigen zu lassen. Um eine Datei mit bekanntem Namen in einem Verzeichnis zu löschen, müssen auf dem Verzeichnis Schreib- und Ausführ-Rechte gesetzt sein. Es gibt noch mehr Rechte, aber die werden vor allem in speziellen Umständen benutzt, wie zum Beispiel bei SetUID-Binaries und Verzeichnissen mit gesetztem Sticky-Bit. Mehr über Zugriffsrechte von Dateien und wie sie gesetzt werden, finden Sie in &man.chmod.1;. Tom Rhodes Beigesteuert von Symbolische Zugriffsrechte Zugriffsrechte symbolische Die Zugriffsrechte lassen sich auch über Symbole anstelle von oktalen Werten festlegen. Symbolische Zugriffsrechte werden in der Reihenfolge Wer, Aktion und Berechtigung angegeben. Die folgenden Symbole stehen zur Auswahl: Option Symbol Bedeutung Wer u Benutzer (user) Wer g Gruppe (group) Wer o Andere (other) Wer a Alle Aktion + Berechtigungen hinzufügen Aktion - Berechtigungen entziehen Aktion = Berechtigungen explizit setzen Berechtigung r lesen (read) Berechtigung w schreiben (write) Berechtigung x ausführen (execute) Berechtigung t Sticky-Bit Berechtigung s Set-UID oder Set-GID Symbolische Zugriffsrechte werden wie die numerischen mit dem Kommando &man.chmod.1; vergeben. Wenn Sie beispielsweise allen anderen Benutzern den Zugriff auf die Datei FILE verbieten wollen, benutzen Sie den nachstehenden Befehl: &prompt.user; chmod go= FILE Wenn Sie mehr als eine Änderung der Rechte einer Datei vornehmen wollen, können Sie eine durch Kommata getrennte Liste der Rechte angeben. Das folgende Beispiel entzieht der Gruppe und der Welt (den anderen) die Schreibberechtigung auf die Datei FILE und fügt dann für alle Ausführungsrechte hinzu: &prompt.user; chmod go-w,a+x FILE Tom Rhodes Beigetragen von &os; Datei-Flags Zusätzlich zu den vorhin diskutierten Zugriffsrechten unterstützt &os; auch die sogenannten Datei-Flags. Diese erhöhen die Sicherheit Ihres Systems, indem sie eine verbesserte Kontrolle von Dateien erlauben. Verzeichnisse werden allerdings nicht unterstützt. Diese verbesserte Sicherheit führt dazu, dass manche Dateien nicht einmal von root gelöscht oder bearbeitet werden können. Datei-Flags können über &man.chflags.1; gesetzt oder gelöscht werden. Um beispielsweise die Datei file1 mit dem unlöschbar-Flag zu sichern, geben Sie folgenden Befehl ein: &prompt.root; chflags sunlink file1 Um dieses Flag wieder zu löschen, geben Sie den Befehl erneut ein. Allerdings setzen Sie ein no vor : &prompt.root; chflags nosunlink file1 Um die Flags dieser Datei anzuzeigen, verwenden Sie &man.ls.1; zusammen mit der Option : &prompt.root; ls -lo file1 Dadurch erhalten Sie eine Ausgabe ähnlich der folgenden: -rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1 Viele Flags können nur von root gesetzt oder gelöscht werden. Andere wiederum können auch vom Eigentümer der Datei gesetzt werden. Weitere Informationen zu Datei-Flags finden sich in den Manualpages &man.chflags.1; und &man.chflags.2;. Tom Rhodes Beigetragen von Die Berechtigungen setuid, setgid, und sticky Anders als die Berechtigungen, die bereits angesprochen wurden, existieren drei weitere Einstellungen, über die alle Administratoren Bescheid wissen sollten. Dies sind die Berechtigungen setuid, setgid und sticky. Diese Einstellungen sind wichtig für manche &unix;-Operationen, da sie Funktionalitäten zur Verfügung stellen, die normalerweise nicht an gewöhnliche Anwender vergeben wird. Um diese zu verstehen, muss der Unterschied zwischen der realen und der effektiven Benutzer-ID erwähnt werden. Die reale Benutzer-ID ist die UID, welche den Prozess besitzt oder gestartet hat. Die effektive UID ist diejenige, als die der Prozess läuft. Beispielsweise wird &man.passwd.1; mit der realen ID des Benutzers ausgeführt, der sein Passwort ändert. Um jedoch die Passwortdatenbank zu bearbeiten, wird es effektiv als root-Benutzer ausgeführt. Das ermöglicht es normalen Benutzern, ihr Passwort zu ändern, ohne einen Permission Denied-Fehler angezeigt zu bekommen. Die nosuid &man.mount.8;-Option wird dafür sorgen, dass diese Anwendungen stillschweigend scheitern. Genauer gesagt, sie werden nicht ausgeführt und der Anwender wird darüber auch nicht informiert. Auf diese Option kann man sich nicht vollständig verlassen, da ein nosuid-Wrapper in der Lage wäre, dies zu umgehen, wie in der &man.mount.8; Manualpage zu lesen ist. Die setuid-Berechtigung kann durch das Voranstellen bei einer Berechtigungsgruppe mit der Nummer Vier (4) gesetzt werden, wie im folgenden Beispiel gezeigt wird: &prompt.root; chmod 4755 suidexample.sh Die Berechtigungen auf der suidexample.sh-Datei sollten jetzt wie folgt aussehen: -rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh In dem Beispiel sollte auffallen, dass ein s jetzt Teil der Berechtigungen des Dateibesitzers geworden ist, welches das Ausführen-Bit ersetzt. Dies ermöglicht es Werkzeugen mit erhöhten Berechtigungen zu laufen, wie z.B. passwd. Um dies in Echtzeit zu beobachten, öffnen Sie zwei Terminals. Starten Sie auf einem den passwd-Prozess als normaler Benutzer. Während es auf die Passworteingabe wartet, überprüfen Sie die Prozesstabelle und sehen Sie sich die Informationen des passwd-Kommandos an. Im Terminal A: Changing local password for trhodes Old Password: Im Terminal B: &prompt.root; ps aux | grep passwd trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd Wie oben erwähnt, wird passwd von einem normalen Benutzer ausgeführt, benutzt aber die effektive UID von root. Die setgid-Berechtigung führt die gleiche Aktion wie die setuid-Berechtigung durch, allerdings verändert sie die Gruppenberechtigungen. Wenn eine Anwendung oder ein Werkzeug mit dieser Berechtigung ausgeführt wird, erhält es die Berechtigungen basierend auf der Gruppe, welche die Datei besitzt und nicht die des Benutzers, der den Prozess gestartet hat. Um die setgid-Berechtigung auf einer Datei zu setzen, geben Sie dem chmod-Befehl eine führende Zwei (2) mit, wie im folgenden gezeigt: &prompt.root; chmod 2755 sgidexample.sh Die neue Einstellung kann wie zuvor betrachtet werden. Beachten Sie, dass das s sich jetzt in dem Feld befindet, das für die Berechtigungen der Gruppe bestimmt ist: -rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.sh Obwohl es sich bei dem in diesen Beispielen gezeigten Shellskript um eine ausführbare Datei handelt, wird es nicht mit einer anderen EUID oder effektiven Benutzer-ID ausgeführt. Das ist so, weil Shellskripte keinen Zugriff auf &man.setuid.2;-Systemaufrufe erhalten. Diese beiden ersten angesprochenen Spezialberechtigungen (die setuid und setgid Berechtigungs-Bits) können die Systemsicherheit verringern, da sie erhöhte Rechte ermöglichen. Es gibt noch ein drittes Berechtigungs-Bit, das die Sicherheit eines Systems erhöhen kann: das sticky bit. Das sticky bit erlaubt, wenn es auf ein Verzeichnis angewendet wird, nur dem Besitzer der Datei diese Dateien auch zu löschen. Dieses Recht ist nützlich, um die Löschung von Dateien in öffentlichen Verzeichnissen durch Benutzer, denen diese Dateien nicht gehören, zu verhindern, wie z.B. in /tmp. Um diese Berechtigung anzuwenden, stellen Sie der Berechtigung eine Eins (1) voran, beispielsweise so: &prompt.root; chmod 1777 /tmp Den Effekt können Sie sich ansehen, indem Sie das Kommando ls ausführen: &prompt.root; ls -al / | grep tmp drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp Das sticky bit kann anhand des t ganz am Ende der Berechtigungen abgelesen werden. Verzeichnis-Strukturen Verzeichnis Hierarchien Die FreeBSD-Verzeichnishierarchie ist die Grundlage, um ein umfassendes Verständnis des Systems zu erlangen. Das wichtigste Konzept, das Sie verstehen sollten, ist das Root-Verzeichnis /. Dieses Verzeichnis ist das erste, das während des Bootens eingehangen wird. Es enthält das notwendige Basissystem, um das System in den Mehrbenutzerbetrieb zu bringen. Das Root-Verzeichnis enthält auch die Mountpunkte für Dateisysteme, die beim Wechsel in den Multiuser-Modus eingehängt werden. Ein Mountpunkt ist ein Verzeichnis, in das zusätzliche Dateisysteme (in der Regel unterhalb des Wurzelverzeichnisses) eingehängt werden können. Dieser Vorgang wird in ausführlich beschrieben. Standard-Mountpunkte sind /usr, /var, /tmp, /mnt sowie /cdrom. Auf diese Verzeichnisse verweisen üblicherweise Einträge in der Datei /etc/fstab. /etc/fstab ist eine Tabelle mit verschiedenen Dateisystemen und Mountpunkten als Referenz des Systems. Die meisten der Dateisysteme in /etc/fstab werden beim Booten automatisch durch das Skript &man.rc.8; gemountet, wenn die zugehörigen Einträge nicht mit der Option versehen sind. Weitere Informationen zu diesem Thema finden Sie im . Eine vollständige Beschreibung der Dateisystem-Hierarchie finden Sie in &man.hier.7;. Als Beispiel sei eine kurze Übersicht über die am häufigsten verwendeten Verzeichnisse gegeben: Verzeichnis Beschreibung / Wurzelverzeichnis des Dateisystems. /bin/ Grundlegende Werkzeuge für den Single-User-Modus sowie den Mehrbenutzerbetrieb. /boot/ Programme und Konfigurationsdateien, die während des Bootens benutzt werden. /boot/defaults/ Vorgaben für die Boot-Konfiguration, siehe &man.loader.conf.5;. /dev/ Gerätedateien, siehe &man.intro.4;. /etc/ Konfigurationsdateien und Skripten des Systems. /etc/defaults/ Vorgaben für die System Konfigurationsdateien, siehe &man.rc.8;. /etc/mail/ Konfigurationsdateien von MTAs wie &man.sendmail.8;. /etc/namedb/ Konfigurationsdateien von named, siehe &man.named.8;. /etc/periodic/ Täglich, wöchentlich oder monatlich ablaufende Skripte, die von &man.cron.8; gestartet werden. Siehe &man.periodic.8;. /etc/ppp/ Konfigurationsdateien von ppp, siehe &man.ppp.8;. /mnt/ Ein leeres Verzeichnis, das von Systemadministratoren häufig als temporärer Mountpunkt genutzt wird. /proc/ Prozess Dateisystem, siehe &man.procfs.5; und &man.mount.procfs.8;. /rescue/ Statisch gelinkte Programme zur Wiederherstellung des Systems, lesen Sie dazu auch &man.rescue.8;. /root/ Home Verzeichnis von root. /sbin/ Systemprogramme und administrative Werkzeuge, die grundlegend für den Single-User-Modus und den Mehrbenutzerbetrieb sind. /tmp/ Temporäre Dateien, die für gewöhnlich bei einem Neustart des Systems verloren gehen. Häufig wird ein speicherbasiertes Dateisystem unter /tmp eingehängt. Dieser Vorgang kann automatisiert werden, wenn Sie die tmpmfs-bezogenen Variablen von &man.rc.conf.5; verwenden. Alternativ können Sie auch einen entsprechenden Eintrag in /etc/fstab aufnehmen. Weitere Informationen finden Sie in &man.mdmfs.8;. /usr/ Der Großteil der Benutzerprogramme und Anwendungen. /usr/bin/ Gebräuchliche Werkzeuge, Programmierhilfen und Anwendungen. /usr/include/ Standard C include-Dateien. /usr/lib/ Bibliotheken. /usr/libdata/ Daten verschiedener Werkzeuge. /usr/libexec/ System-Dämonen und System-Werkzeuge, die von anderen Programmen ausgeführt werden. /usr/local/ Lokale Programme, Bibliotheken usw. Die Ports-Sammlung benutzt dieses Verzeichnis als Zielverzeichnis für zu installierende Anwendungen. Innerhalb von /usr/local sollte das von &man.hier.7; beschriebene Layout für /usr benutzt werden. Das man Verzeichnis wird direkt unter /usr/local anstelle unter /usr/local/share angelegt. Die Dokumentation der Ports findet sich in share/doc/port. /usr/obj/ Von der Architektur abhängiger Verzeichnisbaum, der durch das Bauen von /usr/src entsteht. - /usr/ports + /usr/ports/ Die FreeBSD-Ports-Sammlung (optional). /usr/sbin/ System-Dämonen und System-Werkzeuge, die von Benutzern ausgeführt werden. /usr/share/ Von der Architektur unabhängige Dateien. /usr/src/ Quelldateien von BSD und/oder lokalen Ergänzungen. /usr/X11R6/ Optionale X11R6-Programme und Bibliotheken. /var/ Wird für mehrere Zwecke genutzt und enthält Logdateien, temporäre Daten und Spooldateien. Manchmal wird ein speicherbasiertes Dateisystem unter /var eingehängt. Dieser Vorgang kann automatisiert werden, wenn Sie die varmfs-bezogenen Variablen von &man.rc.conf.5; verwenden. Alternativ können Sie auch einen entsprechenden Eintrag in /etc/fstab aufnehmen. Weitere Informationen finden Sie in &man.mdmfs.8;. /var/log/ Verschiedene Logdateien des Systems. /var/mail/ Postfächer der Benutzer. /var/spool/ Verschiedene Spool-Verzeichnisse der Drucker- und Mailsysteme. /var/tmp/ Temporäre Dateien. Dateien in diesem Verzeichnis bleiben in der Regel auch bei einem Neustart des Systems erhalten, es sei denn, bei /var handelt es sich um ein speicherbasiertes Dateisystem. - /var/yp + /var/yp/ NIS maps. Festplatten, Slices und Partitionen &os; identifiziert Dateien anhand eines Dateinamens. In Dateinamen wird zwischen Groß- und Kleinschreibung unterschieden: readme.txt und README.TXT bezeichnen daher zwei verschiedene Dateien. &os; benutzt keine Dateiendungen wie .txt, um den Typ der Datei (ein Programm, ein Dokument oder andere Daten) zu bestimmen. Dateien werden in Verzeichnissen gespeichert. In einem Verzeichnis können sich keine oder hunderte Dateien befinden. Ein Verzeichnis kann auch andere Verzeichnisse enthalten und so eine Hierarchie von Verzeichnissen aufbauen, die Ihnen die Ablage von Daten erleichtert. In Dateinamen werden Verzeichnisse durch einen Schrägstrich (/, Slash) getrennt. Wenn das Verzeichnis foo ein Verzeichnis bar enthält, in dem sich die Datei readme.txt befindet, lautet der vollständige Name der Datei (oder der Pfad zur Datei) foo/bar/readme.txt. Verzeichnisse und Dateien werden in einem Dateisystem gespeichert. Jedes Dateisystem besitzt ein Wurzelverzeichnis (Root-Directory), das weitere Verzeichnisse enthalten kann. Dieses Konzept kennen Sie vielleicht von anderen Betriebssystemen, aber es gibt einige Unterschiede: In &ms-dos; werden Datei- und Verzeichnisnamen mit dem Zeichen \ getrennt, &macos; benutzt dazu das Zeichen :. &os; kennt keine Laufwerksbuchstaben und in Pfaden werden keine Bezeichnungen für Laufwerke benutzt. Die Pfadangabe c:/foo/bar/readme.txt gibt es in &os; nicht. Stattdessen wird ein Dateisystem als Wurzeldateisystem (root file system) ausgewählt. Das Wurzelverzeichnis dieses Dateisystems wird / genannt. Jedes andere Dateisystem wird unter dem Wurzeldateisystem eingehangen (mount). Daher scheint jedes Verzeichnis, unabhängig von der Anzahl der Platten, auf derselben Platte zu liegen. Betrachten wir drei Dateisysteme A, B und C. Jedes Dateisystem besitzt ein eigenes Wurzelverzeichnis, das zwei andere Verzeichnisse enthält: A1, A2, B1, B2, C1 und C2. Das Wurzeldateisystem soll A sein. Das Kommando ls zeigt darin die beiden Verzeichnisse A1 und A2 an. Der Verzeichnisbaum sieht wie folgt aus: / | +--- A1 | `--- A2 Ein Dateisystem wird in einem Verzeichnis eines anderen Dateisystems eingehangen. Wir hängen nun das Dateisystem B in das Verzeichnis A1 ein. Das Wurzelverzeichnis von B ersetzt nun das Verzeichnis A1 und die Verzeichnisse des Dateisystems B werden sichtbar: / | +--- A1 | | | +--- B1 | | | `--- B2 | `--- A2 Jede Datei in den Verzeichnissen B1 oder B2 kann über den Pfad /A1/B1 oder /A1/B2 erreicht werden. Dateien aus dem Verzeichnis /A1 sind jetzt verborgen. Wenn das Dateisystem B wieder abgehangen wird (umount), erscheinen die verborgenen Dateien wieder. Wenn das Dateisystem B unter dem Verzeichnis A2 eingehangen würde, sähe der Verzeichnisbaum so aus: / | +--- A1 | `--- A2 | +--- B1 | `--- B2 Die Dateien des Dateisystems B wären unter den Pfaden /A2/B1 und /A2/B2 erreichbar. Dateisysteme können übereinander eingehangen werden. Der folgende Baum entsteht, wenn im letzten Beispiel das Dateisystem C in das Verzeichnis B1 des Dateisystems B eingehangen wird: / | +--- A1 | `--- A2 | +--- B1 | | | +--- C1 | | | `--- C2 | `--- B2 C könnte auch im Verzeichnis A1 eingehangen werden: / | +--- A1 | | | +--- C1 | | | `--- C2 | `--- A2 | +--- B1 | `--- B2 Der &ms-dos;-Befehl join kann Ähnliches bewirken. Normalerweise müssen Sie sich nicht mit Dateisystemen beschäftigen. Während der Installation werden die Dateisysteme und die Stellen, in der sie eingehangen werden, festgelegt. Dateisysteme müssen Sie erst wieder anlegen, wenn Sie eine neue Platte hinzufügen. Sie können sogar mit nur einem großen Dateisystem auskommen. Dies hat mehrere Nachteile und einen Vorteil. Vorteile mehrerer Dateisysteme Die Dateisysteme können mit unterschiedlichen Optionen (mount options) eingehangen werden. Bei sorgfältiger Planung können Sie beispielsweise das Wurzeldateisystem nur lesbar einhängen. Damit schützen Sie sich vor dem unabsichtlichen Löschen oder Editieren kritischer Dateien. Von Benutzern beschreibbare Dateisysteme wie /home können Sie mit der Option nosuid einhängen, wenn sie von anderen Dateisystemen getrennt sind. Die SUID- und GUID-Bits verlieren auf solchen Dateisystemen ihre Wirkung und die Sicherheit des Systems kann dadurch erhöht werden. Die Lage von Dateien im Dateisystem wird, abhängig vom Gebrauch des Dateisystems, automatisch von &os; optimiert. Ein Dateisystem mit vielen kleinen Dateien, die häufig geschrieben werden, wird anders behandelt als ein Dateisystem mit wenigen großen Dateien. Mit nur einem Dateisystem ist diese Optimierung unmöglich. In der Regel übersteht ein &os;-Dateisystem auch einen Stromausfall. Allerdings kann ein Stromausfall zu einem kritischen Zeitpunkt das Dateisystem beschädigen. Wenn die Daten über mehrere Dateisysteme verteilt sind, lässt sich das System mit hoher Wahrscheinlichkeit noch starten. Dies erleichtert das Zurückspielen von Datensicherungen. Vorteil eines einzelnen Dateisystems Die Größe von Dateisystemen liegt fest. Es kann passieren, dass Sie eine Partition vergrößern müssen. Dies ist nicht leicht: Sie müssen die Daten sichern, das Dateisystem vergrößert anlegen und die gesicherten Daten zurückspielen. &os; kennt den Befehl &man.growfs.8;, mit dem man Dateisysteme im laufenden Betrieb vergrößern kann. Dateisysteme befinden sich in Partitionen (damit sind nicht die normalen &ms-dos;-Partitionen gemeint). Jede Partition wird mit einem Buchstaben von a bis h bezeichnet und kann nur ein Dateisystem enthalten. Dateisysteme können daher über ihren Mount-Point, den Punkt an dem sie eingehangen sind, oder den Buchstaben der Partition, in der sie liegen, identifiziert werden. &os; benutzt einen Teil der Platte für den Swap-Bereich, der dem Rechner virtuellen Speicher zur Verfügung stellt. Dadurch kann der Rechner Anwendungen mehr Speicher zur Verfügung stellen als tatsächlich eingebaut ist. Wenn der Speicher knapp wird, kann &os; nicht benutzte Daten in den Swap-Bereich auslagern. Die ausgelagerten Daten können später wieder in den Speicher geholt werden (dafür werden dann andere Daten ausgelagert). Für einige Partitionen gelten besondere Konventionen: Partition Konvention a Enthält normalerweise das Wurzeldateisystem b Enthält normalerweise den Swap-Bereich c Ist normalerweise genauso groß wie die Slice in der die Partition liegt. Werkzeuge, die auf der kompletten Slice arbeiten, wie ein Bad-Block-Scanner, können so die c-Partition benutzen. Für gewöhnlich legen Sie in dieser Partition kein Dateisystem an. d Früher hatte die d-Partition eine besondere Bedeutung. Heute ist dies nicht mehr der Fall und die Partition d kann wie jede andere Partition auch verwendet werden. Jede Partition, die ein Dateisystem enthält, wird in einer Slice angelegt. Slice ist der Begriff, den &os; für &ms-dos;-Partitionen verwendet. Slices werden von eins bis vier durchnummeriert. Slices Partitionen dangerously dedicated Die Slice-Nummern werden mit vorgestelltem s hinter den Gerätenamen gestellt: da0s1 ist die erste Slice auf dem ersten SCSI-Laufwerk. Auf einer Festplatte gibt es höchstens vier Slices. In einer Slice des passenden Typs kann es weitere logische Slices geben. Diese erweiterten Slices werden ab fünf durchnummeriert: ad0s5 ist die erste erweiterte Slice auf einer IDE-Platte. Diese Geräte werden von Dateisystemen benutzt, die sich in einer kompletten Slice befinden müssen. Slices, dangerously dedicated-Festplatten und andere Platten enthalten Partitionen, die mit Buchstaben von a bis h bezeichnet werden. Der Buchstabe wird an den Gerätenamen gehangen: da0a ist die a-Partition des ersten da-Laufwerks. Dieses Laufwerk ist dangerously dedicated. ad1s3e ist die fünfte Partition in der dritten Slice der zweiten IDE-Platte. Schließlich wird noch jede Festplatte des Systems eindeutig bezeichnet. Der Name einer Festplatte beginnt mit einem Code, der den Typ der Platte bezeichnet. Es folgt eine Nummer, die angibt, um welche Festplatte es sich handelt. Anders als bei Slices werden Festplatten von Null beginnend durchnummeriert. Gängige Festplatten-Namen sind in zusammengestellt. Wenn Sie eine Partition angeben, erwartet &os;, dass Sie auch die Slice und die Platte angeben, in denen sich die Partition befindet. Wenn Sie eine Slice angeben, müssen Sie auch die Platte der Slice angeben. Setzen Sie den Namen aus dem Plattennamen gefolgt von einem s, der Slice-Nummer und dem Buchstaben der Partition zusammen. Einige Beispiele finden Sie in . Der Aufbau einer Festplatte wird in dargestellt. Um &os; zu installieren, müssen Sie zuerst Slices auf den Festplatten anlegen. Innerhalb der Slices, die Sie für &os; verwenden wollen, müssen Sie dann Partitionen anlegen. In den Partitionen wiederum werden die Dateisysteme (oder der Auslagerungsbereich) angelegt. Für Dateisysteme müssen Sie schließlich noch festlegen, wo diese eingehangen werden (Mount-Point). Laufwerk-Codes Code Bedeutung ad ATAPI (IDE) Festplatte da SCSI-Festplatte acd ATAPI (IDE) CD-ROM cd SCSI-CD-ROM fd Disketten-Laufwerk
Namen von Platten, Slices und Partitionen Name Bedeutung ad0s1a Die erste Partition (a) in der ersten Slice (s1) der ersten IDE-Festplatte (ad0). da1s2e Die fünfte Partition (e) der zweiten Slice (s2) auf der zweiten SCSI-Festplatte (da1). Aufteilung einer Festplatte Das folgende Diagramm zeigt die Sicht von &os; auf die erste IDE-Festplatte eines Rechners. Die Platte soll 4 GB groß sein und zwei Slices (&ms-dos;-Partitionen) mit je 2 GB besitzen. Die erste Slice enthält ein &ms-dos;-Laufwerk (C:), die zweite Slice wird von &os; benutzt. Im Beispiel verwendet die &os;-Installationen drei Datenpartitionen und einen Auslagerungsbereich. Jede der drei Partitionen enthält ein Dateisystem. Das Wurzeldateisystem ist die a-Partition. In der e-Partition befindet sich der /var-Verzeichnisbaum und in der f-Partition befindet sich der Verzeichnisbaum unterhalb von /usr. .-----------------. --. | | | | DOS / Windows | | : : > First slice, ad0s1 : : | | | | :=================: ==: --. | | | Partition a, mounted as / | | | > referred to as ad0s2a | | | | | :-----------------: ==: | | | | Partition b, used as swap | | | > referred to as ad0s2b | | | | | :-----------------: ==: | Partition c, no | | | Partition e, used as /var > file system, all | | > referred to as ad0s2e | of FreeBSD slice, | | | | ad0s2c :-----------------: ==: | | | | | : : | Partition f, used as /usr | : : > referred to as ad0s2f | : : | | | | | | | | --' | `-----------------' --'
Anhängen und Abhängen von Dateisystemen Ein Dateisystem wird am besten als ein Baum mit der Wurzel / veranschaulicht. /dev, /usr, und die anderen Verzeichnisse im Rootverzeichnis sind Zweige, die wiederum eigene Zweige wie /usr/local haben können. Root-Dateisystem Es gibt verschiedene Gründe, bestimmte dieser Verzeichnisse auf eigenen Dateisystemen anzulegen. /var enthält log/, spool/ sowie verschiedene andere temporäre Dateien und kann sich daher schnell füllen. Es empfiehlt sich, /var von / zu trennen, da es schlecht ist, wenn das Root-Dateisystem voll läuft. Ein weiterer Grund bestimmte Verzeichnisbäume auf andere Dateisysteme zu legen, ist gegeben, wenn sich die Verzeichnisbäume auf gesonderten physikalischen oder virtuellen Platten, wie Network File System oder CD-ROM-Laufwerken, befinden. Die <filename>fstab</filename> Datei Dateisysteme fstab Während des Boot-Prozesses werden in /etc/fstab aufgeführte Verzeichnisse, sofern sie nicht mit der Option versehen sind, automatisch angehangen. Die Zeilen in /etc/fstab haben das folgende Format: device /mount-point fstype options dumpfreq passno device Ein existierender Gerätename wie in beschrieben. mount-point Ein existierendes Verzeichnis, an das das Dateisystem angehangen wird. fstype Der Typ des Dateisystems, der an &man.mount.8; weitergegeben wird. FreeBSDs Standarddateisystem ist ufs. options Entweder für beschreibbare Dateisysteme oder für schreibgeschützte Dateisysteme, gefolgt von weiteren benötigten Optionen. Eine häufig verwendete Option ist für Dateisysteme, die während der normalen Bootsequenz nicht angehangen werden sollen. Weitere Optionen finden sich in &man.mount.8;. dumpfreq Gibt die Anzahl der Tage an, nachdem das Dateisystem gesichert werden soll. Fehlt der Wert, wird 0 angenommen. passno Bestimmt die Reihenfolge, in der die Dateisysteme überprüft werden sollen. Für Dateisysteme, die übersprungen werden sollen, ist passno auf null zu setzen. Für das Root-Dateisystem, das vor allen anderen überprüft werden muss, sollte der Wert von passno eins betragen. Allen anderen Dateisystemen sollten Werte größer eins zugewiesen werden. Wenn mehrere Dateisysteme den gleichen Wert besitzen, wird &man.fsck.8; versuchen, diese parallel zu überprüfen. Das <command>mount</command> Kommando Dateisysteme anhängen &man.mount.8; hängt schließlich Dateisysteme an. In der grundlegenden Form wird es wie folgt benutzt: &prompt.root; mount device mountpoint Viele Optionen werden in &man.mount.8; beschrieben, die am häufigsten verwendeten sind: Optionen von <command>mount</command> Hängt alle Dateisysteme aus /etc/fstab an. Davon ausgenommen sind Dateisysteme, die mit noauto markiert sind, die mit der Option ausgeschlossen wurden und Dateisysteme, die schon angehangen sind. Führt alles bis auf den mount-Systemaufruf aus. Nützlich ist diese Option in Verbindung mit . Damit wird angezeigt, was &man.mount.8; tatsächlich versuchen würde, um das Dateisystem anzuhängen. Erzwingt das Anhängen eines unsauberen Dateisystems oder erzwingt die Rücknahme des Schreibzugriffs, wenn der Status des Dateisystems von beschreibbar auf schreibgeschützt geändert wird. Hängt das Dateisystem schreibgeschützt ein. Das kann auch durch Angabe von als Argument ( vor FreeBSD 5.2) der Option erreicht werden. fstype Hängt das Dateisystem mit dem angegebenen Typ an, oder hängt nur Dateisysteme mit dem angegebenen Typ an, wenn auch angegeben wurde. Die Voreinstellung für den Typ des Dateisystems ist ufs. Aktualisiert die Mountoptionen des Dateisystems. Geschwätzig sein. Hängt das Dateisystem beschreibbar an. erwartet eine durch Kommata separierte Liste von Optionen, unter anderem die folgenden: noexec Verbietet das Ausführen von binären Dateien auf dem Dateisystem. Dies ist eine nützliche Sicherheitsfunktion. nosuid SetUID und SetGID Bits werden auf dem Dateisystem nicht beachtet. Dies ist eine nützliche Sicherheitsfunktion. Das <command>umount</command> Kommando Dateisysteme abhängen &man.umount.8; akzeptiert als Parameter entweder einen Mountpoint, einen Gerätenamen, oder die Optionen oder . Jede Form akzeptiert , um das Abhängen zu erzwingen, und , um etwas geschwätziger zu sein. Seien Sie bitte vorsichtig mit : Ihr Computer kann abstürzen oder es können Daten auf dem Dateisystem beschädigt werden, wenn Sie das Abhängen erzwingen. und werden benutzt um alle Dateisysteme, deren Typ durch modifiziert werden kann, abzuhängen. hängt das Rootdateisystem nicht ab. Prozesse Da FreeBSD ein Multitasking-Betriebssystem ist, sieht es so aus, als ob mehrere Prozesse zur gleichen Zeit laufen. Jedes Programm, das zu irgendeiner Zeit läuft, wird Prozess genannt. Jedes Kommando startet mindestens einen Prozess. Einige Systemprozesse laufen ständig und stellen die Funktion des Systems sicher. Jeder Prozess wird durch eine eindeutige Nummer identifiziert, die Prozess-ID oder PID genannt wird. Prozesse haben ebenso wie Dateien einen Besitzer und eine Gruppe, die festlegen, welche Dateien und Geräte der Prozess benutzen kann. Dabei finden die vorher beschriebenen Zugriffsrechte Anwendung. Die meisten Prozesse haben auch einen Elternprozess, der sie gestartet hat. Wenn Sie in der Shell Kommandos eingeben, dann ist die Shell ein Prozess und jedes Kommando, das Sie starten, ist auch ein Prozess. Jeder Prozess, den Sie auf diese Weise starten, besitzt den Shell-Prozess als Elternprozess. Die Ausnahme hiervon ist ein spezieller Prozess, der &man.init.8; heißt. init ist immer der erste Prozess und hat somit die PID 1. init wird vom Kernel beim Booten von FreeBSD gestartet. Die Kommandos &man.ps.1; und &man.top.1; sind besonders nützlich, um sich die Prozesse auf einem System anzusehen. ps zeigt eine statische Liste der laufenden Prozesse und kann deren PID, Speicherverbrauch und die Kommandozeile, mit der sie gestartet wurden und vieles mehr anzeigen. top zeigt alle laufenden Prozesse an und aktualisiert die Anzeige, so dass Sie Ihrem Computer bei der Arbeit zuschauen können. Normal zeigt Ihnen ps nur die laufenden Prozesse, die Ihnen gehören. Zum Beispiel: &prompt.user; ps PID TT STAT TIME COMMAND 298 p0 Ss 0:01.10 tcsh 7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14) 37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14) 48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi 48730 p0 IW 0:00.00 (dns helper) (navigator-linux-) 72210 p0 R+ 0:00.00 ps 390 p1 Is 0:01.14 tcsh 7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y 6688 p3 IWs 0:00.00 tcsh 10735 p4 IWs 0:00.00 tcsh 20256 p5 IWs 0:00.00 tcsh 262 v0 IWs 0:00.00 -tcsh (tcsh) 270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16 280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16 284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc 285 v0 S 0:38.45 /usr/X11R6/bin/sawfish Wie Sie sehen, gibt &man.ps.1; mehrere Spalten aus. In der PID Spalte findet sich die vorher besprochene Prozess-ID. PIDs werden von 1 beginnend bis 99999 zugewiesen und fangen wieder von vorne an, wenn die Grenze überschritten wird. Ist eine PID bereits vergeben, wird diese allerdings nicht erneut vergeben. Die Spalte TT zeigt den Terminal, auf dem das Programm läuft. STAT zeigt den Status des Programms an und kann für die Zwecke dieser Diskussion ebenso wie TT ignoriert werden. TIME gibt die Zeit an, die das Programm auf der CPU gelaufen ist – dies ist nicht unbedingt die Zeit, die seit dem Start des Programms vergangen ist, da die meisten Programme hauptsächlich auf bestimmte Dinge warten, bevor sie wirklich CPU-Zeit verbrauchen. Unter der Spalte COMMAND finden Sie schließlich die Kommandozeile, mit der das Programm gestartet wurde. &man.ps.1; besitzt viele Optionen, um die angezeigten Informationen zu beeinflussen. Eine nützliche Kombination ist auxww. Mit werden Information über alle laufenden Prozesse und nicht nur Ihrer eigenen angezeigt. Der Name des Besitzers des Prozesses, sowie Informationen über den Speicherverbrauch werden mit angezeigt. zeigt auch Dämonen-Prozesse an, und veranlasst &man.ps.1; die komplette Kommandozeile für jeden Befehl anzuzeigen, anstatt sie abzuschneiden, wenn sie zu lang für die Bildschirmausgabe wird. Die Ausgabe von &man.top.1; sieht ähnlich aus: &prompt.user; top last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10 47 processes: 1 running, 46 sleeping CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free Swap: 256M Total, 38M Used, 217M Free, 15% Inuse PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top 7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14 281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA 296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm 48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu 175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd 7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt ... Die Ausgabe ist in zwei Abschnitte geteilt. In den ersten fünf Kopfzeilen finden sich die zuletzt zugeteilte PID, die Systemauslastung (engl. load average), die Systemlaufzeit (die Zeit seit dem letzten Reboot) und die momentane Zeit. Die weiteren Zahlen im Kopf beschreiben wie viele Prozesse momentan laufen (im Beispiel 47), wie viel Speicher und Swap verbraucht wurde und wie viel Zeit das System in den verschiedenen CPU-Modi verbringt. Darunter befinden sich einige Spalten mit ähnlichen Informationen wie in der Ausgabe von &man.ps.1;. Wie im vorigen Beispiel können Sie die PID, den Besitzer, die verbrauchte CPU-Zeit und das Kommando erkennen. &man.top.1; zeigt auch den Speicherverbrauch des Prozesses an, der in zwei Spalten aufgeteilt ist. Die erste Spalte gibt den gesamten Speicherverbrauch des Prozesses an, in der zweiten Spalte wird der aktuelle Verbrauch angegeben. &netscape; hat im gezeigten Beispiel insgesamt 30 MB Speicher verbraucht. Momentan benutzt es allerdings nur 9 MB. Die Anzeige wird von &man.top.1; automatisch alle zwei Sekunden aktualisiert. Der Zeitraum kann mit eingestellt werden. Dämonen, Signale und Stoppen von Prozessen Wenn Sie einen Editor starten, können Sie ihn leicht bedienen und Dateien laden. Sie können das, weil der Editor dafür Vorsorge getroffen hat und auf einem Terminal läuft. Manche Programme erwarten keine Eingaben von einem Benutzer und lösen sich bei erster Gelegenheit von ihrem Terminal. Ein Web-Server zum Beispiel verbringt den ganzen Tag damit, auf Anfragen zu antworten und erwartet keine Eingaben von Ihnen. Programme, die E-Mail von einem Ort zu einem anderen Ort transportieren sind ein weiteres Beispiel für diesen Typ von Anwendungen. Wir nennen diese Programme Dämonen. Dämonen stammen aus der griechischen Mythologie und waren weder gut noch böse. Sie waren kleine dienstbare Geister, die meistens nützliche Sachen für die Menschheit vollbrachten. Ähnlich wie heutzutage Web-Server und Mail-Server nützliche Dienste verrichten. Seit langer Zeit ist daher das BSD Maskottchen dieser fröhlich aussehende Dämon mit Turnschuhen und Dreizack. Programme, die als Dämon laufen, werden entsprechend einer Konvention mit einem d am Ende benannt. BIND steht beispielsweise für Berkeley Internet Name Domain, das tatsächlich laufende Programm heißt aber named. Der Apache Webserver wird httpd genannt, der Druckerspool-Dämon heißt lpd usw. Dies ist allerdings eine Konvention und keine unumstößliche Regel: Der Dämon der Anwendung sendmail heißt sendmail und nicht maild, wie Sie vielleicht gedacht hatten. Manchmal müssen Sie mit einem Dämon kommunizieren. Dazu verwenden Sie Signale. Sie können mit einem Dämonen oder jedem anderen laufenden Prozess kommunizieren, indem Sie diesem ein Signal schicken. Sie können verschiedene Signale verschicken – manche haben eine festgelegte Bedeutung, andere werden von der Anwendung interpretiert. Die Dokumentation zur fraglichen Anwendung wird erklären, wie die Anwendung Signale interpretiert. Sie können nur Signale zu Prozessen senden, die Ihnen gehören. Normale Benutzer haben nicht die Berechtigung, Prozessen anderer Benutzer mit &man.kill.1; oder &man.kill.2; Signale zu schicken. Der Benutzer root darf jedem Prozess Signale schicken. In manchen Fällen wird FreeBSD Signale senden. Wenn eine Anwendung schlecht geschrieben ist und auf Speicher zugreift, auf den sie nicht zugreifen soll, so sendet FreeBSD dem Prozess das Segmentation Violation Signal (SIGSEGV). Wenn eine Anwendung den &man.alarm.3; Systemaufruf benutzt hat, um nach einiger Zeit benachrichtigt zu werden, bekommt sie das Alarm Signal (SIGALRM) gesendet. Zwei Signale können benutzt werden, um Prozesse zu stoppen: SIGTERM und SIGKILL. Mit SIGTERM fordern Sie den Prozess höflich zum Beenden auf. Der Prozess kann das Signal abfangen und merken, dass er sich beenden soll. Er hat dann Gelegenheit Logdateien zu schließen und die Aktion, die er vor der Aufforderung sich zu beenden durchführte, abzuschließen. Er kann sogar SIGTERM ignorieren, wenn er eine Aktion durchführt, die nicht unterbrochen werden darf. SIGKILL kann von keinem Prozess ignoriert werden. Das Signal lässt sich mit Mich interessiert nicht, was du gerade machst, hör sofort auf damit! umschreiben. Wenn Sie einem Prozess SIGKILL schicken, dann wird FreeBSD diesen sofort beenden Das stimmt nicht ganz: Es gibt Fälle, in denen ein Prozess nicht unterbrochen werden kann. Wenn der Prozesss zum Beispiel eine Datei von einem anderen Rechner auf dem Netzwerk liest und dieser Rechner aus irgendwelchen Gründen nicht erreichbar ist (ausgeschaltet, oder ein Netzwerkfehler), dann ist der Prozess nicht zu unterbrechen. Wenn der Prozess den Lesezugriff nach einem Timeout von typischerweise zwei Minuten aufgibt, dann wir er beendet. . Andere Signale, die Sie vielleicht verschicken wollen, sind SIGHUP, SIGUSR1 und SIGUSR2. Diese Signale sind für allgemeine Zwecke vorgesehen und verschiedene Anwendungen werden unterschiedlich auf diese Signale reagieren. Nehmen wir an, Sie haben die Konfiguration Ihres Webservers verändert und möchten dies dem Server mitteilen. Sie könnten den Server natürlich stoppen und httpd wieder starten. Die Folge wäre eine kurze Zeit, in der der Server nicht erreichbar ist. Die meisten Dämonen lesen Ihre Konfigurationsdatei beim Empfang eines SIGHUP neu ein. Da es keinen Standard gibt, der vorschreibt, wie auf diese Signale zu reagieren ist, lesen Sie bitte die Dokumentation zu dem in Frage kommenden Dämon. Mit &man.kill.1; können Sie, wie unten gezeigt, Signale verschicken. Verschicken von Signalen Das folgende Beispiel zeigt, wie Sie &man.inetd.8; ein Signal schicken. Die Konfigurationsdatei von inetd ist /etc/inetd.conf. Diese Konfigurationsdatei liest inetd ein, wenn er ein SIGHUP empfängt. Suchen Sie die Prozess-ID des Prozesses, dem Sie ein Signal schicken wollen. Benutzen Sie dazu &man.ps.1; und &man.grep.1;. Mit &man.grep.1; können Sie in einer Ausgabe nach einem String suchen. Da &man.inetd.8; unter dem Benutzer root läuft und Sie das Kommando als normaler Benutzer absetzen, müssen Sie &man.ps.1; mit aufrufen: &prompt.user; ps -ax | grep inetd 198 ?? IWs 0:00.00 inetd -wW Die Prozess-ID von &man.inetd.8; ist 198. In einigen Fällen werden Sie auch das grep inetd Kommando in der Ausgabe sehen. Dies hat damit zu tun, wie &man.ps.1; die Liste der laufenden Prozesse untersucht. Senden Sie das Signal mit &man.kill.1;. Da &man.inetd.8; unter dem Benutzer root läuft, müssen Sie zuerst mit &man.su.1; root werden: &prompt.user; su Password: &prompt.root; /bin/kill -s HUP 198 &man.kill.1; wird, wie andere Kommandos von &unix; Systemen auch, keine Ausgabe erzeugen, wenn das Kommando erfolgreich war. Wenn Sie versuchen, einem Prozess, der nicht Ihnen gehört, ein Signal zu senden, dann werden Sie die Meldung kill: PID: Operation not permitted sehen. Wenn Sie sich bei der Eingabe der PID vertippen, werden Sie das Signal dem falschen Prozess schicken, was schlecht sein kann. Wenn Sie Glück haben, existiert der Prozess nicht und Sie werden mit der Ausgabe kill: PID: No such process belohnt. Warum soll ich <command>/bin/kill</command> benutzen? Viele Shells stellen kill als internes Kommando zur Verfügung, das heißt die Shell sendet das Signal direkt, anstatt /bin/kill zu starten. Das kann nützlich sein, aber die unterschiedlichen Shells benutzen eine verschiedene Syntax, um die Namen der Signale anzugeben. Anstatt jede Syntax zu lernen, kann es einfacher sein, /bin/kill ... direkt aufzurufen. Andere Signale senden Sie auf die gleiche Weise, ersetzen Sie nur TERM oder KILL entsprechend. Es kann gravierende Auswirkungen haben, wenn Sie zufällig Prozesse beenden. Insbesondere &man.init.8; mit der Prozess-ID ist ein Spezialfall. Mit /bin/kill -s KILL 1 können Sie Ihr System schnell herunterfahren. Überprüfen Sie die Argumente von &man.kill.1; immer zweimal bevor Sie Return drücken. Shells Shells Kommandozeile Von der tagtäglichen Arbeit mit FreeBSD wird eine Menge mit der Kommandozeilen Schnittstelle der Shell erledigt. Die Hauptaufgabe einer Shell besteht darin, Kommandos der Eingabe anzunehmen und diese auszuführen. Viele Shells haben außerdem eingebaute Funktionen, die die tägliche Arbeit erleichtern, beispielsweise eine Dateiverwaltung, die Vervollständigung von Dateinamen (Globbing), einen Kommandozeileneditor, sowie Makros und Umgebungsvariablen. FreeBSD enthält die Shells sh (die Bourne Shell) und tcsh (die verbesserte C-Shell) im Basissystem. Viele andere Shells, wie zsh oder bash, befinden sich in der Ports-Sammlung. Welche Shell soll ich benutzen? Das ist wirklich eine Geschmacksfrage. Sind Sie ein C-Programmierer, finden Sie vielleicht eine C-artige Shell wie die tcsh angenehmer. Kommen Sie von Linux oder ist Ihnen der Umgang mit &unix; Systemen neu, so könnten Sie die bash probieren. Der Punkt ist, dass jede Shell ihre speziellen Eigenschaften hat, die mit Ihrer bevorzugten Arbeitsumgebung harmonieren können oder nicht. Sie müssen sich eine Shell aussuchen. Ein verbreitetes Merkmal in Shells ist die Dateinamen-Vervollständigung. Sie müssen nur einige Buchstaben eines Kommandos oder eines Dateinamen eingeben und die Shell vervollständigt den Rest automatisch durch drücken der Tab-Taste. Hier ist ein Beispiel. Angenommen, Sie haben zwei Dateien foobar und foo.bar. Die Datei foo.bar möchten Sie löschen. Nun würden Sie an der Tastatur eingeben: rm fo[Tab]. [Tab]. Die Shell würde dann rm foo[BEEP].bar ausgeben. [BEEP] meint den Rechner-Piepser. Diesen gibt die Shell aus, um anzuzeigen, dass es den Dateinamen nicht vervollständigen konnte, da es mehrere Möglichkeiten gibt. Beide Dateien foobar und foo.bar beginnen mit fo, so konnte nur bis foo ergänzt werden. Nachdem Sie . eingaben und dann die Tab-Taste drückten, konnte die Shell den Rest für Sie ausfüllen. Umgebungsvariablen Ein weiteres Merkmal der Shell ist der Gebrauch von Umgebungsvariablen. Dies sind veränderbare Schlüsselpaare im Umgebungsraum der Shell, die jedes von der Shell aufgerufene Programm lesen kann. Daher enthält der Umgebungsraum viele Konfigurationsdaten für Programme. Die folgende Liste zeigt verbreitete Umgebungsvariablen und was sie bedeuten: Umgebungsvariablen Variable Beschreibung USER Name des angemeldeten Benutzers. PATH Liste mit Verzeichnissen (getrennt durch Doppelpunkt) zum Suchen nach Programmen. DISPLAY Der Name des X11-Bildschirms, auf dem Ausgaben erfolgen sollen. SHELL Die aktuelle Shell. TERM Name des Terminaltyps des Benutzers. Benutzt, um die Fähigkeiten des Terminals zu bestimmen. TERMCAP Datenbankeintrag der Terminal Escape Codes, benötigt um verschieden Terminalfunktionen auszuführen. OSTYPE Typ des Betriebsystems, beispielsweise FreeBSD. MACHTYPE Die CPU Architektur auf dem das System läuft. EDITOR Vom Benutzer bevorzugter Text-Editor. PAGER Vom Benutzer bevorzugter Text-Betrachter. MANPATH Liste mit Verzeichnissen (getrennt durch Doppelpunkt) zum Suchen nach Manualpages. Shells Bourne Shell Das Setzen von Umgebungsvariablen funktioniert von Shell zu Shell unterschiedlich. Zum Beispiel benutzt man in C-artigen Shells wie der tcsh dazu setenv. Unter Bourne-Shells wie sh oder bash benutzen Sie zum Setzen von Umgebungsvariablen export. Um beispielsweise die Variable EDITOR mit csh oder tcsh auf /usr/local/bin/emacs zu setzen, setzen Sie das folgende Kommando ab: &prompt.user; setenv EDITOR /usr/local/bin/emacs Unter Bourne-Shells: &prompt.user; export EDITOR="/usr/local/bin/emacs" Sie können die meisten Shells Umgebungsvariablen expandieren lassen, in dem Sie in der Kommandozeile ein $ davor eingeben. Zum Beispiel gibt echo $TERM aus, worauf $TERM gesetzt ist, weil die Shell $TERM expandiert und das Ergebnis an echo gibt. Shells behandeln viele Spezialzeichen, so genannte Metazeichen, als besondere Darstellungen für Daten. Das allgemeinste ist das Zeichen *, das eine beliebige Anzahl Zeichen in einem Dateinamen repräsentiert. Diese Metazeichen können zum Vervollständigen von Dateinamen (Globbing) benutzt werden. Beispielsweise liefert das Kommando echo * nahezu das gleiche wie die Eingabe von ls, da die Shell alle Dateinamen die mit * übereinstimmen, an echo weitergibt. Um zu verhindern, dass die Shell diese Sonderzeichen interpretiert, kann man sie schützen, indem man ihnen einen Backslash (\) voranstellt. echo $TERM gibt aus, auf was auch immer Ihr Terminal gesetzt ist. echo \$TERM gibt $TERM genauso aus, wie es hier steht. Ändern der Shell Der einfachste Weg Ihre Shell zu ändern, ist das Kommando chsh zu benutzen. chsh platziert Sie im Editor, welcher durch Ihre Umgebungsvariable EDITOR gesetzt ist, im vi wenn die Variable nicht gesetzt ist. Ändern Sie die Zeile mit Shell: entsprechend Ihren Wünschen. Sie können auch chsh mit der Option aufrufen, dann wird Ihre Shell gesetzt, ohne dass Sie in einen Editor gelangen. Um Ihre Shell zum Beispiel auf die bash zu ändern, geben Sie das folgende Kommando ein: &prompt.user; chsh -s /usr/local/bin/bash Die von Ihnen gewünschte Shell muss in /etc/shells aufgeführt sein. Haben Sie eine Shell aus der Ports-Sammlung installiert, sollte das schon automatisch erledigt werden. Installierten Sie die Shell von Hand, so müssen Sie sie dort eintragen. Haben Sie beispielsweise die bash nach /usr/local/bin installiert, geben Sie Folgendes ein: &prompt.root; echo "/usr/local/bin/bash" >> /etc/shells Danach können Sie chsh aufrufen. Text-Editoren Text Editoren Editoren Eine großer Teil der Konfiguration wird bei FreeBSD durch das Editieren von Textdateien erledigt. Deshalb ist es eine gute Idee, mit einem Texteditor vertraut zu werden. FreeBSD hat ein paar davon im Basissystem und sehr viel mehr in der Ports-Sammlung. ee Text Editoren ee Der am leichtesten und einfachsten zu erlernende Editor nennt sich ee, was für easy editor steht. Um ee zu starten, gibt man in der Kommandozeile ee filename ein, wobei filename den Namen der zu editierenden Datei darstellt. Um zum Beispiel /etc/rc.conf zu editieren, tippen Sie ee /etc/rc.conf ein. Einmal im Editor, finden Sie alle Editor-Funktionen oben im Display aufgelistet. Das Einschaltungszeichen ^ steht für die Ctrl (oder Strg) Taste, mit ^e ist also die Tastenkombination Ctrle gemeint. Um ee zu verlassen, drücken Sie Esc und wählen dann aus. Der Editor fragt nach, ob Sie speichern möchten, wenn die Datei verändert wurde. vi Text Editoren vi emacs Text Editoren emacs FreeBSD verfügt über leistungsfähigere Editoren wie vi als Teil des Basissystems, andere Editoren wie emacs oder vim sind Teil der Ports-Sammlung. Diese Editoren bieten höhere Funktionalität und Leistungsfähigkeit, jedoch auf Kosten einer etwas schwierigeren Erlernbarkeit. Wenn Sie viele Textdateien editieren, sparen Sie auf lange Sicht mehr Zeit durch das Erlernen von Editoren wie vim oder emacs ein. Viele Anwendungen, die Dateien verändern oder Texteingabe erwarten, werden automatisch einen Texteditor öffnen. Um den Standardeditor zu ändern, setzen Sie die Umgebungsvariable EDITOR. Um mehr darüber zu erfahren, lesen Sie den Abschnitt Shells. Geräte und Gerätedateien Der Begriff Gerät wird meist in Verbindung mit Hardware wie Laufwerken, Druckern, Grafikkarten oder Tastaturen gebraucht. Der Großteil der Meldungen, die beim Booten von FreeBSD angezeigt werden, beziehen sich auf gefundene Geräte. Sie können sich die Bootmeldungen später in /var/run/dmesg.boot ansehen. Gerätenamen, die Sie wahrscheinlich in den Bootmeldungen sehen werden, sind zum Beispiel acd0, das erste IDE CD-ROM oder kbd0, die Tastatur. Auf die meisten Geräte wird unter &unix; Systemen über spezielle Gerätedateien im /dev Verzeichnis zugegriffen. Anlegen von Gerätedateien Wenn sie ein neues Gerät zu Ihrem System hinzufügen, oder die Unterstützung für zusätzliche Geräte kompilieren, müssen ein oder mehrere Gerätedateien erstellt werden. <literal>DEVFS</literal> (Gerätedateisystem) Das Gerätedateisystem DEVFS ermöglicht durch den Namensraum des Dateisystems Zugriff auf den Namensraum der Geräte im Kernel. Damit müssen Gerätedateien nicht mehr extra angelegt werden, sondern werden von DEVFS verwaltet. Weitere Informationen finden Sie in &man.devfs.5;. Binärformate Um zu verstehen, warum &os; das Format &man.elf.5; benutzt, müssen Sie zunächst etwas über die drei gegenwärtig dominanten ausführbaren Formate für &unix; Systeme wissen: &man.a.out.5; Das älteste und klassische Objektformat von &unix; Systemen. Es benutzt einen kurzen, kompakten Header mit einer magischen Nummer am Anfang, die oft benutzt wird, um das Format zu charakterisieren (weitere Details finden Sie unter &man.a.out.5;). Es enthält drei geladene Segmente: .text, .data und .bss, sowie eine Symboltabelle und eine Stringtabelle. COFF Das Objektformat von SVR3. Der Header enthält nun eine Sectiontable. Man kann also mit mehr als nur den Sections .text, .data und .bss arbeiten. &man.elf.5; Der Nachfolger von COFF. Kennzeichnend sind mehrere Sections und mögliche 32-Bit- oder 64-Bit-Werte. Ein wesentlicher Nachteil: ELF wurde auch unter der Annahme entworfen, dass es nur eine ABI (Application Binary Interface) pro Systemarchitektur geben wird. Tatsächlich ist diese Annahme falsch – nicht einmal für die kommerzielle SYSV-Welt (in der es mindestens drei ABIs gibt: SVR4, Solaris, SCO) trifft sie zu. FreeBSD versucht, dieses Problem zu umgehen, indem ein Werkzeug bereitgestellt wird, um ausführbare Dateien im ELF-Format mit Informationen über die ABI zu versehen, zu der sie passen. Weitere Informationen finden Sie in der Manualpage &man.brandelf.1;. FreeBSD kommt aus dem klassischen Lager und verwendete traditionell das Format &man.a.out.5;, eine Technik, die bereits über viele BSD-Releases hinweg eingesetzt und geprüft worden ist. Obwohl es bereits seit einiger Zeit möglich war, auf einem FreeBSD-System auch Binaries (und Kernel) im ELF-Format zu erstellen und auszuführen, widersetzte FreeBSD sich anfangs dem Druck, auf ELF als Standardformat umzusteigen. Warum? Nun, als das Linux-Lager die schmerzhafte Umstellung auf ELF durchführte, ging es nicht so sehr darum, dem ausführbaren Format a.out zu entkommen, als dem unflexiblen, auf Sprungtabellen basierten Mechanismus für Shared-Libraries der die Konstruktion von Shared-Libraries für Hersteller und Entwickler gleichermaßen sehr kompliziert machte. Da die verfügbaren ELF-Werkzeuge eine Lösung für das Problem mit den Shared-Libraries anboten und ohnehin generell als ein Schritt vorwärts angesehen wurden, wurde der Aufwand für die Umstellung als notwendig akzeptiert und die Umstellung wurde durchgeführt. Unter FreeBSD ist der Mechanismus von Shared-Libraries enger an den Stil des Shared-Library-Mechanismus von Suns &sunos; angelehnt und von daher sehr einfach zu verwenden. Ja, aber warum gibt es so viele unterschiedliche Formate? In alter, grauer Vorzeit gab es simple Hardware. Diese simple Hardware unterstützte ein einfaches, kleines System. a.out war absolut passend für die Aufgabe, Binaries auf diesem simplen System (eine PDP-11) darzustellen. Als &unix; von diesem simplen System portiert wurde, wurde auch das a.out-Format beibehalten, weil es für die frühen Portierungen auf Architekturen wie den Motorola 68000 und VAX ausreichte. Dann dachte sich ein schlauer Hardware-Ingenieur, dass, wenn er Software zwingen könnte, einige Tricks anzustellen, es ihm möglich wäre, ein paar Gatter im Design zu sparen, und seinen CPU-Kern schneller zu machen. Obgleich es dazu gebracht wurde, mit dieser neuen Art von Hardware (heute als RISC bekannt) zu arbeiten, war a.out für diese Hardware schlecht geeignet. Deshalb wurden viele neue Formate entwickelt, um eine bessere Leistung auf dieser Hardware zu erreichen, als mit dem begrenzten, simplen a.out-Format. Dinge wie COFF, ECOFF und einige andere obskure wurden erdacht und ihre Grenzen untersucht, bevor die Dinge sich in Richtung ELF entwickelten. Hinzu kam, dass die Größe von Programmen gewaltig wurde und Festplatten sowie physikalischer Speicher immer noch relativ klein waren. Also wurde das Konzept von Shared-Libraries geboren. Das VM-System wurde auch immer fortgeschrittener. Obwohl bei jedem dieser Fortschritte das a.out-Format benutzt worden ist, wurde sein Nutzen mit jedem neuen Merkmal mehr und mehr gedehnt. Zusätzlich wollte man Dinge dynamisch zur Ausführungszeit laden, oder Teile ihres Programms nach der Initialisierung wegwerfen, um Hauptspeicher oder Swap-Speicher zu sparen. Programmiersprachen wurden immer fortschrittlicher und man wollte, dass Code automatisch vor der main-Funktion aufgerufen wird. Das a.out-Format wurde oft überarbeitet, um alle diese Dinge zu ermöglichen und sie funktionierten auch für einige Zeit. a.out konnte diese Probleme nicht ohne ein ständiges Ansteigen eines Overheads im Code und in der Komplexität handhaben. Obwohl ELF viele dieser Probleme löste, wäre es sehr aufwändig, ein System umzustellen, das im Grunde genommen funktionierte. Also musste ELF warten, bis es aufwändiger war, bei a.out zu bleiben, als zu ELF überzugehen. Im Laufe der Zeit haben sich die Erstellungswerkzeuge, von denen FreeBSD seine Erstellungswerkzeuge abgeleitet hat (speziell der Assembler und der Loader), in zwei parallele Zweige entwickelt. Im FreeBSD-Zweig wurden Shared-Libraries hinzugefügt und einige Fehler behoben. Das GNU-Team, das diese Programme ursprünglich geschrieben hat, hat sie umgeschrieben und eine simplere Unterstützung zur Erstellung von Cross-Compilern durch beliebiges Einschalten verschiedener Formate usw. hinzugefügt. Viele Leute wollten Cross-Compiler für FreeBSD erstellen, aber sie hatten kein Glück, denn FreeBSD's ältere Sourcen für as und ld waren hierzu nicht geeignet. Die neuen GNU-Werkzeuge (binutils) unterstützen Cross-Compilierung, ELF, Shared-Libraries, C++-Erweiterungen und mehr. Weiterhin geben viele Hersteller ELF-Binaries heraus und es ist gut, wenn FreeBSD sie ausführen kann. ELF ist ausdrucksfähiger als a.out und gestattet eine bessere Erweiterbarkeit des Basissystems. Die ELF-Werkzeuge werden besser gewartet und bieten Unterstützung von Cross-Compilierung, was für viele Leute wichtig ist. ELF mag etwas langsamer sein, als a.out, aber zu versuchen, das zu messen, könnte schwierig werden. Es gibt unzählige Details, in denen sich die beiden Formate unterscheiden, wie sie Pages abbilden, Initialisierungscode handhaben usw. Keins davon ist sehr wichtig, aber es sind Unterschiede. Irgendwann wird die Unterstützung für Programme im a.out-Format aus dem GENERIC-Kernel entfernt werden. Wenn es dann keinen oder kaum noch Bedarf für die Unterstützung dieses Formates gibt, werden die entsprechenden Routinen ganz entfernt werden. Weitere Informationen Manualpages Manualpages Die umfassendste Dokumentation rund um FreeBSD gibt es in Form von Manualpages. Annähernd jedes Programm im System bringt eine kurze Referenzdokumentation mit, die die grundsätzliche Funktion und verschiedene Parameter erklärt. Diese Dokumentationen kann man mit dem man Kommando benutzen. Die Benutzung des man Kommandos ist einfach: &prompt.user; man Kommando Kommando ist der Name des Kommandos, über das Sie etwas erfahren wollen. Um beispielsweise mehr über das Kommando ls zu lernen, geben Sie ein: &prompt.user; man ls Die Online-Dokumentation ist in nummerierte Sektionen unterteilt: Benutzerkommandos. Systemaufrufe und Fehlernummern. Funktionen der C Bibliothek. Gerätetreiber. Dateiformate. Spiele und andere Unterhaltung. Verschiedene Informationen. Systemverwaltung und -Kommandos. Kernel Entwickler. In einigen Fällen kann dasselbe Thema in mehreren Sektionen auftauchen. Es gibt zum Beispiel ein chmod Benutzerkommando und einen chmod() Systemaufruf. In diesem Fall können Sie dem man Kommando sagen, aus welcher Sektion Sie die Information erhalten möchten, indem Sie die Sektion mit angeben: &prompt.user; man 1 chmod Dies wird Ihnen die Manualpage für das Benutzerkommando chmod zeigen. Verweise auf eine Sektion der Manualpages werden traditionell in Klammern gesetzt. So bezieht sich &man.chmod.1; auf das Benutzerkommando chmod und mit &man.chmod.2; ist der Systemaufruf gemeint. Das ist nett, wenn Sie den Namen eines Kommandos wissen, und lediglich wissen wollen, wie es zu benutzen ist. Aber was tun Sie, wenn Sie Sich nicht an den Namen des Kommandos erinnern können? Sie können mit man nach Schlüsselbegriffen in den Kommandobeschreibungen zu suchen, indem Sie den Parameter benutzen: &prompt.user; man -k mail Mit diesem Kommando bekommen Sie eine Liste der Kommandos, deren Beschreibung das Schlüsselwort mail enthält. Diese Funktionalität erhalten Sie auch, wenn Sie das Kommando apropos benutzen. Nun, Sie schauen Sich alle die geheimnisvollen Kommandos in /usr/bin an, haben aber nicht den blassesten Schimmer, wozu die meisten davon gut sind? Dann rufen Sie doch einfach das folgende Kommando auf: &prompt.user; cd /usr/bin &prompt.user; man -f * Dasselbe erreichen Sie durch Eingabe von: &prompt.user; cd /usr/bin &prompt.user; whatis * GNU Info Dateien FreeBSD enthält viele Anwendungen und Utilities der Free Software Foundation (FSF). Zusätzlich zu den Manualpages bringen diese Programme ausführlichere Hypertext-Dokumente (info genannt) mit, welche man sich mit dem Kommando info ansehen kann. Wenn Sie emacs installiert haben, können Sie auch dessen info-Modus benutzen. Um das Kommando &man.info.1; zu benutzen, geben Sie einfach ein: &prompt.user; info Eine kurze Einführung gibt es mit h; eine Befehlsreferenz erhalten Sie durch Eingabe von: ?.
diff --git a/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml b/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml index 096a247aac..df7e974048 100644 --- a/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/bibliography/chapter.sgml @@ -1,701 +1,696 @@ Bibliografie Übersetzt von &a.de.gruender; Während die Manualpages die endgültige Auskunft über bestimmte Teile des FreeBSD-Betriebssystems geben, so können sie jedoch nicht darstellen, wie man die einzelnen Teile zusammenfügt, um ein vollständig laufendes Betriebssystem herzustellen. Daher gibt es keinen Ersatz für ein gutes Buch über die Administration von &unix; Systemen und ein gutes Benutzerhandbuch. In der Regel handelt es sich im folgenden Kapitel um englische Ausgaben der genannten Werke. Übersetzungen oder Ausgaben in anderen Sprachen sind mit entsprechenden Hinweisen versehen. Bücher und Magazine speziell für FreeBSD Internationale Bücher und Magazine: Using FreeBSD, herausgegeben von Drmaster, 1997 (in traditionellem Chinesisch). ISBN 9-578-39435-7. FreeBSD Unleashed (in vereinfachtem Chinesisch), herausgegeben von China Press. ISBN 7-111-10201-0. FreeBSD From Scratch First Edition (in vereinfachtem Chinesisch), herausgegeben von China Press. ISBN 7-111-07482-3. FreeBSD From Scratch Second Edition (in vereinfachtem Chinesisch), herausgegeben von China Press. ISBN 7-111-10286-X. FreeBSD Handbook Second Edition (in vereinfachtem Chinesisch), herausgegeben von Posts & Telecom Press. ISBN 7-115-10541-3. FreeBSD 3.x Internet (in vereinfachtem Chinesisch), herausgegeben von Tsinghua University Press. ISBN 7-900625-66-6. FreeBSD & Windows (in vereinfachtem Chinesisch), herausgegeben von China Railway Publishing House. ISBN 7-113-03845-X. FreeBSD Internet Services HOWTO (in vereinfachtem Chinesisch), herausgegeben von China Railway Publishing House. ISBN 7-113-03423-3. FreeBSD for PC 98'ers (in japanischer Sprache), herausgegeben von SHUWA System Co, LTD. ISBN 4-87966-468-5 C3055 P2900E. FreeBSD (in japanischer Sprache), herausgegeben von CUTT. ISBN 4-906391-22-2 C3055 P2400E. Complete Introduction to FreeBSD (in Japanese), published by Shoeisha Co., Ltd. ISBN 4-88135-473-6 P3600E. Personal UNIX Starter Kit FreeBSD (in japanischer Sprache), herausgegeben von ASCII. ISBN 4-7561-1733-3 P3000E. FreeBSD Handbook (japanische Übersetzung), herausgegeben von ASCII. ISBN 4-7561-1580-2 P3800E. FreeBSD mit Methode (in deutscher Sprache), herausgegeben von Computer und Literatur Verlag /Vertrieb Hanser, 1998. ISBN 3-932311-31-0. FreeBSD 4 - Installieren, Konfigurieren, Administrieren (in deutscher Sprache), herausgegeben von Computer und Literatur Verlag, 2001. ISBN 3-932311-88-4. FreeBSD 5 – Installieren, Konfigurieren, Administrieren (in deutscher Sprache), herausgegeben von Computer und Literatur Verlag, 2001. ISBN 3-936546-06-1. FreeBSD de Luxe (in German), published by Verlag Modere Industrie, 2003. ISBN 3-8266-1343-0. FreeBSD Install and Utilization Manual (in japanischer Sprache), herausgegeben von Mainichi Communications Inc., 1998. ISBN 4-8399-0112-0. Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo Building Internet Server with FreeBSD (in indonesischer Sprache), herausgegeben von Elex Media Komputindo. Absolute BSD: The Ultimate Guide to FreeBSD (in traditionellem Chinesisch), herausgegeben von GrandTech Press, 2003. ISBN 986-7944-92-5. The FreeBSD 6.0 Book (in traditionellem Chinesisch, herausgegeben von Drmaster, 2006. ISBN 9-575-27878-X. Englischsprachige Bücher und Magazine: Absolute BSD: The Ultimate Guide to FreeBSD, herausgegeben von No Starch Press, 2002. ISBN: 1886411743 The Complete FreeBSD, herausgegeben von O'Reilly, 2003. ISBN: 0596005164 The FreeBSD Corporate Networker's Guide, herausgegeben von Addison-Wesley, 2002. ISBN: 0201704811 FreeBSD: An Open-Source Operating System for Your Personal Computer, herausgegeben von The Bit Tree Press, 2001. ISBN: 0971204500 Teach Yourself FreeBSD in 24 Hours, herausgegeben von Sams, 2002. ISBN: 0672324245 FreeBSD6 Unleashed, herausgegeben von Sams, 2006. ISBN: 0672328755 FreeBSD: The Complete Reference, herausgegeben von McGrawHill, 2003. ISBN: 0072224096 Handbücher Computer Systems Research Group, UC Berkeley. 4.4BSD User's Reference Manual. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-075-9 Computer Systems Research Group, UC Berkeley. 4.4BSD User's Supplementary Documents. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-076-7 UNIX in a Nutshell. O'Reilly & Associates, Inc., 1990. ISBN 093717520X Mui, Linda. What You Need To Know When You Can't Find Your UNIX System Administrator. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-104-6 Die Ohio State University hat ein UNIX Introductory Course veröffentlicht, welcher auch online im HTML- und PostScriptformat verfügbar ist. Eine italienische Übersetzung ist Teil des &os; Italian Documentation Projects. Jpman Project, Japan FreeBSD Users Group. FreeBSD User's Reference Manual (japanische Übersetzung). Mainichi Communications Inc., 1998. ISBN4-8399-0088-4 P3800E. Edinburgh University hat einen Online Guide für Anfänger in Sachen UNIX geschrieben. Administrations-Anleitungen Albitz, Paul and Liu, Cricket. DNS and BIND, 4th Ed. O'Reilly & Associates, Inc., 2001. ISBN 1-59600-158-4 Computer Systems Research Group, UC Berkeley. 4.4BSD System Manager's Manual. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-080-5 Costales, Brian, et al. Sendmail, 2nd Ed. O'Reilly & Associates, Inc., 1997. ISBN 1-56592-222-0 Frisch, Æleen. Essential System Administration, 2nd Ed. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-127-5 Hunt, Craig. TCP/IP Network Administration, 2nd Ed. O'Reilly & Associates, Inc., 1997. ISBN 1-56592-322-7 Nemeth, Evi. UNIX System Administration Handbook. 3rd Ed. Prentice Hall, 2000. ISBN 0-13-020601-6 Stern, Hal Managing NFS and NIS O'Reilly & Associates, Inc., 1991. ISBN 0-937175-75-7 Jpman Project, Japan FreeBSD Users Group. FreeBSD System Administrator's Manual (japanische Übersetzung). Mainichi Communications Inc., 1998. ISBN4-8399-0109-0 P3300E. Dreyfus, Emmanuel. Cahiers de l'Admin: BSD 2nd Ed. (in French), Eyrolles, 2004. ISBN 2-212-11463-X. Programmierhandbücher Asente, Paul, Paul, Converse, Diana, and Swick, Ralph. X Window System Toolkit. Digital Press, 1998. ISBN 1-55558-178-1 Computer Systems Research Group, UC Berkeley. 4.4BSD Programmer's Reference Manual. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-078-3 Computer Systems Research Group, UC Berkeley. 4.4BSD Programmer's Supplementary Documents. O'Reilly & Associates, Inc., 1994. ISBN 1-56592-079-1 Harbison, Samuel P. and Steele, Guy L. Jr. C: A Reference Manual. 4th ed. Prentice Hall, 1995. ISBN 0-13-326224-3 Kernighan, Brian and Dennis M. Ritchie. The C Programming Language. 2nd Ed., PTR Prentice Hall, 1988. ISBN 0-13-110362-9 Lehey, Greg. Porting UNIX Software. O'Reilly & Associates, Inc., 1995. ISBN 1-56592-126-7 Plauger, P. J. The Standard C Library. Prentice Hall, 1992. ISBN 0-13-131509-9 Spinellis, Diomidis. Code Reading: The Open Source Perspective. Addison-Wesley, 2003. ISBN 0-201-79940-5 Spinellis, Diomidis. Code Quality: The Open Source Perspective. Addison-Wesley, 2006. ISBN 0-321-16607-8 Stevens, W. Richard and Stephen A. Rago. Advanced Programming in the UNIX Environment. 2nd Ed. Reading, Mass. : Addison-Wesley, 2005. ISBN 0-201-43307-9 Stevens, W. Richard. UNIX Network Programming. 2nd Ed, PTR Prentice Hall, 1998. ISBN 0-13-490012-X Wells, Bill. Writing Serial Drivers for UNIX. Dr. Dobb's Journal. 19(15), December 1994. pp68-71, 97-99. Betriebssystem-Interna Andleigh, Prabhat K. UNIX System Architecture. Prentice-Hall, Inc., 1990. ISBN 0-13-949843-5 Jolitz, William. Porting UNIX to the 386. Dr. Dobb's Journal. January 1991-July 1992. Leffler, Samuel J., Marshall Kirk McKusick, Michael J Karels and John Quarterman The Design and Implementation of the 4.3BSD UNIX Operating System. Reading, Mass. : Addison-Wesley, 1989. ISBN 0-201-06196-1 Kapitel 2 dieses Buchs ist Teil des FreeBSD Documentation Projects und online erhältlich. Kapitel 9 findet sich hier. Leffler, Samuel J., Marshall Kirk McKusick, The Design and Implementation of the 4.3BSD UNIX Operating System: Answer Book. Reading, Mass. : Addison-Wesley, 1991. ISBN 0-201-54629-9 McKusick, Marshall Kirk, Keith Bostic, Michael J Karels, and John Quarterman. The Design and Implementation of the 4.4BSD Operating System. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-54979-4 Marshall Kirk McKusick, George V. Neville-Neil. The Design and Implementation of the &os; Operating System. Boston, Mass. : Addison-Wesley, 2004. ISBN 0-201-70245-2 Stevens, W. Richard. TCP/IP Illustrated, Volume 1: The Protocols. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63346-9 Schimmel, Curt. Unix Systems for Modern Architectures. Reading, Mass. : Addison-Wesley, 1994. ISBN 0-201-63338-8 Stevens, W. Richard. TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP and the UNIX Domain Protocols. Reading, Mass. : Addison-Wesley, 1996. ISBN 0-201-63495-3 Vahalia, Uresh. UNIX Internals -- The New Frontiers. Prentice Hall, 1996. ISBN 0-13-101908-2 Wright, Gary R. and W. Richard Stevens. TCP/IP Illustrated, Volume 2: The Implementation. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63354-X Sicherheits-Anleitung Cheswick, William R. and Steven M. Bellovin. Firewalls and Internet Security: Repelling the Wily Hacker. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-63357-4 Garfinkel, Simson and Gene Spafford. Practical UNIX & Internet Security. 2nd Ed. O'Reilly & Associates, Inc., 1996. ISBN 1-56592-148-8 Garfinkel, Simson. PGP Pretty Good Privacy O'Reilly & Associates, Inc., 1995. ISBN 1-56592-098-8 Hardware-Anleitung Anderson, Don and Tom Shanley. Pentium Processor System Architecture. 2nd Ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40992-5 Ferraro, Richard F. Programmer's Guide to the EGA, VGA, and Super VGA Cards. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-62490-7 Die Intel Corporation veröffentlicht Dokumentationen Ihrer CPUs, Chipsets und Standards auf ihrer developer web site, normalerweise als PDF-Dateien. Shanley, Tom. 80486 System Architecture. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40994-1 Shanley, Tom. ISA System Architecture. 3rd ed. Reading, Mass. : Addison-Wesley, 1995. ISBN 0-201-40996-8 Shanley, Tom. PCI System Architecture. 4th ed. Reading, Mass. : Addison-Wesley, 1999. ISBN 0-201-30974-2 Van Gilluwe, Frank. The Undocumented PC, 2nd Ed. Reading, Mass: Addison-Wesley Pub. Co., 1996. ISBN 0-201-47950-8 Messmer, Hans-Peter. The Indispensable PC Hardware Book, 4th Ed. Reading, Mass: Addison-Wesley Pub. Co., 2002. ISBN 0-201-59616-4 &unix; Geschichte Lion, John Lion's Commentary on UNIX, 6th Ed. With Source Code. ITP Media Group, 1996. ISBN 1573980137 Raymond, Eric S. The New Hacker's Dictionary, 3rd edition. MIT Press, 1996. ISBN 0-262-68092-0. Auch bekannt als das Jargon File Salus, Peter H. A quarter century of UNIX. Addison-Wesley Publishing Company, Inc., 1994. ISBN 0-201-54777-5 Simon Garfinkel, Daniel Weise, Steven Strassmann. The UNIX-HATERS Handbook. IDG Books Worldwide, Inc., 1994. ISBN 1-56884-203-1. Online verfügbar. Don Libes, Sandy Ressler Life with UNIX — special edition. Prentice-Hall, Inc., 1989. ISBN 0-13-536657-7 The BSD family tree. oder unter /usr/share/misc/bsd-family-tree auf einem FreeBSD-System. - - The BSD Release Announcements collection. - 1997. - - Networked Computer Science Technical Reports Library. Old BSD releases from the Computer Systems Research group (CSRG). : Das Paket mit 4 CD-ROMs enthält alle BSD-Versionen von 1BSD bis 4.4BSD und 4.4BSD-Lite2 (nicht aber 2.11BSD). Die letzte CD beinhaltet auch die finalen Sourcen inklusive den SCCS Dateien. Magazine und Journale The C/C++ Users Journal. R&D Publications Inc. ISSN 1075-2838 Sys Admin — The Journal for UNIX System Administrators Miller Freeman, Inc., ISSN 1061-2688 freeX – Das Magazin für Linux – BSD – UNIX (in deutscher Sprache), Computer- und Literaturverlag GmbH, ISSN 1436-7033 diff --git a/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml b/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml index e8099662f4..899c15f5c0 100644 --- a/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml @@ -1,1216 +1,1213 @@ Christophe Juniet Beigetragen von Martin Heinen Übersetzt von Desktop-Anwendungen Übersicht FreeBSD bietet eine reiche Auswahl an Desktop-Anwendungen, wie Browser und Textverarbeitungen, die als Pakete oder mit der Ports-Sammlung installiert werden. Gerade neue Benutzer erwarten Anwendungen mit einer grafischen Benutzeroberfläche an ihrem Arbeitsplatz. Dieses Kapitel zeigt Ihnen, wie Sie einige der beliebtesten Desktop-Anwendungen mühelos installieren. Wenn Sie Ports installieren, beachten Sie, dass dabei die Quelltexte der Programme übersetzt werden. Abhängig von dem Programm und der Geschwindigkeit Ihrer Maschinen kann das sehr lange dauern. Wenn Ihnen das Übersetzen zu lange dauert, können Sie die meisten Programme der Ports-Sammlung auch als fertige Pakete installieren. Da FreeBSD binär kompatibel zu Linux ist, können Sie zahlreiche für Linux entwickelte Desktop-Anwendungen einsetzen. Bevor Sie allerdings Linux-Anwendungen installieren, sollten Sie das lesen. Wenn Sie nach einem bestimmten Port suchen, zum Beispiel mit &man.whereis.1;, beachten Sie, dass die Namen vieler Programme, die die Linux-Binärkompatibilität benutzen, mit linux- anfangen. Wir gehen im Folgenden davon aus, dass Sie die Linux-Binärkompatibilität aktiviert haben, bevor Sie Linux-Anwendungen installieren. Dieses Kapitel behandelt Anwendungen aus den Bereichen: - Browser (Mozilla, + Browser (Firefox, Opera, - Firefox, Konqueror) Büroanwendungen (KOffice, AbiWord, The GIMP, OpenOffice.org) Dokumentformate(&acrobat.reader;, gv, Xpdf, GQview) Finanzsoftware ( GnuCash, Gnumeric, Abacus) Bevor Sie dieses Kapitel lesen, sollten Sie Software Dritter installieren können () und Linux-Anwendungen installieren können (). Wie Sie Multimedia-Anwendungen einrichten, wird in einem gesonderten Kapitel erklärt. Wie Sie E-Mail einrichten und benutzen, wird in beschrieben. Browser Browser Web FreeBSD besitzt keinen vorinstallierten Browser, stattdessen enthält das www-Verzeichnis der Ports-Sammlung Browser, die Sie installieren können. Wenn Ihnen das Übersetzen der Browser zu lange dauert, bei einigen Browsern dauert das wirklich lange, installieren Sie die Pakete, die es für viele Browser gibt. KDE und GNOME enthalten schon HTML-Browser. Das Einrichten dieser grafischen Benutzeroberflächen ist in beschrieben. Wenn Sie besonders schlanke Browser benötigen, suchen Sie in der Ports-Sammlung nach - www/dillo, + www/dillo2, www/links oder www/w3m. Dieser Abschnitt behandelt die nachstehenden Anwendungen: Anwendung Ressourcenbedarf Installationsaufwand aus den Ports wichtige Abhängigkeiten - Mozilla - hoch + Firefox + mittel hoch Gtk+ Opera niedrig niedrig Es gibt eine &os;- und eine Linux-Version. Die Linux-Version hängt von der Linux-Kompatibilität (Linux Binary Compatibility) und linux-openmotif ab. - - Firefox - mittel - hoch - Gtk+ - - Konqueror mittel hoch KDE-Biliotheken - - Mozilla - - Mozilla - - - Mozilla ist ein moderner, stabiler - und kompletter Browser, der nach FreeBSD portiert wurde. Er - entspricht dem HTML-Standard und verfügt über einen - E-Mail-Client und einen Newsreader. Für den Fall, dass Sie - einige HTML-Seiten selbst verfassen wollen, enthält der - Browser auch einen HTML-Editor. Wenn Sie - &netscape; kennen, wird Ihnen - vielleicht die Ähnlichkeit mit dem - Communicator auffallen. Dies liegt - daran, dass die beiden Programme eine gemeinsame - Entwicklungsgeschichte haben (und auf der gleichen - ursprünglichen Codebasis aufbauen). - - Auf langsamen Maschinen, deren CPU-Taktfrequenz weniger als - 233 MHz beträgt, oder die weniger als 64 MB Speicher - besitzen, können Sie Mozilla wegen - dessen Ressourcenbedarfs nur eingeschränkt benutzen. Weniger - Ressourcen verbraucht der Opera-Browser, - der gleich in diesem Kapitel behandelt wird. - - Für den Fall, dass Sie Mozilla - nicht selbst übersetzen wollen, hat das FreeBSD-GNOME-Team - schon ein Paket für Sie erstellt, das Sie über das Netz - installieren können: - - &prompt.root; pkg_add -r mozilla - - Wenn das Paket nicht zur Verfügung steht und Sie - genügend Zeit und Plattenplatz haben, können Sie - Mozilla mit den nachstehenden Befehlen - selbst übersetzen und installieren: - - &prompt.root; cd /usr/ports/www/mozilla -&prompt.root; make install clean - - Das Erscheinungsbild von Mozilla - können Sie mit so genannten - Themes oder - Gestures beeinflussen. Der - Mozilla-Port sorgt für die richtige - Installation des Chrome-Themes. Die Installation weiterer - Zusatzkomponenten erfordert allerdings - root-Rechte. - - Nachdem Sie die Installation von - Mozilla abgeschlossen haben, - benötigen Sie die root-Rechte nicht mehr. - Starten Sie den Browser dann einfach mit dem Kommando: - - &prompt.user; mozilla - - Sie können auch den E-Mail-Client oder den Newsreader - direkt starten: - - &prompt.user; mozilla -mail - - Firefox Firefox - Firefox ist ein auf dem - Mozilla-Code basierender - Browser. Während es sich bei - Mozilla um ein komplettes - Anwendungspaket (bestehend aus Browser, E-Mail-Programm, - Chatclient und anderem mehr) handelt, konzentriert sich - Firefox auf die Aufgabe als - Browser, was das Programm kleiner und schneller macht. + Firefox ist ein moderner, freier und + stabiler Open-Source Browser, der vollständig auf &os; portiert + wurde. Er bietet eine dem HTML-Standard konforme Anzeige, + Browserfenster als Tabs, Blockierung von Werbefenstern, Erweiterungen, + verbesserte Sicherheit und mehr. Firefox + basiert auf der Mozilla Codebasis. Das Paket können Sie mit dem nachstehenden Befehl installieren: &prompt.root; pkg_add -r firefox + Damit installieren Sie Firefox 2.X, wenn + Sie stattdessen Firefox 3.X einsetzen + möchten, geben Sie folgenden Befehl ein: + + &prompt.root; pkg_add -r firefox3 + + Alternativ können Sie auch die Ports-Sammlung verwenden, um das Programm aus dem Quellcode zu installieren: &prompt.root; cd /usr/ports/www/firefox &prompt.root; make install clean + + Ersetzen Sie im vorherigen Kommando firefox + durch firefox3 für + Firefox 3.X. - Firefox, Mozilla und das &java;-Plugin + Firefox und das &java;-Plugin Dieser und der nächste Abschnitt gehen davon aus, - dass Sie Firefox oder - Mozilla bereits installiert + dass Sie Firefox bereits installiert haben. Die &os; Foundation hat von Sun Microsystems eine Lizenz erworben, die es erlaubt, &os;-Binärpakete des Java Runtime Environment (&jre;) und des Java Development Kit (&jdk;) zu verteilen. Diese Binärpakete sind auf der Webseite der &os; Foundation erhältlich. - Damit Firefox oder - Mozilla &java; unterstützen, + Damit Firefox &java; unterstützt, müssen Sie zuerst den Port java/javavmwrapper installieren. Anschließend laden Sie das - Diablo &jre;-Paket - von Diablo &jre;-Paket von herunter und installieren es mit &man.pkg.add.1;. Danach starten Sie Ihren Browser und geben in der Adresszeile about:plugins ein und bestätigen die Eingabe mit der Enter-Taste. Dadurch wird eine Seite geladen, auf der alle installierten Plugins aufgelistet werden. Auch das &java;-Plugin sollte nun in dieser Liste aufgeführt sein. Sollte dies bei Ihnen - nicht der Fall sein, müssen Sie als - root noch den folgenden Befehl + nicht der Fall sein, muss jeder Benutzer noch das folgende Kommando ausführen: - &prompt.root; ln -s /usr/local/diablo-jre1.5.0/plugin/i386/ns7/libjavaplugin_oji.so \ - /usr/local/lib/browser_plugins/ + &prompt.user; ln -s /usr/local/diablo-jre1.6.0/plugin/i386/ns7/libjavaplugin_oji.so \ + $HOME/.mozilla/plugins/ + + Oder, falls Sie das Diablo &jdk;-Paket + installiert haben: + + &prompt.user; ln -s /usr/local/diablo-jdk1.6.0/jre/plugin/i386/ns7/libjavaplugin_oji.so \ + $HOME/.mozilla/plugins/ Danach starten Sie Ihren Browser neu, um das Plugin zu aktivieren. - Firefox, Mozilla und das ¯omedia; &flash;-Plugin + Firefox und das ¯omedia; &flash;-Plugin + + Flash + Das ¯omedia; &flash;-Plugin ist für &os; nicht verfügbar. Es existiert jedoch ein Software-Layer (ein sogenannter Wrapper), der es erlaubt, die Linux-Version des Plugins unter &os; einzusetzen. Dieser Wrapper unterstützt außerdem das &adobe; &acrobat;-Plugin, das &realplayer;-Plugin und andere mehr. - Als erstes installieren Sie den Port www/linuxpluginwrapper. Dieser Port - setzt voraus, dass Sie den Port emulators/linux_base bereits - installiert haben. Folgen Sie exakt den bei der Installation - des Ports gegebenen Anweisungen, um die Datei - /etc/libmap.conf korrekt zu konfigurieren, - da ansonsten das Plugin später nicht erkannt wird. - Beispielkonfigurationen finden Sie im Verzeichnis - /usr/local/share/examples/linuxpluginwrapper/. - - Anschließend installieren Sie den Port www/linux-flashplugin7. Nachdem Sie - das Plugin installiert haben, rufen Sie Ihren Browser auf und - geben in der Adresszeile about:plugins - ein. Diese Eingabe muss mit der Enter-Taste - bestätigt werden. Danach wird eine Seite geladen, auf der - alle installierten Plugins aufgelistet werden. - - Sollte das &flash;-Plugin bei Ihnen nicht aufgelistet sein, - liegt dies in der Regel an einem fehlenden symbolischen Link. - In diesem Fall führen Sie als root - die folgenden Befehle aus: - - &prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/libflashplayer.so \ - /usr/local/lib/browser_plugins/ -&prompt.root; ln -s /usr/local/lib/npapi/linux-flashplugin/flashplayer.xpt \ - /usr/local/lib/browser_plugins/ - - Nach einem Neustart sollte das Plugin nun in der Liste - der installierten Plugins auftauchen. + Je nachdem, welche Version von &os; Sie verwenden, sind + unterschiedliche Schritte notwendig: + + + + Für &os; 7.X + + Installieren Sie den Port www/nspluginwrapper. Dieser Port + setzt voraus, dass Sie den Port emulators/linux_base-fc4 bereits + installiert haben, der sehr gross ist. + + Anschließend installieren Sie den Port www/linux-flashplugin9. Dadurch wird + &flash; 9.X installiert, denn diese Version läuft + zuverlässig auf &os; 7.X. + + + Bei &os; Versionen, die älter sind als &os; 7.1-RELEASE + müssen Sie www/linux-flashplugin7 installieren und + den &man.linprocfs.5; Abschnitt übergehen. + + + + + Für &os; 8.X + + Installieren Sie den Port www/nspluginwrapper. Dieser Port + benötigt den emulators/linux_base-f10 Port, der sehr + gross ist. + + Als nächstes installieren Sie den Port www/linux-f10-flashplugin10. Dadurch + wird &flash; 10.X installiert, das in dieser Version unter + &os; 8.X stabil läuft. + + Für diese Version muss der folgende symbolische Link + angelegt werden: + + &prompt.root; ln -s /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so \ + /usr/local/lib/browser_plugins/ + + + + Sobald der richtige &flash;-Port passend zu ihrer &os; Version + installiert ist, muss das Plugin von jedem Benutzer mittels + nspluginwrapper installiert werden: + + &prompt.user; nspluginwrapper -v -a -i + + Das &linux; Prozessdateisystem, &man.linprocfs.5;, muss unter + /usr/compat/linux/proc eingehängt + werden, wenn Sie &flash;-Animationen abspielen möchten. Dies + kann mittels des folgenden Kommandos geschehen: + + &prompt.root; mount -t linprocfs linproc /usr/compat/linux/proc + + Dieser Schritt kann automatisiert zur Bootzeit ablaufen, indem Sie + die passende Zeile in /etc/fstab eintragen: + + linproc /usr/compat/linux/proc linprocfs rw 0 0 + + Rufen Sie dann Ihren Browser auf und geben in der Adresszeile + about:plugins ein. Diese Eingabe muss mit der + Enter-Taste bestätigt werden. Danach wird eine + Seite geladen, auf der alle installierten Plugins aufgelistet + werden. + - - Der linuxpluginwrapper - funktioniert nur unter der &i386;-Architektur. - + + Firefox und das Swfdec &flash;-Plugin + + Swfdec ist die Bibliothek zum Dekodieren und Rendern von &flash; + Animationen. Swfdec-Mozilla ist ein Plugin für + Firefox-Browser, welches die + Swfdec-Bibliothek zum Abspielen von SWF-Dateien benutzt. Momentan + befindet sie sich noch in der Entwicklung. + + Wenn Sie diese nicht übersetzen können oder wollen, + dann installieren Sie einfach das Paket aus dem Netz: + + &prompt.root; pkg_add -r swfdec-plugin + + Wenn das Paket nicht verfügbar ist, können Sie es auch + über die Ports-Sammlung bauen und installieren: + + &prompt.root; cd /usr/ports/www/swfdec-plugin +&prompt.root; make install clean + + Starten Sie anschliessend ihren Browser neu, damit dieses Plugin + aktiviert wird. Opera Opera Opera ist ein schneller, vollwertiger und standardkonformer Browser, der wie Mozilla über einen eingebauten E-Mail- und Newsreader verfügt. Zusätzlich sind ein IRC-Client, ein RSS/Atom-Feeds-Reader sowie weitere Programme enthalten. Dennoch handelt es sich bei Opera weiterhin um ein relativ kleines und sehr schnelles Programmpaket. Sie haben die Wahl zwei Versionen dieses Browsers: Der nativen FreeBSD-Version und der Linux-Version. Wenn Sie das Web mit der FreeBSD-Version von Opera erkunden wollen, installieren Sie das Paket: &prompt.root; pkg_add -r opera Einige FTP-Server haben nicht alle Pakete, Sie können Opera aber über die Ports-Sammlung installieren: &prompt.root; cd /usr/ports/www/opera &prompt.root; make install clean Wenn Sie die Linux-Version des Browsers verwenden wollen, ersetzen Sie in den Beispielen opera durch linux-opera. Wenn Sie Plugins einsetzen wollen, die nur für Linux erhältlich sind, wie das Adobe &acrobat.reader; Plugin, benötigen Sie die Linux-Version. Ansonsten sind die FreeBSD- und Linux-Versionen des Browsers äquivalent. Konqueror Konqueror Konqueror ist Teil von KDE, kann aber außerhalb von KDE benutzt werden, wenn der Port x11/kdebase3 installiert ist. Konqueror ist mehr als nur ein Browser. Sie können das Programm weiters zur Dateiverwaltung und zum Abspielen von Multimedia-Dateien benutzen. Der Port misc/konq-plugins installiert verschiedene Plugins für Konqueror. Konqueror kann &flash;-Seiten darstellen. Wie Sie die &flash;-Unterstützung - aktiviern, können Sie unter - + aktiviern, können Sie unter nachlesen. Büroanwendungen Neue Benutzer suchen oft ein komplettes Office-Paket oder eine leicht zu bedienende Textverarbeitung. Einige Benutzeroberflächen wie KDE enthalten zwar ein Office-Paket, diese werden in der Standardeinstellung unter FreeBSD aber nicht installiert. Unabhängig von der verwendeten Benutzeroberfläche können Sie diverse Office-Pakete aber jederzeit über die Ports-Sammlung installlieren. Dieser Abschnitt behandelt die nachstehenden Anwendungen: Anwendung Ressourcenbedarf Installationsaufwand aus den Ports wichtige Abhängigkeiten KOffice niedrig hoch KDE AbiWord niedrig niedrig Gtk+ oder GNOME The Gimp niedrig hoch Gtk+ OpenOffice.org hoch enorm &jdk; 1.4, Mozilla KOffice KOffice Office-Pakete KOffice Die KDE-Gemeinschaft stellt ein Office-Paket bereit, das auch außerhalb von KDE eingesetzt werden kann. Es besteht aus vier, von anderen Office-Paketen bekannten, Komponenten: KWord ist die Textverarbeitung, KSpread die Tabellenkalkulation, mit KPresenter werden Präsentationen erstellt und Kontour ist ein Zeichenprogramm. Stellen Sie vor der Installation des neusten KOffice sicher, dass Sie eine aktuelle Version von KDE besitzen. Mit dem folgenden Kommando installieren Sie das KOffice-Paket: &prompt.root; pkg_add -r koffice Wenn das Paket nicht zur Verfügung steht, benutzen Sie bitte die Ports-Sammlung. Wenn Sie beispielsweise KOffice für KDE3 installieren wollen, setzen Sie die nachstehendenen Befehle ab: &prompt.root; cd /usr/ports/editors/koffice-kde3 &prompt.root; make install clean AbiWord AbiWord AbiWord ist eine freie Textverarbeitung, die ähnlich wie µsoft; Word ist. Sie können damit Artikel, Briefe, Berichte, Notizen usw. verfassen. Das Programm ist sehr schnell, besitzt viele Funktionen und ist sehr benutzerfreundlich. AbiWord kann viele Dateiformate, unter anderem nicht offene wie .doc von µsoft;, importieren und exportieren. Das AbiWord-Paket installieren Sie wie folgt: &prompt.root; pkg_add -r AbiWord Sollte das Paket nicht zur Verfügung stehen, können Sie das Programm mit der Ports-Sammlung, die zudem aktueller als die Pakete ist, übersetzen. Gehen Sie dazu folgendermaßen vor: &prompt.root; cd /usr/ports/editors/AbiWord &prompt.root; make install clean The GIMP The GIMP The GIMP ist ein sehr ausgereiftes Bildverarbeitungsprogramm mit dem Sie Bilder erstellen oder retuschieren können. Sie können es sowohl als einfaches Zeichenprogramm als auch zum retuschieren von Fotografien benutzen. Das Programm besitzt eine eingebaute Skriptsprache und es existieren sehr viele Plug-Ins. The GIMP kann Bilder in zahlreichen Formaten lesen und speichern und stellt Schnittstellen zu Scannern und grafischen Tabletts zur Verfügung. Sie installieren das Paket mit dem nachstehenden Befehl: &prompt.root; pkg_add -r gimp Benutzen Sie die Ports-Sammlung, wenn Ihr FTP-Server das Paket nicht bereitstellt. Im Verzeichnis graphics finden Sie das Handbuch The Gimp Manual. Sie können alles mit den folgenden Befehlen installieren: &prompt.root; cd /usr/ports/graphics/gimp &prompt.root; make install clean &prompt.root; cd /usr/ports/graphics/gimp-manual-pdf &prompt.root; make install clean Die Entwickler-Version von The GIMP finden Sie im Verzeichnis graphics der Ports-Sammlung. Das Handbuch ist im HTML-Format (graphics/gimp-manual-html) erhältlich. OpenOffice.org OpenOffice.org Office-Pakete OpenOffice.org OpenOffice.org enthält alles, was von einem Office-Paket erwartet wird: Textverarbeitung, Tabellenkalkulation, Präsentation und ein Zeichenprogramm. Die Bedienung gleicht anderen Office-Paketen und das Programm kann zahlreiche Dateiformate importieren und exportieren. Es gibt lokalisierte Versionen mit angepassten Menüs, Rechtschreibkontrollen und Wörterbüchern. Die Textverarbeitung von OpenOffice.org speichert Dateien im XML-Format. Dadurch wird die Verwendbarkeit der Dateien auf anderen Systemen erhöht und die Handhabung der Daten vereinfacht. Die Tabellenkalkulation besitzt eine Makrosprache und eine Schnittstelle zu Datenbanken. OpenOffice.org läuft auf &windows;, &solaris;, Linux, FreeBSD und &macos; X. Weitere Informationen über OpenOffice.org finden Sie auf der OpenOffice.org Website. Spezifische Informationen für FreeBSD finden Sie auf der Webseite FreeBSD OpenOffice.org Porting Team. Von dort können Sie auch direkt das OpenOffice-Paket herunterladen. OpenOffice.org installieren Sie wie folgt: &prompt.root; pkg_add -r openoffice.org Diese Art der Installation sollte mit einer -RELEASE-Version funktionieren. Verwenden Sie eine andere Version, sollten Sie die Internetseite des &os; OpenOffice.org Porting Teams besuchen und das entsprechende Paket herunterladen und über &man.pkg.add.1; installieren, wobei Sie zwischen der aktuellen Version und der Entwicklerversion wählen können. Nachdem das Paket installiert ist, müssen Sie lediglich folgenden Befehl eingeben, um OpenOffice.org zu starten: &prompt.user; openoffice.org Nach dem ersten Start werden Ihnen einige Fragen gestellt. Außerdem wird in Ihrem Heimatverzeichnis der neue Unterordner .openoffice.org2 angelegt. Falls die OpenOffice.org-Pakete nicht zur Verfügung stehen, können Sie immer noch die Ports-Sammlung benutzen. Beachten Sie aber bitte, dass Sie sehr viel Plattenplatz und Zeit benötigen, um die Quellen zu übersetzen. &prompt.root; cd /usr/ports/editors/openoffice-2 &prompt.root; make install clean Wenn Sie ein lokalisierte Version bauen wollen, ersetzen Sie den letzten Befehl durch die folgende Zeile: &prompt.root; make LOCALIZED_LANG=Ihre_Sprache install clean Dabei ersetzen Sie Ihre_Sprache durch den korrekten ISO-Code. Eine Liste der unterstützten Codes enthält die Datei files/Makefile.localized, die sich im Portsverzeichnis befindet. Nachdem die Installation abgeschlossen ist, können Sie OpenOffice.org durch folgenden Befehl starten: &prompt.user; openoffice.org Anzeigen von Dokumenten Einige neuere Dokumentformate, die sich aktuell großer Beliebtheit erfreuen, können Sie sich mit den im Basissystem enthaltenen Programmen und Werkzeugen nicht ansehen. Dieser Abschnitt behandelt Programme, mit denen Sie sich Dokumente in unterschiedlichsten Formaten ansehen können. Die nachstehenden Anwendungen werden behandelt: Anwendung Ressourcenbedarf Installationsaufwand aus den Ports wichtige Abhängigkeiten &acrobat.reader; niedrig niedrig Linux Binary Compatibility gv niedrig niedrig Xaw3d Xpdf niedrig niedrig FreeType GQview niedrig niedrig Gtk+ oder GNOME &acrobat.reader; Acrobat Reader PDF anzeigen Viele Dokumente werden heute im Portable Document Format (PDF) zur Verfügung gestellt. PDF-Dokumente schauen Sie sich am Besten mit dem Programm &acrobat.reader; an, das von Adobe für Linux freigegeben wurde. Da Linux-Programme unter FreeBSD laufen, steht Ihnen das Programm auch hier zur Verfügung. Um &acrobat.reader; 7 über die Ports-Sammlung zu installieren, geben Sie Folgendes ein: &prompt.root; cd /usr/ports/print/acroread7 &prompt.root; make install clean Aufgrund der Lizenzbedinungen ist eine Paketversion leider nicht verfügbar. gv gv PDF anzeigen PostScript anzeigen gv kann &postscript;- und PDF-Dokumente anzeigen. Es stammt von ghostview ab, besitzt aber wegen der Xaw3d-Bibliothek eine schönere Benutzeroberfläche. In gv können Sie viele Operationen durchführen: Sie können die Ausrichtung und die Papiergröße eines Dokuments ändern, das Dokument skalieren oder die Kantenglättung (Anti-Aliasing) aktivieren. Fast jede Operation kann sowohl mit der Tastatur als auch mit der Maus durchgeführt werden. Installieren Sie das gv-Paket wie folgt: &prompt.root; pkg_add -r gv Benutzen Sie die Ports-Sammlung, wenn das Paket nicht zur Verfügung steht: &prompt.root; cd /usr/ports/print/gv &prompt.root; make install clean Xpdf Xpdf PDF anzeigen Ein schlankes und effizientes Programm zum Betrachten von PDF-Dateien ist Xpdf. Es benötigt wenige Ressourcen und ist sehr stabil. Da das Programm die Standard X-Zeichensätze benutzt, ist es nicht auf &motif; oder ein anderes X-Toolkit angewiesen. Das Xpdf-Paket können Sie mit dem folgenden Kommando installieren: &prompt.root; pkg_add -r xpdf Wenn das Paket nicht verfügbar ist, oder Sie lieber die Ports-Sammlung benutzen möchten, gehen Sie wie folgt vor: &prompt.root; cd /usr/ports/graphics/xpdf &prompt.root; make install clean Wenn Sie nach Abschluss der Installation Xpdf starten, öffnen Sie das Menü mit der rechten Maustaste. GQview GQview Mit GQview lassen sich Bilder verwalten. Unter anderem können Sie sich Bilder (auch auf dem ganzen Bildschirm) anschauen, ein externes Werkzeug aufrufen und eine Vorschau (thumbnail) erzeugen. Weiterhin können Sie automatisch ablaufende Präsentationen erstellen und grundlegende Dateioperationen durchführen, Bildersammlungen verwalten und doppelte Bilder aufspüren. GQview ist internationalisiert, das heißt es berücksichtigt die Spracheinstellungen des Systems. Wenn Sie das GQview-Paket installieren wollen, geben Sie das folgende Kommando ein: &prompt.root; pkg_add -r gqview Ist das Paket nicht erhältlich, oder wenn Sie die Ports-Sammlung bevorzugen, setzen Sie die folgenden Kommandos ab: &prompt.root; cd /usr/ports/graphics/gqview &prompt.root; make install clean Finanzsoftware Wenn Sie, warum auch immer, Ihre Finanzen mit einem FreeBSD Arbeitsplatz verwalten wollen, stehen Ihnen verschiedene Anwendungen zur Verfügung. Einige von ihnen unterstützen verbreitete Formate, darunter Dateiformate, die von Quicken oder Excel verwendet werden. Dieser Abschnitt behandelt die folgenden Anwendungen: Anwendung Ressourcenbedarf Installationsaufwand aus den Ports wichtige Abhängigkeiten GnuCash niedrig hoch GNOME Gnumeric niedrig hoch GNOME Abacus niedrig niedrig Tcl/Tk KMyMoney niedrig hoch KDE GnuCash GnuCash GnuCash ist Teil des GNOME-Projekts, dessen Ziel es ist, leicht zu bedienende und doch leistungsfähige Anwendungen zu erstellen. Mit GnuCash können Sie Ihre Einnahmen und Ausgaben, Ihre Bankkonten und Wertpapiere verwalten. Das Programm ist leicht zu bedienen und genügt dennoch hohen Ansprüchen. GnuCash stellt ein Register, ähnlich dem in einem Scheckheft und ein hierarchisches System von Konten zur Verfügung. Eine Transaktion kann in einzelne Teile aufgespaltet werden. GnuCash kann Quicken-Dateien (QIF) importieren und einbinden. Weiterhin unterstützt das Programm die meisten internationalen Formate für Zeitangaben und Währungen. Die Bedienung des Programms kann durch zahlreiche Tastenkombinationen und dem automatischen Vervollständigen von Eingaben beschleunigt werden. Das GnuCash-Paket installieren Sie wie folgt: &prompt.root; pkg_add -r gnucash Wenn das Paket nicht zur Verfügung steht, benutzen Sie die Ports-Sammlung: &prompt.root; cd /usr/ports/finance/gnucash &prompt.root; make install clean Gnumeric Gnumeric Tabellenkalkulation Gnumeric Gnumeric ist eine Tabellenkalkulation, die Teil der GNOME Benutzeroberfläche ist. Das Programm kann Eingaben anhand des Zellenformats oder einer Folge von Eingaben vervollständigen. Dateien verbreiteter Formate, wie die von Excel, Lotus 1-2-3 oder Quattro Pro lassen sich importieren. Grafiken erstellt Gnumeric mit dem Programm math/guppi. Gnumeric besitzt viele eingebaute Funktionen und Zellenformate (zum Beispiel die üblich verwendeten, wie Zahl, Währung, Datum oder Zeit). Installieren Sie das Gnumeric-Paket mit dem folgenden Kommando: &prompt.root; pkg_add -r gnumeric Wenn das Paket nicht zur Verfügung steht, benutzen Sie die Ports-Sammlung: &prompt.root; cd /usr/ports/math/gnumeric &prompt.root; make install clean Abacus Abacus Tabellenkalkulation Abacus Abacus ist eine kleine und leicht zu bedienende Tabellenkalkulation. Die vordefinierten Funktionen stammen aus verschiedenen Bereichen wie der Statistik, der Wirtschaft und der Mathematik. Das Programm kann Dateien im Excel Dateiformat importieren und exportieren sowie Ausgaben in &postscript; erzeugen. Installieren Sie das Abacus-Paket mit dem folgenden Kommando: &prompt.root; pkg_add -r abacus Wenn das Paket nicht zur Verfügung steht, benutzen Sie die Ports-Sammlung: &prompt.root; cd /usr/ports/deskutils/abacus &prompt.root; make install clean KMyMoney KMyMoney Tabellenkalkulation KMyMoney Bei KMyMoney handelt es sich ein Programm zur Verwaltung der persönlichen Finanzen, das unter KDE entwickelt wird. KMyMoney hat das Ziel, alle wichtigen Funktionen zu bieten, die auch von kommerziellen Programmen zur Verwaltung der persönlichen Finanzen unterstützt werden. Weiters zählen einfache Benutzung sowie korrekte doppelte Buchführung zu den herausragenden Fähigkeiten dieses Programms. KMyMoney unterstützt den Import von Datendateien im Format Quicken Interchange Format (QIF), kann Investionen verfolgen, unterstützt verschiedene Währungen und bietet umfangreiche Reportmöglichkeiten. OFX-Import wird über ein separates Plugin realisiert. Um KMyMoney über das &os;-Paketsystem zu installieren, geben Sie Folgendes ein: &prompt.root; pkg_add -r kmymoney2 Sollte das Paket nicht verfügbar sein, können Sie das Programm auch über die Ports-Sammlung installieren: &prompt.root; cd /usr/ports/finance/kmymoney2 &prompt.root; make install clean Zusammenfassung FreeBSD wird von Internet Service Providern wegen seiner Schnelligkeit und Stabilität eingesetzt, es ist aber auch zum Einrichten eines Arbeitsplatzes geeignet. Mit tausenden Anwendungen, die als Pakete oder Ports zur Verfügung stehen, können Sie sich einen Arbeitsplatz nach Ihren Wünschen einrichten. Die folgende Aufstellung fasst die in diesem Kapitel besprochenen Anwendungen zusammen: Anwendung Paket-Name Port-Name - - Mozilla - mozilla - www/mozilla - - - - &netscape; - linux-netscape7 - www/netscape7 - - Opera opera www/opera Firefox firefox www/firefox KOffice koffice-kde3 editors/koffice-kde3 AbiWord abiword editors/abiword The GIMP gimp graphics/gimp OpenOffice.org openoffice editors/openoffice-1.1 &acrobat.reader; acroread print/acroread7 gv gv print/gv Xpdf xpdf graphics/xpdf GQview gqview graphics/gqview GnuCash gnucash finance/gnucash Gnumeric gnumeric math/gnumeric Abacus abacus deskutils/abacus + + + KMyMoney + kmymoney2 + finance/kmymoney2 + diff --git a/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml b/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml index d0f491b6d6..bd810ead81 100644 --- a/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/disks/chapter.sgml @@ -1,4638 +1,4633 @@ Bernd Warken Übersetzt von Martin Heinen Speichermedien Übersicht Dieses Kapitel behandelt die Benutzung von Laufwerken unter FreeBSD. Laufwerke können speichergestützte Laufwerke, Netzwerklaufwerke oder normale SCSI/IDE-Geräte sein. Nachdem Sie dieses Kapitel gelesen haben, werden Sie Folgendes wissen: Die Begriffe, die FreeBSD verwendet, um die Organisation der Daten auf einem physikalischen Laufwerk zu beschreiben (Partitionen und Slices). Wie Sie ein weiteres Laufwerk zu Ihrem System hinzufügen. Wie virtuelle Dateisysteme, zum Beispiel RAM-Disks, eingerichtet werden. Wie Sie mit Quotas die Benutzung von Laufwerken einschränken können. Wie Sie Partitionen verschlüsseln, um Ihre Daten zu schützen. Wie unter FreeBSD CDs und DVDs gebrannt werden. Sie werden die Speichermedien, die Sie für Backups einsetzen können, kennen. Wie Sie die unter FreeBSD erhältlichen Backup Programme benutzen. Wie Sie ein Backup mit Disketten erstellen. Was Dateisystem-Schnappschüsse sind und wie sie eingesetzt werden. Bevor Sie dieses Kapitel lesen, sollten Sie einen einen &os;-Kernel installieren können (). Gerätenamen Die folgende Tabelle zeigt die von FreeBSD unterstützten Speichergeräte und deren Gerätenamen. Namenskonventionen von physikalischen Laufwerken Laufwerkstyp Gerätename IDE-Festplatten ad IDE-CD-ROM Laufwerke acd SCSI-Festplatten und USB-Speichermedien da SCSI-CD-ROM Laufwerke cd Verschiedene proprietäre CD-ROM-Laufwerke mcd Mitsumi CD-ROM und scd Sony CD-ROM Diskettenlaufwerke fd SCSI-Bandlaufwerke sa IDE-Bandlaufwerke ast Flash-Laufwerke fla für &diskonchip; Flash-Device RAID-Laufwerke aacd für &adaptec; AdvancedRAID, mlxd und mlyd für &mylex;, amrd für AMI &megaraid;, idad für Compaq Smart RAID, twed für &tm.3ware; RAID.
David O'Brian Im Original von Hinzufügen von Laufwerken Laufwerke hinzufügen Angenommen, Sie wollen ein neues SCSI-Laufwerk zu einer Maschine hinzufügen, die momentan nur ein Laufwerk hat. Dazu schalten Sie zuerst den Rechner aus und installieren das Laufwerk entsprechend der Anleitungen Ihres Rechners, Ihres Controllers und Laufwerk Herstellers. Den genauen Ablauf können wir wegen der großen Abweichungen leider nicht beschreiben. Nachdem Sie das Laufwerk installiert haben, melden Sie sich als Benutzer root an und kontrollieren Sie /var/run/dmesg.boot, um sicherzustellen, dass das neue Laufwerk gefunden wurde. Das neue Laufwerk wird, um das Beispiel fortzuführen, da1 heißen und soll unter /1 angehangen werden. Fügen Sie eine IDE-Platte hinzu, wird diese den Namen ad1 erhalten.s Partitionen Slices fdisk Da FreeBSD auf IBM-PC kompatiblen Rechnern läuft, muss es die PC BIOS-Partitionen, die verschieden von den traditionellen BSD-Partitionen sind, berücksichtigen. Eine PC Platte kann bis zu vier BIOS-Partitionen enthalten. Wenn die Platte ausschließlich für FreeBSD verwendet wird, können Sie den dedicated Modus benutzen, ansonsten muss FreeBSD in eine der BIOS-Partitionen installiert werden. In FreeBSD heißen die PC BIOS-Partitionen Slices, um sie nicht mit den traditionellen BSD-Partitionen zu verwechseln. Sie können auch Slices auf einer Platte verwenden, die ausschließlich von FreeBSD benutzt wird, sich aber in einem Rechner befindet, der noch ein anderes Betriebssystem installiert hat. Dadurch stellen Sie sicher, dass Sie fdisk des anderen Betriebssystems noch benutzen können. Im Fall von Slices wird die Platte als /dev/da1s1e hinzugefügt. Das heißt: SCSI-Platte, Einheit 1 (die zweite SCSI-Platte), Slice 1 (PC BIOS-Partition 1) und die e BSD-Partition. Wird die Platte ausschließlich für FreeBSD verwendet (dangerously dedicated), wird sie einfach als /dev/da1e hinzugefügt. Da &man.bsdlabel.8; zum Speichern von Sektoren 32-Bit Integer verwendet, ist das Werkzeug in den meisten Fällen auf 2^32-1 Sektoren pro Laufwerk oder 2 TB beschränkt. In &man.fdisk.8; darf der Startsektor nicht größer als 2^32-1 sein und Partitionen sind auf eine Länge von 2^32-1 beschränkt. In den meisten Fällen beschränkt dies die Größe einer Partition auf 2 TB und die maximale Größe eines Laufwerks auf 4 TB. Das &man.sunlabel.8;-Format ist mit 2^32-1 Sektoren pro Partition und 8 Partitionen auf 16 TB beschränkt. Mit größeren Laufwerken können &man.gpt.8;-Partitionen benutzt werden. Verwenden von &man.sysinstall.8; sysinstall hinzufügen von Laufwerken su Das <application>sysinstall</application> Menü Um ein Laufwerk zu partitionieren und zu labeln, kann das menügestützte sysinstall benutzt werden. Dazu melden Sie sich als root an oder benutzen su, um root zu werden. Starten Sie sysinstall und wählen das Configure Menü, wählen Sie dort den Punkt Fdisk aus. Partitionieren mit <application>fdisk</application> Innerhalb von fdisk geben Sie A ein, um die ganze Platte für FreeBSD zu benutzen. Beantworten Sie die Frage remain cooperative with any future possible operating systems mit YES. W schreibt die Änderung auf die Platte, danach können Sie fdisk mit Q verlassen. Da Sie eine Platte zu einem schon laufenden System hinzugefügt haben, beantworten Sie die Frage nach dem Master Boot Record mit None. Disk-Label-Editor BSD Partitionen Als nächstes müssen Sie sysinstall verlassen und es erneut starten. Folgen Sie dazu bitte den Anweisungen von oben, aber wählen Sie dieses Mal die Option Label, um in den Disk Label Editor zu gelangen. Hier werden die traditionellen BSD-Partitionen erstellt. Ein Laufwerk kann acht Partitionen, die mit den Buchstaben a-h gekennzeichnet werden, besitzen. Einige Partitionen sind für spezielle Zwecke reserviert. Die a Partition ist für die Root-Partition (/) reserviert. Deshalb sollte nur das Laufwerk, von dem gebootet wird, eine a Partition besitzen. Die b Partition wird für Swap-Partitionen benutzt, wobei Sie diese auf mehreren Platten benutzen dürfen. Im dangerously dedicated Modus spricht die c Partition die gesamte Platte an, werden Slices verwendet, wird damit die ganze Slice angesprochen. Die anderen Partitionen sind für allgemeine Zwecke verwendbar. Der Label Editor von sysinstall bevorzugt die e Partition für Partitionen, die weder Root-Partitionen noch Swap-Partitionen sind. Im Label Editor können Sie ein einzelnes Dateisystem mit C erstellen. Wählen Sie FS, wenn Sie gefragt werden, ob Sie ein FS (Dateisystem) oder Swap erstellen wollen, und geben Sie einen Mountpoint z.B. /mnt an. Wenn Sie nach einer FreeBSD-Installation ein Dateisystem mit sysinstall erzeugen, so werden die Einträge in /etc/fstab nicht erzeugt, so dass die Angabe des Mountpoints nicht wichtig ist. Sie können nun das Label auf das Laufwerk schreiben und das Dateisystem erstellen, indem Sie W drücken. Ignorieren Sie die Meldung von sysinstall, dass die neue Partition nicht angehangen werden konnte, und verlassen Sie den Label Editor sowie sysinstall. Ende Im letzten Schritt fügen Sie noch in /etc/fstab den Eintrag für das neue Laufwerk ein. Die Kommandozeile Anlegen von Slices Mit der folgenden Vorgehensweise wird eine Platte mit anderen Betriebssystemen, die vielleicht auf Ihrem Rechner installiert sind, zusammenarbeiten und nicht das fdisk Programm anderer Betriebssysteme stören. Bitte benutzen Sie den dedicated Modus nur dann, wenn Sie dazu einen guten Grund haben! &prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1 &prompt.root; fdisk -BI da1 # Initialisieren der neuen Platte &prompt.root; bsdlabel -B -w da1s1 auto #Labeln. &prompt.root; bsdlabel -e da1s1 # Editieren des Disklabels und Hinzufügen von Partitionen &prompt.root; mkdir -p /1 &prompt.root; newfs /dev/da1s1e # Wiederholen Sie diesen Schritt für jede Partition &prompt.root; mount /dev/da1s1e /1 # Anhängen der Partitionen &prompt.root; vi /etc/fstab # Ändern Sie /etc/fstab entsprechend Wenn Sie ein IDE-Laufwerk besitzen, ändern Sie da in ad. Dedicated OS/2 Wenn das neue Laufwerk nicht von anderen Betriebssystemen benutzt werden soll, können Sie es im dedicated Modus betreiben. Beachten Sie bitte, dass Microsoft-Betriebssysteme mit diesem Modus eventuell nicht zurechtkommen, aber es entsteht kein Schaden am Laufwerk. Im Gegensatz dazu wird IBMs &os2; versuchen, jede ihm nicht bekannte Partition zu reparieren. &prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1 &prompt.root; bsdlabel -Bw da1 auto &prompt.root; bsdlabel -e da1 # Erstellen der `e' Partition &prompt.root; newfs /dev/da1e &prompt.root; mkdir -p /1 &prompt.root; vi /etc/fstab # /dev/da1e hinzufügen &prompt.root; mount /1 Eine alternative Methode: &prompt.root; dd if=/dev/zero of=/dev/da1 count=2 &prompt.root; bsdlabel /dev/da1 | bsdlabel -BR da1 /dev/stdin &prompt.root; newfs /dev/da1e &prompt.root; mkdir -p /1 &prompt.root; vi /etc/fstab # /dev/da1e hinzufügen &prompt.root; mount /1 RAID Software-RAID Christopher Shumway Original von Jim Brown Überarbeitet von Concatenated-Disk (CCD) konfigurieren RAID Software RAID CCD Die wichtigsten Faktoren bei der Auswahl von Massenspeichern sind Geschwindigkeit, Zuverlässigkeit und Preis. Selten findet sich eine ausgewogene Mischung aller drei Faktoren. Schnelle und zuverlässige Massenspeicher sind für gewöhnlich teuer. Um die Kosten zu senken, muss entweder an der Geschwindigkeit oder an der Zuverlässigkeit gespart werden. Das unten beschriebene System sollte vor allem preiswert sein. Der nächst wichtige Faktor war die Geschwindigkeit gefolgt von der Zuverlässigkeit. Die Geschwindigkeit war nicht so wichtig, da über das Netzwerk auf das System zugegriffen wird. Da alle Daten schon auf CD-Rs gesichert sind, war die Zuverlässigkeit, obwohl wichtig, ebenfalls nicht von entscheidender Bedeutung. Die Bewertung der einzelnen Faktoren ist der erste Schritt bei der Auswahl von Massenspeichern. Wenn Sie vor allem ein schnelles und zuverlässiges Medium benötigen und der Preis nicht wichtig ist, werden Sie ein anderes System als das hier beschriebene zusammenstellen. Installation der Hardware Neben der IDE-Systemplatte besteht das System aus drei Western Digital IDE-Festplatten mit 5400 RPM und einer Kapazität von je 30 GB. Insgesamt stehen also 90 GB Speicherplatz zur Verfügung. Im Idealfall sollte jede Festplatte an einen eigenen Controller angeschlossen werden. Um Kosten zu sparen, wurde bei diesem System darauf verzichtet und an jeden IDE-Controller eine Master- und eine Slave-Platte angeschlossen. Beim Reboot wurde das BIOS so konfiguriert, dass es die angeschlossenen Platten automatisch erkennt und FreeBSD erkannte die Platten ebenfalls: ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33 ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33 ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33 ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33 Wenn FreeBSD die Platten nicht erkennt, überprüfen Sie, ob die Jumper korrekt konfiguriert sind. Die meisten IDE-Festplatten verfügen über einen Cable Select-Jumper. Die Master- und Slave-Platten werden mit einem anderen Jumper konfiguriert. Bestimmen Sie den richtigen Jumper mithilfe der Dokumentation Ihrer Festplatte. Als nächstes sollten Sie überlegen, auf welche Art der Speicher zur Verfügung gestellt werden soll. Schauen Sie sich dazu &man.vinum.8; () und &man.ccd.4; an. Im hier beschriebenen System wird &man.ccd.4; eingesetzt. Konfiguration von CCD Mit &man.ccd.4; können mehrere gleiche Platten zu einem logischen Dateisystem zusammengefasst werden. Um &man.ccd.4; zu benutzen, muss der Kernel mit der entsprechenden Unterstützung übersetzt werden. Ergänzen Sie die Kernelkonfiguration um die nachstehende Zeile. Anschließend müssen Sie den Kernel neu übersetzen und installieren. pseudo-device ccd Alternativ kann &man.ccd.4; auch als Kernelmodul geladen werden. Um &man.ccd.4; zu benutzen, müssen die Laufwerke zuerst mit einem Label versehen werden. Die Label werden mit &man.bsdlabel.8; erstellt: bsdlabel -w ad1 auto bsdlabel -w ad2 auto bsdlabel -w ad3 auto Damit wurden die Label ad1c, ad2c und ad3c erstellt, die jeweils das gesamte Laufwerk umfassen. Im nächsten Schritt muss der Typ des Labels geändert werden. Die Labels können Sie mit &man.bsdlabel.8; editieren: bsdlabel -e ad1 bsdlabel -e ad2 bsdlabel -e ad3 Für jedes Label startet dies den durch EDITOR gegebenen Editor, typischerweise &man.vi.1;. Ein unverändertes Label sieht zum Beispiel wie folgt aus: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597) Erstellen Sie eine e-Partition für &man.ccd.4;. Dazu können Sie normalerweise die Zeile der c-Partition kopieren, allerdings muss auf 4.2BSD gesetzt werden. Das Ergebnis sollte wie folgt aussehen: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597) e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597) Erstellen des Dateisystems Nachdem alle Platten ein Label haben, kann das &man.ccd.4;-RAID aufgebaut werden. Dies geschieht mit &man.ccdconfig.8;: ccdconfig ccd0 32 0 /dev/ad1e /dev/ad2e /dev/ad3e Die folgende Aufstellung erklärt die verwendeten Kommandozeilenargumente: Das erste Argument gibt das zu konfigurierende Gerät, hier /dev/ccd0c, an. Die Angabe von /dev/ ist dabei optional. Der Interleave für das Dateisystem. Der Interleave definiert die Größe eines Streifens in Blöcken, die normal 512 Bytes groß sind. Ein Interleave von 32 ist demnach 16384 Bytes groß. Weitere Argumente für &man.ccdconfig.8;. Wenn Sie spiegeln wollen, können Sie das hier angeben. Die gezeigte Konfiguration verwendet keine Spiegel, sodass der Wert 0 angegeben ist. Das letzte Argument gibt die Geräte des Plattenverbundes an. Benutzen Sie für jedes Gerät den kompletten Pfadnamen. Nach Abschluß von &man.ccdconfig.8; ist der Plattenverbund konfiguriert und es können Dateisysteme auf dem Plattenverbund angelegt werden. Das Anlegen von Dateisystemen wird in der Hilfeseite &man.newfs.8; beschrieben. Für das Beispiel genügt der folgende Befehl: newfs /dev/ccd0c Automatisierung Damit &man.ccd.4; beim Start automatisch aktiviert wird, ist die Datei /etc/ccd.conf mit dem folgenden Kommando zu erstellen: ccdconfig -g > /etc/ccd.conf Wenn /etc/ccd.conf existiert, wird beim Reboot ccdconfig -C von /etc/rc aufgerufen. Damit wird &man.ccd.4; eingerichtet und die darauf befindlichen Dateisysteme können angehängt werden. Wenn Sie in den Single-User Modus booten, müssen Sie den Verbund erst konfigurieren, bevor Sie darauf befindliche Dateisysteme anhängen können: ccdconfig -C In /etc/fstab ist noch ein Eintrag für das auf dem Verbund befindliche Dateisystem zu erstellen, damit dieses beim Start des Systems immer angehängt wird: /dev/ccd0c /media ufs rw 2 2 Der Vinum-Volume-Manager RAID Software RAID Vinum Der Vinum Volume Manager ist ein Block-Gerätetreiber, der virtuelle Platten zur Verfügung stellt. Er trennt die Verbindung zwischen der Festplatte und dem zugehörigen Block-Gerät auf. Im Gegensatz zur konventionellen Aufteilung einer Platte in Slices lassen sich dadurch Daten flexibler, leistungsfähiger und zuverlässiger verwalten. &man.vinum.8; stellt RAID-0, RAID-1 und RAID-5 sowohl einzeln wie auch in Kombination zur Verfügung. Mehr Informationen über &man.vinum.8; erhalten Sie in . Hardware-RAID RAID Hardware FreeBSD unterstützt eine Reihe von RAID-Controllern. Diese Geräte verwalten einen Plattenverbund; zusätzliche Software wird nicht benötigt. Der Controller steuert mithilfe eines BIOS auf der Karte die Plattenoperationen. Wie ein RAID System eingerichtet wird, sei kurz am Beispiel des Promise IDE RAID-Controllers gezeigt. Nachdem die Karte eingebaut ist und der Rechner neu gestartet wurde, erscheint eine Eingabeaufforderung. Wenn Sie den Anweisungen auf dem Bildschirm folgen, gelangen Sie in eine Maske, in der Sie mit den vorhandenen Festplatten ein RAID-System aufbauen können. FreeBSD behandelt das RAID-System wie eine einzelne Festplatte. Wiederherstellen eines ATA-RAID-1 Verbunds Mit FreeBSD können Sie eine ausgefallene Platte in einem RAID-Verbund während des Betriebs auswechseln, vorausgesetzt Sie bemerken den Ausfall vor einem Neustart. Einen Ausfall erkennen Sie, wenn in der Datei /var/log/messages oder in der Ausgabe von &man.dmesg.8; Meldungen wie die folgenden auftauchen: ad6 on monster1 suffered a hard error. ad6: READ command timeout tag=0 serv=0 - resetting ad6: trying fallback to PIO mode ata3: resetting devices .. done ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\ status=59 error=40 ar0: WARNING - mirror lost Überprüfen Sie den RAID-Verbund mit &man.atacontrol.8;: &prompt.root; atacontrol list ATA channel 0: Master: no device present Slave: acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0 ATA channel 1: Master: no device present Slave: no device present ATA channel 2: Master: ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present ATA channel 3: Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present &prompt.root; atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED Damit Sie die Platte ausbauen können, muss zuerst der ATA-Channel der ausgefallenen Platte aus dem Verbund entfernt werden: &prompt.root; atacontrol detach ata3 Ersetzen Sie dann die Platte. Nun aktivieren Sie den ATA-Channel wieder: &prompt.root; atacontrol attach ata3 Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5 Slave: no device present Nehmen Sie die neue Platte in den Verbund auf: &prompt.root; atacontrol addspare ar0 ad6 Stellen Sie die Organisation des Verbunds wieder her: &prompt.root; atacontrol rebuild ar0 Sie können den Fortschritt des Prozesses durch folgende Befehle kontrollieren: &prompt.root; dmesg | tail -10 [output removed] ad6: removed from configuration ad6: deleted from ar0 disk1 ad6: inserted into ar0 disk1 as spare &prompt.root; atacontrol status ar0 ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed Warten Sie bis die Wiederherstellung beendet ist. Marc Fonvieille Beigetragen von USB Speichermedien USB Speichermedien Der Universal Serial Bus (USB) wird heutzutage von vielen externen Speichern benutzt: Festplatten, USB-Thumbdrives oder CD-Brennern, die alle von &os; unterstützt werden. USB-Konfiguration USB-Massenspeicher werden vom Treiber &man.umass.4; betrieben. Wenn Sie den GENERIC-Kernel benutzen, brauchen Sie keine Anpassungen vorzunehmen. Benutzen Sie einen angepassten Kernel, müssen die nachstehenden Zeilen in der Kernelkonfigurationsdatei enthalten sein: device scbus device da device pass device uhci device ohci +device ehci device usb device umass Der Treiber &man.umass.4; greift über das SCSI-Subsystem auf die USB-Geräte zu. Ihre USB-Geräte werden daher vom System als SCSI-Geräte erkannt. Abhängig vom Chipsatz Ihrer Systemplatine benötigen Sie in der Kernelkonfiguration entweder die Option device uhci oder die - Option device ohci. Die + Option device ohci für die + Unterstützung von USB 1.1. Die Kernelkonfiguration kann allerdings auch beide Optionen - enthalten. Vergessen Sie bitte nicht, einen neuen - Kernel zu bauen und zu installieren, wenn Sie die + enthalten. Unterstützung für USB 2.0 Controller + wird durch den &man.ehci.4;-Treiber geleistet (die + device ehci Zeile). Vergessen Sie bitte nicht, + einen neuen Kernel zu bauen und zu installieren, wenn Sie die Kernelkonfiguration verändert haben. Wenn es sich bei Ihrem USB-Gerät um einen CD-R- oder DVD-Brenner handelt, müssen Sie den Treiber &man.cd.4; für SCSI-CD-ROMs in die Kernelkonfiguration aufnehmen: device cd Da der Brenner als SCSI-Laufwerk erkannt wird, sollten Sie den Treiber &man.atapicam.4; nicht benutzen. - - USB 2.0-Controller werden von &os; - unterstützt, wenn Sie die folgende Zeile in Ihre - Kernelkonfigurationsdatei aufnehmen: - - device ehci - - Die Treiber &man.uhci.4; und &man.ohci.4; werden - immer noch für USB 1.X benötigt. Die USB-Konfiguration testen Sie können das USB-Gerät nun testen. Schließen Sie das Gerät an und untersuchen Sie die Systemmeldungen (&man.dmesg.8;), Sie sehen Ausgaben wie die folgende: umass0: USB Solid state disk, rev 1.10/1.00, addr 2 GEOM: create disk da0 dp=0xc2d74850 da0 at umass-sim0 bus 0 target 0 lun 0 da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device da0: 1.000MB/s transfers da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C) Die Ausgaben, wie das erkannte Gerät oder der Gerätename (da0) hängen natürlich von Ihrer Konfiguration ab. Da ein USB-Gerät als SCSI-Gerät erkannt wird, können Sie USB-Massenspeicher mit dem Befehl camcontrol anzeigen: &prompt.root; camcontrol devlist <Generic Traveling Disk 1.11> at scbus0 target 0 lun 0 (da0,pass0) Wenn auf dem Laufwerk ein Dateisystem eingerichtet ist, sollten Sie das Dateisystem einhängen können. beschreibt, wie Sie USB-Laufwerke formatieren und Partitionen einrichten. Damit auch normale Anwender (ohne root-Rechte) USB-Laufwerke einhängen können, müssen Sie Ihr System erst entsprechend konfigurieren. Als erstes müssen Sie sicherstellen, dass diese Anwender auf die beim Einhängen eines USB-Laufwerks dynamisch erzeugten Gerätedateien zugreifen dürfen. Dazu können Sie beispielsweise mit &man.pw.8; alle potentiellen Benutzer dieser Gerätedateien in die Gruppe operator aufnehmen. Außerdem muss sichergestellt werden, dass Mitglieder der Gruppe operator Schreib- und Lesezugriff auf diese Gerätedateien haben. Dazu fügen Sie die folgenden Zeilen in die Konfigurationsdatei /etc/devfs.rules ein: [localrules=5] add path 'da*' mode 0660 group operator Verfügt Ihr System auch über SCSI-Laufwerke, gibt es eine Besonderheit. Haben Sie beispielsweise die SCSI-Laufwerke da0 bis da2 installiert, so sieht die zweite Zeile wie folgt aus: add path 'da[3-9]*' mode 0660 group operator Dadurch werden die bereits vorhandenen SCSI-Laufwerke nicht in die Gruppe operator aufgenommen. Vergessen Sie nicht, die &man.devfs.rules.5;-Regeln in der Datei /etc/rc.conf zu aktivieren: devfs_system_ruleset="localrules" Als nächstes müssen Sie Ihre Kernelkonfiguration anpassen, damit auch normale Benutzer Dateisysteme mounten dürfen. Dazu fügen Sie am besten folgende Zeile in die Konfigurationsdatei /etc/sysctl.conf ein: vfs.usermount=1 Damit diese Einstellung wirksam wird, müssen Sie Ihr System neu starten. Alternativ können Sie diese Variable auch mit &man.sysctl.8; setzen. Zuletzt müssen Sie noch ein Verzeichnis anlegen, in das das USB-Laufwerk eingehängt werden soll. Dieses Verzeichnis muss dem Benutzer gehören, der das USB-Laufwerk in den Verzeichnisbaum einhängen will. Dazu legen Sie als root ein Unterverzeichnis /mnt/username an (wobei Sie username durch den Login des jeweiligen Benutzers sowie usergroup durch die primäre Gruppe des Benutzers ersetzen): &prompt.root; mkdir /mnt/username &prompt.root; chown username:usergroup /mnt/username Wenn Sie nun beispielsweise einen USB-Stick anschließen, wird automatisch die Gerätedatei /dev/da0s1 erzeugt. Da derartige Geräte in der Regel mit dem FAT-Dateisystem formatiert sind, können Sie sie beispielsweise mit dem folgenden Befehl in den Verzeichnisbaum einhängen: &prompt.user; mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username Wenn Sie das Gerät entfernen (das Dateisystem müssen Sie vorher abhängen), sehen Sie in den Systemmeldungen Einträge wie die folgenden: umass0: at uhub0 port 1 (addr 2) disconnected (da0:umass-sim0:0:0:0): lost device (da0:umass-sim0:0:0:0): removing device entry GEOM: destroy disk da0 dp=0xc2d74850 umass0: detached Weiteres zu USB Neben den Abschnitten Hinzufügen von Laufwerken und Anhängen und Abhängen von Dateisystemen lesen Sie bitte - die Hilfeseiten &man.umass.4;, &man.camcontrol.8; und - &man.usbdevs.8;. + die Hilfeseiten &man.umass.4;, &man.camcontrol.8; für + &os; 8.X oder &man.usbdevs.8; bei vorherigen Versionen. Mike Meyer Beigesteuert von CDs benutzen CD-ROM brennen Einführung CDs besitzen einige Eigenschaften, die sie von konventionellen Laufwerken unterscheiden. Zuerst konnten sie nicht beschrieben werden. Sie wurden so entworfen, dass sie ununterbrochen, ohne Verzögerungen durch Kopfbewegungen zwischen den Spuren, gelesen werden können. Sie konnten früher auch leichter als vergleichbar große Medien zwischen Systemen bewegt werden. CDs besitzen Spuren, aber damit ist der Teil Daten gemeint, der ununterbrochen gelesen wird, und nicht eine physikalische Eigenschaft der CD. Um eine CD mit FreeBSD zu erstellen, werden die Daten jeder Spur der CD in Dateien vorbereitet und dann die Spuren auf die CD geschrieben. ISO 9660 Dateisysteme ISO 9660 Das ISO 9660-Dateisystem wurde entworfen, um mit diesen Unterschieden umzugehen. Leider hat es auch damals übliche Grenzen für Dateisysteme implementiert. Glücklicherweise existiert ein Erweiterungsmechanismus, der es korrekt geschriebenen CDs erlaubt, diese Grenzen zu überschreiten und dennoch auf Systemen zu funktionieren, die diese Erweiterungen nicht unterstützen. sysutils/cdrtools Der Port sysutils/cdrtools enthält das Programm &man.mkisofs.8;, das eine Datei erstellt, die ein ISO 9660-Dateisystem enthält. Das Programm hat Optionen, um verschiedene Erweiterungen zu unterstützen, und wird unten beschrieben. CD-Brenner ATAPI Welches Tool Sie zum Brennen von CDs benutzen, hängt davon ab, ob Ihr CD-Brenner ein ATAPI-Gerät ist oder nicht. Mit ATAPI-CD-Brennern wird burncd benutzt, das Teil des Basissystems ist. SCSI- und USB-CD-Brenner werden mit cdrecord aus sysutils/cdrtools benutzt. Zusätzlich ist es möglich, über das Modul ATAPI/CAM SCSI-Werkzeuge wie cdrecord auch für ATAPI-Geräte einzusetzen. Wenn Sie eine Brennsoftware mit grafischer Benutzeroberfläche benötigen, sollten Sie sich X-CD-Roast oder K3b näher ansehen. Diese Werkzeuge können als Paket oder aus den Ports (sysutils/xcdroast und sysutils/k3b) installiert werden. Mit ATAPI-Hardware benötigt K3b das ATAPI/CAM-Modul. mkisofs Das Programm &man.mkisofs.8; aus dem Port sysutils/cdrtools erstellt ein ISO 9660-Dateisystem, das ein Abbild eines Verzeichnisbaumes ist. Die einfachste Anwendung ist wie folgt: &prompt.root; mkisofs -o Imagedatei /path/to/tree Dateisysteme ISO 9660 Dieses Kommando erstellt eine Imagedatei, die ein ISO 9660-Dateisystem enthält, das eine Kopie des Baumes unter /path/to/tree ist. Dabei werden die Dateinamen auf Namen abgebildet, die den Restriktionen des ISO 9660-Dateisystems entsprechen. Dateien mit Namen, die im ISO 9660-Dateisystem nicht gültig sind, bleiben unberücksichtigt. Dateisysteme HFS Dateisysteme Joliet Es einige Optionen, um diese Beschränkungen zu überwinden. Die unter &unix; Systemen üblichen Rock-Ridge-Erweiterungen werden durch aktiviert, aktiviert die von Microsoft Systemen benutzten Joliet-Erweiterungen und dient dazu, um das von &macos; benutzte HFS zu erstellen. Für CDs, die nur auf FreeBSD-Systemen verwendet werden sollen, kann genutzt werden, um alle Beschränkungen für Dateinamen aufzuheben. Zusammen mit wird ein Abbild des Dateisystems, ausgehend von dem Startpunkt im FreeBSD-Dateibaum, erstellt, obwohl dies den ISO 9660 Standard verletzen kann. CD-ROM bootbare erstellen Die letzte übliche Option ist . Sie wird benutzt, um den Ort eines Bootimages einer El Torito bootbaren CD anzugeben. Das Argument zu dieser Option ist der Pfad zu einem Bootimage ausgehend von der Wurzel des Baumes, der auf die CD geschrieben werden soll. In der Voreinstellung erzeugt &man.mkisofs.8; ein ISO-Image im Diskettenemulations-Modus. Dabei muss das Image genau 1200, 1440 oder 2880 KB groß sein. Einige Bootloader, darunter der auf den FreeBSD-Disks verwendete, kennen keinen Emulationsmodus. Daher sollten Sie in diesen Fällen die Option verwenden. Wenn /tmp/myboot ein bootbares FreeBSD-System enthält, dessen Bootimage sich in /tmp/myboot/boot/cdboot befindet, können Sie ein Abbild eines ISO 9660-Dateisystems in /tmp/bootable.iso wie folgt erstellen: &prompt.root; mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot Wenn Sie md in Ihrem Kernel konfiguriert haben, können Sie danach das Dateisystem einhängen: &prompt.root; mdconfig -a -t vnode -f /tmp/bootable.iso -u 0 &prompt.root; mount -t cd9660 /dev/md0 /mnt Jetzt können Sie überprüfen, dass /mnt und /tmp/myboot identisch sind. Sie können das Verhalten von &man.mkisofs.8; mit einer Vielzahl von Optionen beeinflussen. Insbesondere können Sie das ISO 9660-Dateisystem modifizieren und Joliet- oder HFS-Dateisysteme brennen. Details dazu entnehmen Sie bitte der Hilfeseite &man.mkisofs.8;. burncd CD-ROM brennen Wenn Sie einen ATAPI-CD-Brenner besitzen, können Sie burncd benutzen, um ein ISO-Image auf CD zu brennen. burncd ist Teil des Basissystems und unter /usr/sbin/burncd installiert. Da es nicht viele Optionen hat, ist es leicht zu benutzen: &prompt.root; burncd -f cddevice data imagefile.iso fixate Dieses Kommando brennt eine Kopie von imagefile.iso auf das Gerät cddevice. In der Grundeinstellung wird das Gerät /dev/acd0 benutzt. &man.burncd.8; beschreibt, wie die Schreibgeschwindigkeit gesetzt wird, die CD ausgeworfen wird und Audiodaten geschrieben werden. cdrecord Wenn Sie keinen ATAPI-CD-Brenner besitzen, benutzen Sie cdrecord, um CDs zu brennen. cdrecord ist nicht Bestandteil des Basissystems. Sie müssen es entweder aus den Ports in sysutils/cdrtools oder dem passenden Paket installieren. Änderungen im Basissystem können Fehler im binären Programm verursachen und führen möglicherweise dazu, dass Sie einen Untersetzer brennen. Sie sollten daher den Port aktualisieren, wenn Sie Ihr System aktualisieren bzw. wenn Sie STABLE verfolgen, den Port aktualisieren, wenn es eine neue Version gibt. Obwohl cdrecord viele Optionen besitzt, ist die grundlegende Anwendung einfacher als burncd. Ein ISO 9660-Image erstellen Sie mit: &prompt.root; cdrecord dev=device imagefile.iso Der Knackpunkt in der Benutzung von cdrecord besteht darin, das richtige Argument zu zu finden. Benutzen Sie dazu den Schalter von cdrecord, der eine ähnliche Ausgabe wie die folgende produziert: CD-ROM brennen &prompt.root; cdrecord -scanbus Cdrecord 1.9 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 Jörg Schilling Using libscg version 'schily-0.1' scsibus0: 0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk 0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk 0,2,0 2) * 0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk 0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * scsibus1: 1,0,0 100) * 1,1,0 101) * 1,2,0 102) * 1,3,0 103) * 1,4,0 104) * 1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM 1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner 1,7,0 107) * Für die aufgeführten Geräte in der Liste wird das passende Argument zu gegeben. Benutzen Sie die drei durch Kommas separierten Zahlen, die zu Ihrem CD-Brenner angegeben sind, als Argument für . Im Beispiel ist das CDRW-Gerät 1,5,0, so dass die passende Eingabe dev=1,5,0 wäre. Einfachere Wege das Argument anzugeben, sind in &man.cdrecord.1; beschrieben. Dort sollten Sie auch nach Informationen über Audiospuren, das Einstellen der Geschwindigkeit und ähnlichem suchen. Kopieren von Audio-CDs Um eine Kopie einer Audio-CD zu erstellen, kopieren Sie die Stücke der CD in einzelne Dateien und brennen diese Dateien dann auf eine leere CD. Das genaue Verfahren hängt davon ab, ob Sie ATAPI- oder SCSI-Laufwerke verwenden. SCSI-Laufwerke Kopieren Sie die Audiodaten mit cdda2wav: &prompt.user; cdda2wav -v255 -D2,0 -B -Owav Die erzeugten .wav Dateien schreiben Sie mit cdrecord auf eine leere CD: &prompt.user; cdrecord -v dev=2,0 -dao -useinfo *.wav Das Argument von gibt das verwendete Gerät an, das Sie, wie in beschrieben, ermitteln können. ATAPI-Laufwerke Der ATAPI-CD-Treiber stellt die einzelnen Stücke der CD über die Dateien /dev/acddtnn, zur Verfügung. d bezeichnet die Laufwerksnummer und nn ist die Nummer des Stücks. Die Nummer ist immer zweistellig, das heißt es wird, wenn nötig, eine führende Null ausgegeben. Die Datei /dev/acd0t01 ist also das erste Stück des ersten CD-Laufwerks. /dev/acd0t02 ist das zweite Stück und /dev/acd0t03 das dritte. Überprüfen Sie stets, ob die entsprechenden Dateien im Verzeichnis /dev auch angelegt werden. Sind die Einträge nicht vorhanden, weisen Sie Ihr System an, das Medium erneut zu testen: &prompt.root; dd if=/dev/acd0 of=/dev/null count=1 Unter &os; 4.X werden diese Einträge nicht mit dem Wert Null vordefiniert. Falls die entsprechenden Einträge unter /dev nicht vorhanden sind, müssen Sie diese hier von MAKEDEV anlegen lassen: &prompt.root; cd /dev &prompt.root; sh MAKEDEV acd0t99 Die einzelnen Stücke kopieren Sie mit &man.dd.1;. Sie müssen dazu eine spezielle Blockgröße angeben: &prompt.root; dd if=/dev/acd0t01 of=track1.cdr bs=2352 &prompt.root; dd if=/dev/acd0t02 of=track2.cdr bs=2352 ... Die kopierten Dateien können Sie dann mit burncd brennen. Auf der Kommandozeile müssen Sie angeben, dass Sie Audio-Daten brennen wollen und dass das Medium fixiert werden soll: &prompt.root; burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate Kopieren von Daten-CDs Sie können eine Daten-CD in eine Datei kopieren, die einem Image entspricht, das mit &man.mkisofs.8; erstellt wurde. Mit Hilfe dieses Images können Sie jede Daten-CD kopieren. Das folgende Beispiel verwendet acd0 für das CD-ROM-Gerät. Wenn Sie ein anderes Laufwerk benutzen, setzen Sie bitte den richtigen Namen ein. &prompt.root; dd if=/dev/acd0 of=file.iso bs=2048 Danach haben Sie ein Image, das Sie wie oben beschrieben, auf eine CD brennen können. Einhängen von Daten-CDs Nachdem Sie eine Daten-CD gebrannt haben, wollen Sie wahrscheinlich auch die Daten auf der CD lesen. Dazu müssen Sie die CD in den Dateibaum einhängen. Die Voreinstellung für den Typ des Dateisystems von &man.mount.8; ist UFS. Das System wird die Fehlermeldung Incorrect super block ausgeben, wenn Sie versuchen, die CD mit dem folgenden Kommando einzuhängen: &prompt.root; mount /dev/cd0 /mnt Auf der CD befindet sich ja kein UFS Dateisystem, so dass der Versuch, die CD einzuhängen fehlschlägt. Sie müssen &man.mount.8; sagen, dass es ein Dateisystem vom Typ ISO9660 verwenden soll. Dies erreichen Sie durch die Angabe von auf der Kommandozeile. Wenn Sie also die CD-ROM /dev/cd0 in /mnt einhängen wollen, führen Sie folgenden Befehl aus: &prompt.root; mount -t cd9660 /dev/cd0c /mnt Abhängig vom verwendeten CD-ROM kann der Gerätename von dem im Beispiel (/dev/cd0) abweichen. Die Angabe von führt &man.mount.cd9660.8; aus, so dass das Beispiel verkürzt werden kann: &prompt.root; mount_cd9660 /dev/cd0 /mnt Auf diese Weise können Sie Daten-CDs von jedem Hersteller verwenden. Es kann allerdings zu Problemen mit CDs kommen, die verschiedene ISO9660-Erweiterungen benutzen. So speichern Joliet-CDs alle Dateinamen unter Verwendung von zwei Byte langen Unicode-Zeichen. Zwar unterstützt der &os;-Kernel derzeit noch kein Unicode, der CD9660-Treiber erlaubt es aber, zur Laufzeit eine Konvertierungstabelle zu laden. Tauchen bei Ihnen also statt bestimmter Zeichen nur Fragezeichen auf, so müssen Sie über die Option den benötigten Zeichensatz angeben. Weitere Informationen zu diesem Problem finden Sie in der Manualpage &man.mount.cd9660.8;. Damit der Kernel diese Zeichenkonvertierung (festgelegt durch die Option ) erkennt, müssen Sie das Kernelmodul cd9660_iconv.ko laden. Dazu fügen Sie entweder folgende Zeile in die Datei loader.conf ein: cd9660_iconv_load="YES" Danach müssen Sie allerdings Ihr System neu starten. Alternativ können Sie das Kernelmodul auch direkt über &man.kldload.8; laden. Manchmal werden Sie die Meldung Device not configured erhalten, wenn Sie versuchen, eine CD-ROM einzuhängen. Für gewöhnlich liegt das daran, dass das Laufwerk meint es sei keine CD eingelegt, oder dass das Laufwerk auf dem Bus nicht erkannt wird. Es kann einige Sekunden dauern, bevor das Laufwerk merkt, dass eine CD eingelegt wurde. Seien Sie also geduldig. Manchmal wird ein SCSI-CD-ROM nicht erkannt, weil es keine Zeit hatte, auf das Zurücksetzen des Busses zu antworten. Wenn Sie ein SCSI-CD-ROM besitzen, sollten Sie die folgende Zeile in Ihre Kernelkonfiguration aufnehmen und einen neuen Kernel bauen: options SCSI_DELAY=15000 Die Zeile bewirkt, dass nach dem Zurücksetzen des SCSI-Busses beim Booten 15 Sekunden gewartet wird, um dem CD-ROM-Laufwerk genügend Zeit zu geben, darauf zu antworten. Brennen von rohen CDs Sie können eine Datei auch direkt auf eine CD brennen, ohne vorher auf ihr ein ISO 9660-Dateisystem einzurichten. Einige Leute nutzen dies, um Datensicherungen durchzuführen. Diese Vorgehensweise hat den Vorteil, dass Sie schneller als das Brennen einer normalen CD ist. &prompt.root; burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate Wenn Sie die Daten von einer solchen CD wieder zurückbekommen wollen, müssen Sie sie direkt von dem rohen Gerät lesen: &prompt.root; tar xzvf /dev/acd1 Eine auf diese Weise gefertigte CD können Sie nicht in das Dateisystem einhängen. Sie können Sie auch nicht auf einem anderen Betriebssystem lesen. Wenn Sie die erstellten CDs in das Dateisystem einhängen oder mit anderen Betriebssystemen austauschen wollen, müssen Sie &man.mkisofs.8; wie oben beschrieben benutzen. Marc Fonvieille Beigetragen von CD-Brenner ATAPI/CAM Treiber Der ATAPI/CAM Treiber Mit diesem Treiber kann auf ATAPI-Geräte (wie CD-ROM-, CD-RW- oder DVD-Laufwerke) mithilfe des SCSI-Subsystems zugegriffen werden. Damit können Sie SCSI-Werkzeuge, wie sysutils/cdrdao oder &man.cdrecord.1;, zusammen mit einem ATAPI-Gerät benutzen. Wenn Sie den Treiber benutzen wollen, fügen Sie die folgende Zeile in /boot/loader.conf ein: atapicam_load="YES" Danach müssen Sie Ihr System neu starten, um den Treiber zu aktivieren. Alternativ können Sie die Unterstützung für &man.atapicam.4; auch in Ihren Kernel kompilieren. Dazu fügen Sie die folgende Zeile in Ihre Kernelkonfigurationsdatei ein: device atapicam Die folgenden Zeilen werden ebenfalls benötigt, sollten aber schon Teil der Kernelkonfiguration sein: device ata device scbus device cd device pass Übersetzen und installieren Sie den neuen Kernel. Der CD-Brenner sollte nun beim Neustart des Systems erkannt werden: acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4 cd0 at ata1 bus 0 target 0 lun 0 cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device cd0: 16.000MB/s transfers cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed Über den Gerätenamen /dev/cd0 können Sie nun auf das Laufwerk zugreifen. Wenn Sie beispielsweise eine CD-ROM in /mnt einhängen wollen, benutzen Sie das nachstehende Kommando: &prompt.root; mount -t cd9660 /dev/cd0 /mnt Die SCSI-Adresse des Brenners können Sie als root wie folgt ermitteln: &prompt.root; camcontrol devlist <MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0) Die SCSI-Adresse 1,0,0 können Sie mit den SCSI-Werkzeugen, zum Beispiel &man.cdrecord.1;, verwenden. Weitere Informationen über das ATAPI/CAM- und das SCSI-System erhalten Sie in den Hilfeseiten &man.atapicam.4; und &man.cam.4;. Marc Fonvieille Beigetragen von Andy Polyakov Mit Beiträgen von DVDs benutzen DVD brennen Einführung Nach der CD ist die DVD die nächste Generation optischer Speichermedien. Auf einer DVD können mehr Daten als auf einer CD gespeichert werden. DVDs werden heutzutage als Standardmedium für Videos verwendet. Für beschreibbare DVDs existieren fünf Medienformate: DVD-R: Dies war das erste verfügbare Format. Das Format wurde vom DVD-Forum festgelegt. Die Medien sind nur einmal beschreibbar. DVD-RW: Dies ist die wiederbeschreibbare Version des DVD-R Standards. Eine DVD-RW kann ungefähr 1000 Mal beschrieben werden. DVD-RAM: Dies ist ebenfalls ein wiederbeschreibbares Format, das vom DVD-Forum unterstützt wird. Eine DVD-RAM verhält sich wie eine Wechselplatte. Allerdings sind die Medien nicht kompatibel zu den meisten DVD-ROM-Laufwerken und DVD-Video-Spielern. DVD-RAM wird nur von wenigen Brennern unterstützt. Wollen Sie DVD-RAM einsetzen, sollten Sie lesen. DVD+RW: Ist ein wiederbeschreibbares Format, das von der DVD+RW Alliance festgelegt wurde. Eine DVD+RW kann ungefähr 1000 Mal beschrieben werden. DVD+R: Dieses Format ist die nur einmal beschreibbare Variante des DVD+RW Formats. Auf einer einfach beschichteten DVD können 4.700.000.000 Bytes gespeichert werden. Das sind 4,38 GB oder 4485 MB (1 Kilobyte sind 1024 Bytes). Die physischen Medien sind unabhängig von der Anwendung. Ein DVD-Video ist eine spezielle Anordnung von Dateien, die auf irgendein Medium (zum Beispiel DVD-R, DVD+R oder DVD-RW) geschrieben werden kann. Bevor Sie ein Medium auswählen, müssen Sie sicherstellen, dass der Brenner und der DVD-Spieler (ein Einzelgerät oder ein DVD-ROM-Laufwerk eines Rechners) mit dem Medium umgehen können. Konfiguration Das Programm &man.growisofs.1; beschreibt DVDs. Das Kommando ist Teil der Anwendung dvd+rw-tools (sysutils/dvd+rw-tools). dvd+rw-tools kann mit allen DVD-Medien umgehen. Um die Geräte anzusprechen, brauchen die Werkzeuge das SCSI-Subsystem. Daher muss der Kernel den ATAPI/CAM-Treiber zur Verfügung stellen. Der Treiber ist mit USB-Brennern nutzlos; die Konfiguration von USB-Geräten behandelt . Für ATAPI-Geräte müssen Sie ebenfalls DMA-Zugriffe aktivieren. Fügen Sie dazu die nachstehende Zeile in die Datei /boot/loader.conf ein: hw.ata.atapi_dma="1" Bevor Sie dvd+rw-tools mit Ihrem DVD-Brenner benutzen, lesen Sie bitte die Hardware-Informationen auf der Seite dvd+rw-tools' hardware compatibility notes. Wenn Sie eine grafische Oberfläche bevorzugen, schauen Sie sich bitte den Port sysutils/k3b an. Der Port bietet eine leicht zu bedienende Schnittstelle zu &man.growisofs.1; und vielen anderen Werkzeugen. Daten-DVDs brennen &man.growisofs.1; erstellt mit dem Programm mkisofs das Dateisystem und brennt anschließend die DVD. Vor dem Brennen brauchen Sie daher kein Abbild der Daten zu erstellen. Wenn Sie von den Daten im Verzeichnis /path/to/data eine DVD+R oder eine DVD-R brennen wollen, benutzen Sie das nachstehende Kommando: &prompt.root; growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/data Die Optionen werden an &man.mkisofs.8; durchgereicht und dienen zum Erstellen des Dateisystems (hier: ein ISO-9660-Dateisystem mit Joliet- und Rock-Ridge-Erweiterungen). Weiteres entnehmen Sie bitte der Hilfeseite &man.mkisofs.8;. Die Option wird für die erste Aufnahme einer Session benötigt, egal ob Sie eine Multi-Session-DVD brennen oder nicht. Für /dev/cd0 müssen Sie den Gerätenamen Ihres Brenners einsetzen. Die Option schließt das Medium, weitere Daten können danach nicht mehr angehängt werden. Durch die Angabe dieser Option kann das Medium von mehr DVD-ROM-Laufwerken gelesen werden. Sie können auch ein vorher erstelltes Abbild der Daten brennen. Die nachstehende Kommandozeile brennt das Abbild in der Datei imagefile.iso: &prompt.root; growisofs -dvd-compat -Z /dev/cd0=imagefile.iso Die Schreibgeschwindigkeit hängt von den verwendeten Medium sowie dem verwendeten Gerät ab und sollte automatisch gesetzt werden. Falls Sie die Schreibgeschwindigkeit vorgeben möchten, verwenden Sie den Parameter . Weiteres erfahren Sie in der Hilfeseite &man.growisofs.1;. DVD DVD-Video DVD-Videos brennen Ein DVD-Video ist eine spezielle Anordnung von Dateien, die auf den ISO-9660 und den micro-UDF (M-UDF) Spezifikationen beruht. Ein DVD-Video ist auf eine bestimmte Datei-Hierarchie angewiesen. Daher müssen Sie DVDs mit speziellen Programmen wie multimedia/dvdauthor erstellen. Wenn Sie schon ein Abbild des Dateisystems eines DVD-Videos haben, brennen Sie das Abbild wie jedes andere auch. Eine passende Kommandozeile finden Sie im vorigen Abschnitt. Wenn Sie die DVD im Verzeichnis /path/to/video zusammengestellt haben, erstellen Sie das DVD-Video mit dem nachstehenden Kommando: &prompt.root; growisofs -Z /dev/cd0 -dvd-video /path/to/video Die Option wird an &man.mkisofs.8; weitergereicht. Dadurch erstellt &man.mkisofs.8; die Datei-Hierarchie für ein DVD-Video. Weiterhin bewirkt die Angabe von , dass &man.growisofs.1; mit der Option aufgerufen wird. DVD DVD+RW DVD+RW-Medien benutzen Im Gegensatz zu CD-RW-Medien müssen Sie DVD+RW-Medien erst formatieren, bevor Sie die Medien benutzen. Sie sollten &man.growisofs.1; einzetzen, da das Programm Medien automatisch formatiert, wenn es erforderlich ist. Sie können eine DVD+RW aber auch mit dem Kommando dvd+rw-format formatieren: &prompt.root; dvd+rw-format /dev/cd0 Sie müssen das Kommando nur einmal mit neuen Medien laufen lassen. Anschließend können Sie DVD+RWs, wie in den vorigen Abschnitten beschrieben, brennen. Wenn Sie auf einer DVD+RW ein neues Dateisystem erstellen wollen, brauchen Sie die DVD+RW vorher nicht zu löschen. Überschreiben Sie einfach das vorige Dateisystem indem Sie eine neue Session anlegen: &prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/newdata Mit dem DVD+RW-Format ist es leicht, Daten an eine vorherige Aufnahme anzuhängen. Dazu wird eine neue Session mit der schon bestehenden zusammengeführt. Es wird keine Multi-Session geschrieben, sondern &man.growisofs.1; vergrößert das ISO-9660-Dateisystem auf dem Medium. Das folgende Kommando fügt weitere Daten zu einer vorher erstellten DVD+RW hinzu: &prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata Wenn Sie eine DVD+RW erweitern, verwenden Sie dieselben &man.mkisofs.8;-Optionen wie beim Erstellen der DVD+RW. Um die Kompatibilität mit DVD-ROM-Laufwerken zu gewährleisten, wollen Sie vielleicht die Option einsetzen. Zu einem DVD+RW-Medium können Sie mit dieser Option auch weiterhin Daten hinzufügen. Wenn Sie das Medium aus irgendwelchen Gründen doch löschen müssen, verwenden Sie den nachstehenden Befehl: &prompt.root; growisofs -Z /dev/cd0=/dev/zero DVD DVD-RW DVD-RW-Medien benutzen Eine DVD-RW kann mit zwei Methoden beschrieben werden: Sequential-Recording oder Restricted-Overwrite. Voreingestellt ist Sequential-Recording. Eine neue DVD-RW kann direkt beschrieben werden; sie muss nicht vorher formatiert werden. Allerdings muss eine DVD-RW, die mit Sequential-Recording aufgenommen wurde, zuerst gelöscht werden, bevor eine neue Session aufgenommen werden kann. Der folgende Befehl löscht eine DVD-RW im Sequential-Recording-Modus: &prompt.root; dvd+rw-format -blank=full /dev/cd0 Das vollständige Löschen () dauert mit einem 1x Medium ungefähr eine Stunde. Wenn die DVD-RW im Disk-At-Once-Modus (DAO) aufgenommen wurde, kann Sie mit der Option schneller gelöscht werden. Um eine DVD-RW im DAO-Modus zu brennen, benutzen Sie das folgende Kommando: &prompt.root; growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.iso Die Option sollte nicht erforderlich sein, da &man.growisofs.1; den DAO-Modus erkennt. Der Restricted-Overwrite-Modus sollte mit jeder DVD-RW verwendet werden, da er flexibler als der voreingestellte Sequential-Recording-Modus ist. Um Daten auf eine DVD-RW im Sequential-Recording-Modus zu schreiben, benutzen Sie dasselbe Kommando wie für die anderen DVD-Formate: &prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/data Wenn Sie weitere Daten zu einer Aufnahme hinzufügen wollen, benutzen Sie die Option von &man.growisofs.1;. Werden die Daten im Sequential-Recording-Modus hinzugefügt, wird eine neue Session erstellt. Das Ergebnis ist ein Multi-Session-Medium. Eine DVD-RW im Restricted-Overwrite-Modus muss nicht gelöscht werden, um eine neue Session aufzunehmen. Sie können das Medium einfach mit der Option überschreiben, ähnlich wie bei DVD+RW. Mit der Option können Sie das ISO-9660-Dateisystem, wie mit einer DVD+RW, vergrößern. Die DVD enthält danach eine Session. Benutzen sie das nachstehende Kommando, um den Restricted-Overwrite-Modus einzustellen: &prompt.root; dvd+rw-format /dev/cd0 Das folgende Kommando stellt den Modus wieder auf Sequential-Recording zurück: &prompt.root; dvd+rw-format -blank=full /dev/cd0 Multi-Session Nur wenige DVD-ROM-Laufwerke können Multi-Session-DVDs lesen. Meist lesen die Spieler nur die erste Session. Mehrere Sessions werden von DVD+R, DVD-R und DVD-RW im Sequential-Recording-Modus unterstützt. Im Modus Restricted-Overwrite gibt es nur eine Session. Wenn das Medium noch nicht geschlossen ist, erstellt das nachstehende Kommando eine neue Session auf einer DVD+R, DVD-R oder DVD-RW im Sequential-Recording-Modus: &prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata Wird diese Kommandozeile mit DVD+RW- oder DVD-RW-Medien im Restricted-Overwrite-Modus benutzt, werden die neuen Daten mit den Daten der bestehenden Session zusammengeführt. Das Medium enthält danach eine Session. Auf diesem Weg werden neue Daten zu einer bestehenden Session hinzugefügt. Für den Anfang und das Ende einer Session wird auf dem Medium zusätzlicher Platz verbraucht. Um den Speicherplatz auf dem Medium optimal auszunutzen, sollten Sie daher Sessions mit vielen Daten hinzufügen. Auf ein DVD+R-Medium passen maximal 154 Sessions, 2000 Sessions auf ein DVD-R-Medium und 127 Sessions auf eine DVD+R Double Layer. Weiterführendes Das Kommando dvd+rw-mediainfo /dev/cd0 zeigt Informationen über eine im Laufwerk liegende DVD an. Weiteres zu den dvd+rw-tools lesen Sie bitte in der Hilfeseite &man.growisofs.1;, auf der dvd+rw-tools Web-Seite oder in den Archiven der cdwrite-Mailingliste. DVD-RAM DVD DVD-RAM Konfiguration DVD-RAM-fähige Brenner werden sowohl mit SCSI- als auch mit ATAPI-Schnittstelle angeboten. Verwenden Sie ein ATAPI-Gerät, müssen Sie den DMA-Modus aktivieren. Dazu fügen Sie die folgende Zeile in /boot/loader.conf ein: hw.ata.atapi_dma="1" Das Medium vorbereiten Wie weiter oben in diesem Kapitel bereits erwähnt, kann man eine DVD-RAM mit einer Wechselplatte vergleichen. Wie diese muss auch eine DVD-RAM vor dem ersten Einsatz vorbereitet werden. In unserem Beispiel wird das gesamte Medium mit dem Standard-UFS2-Dateisystem formatiert. Dazu geben Sie als root bei eingelegter DVD-RAM die folgenden Befehle ein: &prompt.root; dd if=/dev/zero of=/dev/acd0 bs=2k count=1 &prompt.root; bsdlabel -Bw acd0 &prompt.root; newfs /dev/acd0 Denken Sie dabei daran, dass Sie gegebenenfalls die Gerätedatei (hier acd0) an Ihre Konfiguration anpassen müssen. Das Medium einsetzen Nachdem Sie das Medium vorbereitet haben, können Sie das DVD-RAM-Medium in Ihren Verzeichnisbaum einhängen: &prompt.root; mount /dev/acd0 /mnt Danach können Sie schreibend und lesend auf das Medium zugreifen. Julio Merino Original von Martin Karlsson Umgeschrieben von Disketten benutzen Disketten sind nützlich, wenn kein anderes bewegliches Speichermedium vorhanden ist oder wenn nur kleine Datenmengen transferiert werden sollen. Dieser Abschnitt beschreibt die Handhabung von Disketten unter FreeBSD. Hauptsächlich geht es um die Formatierung und Benutzung von 3,5 Zoll Disketten, doch lassen sich die Konzepte leicht auf Disketten anderer Formate übertragen. Disketten formatieren Die Gerätedateien Wie auf jedes andere Gerät auch, greifen Sie auf Disketten über Einträge im Verzeichnis /dev zu. Verwenden Sie dazu die Einträge /dev/fdN. Formatierung Bevor eine Diskette benutzt werden kann, muss Sie (low-level) formatiert werden, was normalerweise der Hersteller schon gemacht hat. Sie können die Diskette allerdings noch einmal formatieren, um das Medium zu überprüfen. Es ist möglich, die Kapazität der Diskette zu verändern, allerdings sind die meisten Disketten auf 1440 kB ausgelegt. Mit &man.fdformat.1; formatieren Sie eine Diskette. Das Kommando erwartet die Angabe eines Gerätenamens. Achten Sie bei der Formatierung auf Fehlermeldungen, die schlechte Speichermedien anzeigen. Disketten formatieren Die Disketten werden mithilfe der Gerätedatei /dev/fdN formatiert. Legen Sie eine 3,5 Zoll Diskette in Ihr Laufwerk ein und führen das folgende Kommando aus: &prompt.root; /usr/sbin/fdformat -f 1440 /dev/fd0 Das Disklabel Nach dem Formatieren muss auf der Diskette ein Disklabel erstellt werden. Das Disklabel wird später zerstört, ist aber notwendig, um die Größe und Geometrie der Diskette zu erkennen. Das Disklabel gilt für die ganze Diskette und enthält alle Informationen über die Geometrie der Diskette. Eine Liste der möglichen Geometrien finden Sie in /etc/disktab. Erstellen Sie nun das Label mit &man.bsdlabel.8;: &prompt.root; /sbin/bsdlabel -B -w /dev/fd0 fd1440 Das Dateisystem Auf der Diskette muss nun ein Dateisystem erstellt werden (high-level Formatierung), damit FreeBSD von der Diskette lesen und auf sie schreiben kann. Das Disklabel wird durch das Anlegen eines Dateisystems zerstört. Falls Sie die Diskette später erneut formatieren wollen, müssen Sie dann auch ein neues Disklabel anlegen. Sie können entweder UFS oder FAT als Dateisystem verwenden. Für Floppies ist FAT das beste Dateisystem. Das folgende Kommando legt ein Dateisystem auf der Diskette an: &prompt.root; /sbin/newfs_msdos /dev/fd0 Die Diskette kann nun benutzt werden. Verwenden der Diskette Zum Einhägen der Diskette in das Dateisystem verwenden Sie den Befehl &man.mount.msdosfs.8;. Sie können auch den Port emulators/mtools verwenden, um mit der Diskette zu arbeiten. Bandmedien benutzen Bandmedien Die wichtigsten Bandmedien sind 4mm, 8mm, QIC, Mini-Cartridge und DLT. 4mm (DDS: Digital Data Storage) Bandmedien DDS (4mm) Bänder Bandmedien QIC Bänder Die 4mm-Bänder ersetzen mehr und mehr das QIC-Format als Backupmedium der Wahl für Workstations. Dieser Trend nahm stark zu, als Conner die Firma Archive, einen führenden Hersteller von QIC-Laufwerken, aufkaufte und die Produktion von QIC-Laufwerken stoppte. 4mm-Laufwerke sind klein und ruhig, haben aber nicht den gleichen Ruf der Zuverlässigkeit, den die 8mm-Laufwerke genießen. Die 4mm-Kassetten sind preiswerter und mit den Maßen 76,2 x 50,8 x 12,7 mm (3 x 2 x 0,5 Inch) kleiner als die 8mm-Kassetten. Sowohl die 4mm- als auch die 8mm-Magnetköpfe haben eine relativ kurze Lebensdauer, weil beide die gleiche Helical-Scan-Technik benutzen. Der Datendurchsatz dieser Laufwerke beginnt bei etwa 150 kByte/s, Spitzenwerte liegen bei etwa 500 kByte/s. Die Datenkapazität liegt zwischen 1,3 GB und 2 GB. Die meisten Geräte haben eine Hardwarekompression eingebaut, die die Kapazität ungefähr verdoppelt. Es gibt Multi-Drive-Einheiten für Bandbibliotheken mit bis zu 6 Laufwerken in einem Gehäuse und automatischem Bandwechsel. Die Kapazität einer solchen Bibliothek liegt bei 240 GB. Der Standard DDS-3 unterstützt nun Bandkapazitäten bis zu 12 GB (oder komprimiert 24 GB). 4mm-Laufwerke, ebenso wie 8mm-Laufwerke, verwenden Helical-Scan. Alle Vor- und Nachteile von Helical-Scan gelten sowohl für 4mm- als auch für 8mm-Laufwerke. Bänder sollten nach 2.000 Banddurchläufen oder 100 vollen Backups ersetzt werden. 8mm (Exabyte) Bandmedien Exabyte (8mm) Bänder 8mm-Bänder sind die verbreitetsten SCSI-Bandlaufwerke; sie sind das geeignetste Bandformat zum Austausch von Bändern. Fast an jedem Standort gibt es ein 8mm-Bandlaufwerk mit 2 GB. 8mm-Bänder sind zuverlässig, gut zu handhaben und arbeiten leise. Bandkassetten sind preiswert und klein mit 122 x 84 x 15 mm (4,8 x 3,3 x 0,6 Inch). Ein Nachteil der 8mm-Technik ist die relativ kurze Lebensdauer des Schreib-/Lesekopfs und der Bänder auf Grund der hohen Relativgeschwindigkeit des Bandes über die Köpfe hinweg. Der Datendurchsatz liegt ungefähr zwischen 250 kByte/s und 500 kByte/s. Die Datenkapazität beginnt bei 300 MB und erreicht bis zu 7 GB bei den Spitzengeräten. Die meisten Geräte haben eine Hardwarekompression eingebaut, die die Kapazität ungefähr verdoppelt. Diese Laufwerke sind erhältlich in Form von Einzelgeräten oder als Multi-Drive-Bandbibliotheken mit 6 Laufwerken und 120 Bändern in einem Gehäuse. Die Bänder werden von der Geräteeinheit automatisch gewechselt. Die Kapazität einer solchen Bibliothek liegt bei 840 GB und mehr. Das Exabyte-Modell Mammoth unterstützt 12 GB auf einem Band (24 GB mit Kompression) und kostet etwa doppelt so viel wie ein konventionelles Bandlaufwerk. Die Daten werden mittels Helical-Scan auf das Band aufgezeichnet, die Köpfe sind leicht schräg zum Medium angebracht (mit einem Winkel von etwa 6 Grad). Das Band wickelt sich 270 Grad um die Spule, die die Köpfe trägt. Die Spule dreht sich, während das Band darüberläuft. Das Resultat ist eine hohe Datendichte und eng gepackte Spuren, die von einem Rand des Bands zum gegenüberliegenden quer über das Band abgewinkelt verlaufen. QIC Bandmedien QIC-150 QIC-150-Bänder und -Laufwerke sind wohl der am weitesten verbreitete Bandtyp überhaupt. QIC-Bandlaufwerke sind die preiswertesten seriösen Backupgeräte, die angeboten werden. Der Nachteil dabei ist der hohe Preis der Bänder. QIC-Bänder sind im Vergleich zu 8mm- oder 4mm-Bändern bis zu fünf Mal teurer, wenn man den Preis auf 1 GB Datenkapazität umrechnet. Aber wenn Ihr Bedarf mit einem halben Dutzend Bänder abgedeckt werden kann, mag QIC die richtige Wahl sein. QIC ist der gängigste Bandlaufwerkstyp. Jeder Standort hat ein QIC-Laufwerk der einen oder anderen Dichte. Aber gerade das ist der Haken an der Sache, QIC bietet eine große Anzahl verschiedener Datendichten auf physikalisch ähnlichen (manchmal gleichen) Bändern. QIC-Laufwerke sind nicht leise. Diese Laufwerke suchen lautstark die richtige Bandstelle, bevor sie mit der Datenaufzeichnung beginnen. Sie sind während des Lesens, Schreibens und Suchens deutlich hörbar. Die Abmessungen der QIC-Kassetten betragen 152 x 102 x 17 mm (6 x 4 x 0,7 Inch). Der Datendurchsatz liegt ungefähr zwischen 150 kByte/s und 500 kByte/s. Die Datenkapazität reicht von 40 MB bis zu 15 GB. Hardwarekompression ist in vielen der neueren QIC-Laufwerke eingebaut. QIC-Laufwerke werden heute seltener eingesetzt; sie werden von den DAT-Laufwerken abgelöst. Die Daten werden auf dem Band in Spuren aufgezeichnet. Die Spuren verlaufen entlang der Längsachse des Bandmediums von einem Ende zum anderen. Die Anzahl der Spuren, und damit auch die Breite einer Spur, variiert mit der Kapazität des Laufwerks. Die meisten, wenn nicht alle neueren Laufwerke sind rückwärtskompatibel, zumindest zum Lesen (aber oft auch zum Schreiben). QIC hat einen guten Ruf bezüglich der Datensicherheit (die Mechanik ist einfacher und robuster als diejenige der Helical-Scan-Laufwerke). Bänder sollten nach 5,000 Backups ersetzt werden. DLT Bandmedien DLT DLT hat die schnellste Datentransferrate von allen hier aufgelisteten Gerätetypen. Das 1/2-Inch-Band (12,7 mm) befindet sich in einer Spulkassette mit den Abmessungen 101,6 x 101,6 x 25,4 mm (4 x 4 x 1 Inch). Die eine Seite der Kassette hat eine bewegliche Abdeckung. Der Laufwerksmechanismus öffnet diese Abdeckung und zieht die Bandführung heraus. Die Bandführung trägt ein ovales Loch, die das Laufwerk zum Einhängen des Bandes benutzt. Die Aufwickelspule befindet sich im Innern des Bandlaufwerks. Bei allen anderen hier besprochenen Bandkassetten (9-Spur-Bänder sind die einzige Ausnahme) befinden sich sowohl die Auf- als auch die Abwickelspule im Inneren der Bandkassette. Der Datendurchsatz liegt bei etwa 1,5 MBytes/s, der dreifache Durchsatz der 4mm-, 8mm- oder QIC-Bandlaufwerke. Die Datenkapazität reicht von 10 GB bis 20 GB für Einfachlaufwerke. Auch Mehrfachbandgeräte sind erhältlich, sowohl als Bandwechsler wie auch als Multi-Drive-Bandbibliotheken, die Platz für 5 bis 900 Bänder verteilt auf 1 bis 20 Laufwerke enthalten, mit einer Speicherkapazität von 50 GB bis 9 TB. Mit Kompression unterstützt das Format DLT Type IV bis zu 70 GB Kapazität. Die Daten werden auf dem Band in Spuren aufgezeichnet, die parallel zur Bewegungsrichtung verlaufen (gerade so wie bei den QIC-Bändern). Zwei Spuren werden dabei gleichzeitig beschrieben. Die Lebenszeit der Lese- und Schreibköpfe sind relativ lang; denn sobald das Band anhält, gibt es keine Relativbewegung mehr zwischen den Köpfen und dem Band. AIT Bandmedien AIT AIT ist ein neues Format von Sony, das (mit Kompression) bis zu 50 GB pro Band speichern kann. Die Bänder haben einen Speicherchip, der einen Index mit dem Inhalt des Bandes anlegt. Dieser Index kann vom Bandlaufwerk zur schnellen Bestimmung der Lage von Dateien auf dem Band benutzt werden, während andere Bänder einige Minuten zur Lokalisierung benötigen. Entsprechende Software wie etwa SAMS:Alexandria können 40 oder mehr AIT-Bandbibliotheken verarbeiten, indem sie direkt mit dem Speicherchip des Bandes kommunizieren, wenn der Bandinhalt am Bildschirm dargestellt werden soll oder bestimmt werden soll, welche Dateien auf welchem Band gespeichert sind, oder um das richtige Band zu lokalisieren, zu laden und Daten vom Band zurückzuspielen. Bibliotheken dieser Art liegen in der Preiskategorie von $20,000, womit sie etwas aus dem Hobbymarkt herausfallen. Die erste Benutzung eines neuen Bands Der Versuch ein neues, vollkommen leeres Band ohne weiteres zu lesen oder zu beschreiben wird schief gehen. Auf der Konsole werden dann Meldungen ähnlich wie folgt ausgegeben: sa0(ncr1:4:0): NOT READY asc:4,1 0(ncr1:4:0): Logical unit is in process of becoming ready Das Band enthält nämlich keinen Identifier-Block (Blocknummer 0). Alle QIC-Bandlaufwerke seit der Einführung des QIC-525-Standards schreiben einen Identifier-Block auf das Band. Es gibt zwei Lösungen: mt fsf 1 veranlasst das Bandlaufwerk einen Identifier-Block auf das Band zu schreiben. Das Band durch Drücken des Bandauswurfknopfs an der Vorderseite des Bandgeräts auswerfen. Danach das Band wieder einlegen und mit dump Daten auf das Band übertragen. Das Kommando dump gibt die Meldung DUMP: End of tape detected zurück und die Konsole zeigt: HARDWARE FAILURE info:280 asc:80,96. Das Band zurückspulen mit dem Kommando: mt rewind. Nachfolgende Bandoperationen werden dann erfolgreich ausgeführt. Was ist mit Backups auf Disketten? Kann ich Disketten zum Backup meiner Daten verwenden? Backup Disketten Disketten Disketten sind kein wirklich geeignetes Medium für Backups aus folgenden Gründen: Disketten sind unzuverlässig, besonders langfristig. Speichern und Wiederherstellen ist sehr langsam. Sie haben eine sehr eingeschränkte Kapazität (Die Zeiten sind längst vorbei, wo eine ganze Festplatte auf ein Dutzend Floppies oder so gespeichert werden konnte). Wenn jedoch keine andere Möglichkeit zum Datenbackup vorhanden ist, dann sind Disketten immer noch besser als gar kein Backup. Wenn man gezwungen ist Disketten zu verwenden, dann sollte man auf eine gute Qualität achten. Floppies, die schon einige Jahre im Büro herumgelegen haben, sind eine schlechte Wahl. Ideal sind neue Disketten von einem renommierten Hersteller. Wie mache ich ein Backup auf Disketten? Die beste Art eines Diskettenbackups ist der Befehl &man.tar.1; mit der Mehrfachband-Option , die es ermöglicht ein Backup über mehrere Floppies zu verteilen. Ein Backup aller Dateien im aktuellen Verzeichnis einschließlich aller Unterverzeichnisse wird durch den folgenden Befehl veranlasst (als root): &prompt.root; tar Mcvf /dev/fd0 * Wenn die erste Floppy voll ist, meldet sich &man.tar.1; und verlangt einen Diskettenwechsel (weil &man.tar.1; unabhängig vom Medium arbeitet, wird das nächste Band (Volume) verlangt, was in diesem Zusammenhang eine Diskette bedeutet), in etwa wie folgt: Prepare volume #2 for /dev/fd0 and hit return: Dies wird mit steigender Volumenzahl wiederholt, bis alle angegebenen Dateien archiviert sind. Können Diskettenbackups komprimiert werden? tar gzip Kompression Leider erlaubt es &man.tar.1; nicht, die Option für Multi-Volume-Archive zu verwenden. Man kann natürlich alle Dateien mit &man.gzip.1; komprimieren, sie mit &man.tar.1; auf die Floppies aufspielen, und dann die Dateien wieder &man.gunzip.1; entkomprimieren! Wie werden Diskettenbackups wieder hergestellt? Zur Wiederherstellung des gesamten Archivs verwendet man: &prompt.root; tar Mxvf /dev/fd0 Eine Methode um nur bestimmte Dateien wieder her zu stellen ist mit der ersten Diskette den folgenden Befehl auszuführen: &prompt.root; tar Mxvf /dev/fd0 filename &man.tar.1; wird dann die folgenden Disketten anfordern, bis die benötigte Datei gefunden ist. Wenn man die Diskette kennt, auf der sich die Datei befindet, kann man alternativ diese Diskette auch direkt einlegen und den gleichen Befehl wie oben verwenden. Man beachte, dass, falls die erste Datei eine Fortsetzung einer Datei von einer der vorigen Disketten ist, &man.tar.1; die Warnung ausgibt, dass diese Datei nicht wiederhergestellt werden kann, selbst dann, wenn dies gar nicht verlangt wurde! Lowell Gilbert Beigetragen von Backup-Strategien Wenn Sie eine eigene Backup-Strategie planen, müssen Sie darauf achten, dass jedes der folgenden Probleme von Ihrer Strategie abgedeckt wird: Plattendefekte. Versehentliches Löschen von Dateien. Eine nicht vorhersehbare Korrumpierung von Dateien. Die vollständige Zerstörung Ihres Systems, etwa durch ein Feuer. Dazu gehört auch die Zerstörung von Backups, die am gleichen Ort aufbewahrt werden. Es ist nicht nur möglich, dass ein System für jedes dieser Probleme eine eigene (oft völlig unterschiedliche) Strategie benötigt. Es ist vielmehr unwahrscheinlich (sieht man von Systemen ab, die keine wichtigen Daten enthalten), dass eine Technik alle Problembereiche abdecken kann. Häufig verwendeten Techniken sind unter anderen: Die Archivierung des kompletten Systems auf externen Datenträgern, die an einem gesonderten Ort aufbewahrt werden. Dieser Ansatz schützt zwar vor allen oben angeführten Problemen, ist aber zeitaufwändig. Auch eine Wiederherstellung des Systems ist nicht ohne weiteres möglich. Zwar können Sie Kopien Ihrer Backups auch vor Ort und/oder auf online zugängigen Systemen aufbewahren, was aber nichts daran ändert, dass eine Wiederherstellung, insbesondere für nicht privilegierte Benutzer, nach wie vor nicht ohne weiteres möglich ist. Dateisystem-Snapshots. Diese Technik hilft zwar nur gegen das versehentliche Löschen von Dateien, in einem solchen Fall ist sie aber äußerst hilfreich. Vorteile dieser Technik sind außerdem die leichte und schnelle Implementierung und Handhabung. Das Erstellen von Kopien ganzer Dateisysteme und/oder Platten (etwa durch einen periodischen &man.rsync.1;-Transfer des kompletten Systems). Diese Technik ist insbesondere in Netzwerken mit besonderen Anforderungen nützlich. Der Schutz vor Plattendefekten ist allerdings schlechter als beim Einsatz von RAID. Die Fähigkeiten zur Wiederherstellung gelöschter Dateien sind mit denen von UFS-Snapshots vergleichbar. Ob diese Technik für Sie geeignet ist, hängt also letztlich von Ihren Anforderungen ab. RAID. Minimiert oder vermeidet Ausfallzeiten, die durch einen Plattendefekt verursacht werden könnten. Zwar können Plattendefekte (aufgrund der höheren Anzahl verwendeter Platten) häufiger auftreten, sie stellen aber dann kein so akutes Problem dar. Das Überprüfen von Datei-Fingerprints durch &man.mtree.8;. Dabei handelt es sich zwar um keine Backup-Technik im eigentlichen Sinne, Sie werden durch den Einsatz dieser Werkzeugs aber informiert, dass Sie auf Ihre Backups zurückgreifen müssen. Dies ist insbesondere beim Einsatz von Offline-Backups von großer Bedeutung. Daher sollte diese Technik regelmäßig eingesetzt werden. Es gibt noch zahlreiche weitere Techniken, von denen aber viele nur Variationen der eben beschriebenen Techniken sind. Spezielle Anforderungen erfordern dabei in der Regel auch spezielle Backup-Techniken (so erfordert das Backup einer aktiven Datenbank in der Regel ein auf die eingesetzte Datenbank-Software abgestimmtes Verfahren). Entscheidend ist daher immer, gegen welche Gefahren Sie sich schützen und wie Sie diesen Schutz realisieren wollen. Datensicherung Die drei wichtigsten Programme zur Sicherung von Daten sind &man.dump.8;, &man.tar.1; und &man.cpio.1;. Sichern und Wiederherstellen Datensicherung Backup Backup-Software dump Backup-Software restore dump restore dump und restore sind die traditionellen Backupprogramme in &unix; Systemen. Sie betrachten das Laufwerk als eine Ansammlung von Blöcken, operieren also unterhalb des Abstraktionslevels von Dateien, Links und Verzeichnissen, die die Grundlage des Dateisystemkonzepts bilden. Im Gegensatz zu anderen Backupprogrammen sichert dump ein ganzes Dateisystem auf einem Gerät. Es ist nicht möglich nur einen Teil des Dateisystems, oder einen Verzeichnisbaum, der mehr als ein Dateisystem umfasst, zu sichern. Das dump-Kommando schreibt keine Dateien oder Verzeichnise auf das Band, sondern die Blöcke, aus denen Dateien und Verzeichnisse bestehen. Wenn restore für das Extrahieren von Daten verwendet wird, werden temporäre Dateien standardmässig in /tmp/ abgelegt - wenn Sie von einer Platte mit einem kleinen /tmp-Verzeichnis zurücksichern, müssen Sie möglicherweise die Umgebungsvariable TMPDIR auf ein Verzeichnis mit mehr freiem Speicherplatz setzen, damit die Wiederherstellung gelingt. Wenn Sie mit dump das Root-Verzeichnis sichern, werden /home, /usr und viele andere Verzeichnisse nicht gesichert, da dies normalerweise Mountpunkte für andere Dateisysteme oder symbolische Links zu diesen Dateisystemen sind. dump hat einige Eigenarten, die noch aus den frühen Tagen der Version 6 von AT&T UNIX (ca. 1975) stammen. Die Parameter sind für 9-Spur-Bänder (6250 bpi) voreingestellt, nicht auf die heute üblichen Medien hoher Dichte (bis zu 62.182 ftpi). Bei der Verwendung der Kapazitäten moderner Bandlaufwerke muss diese Voreinstellung auf der Kommandozeile überschrieben werden. .rhosts rdump und rrestore können Daten über Netzwerk auf ein Band, das sich in einem Laufwerk eines anderen Computers befindet, überspielen. Beide Programme benutzen die Funktionen &man.rcmd.3; und &man.ruserok.3; zum Zugriff auf das entfernte Bandlaufwerk. Daher muss der Anwender, der das Backup durchführt, auf dem entfernten Rechner in .rhosts eingetragen sein. Die Argumente zu rdump und rrestore müssen zur Verwendung auf dem entfernten Computer geeignet sein. Wenn Sie zum Beispiel mit rdump von einem FreeBSD-Rechner aus auf ein Exabyte-Bandlaufwerk einer Sun mit Namen komodo zugreifen möchten, setzen Sie das folgende Kommando ab: &prompt.root; /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1 Zum Ausführen dieses Kommandos müssen Sie auf dem entfernten Rechner in .rhosts eingetragen sein. Die r-Kommandos sind ein großes Sicherheitsrisiko, daher sollten Sie deren Verwendung sorgfältig abwägen. Es ist auch möglich, dump und restore über eine gesicherte Verbindung mit ssh einzusetzen: <command>dump</command> mit <application>ssh</application> benutzen &prompt.root; /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \ targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz Sie können ebenfalls mit der internen Methode von dump auf entfernte Rechner zugreifen, indem Sie die Umgebungsvariable RSH setzen: <command>dump</command> über <application>ssh</application> mit gesetzter <envar>RSH</envar> benutzen &prompt.root; RSH=/usr/bin/ssh /sbin/dump -0uan -f tatargetuser@targetmachine.example.com:/dev/sa0 /usr <command>tar</command> Backup-Software tar &man.tar.1; stammt ebenfalls aus Version 6 von AT&T UNIX (ca. 1975). tar arbeitet mit dem Dateisystem, denn es schreibt Dateien und Verzeichnisse auf das Band. tar unterstützt zwar nicht alle Optionen, die bei &man.cpio.1; zur Verfügung stehen, aber dafür erfordert es auch nicht die ungewöhnliche Kommando-Pipeline, die von cpio verwendet wird. tar Seit FreeBSD 5.3 sind sowohl GNU tar als auch bsdtar verfügbar. Die GNU-Version starten Sie über gtar. Sie unterstützt auch entfernte Geräte, wobei die von rdump benutzte Syntax übernommen wurde. Um Daten mit tar auf ein an einer Sun-Workstation (namens komodo) angeschlossenes Exabyte-Bandlaufwerk zu archivieren, geben Sie Folgendes ein: &prompt.root; /usr/bin/gtar cf komodo:/dev/nsa8 . 2>&1 Alternativ können Sie für diese Sicherung auch bsdtar verwenden, indem Sie die Daten über eine Pipeline und rsh an das entfernte Laufwerk senden: &prompt.root; tar cf - . | rsh hostname dd of=tape-device obs=20b Wenn Sie Bedenken bezüglich der Sicherheit beim Backup über das Netz haben, sollten Sie ssh anstatt rsh benutzen. Cpio Backup-Software cpio cpio &man.cpio.1; ist das ursprüngliche Programm von &unix; Systemen zum Dateitransfer mit magnetischen Medien. cpio hat (neben vielen anderen Leistungsmerkmalen) Optionen zum Byte-Swapping, zum Schreiben einer Anzahl verschiedener Archivformate und zum Weiterleiten von Daten an andere Programme über eine Pipeline. Dieses letzte Leistungsmerkmal macht cpio zu einer ausgezeichneten Wahl für Installationsmedien. Leider kann cpio keine Dateibäume durchlaufen, so dass eine Liste der zu bearbeitenden Dateien über stdin angegeben werden muss. cpio unterstützt keine Backups über das Netzwerk. Man kann aber eine Pipeline und rsh verwenden, um Daten an ein entferntes Bandlaufwerk zu senden. &prompt.root; for f in directory_list; do find $f >> backup.list done &prompt.root; cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device" Dabei steht directory_list für eine Aufzählung der Verzeichnisse, die Sie sichern wollen. user@host gibt den Benutzer auf dem Zielrechner an, der die Sicherung laufen lässt. Der Ort der Sicherung wird durch backup_device angegeben (z.B. /dev/nsa0). <command>pax</command> Backup-Software pax pax POSIX IEEE &man.pax.1; ist die Antwort von IEEE/&posix; auf tar und cpio. Über die Jahre hinweg sind die verschiedenen Versionen von tar und cpio leicht inkompatibel geworden. Daher hat &posix;, statt eine Standardisierung zwischen diesen auszufechten, ein neues Archivprogramm geschaffen. pax versucht viele der unterschiedlichen cpio- und tar-Formate zu lesen und zu schreiben, außerdem einige neue, eigene Formate. Die Kommandostruktur ähnelt eher cpio als tar. <application>Amanda</application> Backup-Software Amanda Amanda Amanda (Advanced Maryland Network Disk Archiver) ist ein Client/Server-Backupsystem, nicht nur ein einzelnes Programm. Ein Amanda-Server kann auf einem einzigen Bandlaufwerk Datensicherungen von jeder beliebigen Anzahl von Computern speichern, sofern auf diesen jeweils ein Amanda-Client läuft und sie über Netzwerk mit dem Amanda-Server verbunden sind. Ein häufiges Problem bei Standorten mit einer Anzahl großer Festplatten ist, dass das Kopieren der Daten auf Band langsamer vor sich geht als solche Daten anfallen. Amanda löst dieses Problem durch Verwendung einer Holding Disk, einer Festplatte zum gleichzeitigen Zwischenspeichern mehrerer Dateisysteme. Für Datensicherungen über einen längeren Zeitraum erzeugt Amanda Archivsets von allen Dateisystemen, die in Amandas Konfigurationsdatei genannt werden. Ein Archivset ist eine Gruppe von Bändern mit vollen Backups und Reihen von inkrementellen (oder differentiellen) Backups, die jeweils nur die Unterschiede zum vorigen Backup enthalten. Zur Wiederherstellung von beschädigten Dateisystemen benötigt man Das Letzte volle Backup und alle darauf folgenden inkrementellen Backups. Die Konfigurationsdatei ermöglicht die Feineinstellung der Backups und des Netzwerkverkehrs von Amanda. Amanda kann zum Schreiben der Daten auf das Band jedes der oben beschriebenen Backuprogramme verwenden. Amanda ist nicht Teil des Basissystems, Sie müssen Amanda über die Ports-Sammlung oder als Paket installieren. Tue nichts Tue nichts ist kein Computerprogramm, sondern die am häufigsten angewendete Backupstrategie. Diese kostet nichts, man muss keinen Backupplan befolgen, einfach nur nein sagen. Wenn etwas passiert, einfach grinsen und ertragen! Wenn Ihre Zeit und Ihre Daten nicht so wichtig sind, dann ist die Strategie Tue nichts das geeignetste Backupprogramm für Ihren Computer. Aber &unix; ist ein nützliches Werkzeug, Sie müssen damit rechnen, dass Sie innerhalb von sechs Monaten eine Sammlung von Dateien haben, die für Sie wertvoll geworden sind. Tue nichts ist die richtige Backupmethode für /usr/obj und andere Verzeichnisbäume, die vom Computer exakt wiedererzeugt werden können. Ein Beispiel sind die Dateien, die diese Handbuchseiten darstellen – sie wurden aus Quelldateien im Format SGML erzeugt. Es ist nicht nötig, Sicherheitskopien der Dateien in den sekundären Formaten wie etwa HTML zu erstellen. Die Quelldateien in SGML sollten jedoch in die regelmäßigen Backups mit einbezogen werden. Welches Backup-Programm ist am Besten? LISA dump, Punkt und Schluss. Elizabeth D. Zwicky hat alle hier genannten Backup-Programme bis zur Erschöpfung ausgetestet. Ihre eindeutige Wahl zur Sicherung aller Daten mit Berücksichtigung aller Besonderheiten von &unix; Dateisystemen ist dump. Elizabeth erzeugte Dateisysteme mit einer großen Vielfalt ungewöhnlicher Bedingungen (und einiger gar nicht so ungewöhnlicher) und testete jedes Programm durch ein Backup und eine Wiederherstellung dieser Dateisysteme. Unter den Besonderheiten waren Dateien mit Löchern, Dateien mit Löchern und einem Block mit Null-Zeichen, Dateien mit ausgefallenen Buchstaben im Dateinamen, unlesbare und nichtschreibbare Dateien, Gerätedateien, Dateien, deren Länge sich während des Backups ändert, Dateien, die während des Backups erzeugt und gelöscht werden, u.v.m. Sie berichtete über ihre Ergebnisse in LISA V im Oktober 1991, s. Torture-testing Backup and Archive Programs. Die Wiederherstellung in einem Notfall Vor dem Unglück Es sind nur vier Vorkehrungen zu treffen, um auf jedes erdenkliche Unglück vorbereitet zu sein. bsdlabel Als erstes drucken Sie das bsdlabel jeder Ihrer Festplatten (z.B. mittels bsdlabel da0 | lpr), die Partitions- und Dateisystemtabelle jeder Festplatte (mit /etc/fstab) sowie alle Bootmeldungen, jeweils in zweifacher Ausfertigung. fix-it floppies Zweitens, überzeugen Sie sich, dass sowohl die Bootdiskette als auch die Reparaturdiskette (boot.flp bzw. fixit.flp) all Ihre Geräte ansprechen können. Die einfachste Methode dies nachzuprüfen ist, Ihren Rechner mit der Boot-Diskette im Floppylaufwerk neu zu starten und die Bootmeldungen zu durchzusehen. Wenn all Ihre Geräte aufgelistet sind und funktionieren, können Sie weiter zu Schritt drei gehen. Ist das nicht der Fall, müssen Sie sich eine eigene Version der beiden zum Booten benötigten Disketten erstellen. Diese müssen einen Kernel enthalten, der all Ihre Platten mounten kann und Zugriff auf Ihr Bandlaufwerk gestattet. Diese Disketten müssen ferner folgende Programme enthalten: fdisk, bsdlabel, newfs, mount sowie jedes Backup-Programm, das Sie verwenden. Diese Programme müssen statisch gelinkt sein. Falls Sie dump verwenden, muss die Diskette auch restore enthalten. Drittens, machen Sie oft Backups auf Band. Jede Änderung seit Ihrem letzten Backup kann unwiederbringlich verloren gehen. Versehen Sie die Backup-Bänder mit Schreibschutz. Viertens, testen Sie aus, wie die Disketten (entweder boot.flp und fixit.flp oder Ihre beiden eigenen Disketten aus Schritt zwei) und die Bänder mit den Backups zu behandeln sind. Machen Sie sich Notizen zu diesem Test. Bewahren Sie diese Notizen zusammen mit den Bootdisketten, den Ausdrucken und den Bändern mit den Backups auf. Wenn der Ernstfall eintritt, werden Sie vielleicht so genervt sein, dass Sie ohne Ihre Notizen vielleicht das Backup auf Ihren Bändern zerstören. (Wie das geht? Man braucht nur unglücklicherweise den Befehl tar cvf /dev/sa0 einzugeben um ein Band zu überschreiben). Als zusätzliche Sicherheitsvorkehrung, kann man jeweils die Disketten und Bänder zweifach erstellen. Eine der Kopien sollte an einem entfernten Standort aufbewahrt werden. Ein entfernter Standort ist NICHT der Keller im gleichen Bürogebäude. Eine Anzahl von Firmen im World Trade Center musste diese Lektion auf die harte Tour lernen. Ein entfernter Standort sollte von Ihrem Computer und Ihren Festplatten physikalisch durch eine erhebliche Entfernung getrennt sein. Ein Beispielskript zum Erstellen eigener Bootdisketten /mnt/sbin/init gzip -c -best /sbin/fsck > /mnt/sbin/fsck gzip -c -best /sbin/mount > /mnt/sbin/mount gzip -c -best /sbin/halt > /mnt/sbin/halt gzip -c -best /sbin/restore > /mnt/sbin/restore gzip -c -best /bin/sh > /mnt/bin/sh gzip -c -best /bin/sync > /mnt/bin/sync cp /root/.profile /mnt/root chmod 500 /mnt/sbin/init chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt chmod 555 /mnt/bin/sh /mnt/bin/sync chmod 6555 /mnt/sbin/restore # # Minimale Dateisystemtabelle erstellen # cat > /mnt/etc/fstab < /mnt/etc/passwd < /mnt/etc/master.passwd < Nach dem Unglück Die Schlüsselfrage ist, ob Ihre Hardware überlebt hat. Denn da Sie ja regelmäßig Backups angefertigt haben, brauchen Sie sich um die Software keine Sorgen zu machen. Falls die Hardware beschädigt wurde, ersetzen Sie zuerst die defekten Teile bevor Sie den Computer benutzen. Falls die Hardware funktioniert, überprüfen Sie die Disketten. Wenn Sie eigene Bootdisketten verwenden, booten Sie im Single-User-Modus (geben dazu Sie -s am Boot-Prompt boot: ein). Überspringen Sie den folgenden Paragrafen. Wenn Sie die Standarddisketten boot.flp und fixit.flp verwenden, lesen Sie hier weiter. Legen Sie die Bootdiskette boot.flp in das erste Floppylaufwerk ein und starten Sie den Computer. Wie üblich wird dann das originale Installationsmenü von FreeBSD gestartet. Wählen Sie die Option Fixit--Repair mode with CD-ROM or floppy. Legen Sie die Diskette fixit.flp ein, wenn danach gefragt wird. restore und die anderen Programme, die Sie benötigen, befinden sich dann in /mnt2/rescue (/mnt2/stand vor &os; 5.2). Stellen Sie die Dateisysteme nacheinander, getrennt von einander, wieder her. mount Root-Partition bsdlabel newfs Versuchen Sie die Root-Partition Ihrer ersten Festplatte einzuhängen (z.B. mit mount /dev/sd0a /mnt). Wenn das Bsdlabel beschädigt wurde, benutzen Sie bsdlabel um die Platte neu zu partitionieren und zu benennen und zwar so, dass die Festplatte mit dem Label übereinstimmt, das Sie ausgedruckt und aufbewahrt haben. Verwenden Sie newfs um neue Dateisysteme auf den Partitionen anzulegen. Hängen Sie nun die Root-Partition der Festplatte mit Schreibzugriff ein (mit mount -u -o rw /mnt). Benutzen Sie Ihr Backup-Programm um die Daten für das jeweilige Dateisystem aus den Backup-Bändern wieder her zu stellen (z.B. durch restore vrf /dev/sta). Hängen Sie das Dateisystem wieder aus (z.B. durch umount /mnt). Wiederholen Sie diesen Ablauf für jedes betroffene Dateisystem. Sobald Ihr System wieder läuft, machen Sie gleich wieder ein vollständiges Backup auf neue Bänder. Denn die Ursache für den Absturz oder den Datenverlust kann wieder zuschlagen. Eine weitere Stunde, die Sie jetzt noch dranhängen, kann Ihnen später ein weiteres Missgeschick ersparen. * Ich habe mich nicht auf Missgeschicke vorbereitet - was nun? ]]> Marc Fonvieille Verbessert und neu strukturiert von Netzwerk-, speicher- und dateibasierte Dateisysteme Laufwerke virtuelle Neben Laufwerken, die sich physikalisch im Rechner befinden wie Floppylaufwerke, CDs, Festplatten usw., kann FreeBSD auch mit anderen Laufwerken, den virtuellen Laufwerken, umgehen. NFS Coda Laufwerke speicherbasierte Laufwerke RAM-Disks Dazu zählen Netzwerkdateisysteme wie Network Filesystem und Coda, speicher- und dateibasierte Dateisysteme. Abhängig von der verwendeten FreeBSD Version werden speicher- und dateibasierte Dateisysteme mit unterschiedlichen Werkzeugen angelegt. Gerätedateien werden unter &os; automatisch von &man.devfs.5; angelegt. Dateibasierte Laufwerke unter FreeBSD Laufwerke dateibasierte Unter FreeBSD werden virtuelle Laufwerke (&man.md.4;) mit &man.mdconfig.8; erzeugt. Dazu muss das Modul &man.md.4; geladen sein oder das entsprechende Gerät in der Kernelkonfiguration aktiviert sein: device md Mit &man.mdconfig.8; können drei verschiedene virtuelle Laufwerke angelegt werden: speicherbasierte Laufwerke, deren Speicher von &man.malloc.9; zur Verfügung gestellt wird, oder dateibasierte Laufwerke, deren Speicher von einer Datei oder dem Swap-Bereich zur Verfügung gestellt wird. Eine mögliche Anwendung ist das Einhängen von Dateien, die Abbilder von CD-ROMs oder Floppies enthalten. Das Abbild eines Dateisystems wird wie folgt eingehangen: Einhängen eines existierenden Abbildes unter FreeBSD &prompt.root; mdconfig -a -t vnode -f diskimage -u 0 &prompt.root; mount /dev/md0 /mnt Ein neues Dateisystem-Abbild erstellen Sie mit &man.mdconfig.8; wie folgt: Erstellen eines dateibasierten Laufwerks mit <command>mdconfig</command> &prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k 5120+0 records in 5120+0 records out &prompt.root; mdconfig -a -t vnode -f newimage -u 0 &prompt.root; bsdlabel -w md0 auto &prompt.root; newfs md0a /dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes. super-block backups (for fsck -b #) at: 160, 2720, 5280, 7840 &prompt.root; mount /dev/md0a /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0a 4710 4 4330 0% /mnt Wenn Sie keine Gerätenummer mit dem Schalter angeben, wird von &man.md.4; automatisch eine ungenutzte Gerätenummer zugewiesen. Das zugewiesene Gerät wird auf der Standardausgabe ausgegeben (zum Beispiel md4). Weitere Informationen entnehmen Sie bitte der Hilfeseite &man.mdconfig.8;. Das Werkzeug &man.mdconfig.8; ist sehr nützlich, doch muss man viele Kommandos absetzen, um ein dateibasiertes Dateisystem zu erstellen. FreeBSD enthält das Werkzeug &man.mdmfs.8;, das die notwendigen Schritte in einem Befehl zusammenfasst. Es konfiguriert mit &man.mdconfig.8; ein &man.md.4;-Laufwerk, erstellt darauf mit &man.newfs.8; ein Dateisystem und hängt es anschließend mit &man.mount.8; ein. Das virtuelle Laufwerk aus dem obigen Beispiel kann somit einfach mit den nachstehenden Befehlen erstellt werden: Mit <command>mdmfs</command> ein dateibasiertes Dateisystem erstellen &prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k 5120+0 records in 5120+0 records out &prompt.root; mdmfs -F newimage -s 5m md0 /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md0 4718 4 4338 0% /mnt Wenn sie die Option ohne Gerätenummer verwenden, wählt &man.md.4; automatisch ein ungenutztes Gerät aus. Weitere Einzelheiten entnehmen Sie bitte der Hilfeseite &man.mdmfs.8;. Speicherbasierte Laufwerke unter FreeBSD Laufwerke speicherbasierte Verwenden Sie ein speicherbasiertes Dateisystem, sollten Sie die Option swap backing aktivieren. Setzen Sie diese Option, heißt dies allerdings nicht, dass das speicherbasierte Laufwerk automatisch auf ihre Festplatte ausgelagert wird, vielmehr wird der Speicherplatz danach aus einem Speicherpool angefordert, der bei Bedarf auf die Platte ausgelagert werden kann. Zusätzlich ist es möglich, &man.malloc.9;-gestützte speicherbasierte Laufwerke zu erstellen. Das Anlegen solcher Laufwerke kann allerdings zu einer System-Panic führen, wenn der Kernel danach über zu wenig Speicher verfügt. Erstellen eines speicherbasierten Laufwerks mit <command>mdconfig</command> &prompt.root; mdconfig -a -t swap -s 5m -u 1 &prompt.root; newfs -U md1 /dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 2752, 5344, 7936 &prompt.root; mount /dev/md1 /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md1 4718 4 4338 0% /mnt Erstellen eines speicherbasierten Laufwerks mit <command>mdmfs</command> &prompt.root; mdmfs -s 5m md2 /mnt &prompt.root; df /mnt &prompt.root; df /mnt Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/md2 4846 2 4458 0% /mnt Virtuelle Laufwerke freigeben Laufwerke Freigabe von virtuellen Laufwerken Wenn ein virtuelles Laufwerk nicht mehr gebraucht wird, sollten Sie dem System die belegten Ressourcen zurückgeben. Hängen Sie dazu zuerst das Dateisystem ab und geben Sie dann die benutzten Ressourcen mit &man.mdconfig.8; frei. Alle von /dev/md4 belegten Ressourcen werden mit dem nachstehenden Kommando freigegeben: &prompt.root; mdconfig -d -u 4 Eingerichtete &man.md.4;-Geräte werden mit dem Befehl mdconfig -l angezeigt. Tom Rhodes Beigetragen von Schnappschüsse von Dateisystemen Schnappschüsse von Dateisystemen Zusammen mit Soft Updates bietet FreeBSD eine neue Funktion: Schnappschüsse von Dateisystemen. Schnappschüsse sind Dateien, die ein Abbild eines Dateisystems enthalten und müssen auf dem jeweiligen Dateisystem erstellt werden. Pro Dateisystem darf es maximal 20 Schnappschüsse, die im Superblock vermerkt werden, geben. Schnappschüsse bleiben erhalten, wenn das Dateisystem abgehangen, neu eingehangen oder das System neu gestartet wird. Wenn Sie einen Schnappschuss nicht mehr benötigen, können Sie ihn mit &man.rm.1; löschen. Es ist egal, in welcher Reihenfolge Schnappschüsse gelöscht werden. Es kann allerdings vorkommen, dass nicht der gesamte Speicherplatz wieder freigegeben wird, da ein anderer Schnappschuss einen Teil der entfernten Blöcke für sich beanspruchen kann. Das unveränderliche -Dateiflag wird nach der Erstellung des Snaphshots von &man.mksnap.ffs.8; gesetzt. Durch die Verwendung von &man.unlink.1; ist es allerdings möglich, einen Schnappschuss zu löschen. Schnappschüsse werden mit &man.mount.8; erstellt. Das folgende Kommando legt einen Schnappschuss von /var in /var/snapshot/snap ab: &prompt.root; mount -u -o snapshot /var/snapshot/snap /var Den Schnappschuss können Sie auch mit &man.mksnap.ffs.8; erstellen: &prompt.root; mksnap_ffs /var /var/snapshot/snap Um einen Schnappschuss auf Ihrem System zu finden, verwenden Sie &man.find.1;: &prompt.root; find /var -flags snapshot Nachdem ein Schnappschuss erstellt wurde, können Sie ihn für verschiedene Zwecke benutzen: Sie können den Schnappschuss für die Datensicherung benutzen und ihn auf eine CD oder ein Band schreiben. Sie können den Schnappschuss mit &man.fsck.8; manuell prüfen. Wenn das Dateisystem zum Zeitpunkt der Erstellung des Schnappschusses in Ordnung war, sollte &man.fsck.8; immer erfolgreich durchlaufen. Der Hintergrund-Prozess &man.fsck.8; hat im Übrigen genau diese Aufgabe. Sie können den Schnappschuss mit &man.dump.8; sichern. Sie erhalten dann eine konsistente Sicherung des Dateisystems zu dem Zeitpunkt, der durch den Zeitstempel des Schnappschusses gegeben ist. Der Schalter von &man.dump.8; erstellt für die Sicherung einen Schnappschuss und entfernt diesen am Ende der Sicherung wieder. Sie können einen Schnappschuss in den Verzeichnisbaum einhängen und sich dann den Zustand des Dateisystems zu dem Zeitpunkt ansehen, an dem der Schnappschuss erstellt wurde. Der folgende Befehl hängt den Schnappschuss /var/snapshot/snap ein: &prompt.root; mdconfig -a -t vnode -f /var/snapshot/snap -u 4 &prompt.root; mount -r /dev/md4 /mnt Sie können sich nun den eingefrorenen Stand des /var Dateisystems unterhalb von /mnt ansehen. Mit Ausnahme der früheren Schnappschüsse, die als leere Dateien auftauchen, wird zu Beginn alles so aussehen, wie zum Zeitpunkt der Erstellung des Schnappschusses. Wenn Sie den Schnappschuss nicht mehr benötigen, können Sie ihn, wie nachfolgend gezeigt, abhängen: &prompt.root; umount /mnt &prompt.root; mdconfig -d -u 4 Weitere Informationen über Soft Updates und Schnappschüsse von Dateisystemen sowie technische Artikel finden Sie auf der Webseite von Marshall Kirk McKusick. Dateisystem-Quotas Accounting Plattenplatz Disk Quotas Quotas sind eine optionale Funktion des Betriebssystems, die es Ihnen erlauben, den Plattenplatz und/oder die Anzahl der Dateien eines Benutzers oder der Mitglieder einer Gruppe, auf Dateisystemebene zu beschränken. Oft wird dies auf Timesharing-Systemen (Mehrbenutzersystemen) genutzt, da es dort erwünscht ist, die Ressourcen, die ein Benutzer oder eine Gruppe von Benutzern belegen können, zu limitieren. Das verhindert, dass ein Benutzer oder eine Gruppe von Benutzern den ganzen verfügbaren Plattenplatz belegt. Konfiguration des Systems, um Quotas zu aktivieren Bevor Quotas benutzt werden können, müssen sie im Kernel konfiguriert werden, wozu die folgende Zeile der Kernelkonfiguration hinzugefügt wird: options QUOTA Im gewöhnlichen GENERIC Kernel sind Quotas nicht aktiviert, so dass Sie einen angepassten Kernel konfigurieren und bauen müssen, um Quotas zu benutzen. Weitere Informationen finden Sie in . Durch Hinzufügen der folgenden Zeile in /etc/rc.conf wird das Quota-System aktiviert: enable_quotas="YES" Disk Quotas überprüfen Um den Start des Quota-Systems zu beeinflussen, steht eine weitere Variable zur Verfügung. Normalerweise wird beim Booten die Integrität der Quotas auf allen Dateisystemen mit &man.quotacheck.8; überprüft. &man.quotacheck.8; stellt sicher, dass die Quota-Datenbank mit den Daten auf einem Dateisystem übereinstimmt. Dies ist allerdings ein sehr zeitraubender Prozess, der die Zeit, die das System zum Booten braucht, signifikant beeinflusst. Eine Variable in /etc/rc.config erlaubt es Ihnen, diesen Schritt zu überspringen: check_quotas="NO" Schließlich müssen Sie noch in /etc/fstab die Plattenquotas auf Dateisystemebene aktivieren. Dort können Sie für alle Dateisysteme Quotas für Benutzer, Gruppen oder für beide aktivieren. Um Quotas pro Benutzer für ein Dateisystem zu aktivieren, geben Sie für dieses Dateisystem die Option im Feld Optionen von /etc/fstab an. Beispiel: /dev/da1s2g /home ufs rw,userquota 1 2 Um Quotas für Gruppen einzurichten, verwenden Sie anstelle von . Um Quotas für Benutzer und Gruppen einzurichten, ändern Sie den Eintrag wie folgt ab: /dev/da1s2g /home ufs rw,userquota,groupquota 1 2 Die Quotas werden jeweils im Rootverzeichnis des Dateisystems unter dem Namen quota.user für Benutzer-Quotas und quota.group für Gruppen-Quotas abgelegt. Obwohl &man.fstab.5; beschreibt, dass diese Dateien an anderer Stelle gespeichert werden können, wird das nicht empfohlen, da es den Anschein hat, dass die verschiedenen Quota-Utilities das nicht richtig unterstützen. Jetzt sollten Sie Ihr System mit dem neuen Kernel booten. /etc/rc wird dann automatisch die richtigen Kommandos aufrufen, die die Quota-Dateien für alle Quotas, die Sie in /etc/fstab definiert haben, anlegen. Deshalb müssen vorher auch keine leeren Quota-Dateien angelegt werden. Normalerweise brauchen Sie die Kommandos &man.quotacheck.8;, &man.quotaon.8; oder &man.quotaoff.8; nicht händisch aufzurufen, obwohl Sie vielleicht die entsprechenden Seiten im Manual lesen sollten, um sich mit ihnen vertraut zu machen. Setzen von Quota-Limits Disk Quotas Limits Nachdem Sie Quotas in Ihrem System aktiviert haben, sollten Sie überprüfen, dass Sie auch tatsächlich aktiviert sind. Führen Sie dazu einfach den folgenden Befehl aus: &prompt.root; quota -v Für jedes Dateisystem, auf dem Quotas aktiviert sind, sollten Sie eine Zeile mit der Plattenauslastung und den aktuellen Quota-Limits sehen. Mit &man.edquota.8; können Sie nun Quota-Limits setzen. Sie haben mehrere Möglichkeiten, die Limits für den Plattenplatz, den ein Benutzer oder eine Gruppe verbrauchen kann, oder die Anzahl der Dateien, die angelegt werden dürfen, festzulegen. Die Limits können auf dem Plattenplatz (Block-Quotas) oder der Anzahl der Dateien (Inode-Quotas) oder einer Kombination von beiden basieren. Jedes dieser Limits wird weiterhin in zwei Kategorien geteilt: Hardlimits und Softlimits. Hardlimit Ein Hardlimit kann nicht überschritten werden. Hat der Benutzer einmal ein Hardlimit erreicht, so kann er auf dem betreffenden Dateisystem keinen weiteren Platz mehr beanspruchen. Hat ein Benutzer beispielsweise ein Hardlimit von 500 Kilobytes auf einem Dateisystem und benutzt davon 490 Kilobyte, so kann er nur noch 10 weitere Kilobytes beanspruchen. Der Versuch, weitere 11 Kilobytes zu beanspruchen, wird fehlschlagen. Softlimit Im Gegensatz dazu können Softlimits für eine befristete Zeit überschritten werden. Diese Frist beträgt in der Grundeinstellung eine Woche. Hat der Benutzer das Softlimit über die Frist hinaus überschritten, so wird das Softlimit in ein Hardlimit umgewandelt und der Benutzer kann keinen weiteren Platz mehr beanspruchen. Wenn er einmal das Softlimit unterschreitet, wird die Frist wieder zurückgesetzt. Das folgende Beispiel zeigt die Benutzung von &man.edquota.8;. Wenn &man.edquota.8; aufgerufen wird, wird der Editor gestartet, der durch EDITOR gegeben ist oder vi falls EDITOR nicht gesetzt ist. In dem Editor können Sie die Limits eingeben. &prompt.root; edquota -u test Quotas for user test: /usr: kbytes in use: 65, limits (soft = 50, hard = 75) inodes in use: 7, limits (soft = 50, hard = 60) /usr/var: kbytes in use: 0, limits (soft = 50, hard = 75) inodes in use: 0, limits (soft = 50, hard = 60) Für jedes Dateisystem, auf dem Quotas aktiv sind, sehen Sie zwei Zeilen, eine für die Block-Quotas und die andere für die Inode-Quotas. Um ein Limit zu modifizieren, ändern Sie einfach den angezeigten Wert. Um beispielsweise das Blocklimit dieses Benutzers von einem Softlimit von 50 und einem Hardlimit von 75 auf ein Softlimit von 500 und ein Hardlimit von 600 zu erhöhen, ändern Sie die Zeile /usr: kbytes in use: 65, limits (soft = 50, hard = 75) zu: /usr: kbytes in use: 65, limits (soft = 500, hard = 600) Die neuen Limits sind wirksam, wenn Sie den Editor verlassen. Manchmal ist es erwünscht, die Limits für einen Bereich von UIDs zu setzen. Dies kann mit der Option von &man.edquota.8; bewerkstelligt werden. Weisen Sie dazu die Limits einem Benutzer zu und rufen danach edquota -p protouser startuid-enduid auf. Besitzt beispielsweise der Benutzer test die gewünschten Limits, können diese mit dem folgenden Kommando für die UIDs 10.000 bis 19.999 dupliziert werden: &prompt.root; edquota -p test 10000-19999 Weitere Informationen erhalten Sie in &man.edquota.8;. Überprüfen von Quota-Limits und Plattennutzung Disk Quotas überprüfen Sie können &man.quota.1; oder &man.repquota.8; benutzen, um Quota-Limits und Plattennutzung zu überprüfen. Um die Limits oder die Plattennutzung individueller Benutzer und Gruppen zu überprüfen, kann &man.quota.1; benutzt werden. Ein Benutzer kann nur die eigenen Quotas und die Quotas der Gruppe, der er angehört untersuchen. Nur der Superuser darf sich alle Limits ansehen. Mit &man.repquota.8; erhalten Sie eine Zusammenfassung von allen Limits und der Plattenausnutzung für alle Dateisysteme, auf denen Quotas aktiv sind. Das folgende Beispiel zeigt die Ausgabe von quota -v für einen Benutzer, der Quota-Limits auf zwei Dateisystemen besitzt: Disk quotas for user test (uid 1002): Filesystem usage quota limit grace files quota limit grace /usr 65* 50 75 5days 7 50 60 /usr/var 0 50 75 0 50 60 Disk Quotas Frist Im Dateisystem /usr liegt der Benutzer momentan 15 Kilobytes über dem Softlimit von 50 Kilobytes und hat noch 5 Tage seiner Frist übrig. Der Stern * zeigt an, dass der Benutzer sein Limit überschritten hat. In der Ausgabe von &man.quota.1; werden Dateisysteme, auf denen ein Benutzer keinen Platz verbraucht, nicht angezeigt, auch wenn diesem Quotas zugewiesen wurden. Mit werden diese Dateisysteme, wie /usr/var im obigen Beispiel, angezeigt. Quotas über NFS NFS Quotas werden von dem Quota-Subsystem auf dem NFS Server erzwungen. Der &man.rpc.rquotad.8; Dæmon stellt &man.quota.1; die Quota Informationen auf dem NFS Client zur Verfügung, so dass Benutzer auf diesen Systemen ihre Quotas abfragen können. Aktivieren Sie rpc.rquotad in /etc/inetd.conf wie folgt: rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad Anschließend starten Sie inetd neu: &prompt.root; /etc/rc.d/inetd restart Lucky Green Beigetragen von
shamrock@cypherpunks.to
Partitionen verschlüsseln Partitionen verschlüsseln FreeBSD bietet ausgezeichnete Möglichkeiten, Daten vor unberechtigten Zugriffen zu schützen. Wenn das Betriebssystem läuft, schützen Zugriffsrechte und vorgeschriebene Zugriffskontrollen (MAC) (siehe ) die Daten. Die Zugriffskontrollen des Betriebssystems schützen allerdings nicht vor einem Angreifer, der Zugriff auf den Rechner hat. Der Angreifer kann eine Festplatte einfach in ein anderes System einbauen und dort die Daten analysieren. Die für &os; verfügbaren kryptografischen Subsysteme GEOM Based Disk Encryption (gbde) und geli sind in der Lage, Daten auf Dateisystemen auch vor hoch motivierten Angreifern zu schützen, die über erhebliche Mittel verfügen. Dieser Schutz ist unabhängig von der Art und Weise, durch die ein Angreifer Zugang zu einer Festplatte oder zu einem Rechner erlangt hat. Im Gegensatz zu schwerfälligen Systemen, die einzelne Dateien verschlüsseln, verschlüsseln gbde und geli transparent ganze Dateisysteme. Auf der Festplatte werden dabei keine Daten im Klartext gespeichert. Plattenverschlüsselung mit <application>gbde</application> Wechseln sie zu <username>root</username> Sie benötigen Superuser-Rechte, um gbde einzurichten. &prompt.user; su - Password: Aktivieren Sie &man.gbde.4; in der Kernelkonfigurationsdatei Fügen Sie folgende Zeile in Ihre Kernelkonfigurationsdatei ein: options GEOM_BDE Übersetzen und installieren Sie den FreeBSD-Kernel wie in beschrieben. Starten sie das System neu, um den neuen Kernel zu benutzen. Alternativ zur Neukompilierung des Kernels können Sie auch kldload verwenden, um das Kernelmodul &man.gbde.4; zu laden: &prompt.root; kldload geom_bde Einrichten eines verschlüsselten Dateisystems Das folgende Beispiel beschreibt, wie ein Dateisystem auf einer neuen Festplatte verschlüsselt wird. Das Dateisystem wird in /private eingehangen. Mit gbde könnten auch /home und /var/mail verschlüsselt werden. Die dazu nötigen Schritte können allerdings in dieser Einführung nicht behandelt werden. Installieren der Festplatte Installieren Sie die Festplatte wie in beschrieben. Im Beispiel verwenden wir die Partition /dev/ad4s1c. Die Gerätedateien /dev/ad0s1* sind Standard-Partitionen des FreeBSD-Systems. &prompt.root; ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 Verzeichnis für gbde-Lock-Dateien anlegen &prompt.root; mkdir /etc/gbde Die Lock-Dateien sind für den Zugriff von gbde auf verschlüsselte Partitionen notwendig. Ohne die Lock-Dateien können die Daten nur mit erheblichem manuellen Aufwand wieder entschlüsselt werden (dies wird auch von der Software nicht unterstützt). Jede verschlüsselte Partition benötigt eine gesonderte Lock-Datei. Vorbereiten der gbde-Partition Eine von gbde benutzte Partition muss einmalig vorbereitet werden: &prompt.root; gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock &man.gbde.8; öffnet eine Vorlage in Ihrem Editor, in der Sie verschiedene Optionen einstellen können. Setzen Sie sector_size auf 2048, wenn Sie UFS1 oder UFS2 benutzen. $FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $ # # Sector size is the smallest unit of data which can be read or written. # Making it too small decreases performance and decreases available space. # Making it too large may prevent filesystems from working. 512 is the # minimum and always safe. For UFS, use the fragment size # sector_size = 2048 [...] &man.gbde.8; fragt dann zweimal eine Passphrase zum Schutz der Daten ab. Die Passphrase muss beides Mal gleich eingegeben werden. Die Sicherheit der Daten hängt alleine von der Qualität der gewählten Passphrase ab. Die Auswahl einer sicheren und leicht zu merkenden Passphrase wird auf der Webseite Diceware Passphrase beschrieben. Mit gbde init wurde im Beispiel auch die Lock-Datei /etc/gbde/ad4s1c.lock angelegt. gbde-Lockdateien müssen die Dateiendung .lock aufweisen, damit sie von /etc/rc.d/gbde, dem Startskript von gbde, erkannt werden. Sichern Sie die Lock-Dateien von gbde immer zusammen mit den verschlüsselten Dateisystemen. Ein entschlossener Angreifer kann die Daten vielleicht auch ohne die Lock-Datei entschlüsseln. Ohne die Lock-Datei können Sie allerdings nicht auf die verschlüsselten Daten zugreifen. Dies ist nur noch mit erheblichem manuellen Aufwand möglich, der weder von &man.gbde.8; noch seinem Entwickler unterstützt wird. Einbinden der verschlüsselten Partition in den Kernel &prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock Das Kommando fragt die Passphrase ab, die Sie beim Vorbereiten der Partition eingegeben haben. Das neue Gerät erscheint danach als /dev/device_name.bde im Verzeichnis /dev: &prompt.root; ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde Dateisystem auf dem verschlüsselten Gerät anlegen Wenn der Kernel die verschlüsselte Partition kennt, können Sie ein Dateisystem auf ihr anlegen. Benutzen Sie dazu den Befehl &man.newfs.8;. Da ein Dateisystem vom Typ UFS2 sehr viel schneller als eins vom Typ UFS1 angelegt wird, empfehlen wir Ihnen, die Option zu benutzen. &prompt.root; newfs -U -O2 /dev/ad4s1c.bde &man.newfs.8; muss auf einer dem Kernel bekannten gbde-Partition (einem Gerät mit dem Namen *.bde laufen. Einhängen der verschlüsselten Partition Legen Sie einen Mountpunkt für das verschlüsselte Dateisystem an: &prompt.root; mkdir /private Hängen Sie das verschlüsselte Dateisystem ein: &prompt.root; mount /dev/ad4s1c.bde /private Überprüfen des verschlüsselten Dateisystem Das verschlüsselte Dateisystem sollte jetzt von &man.df.1; erkannt werden und benutzt werden können. &prompt.user; df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 1037M 72M 883M 8% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 8.1G 55K 7.5G 0% /home /dev/ad0s1e 1037M 1.1M 953M 0% /tmp /dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr /dev/ad4s1c.bde 150G 4.1K 138G 0% /private Einhängen eines existierenden verschlüsselten Dateisystems Nach jedem Neustart müssen verschlüsselte Dateisysteme dem Kernel wieder bekannt gemacht werden, auf Fehler überprüft werden und eingehangen werden. Die dazu nötigen Befehle müssen als root durchgeführt werden. gbde-Partition im Kernel bekannt geben &prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock Das Kommando fragt nach der Passphrase, die Sie beim Vorbereiten der verschlüsselten gbde-Partition festgelegt haben. Prüfen des Dateisystems Das verschlüsselte Dateisystem kann noch nicht automatisch über /etc/fstab eingehangen werden. Daher muss es vor dem Einhängen mit &man.fsck.8; geprüft werden: &prompt.root; fsck -p -t ffs /dev/ad4s1c.bde Einhängen des verschlüsselten Dateisystems &prompt.root; mount /dev/ad4s1c.bde /private Das verschlüsselte Dateisystem steht danach zur Verfügung. Verschlüsselte Dateisysteme automatisch einhängen Mit einem Skript können verschlüsselte Dateisysteme automatisch bekannt gegeben, geprüft und eingehangen werden. Wir raten Ihnen allerdings aus Sicherheitsgründen davon ab. Starten Sie das Skript manuell an der Konsole oder in einer &man.ssh.1;-Sitzung. Zu diesem Zweck existiert ein rc.d-Skript, an das über Einträge in der Datei &man.rc.conf.5; Argumente übergeben werden können. Dazu ein Beispiel: gbde_autoattach_all="YES" gbde_devices="ad4s1c" gbde_lockdir="/etc/gbde" Durch diese Argumente muss beim Systemstart die gbde-Passphrase eingegeben werden. Erst nach Eingabe der korrekten Passphrase wird die gbde-verschlüsselte Partition automatisch in den Verzeichnisbaum eingehängt. Dieses Vorgehen ist insbesondere dann nützlich, wenn Sie gbde auf einem Notebook einsetzen wollen. Kryptografische Methoden von gbde &man.gbde.8; benutzt den 128-Bit AES im CBC-Modus, um die Daten eines Sektors zu verschlüsseln. Jeder Sektor einer Festplatte wird mit einem unterschiedlichen AES-Schlüssel verschlüsselt. Mehr Informationen, unter anderem wie die Schlüssel für einen Sektor aus der gegebenen Passphrase ermittelt werden, erhalten Sie in &man.gbde.4;. Kompatibilität &man.sysinstall.8; kann nicht mit verschlüsselten gbde-Geräten umgehen. Vor dem Start von &man.sysinstall.8; sind alle *.bde-Geräte zu deaktivieren, da &man.sysinstall.8; sonst bei der Gerätesuche abstürzt. Das im Beispiel verwendete Gerät wird mit dem folgenden Befehl deaktiviert: &prompt.root; gbde detach /dev/ad4s1c Sie können gbde nicht zusammen mit vinum benutzen, da &man.vinum.4; das &man.geom.4;-Subsystem nicht benutzt. Daniel Gerzo Beigetragen von Plattenverschlüsselung mit <command>geli</command> Mit &os; 6.0 wurde eine neue kryptografische GEOM-Klasse eingeführt - geli. Diese wird derzeit von &a.pjd; weiterentwickelt. geli unterscheidet sich von gbde durch unterschiedliche Fähigkeiten und einen unterschiedlichen Ansatz für die Verschlüsselung von Festplatten. Die wichtigsten Merkmale von &man.geli.8; sind: Der Einsatz des &man.crypto.9;-Frameworks – verfügt das System über kryptografische Hardware, wird diese von geli automatisch verwendet. Die Unterstützung verschiedener kryptografischer Algorithmen (derzeit AES, Blowfish, sowie 3DES). Die Möglichkeit, die root-Partition zu verschlüsseln. Um auf die verschlüsselte root-Partition zugreifen zu können, muss beim Systemstart die Passphrase eingegeben werden. geli erlaubt den Einsatz von zwei voneinander unabhängigen Schlüsseln (etwa einem privaten Schlüssel und einem Unternehmens-Schlüssel). geli ist durch einfache Sektor-zu-Sektor-Verschlüsselung sehr schnell. Die Möglichkeit, Master-Keys zu sichern und wiederherzustellen. Wenn ein Benutzer seinen Schlüssel zerstört, kann er über seinen zuvor gesicherten Schlüssel wieder auf seine Daten zugreifen. geli erlaubt es, Platten mit einem zufälligen Einmal-Schlüssel einzusetzen, was insbesondere für Swap-Partitionen und temporäre Dateisysteme interessant ist. Weitere Informationen zu den Fähigkeiten von geli finden Sie in &man.geli.8;. Die folgenden Schritte beschreiben, wie Sie geli im &os;-Kernel aktivieren und einen geli-Verschlüsselungs-Provider anlegen können. Voraussetzung für die Nutzung von geli ist der Einsatz von &os; 6.0-RELEASE oder neuer. Da Sie Ihren Kernel anpassen müssen, benötigen Sie außerdem root-Privilegien. Aufnahme der <command>geli</command>-Unterstützung in Ihre Kernelkonfigurationsdatei Fügen Sie die folgenden Zeilen in Ihre Kernelkonfigurationsdatei ein: options GEOM_ELI device crypto Bauen und installieren Sie Ihren neuen Kernel wie in beschrieben. Alternativ können Sie aber auch das geli-Kernelmodul beim Systemstart laden. Dazu fügen Sie die folgende Zeile in /boot/loader.conf ein: geom_eli_load="YES" Ab sofort wird &man.geli.8; vom Kernel unterstützt. Erzeugen des Master-Keys Das folgende Beispiel beschreibt, wie Sie eine Schlüsseldatei erzeugen, die als Teil des Master-Keys für den Verschlüsselungs-Provider verwendet wird, der unter /private in den Verzeichnisbaum eingehängt (gemountet) wird. Diese Schlüsseldatei liefert zufällige Daten, die für die Verschlüsselung des Master-Keys benötigt werden. Zusätzlich wird der Master-Key durch eine Passphrase geschützt. Die Sektorgröße des Providers beträgt 4 KB. Außerdem wird beschrieben, wie Sie einen geli-Provider aktivieren, ein vom ihm verwaltetes Dateisystem erzeugen, es mounten, mit ihm arbeiten und wie Sie es schließlich wieder unmounten und den Provider deaktivieren. Um eine bessere Leistung zu erzielen, sollten Sie eine größere Sektorgröße (beispielsweise 4 KB) verwenden. Der Master-Key wird durch eine Passphrase sowie die Daten der Schlüsseldatei (die von /dev/random stammen) geschützt. Die Sektorgröße von /dev/da2.eli (das als Provider bezeichnet wird) beträgt 4 KB. &prompt.root; dd if=/dev/random of=/root/da2.key bs=64 count=1 &prompt.root; geli init -s 4096 -K /root/da2.key /dev/da2 Enter new passphrase: Reenter new passphrase: Es ist nicht zwingend nötig, sowohl eine Passphrase als auch eine Schlüsseldatei zu verwenden. Die einzelnen Methoden können auch unabhängig voneinander eingesetzt werden. Wird für die Schlüsseldatei der Wert - angegeben, wird dafür die Standardeingabe verwendet. Das folgende Beispiel zeigt, dass Sie auch mehr als eine Schlüsseldatei verwenden können. &prompt.root; cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2 Aktivieren des Providers mit dem erzeugten Schlüssel &prompt.root; geli attach -k /root/da2.key /dev/da2 Enter passphrase: Dadurch wird die (Normaltext-)Gerätedatei /dev/da2.eli angelegt. &prompt.root; ls /dev/da2* /dev/da2 /dev/da2.eli Das neue Dateisystem erzeugen &prompt.root; dd if=/dev/random of=/dev/da2.eli bs=1m &prompt.root; newfs /dev/da2.eli &prompt.root; mount /dev/da2.eli /private Das verschlüsselte Dateisystem wird nun von &man.df.1; angezeigt und kann ab sofort eingesetzt werden. &prompt.root; df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 248M 89M 139M 38% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr /dev/ad0s1d 989M 1.5M 909M 0% /tmp /dev/ad0s1e 3.9G 1.3G 2.3G 35% /var /dev/da2.eli 150G 4.1K 138G 0% /private Das Dateisystem unmounten und den Provider deaktivieren Wenn Sie nicht mehr mit dem verschlüsselten Dateisystem arbeiten und die unter /private eingehängte Partition daher nicht mehr benötigen, sollten Sie diese unmounten und den geli-Verschlüsselungs-Provider wieder deaktivieren. &prompt.root; umount /private &prompt.root; geli detach da2.eli Weitere Informationen zum Einsatz von geli finden Sie in &man.geli.8;. Der Einsatz des <filename>geli</filename>- <filename>rc.d</filename>-Skripts geli verfügt über ein rc.d-Skript, das den Einsatz von geli deutlich vereinfacht. Es folgt nun ein Beispiel, in dem geli über die Datei &man.rc.conf.5; konfiguriert wird: geli_devices="da2" geli_da2_flags="-p -k /root/da2.key" Durch diese Einträge wird /dev/da2 als geli-Provider festgelegt. Der Master-Key befindet sich in /root/da2.key. Beim Aktivieren des geli-Providers wird keine Passphrase abgefragt (beachten Sie, dass dies nur dann möglich ist, wenn Sie geli mit dem Parameter initialisieren). Wird das System heruntergefahren, wird der geli-Provider zuvor deaktiviert. Weitere Informationen zur Konfiguration der rc.d-Skripten finden Sie im Abschnitt rc.d des Handbuchs.
Christian Brüffer Geschrieben von Den Auslagerungsspeicher verschlüsseln Auslagerungsspeicher verschlüsseln Die Verschlüsselung des Auslagerungsspeichers ist unter &os; einfach einzurichten und seit &os; 5.3-RELEASE verfügbar. Je nach dem, welche &os;-Version Sie einsetzen, können Konfiguration und mögliche Optionen allerdings unterschiedlich sein. Seit &os; 6.0-RELEASE können Sie entweder das &man.gbde.8;- oder das &man.geli.8;-Verschlüsselungs-Subsystem einsetzen. Verwenden Sie eine ältere &os;-Version, sind Sie hingegen auf &man.gbde.8; beschränkt. Beide Subsysteme werden über das rc.d-Skript encswap gestartet. Der letzte Abschnitt, Partitionen verschlüsseln, enthält eine kurze Beschreibung der verschiedenen Verschlüsselungs-Subsysteme. Warum sollte der Auslagerungsspeicher verschlüsselt werden? Wie die Verschlüsselung von Plattenpartitionen dient auch die Verschlüsselung des Auslagerungsspeichers dem Schutz sensitiver Informationen. Stellen Sie sich etwa eine Anwendung vor, die ein Passwort erfordert. Solange dieses Passwort im Hauptspeicher verbleibt, ist alles in Ordnung. Beginnt Ihr Betriebssystem allerdings, Daten auf die Festplatte auszulagern, um im Hauptspeicher Platz für andere Anwendungen zu schaffen, kann es passieren, dass Ihr Passwort im Klartext in den Auslagerungsspeicher geschrieben wird, was es einem potentiellen Angreifer leicht macht, Ihr Passwort herauszufinden. Die Verschlüsselung Ihres Auslagerungsspeichers kann dieses Problem lösen. Vorbereitungen Für die weiteren Ausführungen dieses Abschnitts stellt ad0s1b die Swap-Partition dar. Noch ist Ihr Auslagerungsspeicher nicht verschlüsselt. Es könnte allerdings sein, dass bereits Passwörter oder andere sensitive Daten als Klartext im Auslagerungsspeicher vorhanden sind. Daher sollten Sie den Auslagerungsspeicher komplett mit zufällig generierten Zeichen überschreiben, bevor Sie ihn verschlüsseln: &prompt.root; dd if=/dev/random of=/dev/ad0s1b bs=1m Den Auslagerungsspeicher mit &man.gbde.8; verschlüsseln Verwenden Sie &os; 6.0-RELEASE oder neuer, sollten Sie in /etc/fstab das Suffix .bde an den Gerätenamen der Swap-Partition anhängen: # Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.bde none swap sw 0 0 Für &os;-Versionen vor 6.0-RELEASE benötigen Sie zusätzlich folgende Zeile in /etc/rc.conf: gbde_swap_enable="YES" Den Auslagerungsspeicher mit &man.geli.8; verschlüsseln Alternativ können Sie Ihren Auslagerungsspeicher auch mit &man.geli.8; verschlüsseln. Die Vorgehensweise ist dabei ähnlich. Allerdings hängen Sie bei der Verwendung von &man.geli.8; in /etc/fstab das Suffix .eli an den Gerätenamen der Swap-Partition an: # Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.eli none swap sw 0 0 In der Voreinstellung verschlüsselt &man.geli.8; den Auslagerungsspeicher mit dem AES-Algorithmus und einer Schlüssellänge von 256 Bit. Es ist möglich, diese Optionen durch das Setzen der geli_swap_flags-Option in /etc/rc.conf anzupassen. Die folgende Zeile weist das rc.d-Skript encswap an, &man.geli.8;-Swap-Partitionen mit dem Blowfish-Algorithmus und einer Schlüssellänge von 128 Bit zu verschlüsseln. Zusätzlich wird die Sektorgröße auf 4 Kilobyte gesetzt und die Option detach on last close aktiviert: geli_swap_flags="-e blowfish -l 128 -s 4096 -d" Auf Systemen vor &os; 6.2-RELEASE verwenden Sie hingegen die folgende Zeile: geli_swap_flags="-a blowfish -l 128 -s 4096 -d" Eine Auflistung möglicher Optionen für den Befehl onetime finden Sie in der Manualpage zu &man.geli.8;. Die korrekte Funktion testen Nachdem Sie Ihr System neu gestartet haben, können Sie die korrekte Funktion Ihres verschlüsselten Auslagerungsspeichers prüfen, indem Sie sich die Ausgabe von swapinfo ansehen. Wenn Sie &man.gbde.8; einsetzen, erhalten Sie eine Meldung ähnlich der folgenden: &prompt.user; swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.bde 542720 0 542720 0% Wenn Sie &man.geli.8; einsetzen, erhalten Sie hingegen ein Ausgabe ähnlich der folgenden: &prompt.user; swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b.eli 542720 0 542720 0%
diff --git a/de_DE.ISO8859-1/books/handbook/dtrace/chapter.sgml b/de_DE.ISO8859-1/books/handbook/dtrace/chapter.sgml index 6a2c42c1a5..5859cca712 100644 --- a/de_DE.ISO8859-1/books/handbook/dtrace/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/dtrace/chapter.sgml @@ -1,31 +1,417 @@ + + + + + Tom + Rhodes + Written by + + + + + + Benedict + Reuschling + Übersetzt von + + + Christoph + Sold + + + + + &dtrace; + + + Überblick + + &dtrace; + + &dtrace; support + &dtrace; + + + &dtrace;, auch bekannt als Dynamic Tracing, wurde von &sun; als ein + Werkzeug zur Analyse von Performance-Problemen in Produktiv- und + Entwicklungssystemen entwickelt. Es ist kein Debugging-Werkzeug, sondern + ein Hilfsmittel für Echtzeit-Systemanalysen. + + &dtrace; ist ein bemerkenswertes Werkzeug zur Profilerstellung, mit + einer beeindruckenden Palette von Eigenschaften zur Diagnose von + Systemereignissen. Es kann auch dazu verwendet werden, bestehende + Skripte ablaufen zu lassen, um einen Nutzen aus deren Möglichkeiten + zu ziehen. Nutzer können mittels der Programmiersprache D von + &dtrace; ihre eigenen Hilfsmittel schreiben, was es ermöglicht, die + eigenen Profile nach Ihren Bedürfnissen anzupassen. + + Nachdem Sie dieses Kapitel gelesen haben, werden Sie Folgendes wissen: + + + + Was &dtrace; ist und welche Funktionen es zur Verfügung + stellt. + + + + Unterschiede zwischen der &solaris; &dtrace; Implementierung und + derjenigen, die &os; bereitstellt. + + + + Wie man &dtrace; auf &os; aktiviert und verwendet. + + + + Bevor Sie dieses Kapitel lesen, sollten Sie: + + + + &unix; und &os; Grundlagen verstehen (). + + + + Einen Kernel konfigurieren und kompilieren können (). + + + + Vertraut sein mit Sicherheitsaspekten und wie diese + &os; betreffen (). + + + + Verstehen, wie man den Quellcode von &os; beziehen und das + Betriebssystem neu erstellen kann (). + + + + + + Diese Funktion ist als experimentell anzusehen. Manche + Einstellungen enthalten möglicherweise nicht alle + Funktionalitäten, andere Teile könnten gar nicht laufen. Mit + der Zeit, wenn diese Funktion als für den Produktivbetrieb + geeignet erscheint, wird auch diese Dokumentation geändert, um + diesem Umstand gerecht zu werden. + + + + + Unterschiede in der Implementierung + + Obwohl &dtrace; in &os; sehr ähnlich zu dem in &solaris; ist, + existieren doch Unterschiede, die vorher erklärt werden müssen. + Der Hauptunterschied für die Anwender besteht darin, dass in &os; + &dtrace; explizit aktiviert werden muss. Es existieren Kerneloptionen + und Module, die aktiviert sein müssen, damit &dtrace; korrekt + arbeitet. Diese werden später genauer erlätert. + + Die Kerneloption DDB_CTF wird dafür + verwendet, um die Unterstützung im Kernel für das Laden von + CTF-Daten aus Kernelmodulen und dem Kernel selbst zu + ermöglichen. CTF ist das Compact C Type Format + von &solaris;, welches eine reduzierte Form von Debug-Informationen + kapselt, ähnlich zu DWARF und den antiken Stabs. + Diese CTF-Daten werden dem Binärcode von den + ctfconvert und ctfmerge Befehlen + den Werkzeugen zum Bauen des Systems hinzugefügt. Das + ctfconvert-Dienstprogramm parst die vom Compiler + erstellten DWARF ELF + Debug-Abschnitte und ctfmerge vereint + CTF ELF-Abschnitte aus Objekten, + entweder in ausführbare Dateien oder Shared-Libraries. In + Kürze erfahren Sie, wie Sie dies für den Kernel und den Bau von + &os; aktivieren. + + Einige Provider in &os; unterscheiden sich von der + &solaris;-Implementierung. Am deutlichsten wird das beim + dtmalloc-Provider, welcher das Aufzeichnen von + malloc() nach Typen im &os;-Kernel + ermöglicht. + + In &os; darf &dtrace; wegen unterschiedlicher Sicherheitskonzepte + nur von root verwendet werden. &solaris; + besitzt ein paar Audit-Funktionen auf den unteren Ebenen, die noch nicht + in &os; implementiert sind. Deshalb kann nur root + auf /dev/dtrace/dtrace zugreifen. + + Zum Schluss muss noch erwähnt werden, dass die &dtrace;-Software + unter &sun;s CDDL Lizenz fällt. Die + Common Development and Distribution License wird von + &os; mitgeliefert, sehen Sie sich dazu + /usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE + an, oder lesen Sie die Online-Version unter . + + Diese Lizenz bedeutet, dass ein &os;-Kernel mit den &dtrace;-Optionen + immer noch BSD-lizenziert ist; allerdings tritt die + CDDL in Kraft, wenn Module in Binärform + vertrieben werden oder die Binärdateien geladen werden. + + + + Die &dtrace; Unterstützung aktivieren + + Um Unterstützung für &dtrace; zu aktivieren, fügen Sie + die folgenden Zeilen zu Ihrer Kernelkonfigurationsdatei hinzu: + + options KDTRACE_HOOKS +options DDB_CTF + + + Besitzer der AMD-Architektur werden wahrscheinlich noch die + folgende Zeile zur Kernelkonfigurationsdatei hinzufügen: + + options KDTRACE_FRAME + + Diese Option liefert die Unterstützung für die + FBT-Eigenschaft. &dtrace; wird auch ohne diese + Option funktionieren; jedoch wird dann Function Boundary Tracing nur + eingeschränkt unterstützt. + - DTrace (noch nicht übersetzt) + Der gesamte Quellcode muss neu gebaut und mit der + CTF-Option installiert werden. Um das zu erreichen, + bauen Sie &os; aus dem Quellcode mittels: - Dieses Kapitel ist noch nicht übersetzt. - Lesen Sie bitte - das Original in englischer Sprache. Wenn Sie helfen - wollen, dieses Kapitel zu übersetzen, senden Sie bitte - eine E-Mail an die Mailingliste &a.de.translators;. + + + &prompt.root; cd /usr/src + +&prompt.root; make WITH_CTF=1 kernel + + + Das System muss im Anschluss daran neu gestartet werden. + + Nachdem das System neu gestartet und der neue Kernel in den + Hauptspeicher geladen wurde, sollte die Unterstützung für die + Korn-Shell hinzugefügt werden. Dies wird benötigt, da die + Sammlung von &dtrace;-Werkzeugen mehrere Dienstprogramme enthält, + die in ksh implementiert sind. Installieren Sie + shells/ksh93. Es ist auch + möglich, diese Werkzeuge unter shells/pdksh oder shells/mksh laufen zu lassen. + + Zum Schluss sollten Sie noch den aktuellen &dtrace;-Werkzeugsatz + beschaffen. Die aktuelle Version ist unter + verfügbar. Ein Mechanismus zur Installation ist enthalten, + allerdings ist eine Installation nicht unbedingt nötig, um die darin + enthaltenen Dienstprogramme einzusetzen. + + + + &dtrace; verwenden + + Bevor die &dtrace;-Funktionaltät benutzt werden kann, muss das + &dtrace;-Gerät existieren. Um das Gerät zu laden, geben Sie + das folgende Kommando ein: + + &prompt.root; kldload dtraceall + + Die &dtrace;-Unterstützung sollte jetzt verfügbar sein. Um + alle Sonden anzuzeigen, kann der Administrator nun den folgenden Befehl + eingeben: + + &prompt.root; dtrace -l | more + + Alle Ausgaben werden an das more-Programm + übergeben, da der Bildschirmpuffer sehr schnell überlaufen + wird. Ab diesem Punkt kann &dtrace; als einsatzbereit angesehen werden. + Jetzt ist es an der Zeit, sich näher mit dem Satz von Werkzeugen zu + beschäftigen. + + Der Werkzeugsatz ist eine Sammlung von vorgefertigten Skripten, die + von &dtrace; ausgeführt werden können, um Systeminformationen + zu sammeln. Es gibt Skripte, die offene Dateien überprüfen, + den Speicher, CPU-Verbrauch und noch viel mehr. + Entpacken Sie die Skripte mit dem folgenden Befehl: + + &prompt.root; gunzip -c DTraceToolkit* | tar xvf - + + Wechseln Sie mit dem cd-Kommando in dieses + Verzeichnis und ändern Sie die Berechtigung zum Ausführen von + allen Dateien, deren Name klein geschrieben ist, auf + 755. + + All diese Skripte müssen inhaltlich verändert werden. + Diejenigen, die auf /usr/bin/ksh verweisen, + müssen in /usr/local/bin/ksh geändert + werden und die Anderen, welche /usr/bin/sh + verwenden, müssen so angepasst werden, dass sie + /bin/sh verwenden. Schliesslich müssen noch + diejenigen, die /usr/bin/perl enthalten, auf + /usr/local/bin/perl umgeschrieben werden. + + + Zu diesem Zeitpunkt ist es klug, den Leser noch einmal daran zu + erinnern, dass die Unterstützung von &dtrace; in &os; noch + unvollständig und + experimentell ist. Viele dieser Skripte werden + nicht funktionieren, da diese entweder zu sehr &solaris;-spezifisch + sind oder Sonden verwenden, die zur Zeit noch nicht unterstützt + werden. + + + Zum Zeitpunkt, an dem dieses Dokument geschrieben wurde, existieren + nur zwei Skripte im &dtrace;-Werkzeugsatz, die von &os; komplett + unterstützt werden: die Skripte hotkernel und + procsystime. Diese beiden werden in den folgenden + Teilen dieses Abschnitts genauer untersucht. + + hotkernel wurde entworfen, um zu identifizieren, + welche Funktion die meiste Kernelzeit beansprucht. Normal + ausgeführt, wird es Ausgaben ähnlich der Folgenden + produzieren: + + &prompt.root; ./hotkernel +Sampling... Hit Ctrl-C to end. + + Der Systemadministrator muss die Tastenkombination CtrlC + drücken, um den Prozess zu stoppen. Nach dem Abbruch wird das + Skript eine Liste von Kernelfunktionen und Zeitmessungen ausgeben, + aufsteigend sortiert nach den Zeiten: + + kernel`_thread_lock_flags 2 0.0% +0xc1097063 2 0.0% +kernel`sched_userret 2 0.0% +kernel`kern_select 2 0.0% +kernel`generic_copyin 3 0.0% +kernel`_mtx_assert 3 0.0% +kernel`vm_fault 3 0.0% +kernel`sopoll_generic 3 0.0% +kernel`fixup_filename 4 0.0% +kernel`_isitmyx 4 0.0% +kernel`find_instance 4 0.0% +kernel`_mtx_unlock_flags 5 0.0% +kernel`syscall 5 0.0% +kernel`DELAY 5 0.0% +0xc108a253 6 0.0% +kernel`witness_lock 7 0.0% +kernel`read_aux_data_no_wait 7 0.0% +kernel`Xint0x80_syscall 7 0.0% +kernel`witness_checkorder 7 0.0% +kernel`sse2_pagezero 8 0.0% +kernel`strncmp 9 0.0% +kernel`spinlock_exit 10 0.0% +kernel`_mtx_lock_flags 11 0.0% +kernel`witness_unlock 15 0.0% +kernel`sched_idletd 137 0.3% +0xc10981a5 42139 99.3% + + + + Dieses Skript funktioniert auch mit Kernelmodulen. Um diese + Eigenschaft zu verwenden, starten Sie das Skript mit dem Parameter + : + + &prompt.root; ./hotkernel -m +Sampling... Hit Ctrl-C to end. +^C +MODULE COUNT PCNT +0xc107882e 1 0.0% +0xc10e6aa4 1 0.0% +0xc1076983 1 0.0% +0xc109708a 1 0.0% +0xc1075a5d 1 0.0% +0xc1077325 1 0.0% +0xc108a245 1 0.0% +0xc107730d 1 0.0% +0xc1097063 2 0.0% +0xc108a253 73 0.0% +kernel 874 0.4% +0xc10981a5 213781 99.6% + + + + Das procsystime Skript fängt die + Systemaufruf-Zeiten ab und zeigt diese für eine gegebene + PID oder einen Prozessnamen an. Im folgenden Beispiel + wurde eine neue Instanz von /bin/csh erzeugt. + procsystime wurde ausgeführt und verbleibt so, + während ein paar Befehle in die andere Instanz von + csh eingegeben werden. Dies sind die Ergebnisse + dieses Versuchs: + + &prompt.root; ./procsystime -n csh +Tracing... Hit Ctrl-C to end... +^C + +Elapsed Times for processes csh, + + SYSCALL TIME (ns) + getpid 6131 + sigreturn 8121 + close 19127 + fcntl 19959 + dup 26955 + setpgid 28070 + stat 31899 + setitimer 40938 + wait4 62717 + sigaction 67372 + sigprocmask 119091 + gettimeofday 183710 + write 263242 + execve 492547 + ioctl 770073 + vfork 3258923 + sigsuspend 6985124 + read 3988049784 + + Wie aus der Ausgabe ersichtlich ist, verbraucht der + read()-Systemaufruf die meiste Zeit in Nanosekunden, + während der Systemaufruf getpid() hingegen am + schnellsten läft. + + + + Die Sprache D + + Der &dtrace; Werkzeugsatz enthält viele Skripte in der + speziellen Sprache von &dtrace;. Diese Sprache wird als die D + Sprache in der Dokumentation von &sun; bezeichnet und ist C++ + sehr ähnlich. Eine tiefergehende Betrachtung dieser Sprache + würde den Rahmen dieses Dokuments sprengen. Ausführlich wird + diese Sprache unter + behandelt. + - + diff --git a/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml b/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml index 921264646b..2c4deda11c 100644 --- a/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/filesystems/chapter.sgml @@ -1,662 +1,681 @@ Tom Rhodes Geschrieben von Benedict Reuschling Übersetzt von Daniel Seuffert Dateisystemunterstützung Übersicht File Systems File Systems Support File Systems Dateisysteme sind ein wesentlicher Bestandteil von Betriebssystemen. Sie erlauben es den Benutzern Dateien zu laden und zu speichern, ermöglichen den Zugriff auf die Daten und machen Festplatten überhaupt erst nützlich. Unterschiedliche Betriebssysteme besitzen normalerweise eine Gemeinsamkeit, nämlich deren mitgeliefertes Dateisystem. Bei &os; ist dieses Dateisystem bekannt unter dem Namen Fast File System FFS, das direkt auf dem Original-Unix™ Dateisystem, UFS genannt, basiert. Dieses ist das von &os; mitgelieferte Dateisystem, das auf Festplatten für den Dateizugriff verwendet wird. &os; unterstützt auch eine Vielzahl von anderen Dateisystemen, um auf Daten von anderen Betriebssystemen lokal zuzugreifen, wie z.B. Daten auf USB-Speichermedien, Flash-Speichern und Festplatten. Es gibt auch Unterstützung für fremde Dateisysteme. Dabei handelt es sich um Dateisysteme, die auf anderen Betriebssystemen entwickelt wurden, wie beispielsweise das &linux; Extended File System (EXT) und das Z-Dateisystem (ZFS) von &sun;. Es gibt verschiedene Stufen der Unterstützung in &os; für diese unterschiedlichen Dateisysteme. Manche benötigen ein geladenes Kernelmodul, andere die Installation bestimmter Werkzeuge. Dieses Kapitel dient dazu, den Benutzern von &os; dazu helfen, auf andere Dateisysteme zuzugreifen, beginnend mit &sun;s Z-Dateisystem (ZFS). Nachdem Sie dieses Kapitel gelesen haben, werden Sie die folgenden Dinge wissen: Den Unterschied zwischen eingebauten und unterstützten Dateisystemen. Welche Dateisysteme von &os; unterstützt werden. Wie man fremde Dateisysteme aktiviert, konfiguriert, darauf zugreift und diese verwendet. Bevor Sie dieses Kapitel lesen, sollten Sie: Grundlagen von &unix; und &os; verstehen (). Mit den Grundlagen der Konfiguration und dem Bauen des Kernels vertraut sein (). Problemlos Software von Drittherstellern in &os; installieren können (). sich ein wenig mit Festplatten, Speicher und Gerätenamen in &os; auskennen (). Die ZFS-Funktionen sind als experimentell zu betrachten. Manchen Optionen werden möglicherweise bestimmte Funktionalitäten fehlen, andere funktionieren eventuell gar nicht. Mit der Zeit werden diese Eigenschaften als für den Produktivbetrieb geeignet erachtet werden und dann wird diese Dokumentation entsprechend geändert, um diesem Zustand gerecht zu werden. Das Z-Dateisystem (ZFS) Das Z-Dateisystem ist eine neue von &sun; entwickelte Technologie, mit dem Konzept einer gepoolten Speichermethodik. Das bedeutet, dass Speicher nur verwendet wird, wenn dieser als Datenspeicher benutzt wird. ZFS wurde auch für maximale Datenintegrität entwickelt und unterstützt dabei mehrfache Kopien, Schnappschüsse und Prüfsummen für Daten. Ein neues Datenreplikationsmodell, bekannt als RAID-Z, wurde ebenfalls hinzugefügt. Das RAID-Z-Modell ist ähnlich zu RAID5, wurde aber mit dem Ziel entworfen, Datenverfälschung beim Schreiben zu verhindern. ZFS Einstellungen Das ZFS-Teilsystem benötigt viele Systemressourcen, weshalb gewisse Einstellungen notwendig sind, um maximale Effizienz während des täglichen Gebrauchs zu gewährleisten. Da es sich um eine experimentelle Funktion in &os; handelt, wird sich das in naher Zukunft ändern. Wie dem auch sei, zum gegenwärtigen Zeitpunkt wird die Anwendung der folgenden Schritte empfohlen. Hauptspeicher Der verfügbare Hauptspeicher im System sollte mindestens 1 Gigabyte betragen, jedoch werden 2 Gigabyte oder mehr empfohlen. In allen gezeigten Beispielen in diesem Abschnitt verwendet das System 1 Gigabyte Hauptspeicher mit mehreren anderen Einstellungen. Manche Nutzer hatten Erfolg bei der Verwendung von weniger als 1 GB Hauptspeicher, aber mit dieser begrenzten Menge an RAM ist es sehr wahrscheinlich, dass &os; eine Panic wegen erschöpftem Hauptspeicher erleiden wird, wenn es hohen Belastungen ausgesetzt ist. Kernelkonfiguration Es wird vorgeschlagen, nicht benötigte Treiber und Optionen aus der Kernelkonfigurationsdatei zu entfernen. Da die meisten Geräte als Module verfügbar sind, können diese einfach mittels der Datei /boot/loader.conf geladen werden. Nutzer der &i386;-Architektur sollten die folgende Option in ihrer Kernelkonfigurationsdatei hinzufügen, den Kernel neu erstellen und anschliessend das System neustarten: options KVA_PAGES=512 Diese Option wird den Adressraum des Kernels vergrössern, was es ermöglicht, die Einstellung vm.kvm_size über die momentan verhängte Grenze von 1 GB (2 GB für PAE) zu erhöhen. Um den passenden Wert dieser Option zu ermitteln, teilen Sie den gewünschten Adressraum in Megabyte durch vier. In diesem Fall beträgt er 512 für 2 GB. Einstellungen des Loaders Der kmem-Addressraum sollte auf allen &os;-Architekturen erhöht werden. Die folgende Option, die dem Testsystem mit einem Gigabyte Hauptspeicher der Datei /boot/loader.conf hinzugefügt und welches anschliessend neu gestartet wurde, war erfolgreich: vm.kmem_size="330M" vm.kmem_size_max="330M" vfs.zfs.arc_max="40M" vfs.zfs.vdev.cache.size="5M" Eine detailliertere Liste von Vorschlägen zu ZFS-verwandten Einstellungen finden Sie unter . Verwenden von <acronym>ZFS</acronym> Es existiert ein Startmechanismus, der es &os; erlaubt, ZFS als Pool während des Systemstarts zu initialisieren. Um das zu tun, geben Sie die folgenden Befehle ein: &prompt.root; echo 'zfs_enable="YES"' >> /etc/rc.conf &prompt.root; /etc/rc.d/zfs start - Für den Rest dieses Dokuments wird angenommen, dass zwei + Für den Rest dieses Dokuments wird angenommen, dass drei SCSI-Platten im System verfügbar sind und dass deren Gerätenamen - da0 und - da1 lauten. + da0, + da1 und + da2 lauten. Benutzer von IDE-Hardware können ad-Geräte an Stelle von SCSI-Hardware einsetzen. Pool mit nur einer Platte - Um ein ZFS auf einer einzelnen Festplatte - zu erstellen, benutzen Sie das + Um ein einfaches, nicht-redundantes ZFS auf + einer einzelnen Festplatte zu erstellen, benutzen Sie das zpool-Kommando: &prompt.root; zpool create example /dev/da0 Um den neuen Pool anzusehen, überprüfen Sie die Ausgabe von df: &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235230 1628718 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032846 48737598 2% /usr example 17547136 0 17547136 0% /example Diese Ausgabe zeigt deutlich, dass der example-Pool nicht nur erstellt, sondern auch gemountet wurde. Er ist genau wie andere Dateisysteme verfügbar, Dateien können darin erstellt und von den Benutzern aufgelistet werden, wie im folgenden Beispiel gezeigt wird: &prompt.root cd /example &prompt.root; ls &prompt.root; touch testfile &prompt.root; ls -al total 4 drwxr-xr-x 2 root wheel 3 Aug 29 23:15 . drwxr-xr-x 21 root wheel 512 Aug 29 23:12 .. -rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfile Leider verwendet dieser Pool keine der Vorteile der ZFS-Eigenschaften. Erstellen Sie ein Dateisystem auf diesem Pool und aktivieren Sie die Komprimierung darauf: &prompt.root; zfs create example/compressed &prompt.root; zfs set compression=gzip example/compressed Jetzt ist example/compressed ein von ZFS komprimiertes Dateisystem. Versuchen Sie, ein paar grosse Dateien in das Verzeichnis /example/compressed zu kopieren. Die Komprimierung kann jetzt deaktiviert werden mittels: &prompt.root; zfs set compression=off example/compressed Um das Dateisystem aus dem Verzeichnisbaum abzuhängen, geben Sie den folgenden Befehl ein und vergewissern Sie sich über df vom Erfolg dieser Aktion: &prompt.root; zfs umount example/compressed &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235232 1628716 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example Mounten Sie das Dateisystem erneut, um es wieder verfügbar zu machen und bestätigen Sie mit df: &prompt.root; zfs mount example/compressed &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235234 1628714 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example example/compressed 17547008 0 17547008 0% /example/compressed Der Pool und das Dateisystem können genausogut über die Ausgabe von mount überwacht werden: &prompt.root; mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1d on /usr (ufs, local, soft-updates) example on /example (zfs, local) example/data on /example/data (zfs, local) example/compressed on /example/compressed (zfs, local) Wie zu beobachten ist, können ZFS-Dateisysteme nach deren Erstellung genauso wie normale Dateisysteme verwendet werden, jedoch sind auch noch viele andere Eigenschaften verfügbar. Im folgenden Beispiel wird ein neues Dateisystem, data, erstellt. Wichtige Dateien sollen hier gespeichert werden, weshalb das Dateisystem angewiesen wird, jeweils zwei Kopien jedes Datenblocks zu unterhalten: &prompt.root; zfs create example/data &prompt.root; zfs set copies=2 example/data Es ist nun möglich, den Speicherplatzverbrauch der Daten mittels df erneut zu betrachten: &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235234 1628714 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example example/compressed 17547008 0 17547008 0% /example/compressed example/data 17547008 0 17547008 0% /example/data Beachten Sie, dass jedem Dateisystem des Pools die gleiche Menge an Speicher zur Verfügung steht. Das ist der Grund für die Verwendung von df in all diesen Beispielen, da es zeigt, dass das Dateisystem nur den Speicher belegt, den es auch benötigt und alles wird von dem gleichen Pool abgezogen. ZFS macht Konzepte wie Volumen und Partitionen überflüssig und erlaubt mehrere Dateisysteme auf demselben Pool. Zerstören Sie die Datensysteme und anschliessend den Pool, da sie nicht länger gebraucht werden: &prompt.root; zfs destroy example/compressed &prompt.root; zfs destroy example/data &prompt.root; zpool destroy example Festplatten werden mit der Zeit schlechter und fallen aus, eine unvermeidliche Tatsache. Wenn diese Platte ausfällt, sind die Daten verloren. Eine Möglichkeit, diesen Datenverlust beim Plattenausfall zu vermeiden, ist die Verwendung von RAID. ZFS unterstützt diese Eigenschaft im Entwurf seiner Pools und wird im nächsten Abschnitt behandelt. <acronym>ZFS</acronym> RAID-Z Wie zuvor bereits erwähnt, wird in diesem Abschnitt - angenommen, dass zwei SCSI-Geräte vorhanden - sind (da0 und da1). - Um einen RAID-Z Pool zu erstellen, geben Sie das + angenommen, dass drei SCSI-Geräte vorhanden + sind (da0, da1 + und da1 bzw. ad0 + und so weiter, falls IDE-Platten verwendet werden). Um einen + RAID-Z Pool zu erstellen, geben Sie das folgende Kommando ein: - &prompt.root; zpool create storage raidz da0 da1 + &prompt.root; zpool create storage raidz da0 da1 da2 + + + &sun; empfiehlt, dass die Anzahl von Geräten in einer + RAID-Z Konfiguration drei bis neun beträgt. + Falls Ihre Anforderungen unbedingt einen einzelnen Pool, bestehend + aus zehn oder mehr Platten, erfordern, sollten Sie überlegen, + diesen in kleinere RAID-Z Gruppen aufzuteilen. + Sollten Sie nur zwei Platten zur Verfügung haben und trotzdem + Redundanz benötigen, ziehen Sie den Einsatz der + ZFS-Mirror (Spiegel) Fähigkeiten in + Betracht. Lesen Sie die &man.zpool.8; Manualpage, um mehr + darüber zu erfahren. + Der storage-zPool sollte jetzt erstellt worden sein. Sie können das überprüfen, indem Sie die Befehle &man.mount.8; und &man.df.1; wie zuvor verwenden. Weitere Plattenspeicher können an das Ende der oben stehenden Liste hinzugefügt werden. Erstellen Sie ein neues Dateisystem in dem Pool, home genannt, in dem später Dateien von Benutzern platziert werden: &prompt.root; zfs create storage/home Nun kann die Komprimierung aktiviert und zusätzliche Kopien der Benutzerverzeichnisse und der darin enthaltenen Dateien angelegt werden. Dies geschieht über die gleichen Befehle wie bereits zuvor: &prompt.root; zfs set copies=2 storage/home &prompt.root; zfs set compression=gzip storage/home Um dieses Verzeichnis als neues Benutzerverzeichnis zu verwenden, kopieren Sie die Nutzerdaten dort hin und erstellen Sie die entsprechenden Symlinks: &prompt.root; cp -rp /home/* /storage/home &prompt.root; rm -rf /home /usr/home &prompt.root; ln -s /storage/home /home &prompt.root; ln -s /storage/home /usr/home Anwender sollten jetzt ihre Daten in dem neu angelegten /storage/home Dateisystem auffinden. Prüfen Sie das, indem Sie einen neuen Benutzer hinzufügen und sich als dieser Benutzer am System anmelden. Versuchen Sie, einen Schnappschuss anzulegen, der später wieder zurückgerollt werden kann: &prompt.root; zfs snapshot storage/home@08-30-08 Beachten Sie, dass die Schnappschuss-Option nur auf echte Dateisysteme, jedoch nicht auf Verzeichnisse oder eine Datei angewendet werden kann. Das @-Zeichen dient als Begrenzer zwischen dem Dateisystem- oder Volumenamen. Wenn ein Benutzerverzeichnis zerstört wird, können Sie es über den folgenden Befehl wieder herstellen: &prompt.root; zfs rollback storage/home@08-30-08 Um eine Liste von allen verfügbaren Schnappschüssen zu erhalten, starten Sie das ls-Kommando in Verzeichnis .zfs/snapshot des entsprechenden Dateisystems. Beispielsweise können Sie den vorhin angelegten Schnappschuss mit dem folgenden Befehl auflisten: &prompt.root; ls /storage/home/.zfs/snapshot Es ist möglich ein Skript zu schreiben, dass monatliche Schnappschüsse der Nutzerdaten anlegt. Allerdings werden die Schnappschüsse mit der Zeit eine grosse Menge an Speicherplatz einnehmen. Den vorherigen Schnappschuss können Sie über das folgende Kommando löschen: &prompt.root; zfs destroy storage/home@08-30-08 Nach all diesen Tests gibt es keinen Grund, das Verzeichnis /storage/home noch länger in seinem momentanen Zustand zu belassen. Ernennen Sie es zum echten /home-Dateisystem: &prompt.root; zfs set mountpoint=/home storage/home Die Eingabe der Befehle df und mount zeigt, dass das System das Dateisystem nun als das echte /home behandelt: &prompt.root; mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1d on /usr (ufs, local, soft-updates) storage on /storage (zfs, local) storage/home on /home (zfs, local) &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235240 1628708 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032826 48737618 2% /usr -storage 17547008 0 17547008 0% /storage -storage/home 17547008 0 17547008 0% /home +storage 26320512 0 26320512 0% /storage +storage/home 26320512 0 26320512 0% /home Damit ist die RAID-Z-Konfiguration abgeschlossen. Um über den Status des Dateisystems mittels des nächtlichen &man.periodic.8;-Skripts auf dem Laufenden gehalten zu werden, geben Sie das folgende Kommando ein: &prompt.root; echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf Wiederherstellung von <acronym>RAID</acronym>-Z Jedes Software-RAID besitzt Verfahren, um dessen Zustand zu überwachen. ZFS ist da keine Ausnahme. Der Status von RAID-Z Geräten kann mittels des folgenden Kommandos betrachtet werden: &prompt.root; zpool status -x Wenn alle Pools gesund sind und alles normal ist, wird die folgende Nachricht zurückgegeben: all pools are healthy Wenn ein Problem existiert (möglicherweise ist eine Platte ausgefallen), wird der Zustand des Pools ähnlich dem Folgenden ausgegeben: pool: storage state: DEGRADED status: One or more devices has been taken offline by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using 'zpool online' or replace the device with 'zpool replace'. scrub: none requested config: NAME STATE READ WRITE CKSUM storage DEGRADED 0 0 0 raidz1 DEGRADED 0 0 0 da0 ONLINE 0 0 0 da1 OFFLINE 0 0 0 + da2 ONLINE 0 0 0 errors: No known data errors Das bedeutet, dass das Gerät vom Systemadministrator abgeschaltet wurde. In diesem Fall trifft das zu. Um eine Platte abzuschalten, wurde das folgende Kommando eingegeben: &prompt.root; zpool offline storage da1 Es ist jetzt möglich, da1 zu ersetzen, nachdem das System ausgeschaltet wurde. Wenn das System wieder läuft, kann der folgende Befehl benutzt werden, um die Platte zu ersetzen: &prompt.root; zpool replace storage da1 Von da an kann der Status erneut überprüft werden, jedoch dieses Mal ohne die Option , um die Zustandsinformation zu bekommen: &prompt.root; zpool status storage pool: storage state: ONLINE scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008 config: NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 + da2 ONLINE 0 0 0 errors: No known data errors Wie in diesem Beispiel gezeigt, scheint alles wieder normal zu sein. Datenüberprüfung Wie bereits erwähnt, verwendet ZFS Prüfsummen, um die Integrität der gespeicherten Daten zu verifizieren. Die Prüfsummen werden automatisch beim Erstellen des Dateisystem aktiviert und können über den folgenden Befehl deaktiviert werden: &prompt.root; zfs set checksum=off storage/home Das ist jedoch kein schlauer Einfall, da die Prüfsummen nur ganz wenig Speicherplatz einnehmen und viel nützlicher sind, wenn Sie aktiviert bleiben. Es scheint auch kein nennenswerter Ressourcenverbrauch mit deren Aktivierung verbunden zu sein. Wenn die Prüfsummen aktiv sind, kann ZFS die Datenintegrität über den Vergleich der Prüfsummen gewährleisten. Dieser Prozess wird als reinigen bezeichnet. Um die Datenintegrität des storage-Pools zu überprüfen, geben Sie den folgenden Befehl ein: &prompt.root; zpool scrub storage Dieser Prozess kann einige Zeit in Anspruch nehmen, abhängig davon, wieviele Daten gespeichert sind. Es handelt sich dabei auch um eine I/O-intensive Aktion, weshalb auch jeweils nur eine dieser Operationen durchgeführt werden darf. Nachdem die Reinigung abgeschlossen ist, wird der Status aktualisiert und kann über eine Statusabfrage eingesehen werden: &prompt.root; zpool status storage pool: storage state: ONLINE scrub: scrub completed with 0 errors on Sat Aug 30 19:57:37 2008 config: NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 + da2 ONLINE 0 0 0 errors: No known data errors Die Zeit des Abschlusses der Aktion kann in diesem Beispiel direkt abgelesen werden. Die Prüfsummen helfen dabei, sicherzustellen, dass die Datenintegrität über einen langen Zeitraum hinaus erhalten bleibt. Es gibt viele weitere Optionen für das Z-Dateisystem, lesen Sie dazu die Manualpage &man.zfs.8; und &man.zpool.8;. diff --git a/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml b/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml index 205ccb7ab3..673974d115 100644 --- a/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/introduction/chapter.sgml @@ -1,1283 +1,1291 @@ Jim Mock Neu zusammengestellt, umstrukturiert und um Abschnitte erweitert durch Sascha Edelburg Übersetzt von Einführung Übersicht Herzlichen Dank für Ihr Interesse an &os;! Das folgende Kapitel behandelt verschiedene Aspekte des &os; Projects wie dessen geschichtliche Entwicklung, dessen Ziele oder dessen Entwicklungsmodell. Nach dem Durcharbeiten des Kapitels wissen Sie über folgende Punkte Bescheid: Wo &os; im Vergleich zu anderen Betriebssystemen steht Die Geschichte des &os; Projects Die Ziele des &os; Projects Die Grundlagen des &os;-Open-Source-Entwicklungsmodells Und natürlich wo der Name &os; herrührt Willkommen bei &os;! 4.4BSD-Lite &os; ist ein auf 4.4BSD-Lite basierendes Betriebssystem für Intel (x86 und &itanium;), AMD64, Alpha und Sun &ultrasparc; Rechner. An Portierungen zu anderen Architekturen wird derzeit gearbeitet. Mehr zu Geschichte von &os; können Sie im kurzen geschichtlichen Abriss zu &os; oder im Abschnitt Das aktuelle &os;-Release nachlesen. Falls Sie das &os; Project unterstützen wollen (mit Quellcode, Hardware- oder Geldspenden), sollten Sie den Artikel &os; unterstützen lesen. Was kann &os;? &os; hat zahlreiche bemerkenswerte Eigenschaften. Um nur einige zu nennen: Präemptives Multitasking Präemptives Multitasking mit dynamischer Prioritätsanpassung zum reibungslosen und ausgeglichenen Teilen der Systemressourcen zwischen Anwendungen und Anwendern, selbst unter schwerster Last. Mehrbenutzerbetrieb Der Mehrbenutzerbetrieb von &os; erlaubt es, viele Anwender gleichzeitig am System mit verschiedenen Aufgaben arbeiten zu lassen. Beispielsweise Geräte wie Drucker oder Bandlaufwerke, die sich nur schwerlich unter allen Anwendern des Systems oder im Netzwerk teilen lassen, können durch Setzen von Verwendungsbeschränkungen auf Benutzer oder Benutzergruppen wichtige Systemressourcen vor Überbeanspruchung schützen. TCP/IP-Netzwerkfähigkeit Hervorragende TCP/IP-Netzwerkfähigkeit mit Unterstützung von Industriestandards wie SCTP, DHCP, NFS, NIS, PPP, SLIP, IPsec und IPv6. Das heißt, Ihr &os;-System kann in einfachster Weise mit anderen Systemen interagieren. Zudem kann es als Server-System im Unternehmen wichtige Aufgaben übernehmen, beispielsweise als NFS- oder E-Mail-Server oder es kann Ihren Betrieb durch HTTP- und FTP-Server beziehungsweise durch Routing und Firewalling Internet-fähig machen. Speicherschutz Der Speicherschutz stellt sicher, dass Anwendungen (oder Anwender) sich nicht gegenseitig stören. Stürzt eine Anwendung ab, hat das keine Auswirkung auf andere Prozesse. &os; ist ein 32-Bit-Betriebssystem (64-Bit auf Alpha, &itanium;, AMD64, und &ultrasparc;) und wurde als solches von Grund auf neu entworfen. X-Window-System XFree86 Das X-Window-System (X11R7) als Industriestandard bietet eine grafische Benutzeroberfläche (GUI). Minimale Voraussetzung zur Verwendung ist lediglich eine Grafikkarte und ein Bildschirm, die beide den VGA-Modus unterstützen. Binärkompatibilität Linux Binärkompatibilität SCO Binärkompatibilität SVR4 Binärkompatibilität BSD/OS Binärkompatibilität NetBSD Binärkompatibilität mit vielen unter verschiedenen Betriebssystemen erstellten Programmen wie Linux, SCO, SVR4, BSDI und NetBSD. Tausende von sofort lauffähigen Anwendungen sind aus den Ports- und Packages-Sammlungen für &os; verfügbar. Warum mühselig im Netz Software suchen, wenn sie bereits hier vorhanden ist? Tausende zusätzliche leicht zu portierende Anwendungen sind über das Internet zu beziehen. &os; ist Quellcode-kompatibel mit den meisten kommerziellen &unix; Systemen. Daher bedürfen Anwendungen häufig nur geringer oder gar keiner Anpassung, um auf einem &os;-System zu kompilieren. virtueller Speicher Seitenweise anforderbarer Virtueller Speicher und der merged VM/buffer cache-Entwurf bedient effektiv den großen Speicherhunger mancher Anwendungen bei gleichzeitigem Aufrechterhalten der Bedienbarkeit des Systems für weitere Benutzer. Symmetrisches Multi-Processing (SMP) SMP-Unterstützung für Mehrprozessorsysteme Kompiler C Kompiler C++ Kompiler FORTRAN Ein voller Satz von C, C++ und Fortran- Entwicklungswerkzeugen. Viele zusätzliche Programmiersprachen für Wissenschaft und Entwicklung sind aus der Ports- und Packages-Sammlung zu haben. Quellcode Quellcode für das gesamte System bedeutet größtmögliche Kontrolle über Ihre Umgebung. Warum sollte man sich durch proprietäre Lösungen knebeln und sich auf Gedeih und Verderb der Gnade eines Herstellers ausliefern, wenn man doch ein wahrhaft offenes System haben kann? Umfangreiche Online-Dokumentation. 4.4BSD-Lite Computer Systems Research Group (CSRG) U.C. Berkeley &os; basiert auf dem 4.4BSD-Lite-Release der Computer Systems Research Group (CSRG) der Universität von Kalifornien in Berkeley und führt die namhafte Tradition der Entwicklung von BSD-Systemen fort. Zusätzlich zu der herausragenden Arbeit der CSRG hat das &os; Project tausende weitere Arbeitsstunden investiert, um das System zu verfeinern und maximale Leistung und Zuverlässigkeit bei Alltagslast zu bieten. Während viele kommerzielle Riesen Probleme haben PC-Betriebssysteme mit derartigen Funktionen, Leistungpotential und Zuverlässigkeit anzubieten, kann &os; damit schon jetzt aufwarten! Die Anwendungsmöglichkeiten von &os; werden nur durch Ihre Vorstellungskraft begrenzt. Von Software-Entwicklung bis zu Produktionsautomatisierung, von Lagerverwaltung über Abweichungskorrektur bei Satelliten; Falls etwas mit kommerziellen &unix; Produkten machbar ist, dann ist es höchstwahrscheinlich auch mit &os; möglich. &os; profitiert stark von tausenden hochwertigen Anwendungen aus wissenschaftlichen Instituten und Universitäten in aller Welt. Häufig sind diese für wenig Geld oder sogar kostenlos zu bekommen. Kommerzielle Anwendungen sind ebenso verfügbar und es werden täglich mehr. Durch den freien Zugang zum Quellcode von &os; ist es in unvergleichbarer Weise möglich, das System für spezielle Anwendungen oder Projekte anzupassen. Dies ist mit den meisten kommerziellen Betriebssystemen einfach nicht möglich. Beispiele für Anwendungen, die unter &os; laufen, sind: Internet-Dienste: Die robuste TCP/IP-Implementierung in &os; macht es zu einer idealen Plattform für verschiedenste Internet-Dienste, wie zum Beispiel: FTP-Server FTP-Server HTTP-Server HTTP-Server (Standard-Web-Server oder mit SSL-Verschlüsselung) IPv4- und IPv6-Routing Firewall NAT Firewalls und NAT-Gateways (IP-Masquerading) E-Mail E-Mail-Server Usenet Usenet-News und Foren (BBS) Zum Betreiben von &os; reicht schon ein günstiger 386-PC. Wenn es das Wachstum Ihres Unternehmens verlangt, kann &os; aber auch auf einem hochgerüsteten 4-Wege-System mit Xeon-Prozessoren und RAID-Plattenspeicher Verwendung finden. Bildung: Sind Sie Informatikstudent oder Student eines verwandten Studiengangs? Die praktischen Einblicke in &os; sind die beste Möglichkeit etwas über Betriebssysteme, Rechnerarchitektur und Netzwerke zu lernen. Einige frei erhältliche CAD-, mathematische und grafische Anwendungen sind sehr nützlich, gerade für diejenigen, die &os; nicht zum Selbstzweck, sondern als Arbeitsmittel einsetzen. Wissenschaft: Mit dem frei verfügbaren Quellcode für das gesamte System bildet &os; ein exzellentes Studienobjekt in der Disziplin der Betriebssysteme, wie auch in anderen Zweigen der Informatik. Es ist beispielsweise denkbar, das räumlich getrennte Gruppen gemeinsam an einer Idee oder Entwicklung arbeiten. Das Konzept der freien Verfügbarkeit und -nutzung von &os; ermöglicht so einen Gebrauch, auch ohne sich groß Gedanken über Lizenzbedingungen oder -beschränkungen machen zu müssen. Router DNS-Server Netzwerkfähigkeit: Brauchen Sie einen neuen Router? Oder einen Name-Server (DNS)? Eine Firewall zum Schutze Ihres Intranets vor Fremdzugriff? &os; macht aus dem in der Ecke verstaubenden 386- oder 486-PC im Handumdrehen einen leistungsfähigen Router mit anspruchsvollen Packet-Filter-Fähigkeiten. X-Window-System XFree86 X-Window-System Accelerated-X X-Window-Workstation: &os; ist eine gute Wahl für kostengünstige X-Terminals mit dem frei verfügbaren X11-Server. Im Gegensatz zu einem X-Terminal erlaubt es &os;, viele Anwendungen lokal laufen zu lassen, was die Last eines zentralen Servers erleichtern kann. &os; kann selbst plattenlos starten, was einzelne Workstations noch günstiger macht und die Wartung erleichtert. GNU-Compiler-Collection Software-Entwicklung: Das Standard-System von &os; wird mit einem kompletten Satz an Entwicklungswerkzeugen bereitgestellt, unter anderem mit dem bekannten GNU C/C++-Kompiler und -Debugger. &os; ist sowohl in Form von Quellcode als auch in Binärform auf CD-ROM, DVD und über anonymous FTP erhältlich. Näheres zum Bezug von &os; enthält . Wer benutzt &os;? Anwender Bekannte &os;-Anwender &os; dient als Plattform für Geräte und Produkte einiger der weltgrößten IT-Firmen, darunter: Apple Apple Cisco Cisco Juniper Juniper NetApp NetApp Außerdem laufen einige der größten Internet-Auftritte unter &os;, beispielsweise: Yahoo! Yahoo! Yandex/primary> Yandex Apache Apache Rambler Rambler Sina Sina Pair Networks Pair Networks Sony Japan Sony Japan Netcraft Netcraft + + NetEase + + + + NetEase + + Weathernews Weathernews TELEHOUSE America TELEHOUSE America Das &os; Project Der folgende Abschnitt bietet einige Hintergrundinformationen zum &os; Project, einschließlich einem kurzen geschichtlichen Abriss, den Projektzielen und dem Entwicklungsmodell. Jordan Hubbard Beigesteuert von Kurzer geschichtlicher Abriss zu &os; 386BSD Patchkit Hubbard, Jordan Williams, Nate Grimes, Rod &os; Project Geschichte Das &os; Project erblickte das Licht der Welt Anfang 1993 teils als Auswuchs des Unofficial 386BSD Patchkit unter der Regie der letzten drei Koordinatoren des Patchkits: Nate Williams, Rod Grimes und mir. 386BSD Unser eigentliches Ziel war es, einen zwischenzeitlichen Abzug von 386BSD zu erstellen, um ein paar Probleme zu beseitigen, die das Patchkit-Verfahren nicht lösen konnte. Einige von Ihnen werden sich in dem Zusammenhang noch an die frühen Arbeitstitel 386BSD 0.5 oder 386BSD Interim erinnern. Jolitz, Bill 386BSD war das Betriebssystem von Bill Jolitz. Dieses litt bis zu diesem Zeitpunkt heftig unter fast einjähriger Vernachlässigung. Als das Patchkit mit jedem Tag anschwoll und unhandlicher wurde, waren wir einhellig der Meinung, es müsse etwas geschehen. Wir entschieden uns Bill Jolitz zu helfen, indem wir den übergangsweise bereinigten Abzug zur Verfügung stellten. Diese Pläne wurden unschön durchkreuzt als Bill Jolitz plötzlich seine Zustimmung zu diesem Projekt zurückzog, ohne einen Hinweis darauf, was stattdessen geschehen sollte. Greenman, David Walnut Creek CDROM Es hat nicht lange gedauert zu entscheiden, dass das Ziel es wert war, weiterverfolgt zu werden, selbst ohne Bills Unterstützung. Also haben wir den von David Greenman geprägten Namen &os; angenommen. Unsere anfänglichen Ziele setzten wir nach Rücksprache mit den damaligen Benutzern des Systems fest. Und als deutlich wurde, das Projekt würde möglicherweise Realität, nahm ich Kontakt mit Walnut Creek CDROM auf, mit einem Auge darauf, den Vertriebsweg für die vielen Missbegünstigten zu verbessern, die keinen einfachen Zugang zum Internet hatten. Walnut Creek CDROM unterstützte nicht nur die Idee des CD-ROM-Vertriebs, sondern stellte sogar dem Projekt einen Arbeitsrechner und eine schnelle Internetverbindung zur Verfügung. Ohne den beispiellosen Glauben von Walnut Creek CDROM in ein zu der Zeit absolut unbekanntes Projekt, gäbe es &os; in der heutigen Form wohl nicht. 4.3BSD-Lite Net/2 U.C. Berkeley 386BSD Free Software Foundation Die erste auf CD-ROM (und netzweit) verfügbare Veröffentlichung war &os; 1.0 im Dezember 1993. Diese basierte auf dem Band der 4.3BSD-Lite (Net/2) der Universität von Kalifornien in Berkeley. Viele Teile stammten aus 386BSD und von der Free Software Foundation. Gemessen am ersten Angebot, war das ein ziemlicher Erfolg und wir ließen dem das extrem erfolgreiche &os; 1.1 im Mai 1994 folgen. Novell U.C. Berkeley Net/2 AT&T Zu dieser Zeit formierten sich unerwartete Gewitterwolken am Horizont, als Novell und die Universität von Kalifornien in Berkeley (UCB) ihren langen Rechtsstreit über den rechtlichen Status des Berkeley Net/2-Bandes mit einem Vergleich beilegten. Eine Bedingung dieser Einigung war es, dass die UCB große Teile des Net/2-Quellcodes als belastet zugestehen musste, und dass diese Besitz von Novell sind, welches den Code selbst einige Zeit vorher von AT&T bezogen hatte. Im Gegenzug bekam die UCB den Segen von Novell, dass sich das 4.4BSD-Lite-Release bei seiner endgültigen Veröffentlichung als unbelastet bezeichnen darf. Alle Net/2-Benutzer sollten auf das neue Release wechseln. Das betraf auch &os;. Dem Projekt wurde eine Frist bis Ende Juli 1994 eingeräumt, das auf Net/2-basierende Produkt nicht mehr zu vertreiben. Unter den Bedingungen dieser Übereinkunft war es dem Projekt noch erlaubt ein letztes Release vor diesem festgesetzten Zeitpunkt herauszugeben. Das war &os; 1.1.5.1. &os; machte sich dann an die beschwerliche Aufgabe, sich Stück für Stück, aus einem neuen und ziemlich unvollständigen Satz von 4.4BSD-Lite-Teilen, wieder aufzubauen. Die Lite-Veröffentlichungen waren deswegen leicht, weil Berkeleys CSRG große Code-Teile, die für ein start- und lauffähiges System gebraucht wurden, aufgrund diverser rechtlicher Anforderungen entfernen musste und weil die 4.4-Portierung für Intel-Rechner extrem unvollständig war. Das Projekt hat bis November 1994 gebraucht diesen Übergang zu vollziehen, was dann zu dem im Netz veröffentlichten &os; 2.0 und zur CD-ROM-Version (im späten Dezember) führte. Obwohl &os; gerade die ersten Hürden genommen hatte, war dieses Release ein maßgeblicher Erfolg. Diesem folgte im Juni 1995 das robustere und einfacher zu installierende &os; 2.0.5. Im August 1996 veröffentlichten wir &os; 2.1.5. Es schien unter ISPs und der Wirtschaft beliebt genug zu sein, ein weiteres Release aus dem 2.1-STABLE-Zweig zu rechtfertigen. Das war &os; 2.1.7.1. Es wurde im Februar 1997 veröffentlicht und bildete das Ende des Hauptentwicklungszweiges 2.1-STABLE. Derzeit unterliegt dieser Zweig dem Wartungsmodus, das heißt, es werden nur noch Sicherheitsverbesserungen und die Beseitigung von kritischen Fehlern vorgenommen (RELENG_2_1_0). &os; 2.2 entsprang dem Hauptentwicklungszweig (-CURRENT) im November 1996 als RELENG_2_2-Zweig und das erste komplette Release (2.2.1) wurde im April 1997 herausgegeben. Weitere Veröffentlichungen des 2.2-Zweiges gab es im Sommer und Herbst 1997. Das letzte Release des 2.2-Zweiges bildete die Version 2.2.8, die im November 1998 erschien. Das erste offizielle 3.0-Release erschien im Oktober 1998 und läutete das Endes des 2.2-Zweiges ein. Am 20. Januar 1999 teilte sich der Quellbaum in die Zweige 4.0-CURRENT und 3.X-STABLE. Auf dem 3.X-STABLE-Zweig wurden folgende Releases erstellt: 3.1 am 15. Februar 1999, 3.2 am 15. Mai 1999, 3.3 am 16. September 1999, 3.4 am 20. Dezember 1999 und 3.5 am 24. Juni 2000. Letzterem folgte ein paar Tage später das Release 3.5.1, welches einige akute Sicherheitslöcher von Kerberos stopfte und die letzte Veröffentlichung des 3.X-Zweiges darstellte. Eine weitere Aufspaltung, aus dem der 4.X-STABLE-Zweig hervorging, erfolgte am 13. März 2000. Bisher gab es mehrere Veröffentlichungen aus diesem Zweig: 4.0-RELEASE erschien im März 2000. Das letzte Release, 4.11-RELEASE, erschien im Januar 2005. Das lang erwartete 5.0-RELEASE wurde am 19. Januar 2003 veröffentlicht. Nach nahezu drei Jahren Entwicklungszeit brachte dieses Release die Unterstützung für Mehrprozessor-Systeme sowie für Multithreading. Mit diesem Release lief &os; erstmalig auf den Plattformen &ultrasparc; und ia64. Im Juni 2003 folgte 5.1-RELEASE. Das letzte 5.X-Release aus dem CURRENT-Zweig war 5.2.1-RELEASE, das im Februar 2004 veröffentlicht wurde. Der Zweig RELENG_5 wurde im August 2004 erzeugt. Als erstes Release dieses Zweiges wurde 5.3-RELEASE veröffentlicht, bei dem es sich gleichzeitig auch um das erste 5-STABLE-Release handelte. Das aktuelle 5.5-RELEASE (dem keine RELENG_5-Versionen mehr folgen werden) erschien im Mai 2006. Der Zweig RELENG_6 wurde im Juli 2005 erzeugt. 6.0-RELEASE, das erste Release des 6.X-Zweiges, wurde im November 2005 veröffentlicht. Das aktuelle &rel2.current;-RELEASE (dem keine weiteren RELENG_6-Versionen folgen werden) erschien im November 2008. Der Zweig RELENG_7 wurde im Oktober 2007 erzeugt. 7.0-RELEASE, das erste Release des 7.X-Zweiges, wurde im Februar 2008 veröffentlicht. Das aktuelle &rel.current;-RELEASE (dem weitere RELENG_7-Versionen folgen werden) erschien im Januar 2009. Zurzeit werden Projekte mit langem Entwicklungshorizont im Zweig 8.X-CURRENT verfolgt, Schnappschüsse von 8.X auf CD-ROM (und natürlich im Netz) werden bei fortlaufender Entwicklung auf dem Snapshot-Server zur Verfügung gestellt. Jordan Hubbard Beigesteuert von Ziele des &os; Projects &os; Project Ziele Das &os; Project stellt Software her, die ohne Einschränkungen für beliebige Zwecke eingesetzt werden kann. Viele von uns haben beträchtlich in Quellcode und Projekt investiert und hätten sicher nichts dagegen, hin und wieder ein wenig finanziellen Ausgleich dafür zu bekommen. Aber in keinem Fall bestehen wir darauf. Wir glauben unsere erste und wichtigste Mission ist es, Software für jeden Interessierten und zu jedem Zweck zur Verfügung zu stellen, damit die Software größtmögliche Verbreitung erlangt und größtmöglichen Nutzen stiftet. Das ist, glaube ich, eines der grundlegenden Ziele freier Software, welche wir mit größter Begeisterung unterstützen. GNU General Public License (GPL) GNU Lesser General Public License (LGPL) BSD Copyright Der Code in unserem Quellbaum, der unter die General Public License (GPL) oder die Library General Public License (LGPL) fällt, stellt geringfügig mehr Bedingungen. Das aber vielmehr im Sinne von eingefordertem Zugriff, als das übliche Gegenteil der Beschränkungen. Aufgrund zusätzlicher Abhängigkeiten, die sich durch die Verwendung von GPL-Software bei kommerziellem Gebrauch ergeben, bevorzugen wir daher Software unter dem transparenteren BSD-Copyright, wo immer es angebracht ist. Satoshi Asami Beigesteuert von Das Entwicklungsmodell von &os; &os; Project Entwicklungsmodell Die Entwicklung von &os; ist ein offener und vielseitiger Prozess. &os; besteht aus Beisteuerungen von Hunderten Leuten rund um die Welt, wie Sie aus der Liste der Beitragenden ersehen können. Die vielen Entwickler können aufgrund der Entwicklungs-Infrastruktur von &os; über das Internet zusammenarbeiten. Wir suchen ständig nach neuen Entwicklern, Ideen und jenen, die sich in das Projekt tiefer einbringen wollen. Nehmen Sie einfach auf der Mailingliste &a.hackers; Kontakt mit uns auf. Die Mailingliste &a.announce; steht für wichtige Ankündigungen, die alle &os;-Benutzer betreffen, zur Verfügung. Unabhängig davon ob Sie alleine oder mit anderen eng zusammen arbeiten, enthält die folgende Aufstellung nützliche Informationen über das &os; Project und dessen Entwicklungsabläufe. CVS- und SVN-Repositories CVS Repository Concurrent-Versions-System CVS SVN Repository Subversion SVN Der Hauptquellbaum von &os; wurde über viele Jahre ausschließlich mit CVS gepflegt, einem frei erhältlichen Versionskontrollsystem, welches mit &os; geliefert wird. Im Juni 2008 begann das &os; Project mit dem Umstieg auf SVN (Subversion). Dieser Schritt wurde notwendig, weil CVS aufgrund des rapide wachsenden Quellcodebaumes und dem Umfang der bereits gespeichterten Revisisionsinformationen an seine Grenzen zu stoßen begann. Während das Hauptrepository nun SVN verwendet, hat sich auf der Client-Seite nichts geändert. Werkzeuge wie CVSup und csup, die auf der alten CVS-Infrastruktur aufbauen, funktionieren weiterhin, weil alle Änderungen, die im SVN-Repository erfolgen, in das CVS-Repository portiert werden. Im Moment wird nur src-Quellcodebaum über SVN verwaltet. Die Dokumentation, die Webseiten sowie die Ports befinden sich weiterhin in einem CVS-Repository. Das Haupt-CVS-Repository läuft auf einer Maschine in Santa Clara, Kalifornien, USA. Von dort wird es auf zahlreiche Server in aller Welt gespiegelt. Der SVN-Quellbaum, der die Zweige -CURRENT und -STABLE enthält, kann so einfach auf Ihr eigenes System gespiegelt werden. Näheres dazu können Sie im Handbuch unter Synchronisation der Quellen in Erfahrung bringen. Die Committer-Liste Committer Die Committer sind Personen mit Schreibzugriff auf den CVS-Quellbaum (der Begriff Committer stammt vom &man.cvs.1;-Befehl commit, der zum Einspeisen von Änderungen ins Repository gebraucht wird). Der beste Weg, Vorschläge zur Prüfung durch die Mitglieder der Committer-Liste einzureichen, bietet der Befehl &man.send-pr.1;. Sollte es unerwartete Probleme mit diesem Verfahren geben, besteht immer noch die Möglichkeit eine E-Mail an die Liste &a.committers; zu schicken. Das FreeeBSD-Core-Team Core-Team Würde man das &os; Project mit einem Unternehmen vergleichen, so wäre das &os;-Core-Team das Gegenstück zum Vorstand. Die Hauptaufgabe des Core-Teams ist es, das Projekt als Ganzes in gesunder Verfassung zu halten und die weitere Entwicklung in die richtige Bahn zu lenken. Das Anwerben leidenschaftlicher und verantwortungsbewusster Entwickler ist eine Aufgabe des Core-Team, genauso wie die Rekrutierung neuer Mitglieder für das Core-Team, im Falle, dass Altmitglieder aus dem Projekt aussteigen. Das derzeitige Core-Team wurde im Juli 2008 aus einem Kreis kandidierender Committer gewählt. Wahlen werden alle zwei Jahre abgehalten. Einige Core-Team-Mitglieder haben auch spezielle Verantwortungsbereiche. Das bedeutet, sie haben sich darauf festgelegt, sicherzustellen, dass ein größerer Teil des Systems so funktioniert wie ausgewiesen. Eine vollständige Liste an &os; beteiligter Entwickler und ihrer Verantwortungsbereiche kann in der Liste der Beitragenden eingesehen werden. Die Mehrzahl der Mitglieder des Core-Teams sind Freiwillige in Bezug auf die &os;-Entwicklung und profitieren nicht finanziell vom Projekt. Daher sollte Verpflichtung nicht als garantierter Support fehlinterpretiert werden. Der oben angeführte Vergleich mit einem Vorstand hinkt und es wäre angebrachter zu erwähnen, dass diese Leute – wider besseres Wissen – ihr eigenes Leben für &os; aufgegeben haben! Weitere Beitragende Beitragende Die größte Entwicklergruppe sind nicht zuletzt die Anwender selbst, die Rückmeldungen und Fehlerbehebungen in einem anhaltend hohen Maße an uns senden. Der bevorzugte Weg an dem weniger zentralisierten Bereich der &os;-Entwicklung teilzuhaben, ist die Möglichkeit sich bei der Liste &a.hackers; anzumelden. Weitere Informationen über die verschiedenen &os;-Mailinglisten erhalten Sie in . Die Liste der zu &os; Beitragenden ist eine lange und wachsende. Also warum nicht selbst dort stehen, indem Sie gleich persönlich etwas zu &os; beitragen? Quellcode ist nicht der einzige Weg, etwas zum Projekt beizusteuern. Eine genauere Übersicht über offene Aufgaben finden Sie auf der &os;-Web-Site. Zusammengefasst bildet unser Entwicklungsmodell einen losen Verbund konzentrischer Kreise. Das zentralisierte Modell ist auf die Bedürfnisse der Anwender zugeschnitten, mit der einfachen Möglichkeit eine zentrale Code-Basis zu verfolgen und möglichen neuen Beitragenden nicht das Leben zu erschweren! Unser Ziel ist es, ein stabiles Betriebssystem mit einer großen Zahl passender Programme zu bieten, die der Anwender leicht installieren und anwenden kann. Und dieses Modell funktioniert für diese Aufgabe ziemlich gut. Das Einzige was wir von möglichen neuen Mitgliedern fordern, ist die gleiche Hingabe, mit der die jetzigen Mitglieder am dauerhaften Erfolg arbeiten! Das aktuelle &os;-Release NetBSD OpenBSD 386BSD Free Software Foundation U.C. Berkeley Computer Systems Research Group (CSRG) &os; ist ein (mit vollem Quellcode und ein frei erhältliches) auf 4.4BSD-Lite-basierendes Release für Intel &i386;, &i486;, &pentium;, &pentium; Pro, &celeron;, &pentium; II, &pentium; III, &pentium; 4 (oder ein dazu kompatibler Prozessor), &xeon;, DEC Alpha und Sun &ultrasparc; Systeme. Es stützt sich zum größten Teil auf Software der Computer Systems Research Group (CSRG) der Universität von Kalifornien in Berkeley mit einigen Verbesserungen aus NetBSD, OpenBSD, 386BSD und der Free Software Foundation. Seit unserem &os; 2.0 von Ende 1994 hat sich Leistung, Funktionsvielfalt und Stabilität dramatisch verbessert. Die größte Änderung erfuhr das virtuelle Speichermanagement durch eine Kopplung von virtuellem Speicher und dem Buffer-Cache, das nicht nur die Leistung steigert, sondern auch den Hauptspeicherverbrauch reduziert und ein 5 MB-System zu einem nutzbaren Minimal-System verhilft. Weitere Verbesserungen sind volle NIS-Client- und Server-Unterstützung, T/TCP, Dial-On-Demand-PPP, integriertes DHCP, ein verbessertes SCSI-Subsystem, ISDN-Support, Unterstützung für ATM-, FDDI-, Fast- und Gigabit-Ethernet-Karten (1000 Mbit), verbesserter Support der neusten Adaptec-Controller und tausende Fehlerkorrekturen. Zusätzlich zur Standard-Distribution bietet &os; eine Sammlung von portierter Software mit tausenden begehrten Programmen. Zum Verfassungszeitpunkt waren über &os.numports; Anwendungen in der Ports-Sammlung! Das Spektrum der Ports-Sammlung reicht von HTTP-Servern über Spiele, Programmiersprachen, Editoren und so ziemlich allem dazwischen. Die gesamte Ports-Sammlung benötigt &ports.size; an Speicherplatz, wobei jeder Port anhand eines Deltas zu den Quellen angegeben wird. Das macht es für uns erheblich leichter, Ports zu aktualisieren und es verringert den Plattenbedarf im Vergleich zur älteren 1.0-Port-Sammlung. Um ein Port zu übersetzen, müssen Sie einfach ins Verzeichnis des Programms wechseln und ein make install absetzen. Den Rest erledigt das System. Die originalen Quellen jedes zu installierenden Port werden dynamisch von CD-ROM oder einem FTP-Server bezogen. Es reicht also für genügend Plattenplatz zu sorgen, um die gewünschten Ports zu erstellen. Allen, die Ports nicht selbst kompilieren wollen: Es gibt zu fast jedem Port ein vorkompiliertes Paket, das einfach mit dem Befehl (pkg_add) installiert wird. Pakete und Ports werden in beschrieben. Eine Reihe von weiteren Dokumenten, die sich als hilfreich bei der Installation oder dem Arbeiten mit &os; erweisen könnten, liegen auf neueren &os;-Systemen im Verzeichnis /usr/share/doc. Die lokal installierten Anleitungen lassen sich mit jedem HTML-fähigen Browser unter folgenden Adressen betrachten: Das &os;-Handbuch /usr/share/doc/handbook/index.html Die &os;-FAQ /usr/share/doc/faq/index.html Es besteht auch die Möglichkeit, sich die jeweils aktuellste Version der Referenzdokumente unter anzusehen. diff --git a/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml b/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml index fe3a888dcb..676926dd75 100644 --- a/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/jails/chapter.sgml @@ -1,1085 +1,1090 @@ Matteo Riondato Beigetragen von Oliver Peter Übersetzt von Dirk Arlt Johann Kois Jails jails Übersicht Dieses Kapitel erklärt, was &os;-Jails sind und wie man sie einsetzt. Jails, manchmal als Ersatz für chroot-Umgebungen bezeichnet, sind ein sehr mächtiges Werkzeug für Systemadministratoren, jedoch kann deren grundlegende Verwendung auch für fortgeschrittene Anwender nützlich sein. Nachdem Sie dieses Kapitel gelesen haben, werden Sie Wissen, was eine Jail ist und welche Verwendungszwecke es dafür unter &os; gibt. Wissen, wie man eine Jail erstellt, startet und und anhält. Die Grundlagen der Jail-Administration (sowohl innerhalb als auch ausserhalb des Jails) kennen. Weitere nützliche Informationen über Jails sind beispielsweise in folgenden Quellen zu finden: Der &man.jail.8; Manualpage. Diese umfassende Referenz beschreibt, wie man unter &os; eine Jail startet, anhält und kontrolliert. Den Mailinglisten und deren Archive. Die Archive der Mailingliste &a.questions; und anderen Mailinglisten, welche vom &a.mailman.lists; bereitgestellt werden, beinhalten bereits umfangreiche Informationen zu Jails. Daher ist es sinnvoll, bei Problemen mit Jails zuerst die Archive der Mailinglisten zu durchsuchen, bevor Sie eine neue Anfrage auf der Mailingliste &a.questions.name; stellen. Jails - Definitionen Um die für den Einsatz von Jails benötigten FreeBSD-Funktionen, deren Interna sowie die Art und Weise, mit der diese mit anderen Teilen des Betriebssystems interagieren, zu erläutern, werden in diesem Kapitel folgende Definitionen verwendet: &man.chroot.2; (-Befehl) Ein &os;-Systemaufruf, der das root-Verzeichnis eines Prozesses und dessen Abkömmlinge verändert. &man.chroot.2; (-Umgebung) Die Umgebung eines Prozesses, der in einem chroot läuft. Diese beinhaltet Ressourcen, wie zum Beispiel sichtbare Abschnitte des Dateisystems, verfügbare Benutzer- und Gruppenkennungen, Netzwerkschnittstellen und weitere IPC-Mechanismen und so weiter. &man.jail.8; (-Befehl) Das Systemadministrationswerkzeug, welches es erlaubt, Prozesse innerhalb der Jail-Umgebung zu starten. Host (-Benutzer, -Prozess, -System) Das verwaltende System einer Jail-Umgebung. Das Host-System hat Zugriff auf alle verfügbaren Hardwareressourcen und kann sowohl innerhalb als auch ausserhalb der Jail-Umgebung Prozesse steuern. Einer der wichtigsten Unterschiede des Host-System einer Jails ist, dass die Einschränkungen, welche für die Superuser-Prozesse innerhalb eines Jails gelten, nicht für die Prozesse des Host-Systems gelten. Gast (-Benutzer, -Prozess, -System) Ein Prozess, ein Benutzer oder eine andere Instanz, deren Zugriff durch eine &os;-Jail eingeschränkt ist. Einführung Da die Systemadministration oft eine schwierige Aufgabe ist, wurden viele mächtige Werkzeuge entwickelt, die Administratoren bei Installation, Konfiguration und Wartung ihrer Systeme unterstützen sollen. Eine wichtige Aufgabe eines Administrators ist es, Systeme so abzusichern, dass es im regulären Betrieb zu keinen Sicherheitsverstößen kommt. Eines der Werkzeuge, mit dem die Sicherheit eines &os;-Systems verbessert werden kann, sind Jails. Jails wurden schon in &os; 4.X von &a.phk; eingeführt, wurden jedoch mit &os; 5.X stark verbessert, sodass sie inzwischen zu einem mächtigen und flexiblen Subsystem herangereift sind. Trotzdem geht die Entwicklung nach wie vor weiter. Wichtige Ziele sind derzeit: Bessere Zweckmäßigkeit, Leistung, Ausfallsicherheit und allgemeine Sicherheit. Was ist eine Jail? BSD-ähnliche Betriebssysteme besitzen seit den Zeiten von 4.2BSD &man.chroot.2;. Das Werkzeug &man.chroot.2; kann dazu benutzt werden, das root-Verzeichnis einer Reihe von Prozessen zu ändern, um so eine seperate sichere Umgebung (abgeschnitten vom Rest des Systems) zu schaffen. Prozesse, die in einer chroot-Umgebung erstellt wurden, können nicht auf Dateien oder Ressourcen zugreifen, die sich ausserhalb der Umgebung befinden. Dadurch ist es einem kompromittierten Dienst nicht möglich, das gesamte System zu kompromittieren. &man.chroot.8; eignet sich für einfache Aufgaben, die keine flexiblen, komplexen oder fortgeschrittenen Funktionen benötigen. Obwohl seit der Entwicklung des chroot-Konzepts zahlreiche Sicherheitslöcher geschlossen wurden, die es einem Prozess erlauben konnten, aus einer Jail auszubrechen, war seit langer Zeit klar, dass &man.chroot.2; nicht die ideale Lösung ist, einen Dienst sicher zu machen. Dies ist einer der Hauptgründe, warum Jails entwickelt wurden. Jails setzen auf dem traditionellen &man.chroot.2;-Konzept auf und verbessern es auf unterschiedlichste Art und Weise. In einer traditionellen &man.chroot.2;-Umgebung sind Prozesse auf den Bereich des Dateisystems beschränkt, auf den sie zugreifen können. Der Rest der Systemressourcen (wie zum Beispiel eine Reihe von Systembenutzern, die laufenden Prozesse oder das Netzwerk-Subsystem) teilen sich die chroot-Prozesse mit dem Host-System. Jails dehnen dieses Modell nicht nur auf die Virtualisierung des Zugriffs auf das Dateisystem, sondern auch auf eine Reihe von Benutzern, das Netzwerk-Subsystem des &os;-Kernels und weitere Bereiche aus. Eine ausführlichere Übersicht der ausgefeilten Bedienelemente zur Konfiguration einer Jail-Umgebung finden Sie im Abschnitt des Handbuchs. Eine Jail zeichnet sich durch folgende Merkmale aus: Einen Unterverzeichnisbaum, der die Jail enthält. Einem Prozess, der innerhalb der Jail läft, ist es nicht mehr möglich, aus diesem auszubrechen. Von der traditionellen &man.chroot.2;-Umgebung bekannte Sicherheitsprobleme existieren bei &os;-Jails nicht mehr. Einen Hostname, der innerhalb der Jail verwendet wird. Jails werden vor allem dazu verwendet, Netzwerkdienste anzubieten, daher ist es für Systemadministratoren von großem Nutzen, dass jede Jail einen beschreibenden Hostname haben kann. Eine IP Adresse, die der Jail zugewiesen wird und nicht verändert werden kann, solange das Jail läft. Die IP-Adresse einer Jails ist üblicherweise ein Adress-Alias auf eine existierende Netzwerkschnittstelle. Dies ist jedoch nicht zwingend erforderlich. Einen Befehl (genauer den Pfad einer ausführbaren Datei) der innerhalb der Jail ausgefürht werden soll. Dieser Pfad wird relativ zum root-Verzeichnis einer Jail-Umgebung angegeben und kann sehr unterschiedlich aussehen (je nachdem, wie die Jail-Umgebung konfiguriert wurde). Unabhängig davon können Jails eine Reihe eigener Benutzer und einen eigenen Benutzer root haben. Selbstverständlich sind die Rechte des Benutzers root nur auf die Jail-Umgebung beschränkt. Aus der Sicht des Host-Systems ist der Benutzer root der Jail-Umgebung kein allmächtiger Benutzer, da der Benutzer root der Jail-Umgebung nicht dazu berechtigt ist, kritische Operationen am System ausserhalb der angebundenen &man.jail.8;-Umgebung durchzuführen. Weitere Informationen über die Einsatzmöglichkeiten und Beschränkungen des Benutzers root werden im Abschnitt des Handbuchs besprochen. Einrichtung und Verwaltung von Jails Einige Administratoren unterscheiden zwei verschiedene Jail-Arten: Komplette Jails, die ein echtes &os; darstellen und Jails für einen bestimmten Dienst, die nur einer bestimmten Anwendung oder einem Dienst (der möglicherweise mit besonderen Privilegien laufen soll) gewidmet sind. Dies ist aber nur eine konzeptuelle Unterscheidung, die Einrichtung einer Jail bleibt davon gänzlich unberührt. &prompt.root; setenv D /hier/ist/die/jail &prompt.root; mkdir -p $D &prompt.root; cd /usr/src -&prompt.root; make world DESTDIR=$D +&prompt.root; make buildworld +&prompt.root; make installworld DESTDIR=$D &prompt.root; cd etc/ Dieser Schritt ist seit &os; 6.0 nicht mehr notwendig. &prompt.root; make distribution DESTDIR=$D &prompt.root; mount -t devfs devfs $D/dev Das Festlegen des Installationsorts für das Jail eignet sich am besten als Startpunkt. Hier wird sich die Jail innerhalb des Host-Dateisystems befinden. Eine gute Möglichkeit wäre etwa /usr/jail/name_der_jail, wobei name_der_jail den Hostname darstellt, über den die Jail identifiziert werden soll. Das Dateisystem unterhalb von /usr/ stellt normalerweise aussreichend Platz für eine Jail zur Verfügung (bedenken Sie, dass eine komplette Jail ein Replikat einer jeden Datei der Standardinstallation des &os;-Basissystems enthält. - + + Wenn Sie bereits ihre Systemanwendungen mittels + make world oder make buildworld + neu erstellt haben, können Sie diesen Schritt überspringen + und die Systemanwendungen in die neue Jail installieren. + + + Dieser Befehl wird den Verzeichnisbaum mit allen notwendigen Binärdateien, Bibliotheken, Manualpages - usw. an dem für die Jail gewählten physikalischen - Ort erstellen. Dies geschieht im typischen &os;-Stil — - Zuerst wird alles gebaut/kompiliert und anschließend - in das Zielverzeichnis installiert. + usw. erstellen. Der distribution-Befehl lässt make alle benötigten Konfigurationsdateien installieren, es werden also alle installierbaren Dateien aus /usr/src/etc/ in das Verzeichnis /etc der Jail installiert (also nach $D/etc/). Das Einhängen des &man.devfs.8;-Dateisystems innerhalb der Jail ist nicht unbedingt notwendig. Allerdings benötigt fast jede Anwendung Zugriff auf wenigstens ein Gerät. Es ist daher sehr wichtig, den Zugriff auf Devices aus der Jail heraus zu kontrollieren, da unsaubere Einstellungen es einem Angreifer erlauben könnten, in das System einzudringen. Die Kontrolle über &man.devfs.8; erfolgt durch die in den Manualpages &man.devfs.8; und &man.devfs.conf.5; beschriebenen Regeln. Ist eine Jail einmal erst erstellt, kann sie durch &man.jail.8; gestartet werden. &man.jail.8; benötigt zwingend mindestens vier Argumente, die im Abschnitt des Handbuchs beschrieben sind. Weitere Argumente sind möglich, um beispielsweise die Jail mit den Berechtigungen eines bestimmten Benutzers laufen zu lassen. Das Argument hängt vom Typ der Jail ab; für ein virtuelles System ist /etc/rc eine gute Wahl, da dies dem Startvorgang eines echten &os;-Systems entspricht. Bei einer Service-Jail hängt dieses von der Art des Dienstes ab, der in der Jail laufen soll. Jails werden häufig mit dem Betriebssystem gestartet, da der rc-Mechanismus von &os; dafür eine einfach zu realisierende Möglichkeit bietet. Eine Liste der Jails, die mit dem Betriebssystem gestartet werden sollen, wird in die Datei &man.rc.conf.5; geschrieben: jail_enable="YES" # Set to NO to disable starting of any jails jail_list="www" # Space separated list of names of jails Für jede Jail in der jail_list sollten in &man.rc.conf.5; einige Einstellungen vorgenommen werden: jail_www_rootdir="/usr/jail/www" # jail's root directory jail_www_hostname="www.example.org" # jail's hostname jail_www_ip="192.168.0.10" # jail's IP address jail_www_devfs_enable="YES" # mount devfs in the jail jail_www_devfs_ruleset="www_ruleset" # devfs ruleset to apply to jail Beim Start einer in &man.rc.conf.5; konfigurierten Jail wird das /etc/rc-Skript der Jail (das "annimmt", dass es sich in einem kompletten System befindet) aufgerufen. Für Service-Jails sollten die Startskripte der Jail durch das Setzen der Option jail_jailname_exec_start entsprechend angepasst werden. Eine vollständige Liste der Optionen findet sich in der Manualpage zu &man.rc.conf.5;. Das /etc/rc.d/jail-Skript kann zum manuellen Starten und Stoppen der Jail genutzt werden, wenn ein Eintrag in rc.conf angelegt wurde: &prompt.root; /etc/rc.d/jail start www &prompt.root; /etc/rc.d/jail stop www Es gibt momentan keinen sauberen Weg, eine &man.jail.8; zu stoppen. Dies liegt daran, dass die Kommandos zum sauberen Herunterfahren eines Systems innerhalb einer Jail nicht ausgeführt werden können. Der beste Weg eine Jail zu beenden ist es daher, innerhalb der Jail den folgenden Befehl auszuführen (alternativ können Sie auch &man.jexec.8; von außerhalb der Jail aufrufen): &prompt.root; sh /etc/rc.shutdown Weitere Informationen zu diesem Thema finden Sie in der Manualpage &man.jail.8;. Feinabstimmung und Administration Es gibt verschiedene Optionen, die für jede Jail gesetzt werden können und verschiedene Wege, ein &os;-Host-System mit Jails zu kombinieren. Dieser Abschnitt zeigt Ihnen: Einige zur Verfügung stehende Optionen zur Abstimmung des Verhaltens und der Sicherheitseinstellungen, die mit einer Jail-Installation ausgeführt werden können. Einige der Anwendungsprogramme für das Jail-Management, die über die &os; Ports-Sammlung verfügbar sind und genutzt werden können, um Jail-basierte Lösungen allumfassend umzusetzen. Systemwerkzeuge zur Feinabstimmung von Jails in &os; Die Feinabstimmung einer Jail-Konfiguration erfolgt zum Großteil durch das Setzen von &man.sysctl.8;-Variablen. Es gibt einen speziellen sysctl-Zweig, der als Basis für die Organisation aller relevanten Optionen dient: Die security.jail.*-Hierarchie der &os;-Kerneloptionen. Die folgende Liste enthält alle jail-bezogenen sysctls (inklusiver ihrer Voreinstellungen). Die Namen sollten selbsterklärend sein, für weitergehende Informationen lesen Sie bitte die Manualpages &man.jail.8; und &man.sysctl.8;. security.jail.set_hostname_allowed: 1 security.jail.socket_unixiproute_only: 1 security.jail.sysvipc_allowed: 0 security.jail.enforce_statfs: 2 security.jail.allow_raw_sockets: 0 security.jail.chflags_allowed: 0 security.jail.jailed: 0 Diese Variablen können vom Administrator des Host-Systems genutzt werden, um Beschränkungen hinzuzufügen oder aufzuheben, die dem Benutzer root als Vorgabe auferlegt sind. Beachten Sie, dass es einige Beschränkungen gibt, die nicht verändert werden können. Der Benutzer root darf innheralb der &man.jail.8; keine Dateisysteme mounten und unmounten. Ebenso ist es ihm untersagt, das &man.devfs.8;-Regelwerk zu laden oder zu entladen. Er darf weder Firewallregeln setzen, noch administrative Aufgaben erledigen, die Modifikationen am Kernel selbst erfordern (wie bespielsweise das Setzen des Securelevels des Kernel. Das &os;-Basissystem enthält einen Basissatz an Werkzeugen, um Informationen über aktive Jails zu erlangen und einer Jail administrative Befehle zuzuordnen. Die Befehle &man.jls.8; und &man.jexec.8; sind Teil des &os;-Basissystems und können für folgende Aufgaben verwendet werden: Das Anzeigen einer Liste der aktiven Jails und ihrer zugehörigen Jail Identifier (JID), ihrer IP-Addresse, ihres Hostnames und ihres Pfades. Das Herstellen einer Verbindung mit einer laufenden Jail, das Starten eines Befehls aus dem gastgebenen System heraus oder das Ausführen einer administrativen Aufgabe innerhalb der Jail selbst. Dies ist insbesondere dann nützlich, wenn der Benutzer root die Jail sauber herunterfahren möchte. &man.jexec.8; kann auch zum Starten einer Shell innerhalb der Jail genutzt werden, um adminstrative Aufgaben durchzuführen: &prompt.root; jexec 1 tcsh High-Level-Werkzeuge zur Jail-Administration in der &os; Ports-Sammlung Unter den zahlreichen Fremdwerkzeugen für die Administration von Jails sind die sysutils/jailutils die vollständigsten und brauchbarsten. Dabei handelt es sich um eine Sammlung kleiner Anwendungen, die das &man.jail.8;-Management vereinfachen. Weitere Informationen zu diesen Werkzeugen finden Sie auf den entsprechenden Internetseiten. Anwendung von Jails Daniel Gerzo Beigetragen von Service-Jails Dieser Abschnitt basiert auf einer von &a.simon; auf präsentierten Idee und einem aktualisierten Artikel von Ken Tom (locals@gmail.com). Er beschreibt, wie ein &os;-System durch Benutzung der &man.jail.8;-Funktion mit zusätzlichen Sicherheitsebenen ausgestattet werden kann. Es wird dabei angenommen, dass auf Ihrem &os;-System RELENG_6_0 oder neuer installiert ist und dass Sie die Informationen aus den vorangehenden Abschnitten gelesen und verstanden haben. Design Eines der Hauptprobleme bei Jails ist das Management ihres Upgrade-Prozesses. Dieser neigt dazu, problematisch zu sein, da jede Jail bei jedem Upgrade komplett neu gebaut werden muss. Das stellt normalerweise kein Problem dar, wenn es sich um eine einzelne Jail handelt, da der Upgrade-Prozess recht einfach ist. Verwenden Sie aber eine größere Anzahl von Jails, kann dieser Prozess sehr zeitaufwendig werden. Diese Konfiguration erfordert fortgeschrittene Kenntnisse im Umgang mit &os; sowie der Benutzung seiner Funktionen. Sollten die unten vorgestellten Schritte zu kompliziert wirken, wird empfohlen, sich einfachere Verfahren wie sysutils/ezjail anzusehen, da diese einfachere Methoden zur Administration von Jails verwenden und daher nicht so anspruchsvoll sind wie der hier beschriebene Aufbau. Diese Konfiguration basiert darauf, Jails so weit als möglich gemeinsam zu verwalten. Dies passiert auf sichere Art und Weise durch den Einsatz von &man.mount.nullfs.8;-Mounts (read-only). Dadurch werden Aktualisierungen erleichtert und das Verteilen von verschiedenen Diensten auf verschiedene Jails wird attraktiver. Außerdem bietet dieses Verfahren einen einfachen Weg, Jails hinzuzufügen, zu entfernen und zu aktualisieren. Beispiele für Dienste sind in diesem Zusammenhang: Ein HTTP-Server, ein DNS-Server, ein SMTP-Server und so weiter. Die Ziele des in diesem Abschnitt beschriebenen Aufbaus sind: Das Erstellen einer einfachen und gut verständlichen Struktur von Jails. Dies beinhaltet, nicht für jede Jail ein vollständiges installworld laufen lassen zu müssen. Es einfach zu machen, neue Jails zu erstellen oder alte zu entfernen. Es einfach zu machen, bestehende Jails zu aktualisieren. Es einfach zu machen, einen angepassten &os;-Zweig zu nutzen. Paranoid bezüglich Sicherheit zu sein und Angriffsmöglickeiten weitgehend zu reduzieren. Soviel Platz und Inodes wie möglich einzusparen. Wie bereits erwähnt, ist dieses Design stark darauf angewiesen, dass eine read-only-Hauptvorlage in jede Jail hinein gemountet wird (bekannt als nullfs), und dass jede Jail über wenigstens ein beschreibbares Gerät verfügt. Das Gerät kann hierbei eine separate physikalische Platte oder ein vnode unterstütztes &man.md.4;-Gerät sein. Im folgenden Beispiel wird ein nullfs-Mount genutzt, auf den nur Lesezugriff erlaubt ist. Das Layout des Dateisystems wird in der folgenden Liste beschrieben: Jede Jail wird unterhalb des /home/j-Verzeichnisses gemountet. /home/j/mroot ist die Vorlage für jede Jail und die nur lesbare Partition für alle Jails. Unterhalb von /home/j wird für jede Jail ein leeres Verzeichnis angelegt. Jede Jail bekommt ein /s-Verzeichnis, das zum read/write-Teilbereich des Systems verlinkt wird. Jede Jail bekommt ihr eigenes read/write-System, das auf /home/j/skel basiert. Jeder Jailbereich (genauer der read/write-Teilbereich jeder Jail) wird in /home/js erstellt. Es wird angenommen, dass die Jails sich unterhalb des /home Verzeichnisses befinden. Dieser Ort kann von Ihnen natürlich geändert werden. Allerdings müssen die Pfade in den folgenden Beispielen dann entsprechend angepasst werden. Erstellen der Vorlage Dieser Abschnitt beschreibt die Schritte, die zum Erstellen der Hauptvorlage (die den nur lesbaren Bereich für alle weiteren Jails darstellt) notwendig sind. Es ist immer eine gute Idee, &os; auf den aktuellen -RELEASE-Zweig zu aktualisieren. Lesen Sie das entsprechende Kapitel des Handbuchs für Informationen zu diesem Thema. Selbst wenn Sie auf eine Aktualisierung des Betriebssystems verzichten, müssen Sie dennoch ein buildworld durchführen, um fortfahren zu können. Außerdem müssen Sie das Paket sysutils/cpdup installiert sein. In diesem Beispiel wird &man.portsnap.8; verwendet, um die aktuelle &os; Ports-Sammlung herunterzuladen. Der Abschnitt Portsnap des Handbuchs beschreibt, wie Sie dieses Werkzeug effektiv einsetzen. Zuerst erstellen wir eine Verzeichnissstruktur für das read-only-Dateisystem, das die &os;-Binärdateien für unsere Jails enthalten wird. Anschließend wechseln wir in den &os;-Quellcodebaum und installieren das read-only-Dateisystem in die (Vorlage-)Jail. &prompt.root; mkdir /home/j /home/j/mroot &prompt.root; cd /usr/src &prompt.root; make installworld DESTDIR=/home/j/mroot Als nächstes bereiten wir die Ports-Sammlung fü die Jails vor und kopieren den &os; Quellcodebaum in die Jail, da dieser für mergemaster benötigt wird: &prompt.root; cd /home/j/mroot &prompt.root; mkdir usr/ports &prompt.root; portsnap -p /home/j/mroot/usr/ports fetch extract &prompt.root; cpdup /usr/src /home/j/mroot/usr/src Danach wird die Struktur für den read/write-Bereich des Systems erstellt: &prompt.root; mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles &prompt.root; mv etc /home/j/skel &prompt.root; mv usr/local /home/j/skel/usr-local &prompt.root; mv tmp /home/j/skel &prompt.root; mv var /home/j/skel &prompt.root; mv root /home/j/skel Nutzen Sie mergemaster, um fehlende Konfigurationsdateien zu installieren. Anschließend werden die von mergemaster erstellten Extra-Verzeichnisse entfernt: &prompt.root; mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i &prompt.root; cd /home/j/skel &prompt.root; rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev Nun wird das read/write-Dateisystem mit dem read-only-Dateisystem verlinkt. Bitte vergewissern Sie sich, dass die symbolischen Links an den korrekten s/ Positionen erstellt werden. Echte Verzeichnisse oder an falschen Positionen erstellte Verzeichnisse lassen die Installation fehlschlagen. &prompt.root; cd /home/j/mroot &prompt.root; mkdir s &prompt.root; ln -s s/etc etc &prompt.root; ln -s s/home home &prompt.root; ln -s s/root root &prompt.root; ln -s ../s/usr-local usr/local &prompt.root; ln -s ../s/usr-X11R6 usr/X11R6 &prompt.root; ln -s ../../s/distfiles usr/ports/distfiles &prompt.root; ln -s s/tmp tmp &prompt.root; ln -s s/var var Zuletzt erstellen Sie eine allgemeine /home/j/skel/etc/make.conf mit folgendem Inhalt: WRKDIRPREFIX?= /s/portbuild Ein gesetztes WRKDIRPREFIX erlaubt es, die &os;-Ports innerhalb jeder Jail zu kompilieren. Das Ports-Verzeichnis ist Teil des read-only System. Der angepasste Pfad des WRKDIRPREFIX macht es möglich, innerhalb des read/write-Bereichs der Jail Ports zu bauen. Jails erstellen Da nun eine komplette &os;-Jailvorlage vorliegt, sind wir nun in der Lage, Jails einrichten und in /etc/rc.conf zu konfigurieren. Dieses Beispiel zeigt das Erstellen von drei Jails: NS, MAIL und WWW. Fügen Sie die folgenden Zeilen in /etc/fstab ein, damit die read-only-Vorlage und der read/write-Bereich für alle Jails verfügbar sind: /home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0 Mit der Pass-Nummer 0 markierte Partitionen werden beim Booten des Systems nicht von &man.fsck.8; geprüft, mit 0 als Dump-Nummer markierte Partitonen werden von &man.dump.8; nicht gesichert. Wir wollen nicht, dass fsck unsere nullfs-Mounts prüft oder dass dump die nur lesbaren nullfs-Mounts unserer Jails sichert. Deshalb werden diese Bereiche in den letzten beiden Spalten der obenstehenden fstab mit 0 0 markiert. Konfigurieren Sie die Jails in /etc/rc.conf: jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" jail_ns_rootdir="/usr/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" jail_mail_rootdir="/usr/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" jail_www_rootdir="/usr/home/j/www" jail_www_devfs_enable="YES" Der Grund dafür, dass die Variablen jail_name_rootdir nach /usr/home statt nach /home zeigen, liegt darin, dass der physikalische Pfad des /home-Verzeichnisses unter &os; /usr/home lautet. Die Variable jail_name_rootdir darf im Pfad aber keinen symbolischen Link enthalten, weil das Jail ansonsten nicht gestartet werden kann. Verwenden Sie &man.realpath.1;, um den korrekten Wert für diese Variable zu bestimmen. Weitere Informationen finden Sie im Security Advisory &os;-SA-07:01.jail. Erstellen Sie die notwendigen Mountpunkte für die nur lesbaren Bereiche jeder Jail: &prompt.root; mkdir /home/j/ns /home/j/mail /home/j/www Installieren Sie die read/write-Vorlage in jede Jail. Benutzen Sie hierfür sysutils/cpdup, welches es erleichtert, eine korrekte Kopie jedes Verzeichnisses zu erstellen: &prompt.root; mkdir /home/js &prompt.root; cpdup /home/j/skel /home/js/ns &prompt.root; cpdup /home/j/skel /home/js/mail &prompt.root; cpdup /home/j/skel /home/js/www An dieser Stelle werden die Jails erstellt und fü den Betrieb vorbereitet. Zuerst mounten Sie die notwendigen Dateisysteme für jede Jail und starten diese dann mit dem Skript /etc/rc.d/jail: &prompt.root; mount -a &prompt.root; /etc/rc.d/jail start Die Jails sollten nun laufen. Um zu prüfen, ob sie korrekt gestartet wurden, verwenden Sie &man.jls.8;. Nach dem Aufruf dieses Befehls sollten Sie eine Ausgabe ähnlich der folgenden erhalten: &prompt.root; jls JID IP Address Hostname Path 3 192.168.3.17 ns.example.org /home/j/ns 2 192.168.3.18 mail.example.org /home/j/mail 1 62.123.43.14 www.example.org /home/j/www An diesem Punkt sollte es möglich sein, sich an jeder Jail anzumelden, Benutzer anzulegen und Dienste zu konfigurieren. Die Spalte JID gibt die Jail-Identifikationsnummer jeder laufenden Jail an. Nutzen Sie den folgenden Befehl, um administrative Aufgaben in der Jail mit der JID 3 durchzuführen: &prompt.root; jexec 3 tcsh Jails aktualisieren Mit der Zeit wird es notwendig sein, das System auf eine neuere Version von &os; zu aktualisieren. Zum einen aus Sicherheitsgründen, zum anderen, um neu eingeführte Funktionen nutzen zu können, die für die bestehenden Jails sinnvoll sind. Das Design dieses Aufbaus bietet einen einfachen Weg, bestehende Jails zu aktualisieren. Zudem reduziert es die Downtime, da die Jails erst im allerletzten Schritt gestoppt werden müssen. Außerdem bietet es die Möglichkeit, zu älteren Versionen zurückzukehren, falls irgendwelche Probleme auftreten. Im ersten Schritt wird das Host-System aktualisiert. Anschließend wird eine temporäre neue read-only Vorlage /home/j/mroot2 erstellt. &prompt.root; mkdir /home/j/mroot2 &prompt.root; cd /usr/src &prompt.root; make installworld DESTDIR=/home/j/mroot2 &prompt.root; cd /home/j/mroot2 &prompt.root; cpdup /usr/src usr/src &prompt.root; mkdir s Der installworld-Durchlauf erzeugt einige unnötige Verzeichnisse, die nun entfernt werden sollten: &prompt.root; chflags -R 0 var &prompt.root; rm -R etc var root usr/local tmp Erzeugen Sie neue symbolische Links für das Hauptdateisystem: &prompt.root; ln -s s/etc etc &prompt.root; ln -s s/root root &prompt.root; ln -s s/home home &prompt.root; ln -s ../s/usr-local usr/local &prompt.root; ln -s ../s/usr-X11R6 usr/X11R6 &prompt.root; ln -s s/tmp tmp &prompt.root; ln -s s/var var Nun ist es an der Zeit, die Jails zu stoppen: &prompt.root; /etc/rc.d/jail stop Unmounten des originalen Dateisystems: &prompt.root; umount /home/j/ns/s &prompt.root; umount /home/j/ns &prompt.root; umount /home/j/mail/s &prompt.root; umount /home/j/mail &prompt.root; umount /home/j/www/s &prompt.root; umount /home/j/www Die read/write-Systeme sind an das read-only System angehängt (/s), das daher zuerst ausgehängt werden muss. Verschieben Sie das alte read-only-Dateisystem und ersetzen Sie es durch das neue Dateisystem. Das alte Dateisystem kann so als Backup dienen, falls etwas schief geht. Die Namensgebung entspricht hier derjenigen bei der Erstellung eines neuen read-only-Dateisystems. Verschieben Sie die originale &os; Ports-Sammlung in das neue Dateisystem, um Platz und Inodes zu sparen: &prompt.root; cd /home/j &prompt.root; mv mroot mroot.20060601 &prompt.root; mv mroot2 mroot &prompt.root; mv mroot.20060601/usr/ports mroot/usr Nun ist die neue read-only-Vorlage fertig. Sie müssen daher nur noch die Dateisysteme erneut mounten und die Jails starten: &prompt.root; mount -a &prompt.root; /etc/rc.d/jail start Nutzen Sie &man.jls.8; um zu prüfen, ob die Jails korrekt gestartet wurden. Vergessen Sie nicht, innerhalb jeder Jail mergemaster laufen zu lassen. Die Konfigurationsdateien müssen (ebenso wie die rc.d-Skripten) aktualisiert werden. diff --git a/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml b/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml index 40b576ed53..97a9cd29d4 100644 --- a/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.sgml @@ -1,3725 +1,3725 @@ Jim Mock Restrukturiert und teilweise aktualisiert von Brian N. Handy Beigetragen von Rich Murphey Johann Kois Übersetzt von Linux-Binärkompatibilität Übersicht Linux-Binärkompatibilität Binärkompatibilität Linux FreeBSD bietet Binärkompatibilität zu verschiedenen anderen &unix; Betriebssystemen, darunter auch Linux. Nun könnten Sie sich fragen, warum FreeBSD in der Lage sein muss, Linux-Binärprogramme auszuführen? Die Antwort auf diese Frage ist sehr einfach. Viele Unternehmen und Entwickler programmieren bzw. entwickeln nur für Linux, da es das Neueste und Beste in der Computerwelt ist. Für uns FreeBSD-Anwender heißt dies, genau diese Unternehmen und Entwickler zu bitten, FreeBSD-Versionen ihrer Programme herauszubringen. Das Problem dabei ist nur, dass die meisten dieser Firmen trotzdem nicht erkennen, wie viele zusätzliche Anwender ihre Produkte benutzen würden, wenn es auch FreeBSD-Versionen gäbe, und daher weiterhin ausschließlich für Linux entwickeln. Was also kann ein FreeBSD-Anwender tun? Genau an diesem Punkt kommt die Linux- Binärkompatibilität ins Spiel. Um es auf den Punkt zu bringen, genau diese Kompatibilität erlaubt es FreeBSD-Anwendern, etwa 90 % aller Linux-Anwendungen ohne Code-Änderungen zu verwenden. Dies schließt solche Anwendungen wie &staroffice;, Open Office, die Linux-Versionen von &netscape;, &adobe; &acrobat;, &realplayer;, VMWare , &oracle;, &wordperfect;, Doom, Quake und viele andere ein. Es wird sogar berichtet, dass diese Linux-Anwendungen in manchen Fällen unter FreeBSD eine bessere Leistung als unter Linux aufweisen. Allerdings gibt es nach wie vor einige Linux-spezifische Betriebssystem-Eigenschaften, die unter FreeBSD nicht unterstützt werden. Linux-Anwendungen, die &i386;-spezifische Aufrufe (wie die Aktivierung des virtuellen 8086-Modus) verwenden, funktionieren unter FreeBSD leider nicht. Nach dem Lesen dieses Kapitels werden Sie wissen, wie Sie die Linux-Binärkompatibilität installieren bzw. aktivieren. Wissen, wie man zusätzliche Linux-Systembibliotheken unter FreeBSD installiert. Linux-Anwendungen unter FreeBSD installieren können. Wissen, wie die Linux-Binärkompatibilität unter FreeBSD verwirklicht wurde. Bevor Sie dieses Kapitel lesen, sollten Sie wissen, wie man Software Dritter installiert (). Installation KLD (kernel loadable object) Die Linux-Binärkompatibilität ist per Voreinstellung nicht aktiviert. Der einfachste Weg, dies zu tun, ist das Linux KLD (Kernel LoaDable object) zu laden. Dies erreichen Sie durch die Eingabe des folgenden Befehls: &prompt.root; kldload linux Wollen Sie die Linux-Binärkompatibilität dauerhaft aktivieren, sollten Sie die folgende Zeile in /etc/rc.conf einfügen: linux_enable="YES" Der &man.kldstat.8;-Befehl kann benutzt werden, um festzustellen, ob KLD geladen wurde: &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko Kerneloptionen COMPAT_LINUX Wenn Sie das KLD nicht laden können oder wollen, besteht auch die Möglichkeit, die Linux-Binärkompatibiltät statisch in den Kernel einzubinden. Dazu fügen Sie Ihrer Kernelkonfigurationsdatei den Eintrag options COMPAT_LINUX hinzu. Anschließend installieren Sie Ihren neuen Kernel wie in beschrieben. Linux-Laufzeitbibliotheken installieren Linux Linux-Laufzeitbibliotheken installieren Dies kann auf zwei Arten geschehen, entweder über den linux_base-Port, - oder durch manuelle Installation der Bibliotheken - . + oder durch manuelle Installation der Bibliotheken . Installation unter Verwendung des linux_base-Ports Ports-Sammlung Dies ist die einfachste Methode, um die Laufzeitbibliotheken zu installieren. Sie funktioniert genauso wie die Installation eines beliebigen anderen Ports aus der Ports-Sammlung. Dazu machen Sie einfach folgendes: &prompt.root; cd /usr/ports/emulators/linux_base-fc4 &prompt.root; make install distclean Sie sollten nun über eine funktionierende Linux-Binärkompatibilität verfügen. Einige Programme könnten sich zwar über falsche Unterversionsnummern der Systembibliotheken beschweren, dies ist im Allgemeinen aber kein Problem. Unter Umständen gibt es mehrere Versionen des Ports emulators/linux_base. Die Ports entsprechen unterschiedlichen Versionen verschiedener Linux-Distributionen Sie sollten den Port installieren, der am besten die Anforderungen der Linux-Anwendung erfüllt. Manuelle Installation der Bibliotheken Wenn Sie die Ports-Sammlung nicht installiert haben, können Sie die Bibliotheken auch manuell installieren. Dazu brauchen Sie die jeweiligen Linux-Systembibliotheken, die das zu installierende Programm verwendet sowie den Laufzeit-Linker. Zusätzlich müssen Sie auf Ihrem FreeBSD-System einen virtuellen Verzeichnisbaum für die Linux-Bibliotheken einrichten. Alle unter FreeBSD gestarteten Linux-Programme suchen zuerst in diesem Verzeichnisbaum nach Systembibliotheken. Wenn also ein Linuxprogramm beispielsweise /lib/libc.so lädt, versucht FreeBSD zuerst, /compat/linux/lib/libc.so laden. Ist diese Datei nicht vorhanden, wird /lib/libc.so geladen. Systembibliotheken sollten daher besser in den virtuellen Verzeichnisbaum /compat/linux/lib als in den vom Linux-ld.so vorgeschlagenen installiert werden. Im Allgemeinen müssen Sie nur zu Beginn nach den Systembibliotheken suchen, die von Linuxprogrammen benötigt werden. Nach den ersten Installationen von Linuxprogrammen auf Ihrem FreeBSD-System verfügen Sie über eine Sammlung von Linux-Systembibliotheken, die es Ihnen ermöglichen wird, neue Linuxprogramme ohne Zusatzarbeit zu installieren. Installation zusätzlicher Systembibliotheken Shared-Libraries Was passiert, wenn Sie den linux_base-Port installieren, und Ihr Programm beschwert sich trotzdem über fehlende Systembibliotheken? Woher wissen Sie, welche Systembibliotheken von Linux-Binärprogrammen benötigt werden, und wo Sie diese finden? Grundsätzlich gibt es dafür zwei Möglichkeiten (um dieser Anleitung zu folgen, müssen Sie unter FreeBSD als Benutzer root angemeldet sein): Wenn Sie Zugriff auf ein Linux-System haben, können Sie dort nachsehen, welche Systembibliotheken eine Anwendung benötigt, und diese auf Ihr FreeBSD-System kopieren. Dazu folgendes Beispiel: Nehmen wir an, Sie haben FTP verwendet, um die Linux-Binärversion von Doom zu bekommen und haben sie auf Ihrem Linux-System installiert. Nun können Sie überprüfen, welche Systembibliotheken das Programm benötigt, indem Sie ldd linuxdoom eingeben. Das Resultat sieht dann so aus: &prompt.user; ldd linuxdoom libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29 symbolische Links Sie müssten nun alle Dateien aus der letzten Spalte kopieren und sie unter /compat/linux speichern, wobei die Namen der ersten Spalte als symbolische Links auf diese Dateien zeigen. Damit haben Sie schließlich folgende Dateien auf Ihrem FreeBSD-System: /compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Beachten Sie, dass wenn Sie bereits eine Linux-Systembibliothek einer zur ersten Spalte passenden Hauptversionsnummer (laut ldd-Ausgabe) besitzen, Sie die Datei aus der zweiten Spalte nicht mehr kopieren müssen, da die bereits vorhandene Version funktionieren sollte. Hat die Systembibliothek jedoch eine neuere Versionsnummer, sollten Sie sie dennoch kopieren. Sie können die alte Version löschen, solange Sie einen symbolischen Link auf die neue Version anlegen. Wenn Sie also folgende Bibliotheken auf Ihrem System installiert haben: /compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27 und Sie haben eine neue Binärdatei, die laut ldd eine neuere Bibliothek benötigt: libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 Wenn diese sich nur um ein oder zwei Stellen in der Unterversionsnummer unterscheiden, müssen Sie /lib/libc.so.4.6.29 nicht auf Ihr System kopieren, da das Programm auch mit der etwas älteren Version ohne Probleme funktionieren sollte. Wenn Sie wollen, können Sie libc.so aber dennoch ersetzen (das heißt aktualisieren), was dann zu folgender Ausgabe führt: /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Der Mechanismus der symbolischen Links wird nur für Linux-Binärdateien benötigt. Der FreeBSD-Laufzeitlinker sucht sich die passenden Hauptversionsnummern selbst, das heißt Sie müssen sich nicht darum kümmern.
Linux ELF-Binärdateien installieren Linux ELF-Binärdatei ELF-Binärdateien benötigen manchmal eine zusätzliche Kennzeichnung. Wenn Sie versuchen, eine nicht gekennzeichnete ELF-Binärdatei auszuführen, werden Sie eine Fehlermeldung ähnlich der folgenden erhalten: &prompt.user; ./my-linux-elf-binary ELF binary type not known Abort Damit der FreeBSD-Kernel eine Linux-ELF-Datei von einer FreeBSD-ELF-Datei unterscheiden kann, gibt es das Werkzeug &man.brandelf.1;: &prompt.user; brandelf -t Linux my-linux-elf-binary GNU Werkzeuge Die GNU Werkzeuge schreiben nun automatisch die passende Kennzeichnungsinformation in die ELF-Binärdateien, so dass Sie diesen Schritt in Zukunft nur noch selten benötigen werden. Namensauflösung konfigurieren Wenn DNS nicht funktioniert, oder Sie folgende Fehlermeldung erhalten: resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword müssen sie /compat/linux/etc/host.conf wie folgt anlegen: order hosts, bind multi on Diese Reihenfolge legt fest, dass zuerst /etc/hosts und anschließend DNS durchsucht werden. Wenn /compat/linux/etc/host.conf nicht vorhanden ist, finden Linux-Anwendungen FreeBSD's /etc/host.conf und beschweren sich über die inkompatible FreeBSD-Syntax. Wenn Sie keinen Nameserver (in /etc/resolv.conf) konfiguriert haben, sollten Sie den Eintrag bind entfernen.
Boris Hollas Für Mathematica 5.x aktualisiert von &mathematica; installieren Linux-Anwendungen Mathematica Dieses Dokument beschreibt die Installation der Linux-Version von &mathematica; 5.x auf einem FreeBSD-System. Die Linux-Version von &mathematica; oder &mathematica; für Studenten kann direkt von Wolfram unter bestellt werden. Den &mathematica;-Installer starten Zuerst müssen Sie &os; mitteilen, dass die Linux-Binärversion von &mathematica; die Linux-ABI verwendet. Dies erreichen Sie am einfachsten, indem Sie die Standard-ELF-Kennzeichnung für alle ungekennzeichneten Binärdateien auf Linux festlegen: &prompt.root; sysctl kern.fallback_elf_brand=3 Danach wird FreeBSD annehmen, dass alle ungekennzeichneten ELF-Binärdateien die Linux-ABI verwenden und es wäre nun möglich, das Installationsprogramm direkt von der CD-ROM zu starten. Unter &os; müssen allerdings die Datei MathInstaller in ein lokales Verzeichnis Ihrer Festplatte kopieren: &prompt.root; mount /cdrom &prompt.root; cp /cdrom/Unix/Installers/Linux/MathInstaller /LokalesVerzeichnis/ In dieser Datei ersetzen Sie in der ersten Zeile den Wert /bin/sh durch /compat/linux/bin/sh. Dadurch wird sichergestellt, dass der Installer von der Linux-Version von &man.sh.1; aufgerufen wird. Danach ersetzen Sie durch das im nächsten Abschnitt zu findende Skript oder über einen Texteditor alle Vorkommen von Linux) durch FreeBSD). Dadurch ist es dem &mathematica;-Installer möglich, durch den Einsatz von uname -s das Betriebssystem zu bestimmen. &os; wird dabei als Linux-artiges Betriebssystem behandelt. Durch den Aufruf von MathInstaller kann &mathematica; anschließend installiert werden. Die &mathematica;-Programmdateien anpassen Das von &mathematica; während der Installation erzeugte Shell-Skript muss angepasst werden, bevor Sie es einsetzen können. Wenn Sie die &mathematica;-Programmdateien unter - /usr/local/bin installieren, + /usr/local/bin installieren, finden Sie in diesem Verzeichnis die symbolische Links math, mathematica, Mathematica, sowie MathKernel. In jeder dieser Dateien müssen Sie jedes Vorkommen von Linux) durch FreeBSD) ersetzen (entweder über einen Texteditor oder durch das folgende Shellskript): #!/bin/sh cd /usr/local/bin for i in math mathematica Mathematica MathKernel do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i rm $i.tmp chmod a+x $i done Ihr &mathematica;-Passwort anfordern Ethernet MAC-Adresse Wenn Sie &mathematica; das erste Mal starten, werden Sie nach einem Passwort gefragt. Haben Sie noch kein Passwort von Wolfram erhalten, müssen Sie zuerst im Installationsverzeichnis mathinfo aufrufen, um Ihre Rechner-ID zu bestimmen. Diese Rechner-ID basiert ausschließlich auf der MAC-Adresse Ihrer ersten Netzwerkkarte. Daher ist es nicht möglich, Ihre &mathematica;-Kopie auf verschiedenen Rechnern zu installieren. Wenn Sie sich bei Wolfram registrieren (durch E-Mail, Telefon oder Fax), teilen Sie Ihre Rechner-ID mit und erhalten dafür ein aus Zahlengruppen bestehendes Passwort. Das &mathematica;-Frontend über ein Netzwerk ausführen &mathematica; verwendet einige spezielle Schriftarten, um Zeichen anzuzeigen, die in den Standardzeichensätzen nicht vorhanden sind (z.B. Integrale, Summen, griechische Buchstaben). Das X-Protokoll verlangt allerdings, dass diese Schriftarten lokal installiert sind. Das bedeutet, dass Sie diese Schriftarten von der CD-ROM oder von einem Rechner, auf dem &mathematica; installiert ist, auf Ihren Rechner kopieren müssen. Diese Schriftarten befinden sich normalerweise in /cdrom/Unix/Files/SystemFiles/Fonts (&mathematica;-CD) oder in /usr/local/mathematica/SystemFiles/Fonts (Festplatte). Die aktuellen Schriftarten befinden sich dabei in den Unterverzeichnissen Type1 und X. Um diese Schriftarten zu verwenden, gibt es mehrere Möglichkeiten, die nun beschrieben werden: Die erste Möglichkeit besteht darin, die Schriftarten in eins der bereits existierenden Schriftartenverzeichnisse unter /usr/X11R6/lib/X11/fonts zu kopieren. Dies bedeutet, dass Sie fonts.dir editieren müssen, indem Sie die Schriftnamen hinzufügen und die Anzahl der Schriftarten in der ersten Zeile ändern. Alternativ ist es auch möglich, im Verzeichnis, in das Sie die Schriftarten kopiert haben, das Kommando &man.mkfontdir.1; auszuführen. Die zweite Möglichkeit, besteht darin, die Verzeichnisse nach /usr/X11R6/lib/X11/fonts zu kopieren: &prompt.root; cd /usr/X11R6/lib/X11/fonts &prompt.root; mkdir X &prompt.root; mkdir MathType1 &prompt.root; cd /cdrom/Unix/Files/SystemFiles/Fonts &prompt.root; cp X/* /usr/X11R6/lib/X11/fonts/X &prompt.root; cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; cd /usr/X11R6/lib/X11/fonts/X &prompt.root; mkfontdir &prompt.root; cd ../MathType1 &prompt.root; mkfontdir Nun fügen Sie die neuen Schriftartenverzeichnisse in Ihren Pfad ein: &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/X &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; xset fp rehash Wenn Sie den &xorg;-Server verwenden, können Sie die Schriftarten-Verzeichnisse automatisch laden lassen, wenn Sie sie in Ihrer xorg.conf angeben. Für den &xfree86;-Server verwenden Sie die Datei XF86Config. Schriftarten Wenn Sie noch kein /usr/X11R6/lib/X11/fonts/Type1-Verzeichnis haben, können Sie das MathType1-Verzeichnis im vorherigen Beispiel in Type1 umbenennen. Aaron Kaplan Beigetragen von Robert Getschmann Mit Unterstützung durch &maple; installieren Linux-Anwendungen Maple &maple; ist ein mit &mathematica; vergleichbares kommerzielles Mathematikprogramm. Sie können dieses Programm unter kaufen und sich anschließend registrieren, um eine Lizenz zu erhalten. Um dieses Programm unter FreeBSD zu installieren, gehen Sie wie folgt vor: Führen Sie das INSTALL-Shell-Skript der Softwaredistribution aus. Wählen Sie die RedHat-Option aus, wenn Sie das Installationsprogramm danach fragt. Ein typisches Installationsverzeichnis wäre z.B. /usr/local/maple. Wenn Sie dies noch nicht gemacht haben, besorgen Sie sich nun eine &maple;-Lizenz von Maple Waterloo Software () und kopieren Sie diese nach /usr/local/maple/license/license.dat. Installieren Sie den FLEXlm-Lizenz-Manager, indem Sie das INSTALL_LIC-Installations-Shellskript ausführen, das mit &maple; ausgeliefert wird. Geben Sie Ihren primären Rechnernamen für den Lizenz-Server an. Verändern Sie /usr/local/maple/bin/maple.system.type wie folgt: ----- snip ------------------ *** maple.system.type.orig Sun Jul 8 16:35:33 2001 --- maple.system.type Sun Jul 8 16:35:51 2001 *************** *** 72,77 **** --- 72,78 ---- # the IBM RS/6000 AIX case MAPLE_BIN="bin.IBM_RISC_UNIX" ;; + "FreeBSD"|\ "Linux") # the Linux/x86 case # We have two Linux implementations, one for Red Hat and ----- snip end of patch ----- Bitte beachten Sie, dass nach "FreeBSD"|\ kein anderes Zeichen eingefügt werden darf. Dieser Patch weist &maple; an, FreeBSD als eine Art von Linux-System zu erkennen. Das Shell-Skript bin/maple ruft das Shell-Skript bin/maple.system.type auf, welches wiederum uname -a verwendet, um den Namen des Betriebssystems herauszufinden. Abhängig vom Betriebssystem weiß das System nun, welche Binärdateien verwendet werden sollen. Starten Sie den Lizenz-Server. Das folgende, als /usr/local/etc/rc.d/lmgrd.sh installierte Shell-Skript ist ein komfortabler Weg, um lmgrd zu starten: ----- snip ------------ #! /bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX export PATH LICENSE_FILE=/usr/local/maple/license/license.dat LOG=/var/log/lmgrd.log case "$1" in start) lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2 echo -n " lmgrd" ;; stop) lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2 ;; *) echo "Usage: `basename $0` {start|stop}" 1>&2 exit 64 ;; esac exit 0 ----- snip ------------ Versuchen Sie, &maple; zu starten: &prompt.user; cd /usr/local/maple/bin &prompt.user; ./xmaple Nun sollte das Programm laufen und alles funktionieren. Falls ja, vergessen Sie nicht, an Maplesoft zu schreiben und sie wissen zu lassen, dass Sie gerne eine native FreeBSD-Version hätten. Häufige Fehlerquellen Der FLEXlm-Lizenzmanager kann schwierig zu bedienen sein. Zusätzliche Dokumentation zu diesem Thema finden Sie unter . Es ist bekannt, dass lmgrd sehr pingelig ist, wenn es um die Lizenzdatei geht. Gibt es Probleme, führt dies zu einem Speicherauszug (core dump). Ein korrekte Lizenzdatei sollte ähnlich der folgenden aussehen: # ======================================================= # License File for UNIX Installations ("Pointer File") # ======================================================= SERVER chillig ANY #USE_SERVER VENDOR maplelmg FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \ PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \ ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \ SN=XXXXXXXXX Seriennummer und Schlüssel wurden durch mehrere X unkenntlich gemacht. chillig ist ein Rechnername. Veränderungen an der Lizenzdatei sind möglich, solange Sie die FEATURE-Zeile nicht verändern (diese ist durch den Lizenzschlüssel geschützt). Dan Pelleg Beigesteuert von &matlab; installieren Linux-Anwendungen MATLAB Im Folgenden wird die Installation der Linux-Anwendung &matlab; Version 6.5 auf &os; beschrieben. Mit Ausnahme der &java.virtual.machine; (siehe ) läuft die Anwendung auch ganz gut. Die Linux-Version von &matlab; können Sie direkt bei The MathWorks bestellen. Vergewissern Sie sich, dass Sie die Lizenz-Datei oder eine Anleitung zum Erstellen der Lizenz-Datei erhalten haben. Wenn Sie mit MathWorks in Kontakt stehen, weisen Sie bitte auf die fehlende &os;-Version der Software hin. Das &matlab;-Installationsskript Um &matlab; zu installieren, gehen Sie wie folgt vor: Hängen Sie die Installations-CD ein und wechseln Sie zu root, wie im Installations-Skript gefordert. Starten Sie die Installation mit dem folgenden Kommando: &prompt.root; /compat/linux/bin/sh /cdrom/install Die Installation erfordert eine graphische Benutzeroberfläche. Wenn Sie die Fehlermeldung erhalten, dass das Display nicht geöffnet werden konnte, führen Sie das folgende Kommando aus: &prompt.root; setenv HOME ~USER Für USER setzen Sie den Benutzer ein, von dem aus Sie root geworden sind. Beantworten Sie die Frage nach dem &matlab;-Root-Verzeichnis mit: /compat/linux/usr/local/matlab. Den langen Pfad werden Sie noch öfter brauchen. Die Tipparbeit können Sie sich mit dem folgenden Befehl erleichtern: &prompt.root; set MATLAB=/compat/linux/usr/local/matlab Editieren Sie die Lizenz-Datei entsprechend der Anweisung, die Sie beim Erwerb der Lizenz erhalten haben. Sie können die Datei schon vorher mit Ihrem Lieblingseditor bearbeiten. Kopieren Sie die Lizenz-Datei nach $MATLAB/license.dat bevor das Installationsprogramm Sie auffordert, die Datei zu editieren. Schließen Sie die Installation ab. Die &matlab;-Installation ist jetzt abgeschlossen. Die folgenden Schritte passen &matlab; an &os; an. Den Lizenzmanager starten Erstellen Sie symbolische Links zu den Startskripten des Lizenzmanagers: &prompt.root; ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW &prompt.root; ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW Erstellen Sie das Startskript /usr/local/etc/rc.d/flexlm.sh. Das folgende Beispiel ist eine geänderte Version des mitgelieferten Skripts $MATLAB/etc/rc.lm.glnx86. Angepasst wurden die Pfade zu den Dateien und der Start des Lizenzmanagers unter der Linux-Emulation. #!/bin/sh case "$1" in start) if [ -f /usr/local/etc/lmboot_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u username && echo 'MATLAB_lmgrd' fi ;; stop) if [ -f /usr/local/etc/lmdown_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmdown_TMW > /dev/null 2>&1 fi ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0 Machen Sie Datei ausführbar: &prompt.root; chmod +x /usr/local/etc/rc.d/flexlm.sh Ersetzen Sie im Skript username durch einen existierenden Benutzer Ihres Systems (bitte keinesfalls root). Starten Sie den Lizenzmanager: &prompt.root; /usr/local/etc/rc.d/flexlm.sh start Einrichten der &java;-Laufzeitumgebung Erstellen Sie einen symbolischen Link auf eine unter &os; laufende &java;-Laufzeitumgebung (JRE): &prompt.root; cd $MATLAB/sys/java/jre/glnx86/ &prompt.root; unlink jre; ln -s ./jre1.1.8 ./jre Ein &matlab;-Startskript erstellen Kopieren Sie das folgende Skript nach /usr/local/bin/matlab: #!/bin/sh /compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@" Machen Sie das Skript ausführbar: &prompt.root; chmod +x /usr/local/bin/matlab Abhängig von der Version des Ports emulators/linux_base kann das Skript auf Fehler laufen. Die Fehler können Sie vermeiden, indem Sie die Datei /compat/linux/usr/local/matlab/bin/matlab editieren. Ändern Sie die nachstehende Zeile if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then (mit Version 13.0.1 in der Zeile 410) in die folgende um: if test -L $newbase; then Stopp-Skript für &matlab; erstellen Das nachstehende Skript beendet &matlab; ordnungsgemäß. Erstellen Sie die Datei $MATLAB/toolbox/local/finish.m mit dem nachstehenden Inhalt: ! $MATLAB/bin/finish.sh Übernehmen Sie die Zeichenkette $MATLAB unverändert. Im selben Verzeichnis befinden sich die Dateien finishsav.m und finishdlg.m. Die Dateien sichern die Einstellungen der Arbeitsfläche bevor &matlab; beendet wird. Wenn Sie eine der beiden Dateien benutzen, fügen Sie die obige Zeile unmittelbar nach dem save-Kommando ein. Erstellen Sie die Datei $MATLAB/bin/finish.sh mit nachstehendem Inhalt: #!/usr/compat/linux/bin/sh (sleep 5; killall -1 matlab_helper) & exit 0 Machen Sie die Datei ausführbar: &prompt.root; chmod +x $MATLAB/bin/finish.sh &matlab; benutzen Jetzt können Sie &matlab; mit dem matlab starten. Marcel Moolenaar Beigetragen von &oracle; installieren Linux-Anwendungen Oracle Übersicht Dieses Dokument beschreibt die Installation von &oracle; 8.0.5 und &oracle; 8.0.5.1 Enterprise Edition für Linux auf einem FreeBSD-Rechner. Installation der Linux-Umgebung Stellen Sie sicher, dass Sie sowohl emulators/linux_base und devel/linux_devtools aus der Ports-Sammlung installiert haben. Wenn Sie mit diesen Ports Schwierigkeiten haben, müssen Sie vielleicht ältere Versionen der Linux-Umgebung aus der Ports-Sammlung installieren. Wenn Sie den Intelligent-Agent verwenden wollen, müssen Sie zusätzlich das RedHat Tcl-Paket installieren: tcl-8.0.3-20.i386.rpm. Zur Installation von RPM-Paketen wir der Port archivers/rpm benötigt. Ist der Port installiert, lassen sich RPM-Pakete anschließend mit dem nachstehenden Befehl installieren: &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package Die Installation der RPM-Pakete sollte ohne Fehlermeldung ablaufen. Die &oracle;-Umgebung erzeugen Bevor Sie &oracle; installieren können, müssen Sie eine entsprechende Umgebung erzeugen. Dieses Dokument beschreibt nur, was Sie im Speziellen tun müssen, um die Linux-Version von &oracle; unter FreeBSD zu installieren, nicht aber, was bereits in der Installationsanleitung von &oracle; beschrieben wird. Kernel-Tuning Kernel Tuning Wie in der Installationsanleitung von &oracle; beschrieben, müssen Sie die maximale Shared-Memory Größe festlegen. Verwenden Sie SHMMAX nicht unter FreeBSD. SHMMAX wird lediglich aus SHMMAXPGS und PGSIZE berechnet. Definieren Sie stattdessen SHMMAXPGS. Alle anderen Optionen können wie in der Anleitung beschrieben verwendet werden. Zum Beispiel: options SHMMAXPGS=10000 options SHMMNI=100 options SHMSEG=10 options SEMMNS=200 options SEMMNI=70 options SEMMSL=61 Passen Sie diese Optionen entsprechend dem von Ihnen gewünschten Einsatzzweck von &oracle; an. Stellen Sie außerdem sicher, dass Sie folgende Optionen in Ihren Kernel kompilieren: options SYSVSHM #SysV shared memory options SYSVSEM #SysV semaphores options SYSVMSG #SysV interprocess communication &oracle;-Benutzer anlegen Legen Sie den Account oracle an. Der Account unterschiedet sich von normalen Accounts dadurch, dass er eine Linux-Shell zugeordnet bekommen muss. Fügen Sie /compat/linux/bin/bash in die Datei /etc/shells ein und setzen Sie die Shell für den oracle-Account auf /compat/linux/bin/bash. Umgebung Neben den normalen &oracle;-Variablen, wie z.B. ORACLE_HOME und ORACLE_SID müssen Sie die folgenden Variablen setzen: Variable Wert LD_LIBRARY_PATH $ORACLE_HOME/lib CLASSPATH $ORACLE_HOME/jdbc/lib/classes111.zip PATH /compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin Es ist empfehlenswert, alle Variablen in der Datei .profile zu setzen. Ein komplettes Beispiel sieht folgendermaßen aus: ORACLE_BASE=/oracle; export ORACLE_BASE ORACLE_HOME=/oracle; export ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH ORACLE_SID=ORCL; export ORACLE_SID ORACLE_TERM=386x; export ORACLE_TERM CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip export CLASSPATH PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin export PATH &oracle; installieren Auf Grund einer kleinen Unregelmäßigkeit im Linux-Emulator müssen Sie das Verzeichnis .oracle unter /var/tmp erzeugen, bevor Sie das Installationsprogramm starten. Das Verzeichnis muss dem Account oracle gehören. Sie sollten &oracle; nun ohne Probleme installieren können. Treten dennoch Probleme auf, überprüfen Sie zuerst Ihre &oracle;-Distribution und Ihre Konfiguration. Nachdem Sie &oracle; erfolgreich installiert haben, installieren Sie die Patches wie in den zwei folgenden Abschnitten beschrieben: Ein häufiges Problem ist, dass der TCP Protokoll-Adapter nicht korrekt installiert wird. Daraus folgt, dass Sie keine TCP-Listener starten können. Dieses Problem kann durch folgende Schritte behoben werden: &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk ntcontab.o &prompt.root; cd $ORACLE_HOME/lib &prompt.root; ar r libnetwork.a ntcontab.o &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk install Vergessen Sie nicht, root.sh nochmals auszuführen! root.sh patchen Während der &oracle;-Installation werden einige Aktionen, die als root ausgeführt werden müssen, in ein Shell-Skript mit dem Namen root.sh gespeichert. Dieses Skript befindet sich im Verzeichnis orainst. Verwenden Sie folgenden Patch für root.sh, damit es das richtige chown Kommando verwendet, oder lassen Sie das Skript alternativ unter einer Linux-Shell ablaufen: *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 --- orainst/root.sh Mon Dec 28 15:58:53 1998 *************** *** 31,37 **** # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/bin/chown # # Define variables to be used in this script --- 31,37 ---- # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/usr/sbin/chown # # Define variables to be used in this script Wenn Sie &oracle; nicht von CD-ROM installieren, können Sie Quelldatei für root.sh verändern. Sie heißt rthd.sh und befindet sich im orainst-Verzeichnis des Quellcodebaums. genclntsh patchen Das Skript genclntsh wird verwendet, um eine Shared-Library für Clients zu erzeugen. Diese wird bei der Erzeugung der Demos verwendet. Verwenden Sie folgenden Patch, um die Definition von PATH auszukommentieren: *** bin/genclntsh.orig Wed Sep 30 07:37:19 1998 --- bin/genclntsh Tue Dec 22 15:36:49 1998 *************** *** 32,38 **** # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst --- 32,38 ---- # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst &oracle; starten Wenn Sie den Anweisungen gefolgt sind, sollten Sie nun in der Lage sein, &oracle; zu starten, genau so, wie Sie dies auch unter Linux tun würden. Holger Kipp Beigetragen von Valentino Vaschetto Originalversion nach SGML konvertiert durch: &sap.r3; installieren Linux-Anwendungen SAP R/3 Installationen von &sap; unter FreeBSD werden vom &sap; Support-Team nicht unterstützt – und &sap; bietet Support nur für zertifizierte Plattformen an! Übersicht Dieses Dokument beschreibt einen möglichen Weg, um ein &sap.r3;-System mit &oracle; Datenbank für Linux auf einem FreeBSD-Rechner zu installieren, einschließlich der Installation von FreeBSD und &oracle;. Zwei verschiedene Konfigurationen werden beschrieben: &sap.r3; 4.6B (IDES) mit &oracle; 8.0.5 unter FreeBSD 4.3-STABLE &sap.r3; 4.6C mit &oracle; 8.1.7 unter FreeBSD 4.5-STABLE Obwohl dieses Dokument versucht, alle wichtigen Schritte ausführlich zu beschreiben, besteht nicht die Absicht, die originalen Installationsanleitungen von &oracle; und &sap.r3; zu ersetzen. Benutzen Sie die mit &sap.r3; Linux Edition gelieferte Dokumentation für &sap;- und &oracle;-spezifische Fragen, sowie die Ressourcen von &oracle; und &sap;-OSS. Software/Programme Folgende CD-ROMs wurden für die Installation von &sap; verwendet: &sap.r3; 4.6B, &oracle; 8.0.5 Bezeichnung Nummer Beschreibung KERNEL 51009113 &sap; Kernel &oracle; / Installation / AIX, Linux, &solaris; RDBMS 51007558 &oracle; / RDBMS 8.0.5.X / Linux EXPORT1 51010208 IDES / DB-Export / Disc 1 of 6 EXPORT2 51010209 IDES / DB-Export / Disc 2 of 6 EXPORT3 51010210 IDES / DB-Export / Disc 3 of 6 EXPORT4 51010211 IDES / DB-Export / Disc 4 of 6 EXPORT5 51010212 IDES / DB-Export / Disc 5 of 6 EXPORT6 51010213 IDES / DB-Export / Disc 6 of 6 Zusätzlich wurde die &oracle; 8 Server CD-ROM (Pre-production Version 8.0.5 für Linux, Kernel Version 2.0.33) verwendet, die allerdings nicht unbedingt nötig ist und FreeBSD 4.3-STABLE (die Installation wurde kurz nach dem Erscheinen von 4.3-RELEASE durchgeführt). &sap.r3; 4.6C SR2, &oracle; 8.1.7 Bezeichnung Nummer Beschreibung KERNEL 51014004 &sap; Kernel &oracle; / &sap; Kernel Version 4.6D / DEC, Linux RDBMS 51012930 &oracle; 8.1.7/ RDBMS / Linux EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 1 of 4 EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 2 of 4 EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 3 of 4 EXPORT1 51013953 Release 4.6C SR2 / Export / Disc 4 of 4 LANG1 51013954 Release 4.6C SR2 / Language / DE, EN, FR / Disc 1 of 3 Abhängig von den zu installierenden Sprachen kann es sein, dass zusätzliche Sprach-CDs nötig sind. Da hier nur Deutsch und Englisch verwendet wurden, ist die erste Sprachen-CD ausreichend. Nebenbei bemerkt sind die Nummern aller vier Export-CDs identisch. Das heißt alle drei Sprachen-CDs haben diesselbe Nummer (das unterscheidet sie von der Nummerierung der 4.6B IDES-Version). Zum Zeitpunkt der Erstellung dieses Dokuments lief das System unter FreeBSD 4.5-STABLE (20.03.2002). &sap;-Notes Die folgenden Anmerkungen sollten vor der Installation von &sap.r3; gelesen werden, da sie sich während der Installation als nützlich erwiesen haben. &sap.r3; 4.6B, &oracle; 8.0.5 Nummer Bezeichnung 0171356 &sap; Software on Linux: Essential Comments 0201147 INST: 4.6C R/3 Inst. on UNIX - &oracle; 0373203 Update / Migration &oracle; 8.0.5 --> 8.0.6/8.1.6 LINUX 0072984 Release of Digital UNIX 4.0B for &oracle; 0130581 R3SETUP step DIPGNTAB terminates 0144978 Your system has not been installed correctly 0162266 Questions and tips for R3SETUP on Windows NT/W2K &sap.r3; 4.6C, &oracle; 8.1.7 Nummer Bezeichnung 0015023 Initializing table TCPDB (RSXP0004) (EBCDIC) 0045619 R/3 with several languages or typefaces 0171356 &sap; Software on Linux: Essential Comments 0195603 RedHat 6.1 Enterprise version: Known problems 0212876 The new archiving tool SAPCAR 0300900 Linux: Released DELL Hardware 0377187 RedHat 6.2: important remarks 0387074 INST: R/3 4.6C SR2 Installation on UNIX 0387077 INST: R/3 4.6C SR2 Inst. on UNIX - &oracle; 0387078 &sap; Software on UNIX: OS Dependencies 4.6C SR2 Hardware-Anforderungen Die folgende Ausstattung reicht für die Installation eines &sap.r3; Systems aus. Für Produktionszwecke benötigt man natürlich eine exakte Bestimmung dieser Größen: Komponente 4.6B 4.6C Prozessor 2 x 800MHz &pentium; III 2 x 800MHz &pentium; III Hauptspeicher 1GB ECC 2GB ECC Festplattenplatz 50-60GB (IDES) 50-60GB (IDES) Für Produktionszwecke sind &xeon; Prozessoren mit großem Cache, Hochgeschwindigkeitsspeicher (SCSI, RAID Hardware Controller), USV (unterbrechungsfreie Stromversorgung) und ECC-RAM empfehlenswert. Der große Bedarf an Festplattenplatz ergibt sich durch das vorkonfigurierte IDES System, welches während der Installation 27 GB Datenbankdateien erzeugt. Dieser Speicher ist auch für neue Produktionssysteme und Anwendungsdaten ausreichend. &sap.r3; 4.6B, &oracle; 8.0.5 Folgende Standard-Hardware wurde verwendet: Ein Doppelprozessorboard mit zwei 800 MHz &pentium; III Prozessoren, Adaptec 29160 Ultra160 SCSI Adaptern (zum Anschluß eines 40/80 GB DLT Bandlaufwerks und eines CD-ROM-Laufwerks), &mylex; &acceleraid; (2 Kanäle, Firmware 6.00-1-00 mit 32 MB RAM). An den &mylex; RAID-Controller wurden 2 (gespiegelte) 17 GB Festplatten sowie vier 36 GB Festplatten (RAID level 5) angeschlossen. &sap.r3; 4.6C, &oracle; 8.1.7 Für diese Installation wurde ein DELL PowerEdge 2500 verwendet: Ein Doppelprozessorboard mit zwei 1000 MHz &pentium; III Prozessoren (256 kB Cache), 2 GB PC133 ECC SDRAM, PERC/3 DC PCI RAID-Controller mit 128 MB, und einem EIDE DVD-ROM Laufwerk. An den RAID-Controller sind zwei (gespiegelte) 18 GB Festplatten sowie vier 36 GB Festplatten (RAID level 5) angeschlossen. Installation von FreeBSD Als erstes müssen Sie FreeBSD installieren. Dazu gibt es mehrere Möglichkeiten, die in des Handbuchs beschrieben werden. Aufteilung der Festplatte Um das Ganze zu vereinfachen, wurde sowohl für die &sap.r3; 46B- als auch die &sap.r3; 46C SR2-Installation die gleiche Platteneinteilung verwendet. Nur die Gerätenamen änderten sich, da die Installationen auf verschiedenen Hardwareplattformen durchgeführt wurden (Insbesondere /dev/da sowie /dev/amr; wenn also jemand z.B. ein AMI &megaraid; verwendet, so wird er /dev/amr0s1a anstelle von /dev/da0s1a vorfinden.): Dateisystem Größe (1k-blocks) HDD-Größe (GB) Gemountet nach /dev/da0s1a 1.016.303 1 / /dev/da0s1b 6 Swap /dev/da0s1e 2.032.623 2 /var /dev/da0s1f 8.205.339 8 /usr /dev/da1s1e 45.734.361 45 /compat/linux/oracle /dev/da1s1f 2.032.623 2 /compat/linux/sapmnt /dev/da1s1g 2.032.623 2 /compat/linux/usr/sap Konfigurieren und initialisieren Sie die zwei logischen Platten mit der &mylex;- oder PERC/3 RAID Software, bevor Sie beginnen. Diese kann während der BIOS-Bootphase gestartet werden. Beachten Sie bitte, dass sich diese Platteneinteilung etwas von den &sap;-Empfehlungen unterscheidet, da &sap; vorschlägt, die &oracle;-Unterverzeichnisse (und einige andere) separat einzuhängen – es ist jedoch einfacher, diese als reale Unterverzeichnisse zu erzeugen. <command>make world</command> und ein neuer Kernel Laden Sie die neuesten STABLE-Quellen herunter. Aktualisieren Sie das System und erzeugen Sie einen neuen Kernel, nachdem Sie die Kernelkonfigurationsdatei angepasst haben. Zusätzlich sollten Sie die Kernel Parameter einfügen, die sowohl von &sap.r3; als auch von &oracle; benötigt werden. Installation der Linux-Umgebung Das Linux-Basissystem installieren Zuerst muss der Port linux_base als root installiert werden: - &prompt.root; cd /usr/ports/emulators/linux_base -&prompt.root; make package + &prompt.root; cd /usr/ports/emulators/linux_base-fc4 +&prompt.root; make install distclean Die Linux-Entwicklungsumgebung installieren Die Linux-Entwicklungsumgebung wird benötigt, wenn Sie &oracle; auf Ihrem FreeBSD-System installieren wollen (siehe ): &prompt.root; cd /usr/ports/devel/linux_devtools &prompt.root; make install distclean Die Linux-Entwicklungsumgebung wurde hier jedoch nur für die &sap.r3; 46B IDES-Installation verwendet. Sie wird nicht benötigt, wenn die &oracle;-Datenbank auf dem FreeBSD System nicht neu gebunden wird. Dies ist dann der Fall, wenn Sie den &oracle; Tarball eines Linux-Systems verwenden. Notwendige RPMs installieren RPMs Um das R3SETUP-Programm zu starten, wird PAM-Unterstützung benötigt. Während der ersten Installation von &sap; unter FreeBSD 4.3-STABLE wurde versucht, zuerst alle von PAM benötigten Pakete zu installieren. Anschließend wurde die Installation von PAM erzwungen, was auch ohne Probleme funktionierte. Für die folgende Installation von &sap.r3; 4.6C SR2 wurde die Installation von PAM ohne die abhängigen Pakete direkt erzwungen und es funktionierte ebenfalls. Es sieht so aus, als würden die abhängigen Pakete nicht benötigt. &prompt.root; rpm -i --ignoreos --nodeps --root /compat/linux --dbpath /var/lib/rpm \ pam-0.68-7.i386.rpm Um den Intelligent-Agent von &oracle; 8.0.5 auszuführen, musste das RedHat Tcl-Paket tcl-8.0.5-30.i386.rpm installiert werden, da sonst das Binden (link) während der &oracle;-Installation nicht funktionierte. Es gibt noch weitere Punkte beim Binden von &oracle;, die aber die Kombination &oracle;-Linux betreffen und nicht FreeBSD spezifisch sind. Zusätzliche Hinweise Eine gute Idee ist es, linprocfs in /etc/fstab einzufügen; weitere Informationen dazu erhalten Sie in der Hilfeseite &man.linprocfs.5;. Weiterhin sollten Sie in der Datei /etc/sysctl.conf die Zeile kern.fallback_elf_brand=3 einfügen. Die &sap.r3;-Umgebung erzeugen Die nötigen Dateisysteme erzeugen Für eine einfache Installation reicht es aus, folgende Dateisysteme zu erzeugen: Dateisysteme Größe in GB /compat/linux/oracle 45 GB /compat/linux/sapmnt 2 GB /compat/linux/usr/sap 2 GB Außerdem müssen einige Links angelegt werden. Ansonsten beschwert sich der &sap;-Installer, wenn er die erzeugten Links überprüft: &prompt.root; ln -s /compat/linux/oracle /oracle &prompt.root; ln -s /compat/linux/sapmnt /sapmnt &prompt.root; ln -s /compat/linux/usr/sap /usr/sap Eine Fehlermeldung während der Installation (hier unter dem PRD-System und &sap.r3; 4.6C SR2 könnte beispielsweise so aussehen: INFO 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:200 Checking existence of symbolic link /usr/sap/PRD/SYS/exe/dbg to /sapmnt/PRD/exe. Creating if it does not exist... WARNING 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:400 Link /usr/sap/PRD/SYS/exe/dbg exists but it points to file /compat/linux/sapmnt/PRD/exe instead of /sapmnt/PRD/exe. The program cannot go on as long as this link exists at this location. Move the link to another location. ERROR 2002-03-19 16:45:36 R3LINKS_IND_IND Ins_SetupLinks:0 can not setup link '/usr/sap/PRD/SYS/exe/dbg' with content '/sapmnt/PRD/exe' Benutzer und Verzeichnisse anlegen &sap.r3; benötigt zwei Benutzer und drei Benutzergruppen. Die Benutzernamen hängen von der (aus drei Buchstaben bestehenden) SAP-System-ID (SID) ab. Einige dieser SIDs sind von &sap; reserviert (z.B. SAP und NIX. Für eine komplette Übersicht schlagen Sie bitte in der &sap;-Dokumentation nach. Für die IDES-Installation wurde IDS verwendet, für die 4.6C-SR2-Installation PRD, da das System für Produktionszwecke eingesetzt werden sollte. Daraus ergaben sich folgende Gruppen (die Gruppen-IDs können variieren, es handelt sich nur um Werte, die für diese spezielle Installation verwendet wurden): Gruppen-ID Gruppen-Name Beschreibung 100 dba Datenbank-Administrator 101 sapsys SAP System 102 oper Datenbank-Operator Bei einer Standard-&oracle;-Installation wird nur die Gruppe dba verwendet. Für die Gruppe oper wird ebenfalls die Gruppe dba verwendet (weitere Informationen finden sich in der &oracle;- und &sap;-Dokumentation). Zusätzlich werden auch folgende Benutzer benötigt: Benutzer-ID Benutzername Generischer Name Gruppe Zusätzliche Gruppen Beschreibung 1000 idsadm/prdadm sidadm sapsys oper SAP Administrator 1002 oraids/oraprd orasid dba oper &oracle; Administrator Für das Anlegen des &sap;-Administrators mittels &man.adduser.8; werden folgende Einträge (beachten Sie bitte die Shell und das Heimatverzeichnis) benötigt: Name: sidadm Password: ****** Fullname: SAP Administrator SID Uid: 1000 Gid: 101 (sapsys) Class: Groups: sapsys dba HOME: /home/sidadm Shell: bash (/compat/linux/bin/bash) und für den Datenbank-Administrator: Name: orasid Password: ****** Fullname: Oracle Administrator SID Uid: 1002 Gid: 100 (dba) Class: Groups: dba HOME: /oracle/sid Shell: bash (/compat/linux/bin/bash) Wenn Sie beide Gruppen (dba und oper) verwenden, sollte auch die Gruppe oper hinzugefügt werden. Verzeichnisse erzeugen Diese Verzeichnisse werden gewöhnlich als eigene Dateisysteme erzeugt und gemountet. Letztlich liegt dies aber an Ihren Anforderungen an das System. Hier wurden sie als einfache Verzeichnisse angelegt, die sich alle im gleichen RAID5 befinden: Zuerst werden die Eigentümer und Rechte für einige Verzeichnisse (als Benutzer root) gesetzt: &prompt.root; chmod 775 /oracle &prompt.root; chmod 777 /sapmnt &prompt.root; chown root:dba /oracle &prompt.root; chown sidadm:sapsys /compat/linux/usr/sap &prompt.root; chmod 775 /compat/linux/usr/sap Danach werden (als Benutzer orasid) einige Verzeichnisse erzeugt, die alle Unterverzeichnisse von /oracle/SID sind: &prompt.root; su - orasid &prompt.root; cd /oracle/SID &prompt.root; mkdir mirrlogA mirrlogB origlogA origlogB &prompt.root; mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6 &prompt.root; mkdir saparch sapreorg &prompt.root; exit Für die &oracle; 8.1.7-Installation werden ebenfalls zusätzliche Verzeichnisse benötigt: &prompt.root; su - orasid &prompt.root; cd /oracle &prompt.root; mkdir 805_32 &prompt.root; mkdir client stage &prompt.root; mkdir client/80x_32 &prompt.root; mkdir stage/817_32 &prompt.root; cd /oracle/SID &prompt.root; mkdir 817_32 Das Verzeichnis client/80x_32 muss genau so genannt werden. Versuchen Sie nicht, das x durch eine Zahl oder einen Buchstaben zu ersetzen. Im dritten Schritt werden wiederum Verzeichnisse (als Benutzer sidadm) erzeugt: &prompt.root; su - sidadm &prompt.root; cd /usr/sap &prompt.root; mkdir SID &prompt.root; mkdir trans &prompt.root; exit Einträge in <filename>/etc/services</filename> &sap.r3; benötigt einige Einträge in /etc/services, die während der Installation unter FreeBSD nicht richtig gesetzt werden. Sie benötigen mindestens die zur Instanzennummer, in diesem Fall 00, passenden Einträge. Es ist auch möglich, direkt alle Einträge für dp, gw, sp und ms von 00 bis 99 einzufügen. Wenn Sie einen SAP-Router verwenden, oder den Zugang zu &sap;-OSS benötigen, müssen Sie auch 99 einfügen, da der Port 3299 normalerweise für den SAP-Router-Prozess auf dem Zielsystem benötigt wird: sapdp00 3200/tcp # SAP Dispatcher. 3200 + Instance-Number sapgw00 3300/tcp # SAP Gateway. 3300 + Instance-Number sapsp00 3400/tcp # 3400 + Instance-Number sapms00 3500/tcp # 3500 + Instance-Number sapmsSID 3600/tcp # SAP Message Server. 3600 + Instance-Number sapgw00s 4800/tcp # SAP Secure Gateway 4800 + Instance-Number Notwendige Lokalisierungen Locale &sap; benötigt mindestens zwei Lokalisierungen, die nicht Teil der RedHat-Standardinstallation sind. &sap; bietet diese als RPMs auf ihrem FTP-Server als Downloads an (diese sind aber nur dann zugänglich, wenn Sie ein Kunde mit OSS-Zugang sind). Für eine Übersicht der notwendigen RPMs lesen Sie bitte den &sap;-Hinweis 0171356. Es ist auch möglich, nur die passenden Links (z.B. von de_DE und en_US) zu erzeugen, diese Vorgehensweise wird aber nicht nicht empfohlen (obwohl es bisher beim IDES-System ohne Probleme funktioniert hat). Folgende Lokalisationen werden benötigt: de_DE.ISO-8859-1 en_US.ISO-8859-1 Erzeugen Sie die Links wie folgt: &prompt.root; cd /compat/linux/usr/share/locale &prompt.root; ln -s de_DE de_DE.ISO-8859-1 &prompt.root; ln -s en_US en_US.ISO-8859-1 Sind diese nicht vorhanden, wird es während der Installation zu einigen Problemen kommen. Wenn diese konsequent ignoriert werden (indem der fehlgeschlagene Schritt in CENTRDB.R3S auf OK gesetzt wird), ist es ohne größeren Aufwand nicht mehr möglich, sich am &sap;-System anzumelden. Kernel-Tuning Kernel Tuning &sap.r3;-Systeme verbrauchen sehr viele Ressourcen. Deshalb wurden folgende Parameter in die Kernelkonfigurationsdatei eingefügt: # Set these for memory pigs (SAP and Oracle): options MAXDSIZ="(1024*1024*1024)" options DFLDSIZ="(1024*1024*1024)" # System V options needed. options SYSVSHM #SYSV-style shared memory options SHMMAXPGS=262144 #max amount of shared mem. pages #options SHMMAXPGS=393216 #use this for the 46C inst.parameters options SHMMNI=256 #max number of shared memory ident if. options SHMSEG=100 #max shared mem.segs per process options SYSVMSG #SYSV-style message queues options MSGSEG=32767 #max num. of mes.segments in system options MSGSSZ=32 #size of msg-seg. MUST be power of 2 options MSGMNB=65535 #max char. per message queue options MSGTQL=2046 #max amount of msgs in system options SYSVSEM #SYSV-style semaphores options SEMMNU=256 #number of semaphore UNDO structures options SEMMNS=1024 #number of semaphores in system options SEMMNI=520 #number of semaphore indentifiers options SEMUME=100 #number of UNDO keys Die minimalen Werte sind in der von &sap; kommenden Dokumentation festgelegt. Da es keine Beschreibung für Linux (und daher auch nicht für FreeBSD) gibt, entnehmen Sie weitere Informationen dem HP-UX-Abschnitt (32-Bit). Da das System für die 4.6C SR2-Installation über mehr Hauptspeicher verfügte, können die Shared-Segments für &sap; und &oracle; größer sein. Wählen Sie daher eine größere Anzahl von Shared-Memory-Pages. Bei einer &os;-Standardinstallation auf &i386;-Systemen belassen Sie MAXDSIZ und DFLDSIZ auf dem Maximum von 1 GB. Ansonsten könnten seltsame Fehlermeldungen, wie ORA-27102: out of memory oder Linux Error: 12: Cannot allocate memory auftreten. &sap.r3; installieren Die &sap; CD-ROMs vorbereiten Für eine Installation werden viele CD-ROMs benötigt, die gemountet und ungemountet werden müssen. Wenn Sie genügend CD-ROM-Laufwerke haben, können Sie alle gleichzeitig gemountet werden. Ansonsten kopiert man die CD-ROM-Inhalte einfach in die entsprechenden Verzeichnisse, /oracle/SID/sapreorg/cd-name wobei cd-name KERNEL, RDBMS, EXPORT1, EXPORT2, EXPORT3, EXPORT4, EXPORT5 und EXPORT6 bei einer 4.6B/IDES-Installation und KERNEL, RDBMS, DISK1, DISK2, DISK3, DISK4 und LANG bei einer 4.6C SR2-Installation entspricht. Die Dateinamen auf den gemounteten CDs sollten aus Großbuchstaben bestehen. Ist dies nicht der Fall, verwenden Sie zum Mounten die Option . Für das Kopieren der CD-Inhalte verwenden Sie folgenden Befehle: &prompt.root; mount_cd9660 -g /dev/cd0a /mnt &prompt.root; cp -R /mnt/* /oracle/SID/sapreorg/cd-name &prompt.root; umount /mnt Das Installations-Skript ausführen Als erstes müssen Sie ein Installationsverzeichnis anlegen: &prompt.root; cd /oracle/SID/sapreorg &prompt.root; mkdir install &prompt.root; cd install Anschließend wird das Installations-Skript gestartet, das nahezu alle relevanten Daten in das Installationsverzeichnis kopiert: &prompt.root; /oracle/SID/sapreorg/KERNEL/UNIX/INSTTOOL.SH Die IDES-Installation (4.6B) wird mit einem vollständig angepassten &sap.r3; Demo-System geliefert, das heißt es gibt sechs statt drei Export-CDs. Da CENTRDB.R3S für eine Standard-Zentralinstanz (&r3; plus Datenbank) ausgelegt ist, aber nicht für eine IDES-Zentralinstanz, muss die passende CENTRDB.R3S-Datei manuell aus dem Verzeichnis EXPORT1 in das Installationsverzeichnis kopiert werden, da R3SETUP ansonsten nur nach drei EXPORT-CDs verlangt. Die aktuellere Version &sap; 4.6C SR2 wird mit vier EXPORT-CDs geliefert. Die die Installation überwachende Parameter-Datei heißt hier CENTRAL.R3S. Im Gegensatz zu früheren Versionen gibt es nun keine separaten Vorlagen für die Installation von Zentralinstanzen mit und ohne Datenbank mehr. &sap; verwendet eine eigene Vorlage für die Datenbankinstallation. Um die Installation später erneut starten, ist es jedoch ausreichend, die Installation mit der ursprünglichen Datei zu starten. Während und nach der Installation benötigt &sap; hostname, um den Rechnernamen, aber nicht den vollständigen Domain-Namen zu erhalten. Setzen Sie also entweder den Rechnernamen entsprechend, oder setzen Sie einen Alias mit alias hostname='hostname -s' für die Benutzer orasid und sidadm (Und zusätzlich für root. Dies zumindest für die Installationsschritte, die als root ausgeführt werden müssen.). Außerdem ist es möglich, nur die während der &sap;-Installation erstellten Dateien .profile und .login beider Benutzer anzupassen. <command>R3SETUP</command> 4.6B starten Stellen Sie sicher, dass LD_LIBRARY_PATH korrekt gesetzt wurde: &prompt.root; export LD_LIBRARY_PATH=/oracle/IDS/lib:/sapmnt/IDS/exe:/oracle/805_32/lib Gehen Sie in das Installationsverzeichnis und starten Sie R3SETUP als root: &prompt.root; cd /oracle/IDS/sapreorg/install &prompt.root; ./R3SETUP -f CENTRDB.R3S Das Skript stellt anschließend einige Fragen (Vorgaben stehen dabei in Klammern, gefolgt von den aktuellen Eingaben): Frage Vorgabe Eingabe Enter SAP System ID [C11] IDSEnter Enter SAP Instance Number [00] Enter Enter SAPMOUNT Directory [/sapmnt] Enter Enter name of SAP central host [troubadix.domain.de] Enter Enter name of SAP db host [troubadix] Enter Select character set [1] (WE8DEC) Enter Enter Oracle server version (1) Oracle 8.0.5, (2) Oracle 8.0.6, (3) Oracle 8.1.5, (4) Oracle 8.1.6 1Enter Extract Oracle Client archive [1] (Yes, extract) Enter Enter path to KERNEL CD [/sapcd] /oracle/IDS/sapreorg/KERNEL Enter path to RDBMS CD [/sapcd] /oracle/IDS/sapreorg/RDBMS Enter path to EXPORT1 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT1 Directory to copy EXPORT1 CD [/oracle/IDS/sapreorg/CD4_DIR] Enter Enter path to EXPORT2 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT2 Directory to copy EXPORT2 CD [/oracle/IDS/sapreorg/CD5_DIR] Enter Enter path to EXPORT3 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT3 Directory to copy EXPORT3 CD [/oracle/IDS/sapreorg/CD6_DIR] Enter Enter path to EXPORT4 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT4 Directory to copy EXPORT4 CD [/oracle/IDS/sapreorg/CD7_DIR] Enter Enter path to EXPORT5 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT5 Directory to copy EXPORT5 CD [/oracle/IDS/sapreorg/CD8_DIR] Enter Enter path to EXPORT6 CD [/sapcd] /oracle/IDS/sapreorg/EXPORT6 Directory to copy EXPORT6 CD [/oracle/IDS/sapreorg/CD9_DIR] Enter Enter amount of RAM for SAP + DB 850Enter (in Megabytes) Service Entry Message Server [3600] Enter Enter Group-ID of sapsys [101] Enter Enter Group-ID of oper [102] Enter Enter Group-ID of dba [100] Enter Enter User-ID of sidadm [1000] Enter Enter User-ID of orasid [1002] Enter Number of parallel procs [2] Enter Wenn Sie die CD-Inhalte nicht in verschiedene Verzeichnisse kopiert haben, findet das &sap;-Installationsprogramm die benötigten CDs nicht (diese sind durch die Datei LABEL.ASC gekennzeichnet) und würde von Ihnen verlangen, entweder die CD einzulegen und zu mounten oder den entsprechenden mount-Pfad einzugeben. CENTRDB.R3S ist möglicherweise nicht fehlerfrei. Im vorliegenden Fall wurde die CD EXPORT4 zwar erneut verlangt, dennoch wurde der richtige Schlüssel (6_LOCATION, danach 7_LOCATION) vorgeschlagen. Daher ist es problemlos möglich, durch Eingabe der korrekten Werte fortzufahren. Abgesehen von einigen kleineren (unten angeführten) Problemen, sollte nun bis zur Installation der &oracle;-Datenbank alles ohne Probleme ablaufen. <command>R3SETUP</command> 4.6C SR2 starten Stellen Sie sicher, dass LD_LIBRARY_PATH korrekt gesetzt ist. Dieser Wert unterscheidet sich von dem der 4.6B-&oracle; 8.0.5-Installation: &prompt.root; export LD_LIBRARY_PATH=/sapmnt/PRD/exe:/oracle/PRD/817_32/lib Gehen Sie in das Installationsverzeichnis und führen Sie R3SETUP als root aus: &prompt.root; cd /oracle/PRD/sapreorg/install &prompt.root; ./R3SETUP -f CENTRAL.R3S Das Skript stellt anschließend einige Fragen (Vorgaben in Klammern, gefolgt von den aktuellen Eingaben): Frage Vorgabe Eingabe Enter SAP System ID [C11] PRDEnter Enter SAP Instance Number [00] Enter Enter SAPMOUNT Directory [/sapmnt] Enter Enter name of SAP central host [majestix] Enter Enter Database System ID [PRD] PRDEnter Enter name of SAP db host [majestix] Enter Select character set [1] (WE8DEC) Enter Enter Oracle server version (2) Oracle 8.1.7 2Enter Extract Oracle Client archive [1] (Yes, extract) Enter Enter path to KERNEL CD [/sapcd] /oracle/PRD/sapreorg/KERNEL Enter amount of RAM for SAP + DB 2044 1800Enter (in Megabytes) Service Entry Message Server [3600] Enter Enter Group-ID of sapsys [100] Enter Enter Group-ID of oper [101] Enter Enter Group-ID of dba [102] Enter Enter User-ID of oraprd [1002] Enter Enter User-ID of prdadm [1000] Enter LDAP support 3Enter (no support) Installation step completed [1] (continue) Enter Choose installation service [1] (DB inst,file) Enter Bisher verursacht das Anlegen von Benutzern eine Fehlermeldung während der Installation, und zwar in den Stadien OSUSERDBSID_IND_ORA (beim Anlegen des Benutzers orasid), sowie in OSUSERSIDADM_IND_ORA (beim Anlegen des Benutzers sidadm). Abgesehen von einigen kleineren (unten angeführten) Problemen, sollte nun bis zur Installation der &oracle;-Datenbank alles ohne Probleme ablaufen. &oracle; 8.0.5 installieren Lesen Sie bitte die entsprechenden &sap;-Hinweise und &oracle;-Readmes für Probleme, die Linux und die &oracle;-Datenbank betreffen. Die meisten (wenn nicht alle) Probleme werden durch inkompatible Bibliotheken verursacht. Weiteres zur &oracle;-Installation finden Sie im Kapitel Installation von &oracle;. &oracle; 8.0.5 mit <command>orainst</command> installieren Wenn &oracle; 8.0.5 verwendet wird, werden einige zusätzliche Bibliotheken benötigt, da &oracle; 8.0.5 mit einer alten Version von glibc verlinkt wurde, RedHat 6.1 aber bereits eine aktuellere Version verwendet. Daher müssen Sie folgende zusätzliche Pakte installieren, um sicherzustellen, dass die Verlinkung ordnungsgemäß erfolgt: compat-libs-5.2-2.i386.rpm compat-glibc-5.2-2.0.7.2.i386.rpm compat-egcs-5.2-1.0.3a.1.i386.rpm compat-egcs-c++-5.2-1.0.3a.1.i386.rpm compat-binutils-5.2-2.9.1.0.23.1.i386.rpm Lesen Sie bitte die entsprechenden &sap;-Hinweise und die &oracle;-Readmes. Ist dies nicht möglich (z.B. aus Zeitmangel, oder bei Nichtvorhandensein dieser Unterlagen), besteht auch die Möglichkeit, die originalen Binärdateien oder die verlinkten Binärdateien eines RedHat-Systems zu verwenden. Um den Intelligent-Agent zu kompilieren, muss das RedHat Tcl-Paket installiert sein. Wenn Sie tcl-8.0.3-20.i386.rpm nicht bekommen können, sollte es auch problemlos möglich sein, eine neuere Version, z.B. tcl-8.0.5-30.i386.rpm für RedHat 6.1, zu verwenden. Vom Binden abgesehen, läuft die Installation wie folgt ab: &prompt.root; su - oraids &prompt.root; export TERM=xterm &prompt.root; export ORACLE_TERM=xterm &prompt.root; export ORACLE_HOME=/oracle/IDS &prompt.root; cd $ORACLE_HOME/orainst_sap &prompt.root; ./orainst Bestätigen Sie alle Meldungen mit Enter, bis die Software installiert ist. Einzige Ausnahme ist die Frage nach der Installation des &oracle; On-Line Text Viewers. Dieser ist unter Linux (noch) nicht verfügbar. Daher muss diese Option deaktiviert werden. Anschließend will sich &oracle; unter Verwendung von i386-glibc20-linux-gcc anstelle der verfügbaren gcc, egcs oder i386-redhat-linux-gcc verlinken. Auf Grund zeitlicher Einschränkungen wurden für die Installation die Binärdateien der &oracle; 8.0.5 PreProduction-Version verwendet, nachdem sich der erste Versuch, die Version von der RDBMS-CD zum Laufen zu bringen, sowie die richtigen RPMs zu finden und zu installieren, zum Alptraum entwickelt hatte. &oracle; 8.0.5 Pre-Production für Linux (Kernel 2.0.33) installieren Diese Installation ist relativ einfach. Mounten Sie die CD und starten Sie den Installer. Danach wählen Sie das &oracle;-Heimatverzeichnis und kopieren Sie die Binärdateien dorthin. Die Überreste der vorherigen RDBMS-Installationsversuche werden dabei nicht entfernt. Danach konnte die &oracle;-Datenbank ohne Probleme gestartet werden. Das &oracle; 8.1.7-Linux-Archiv entpacken Nehmen Sie das aus dem Installationsverzeichnis eines Linux-Systems erstellte Archiv oracle81732.tgz und entpacken Sie es nach /oracle/SID/817_32/. Mit der &sap.r3;-Installation fortfahren Überprüfen Sie als Erstes die Umgebungseinstellungen der Benutzer idsamd(sidadm) und oraids (orasid). Beide sollten nun die Dateien .profile, .login und .cshrc enthalten, die alle hostname benutzen. Falls der Rechnername Ihres Systems der vollständige Rechnername ist, müssen Sie in allen drei Dateien hostname in hostname -s ändern. Datenbanken laden Danach kann R3SETUP entweder erneut gestartet oder fortgesetzt werden (je nachdem, ob Sie das Programm zuvor beendet hatten oder nicht). R3SETUP erzeugt nun die Tablespaces und lädt die Daten (für 46B IDES von EXPORT1 bis EXPORT6, für 46C von DISK1 bis DISK4) mittels R3load in die Datenbank. Wenn das Laden der Datenbank abgeschlossen ist (dieser Vorgang kann einige Stunden dauern!), werden einige Passwörter angefordert. Für Testinstallationen können auch Standard-Passwörter verwendet werden. Liegt Ihnen allerdings etwas an der Sicherheit Ihres Systems, so verwenden Sie andere Passwörter. Frage Eingabe Enter Password for sapr3 sapEnter Confirum Password for sapr3 sapEnter Enter Password for sys change_on_installEnter Confirm Password for sys change_on_installEnter Enter Password for system managerEnter Confirm Password for system managerEnter An diesem Punkt gab es während der 4.6B-Installation einige Probleme mit dipgntab. Listener Starten Sie den &oracle;-Listener als Benutzer orasid wie folgt: &prompt.user; umask 0; lsnrctl start Ansonsten könnten Sie die Meldung ORA-12546 erhalten, da die Sockets nicht über die korrekten Berechtigungen verfügen werden. Lesen Sie dazu auch den &sap;-Hinweis 072984. MNLS-Tabellen aktualisieren Wenn Sie Nicht-Latin-1-Sprachen in das &sap;-System einbauen wollen, müssen Sie die MNLS (Multi National Language Support)-Tabellen aktualisieren. Dies wird in den SAP-OSS-Hinweisen 15023 und 45619 beschrieben. Ansonsten können Sie diese Frage während der &sap;-Installation überspringen. Wenn Sie MNLS nicht benötigen, ist es trotzdem nötig, die Tabelle TCPDB zu überprüfen und zu initialisieren, falls dies nicht bereits geschehen ist. Lesen Sie die &sap;-Hinweise 0015023 und 0045619, falls Sie weitere Informationen benötigen. Abschließende Aufgaben &sap.r3;-Lizenzschlüssel anfordern Sie müssen Ihren &sap.r3;-Lizenzschlüssel anfordern, da die zur Installation verwendete Lizenz nur für vier Wochen gültig ist. Dazu ermitteln Sie zuerst Ihren Hardwareschlüssel. Melden Sie sich als idsadm an und rufen Sie saplicense auf: &prompt.root; /sapmnt/IDS/exe/saplicense -get Wird saplicense ohne Optionen aufgerufen, so erhalten Sie eine Übersicht der möglichen Optionen. Nach Erhalt des Lizenzschlüssels kann dieser installiert werden: &prompt.root; /sapmnt/IDS/exe/saplicense -install Nun müssen Sie folgende Daten eingeben: SAP SYSTEM ID = SID, 3 Zeichen CUSTOMER KEY = Hardware-Schlüssel, 11 Zeichen INSTALLATION NO = Installation, 10 Ziffern EXPIRATION DATE = JJJJMMTT, normalerweise "99991231" LICENSE KEY = Lizenzschlüssel, 24 Zeichen Benutzer anlegen Erzeugen Sie einen Benutzer innerhalb von client 000 (für einige Aufgaben muss dies innerhalb von client 000 erfolgen, aber nicht als Benutzer sap* und ddic). Als Benutzername empfiehlt sich beispielsweise wartung (oder auf Englisch service). Benötigte Profile sind sap_new und sap_all. Aus Sicherheitsgründen sollten die Passwörter der Standardbenutzer in allen Clients geändert werden (dies gilt auch für die Benutzer sap* und ddic). Transportsystem, Profile, Betriebsarten usw. konfigurieren Innerhalb von client 000 führen andere Benutzer als ddic und sap* normalerweise folgende Aufgaben durch: Aufgabe Transaktion Konfiguration des Transportsystems, beispielsweise als Stand-Alone Transport Domain Entity STMS Erstellen und Editieren von Profilen RZ10 Pflege von Betriebsarten und Instanzen RZ04 Diese sowie alle anderen Post-Installationsschritte sind ausführlich in den &sap;-Installationsanleitungen beschrieben. <filename>init<replaceable>sid</replaceable>.sap</filename> (<filename>initIDS.sap</filename>) anpassen Die Datei /oracle/IDS/dbs/initIDS.sap enthält das &sap;-Sicherungsprofil. Hier sind die Größe des verwendeten Band(laufwerks), die Kompressionsart und so weiter festgelegt. Um dieses Profil mit sapdba oder brbackup auszuführen, wurden folgende Werte geändert: compress = hardware archive_function = copy_delete_save cpio_flags = "-ov --format=newc --block-size=128 --quiet" cpio_in_flags = "-iuv --block-size=128 --quiet" tape_size = 38000M tape_address = /dev/nsa0 tape_address_rew = /dev/sa0 Erklärungen: compress: Das verwendete Bandlaufwerk war ein HP DLT1. Dieses unterstützt Hardware-Kompression. archive_function: Hier wird das Standardverhalten beim Sichern von &oracle;-Archivprotokollen festgelegt. Neue Protokolldateien werden auf Band gespeichert, bereits gespeicherte erneut gespeichert und anschließend gelöscht. Dies verhindert eine Vielzahl von Problemen, falls Sie Ihre Datenbank wiederherstellen müssen und dabei feststellen, dass eins Ihrer Archivbänder defekt ist. cpio_flags: Standardmäßig wird verwendet. Dies setzt die Blockgröße auf 5120 Bytes. Für DLT-Bänder werden von HP mindestens 32 K Blockgröße empfohlen, daher wurde hier verwendet, um 64 KB-blöcke zu erzeugen. wurde benötigt, da das Installationssystem über mehr als 65535 Inodes verfügt. Die letzte Option ist notwendig, weil brbackup sich sonst beschwert, wenn die cpio die Anzahl der gespeicherten Blöcke ausgibt. cpio_in_flags: Flags, die zum Laden der Daten vom Band benötigt werden. Das Format wird dabei automatisch erkannt. tape_size: Damit wird die maximale Speicherkapazität des Bandes angegeben. Aus Sicherheitsgründen (das Bandlaufwerk unterstützt Hardware-Kompression) ist dieser Wert geringfügig kleiner als der aktuelle Wert. tape_address: Nicht zurückspulendes Gerät für cpio. tape_address_rew: Zurückspulendes Gerät für cpio. Konfiguration nach Installationsende Die folgenden &sap;-Parameter sollten nach der Installation optimiert werden (die Beispiele gelten für IDES 46B, 1 GB Hauptspeicher): Name Wert ztta/roll_extension 250000000 abap/heap_area_dia 300000000 abap/heap_area_nondia 400000000 em/initial_size_MB 256 em/blocksize_kB 1024 ipc/shm_psize_40 70000000 &sap;-Hinweis 0013026: Name Wert ztta/dynpro_area 2500000 &sap;-Hinweis 0157246: Name Wert rdisp/ROLL_MAXFS 16000 rdisp/PG_MAXFS 30000 Mit obigen Parametern und einem System mit 1 Gigabyte Hauptspeicher, könnte der Speicherverbrauch in etwa so aussehen: Mem: 547M Active, 305M Inactive, 109M Wired, 40M Cache, 112M Buf, 3492K Free Während der Installation auftretende Probleme Neustarten von <command>R3SETUP</command> nach Behebung eines Problems R3SETUP bricht ab, wenn ein Fehler auftritt. Wenn Sie (nach Durchsicht der jeweiligen Protokolldateien) den Fehler behoben haben, müssen Sie R3SETUP erneut aufrufen, indem Sie für den fehlerhaften Schritt als Option REPEAT eingeben. Um R3SETUP erneut zu starten, rufen Sie die Datei einfach mit der entsprechenden R3S-Datei auf: &prompt.root; ./R3SETUP -f CENTRDB.R3S für 4.6B, oder mit &prompt.root; ./R3SETUP -f CENTRAL.R3S für 4.6C, unabhängig davon, ob der Fehler mit CENTRAL.R3S oder mit DATABASE.R3S auftrat. Zu bestimmten Zeitpunkten nimmt R3SETUP an, dass sowohl der Datenbank- als auch die &sap;-Prozesse vorhanden sind und laufen (da dies Schritte sind, die es bereits ausgeführt hat). Sollten Fehler auftreten (z.B. wenn sich die Datenbank nicht starten lässt), müssen Sie sowohl die Datenbank als auch &sap; manuell neu starten, nachdem Sie die Fehler behoben haben. Erst danach darf R3SETUP erneut gestartet werden. Achten Sie auch darauf, den &oracle;-Listener erneut zu starten (als Benutzer orasid mittels umask 0; lsnrctl start), wenn dieser beendet wurde (z.B. durch einen notwendigen Neustart des Systems). Fehler im Stadium OSUSERSIDADM_IND_ORA bei der Ausführung von <command>R3SETUP</command> Wenn sich R3SETUP in diesem Stadium beschwert, editieren Sie die bei der Installation verwendete Version der Vorlage (CENTRDB.R3S (4.6B) oder entweder CENTRAL.R3S oder DATABASE.R3S (4.6C)). Finden Sie [OSUSERSIDADM_IND_ORA] oder suchen Sie nach dem einzigen STATUS=ERROR-Eintrag und ändern Sie die folgenden Werte: HOME=/home/sidadm (war voher leer) STATUS=OK (hatte den Status ERROR) Danach können Sie R3SETUP erneut aufrufen. Fehler im Stadium OSUSERDBSID_IND_ORA bei der Ausführung von <command>R3SETUP</command> Wahrscheinlich beschwert sich R3SETUP auch in diesem Stadium. Der hier auftretende Fehler ähnelt dem im Abschnitt OSUSERSIDADM_IND_ORA. Editieren Sie einfach die bei der Installation verwendete Version der Vorlage (das heißt CENTRDB.R3S (4.6B) oder entweder CENTRAL.R3S oder DATABASE.R3S (4.6C)). Finden Sie [OSUSERDBSID_IND_ORA] oder suchen Sie nach dem einzigen STATUS=ERROR-Eintrag und ändern Sie folgenden Eintrag: STATUS=OK Danach können Sie R3SETUP erneut aufrufen. Fehler <errorname>oraview.vrf FILE NOT FOUND</errorname> bei der &oracle;-Installation Sie haben die Option &oracle; On-Line Text Viewer nicht deaktiviert, bevor Sie die Installation gestartet haben. Per Voreinstellung ist diese Option aktiviert, obwohl sie unter Linux gar nicht verfügbar ist. Deaktivieren Sie daher diese Option im &oracle;-Installationsmenü und starten Sie die Installation erneut. Fehler <errorname>TEXTENV_INVALID</errorname> bei der Ausführung von <command>R3SETUP</command>, RFC oder beim Start von SAPGUI Tritt dieser Fehler auf, so fehlt die korrekte Lokalisierung. &sap;-Hinweis 0171356 führt die notwendigen RPMs auf, die installiert sein müssen (zum Beispiel saplocales-1.0-3, saposcheck-1.0-1 für RedHat 6.1). Falls Sie alle damit verbundenen Fehler ignoriert haben, und bei der Ausführung von R3SETUP den STATUS jeweils von ERROR auf OK (in CENTRDB.R3S) gesetzt haben, um R3SETUP anschließend neu zu starten, wurde das &sap;-System nicht ordnungsgemäß konfiguriert. Das bedeutet, dass Sie nicht via SAPgui am System anmelden können, obwohl das System trotzdem gestartet werden kann. Ein Versuch, sich über die alte Linux-SAPgui anzumelden, führte zu folgenden Fehlermeldungen: Sat May 5 14:23:14 2001 *** ERROR => no valid userarea given [trgmsgo. 0401] Sat May 5 14:23:22 2001 *** ERROR => ERROR NR 24 occured [trgmsgi. 0410] *** ERROR => Error when generating text environment. [trgmsgi. 0435] *** ERROR => function failed [trgmsgi. 0447] *** ERROR => no socket operation allowed [trxio.c 3363] Speicherzugriffsfehler Dieses Verhalten kommt daher, weil &sap.r3; nun nicht in der Lage ist, eine korrekte Lokalisierung zuzuweisen, und sich daher nicht ordnungsgemäß konfigurieren kann (durch fehlende Einträge in einigen Datenbank-Tabellen). Um sich in &sap; anmelden zu können, müssen Sie folgende Einträge zur Datei DEFAULT.PFL (lesen Sie dazu auch Hinweis 0043288) hinzufügen: abap/set_etct_env_at_new_mode = 0 install/collate/active = 0 rscp/TCP0B = TCP0B Starten Sie nun das &sap;-System neu. Sie sind nun in der Lage, sich anzumelden, obwohl einige länderspezifische Spracheinstellungen fehlerhaft sein könnten. Nachdem Sie diese Ländereinstellungen korrigiert (und die korrekten Lokalisierungen installiert) haben, können Sie diese Einträge wieder aus DEFAULT.PFL löschen und das &sap;-System anschließend neu starten. <errorcode>ORA-00001</errorcode> Dieser Fehler trat nur bei einer Installation von &oracle; 8.1.7 unter FreeBSD auf. Dies geschah deshalb, weil sich die &oracle;-Datenbank nicht initialisieren konnte und daher abstürzte. Dadurch verblieben Semaphore und Shared-Memory im System. Der nächste Startversuch führte dann zur Meldung ORA-00001. Suchen Sie diese Semaphore mittels ipcs -a und entfernen Sie sie mit ipcrm. <errorcode>ORA-00445</errorcode> (Hintergrundprozess PMON wurde nicht gestartet) Dieser Fehler trat bei &oracle; 8.1.7 auf. Die Meldung erscheint, wenn die Datenbank mit dem normalen startsap-Skript (zum Beispiel startsap_majestix_00) aber als Benutzer prdadm gestartet wird. Dies kann vermieden werden, indem die Datenbank als Benutzer oraprd über svrmgrl gestartet wird: &prompt.user; svrmgrl SVRMGR> connect internal; SVRMGR> startup; SVRMGR> exit <errorcode>ORA-12546</errorcode> (den Listener mit den richtigen Berechtigungen starten) Starten Sie den &oracle;-Listener als Benutzer oraids mit folgendem Befehl: &prompt.root; umask 0; lsnrctl start Ansonsten könnten Sie die Meldung ORA-12546 erhalten, da die Sockets nun nicht die richtigen Berechtigungen aufweisen. Lesen Sie dazu auch den &sap;-Hinweis 0072984. <errorcode>ORA-27102</errorcode> (kein freier Speicher mehr) Dieser Fehler trat auf, wenn versucht wurde, für MAXDSIZ und DFLDSIZ Werte über 1 GB (1024x1024x1024) festzulegen. Zusätzlich führte dies zur Fehlermeldung Linux Error 12: Cannot allocate memory. Fehler im Stadium [DIPGNTAB_IND_IND] bei der Ausführung von <command>R3SETUP</command> Für allgemeine Informationen lesen Sie bitte den &sap;-Hinweis 0130581 # (R3SETUP - Abbruch im Stadium DIPGNTAB). Bei der IDES-spezifischen Installation verwendete der Installationsprozess aus irgendwelchen Gründen nicht den korrekten &sap;-Systemnamen IDS, sondern den leeren String "". Dies führte zu einigen kleineren Problemen beim Zugriff auf bestimmte Verzeichnisse, da die Pfade durch SID (in diesem Fall IDS) dynamisch generiert werden. Das heißt anstatt auf /usr/sap/IDS/SYS/... /usr/sap/IDS/DVMGS00 zuzugreifen, wurden folgende Pfade verwendet: /usr/sap//SYS/... /usr/sap/D00 Um dennoch mit der Installation fortfahren zu können, wurden ein Link sowie ein zusätzliches Verzeichnis erzeugt: &prompt.root; pwd /compat/linux/usr/sap &prompt.root; ls -l total 4 drwxr-xr-x 3 idsadm sapsys 512 May 5 11:20 D00 drwxr-x--x 5 idsadm sapsys 512 May 5 11:35 IDS lrwxr-xr-x 1 root sapsys 7 May 5 11:35 SYS -> IDS/SYS drwxrwxr-x 2 idsadm sapsys 512 May 5 13:00 tmp drwxrwxr-x 11 idsadm sapsys 512 May 4 14:20 trans Dieses Verhalten wird auch in den &sap;-Hinweisen 0029227 und 0008401 beschrieben. Bei der Installtion von &sap; 4.6C trat allerdings keines dieser Probleme auf. Fehler im Stadium [RFCRSWBOINI_IND_IND] bei der Ausführung von <command>R3SETUP</command> Bei der Installation von &sap; 4.6C trat dieser Fehler als Folge eines anderen, bereits vorher aufgetretenen Fehlers auf. Daher müssen Sie sich die entsprechenden Protokolldateien durchsehen, und danach das wirkliche (bereits vorher aufgetretene) Problem beheben. Wenn Sie nach dem Durchsehen der Protokolldateien feststellen, dass dieser Fehler wirklich der eigentliche Fehler ist (lesen Sie dazu wiederum die &sap;-Hinweise), können Sie den STATUS des betreffenden Schritts von ERROR auf OK setzen (und zwar in der Datei CENTRDB.R3S). Anschließend starten Sie R3SETUP erneut. Nach der Installation müssen Sie den Report RSWBOINS der Transaktion SE38 ausführen. Lesen Sie den &sap;-Hinweis 0162266, um weitere Informationen zu den Stadien RFCRSWBOINI und RFCRADDBDIF zu erhalten. Fehler im Stadium [RFCRADDBDIF_IND_IND] bei der Ausführung von <command>R3SETUP</command> Hier gilt das Gleiche wie für den letzten Fehler. Stellen Sie durch Überprüfen der Protokolldateien sicher, dass dieser Fehler nicht durch ein früheres Problem verursacht wird. Wenn Sie sicher sind, dass &sap;-Hinweis 0162266 auf Ihr System zutrifft, setzen Sie den STATUS des betreffenden Stadiums von ERROR auf OK (und zwar in der Datei CENTRDB.R3S). Anschließend starten Sie R3SETUP erneut. Nach der Installation müssen Sie den Report RADDBDIF der Transaktion SE38 ausführen. sigaction sig31: File size limit exceeded Dieser Fehler trat beim Start des &sap;-Prozesses disp+work auf. Wird &sap; mit startsap-Skript gestartet, werden Subprozesse gestartet, deren Aufgabe es ist, alle anderen &sap;-Prozesse zu starten. Als Folge davon erkennt startsap dabei auftretende Fehler nicht. Um zu überprüfen, ob die &sap;-Prozesse korrekt gestartet wurden, überprüfen Sie den Prozessstatus mit ps ax | grep SID. Sie erhalten dadurch eine Liste aller &oracle;- und &sap;-Prozesse. Wenn einige Prozesse fehlen, oder Sie sich nicht mit dem &sap;-System verbinden können, überprüfen Sie wiederum die entsprechenden Protokolldateien, die sich unter /usr/sap/SID/DVEBMGSnr/work/ befinden. Die zu durchsuchenden Dateien heißen dev_ms und dev_disp. Wenn &oracle; und &sap; mehr Speicher anfordern als in der Kernelkonfigurationsdatei festgelegt wurde, wird das Signal 31 ausgeliefert. Der Fehler kann behoben werden, indem im Kernel ein größerer Wert verwendet wird. # larger value for 46C production systems: options SHMMAXPGS=393216 # smaller value sufficient for 46B: #options SHMMAXPGS=262144 Der Start von <command>saposcol</command> schlug fehl Das Programm saposcol (Version 4.6D) kann einige Probleme verursachen. Das &sap;-System verwendet saposcol, um Daten über die Systemleistung zu sammeln. Für die Benutzung des &sap;-Systems hingegen ist es es nicht erforderlich. Daher handelt es sich hier auch nur um ein kleineres Problem. Ältere Versionen von saposcol (z.B. 4.6B) funktionieren, sammeln allerdings nicht alle Daten (viele Aufrufe geben, zum Beispiel die CPU-Nutzung, einfach 0 (Null) zurück. Weiterführende Themen Wenn Sie sich fragen, wie die Linux-Binärkompatibilität unter FreeBSD realisiert wurde, sollten Sie diesen Abschnitt lesen. Der Großteil der folgenden Informationen stammt aus einer E-Mail, die von Terry Lambert (tlambert@primenet.com) an die FreeBSD-Chat-Mailingliste (freebsd-chat@FreeBSD.org) geschrieben wurde (Message ID: <199906020108.SAA07001@usr09.primenet.com>). Wie funktioniert es? execution class loader FreeBSD verfügt über eine execution class loader genannte Abstraktion. Dabei handelt es sich um einen Eingriff in den &man.execve.2; Systemaufruf. FreeBSD verfügt über eine Liste von Ladern, anstelle eines einzigen, auf #! zurückgreifenden Laders, um Shell-Interpreter oder Shell-Skripte auszuführen. Historisch gesehen untersuchte der einzige, auf UNIX-Plattformen vorhandene Lader die "magische Zahl" (in der Regel die ersten 4 oder 8 Bytes der Datei), um festzustellen, ob der Binärtyp dem System bekannt war. War dies der Fall, wurde der Binärlader aufgerufen. Wenn es sich nicht um den zum System gehörigen Binärtyp handelte, gab &man.execve.2; einen Fehler zurück, und die Shell versuchte stattdessen, die Datei als Shell-Befehl auszuführen. Dabei wurde als Standardeinstellung was auch immer die aktuelle Shell ist festgelegt. Später wurde ein Hack in &man.sh.1; eingefügt, der die zwei ersten Zeichen untersuchte. Wenn diese :\n entsprachen, wurde stattdessen die &man.csh.1;-Shell aufgerufen (wir glauben, dass dies zuerst von SCO umgesetzt wurde). FreeBSD versucht heute eine Liste von Ladern, unter denen sich ein allgemeiner Lader für Interpreter befindet. Der auszuführende Interpreter wird im ersten, durch Leerzeichen getrennten Feld, der #!-Zeile angegeben. Lässt sich der Interpreter nicht ermitteln, wird auf /bin/sh zurückgegriffen. ELF Für die Linux ABI-Unterstützung erkennt FreeBSD die magische Zahl als ELF-Binärdatei (Zu diesem Zeitpunkt wird nicht zwischen FreeBSD, &solaris;, Linux oder anderen Systemen unterschieden, die über ELF-Binärdateien verfügen.). Solaris Der ELF-Lader sucht nach einer speziellen Kennzeichnung, die aus einem Kommentarabschnitt in der ELF-Datei besteht, und die in SVR4/&solaris; ELF Binärdateien nicht vorhanden ist. Damit Linux-Binärdateien (unter FreeBSD) funktionieren, müssen sie als Linux gekennzeichnet werden, und zwar durch &man.brandelf.1;: &prompt.root; brandelf -t Linux file Nachdem dies geschehen ist, erkennt der ELF-Lader die Linux-Kennzeichnung der Datei. ELF brandelf Wenn der ELF-Lader die Linux-Kennzeichnung sieht, wird ein Zeiger in der proc-Struktur ersetzt. Alle Systemaufrufe werden durch diesen Zeiger indiziert (in einem traditionellen &unix; System wäre das ein sysent[]-Strukturfeld, das die Systemaufrufe enthält). Der Prozess wird weiterhin speziell gekennzeichnet, so dass der Trap-vector im Signal-trampoline-code eine spezielle Behandlung erfährt und das Linux-Kernelmodul verschiedene kleinere Korrekturen vornehmen kann. Der Linux-Systemaufrufvektor enthält neben anderen Dingen eine Liste der sysent[]-Einträge, deren Adressen sich im Kernelmodul befinden. Wenn ein Linux-Programm einen Systemaufruf ausführt, dereferenziert die Trap-Behandlungsroutine den Zeiger auf die Eintrittspunkte für die Systemaufrufe und erhält damit die Linux-Eintrittspunkte und nicht die FreeBSD-Eintrittspunkte. Zusätzlich verändert der Linuxmodus die Systempfade dynamisch; genauso, wie dies die Option beim Einbinden von Dateisystemen macht (Achtung: nicht das Dateisystem unionfs!). Zuerst wird die Datei im Verzeichnis /compat/linux/Originalpfad gesucht, danach, wenn sie dort nicht gefunden wurde, wird sie im FreeBSD-Verzeichnis /Originalpfad gesucht. Dadurch wird sichergestellt, dass Binärdateien, die zur Ausführung andere Binärdateien benötigen, ausgeführt werden können (so dass alle Linux-Werkzeuge unter der ABI laufen). Dies bedeutet auch, dass Linux-Binärdateien FreeBSD-Binärdateien laden und ausführen können, wenn keine passenden Linux-Binärdateien vorhanden sind. Ein in /compat/linux plaziertes &man.uname.1; kann damit Linux-Programmen vorgaukeln, dass sie auf einem Linux-System laufen. Im Endeffekt gibt es einen Linux-Kernel innerhalb des FreeBSD-Kernels. Die Sprungtabellen für Linux- beziehungsweise FreeBSD-Systemaufrufe verweisen allerdings auf dieselben Funktionen, die Kerneldienste wie Dateisystemoperationen, Operationen für den virtuellen Speicher, Signalübermittlung und System V IPC bereitstellen, Der einzige Unterschied ist, dass Binärdateien unter FreeBSD FreeBSD-glue-Funktionen verwenden. Linux-Binärdateien hingegen verwenden die Linux-glue-Funktionen. Die meisten älteren Betriebssysteme hatten ihre eigenen glue-Funktionen: Funktionsadressen in einem globalen, statischen sysent[] Strukturfeld an Stelle von Funktionsadressen, die durch einen dynamisch initialisierten Zeiger aus der proc Struktur, die den Aufruf gemacht hatte, dereferenziert wurden. Welche ist die echte FreeBSD-ABI? Das spielt keine Rolle. Grundsätzlich ist der einzige Unterschied (zurzeit ist das so; dies könnte sich in zukünftigen Versionen leicht ändern und wird sich wahrscheinlich auch ändern), dass die FreeBSD-glue-Funktionen statisch in den Kernel gelinkt sind, und dass die Linux-glue-Funktionen statisch gelinkt oder über ein Modul eingebunden werden können. Ja, aber ist das wirkliche eine Emulation? Nein. Es ist eine Implementierung eines ABIs, keine Emulation. Es ist kein Emulator (oder Simulator, um der nächsten Frage zuvorzukommen) beteiligt. Warum wird es manchmal Linux-Emulation genannt? Um es schwerer zu machen, FreeBSD zu verkaufen. Wirklich, das kommt daher, weil dies zu einer Zeit implemtiert wurde, in der es kein anderes Wort (als Emulation) gab, das beschrieb, was vor sich ging. Wenn der Kernel nicht entsprechend konfiguriert wurde oder das Modul geladen wurde, war es falsch zu behaupten, FreeBSD würde Linux-Binärprogramme ausführen. Man benötigte ein Wort, das beschrieb, was da geladen wurde – daher Der Linux-Emulator.
diff --git a/de_DE.ISO8859-1/books/handbook/multimedia/chapter.sgml b/de_DE.ISO8859-1/books/handbook/multimedia/chapter.sgml index 98b80ac557..7677f232ea 100644 --- a/de_DE.ISO8859-1/books/handbook/multimedia/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/multimedia/chapter.sgml @@ -1,1940 +1,1938 @@ Ross Lippert Überarbeitet von Multimedia Übersicht FreeBSD unterstützt viele unterschiedliche Soundkarten, die Ihnen den Genuss von Highfidelity-Klängen auf Ihrem Computer ermöglichen. Dazu gehört unter anderem die Möglichkeit, Tonquellen in den Formaten MPEG Audio Layer 3 (MP3), WAV, Ogg Vorbis und vielen weiteren Formaten aufzunehmen und wiederzugeben. Darüber hinaus enthält die FreeBSD Ports-Sammlung Anwendungen, die Ihnen das Bearbeiten Ihrer aufgenommenen Tonspuren, das Hinzufügen von Klangeffekten und die Kontrolle der angeschlossenen MIDI-Geräte erlauben. Wenn Sie etwas Zeit investieren, können Sie mit &os; auch Videos und DVDs abspielen. Im Vergleich zu Audio-Anwendungen gibt es weniger Anwendungen zum Kodieren, Konvertieren und Abspielen von Video-Formaten. Es gab, als dieses Kapitel geschrieben wurde, keine Anwendung, die einzelne Video-Formate ähnlich wie audio/sox konvertieren konnte. Allerdings ändert sich die Software in diesem Umfeld sehr schnell. In diesem Kapitel wird das Einrichten von Soundkarten besprochen. beschreibt die Installation und Konfiguration von X11 und das Einrichten von Videokarten. Hinweise zur Verbesserung der Wiedergabe finden sich in diesem Kapitel. Dieses Kapitel behandelt die folgenden Punkte: Die Konfiguration des Systems damit Ihre Soundkarte erkannt wird. Wie Sie die Funktion einer Soundkarte testen können. Wie Sie Fehler in den Einstellungen von Soundkarten finden. Wie Sie MP3s und andere Audio-Formate wiedergeben und erzeugen. Die Video-Unterstützung des X-Servers. Gute Anwendungen, die Videos abspielen und kodieren. Die Wiedergabe von DVDs, .mpg- und .avi-Dateien. Wie Sie CDs und DVDs in Dateien rippen. Die Konfiguration von TV-Karten. Das Einrichten von Scannern. Bevor Sie dieses Kapitel lesen, sollten Sie: Wissen, wie Sie einen neuen Kernel konfigurieren und installieren (). Der Versuch eine Audio-CD mit &man.mount.8; einzuhängen erzeugt mindestens einen Fehler; schlimmstenfalls kann es zu einer Kernel-Panic kommen. Die Medien besitzen eine andere Kodierung als normale ISO-Dateisysteme. Moses Moore Von Marc Fonvieille Aktualisiert für &os; 5.X von Benedikt Köhler Übersetzt von Uwe Pierau Soundkarten einrichten Den Soundtreiber einrichten PCI ISA Soundkarten Zunächst sollten Sie in Erfahrung bringen, welches Soundkartenmodell Sie besitzen, welchen Chip die Karte benutzt und ob es sich um eine PCI- oder ISA-Karte handelt. &os; unterstützt eine Reihe von PCI- als auch von ISA-Karten. Die Hardware-Notes zählen alle unterstützten Karten und deren Treiber auf. Kernel Konfiguration Um Ihre Soundkarte benutzen zu können, müssen Sie den richtigen Gerätetreiber laden. Sie haben zwei Möglichkeiten, den Treiber zu laden: Am einfachsten ist es, das Modul mit &man.kldload.8; zu laden. Sie können dazu die Kommandozeile verwenden: &prompt.root; kldload snd_emu10k1 Alternativ können Sie auch einen Eintrag in der Datei /boot/loader.conf erstellen: snd_emu10k1_load="YES" Beide Beispiele gelten für eine Creative &soundblaster; Live! Soundkarte. Weitere ladbare Soundmodule sind in der Datei /boot/defaults/loader.conf aufgeführt. Wenn Sie nicht sicher sind, welchen Gerätetreiber Sie laden müssen, laden Sie den Treiber snd_driver: &prompt.root; kldload snd_driver Der Treiber snd_driver ist ein Meta-Treiber, der alle gebräuchlichen Treiber lädt und die Suche nach dem richtigen Treiber vereinfacht. Weiterhin können alle Treiber über /boot/loader.conf geladen werden. Wollen Sie feststellen, welcher Treiber für Ihre Soundkarte vom Metatreiber snd_driver geladen wurde, sollten Sie sich mit cat /dev/sndstat den Inhalt der Datei /dev/sndstat ansehen. Alternativ können Sie die Unterstützung für die Soundkarte direkt in den Kernel einkompilieren. Diese Methode im nächsten Abschnitt beschrieben. Weiteres über den Bau eines Kernels erfahren Sie im Kapitel Kernelkonfiguration. Soundkarten in der Kernelkonfiguration einrichten Zuerst müssen Sie &man.sound.4;, den Treiber für das Audio-Framework in die Kernelkonfiguration aufnehmen. Fügen Sie dazu die folgende Zeile in die Kernelkonfigurationsdatei ein: device sound Als Nächstes müssen Sie den richtigen Treiber in die Kernelkonfiguration einfügen. Den Treiber entnehmen Sie bitte der Liste der unterstützen Soundkarten aus den Hardware-Notes. Zum Beispiel wird die Creative &soundblaster; Live! Soundkarte vom Treiber &man.snd.emu10k1.4; unterstützt. Für diese Karte verwenden Sie die nachstehende Zeile: device snd_emu10k1 Die richtige Syntax für die Zeile lesen Sie bitte in der Hilfeseite des entsprechenden Treibers nach. Die korrekte Syntax für alle unterstützten Treiber finden Sie außerdem in der Datei /usr/src/sys/conf/NOTES. Nicht PnP-fähige ISA-Soundkarten benötigen (wie alle anderen ISA-Karten auch) weiterhin Angaben zu den Karteneinstellungen (wie IRQ und I/O-Port). Die Karteneinstellungen tragen Sie in die Datei /boot/device.hints ein. Während des Systemstarts liest der &man.loader.8; diese Datei und reicht die Einstellungen an den Kernel weiter. Für eine alte Creative &soundblaster; 16 ISA-Karte, die sowohl den &man.snd.sbc.4;- als auch den snd_sb16-Treiber benötigt, fügen Sie folgende Zeilen in die Kernelkonfigurationsdatei ein: device snd_sbc device snd_sb16 In die Datei /boot/device.hints tragen Sie für diese Karte zusätzlich die folgenden Einstellungen ein: hint.sbc.0.at="isa" hint.sbc.0.port="0x220" hint.sbc.0.irq="5" hint.sbc.0.drq="1" hint.sbc.0.flags="0x15" In diesem Beispiel benutzt die Karte den I/O-Port 0x220 und den IRQ 5. Die Manualpage &man.sound.4; sowie des jeweiligen Treibers beschreiben die Syntax der Einträge in der Datei /boot/device.hints. Das Beispiel verwendet die vorgegebenen Werte. Falls Ihre Karteneinstellungen andere Werte vorgeben, müssen Sie die Werte in der Kernelkonfiguration anpassen. Weitere Informationen zu dieser Soundkarte entnehmen Sie bitte der Manualpage &man.snd.sbc.4;. Die Soundkarte testen Nachdem Sie den neuen Kernel gestartet oder das erforderliche Modul geladen haben, sollte Ihre Soundkarte in den Systemmeldungen (&man.dmesg.8;) auftauchen. Zum Beispiel: pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0 pcm0: [GIANT-LOCKED] pcm0: <Cirrus Logic CS4205 AC97 Codec> Den Status der Karte können Sie über die Datei /dev/sndstat prüfen: &prompt.root; cat /dev/sndstat FreeBSD Audio Driver (newpcm) Installed devices: pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384 kld snd_ich (1p/2r/0v channels duplex default) Die Ausgaben können auf Ihrem System anders aussehen. Wenn das Gerät pcm nicht erscheint, prüfen Sie bitte Ihre Konfiguration. Stellen sie sicher, dass Sie den richtigen Treiber gewählt haben. beschreibt häufig auftretende Probleme. Wenn alles glatt lief, haben Sie nun eine funktionierende Soundkarte. Wenn ein CD-ROM oder DVD-ROM-Laufwerk an Ihrer Soundkarte angeschlossen ist, können Sie jetzt mit &man.cdcontrol.1; eine CD abspielen: &prompt.user; cdcontrol -f /dev/acd0 play 1 Es gibt viele Anwendungen, wie audio/workman, die eine bessere Benutzerschnittstelle besitzen. Um sich MP3-Audiodateien anzuhören, können Sie eine Anwendung wie audio/mpg123 installieren. Eine weitere schnelle Möglichkeit die Karte zu prüfen, ist es, Daten an das Gerät /dev/dsp zu senden: &prompt.user; cat Datei > /dev/dsp Für Datei können Sie eine beliebige Datei verwenden. Wenn Sie einige Geräusche hören, funktioniert die Soundkarte. Die Einstellungen des Mixers können Sie mit dem Kommando &man.mixer.8; verändern. Weiteres lesen Sie bitte in der Hilfeseite &man.mixer.8; nach. Häufige Probleme Device Node Gerätedatei I/O port IRQ DSP Fehler Lösung sb_dspwr(XX) timed out Der I/O Port ist nicht korrekt angegeben. bad irq XX Der IRQ ist falsch angegeben. Stellen Sie sicher, dass der angegebene IRQ mit dem Sound IRQ übereinstimmt. xxx: gus pcm not attached, out of memory Es ist nicht genug Speicher verfügbar, um das Gerät zu betreiben. xxx: can't open /dev/dsp! Überprüfen Sie mit fstat | grep dsp ob eine andere Anwendung das Gerät geöffnet hat. Häufige Störenfriede sind esound oder die Sound-Unterstützung von KDE. Munish Chopra Beigetragen von Mehrere Tonquellen abspielen Oft sollen mehrere Tonquellen gleichzeitig abgespielt werden, auch wenn beispielsweise esound oder artsd das Audiogerät nicht mit einer anderen Anwendung teilen können. Unter FreeBSD können mit &man.sysctl.8; virtuelle Tonkanäle eingerichtet werden. Virtuelle Kanäle mischen die Tonquellen im Kernel (so können mehr Kanäle als von der Hardware unterstützt benutzt werden). Die Anzahl der virtuellen Kanäle können Sie als Benutzer root wie folgt einstellen: &prompt.root; sysctl dev.pcm.0.play.vchans=4 &prompt.root; sysctl dev.pcm.0.rec.vchans=4 &prompt.root; sysctl hw.snd.maxautovchans=4 Im Beispiel werden vier virtuelle Kanäle eingerichtet, eine im Normalfall ausreichende Anzahl. Sowohl dev.pcm.0.play.vchans=4 und dev.pcm.0.rec.vchans=4 sind die Anzahl der virtuellen Kanäle des Geräts pcm0, die fürs Abspielen und Aufnehmen verwendet werden und sie können konfiguriert werden, sobald das Gerät existiert. hw.snd.maxautovchans ist die Anzahl der virtuellen Kanäle, die einem Gerät zugewiesen werden, wenn es durch &man.kldload.8; eingerichtet wird. Da das Modul pcm unabhängig von den Hardware-Treibern geladen werden kann, gibt hw.snd.maxautovchans die Anzahl der virtuellen Kanäle an, die später eingerichtete Geräte erhalten. Lesen Sie dazu &man.pcm.4; für weitere Informationen. Sie können die Anzahl der virtuellen Kanäle nur ändern, wenn das Gerät nicht genutzt wird. Schließen Sie daher zuerst alle Programme (etwa Musikabspielprogramme oder Sound-Daemonen), die auf dieses Gerät zugreifen. Wenn Sie ein System ohne &man.devfs.5; einsetzen, müssen Anwendungen die Geräte /dev/dsp0.x verwenden. Wenn dev.pcm.0.rec.vchans wie oben auf 4 gesetzt wurde, läuft x von 0 bis 3. Auf Systemen mit &man.devfs.5; werden die Geräte automatisch zugeteilt, wenn ein Programm das Gerät /dev/dsp0 anfordert. Josef El-Rayes Beigetragen von Den Mixer einstellen Die Voreinstellungen des Mixers sind im Treiber &man.pcm.4; fest kodiert. Es gibt zwar viele Anwendungen und Dienste, die den Mixer einstellen können und die eingestellten Werte bei jedem Start wieder setzen, am einfachsten ist es allerdings, die Standardwerte für den Mixer direkt im Treiber einzustellen. Der Mixer kann in der Datei /boot/device.hints eingestellt werden: hint.pcm.0.vol="50" Die Zeile setzt die Lautstärke des Mixers beim Laden des Moduls &man.pcm.4; auf den Wert 50. Chern Lee Ein Beitrag von Benedikt Köhler Übersetzt von MP3-Audio MP3 (MPEG Layer 3 Audio) ermöglicht eine Klangwiedergabe in CD-ähnlicher Qualität, was Sie sich auf Ihrem FreeBSD-Rechner nicht entgehen lassen sollten. MP3-Player XMMS (X Multimedia System) ist bei weitem der beliebteste MP3-Player für X11. WinAmp-Skins können auch mit XMMS genutzt werden, da die Benutzerschnittstelle fast identisch mit der von Nullsofts WinAmp ist. Daneben unterstützt XMMS auch eigene Plugins. XMMS kann als multimedia/xmms Port oder Package installiert werden. Die Benutzerschnittstelle von XMMS ist leicht zu erlernen und enthält eine Playlist, einen graphischen Equalizer und vieles mehr. Diejenigen, die mit WinAmp vertraut sind, werden XMMS sehr leicht zu benutzen finden. Der Port audio/mpg123 ist ein alternativer, kommandozeilenorientierter MP3-Player. mpg123 kann ausgeführt werden, indem man das zu benutzende Sound Device und die - abzuspielende MP3-Datei auf der Kommandozeile wie unten - angibt: + abzuspielende MP3-Datei auf der Kommandozeile angibt. Wenn ihr + Sound Device beispielsweise /dev/dsp1.0 lautet + und Sie die MP3-Datei Foobar-GreatestHits.mp3 + hören wollen, geben Sie Folgendes ein: - &prompt.root; mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3 + &prompt.root; mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3 High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3. Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp. Uses code from various people. See 'README' for more! THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! Playing MPEG stream from Foobar-GreatestHits.mp3 ... MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo - - /dev/dsp1.0 - sollten Sie dabei mit dem dsp-Device Ihres - Systems ersetzen. CD-Audio Tracks rippen Bevor man eine ganze CD oder einen CD-Track in das MP3-Format umwandeln kann, müssen die Audiodaten von der CD auf die Festplatte gerippt werden. Dabei werden die CDDA (CD Digital Audio) Rohdaten in WAV-Dateien kopiert. Die Anwendung cdda2wav die im sysutils/cdrtools Paket enthalten ist, kann zum Rippen der Audiodaten und anderen Informationen von CDs genutzt werden. Wenn die Audio CD in dem Laufwerk liegt, können Sie mit folgendem Befehl (als root) eine ganze CD in einzelne WAV-Dateien (eine Datei für jeden Track) rippen: &prompt.root; cdda2wav -D 0,1,0 -B cdda2wav unterstützt auch ATAPI (IDE) CD-ROM-Laufwerke. Um von einem IDE-Laufwerk zu rippen, übergeben Sie auf der Kommandozeile statt der SCSI-IDs den Gerätenamen. Das folgende Kommando rippt den 7. Track: &prompt.root; cdda2wav -D /dev/acd0 -t 7 Der Schalter bezieht sich auf das SCSI Device 0,1,0, das sich aus dem Ergebnis des Befehls cdrecord -scanbus ergibt. Um einzelne Tracks zu rippen, benutzen Sie den Schalter wie folgt: &prompt.root; cdda2wav -D 0,1,0 -t 7 Dieses Beispiel rippt den siebten Track der Audio CD-ROM. Um mehrere Tracks zu rippen, zum Beispiel die Tracks eins bis sieben, können Sie wie folgt einen Bereich angeben: &prompt.root; cdda2wav -D 0,1,0 -t 1+7 Mit &man.dd.1; können Sie ebenfalls Audio-Stücke von ATAPI-Laufwerken kopieren. Dies wird in erläutert. MP3-Dateien kodieren Gegenwärtig ist Lame der meistbenutzte MP3-Encoder. Lame finden Sie unter audio/lame im Ports-Verzeichnis. Benutzen Sie die WAV-Dateien, die sie von CD gerippt haben, und wandeln sie mit dem folgenden Befehl die Datei audio01.wav in audio01.mp3 um: &prompt.root; lame -h -b 128 \ --tt "Foo Liedtitel" \ --ta "FooBar Künstler" \ --tl "FooBar Album" \ --ty "2001" \ --tc "Geripped und kodiert von Foo" \ --tg "Musikrichtung" \ audio01.wav audio01.mp3 128 kbits ist die gewöhnliche MP3-Bitrate. Viele bevorzugen mit 160 oder 192 kbits eine höhere Qualität. Je höher die Bitrate ist, desto mehr Speicherplatz benötigt die resultierende MP3-Datei, allerdings wird die Qualität dadurch auch besser. Der Schalter verwendet den higher quality but a little slower (höhere Qualität, aber etwas langsamer) Modus. Die Schalter, die mit beginnen, sind ID3-Tags, die in der Regel Informationen über das Lied enthalten und in die MP3-Datei eingebettet sind. Weitere Optionen können in der Manualpage von Lame nachgelesen werden. MP3-Dateien dekodieren Um aus MP3-Dateien eine Audio CD zu erstellen, müssen diese in ein nicht komprimiertes WAV-Format umgewandelt werden. Sowohl XMMS als auch mpg123 unterstützen die Ausgabe der MP3-Dateien in unkomprimierte Dateiformate. Dekodieren mit XMMS: Starten Sie XMMS. Klicken Sie mit der rechten Maustaste, um das XMMS-Menu zu öffnen. Wählen Sie Preference im Untermenü Options. Ändern Sie das Output-Plugin in Disk Writer Plugin. Drücken Sie Configure. Geben Sie ein Verzeichnis ein (oder wählen Sie browse), in das Sie die unkomprimierte Datei schreiben wollen. Laden Sie die MP3-Datei wie gewohnt in XMMS mit einer Lautstärke von 100% und einem abgeschalteten EQ. Drücken Sie Play und es wird so aussehen, als spiele XMMS die MP3-Datei ab, aber keine Musik ist zu hören. Der Player überspielt die MP3-Datei in eine Datei. Vergessen Sie nicht, das Output-Plugin wieder in den Ausgangszustand zurückzusetzen um wieder MP3-Dateien anhören zu können. Mit mpg123 nach stdout schreiben: Geben Sie mpg123 -s audio01.mp3 > audio01.pcm ein. XMMS schreibt die Datei im WAV-Format aus während mpg123 die MP3-Datei in rohe PCM-Audiodaten umwandelt. cdrecord kann mit beiden Formaten Audio-CDs erstellen, &man.burncd.8; kann nur rohe PCM-Audiodaten verarbeiten. Der Dateikopf von WAV-Dateien erzeugt am Anfang des Stücks ein Knacken. Sie können den Dateikopf mit dem Werkzeug SoX, das sich als Paket oder aus dem Port audio/sox installieren lässt, entfernen: &prompt.user; sox -t wav -r 44100 -s -w -c 2 track.wav track.raw Lesen Sie in diesem Handbuch, um mehr Informationen zur Benutzung von CD-Brennern mit FreeBSD zu erhalten. Ross Lippert Beigetragen von Videos wiedergeben Die Wiedergabe von Videos ist ein neues, sich schnell entwickelndes, Anwendungsgebiet. Seien Sie geduldig, es wird nicht alles so glatt laufen, wie bei den Audio-Anwendungen. Bevor Sie beginnen, sollten Sie das Modell Ihrer Videokarte und den benutzten Chip kennen. Obwohl &xorg; und &xfree86; viele Videokarten unterstützt, können nur einige Karten Videos schnell genug wiedergeben. Eine Liste der Erweiterungen, die der X-Server für eine Videokarte unterstützt, erhalten Sie unter laufendem X11 mit dem Befehl &man.xdpyinfo.1;. Halten Sie eine kurze MPEG-Datei bereit, mit der Sie Wiedergabeprogramme und deren Optionen testen können. Da einige DVD-Spieler in der Voreinstellung das DVD-Gerät mit /dev/dvd ansprechen oder diesen Namen fest einkodiert haben, wollen Sie vielleicht symbolische Links auf die richtigen Geräte anlegen: &prompt.root; ln -sf /dev/acd0 /dev/dvd &prompt.root; ln -sf /dev/acd0 /dev/rdvd Wegen &man.devfs.5; gehen gesondert angelegte Links wie diese bei einem Neustart des Systems verloren. Damit die symbolischen Links automatisch beim Neustart des Systems angelegt werden, fügen Sie die folgenden Zeilen in /etc/devfs.conf ein: link acd0 dvd link acd0 rdvd Zum Entschlüsseln von DVDs müssen bestimmte DVD-ROM-Funktionen aufgerufen werden und schreibender Zugriff auf das DVD-Gerät erlaubt sein. X11 benutzt Shared-Memory und Sie sollten die nachstehenden &man.sysctl.8;-Variablen auf die gezeigten Werte erhöhen: kern.ipc.shmmax=67108864 kern.ipc.shmall=32768 Video-Schnittstellen XVideo SDL DGA Es gibt einige Möglichkeiten, Videos unter X11 abzuspielen. Welche Möglichkeit funktioniert, hängt stark von der verwendeten Hardware ab. Ebenso hängt die erzielte Qualität von der Hardware ab. Die Videowiedergabe unter X11 ist ein aktuelles Thema, sodass jede neue Version von &xorg; oder von &xfree86; wahrscheinlich erhebliche Verbesserung enthält. Gebräuchliche Video-Schnittstellen sind: X11: normale X11-Ausgabe über Shared-Memory. XVideo: Eine Erweiterung der X11-Schnittstelle, die Videos in jedem X11-Drawable anzeigen kann. SDL: Simple Directmedia Layer. DGA: Direct Graphics Access. SVGAlib: Eine Schnittstelle zur Grafikausgabe auf der Konsole. XVideo Die Erweiterung XVideo (auch Xvideo, Xv oder xv) von &xorg; und &xfree86; 4.X, erlaubt die beschleunigte Wiedergabe von Videos in jedem Drawable. Diese Erweiterung liefert auch auf weniger leistungsfähigen Systemen (beispielsweise einem PIII 400 MHz Laptop) eine gute Wiedergabe. Ob die Erweiterung läuft, entnehmen Sie der Ausgabe von xvinfo: &prompt.user; xvinfo XVideo wird untertsützt, wenn die Ausgabe wie folgt aussieht: X-Video Extension version 2.2 screen #0 Adaptor #0: "Savage Streams Engine" number of ports: 1 port base: 43 operations supported: PutImage supported visuals: depth 16, visualID 0x22 depth 16, visualID 0x23 number of attributes: 5 "XV_COLORKEY" (range 0 to 16777215) client settable attribute client gettable attribute (current value is 2110) "XV_BRIGHTNESS" (range -128 to 127) client settable attribute client gettable attribute (current value is 0) "XV_CONTRAST" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_SATURATION" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_HUE" (range -180 to 180) client settable attribute client gettable attribute (current value is 0) maximum XvImage size: 1024 x 1024 Number of image formats: 7 id: 0x32595559 (YUY2) guid: 59555932-0000-0010-8000-00aa00389b71 bits per pixel: 16 number of planes: 1 type: YUV (packed) id: 0x32315659 (YV12) guid: 59563132-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x30323449 (I420) guid: 49343230-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x36315652 (RV16) guid: 52563135-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x3e0, 0x7c00 id: 0x35315652 (RV15) guid: 52563136-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x7e0, 0xf800 id: 0x31313259 (Y211) guid: 59323131-0000-0010-8000-00aa00389b71 bits per pixel: 6 number of planes: 3 type: YUV (packed) id: 0x0 guid: 00000000-0000-0000-0000-000000000000 bits per pixel: 0 number of planes: 0 type: RGB (packed) depth: 1 red, green, blue masks: 0x0, 0x0, 0x0 Einige der aufgeführten Formate (wie YUV2 oder YUV12) existieren in machen XVideo-Implementierungen nicht. Dies kann zu Problemen mit einigen Spielern führen. XVideo wird wahrscheinlich von Ihrer Karte nicht unterstützt, wenn die die Ausgabe wie folgt aussieht: X-Video Extension version 2.2 screen #0 no adaptors present Wenn die XVideo-Erweiterung auf Ihrer Karte nicht läuft, wird es nur etwas schwieriger, die Anforderungen für die Wiedergabe von Videos zu erfüllen. Abhängig von Ihrer Videokarte und Ihrem Prozessor können Sie dennoch zufriedenstellende Ergebnisse erzielen. Sie sollten vielleicht die weiterführenden Quellen in zu Rate ziehen, um die Geschwindigkeit Ihres Systems zu steigern. Simple Directmedia Layer Die Simple Directmedia Layer, SDL, ist eine zwischen µsoft.windows;, BeOS und &unix; portable Schnittstelle. Mit dieser Schnittstelle können Anwendungen plattformunabhängig und effizient Ton und Grafik benutzen. SDL bietet eine hardwarenahe Schnittstelle, die manchmal schneller als die X11-Schnittstelle sein kann. SDL finden Sie in den Ports im Verzeichnis devel/sdl12. Direct Graphics Access Die X11-Erweiterung Direct Graphics Access (DGA) erlaubt es Anwendungen, am X-Server vorbei direkt in den Framebuffer zu schreiben. Da die Anwendung und der X-Server auf gemeinsame Speicherbereiche zugreifen, müssen die Anwendungen unter dem Benutzer root laufen. Die DGA-Erweiterung kann mit &man.dga.1; getestet werden. Das Kommando dga wechselt, jedes Mal wenn eine Taste gedrückt wird, die Farben der Anzeige. Sie können das Programm mit der Taste q verlassen. Video-Anwendungen Video-Anwendungen Dieser Abschnitt behandelt Anwendungen aus der &os;-Ports-Sammlung, die Videos abspielen. An der Videowiedergabe wird derzeit aktiv gearbeitet, sodass der Funktionsumfang der Anwendungen von dem hier beschriebenen abweichen kann. Viele unter &os; laufende Videoanwendungen wurden unter Linux entwickelt und befinden sich noch im Beta-Status. Der Betrieb dieser Anwendungen unter &os; stößt vielleicht auf einige der nachstehenden Probleme: Eine Anwendung kann eine Datei einer anderen Anwendung nicht abspielen. Eine Anwendung kann eine selbst produzierte Datei nicht abspielen. Wenn dieselbe Anwendung auf unterschiedlichen Maschinen gebaut wird, wird ein Video unterschiedlich wiedergegeben. Ein vergleichsweise einfacher Filter, wie die Skalierung eines Bildes, führt zu deutlichen Artefakten in der Darstellung. Eine Anwendung stürzt häufig ab. Die Dokumentation wird bei der Installation des Ports nicht installiert. Sie befindet sich entweder auf dem Internet oder im Verzeichnis work des Ports. Viele Anwendungen sind zudem sehr Linux-lastig. Probleme entstehen durch die Implementierung von Standard-Bibliotheken in Linux-Distributionen oder dadurch, dass die Anwendung bestimmte Linux-Kernelfunktionen voraussetzt. Diese Probleme werden nicht immer vom Betreuer eines Ports bemerkt und umgangen. In der Praxis entstehen dadurch folgende Probleme: Eigenschaften des Prozessors werden über /proc/cpuinfo ermittelt. Die falsche Anwendung von Threads führt dazu, dass sich ein Programm aufhängt statt sich zu beenden. Die Anwendung hängt von anderen Anwendungen ab, die sich noch nicht in der &os;-Ports-Sammlung befinden. Allerdings arbeiten die Anwendungsentwickler bislang mit den Betreuern der Ports zusammen, sodass zusätzlicher Portierungsaufwand minimiert wird. MPlayer MPlayer ist ein kürzlich entstandener und sich stark weiterentwickelnder Video-Spieler. Das Hauptaugenmerk des MPlayer-Teams liegt auf Geschwindigkeit und Flexibilität auf Linux und anderen &unix; Systemen. Das Projekt entstand weil der Gründer des Teams unzufrieden mit der Geschwindigkeit bestehender Video-Spieler war. Kritiker behaupten, dass die Benutzeroberfläche der einfachen Gestaltung zum Opfer fiel. Wenn Sie sich allerdings erstmal an die Kommandozeilenoptionen und die Tastensteuerung gewöhnt haben, funktioniert die Anwendung sehr gut. MPlayer bauen MPlayer bauen MPlayer finden Sie in der Ports-Sammlung unter multimedia/mplayer. Der Bau von MPlayer berücksichtigt die vorhandene Harware und erzeugt ein Programm, das nicht auf ein anderes System übertragbar ist. Es ist daher wichtig, dass Sie das Programm aus den Ports bauen und nicht das fertige Paket installieren. Zusätzlich können Sie auf der Kommandozeile von make noch einige Optionen angeben, die im Makefile beschrieben sind und am die Anfang des Baus ausgegeben werden: &prompt.root; cd /usr/ports/multimedia/mplayer &prompt.root; make N - O - T - E Take a careful look into the Makefile in order to learn how to tune mplayer towards you personal preferences! For example, make WITH_GTK1 builds MPlayer with GTK1-GUI support. If you want to use the GUI, you can either install /usr/ports/multimedia/mplayer-skins or download official skin collections from http://www.mplayerhq.hu/homepage/dload.html Für die meisten Benutzer sind die voreingestellten Option in Ordnung. Wenn Sie den XviD-Codec benötigen, müssen Sie auf der Kommandozeile die Option WITH_XVID angeben. Das DVD-Gerät können Sie mit der Option WITH_DVD_DEVICE angeben. Wenn Sie die Option nicht angeben, wird /dev/acd0 benutzt. Als dieser Abschnitt verfasst wurde, baute der MPlayer-Port die HTML-Dokumentation sowie die beiden Programme mplayer und mencoder. Mit mencoder können Sie Videodateien umwandeln. Die HTML-Dokumentation von MPlayer ist sehr lehrreich. Wenn Sie in diesem Kapitel Informationen über Video-Hardware oder Schnittstellen vermissen, ist die MPlayer-Dokumentation eine ausgezeichnete Quelle. Wenn Sie Informationen über die Video-Unterstützung unter &unix; benötigen, sollten Sie die MPlayer-Dokumentation auf jeden Fall lesen. MPlayer benutzen MPlayer benutzen Jeder Benutzer von MPlayer muss in seinem Heimatverzeichnis das Verzeichnis .mplayer anlegen. Dieses Verzeichnis können Sie wie folgt anlegen: &prompt.user; cd /usr/ports/multimedia/mplayer &prompt.user; make install-user Die Kommandozeilenoptionen von mplayer sind in der Hilfeseite aufgeführt. Eine genaue Beschreibung befindet sich in der HTML-Dokumentation. In diesem Abschnitt wird nur der normale Gebrauch von mplayer beschrieben. Um eine Datei, wie testfile.avi, unter verschiedenen Video-Schnittstellen abzuspielen, benutzen Sie die Option : &prompt.user; mplayer -vo xv testfile.avi &prompt.user; mplayer -vo sdl testfile.avi &prompt.user; mplayer -vo x11 testfile.avi &prompt.root; mplayer -vo dga testfile.avi &prompt.root; mplayer -vo 'sdl:dga' testfile.avi Es lohnt sich, alle Option zu testen. Die erzielte Geschwindigkeit hängt von vielen Faktoren ab und variiert beträchtlich je nach eingesetzter Hardware. Wenn Sie eine DVD abspielen wollen, ersetzen Sie testfile.avi durch . N ist die Nummer des Stücks, das Sie abspielen wollen und Gerät gibt den Gerätenamen des DVD-ROMs an. Das nachstehende Kommando spielt das dritte Stück von /dev/dvd: &prompt.root; mplayer -vo dga -dvd://3 /dev/dvd Das standardmäßig verwendete DVD-Laufwerk kann beim Bau des MPlayer-Ports mit der Option WITH_DVD_DEVICE festgelegt werden. Die Voreinstellung verwendet das Gerät /dev/acd0. Genaueres finden Sie im Makefile des Ports. Die Tastenkombinationen zum Abbrechen, Anhalten und Weiterführen der Wiedergabe entnehmen Sie bitte der Ausgabe von mplayer -h oder der Hilfeseite. Weitere nützliche Optionen für die Wiedergabe sind zur Wiedergabe im Vollbild-Modus und zur Steigerung der Geschwindigkeit. Damit die Kommandozeile von mplayer kurz bleibt, kann ein Benutzer Vorgaben in der Datei .mplayer/config hinterlegen: vo=xv fs=yes zoom=yes Schließlich kann mplayer noch DVD-Stücke in .vob-Dateien rippen. Das zweite Stück einer DVD wandeln Sie wie folgt in eine Datei um: &prompt.root; mplayer -dumpstream -dumpfile out.vob -dvd://2 /dev/dvd Die Ausgabedatei out.vob wird im MPEG-Format abgespeichert und kann mit anderen Werkzeugen aus diesem Abschnitt bearbeitet werden. mencoder mencoder Sie sollten die HTML-Dokumentation lesen, bevor Sie mencoder benutzen. Es gibt zwar eine Hilfeseite, die aber ohne die HTML-Dokumentation nur eingeschräkt nützlich ist. Es gibt viele Möglichkeiten die Qualität zu verbessern, die Bitrate zu verringern und Formate zu konvertieren. Einige davon haben erhebliche Auswirkungen auf die Geschwindigkeit der Wiedergabe. Zum Start finden Sie im Folgenden einige Kommandozeilen. Die erste kopiert einfach eine Datei: &prompt.user; mencoder input.avi -oac copy -ovc copy -o output.avi Falsche Kombinationen von Kommandozeilenparametern ergeben eventuell Dateien, die selbst mplayer nicht mehr abspielen kann. Wenn Sie in eine Datei rippen, sollten Sie daher auf jeden Fall die Option von mplayer verwenden. Die nachstehende Kommandozeile wandelt die Datei input.avi nach MPEG4 mit MPEG3 für den Ton um (hierfür wird der Ports audio/lame benötigt): &prompt.user; mencoder input.avi -oac mp3lame -lameopts br=192 \ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi Die Ausgabedatei lässt sowohl mit mplayer als auch xine abspielen. Wenn Sie input.avi durch ersetzen und das Kommando unter root laufen lassen, können Sie ein DVD-Stück direkt konvertieren. Da Sie wahrscheinlich beim ersten Mal unzufrieden mit den Ergebnissen sind, sollten Sie das Stück zuerst in eine Datei schreiben und anschließend die Datei weiterverarbeiten. Der Video-Spieler xine Der Video-Spieler xine ist ein Projekt mit großem Umfang. Das Projekt will nicht nur ein Programm für alle Video-Anwendungen bieten, sondern auch eine wiederverwendbare Bibliothek und ein Programm, das durch Plugins erweiterbar ist. Das Programm steht als fertiges Paket oder als Port unter multimedia/xine zur Verfügung. Der multimedia/xine-Spieler hat noch ein paar Ecken und Kanten, macht aber insgesamt einen guten Eindruck. Für einen reibungslosen Betrieb benötigt xine entweder eine schnelle CPU oder die XVideo-Erweiterung. Das GUI ist etwas schwerfällig. Zurzeit gibt es kein xine-Modul, das CSS-kodierte DVDs abspielen kann und sich in der &os; Ports-Sammlung befindet. xine ist benutzerfreundlicher als MPlayer, bietet allerdings nicht soviele Möglichkeiten. Am schnellsten läuft xine mit der XVideo-Erweiterung. In der Voreinstellung startet xine eine grafische Benutzeroberfläche. Über Menüs können Sie Dateien öffnen: &prompt.user; xine Alternativ können Sie das Programm auch ohne GUI aufrufen und Dateien direkt abspielen: &prompt.user; xine -g -p mymovie.avi Die transcode-Werkzeuge transcode ist kein Spieler, sondern eine Sammlung von Werkzeugen zur Umwandlung von Video- und Sounddateien. transcode mischt Video-Dateien und kann kaputte Video-Dateien reparieren. Die Werkzeuge werden als Filter verwendet, das heißt die Ein- und Ausgaben verwenden stdin/stdout. Beim Bau von transcode über den Port multimedia/transcode können zwar zahreiche Optionen angegeben werden. Empfehlenswert ist es aber, den Bau mit folgendem Befehl zu starten: &prompt.root; make WITH_OPTIMIZED_CFLAGS=yes WITH_LIBA52=yes WITH_LAME=yes WITH_OGG=yes \ WITH_MJPEG=yes -DWITH_XVID=yes Diese Einstellungen sollen für die meisten Anwender ausreichend sein. Um die Fähigkeiten von transcode zu illustrieren, wird im folgenden Beispiel eine DivX-Datei in eine PAL MPEG-1-Datei konvertiert: &prompt.user; transcode -i input.avi -V --export_prof vcd-pal -o output_vcd &prompt.user; mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa Die daraus resultierende MPEG-Datei, output_vcd.mpg, kann beispielsweise mit MPlayer abgespielt werden. Sie können sie sogar als Video-CD auf eine CD-R brennen. Wenn Sie diese Funktion benötigen, müssen Sie zusätzlich die beiden Programme multimedia/vcdimager und sysutils/cdrdao installieren. Zwar gibt es eine Manualpage zu transcode, Sie sollen aber auf jeden Fall auch die Informationen und Beispiele im transcode-Wiki lesen. Weiterführende Quellen Die Video-Software für &os; entwickelt sich sehr schnell. Es ist wahrscheinlich, dass die hier angesprochenen Probleme bald gelöst sind. Bis dahin müssen Anwender, die das meiste aus den Audio- und Video-Fähigkeiten von &os; machen wollen, Informationen aus mehreren FAQs und Tutorien zusammensuchen und verschiedene Anwendungen nebeneinander betreiben. Dieser Abschnitt weist auf weitere Informationsquellen hin. Die MPlayer-Dokumentation ist sehr aufschlussreich. Die Dokumente sollten wahrscheinlich von jedem gelesen werden, der hohe Fachkenntnisse über Video auf &unix; Systemen erlangen will. Die MPlayer-Mailinglisten reagiert feindselig auf Personen, die es nicht für nötig halten, die Dokumentation zu lesen. Wenn Sie Fehlerberichte an die Liste schicken wollen, lesen Sie bitte vorher die ausgezeichnete Dokumentation (RTFM). Das xine HOWTO enthält allgemein gültige Hinweise zur Verbesserung der Wiedergabegeschwindigkeit. Schließlich gibt es noch weitere vielversprechende Anwendungen, die Sie vielleicht ausprobieren wollen: Avifile gibt es schon als Port multimedia/avifile. Ogle wurde ebenfalls schon portiert: multimedia/ogle. Xtheater. multimedia/dvdauthor, ist ein Open-Source-Paket, mit dem Sie DVDs erstellen können. Josef El-Rayes Beigetragen von Marc Fonvieille Überarbeitet von TV-Karten einrichten TV-Karten Einführung Mit TV-Karten können Sie mit Ihrem Rechner über Kabel oder Antenne fernsehen. Die meisten Karten besitzen einen RCA- oder S-Video-Eingang. Einige Karten haben auch einen FM-Radio-Empfänger. Der &man.bktr.4;-Treiber von &os; unterstützt PCI-TV-Karten mit einem Brooktree Bt848/849/878/879 oder einem Conexant CN-878/Fusion 878a Chip. Die Karte sollte einen der unterstützten Empfänger besitzen, die in der Hilfeseite &man.bktr.4; aufgeführt sind. Den Treiber einrichten Um Ihre Karte zu benutzen, müssen Sie den &man.bktr.4;-Treiber laden. Fügen Sie die nachstehende Zeile in die Datei /boot/loader.conf ein: bktr_load="YES" Sie können den Treiber für die TV-Karte auch fest in den Kernel compilieren. Erweitern Sie dazu Ihre Kernelkonfiguration um die folgenden Zeilen: device bktr device iicbus device iicbb device smbus Die zusätzlichen Treiber werden benötigt, da die Komponenten der Karte über einen I2C-Bus verbunden sind. Bauen und installieren Sie dann den neuen Kernel. Anschließend müssen Sie Ihr System neu starten. Während des Neustarts sollte Ihre TV-Karte erkannt werden: bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0 iicbb0: <I2C bit-banging driver> on bti2c0 iicbus0: <Philips I2C bus> on iicbb0 master-only iicbus1: <Philips I2C bus> on iicbb0 master-only smbus0: <System Management Bus> on bti2c0 bktr0: Pinnacle/Miro TV, Philips SECAM tuner. Abhängig von Ihrer Hardware können die Meldungen natürlich anders aussehen. Sie sollten aber prüfen, dass der Empfänger richtig erkannt wird. Die entdeckten Geräte lassen sich mit &man.sysctl.8; oder in der Kernelkonfigurationsdatei überschreiben. Wenn Sie beispielsweise einen Philips-SECAM-Empfänger erzwingen wollen, fügen Sie die folgende Zeile zur Kernelkonfigurationsdatei hinzu: options OVERRIDE_TUNER=6 Alternativ können Sie direkt &man.sysctl.8; benutzen: &prompt.root; sysctl hw.bt848.tuner=6 Weitere Informationen zu den verschiedenen Optionen finden Sie in &man.bktr.4; sowie in der Datei /usr/src/sys/conf/NOTES. Nützliche Anwendungen Um die TV-Karte zu benutzen, müssen Sie eine der nachstehenden Anwendungen installieren: multimedia/fxtv lässt das Fernsehprogramm in einem Fenster laufen und kann Bilder, Audio und Video aufzeichnen. multimedia/xawtv eine weitere TV-Anwendung, mit den gleichen Funktionen wie fxtv. misc/alevt dekodiert und zeigt Videotext/Teletext an. Mit audio/xmradio lässt sich der FM-Radio-Empfänger, der sich auf einigen TV-Karten befindet, benutzen. audio/wmtune ein leicht zu bedienender Radio-Empfänger. Weitere Anwendungen finden Sie in der &os; Ports-Sammlung. Fehlersuche Wenn Sie Probleme mit Ihrer TV-Karte haben, prüfen Sie zuerst, ob der Video-Capture-Chip und der Empfänger auch wirklich vom &man.bktr.4;-Treiber unterstützt werden. Prüfen Sie dann, ob Sie die richtigen Optionen verwenden. Weitere Hilfe erhalten Sie auf der Mailingliste &a.multimedia.name; und in deren Archiven. Marc Fonvieille Beigetragen von Scanner Scanner Einführung Unter &os; stellt SANE (Scanner Access Now Easy) aus der Ports-Sammlung eine einheitliche Schnittstelle (API) für den Zugriff auf Scanner bereit. SANE wiederum greift auf Scanner mithilfe einiger &os;-Treiber zu. &os; unterstützt sowohl SCSI- als auch USB-Scanner. Prüfen Sie vor der Konfiguration mithilfe der Liste der unterstützten Geräte ob Ihr Scanner von SANE unterstützt wird. Die Hilfeseite &man.uscanner.4; zählt ebenfalls die unterstützten USB-Scanner auf. Den Kernel für Scanner einrichten Da sowohl SCSI- als auch USB-Scanner unterstützt werden, werden abhängig von der Schnittstelle unterschiedliche Treiber benötigt. USB-Scanner Im GENERIC-Kernel sind schon alle, für einen USB-Scanner notwendigen, Treiber enthalten. Wenn Sie einen angepassten Kernel benutzen, prüfen Sie, dass die Kernelkonfiguration die nachstehenden Zeilen enthält: device usb device uhci device ohci device uscanner Abhängig vom Chipsatz Ihrer Systemplatine benötigen Sie in der Kernelkonfiguration entweder die Option device uhci oder die Option device ohci. Die Kernelkonfiguration kann allerdings auch beide Optionen enthalten. Wenn Sie den Kernel nicht neu bauen wollen und einen angepassten Kernel verwenden, können Sie den Treiber &man.uscanner.4; direkt mit dem Kommando &man.kldload.8; laden: &prompt.root; kldload uscanner Wenn Sie das Modul bei jedem Systemstart laden wollen, fügen Sie in der Datei /boot/loader.conf die nachstehende Zeile hinzu: uscanner_load="YES" Nachdem Sie das System mit dem richtigen Kernel neu gestartet oder das Modul geladen haben, stecken Sie den USB-Scanner ein. Danach sollte in den Systemmeldungen (die Sie mit &man.dmesg.8; betrachten können) eine Zeile ähnlich der folgenden erscheinen: uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2 Diese Meldung besagt, dass der Scanner die Gerätedatei /dev/uscanner0 benutzt. SCSI-Scanner Wenn Ihr Scanner eine SCSI-Schnittstelle besitzt, ist die Kernelkonfiguration abhängig vom verwendeten SCSI-Controller. Der GENERIC-Kernel unterstützt die gebräuchlichen SCSI-Controller. Den richtigen Treiber finden Sie in der Datei NOTES. Neben dem Treiber muss Ihre Kernelkonfiguration noch die nachstehenden Zeilen enthalten: device scbus device pass Nachdem Sie einen Kernel gebaut und installiert haben, sollte der Scanner beim Neustart in den Systemmeldungen erscheinen: pass2 at aic0 bus 0 target 2 lun 0 pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device pass2: 3.300MB/s transfers Wenn der Scanner während des Systemstarts ausgeschaltet war, können Sie die Geräteerkennung erzwingen, indem Sie den SCSI-Bus erneut absuchen. Verwenden Sie dazu das Kommando &man.camcontrol.8;: &prompt.root; camcontrol rescan all Re-scan of bus 0 was successful Re-scan of bus 1 was successful Re-scan of bus 2 was successful Re-scan of bus 3 was successful Der Scanner wird anschließend in der SCSI-Geräteliste angezeigt: &prompt.root; camcontrol devlist <IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0) <IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1) <AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3) <PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0) Weiteres über SCSI-Geräte lesen Sie bitte in den Hilfeseiten &man.scsi.4; und &man.camcontrol.8; nach. SANE konfigurieren SANE besteht aus zwei Teilen, den Backends (graphics/sane-backends) und den Frontends (graphics/sane-frontends). Das Backend greift auf den Scanner zu. Welches Backend welchen Scanner unterstützt, entnehmen Sie der Liste der unterstützten Geräte.. Der Betrieb eines Scanners ist nur dem richtigen Backend möglich. Die Frontends sind die Anwendungen, mit denen gescannt wird (xscanimage). Installieren Sie zuerst den Port oder das Paket graphics/sane-backends. Anschließend können Sie mit dem Befehl sane-find-scanner prüfen, ob SANE Ihren Scanner erkennt: &prompt.root; sane-find-scanner -q found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3 Die Ausgabe zeigt die Schnittstelle und die verwendete Gerätedatei des Scanners. Der Hersteller und das Modell können in der Ausgabe fehlen. Bei einigen USB-Scannern müssen Sie die Firmware aktualisieren, dies wird in der Hilfeseite des Backends erklärt. Lesen Sie bitte auch die Hilfeseiten &man.sane-find-scanner.1; und &man.sane.7;. Als nächstes müssen Sie prüfen, ob der Scanner vom Frontend erkannt wird. Die SANE-Backends werden mit dem Kommandozeilenwerkzeug &man.scanimage.1; geliefert. Mit diesem Werkzeug können Sie sich Scanner anzeigen lassen und den Scan-Prozess von der Kommandozeile starten. Die Option zeigt die Scanner an: &prompt.root; scanimage -L device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner Erscheint die Meldung, dass kein Scanner gefunden wurde oder wird gar keine Ausgabe erzeugt, konnte &man.scanimage.1; keinen Scanner erkennen. In diesem Fall müssen Sie in der Konfigurationsdatei des Backends das zu benutzende Gerät eintragen. Die Konfigurationsdateien der Backends befinden sich im Verzeichnis /usr/local/etc/sane.d/. Erkennungsprobleme treten bei bestimmten USB-Scannern auf. Mit dem USB-Scanner aus zeigt sane-find-scanner die folgende Ausgabe: &prompt.root; sane-find-scanner -q found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0 Der Scanner wurde richtig erkennt, er benutzt eine USB-Schnittstelle und verwendet die Gerätedatei /dev/uscanner0. Ob der Scanner vom Frontend erkannt wird, zeigt das nachstehende Kommando: &prompt.root; scanimage -L No scanners were identified. If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate). Please read the documentation which came with this software (README, FAQ, manpages). Da der Scanner nicht erkannt wurde, muss die Datei /usr/local/etc/sane.d/epson.conf editiert werden. Der verwendete Scanner war ein &epson.perfection; 1650, daher wird das epson-Backend benutzt. Lesen Sie bitte alle Kommentare in der Konfigurationsdatei des Backends. Die durchzuführenden Änderungen sind einfach. Kommentieren Sie zunächst alle Zeilen mit der falschen Schnittstelle aus. Da der Scanner eine USB-Schnittstelle besitzt, wurden im Beispiel alle Zeilen, die mit scsi anfingen, auskommentiert. Fügen Sie dann die Schnittstelle und den Gerätenamen am Ende der Datei ein. In diesem Beispiel wurde die nachstehende Zeile eingefügt: usb /dev/uscanner0 Weitere Hinweise entnehmen Sie bitte der Hilfeseite des Backends. Jetzt können Sie prüfen, ob der Scanner richtig erkannt wird: &prompt.root; scanimage -L device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner Der Scanner wurde nun erkannt. Es ist nicht wichtig, ob der Hersteller oder das Modell Ihres Scanners korrekt angezeigt werden. Wichtig ist nur die Ausgabe `epson:/dev/uscanner0', die das richtige Backend und den richtigen Gerätenamen anzeigt. Wenn scanimage -L den Scanner erkannt hat, ist der Scanner eingerichtet und bereit, zu scannen. Obwohl wir mit &man.scanimage.1; von der Kommandozeile scannen können, ist eine graphische Anwendung zum Scannen besser geeignet. SANE bietet ein einfaches und effizientes Werkzeug: xscanimage (graphics/sane-frontends). Xsane (graphics/xsane) ist eine weitere beliebte graphische Anwendung. Dieses Frontend besitzt erweiterte Funktionen wie den Scan-Modus (beispielsweise Photo, Fax), eine Farbkorrektur und Batch-Scans. Beide Anwendungen lassen sich als GIMP-Plugin verwenden. Den Scanner für Benutzerkonten freigeben Vorher wurden alle Tätigkeiten mit root-Rechten ausgeführt. Wenn andere Benutzer den Scanner benutzen sollen, müssen sie Lese- und Schreibrechte auf die Gerätedatei des Scanners besitzen. Im Beispiel wird die Datei /dev/uscanner0 verwendet, die der Gruppe operator gehört. Damit der Benutzer joe auf den Scanner zugreifen kann, muss das Konto in die Gruppe operator aufgenommen werden: &prompt.root; pw groupmod operator -m joe Weiteres entnehmen Sie bitte der Hilfeseite &man.pw.8;. Da Mitglieder der Gruppe operator in der Voreinstellung nur Leserechte für die Gerätedatei /dev/uscanner0 besitzen, müssen Sie ebenfalls die Schreibbrechtigung (0660 oder 0664) vergeben. Dazu fügen Sie in die Datei /etc/devfs.rules die nachstehenden Zeilen ein: [system=5] add path uscanner0 mode 660 In die Datei /etc/rc.conf fügen Sie noch die folgende Zeile ein: devfs_system_ruleset="system" Starten Sie anschließend Ihr System neu. Weitere Informationen finden Sie in &man.devfs.8;. Aus Sicherheitsgründen sollten Sie genau darauf achten, wen Sie in eine Gruppe aufnehmen, besonders wenn es sich um die Gruppe operator handelt. diff --git a/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml b/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml index 0bd81f1dcf..5cfaab87b2 100644 --- a/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml +++ b/de_DE.ISO8859-1/books/handbook/virtualization/chapter.sgml @@ -1,1059 +1,1184 @@ Murray Stokely Beigetragen von Oliver Peter Übersetzt von Virtualisierung Übersicht Virtualisierungssoftware erlaubt es, mehrere Betriebssysteme gleichzeitig auf dem selben Computer laufen zu lassen. Derartige Softwaresysteme für PCs setzen in der Regel ein Host-Betriebssystem voraus, auf dem die Virtualisierungssoftware läuft und unterstützen eine nahezu beliebige Anzahl von Gast-Betriebssystemen. Nachdem Sie dieses Kapitel gelesen haben, Kennen Sie den Unterscheid zwischen einem Host-Betriebssystem und einem Gast-Betriebssystem. Können Sie FreeBSD auf einem &intel;-basierenden &apple; &macintosh; installieren. Wissen Sie, wie man FreeBSD unter Linux mit &xen; installiert. Können Sie FreeBSD unter µsoft.windows; und Virtual PC installieren. Wissen Sie, wie man ein virtualisiertes FreeBSD-System für optimale Leistung konfiguriert. Bevor Sie dieses Kapitel lesen, sollten Sie Die Grundlagen von &unix; und FreeBSD verstehen (). FreeBSD installieren können (). Wissen, wie man seine Netzwerkverbindung konfiguriert (). Software Dritter installieren können (). FreeBSD als Gast-Betriebssystem Parallels unter MacOS X Parallels Desktop für &mac; ist ein kommerzielles Softwareprodukt, welches für &intel;-basierende &apple; &mac;-Computer mit &macos; X 10.4.6 oder höher verfügbar ist. FreeBSD wird von diesem Softwarepaket als Gast-Betriebssystem vollständig unterstützt. Nach der Installation von Parallels auf &macos; X konfigurieren Sie als erstes eine virtuelle Maschine, in der Sie danach das gewünschte Gast-Betriebssystem (in unserem Fall FreeBSD) installieren. Installation von FreeBSD unter Parallels/&macos; X Der erste Schritt bei der Installation von FreeBSD unter Parallels/&macos; X ist es, eine virtuelle Maschine zu konfigurieren, in der Sie FreeBSD installieren können. Dazu wählen Sie bei der Frage nach dem Guest OS Type FreeBSD aus: Danach legen Sie geeignete Größen für Festplatten- und Arbeitsspeicher für die zu erstellende FreeBSD-Instanz fest. 4 GB Plattenplatz sowie 512 MB RAM sind in der Regel für die Arbeit unter Parallels ausreichend: Wählen Sie den gewünschten Netzwerktyp aus und konfigurieren Sie Ihre Netzwerkverbindung: Speichern Sie Ihre Eingaben, um die Konfiguration abzuschließen: Nachdem Sie die virtuelle Maschine erstellt haben, installieren Sie im nächsten Schritt FreeBSD in dieser virtuellen Maschine. Dazu verwenden Sie am besten eine offizielle FreeBSD-CDROM oder Sie laden von einem offiziellen FTP-Server ein ISO-Abbild auf Ihren &mac; herunter. Danach klicken Sie auf das Laufwerksymbol in der rechten unteren Ecke des Parallels-Fensters, um ihr virtuelles Laufwerk mit dem ISO-Abbild oder mit dem physikalischen CD-ROM-Laufwerk ihres Computers zu verknüpfen. Nachdem Sie diese Verknüpfung hergestellt haben, starten sie die virtuelle FreeBSD-Maschine neu, indem Sie wie gewohnt auf das Symbol "Neustarten" klicken. Parallels startet nun ein Spezial-BIOS, das zuerst prüft, ob Sie eine CD-ROM eingelegt haben (genau so, wie es auch ein echtes BIOS machen würde). In unserem Fall findet das BIOS ein FreeBSD-Installationsmedium und beginnt daher eine normale Installation mit sysinstall (wie in des Handbuchs beschreiben). Nachdem die Installation abgeschlossen ist, können Sie die virtuelle Maschine starten. FreeBSD für den Einsatz unter Parallels/&macos; X optimieren Nachdem Sie FreeBSD erfolgreich unter &macos; X mit Parallels installiert haben, sollten Sie ihr virtuelles FreeBSD-System für virtualisierte Operationen optimieren: Setzen der Bootloader-Variablen Die wichtigste Änderung ist es, die Variable zu verkleinern, um so die CPU-Auslastung in der Parallels-Umgebung zu verringern. kern.hz=100 Ohne diese Einstellung kann ein unbeschäftigtes FreeBSD unter Parallels trotzdem rund 15 Prozent der CPU-Leistung eines Single Prozessor &imac;'s verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent. Erstellen einer neuen Kernelkonfigurationsdatei Sie können alle SCSI-, FireWire- und USB-Laufwerks-Treiber entfernen. Parallels stellt einen virtuellen Netzwerkadapter bereit, der den &man.ed.4;-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf &man.ed.4; und &man.miibus.4; aus dem Kernel entfernt werden. Netzwerkbetrieb einrichten Die einfachste Netzwerkkonfiguration ist der Einsatz von DHCP, um Ihre virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich der Host-&mac; befindet, zu verbinden. Dazu fügen Sie die Zeile ifconfig_ed0="DHCP" in die Datei /etc/rc.conf ein. Weitere Informationen zur Konfiguration des Netzwerks unter FreeBSD finden Sie im des Handbuchs. Fukang Chen (Loader) Beigetragen von FreeBSD mit &xen; unter Linux einsetzen Der &xen; Hypervisor ist ein als Open Source verfügbares Para-Virtualisierungsprodukt, das von der kommerziellen Firma XenSource unterstützt wird. Gast-Betriebssysteme werden dabei als domU-Domains, Host-Betriebssysteme hingegen als dom0 bezeichnet. Um eine virtuelle FreeBSD-Instanz unter Linux auszuführen, müssen Sie zuerst &xen; für Linux dom0 installieren. Als Host-Betriebssystem wird im folgenden Beispiel die Distribution Slackware verwendet. &xen; 3 unter Linux dom0 &xen; 3.0 von XenSource herunterladen Laden Sie die Datei xen-3.0.4_1-src.tgz von herunter. Den Tarball entpacken &prompt.root; cd xen-3.0.4_1-src &prompt.root; KERNELS="linux-2.6-xen0 linux-2.6-xenU" make world &prompt.root; make install Den dom0-Kernel neu kompilieren: &prompt.root; cd xen-3.0.4_1-src/linux-2.6.16.33-xen0 &prompt.root; make menuconfig &prompt.root; make &prompt.root; make install Ältere Versionen von &xen; müssen gegebenenfalls mit make ARCH=xen menuconfig näher spezifiziert werden. Einen Menü-Eintrag in die menu.lst von Grub aufnehmen Editieren Sie /boot/grub/menu.lst und fügen Sie die folgenden Zeilen hinzu: title Xen-3.0.4 root (hd0,0) kernel /boot/xen-3.0.4-1.gz dom0_mem=262144 module /boot/vmlinuz-2.6.16.33-xen0 root=/dev/hda1 ro Starten Sie Ihren Computer neu, um &xen; zu aktivieren Anschließend editieren Sie /etc/xen/xend-config.sxp und fügen die folgenden Zeilen hinzu: (network-script 'network-bridge netdev=eth0') Danach kann &xen; gestartet werden: &prompt.root; /etc/init.d/xend start &prompt.root; /etc/init.d/xendomains start Damit ist dom0 gestartet: &prompt.root; xm list Name ID Mem VCPUs State Time(s) Domain-0 0 256 1 r----- 54452.9 FreeBSD 7-CURRENT als domU verwenden Laden Sie den FreeBSD-dumU-Kernel für &xen; 3.0 sowie das Festplattenabbild von http://www.fsmware.com/ herunter: kernel-current mdroot-7.0.bz2 xmexample1.bsd Kopieren Sie xmexample1.bsd nach /etc/xen/ und passen Sie die Einträge für Kernel und Festplattenabbild an Ihre Konfiguration an. Ihre Konfiguration sollte ähnlich dem folgenden Beispiel aussehen: kernel = "/opt/kernel-current" memory = 256 name = "freebsd" vif = [ '' ] disk = [ 'file:/opt/mdroot-7.0,hda1,w' ] #on_crash = 'preserve' extra = "boot_verbose" extra += ",boot_single" extra += ",kern.hz=100" extra += ",vfs.root.mountfrom=ufs:/dev/xbd769a" Die Datei mdroot-7.0.bz2 sollte unkomprimiert sein. Als Nächstes muss der __xen_guest-Abschnitt in kernel-current verändert und das von &xen; 3.0.3 benötigte VIRT_BASE hinzugefügt werden: &prompt.root; objcopy kernel-current -R __xen_guest &prompt.root; perl -e 'print "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xC0000000\x00"' > tmp &prompt.root; objcopy kernel-current --add-section __xen_guest=tmp &prompt.root; objdump -j __xen_guest -s kernel-current kernel-current: file format elf32-i386 Contents of section __xen_guest: 0000 4c4f4144 45523d67 656e6572 69632c47 LOADER=generic,G 0010 55455354 5f4f533d 66726565 6273642c UEST_OS=freebsd, 0020 47554553 545f5645 523d372e 302c5845 GUEST_VER=7.0,XE 0030 4e5f5645 523d7865 6e2d332e 302c4253 N_VER=xen-3.0,BS 0040 445f5359 4d544142 2c564952 545f4241 D_SYMTAB,VIRT_BA 0050 53453d30 78433030 30303030 3000 SE=0xC0000000. Nun kann die domU erstellt und gestartet werden: &prompt.root; xm create /etc/xen/xmexample1.bsd -c Using config file "/etc/xen/xmexample1.bsd". Started domain freebsd WARNING: loader(8) metadata is missing! Copyright (c) 1992-2006 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006 kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF WARNING: DIAGNOSTIC option enabled, expect reduced performance. Xen reported: 1796.927 MHz processor. Timecounter "ixen" frequency 1796927000 Hz quality 0 CPU: Intel(R) Pentium(R) 4 CPU 1.80GHz (1796.93-MHz 686-class CPU) Origin = "GenuineIntel" Id = 0xf29 Stepping = 9 Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH, DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> Features2=0x4400<CNTX-ID,<b14>> real memory = 265244672 (252 MB) avail memory = 255963136 (244 MB) xc0: <Xen Console> on motherboard cpu0 on motherboard Timecounters tick every 10.000 msec [XEN] Initialising virtual ethernet driver. xn0: Ethernet address: 00:16:3e:6b:de:3a [XEN] Trying to mount root from ufs:/dev/xbd769a WARNING: / was not properly dismounted Loading configuration files. No suitable dump device was found. Entropy harvesting: interrupts ethernet point_to_point kickstart. Starting file system checks: /dev/xbd769a: 18859 files, 140370 used, 113473 free (10769 frags, 12838 blocks, 4.2% fragmentation) Setting hostname: demo.freebsd.org. lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 Additional routing options:. Mounting NFS file systems:. Starting syslogd. /etc/rc: WARNING: Dump device does not exist. Savecore not run. ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/X11R6/lib /usr/local/lib a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout /usr/X11R6/lib/aout Starting usbd. usb: Kernel module not available: No such file or directory Starting local daemons:. Updating motd. Starting sshd. Initial i386 initialization:. Additional ABI support: linux. Starting cron. Local package initialization:. Additional TCP options:. Starting background file system checks in 60 seconds. Sun Apr 1 02:11:43 UTC 2007 FreeBSD/i386 (demo.freebsd.org) (xc0) login: Die domU sollte nun den &os; 7.0-CURRENT-Kernel ausführen: &prompt.root; uname -a FreeBSD demo.freebsd.org 7.0-CURRENT FreeBSD 7.0-CURRENT #113: Wed Jan 4 06:25:43 UTC 2006 kmacy@freebsd7.gateway.2wire.net:/usr/home/kmacy/p4/freebsd7_xen3/src/sys/i386-xen/compile/XENCONF i386 Das Netzwerk kann nun unter der domU konfiguriert werden. Die &os;-domU wird ein spezielles Gerät namens xn0 verwenden: &prompt.root; ifconfig xn0 10.10.10.200 netmask 255.0.0.0 &prompt.root; ifconfig xn0: flags=843<UP,BROADCAST,RUNNING,SIMPLEX> mtu 1500 inet 10.10.10.200 netmask 0xff000000 broadcast 10.255.255.255 ether 00:16:3e:6b:de:3a lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 Unter der Slackware-dom0 sollten einige &xen;-spezifische Netzwerkgeräte erscheinen: &prompt.root; ifconfig eth0 Link encap:Ethernet HWaddr 00:07:E9:A0:02:C2 inet addr:10.10.10.130 Bcast:0.0.0.0 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:815 errors:0 dropped:0 overruns:0 frame:0 TX packets:1400 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:204857 (200.0 KiB) TX bytes:129915 (126.8 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:99 errors:0 dropped:0 overruns:0 frame:0 TX packets:99 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:9744 (9.5 KiB) TX bytes:9744 (9.5 KiB) peth0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:1853349 errors:0 dropped:0 overruns:0 frame:0 TX packets:952923 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2432115831 (2.2 GiB) TX bytes:86528526 (82.5 MiB) Base address:0xc000 Memory:ef020000-ef040000 vif0.1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:1400 errors:0 dropped:0 overruns:0 frame:0 TX packets:815 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:129915 (126.8 KiB) TX bytes:204857 (200.0 KiB) vif1.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:157 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:140 (140.0 b) TX bytes:158 (158.0 b) xenbr1 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:112 (112.0 b) TX bytes:0 (0.0 b) &prompt.root; brctl show bridge name bridge id STP enabled interfaces xenbr1 8000.feffffffffff no vif0.1 peth0 vif1.0 Johann Kois Übersetzt von Virtual PC unter &windows; Virtual PC für &windows; wird von µsoft; kostenlos zum Download angeboten. Die Systemanforderungen für dieses Programm finden Sie hier. Nachdem Sie Virtual PC unter µsoft.windows; installiert haben, müssen Sie eine virtuelle Maschine konfigurieren und das gewünschte Betriebssystem installieren. FreeBSD in Virtual PC/µsoft.windows; installieren Der erste Schritt zur Installation von FreeBSD in µsoft.windows;/Virtual PC ist es, eine neue virtuelle Maschine zu erstellen, in die Sie FreeBSD installieren können. Dazu wählen Sie die Option Create a virtual machine, wenn Sie danach gefragt werden: Bei der Frage nach dem Operating system wählen Sie Other: Danach müssen Sie den von Ihnen gewüschten Plattenplatz sowie die Größe des Hauptspeichers angeben. 4 GB Plattenplatz sowie 512 MB RAM sollten für die Installation von FreeBSD in Virtual PC ausreichend sein: Speichern Sie Ihre Eingaben und beenden Sie die Konfiguration: Wählen Sie nun die für FreeBSD erstellte virtuelle Maschine aus und klicken Sie auf Settings, um das Netzwerk zu konfigurieren: Nun können Sie FreeBSD installieren. Dazu verwenden Sie am besten eine offizielle FreeBSD-CD-ROM oder ein ISO-Image, das Sie von einem offiziellen FreeBSD-FTP-Server heruntergeladen haben. Wenn Sie ein ISO-Image auf Ihrer Festplatte gespeichert haben, oder eine FreeBSD-CD-ROM in Ihr CD-Laufwerk eingelegt haben, doppelklicken Sie auf die virtuelle Maschine, die Sie für FreeBSD angelegt haben. Danach klicken Sie auf CD und wählen die Option Capture ISO Image... im Virtual PC-Fenster. Danach können Sie im folgenden Fenster das CD-Laufwerk mit Ihrem physikalischen CD-Laufwerk oder mit dem ISO-Image verknüpfen. Danach starten Sie die virtuelle Maschine neu, indem Sie zuerst auf Action und danach auf Reset klicken. Virtual PC startet Ihre virtuelle Maschine nun neu und prüft zuerst, ob die virtuelle Maschine über ein CD-Laufwerk verfügt. Da dies hier der Fall ist, beginnt nun eine normale, auf sysinstall basierende Installation, die in beschrieben wird. Sie können FreeBSD nun installieren. Verzichten Sie an dieser Stelle aber unbedingt auf die X11-Konfiguration. Nachdem die Installation abgeschlossen ist, entfernen Sie die CD-ROM aus dem Laufwerk (oder lösen die Verknüpfung zum ISO-Image). Danach starten Sie die virtuelle Maschine neu, um FreeBSD zu starten. FreeBSD in µsoft.windows;/Virtual PC konfigurieren Nachdem Sie FreeBSD auf Ihrem µsoft.windows;-System erfolgreich unter Virtual PC installiert haben, sollten Sie ihr virtuelles FreeBSD noch anpassen, um eine optimale Funktion zu gewährleisten. Setzen der Bootloader-Variablen Die wichtigste Änderung ist es, die Variable zu verkleinern, um so die CPU-Auslastung in der Virtual PC-Umgebung zu verringern. Dazu fügen Sie die folgende Zeile in die Datei /boot/loader.conf ein: kern.hz=100 Ohne diese Einstellung kann ein unbeschäftigtes FreeBSD unter Virutal PC trotzdem rund 40 Prozent der CPU-Leistung eines Ein-Prozessor-Systems verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent. Erstellen einer neuen Kernelkonfigurationsdatei Sie können alle SCSI-, FireWire- und USB-Laufwerks-Treiber entfernen. Virtual PC stellt einen virtuellen Netzwerkadapter bereit, der den &man.de.4;-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf &man.de.4; und &man.miibus.4; aus dem Kernel entfernt werden. Das Netzwerk einrichten Die einfachste Netzwerkkonfiguration ist der Einsatz von DHCP, um Ihre virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich Ihr Host-µsoft.windows; befindet, zu verbinden. Dazu fügen Sie die Zeile ifconfig_de0="DHCP" in die Datei /etc/rc.conf ein. Weitere Informationen zur Konfiguration des Netzwerks unter FreeBSD finden Sie im des Handbuchs. Johann Kois Übersetzt von VMWare unter MacOS VMWare Fusion für &mac; ist ein kommerzielles Programm, das für &intel; basierte &apple; &mac;-Computer mit &macos; 10.4.9 oder neuer erhältlich ist. FreeBSD wird von diesem Produkt vollständig als Gast-Betriebssystem unterstützt. Nachdem Sie VMWare Fusion unter &macos; X installiert haben, können Sie das gewünschte Gastbetriebssystem (in unserem Fall FreeBSD) installieren. FreeBSD in VMWare/&macos; X installieren Zuerst müssen Sie VMWare Fusion starten, um eine virtuelle Maschine zu erstellen. Dazu wählen Sie die Option "New": Dadurch wird ein Assistent gestartet, der Ihnen bei der Erzeugung einer neuen virtuellen Maschine behilflich ist. Clicken Sie auf "Continue", um den Prozess zu starten: Wählen Sie Other als das Operating System, danach FreeBSD oder FreeBSD 64-bit, je nach dem, welche Version Sie installieren wollen, wenn Sie nach der zu installierenden Version gefragt werden: Vergeben Sie einen Namen für virtuelle Maschine an und legen Sie den Speicherort fest: Legen Sie die Größe Ihrer virtuellen Festplatte fest: Nachdem Sie auf "Finish" geklickt haben, wird die virtuelle Maschine gestartet: Nun können Sie &os; wie gewohnt installieren (lesen Sie dazu auch des Handbuchs): Nachdem die Installation abgeschlossen ist, können Sie noch verschiedene Parameter der virtuellen Maschine, etwa den Speicherverbrauch, konfigurieren: Die Hardware der virtuellen Maschine kann nicht geändert werden, solange die virtuelle Maschine läuft. Die Anzahl der CPUs der virtuellen Maschine: Den Status des CD-Laufwerks. Sie können das CD-Laufwerk von der virtuellen Maschine lösen, wenn Sie es nicht benötigen. Zuletzt sollten Sie noch festlegen, wie sich die virtuelle Maschine mit dem Netzwerk verbinden soll. Sollen neben dem Gastsystem auch andere Rechner auf Ihre virtuelle Maschine zugreifen können, müssen Sie die Option Connect directly to the physical network (Bridged) wählen. Ist dies nicht der Fall, sollten Sie die Option Share the host's internet connection (NAT) wählen. In dieser Einstellung kann die virtuelle Maschine zwar auf auf das Internet zugreifen, andere Rechner dürfen aber nicht auf die virtuelle Maschine zugreifen. Nachdem Sie die Konfiguration abgeschlossen haben, können Sie FreeBSD starten. FreeBSD unter &macos; X/VMWare konfigurieren Nachdem Sie FreeeBSD erfolgreich unter VMWare für &macos; X installiert haben, sollten Sie ihr virtuelles FreeBSD noch anpassen, um eine optimale Funktion zu gewährleisten. Die wichtigste Änderung ist es, die Variable zu verkleinern, um so die CPU-Auslastung in der VMWare-Umgebung zu verringern. kern.hz=100 Ohne diese Einstellung kann ein unbeschäftigtes FreeBSD unter VMWare trotzdem rund 15 Prozent der CPU-Leistung eines Single Prozessor &imac;'s verbrauchen. Nach dieser Änderung reduziert sich dieser Wert auf etwa 5 Prozent. Erstellen einer neuen Kernelkonfigurationsdatei Sie können alle FireWire- und USB-Laufwerks-Treiber entfernen. VMWare stellt einen virtuellen Netzwerkadapter bereit, der den &man.em.4;-Treiber verwendet. Daher können alle Netzwerkgeräte bis auf &man.em.4; und &man.miibus.4; aus dem Kernel entfernt werden. Netzwerkbetrieb einrichten Die einfachste Netzwerkkonfiguration ist der Einsatz von DHCP, um Ihre virtuelle Maschine mit dem gleichen lokalen Netzwerk, in dem sich der Host-&mac; befindet, zu verbinden. Dazu fügen Sie die Zeile ifconfig_em0="DHCP" in die Datei /etc/rc.conf ein. Weitere Informationen zur Konfiguration des Netzwerks unter FreeBSD finden Sie im des Handbuchs. + + + + Benedict + Reuschling + Übersetzt von + + + Christoph + Sold + + + + FreeBSD als Host-Betriebssystem - FreeBSD wird derzeit offiziell von keiner - Virtualisierungssoftware als Host-Betriebssystem + Seit einigen Jahren wurde &os; nicht offiziell von irgendeiner der + verfügbaren Virtualisierungslösungen als Host-Betriebssystem unterstützt. Viele Anwender verwenden aber noch - ältere VMware-Versionen, die - FreeBSD noch als Host-Betriebssystem unterstützen. - Zusätzlich wird + ältere VMware-Versionen (z.B. emulators/vmware3), welches die + &linux;-Kompatibilitätsschicht nutzt. Kurz nach der + Veröffentlichung von &os; 7.2 erschien + &virtualbox; als Open-Source Edition + (OSE) von &sun; in der Ports-Sammlung als ein direkt + auf &os; lauffähiges Programm. + + &virtualbox; ist ein vollständiges + Virtualisierungspaket, das aktiv weiterentwickelt wird und für die + meisten Betriebssysteme einschliesslich &windows;, &macos;, &linux; und + &os; zur Verfügung steht. Es kann sowohl &windows; als auch + &unix;-ähnliche Gastsysteme betreiben. Es ist als Open Source und + als proprietäre Edition erhältlich. Die wichtigste + Einschränkung der OSE aus Anwendersicht ist + die fehlende USB-Unterstützung. Weitere Unterschiede können + von der Editions-Seite des + &virtualbox;-Wikis, das unter zu finden ist, + entnommen werden. Momentan steht nur OSE unter &os; zur + Verfügung. + + + &virtualbox; installieren + + &virtualbox; steht als &os;-Port in + emulators/virtualbox bereit und + kann über den folgenden Befehl installiert werden: + + &prompt.root; cd /usr/ports/emulators/virtualbox +&prompt.root; make install clean + + Eine nützliche Option im Konfigurationsdialog ist die + GuestAdditions-Programmsammlung. Diese stellen + eine Reihe von nützlichen Eigenschaften in den + Gastbetriebssystemen zur Verfügung, wie beispielsweise + Mauszeigerintegration (was es ermöglicht, die Maus zwischen + dem Host und dem Gast zu teilen ohne eine spezielle Tastenkombination + für diesen Wechsel zu drücken), sowie schnelleres Rendern + von Videos, besonders in &windows; Gästen. Diese Gastzusätze + sind im Devices-Menü zu finden, nachdem die + Installation des Gastbetriebssystem abgeschlossen ist. + + Ein paar Konfigurationsänderungen sind notwendig, bevor + &virtualbox; das erste Mal gestartet wird. + Der Port installiert ein Kernelmodul in /boot/modules, das in den laufenden + Kernel geladen werden muss: + + &prompt.root; kldload vboxdrv + + Um sicherzustellen, dass das Modul immer nach einem Neustart + geladen wird, fügen Sie die folgende Zeile in die Datei + /boot/loader.conf ein: + + vboxdrv_load="YES" + + &virtualbox; benötigt auch das + eingehängte proc-Dateisystem: + + &prompt.root; mount -t procfs proc /proc + + Um auch diese Einstellung nach einem Neustart zu erhalten, wird die + folgende Zeile in /etc/fstab + eingefügt: + + proc /proc procfs rw 0 0 + + + Möglicherweise erscheint eine Fehlermeldung ähnlich der + Folgenden, wenn &virtualbox; von einem + Terminal aus gestartet wird: + + VirtualBox: supR3HardenedExecDir: couldn't read "", errno=2 cchLink=-1 + + Wahrscheinlich ist der Übeltäter das proc-Dateisystem. Verwenden Sie bitte + das mount-Kommando um zu überprüfen, ob + es korrekt eingehängt ist. + + + Die Gruppe vboxusers wird während der + Installation von &virtualbox; angelegt. + Alle Benutzer, die Zugriff auf &virtualbox; + haben sollen, müssen in diese Gruppe aufgenommen werden. Der + pw-Befehl kann benutzt werden, um neue Mitglieder + hinzuzufügen: + + &prompt.root; pw groupmod vboxusers -m yourusername + + Um &virtualbox; zu starten, wählen + Sie entweder den Eintrag Sun VirtualBox aus + dem Menü Ihrer graphischen Benutzeroberfläche, oder geben + Sie den folgenden Befehl in ein Terminal ein: + + &prompt.user; VirtualBox + + Besuchen Sie die offizielle Webseite von + &virtualbox; unter , um weitere Informationen zur + Konfiguration und Verwendung zu erhalten. Da der &os;-Port noch recht + neu ist, befindet er sich noch unter ständiger Entwicklung. Um + die aktuellen Nachrichten und Anleitungen zur Fehlerbehebung zu + erhalten, besuchen Sie die entsprechende Seite im &os;-Wiki unter + . + + + + Andere Virtualisierungsmöglichkeiten + + Zusätzlich wird daran gearbeitet, &xen; als - funktionierende Host-Umgebung (dom0) für FreeBSD - verfügbar zu machen. + funktionierende Host-Umgebung (dom0) für &os; + verfügbar zu machen. Eine experimentelle Version davon wird in + &os; 8.0 erscheinen. +