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 errno?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 istWenn 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.HagenKühlÜbersetzt von Portablen Code erzeugenPortabilitä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 umgehenIn 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
%endifUmgang mit KonventionenSowohl 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
%endifUmgang mit anderen
PortabilitätsangelegeneheitenDie 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 benutzenSie 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
retIhre 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
retDer 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 verwendenWenn 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 2Als 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
retWir erzeugen ein Makro, das ein Argument erwartet, die
Systemaufruf-Nummer:%macro system 1
mov eax, %1
call access.the.bsd.kernel
%endmacroLetztlich 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.HagenKühlÜbersetzt von Unser erstes ProgrammJetzt 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.exitHier 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 assemblierenGeben 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.nasm installierenWemm 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;HagenKühlÜbersetzt von &unix;-Filter schreibenEin 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.exitIm 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; ./hexHello, 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.exitWir 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; ./hexHello, 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).HagenKühlÜbersetzt von Gepufferte Eingabe und AusgabeWir 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
retAls 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; ./hexHello, 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
retLassen 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; ./hexHello, 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 machenDas 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 esiDas 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
retAber 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 getcharread nicht aufrufen muss, befinden sich
alle im Voraus gelesenen Bytes noch im Puffer und
ungetc arbeitet fehlerfrei. Aber sobald
getcharread 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 BUFSIZEAuß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
retMit 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).FabianRuchÜbersetzt von KommandozeilenparameterUnser 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 6Zweitens 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
%endmacroUnd 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
retIn 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.FabianRuchÜbersetzt von Die &unix;-UmgebungEin 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 herausfindenIch 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.webvarsIch 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 ÜberblickIch 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 CodeUnser 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.exitDieser 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.oUm 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.PaulKellerÜbersetzt von FabianBorschelArbeiten mit DateienWir 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 myfileEs wäre schö ein ftuc
zu haben, also, fast tuc, und es so zu
benutzen:&prompt.user; ftuc myfileIn 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 / ZeilenvorschubWagenrücklaufZeilenvorschub / WagenrücklaufZeilenvorschubEs 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 ZustandsautomatDas 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:ordinarycrlfUnser 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 StatusDer 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ählerWeil 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 SoftwareDer 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 DateienWeil 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
mmap2 sagt. Das ist weil
mmap2 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össeWeil 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össeDadurch 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.ftucWir 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.DanielSeuffertÜbersetzt von One-Pointed MindAls 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.CSVIch 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:
retVieles 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 BufferingDiese Ä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 .loopDa 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.FabianBorschelÜbersetzt von Die FPU verwendenSeltsamerweise 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 FPUDie 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
Registerst(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
st0– st7. Mit anderen Worten, es gibt
keine Klammern, und der TOS ist immer
st0, niemals einfach nur
st.Das Packed Decimal-FormatDas 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 67Dem 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 80Erinnern 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 LochblendenphotographieUm 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 KameraDie 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 LochblendeStreng 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.BrennweiteDieser 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–WertDer 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 / DMit 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–WerteWä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–StoppEine 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-SoftwareWir können jetzt festlegen, was genau unsere
Lochblenden-Software tun soll.Verarbeitung der ProgrammeingabenDa 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, 210Unser 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: besteEt 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 anbietenDas 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 AusgabeWir 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:00000000150Offensichtlich 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:17459765723452353453534535353530530534563507309676764423Ha! 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 genau12000 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 st1Die 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 exakt32.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 OptimierungenIn 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 = -5Wir 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.pinhole—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:
retDer 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 flagclear immer dann zurückgeben, wenn
wir ein weiteres Zeichen aus der Eingabe lesen, und das
carry flagset 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 flagclear 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 flagcleart.Wenn aber read keine weiteren
Eingaben von dem System bekommt, ruft dieses
nichtgetchar
auf. Stattdessen addiert der op-Code
add esp, byte 44 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 flagreturned.
]]>Eine HTML-Seite sollte immer nur eine Überschrift
h1 haben. Dieser Überschrift können
beliebig viele Kapitel mit einer Überschrift
h2 folgen, die selbst wiederum eine
beliebige Anzahl von Kapiteln mit einer Überschrift
h3 enthalten können. Diese
Verschachtelung setzt sich bis zu Kapiteln mit einer
h6-Überschrift fort. Es sollte vermieden
werden, Elemente in der Überschriftenhierarchie
auszulassen.Falsche Verschachtelung von ÜberschriftenFügen Sie in eine der existierenden Übungsdateien folgendes ein:Erstes Kapitel
Unterkapitel
]]>AbsätzeAbsätze können in HTML mit Hilfe des Elementes
p ausgezeichnet werden.Absätze mit dem Element pFügen Sie in eine der existierenden Übungsdateien folgendes ein:Das hier, das ist ein Absatz. Absätze können
andere Elemente enhalten.
]]>
BlockzitateEin Blockzitat ist ein etwas umfangreicheres Zitat aus
einem anderen Text, das nicht zum aktuellen Absatz
gehört.BlockzitatFügen Sie in eine der existierenden Übungsdateien
folgendes ein:
Artikel 1: Menschenwürde; Grundrechtsbindung der
staatlichen Gewalt
Die Würde des Menschen ist unantastbar. Sie zu achten
und zu schützen ist Verpflichtung aller staatlichen
Gewalten.
Das Deutsche Volk bekennt sich darum zu unverletzlichen
und unveräußerlichen Menschenrechten als Grundlage jeder
menschlichen Gemeinschaft, des Friedens und der
Gerechtigkeit in der Welt.
Die nachfolgenden Grundrechte binden Gesetzgebung,
vollziehende Gewalt und Rechtsprechung als
unmittelbar geltendes Recht.
]]>ListenHTML kennt drei Arten von Listen: sortierte, unsortierte
und Definitionslisten. Ein Eintrag in einer sortierten Liste
wird üblicherweise mit einer Nummer versehen, Einträge in
unsortierten Listen hingegen mit einem Aufzählungspunkt.
Definitionslisten wiederum bestehen aus zwei Teilen: Der
erste enthält den Begriff der definiert werden soll und der
zweite dessen Erläuterung.Sortierte Listen werden mit dem Element
ol (für
ordered
list) ausgezeichnet,
unsortierte Listen mit ul (für
unordered
list) und
Definitionslisten mit dl.Listenpunkte sortierter und unsortierter Listen werden
mit dem Element li ausgezeichnet,
welches Text oder andere Blockelemente enthalten kann.
Begriffe, die in einer Definitionslisten enthalten sind,
werden mit dem Element dt (für
definition
term) ausgezeichnet.
Die Erklärung zu diesem Begriff wird mit Hilfe des Elementes
dd (für definition
description) markiert. So wie
li, kann das Element
dd ebenfalls andere Blockelemente
aufnehmen.Listen mit ul und
ol erstellenFügen Sie in eine der existierenden Übungsdateien
folgendes ein:Jetzt folgt eine unsortierte Liste. Wahrscheinlich werden
die einzelnen Einträge mit einem vorangehenden Punkt dargestellt.
Erster Eintrag
Zweiter Eintrag
Dritter Eintrag
Die zweite Liste ist sortiert und ihre Einträge bestehen aus mehreren Absätzen.
Jeder Listeneintrag ist nummeriert.
Das ist der erste Eintrag mit nur einem Absatz.
Das ist der erste Absatz des zweiten Eintrags.
Und das ist der zweite Absatz des zweiten Eintrags.
Der dritte Eintrag besteht ebenfalls nur aus einem Eintrag.
]]>Definitionslisten mit dl erstellenFügen Sie in eine der existierenden Übungsdateien folgendes ein:
Erster Begriff
Erster Absatz der Erklärung
Zweiter Absatz der Erklärung.
Zweiter Begriff
Erster Absatz der Erklärung.
Dritter Begriff
Erster Absatz der Erklärung zum dritten Begriff.
]]>Vorformatierter TextIn einigen Fällen ist es gewollt, dass die Formatierung
eines Textes im Quelldokument erhalten bleibt, damit der
Leser diesen genau so sieht, wie ihn der Autor erstellt hat.
In der HTML-Spezifikation ist dafür das Element
pre vorgesehen, welches dafür sorgt, dass
Zeilenumbrüche erhalten bleiben und Leerzeichen nicht
zusammengefaßt werden. Browser verwenden für den
Inhalt des Elementes pre
üblicherweise eine Fixschrift.Vorformatierten Text mit pre erstellenDer Originaltext einer E-Mail läßt sich beispielsweise
wie folgt einbinden: From: nik@FreeBSD.org
To: freebsd-doc@FreeBSD.org
Subject: Neue Version verfügbar
Es ist eine neue Version der Fibel für neue Mitarbeiter am
FreeBSD-Dokumentationsprojekt verfügbar:
<URL:http://people.FreeBSD.org/~nik/primer/index.html>
Kommentare und Anmerkungen sind willkommen.
N]]>Beachten Sie, dass < und
& nach wie vor als Sonderzeichen
erkannt werden. Daher wird in diesem Beispiel auch
< an Stelle von
< verwendet. Aus dem gleichen
Grund wurde auch > an Stelle
von > verwendet. Achten Sie also
stets auf Sonderzeichen, wenn Sie normalen Text
aus E-Mails, Programmcode oder einer anderen Quelle
kopieren.TabellenDie meisten Textbrowser, beispielsweise Lynx, können
Tabellen nicht besonders gut darstellen. Deshalb sollten
Auszeichnungsalternativen in Betracht gezogen werden, um
eine angemessene Darstellung sicherzustellen.Tabellen lassen sich in HTML mit Hilfe des Elements
table auszeichnen. Eine Tabelle setzt
sich aus einer oder mehreren Zeilen (tr)
zusammen, von denen jede mindestens eine Zelle
(td) enthält. Zellen können wiederum
andere Blockelemente, wie Absätze oder Listen, enthalten.
Auch können sie auch andere Tabellen aufnehmen, wobei die
Verschachtelungstiefe unbegrenzt ist. Soll die Tabellenzelle
nur einen Textabsatz enthalten, ist es nicht notwendig den
Text mit einem p zu umschließen.Einfache Tabelle mit tableFügen Sie in eine der existierenden Übungsdateien folgendes ein:Eine einfache 2x2 Tabelle.
Obere linke Zelle
Obere rechte Zelle
Untere linke Zelle
Untere rechte Zelle
]]>HTML kennt die Möglichkeit, dass sich eine
Zelle mehrere Zeilen und/oder Spalten erstrecken kann.
Sollen beispielsweise mehrere Spalten zusammenfassen werden,
kann dies mit mit Hilfe des Attributes
colspan erreicht werden, indem man ihm
die Anzahl der zusammenzufassenden Spalten zuweist.
Ähnliches gilt für die Zusammenfassung von Zeilen:
Hierfür wird dem Attribut rowspan
die Anzahl der zusammenzufassenden Zeilen zugewiesen.Anwendung des Attributes rowspanDiese Tabelle besteht aus einer langen Zelle auf der
linken Seite und zwei kleineren Zellen auf der rechten.
Lang und dünn
Obere Zelle
Untere Zelle
]]>Anwendung des Attributes colspanEine breite Zeile oben und zwei schmalere Zeilen
darunter.
Obere Zelle
Linke untere Zelle
Rechte untere Zelle
]]>Gemeinsame Anwendung der Attrbute rowspan und
colspanEine Tablle mit 3-mal-3 Zellen. Oben links
werden 2 mal 2 Zelle zusammengezogen.
Große obere linke Zelle
Obere rechte Zelle
Mittlere rechte Zelle
Untere linke Zelle
Untere mittlere Zelle
Untere rechte Zelle
]]>FlußelementeHervorheben von InformationSollen sich bestimmte Informationen von anderen optisch
abheben, kann dies mit den HTML-Tags
strong und em erreicht
werden. strong stellt dabei eine
stärkere Hervorhebung als em dar,
wobei mit strong ausgezeichnete Elemente
fett und mit em ausgezeichnete Elemente
kursiv dargestellt werden. Allerdings ist diese Aussage
nicht verläßlich, da die Darstellung vom Browser
abhängig ist.Text mit em und strong
hervorhebenDieses Wort ist hervorgehoben,
während dieses noch stärker hervorgehoben ist.]]>Fett- und SchrägschriftDa mittels HTML auch Festlegungen über die
Darstellung getroffen werden können, gibt es die
Möglichkeit direkt zu bestimmen, dass bestimmte
Inhalte fett oder kursiv dargestellt werden sollen. Mit
b eingefaßte Inhalte werden fett
und mit i eingefaßte kursiv
dargestellt.Text mit b und i
formatierenDieses Wort wird fett dargestellt,
während dieses kursiv dargestellt wird.]]>Nicht-proportionale Schrift für TexteDer Tag tt erlaubt es,
Text in einer schreibmaschinenähnlichen
Schrift darzustellen.Nicht-proportionale Schrift mit
ttDieses Dokument wurde ursprünglich von
Nik Clayton geschrieben. Nick Clayton kann unter der E-Mail-Adresse
nik@FreeBSD.org erreicht werden.]]>Änderung der SchriftgrößeHTML bietet auch Möglichkeiten, um Einfluß
auf die Schriftgröße zu nehmen, das heißt,
zu bestimmen, ob die Schrift größer oder kleiner
als die Standardschrift dargestellt werden soll. Es gibt
drei verschiedene Wege, dies zu erreichen:Mittels der Tags big und
small kann die
Darstellungsgröße des eingeschlossenen Textes
vergrößert respektive verkleinert werden.
HTML erlaubt es zudem, diese Tags zu verschachteln, so
dass auch <big><big>Das ist
wesentlich
größer.</big></big>
geschrieben werden kann.Das gleiche Ergebnis kann über die Zuweisung der
Werte 1 und -1 an
das Attribut size
des Tags font erreicht werden. Diese
Vorgehensweise sollte allerdings als veraltet betrachtet
werden, da der Einsatz eines CSS hierfür die bessere
Lösung darstellt.Über die Zuweisung von absoluten Werten im Bereich
von 1 bis 7 an das
Attribut size des Tags
fontDer Standardwert für size ist
3.. Diese
Herangehensweise ist ebenfalls veraltet und sollte nicht
mehr angewandt werden.Schriftgröße ändern mit
big, small und
fontDie folgenden HTML-Schnipsel bewirken alle das gleiche:Dieser Text ist etwas kleiner. Dieser
jedoch ein wenig größer.
Dieser Text ist etwas kleiner. Dieser
jedoch ein wenig größer.
Dieser Text ist etwas kleiner. Dieser
jedoch ein wenig größer.
]]>LinksBei Links handelt es sich ebenfalls Flußelemente.Auf andere Dokumente im WWW verweisenUm auf ein anderes Dokument im WWW zu verweisen,
müssen Sie die URL dieses Dokuments kennen.Links auf andere Dokumente im WWW werden in HTML durch
den Tag a und dessen Attribute href, das die Zieladresse
enthält, angelegt. Der Inhalt des Elementes wird selbst
zum Link und seine Darstellung erfolgt verschieden vom
übrigen Text. Meist geschieht das durch eine andere
Schriftfarbe oder dadurch, dass der Linktext
unterstrichen wird.<a href="..."> benutzenWeitere Informationen stehen auf der
FreeBSD-Webseite zur Verfügung.]]>Beim Aufruf dieses Links wird das referenzierte Dokument vom
Browser geladen und mit dessen Seitenanfang dargestellt.Auf bestimmte Dokumentenabschnitte verweisenHTML unterstützt neben einfachen Links auch solche, die
auf einen bestimmten Abschnitt innerhalb eines Dokumentes
verweisen. Dazu müssen die Abschnitte, auf die verwiesen
werden soll, mit Hilfe von sogenannten Ankern
markiert werden. Diese Anker können ebenfalls mit Hilfe des
Tags a gesetzt werden, nur das anstelle
von href das Attribut
name gesetzt werden
muss.Anwendung von <a name="...">Auf diesen Absatz kann mit
Hilfe seines Namens (absatz1) verwiesen werden.]]>Um auf einen so gekennzeichneten Abschnitt zu verweisen,
muss die URL des Dokumentes um das Zeichen
# und den Namen des Zielankers erweitert
werden.Auf einen Abschnitt eines anderen Dokumentes
verweisenFür dieses Beispiel wird davon ausgegangen, dass der mit
absatz1 gekennzeichnete Absatz sich in
der HTML-Datei foo.html
befindet.Weitere Informationen können im
ersten Absatz der Datei
foo.html gefunden werden.]]>Die DocBook DTDDocBook wurde ursprüglich von HaL Computer Systems and
O'Reilly & Associates als DTD für das Erstellen von
technischen Dokumenten entwickelt
Einen kurzen historischen Abriss finden Sie unter
http://www.oasis-open.org/docbook/intro.shtml#d0e41..
Seit 1998 wird es vom
DocBook Technical Committee gewartet. DocBook ist sehr
stark auf die Beschreibung von Inhalten, und nicht auf die
Darstellung des Inhalts ausgerichtet. Damit steht es im Gegensatz
zu LinuxDoc und HTML.Formelle und informelle ElementeEinige Elemente der DocBook DTD sind in zwei Varianten
vorhanden: formell und
informell. Üblicherweise besitzt die
formelle Variante einen Titel, dem der eigentliche
Elementeninhalt folgt. Die informelle Variante hingegen hat
keinen Titel.Die DocBook DTD ist in der Ports-Sammlung im Port textproc/docbook enthalten und wird
bei der Installation des Metaports textproc/docproj automatisch
mitinstalliert.Die FreeBSD-ErweiterungenFür das FDP wurde die DocBook DTD durch das
FreeBSD-Dokumentationsproject um zusätzliche Elemente
erweitert, um damit präzisiere
Auszeichnungsmöglichkeiten zur Verfügung zu haben.
Sofern im folgenden FreeBSD-spezifische Elemente genutzt
werden, wird explizit darauf hingewiesen werden.Wenn nachfolgend im Text der Begriff
DocBook verwendet wird, ist damit die durch das
FDP erweiterte Version der DocBook DTD gemeint.Die durch das FDP vorgenommenen Erweiterungen sind nicht
FreeBSD-spezifisch. Sie wurden lediglich vorgenommen, da sie
für die Arbeit des FDPs als nützlich erschienen.
Für den Fall, das in den anderen *nix-Lagern (NetBSD,
OpenBSD, Linux,…) Interesse daran besteht, gemeinsam
eine Standarderweiterung für die DocBook DTD zu
entwickeln, kann mit dem &a.doceng; Verbindung aufgenommen
werden.Zum jetzigen Zeitpunkt sind die FreeBSD-Erweiterungen
nicht Bestandteil der Ports-Sammlung. Sie werden im
&os;-CVS-Archiv (doc/share/sgml/freebsd.dtd)
verwaltet.Formelle Öffentliche BezeichnerIn Übereinstimmung mir der DocBook-Richtlinie zur
Erstellung von Bezeichnern für DocBook-Erweiterungen lautet
der Bezeichner der erweiterten FreeBSD-Variante:PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN"Die Struktur von DocBook-DokumentenDocBook erlaubt es, Dokumente auf verschiedene Weise zu
strukturieren. Innerhalb des FDPs werden hauptsächlich zwei
Arten von DocBook-Dokumenten verwendet: Buch und Artikel.
Beide unterscheiden sich darin, dass ein Buch auf der obersten
Ebene durch chapter-Elemente strukturiert
wird. Sollte das noch nicht ausreichend sein, können die
einzelnen Kapitel eines Buches mit Hilfe des Elementes
part in Teile aufgespalten werden. Das
Handbuch ist beispielsweise auf diese Weise aufgebaut.Kapitel (chapter) können weiterhin in
Unterkapitel unterteilt werden. Diese werden durch die
Elemente sect1 ausgezeichnet. Soll ein
Unterkapitel selbst weitere Unterkapitel enthalten, kann das
über das Element sect2 geschehen. Diese
Unterteilung kann bis zur Tiefe von fünf Unterkapiteln –
über die Elemente sect3,
sect4 und sect5 –
fortgeführt werden. Der eigentliche Inhalt, um den es ja in
dem Artikel oder Buch geht, wird unterhalb der hier genannten
Elemente eingefügt.Vom Aufbau her ist ein Artikel ist einfacher strukturiert
als ein Buch. So kann ein Artikel beispielsweise keine Kapitel
(chapter) enthalten. Stattdessen kann der
Inhalt eines Artikels nur durch die schon bekannten
sectN-Elemente
in einen oder mehrere Abschnitte gegliedert werden.
Überlegen Sie sich vor dem Schreiben eines Textes,
ob der zu schreibende Text am
besten als Buch oder als Artikel angelegt wird. Artikel eignen
sich besser für Texte, die nicht in mehrere Kapitel
aufgeteilt werden müssen und mit einem Umfang von
ungefähr 20 bis 25 Seiten vergleichsweise kurz sind.
Natürlich ist das nur eine Richtlinie. Bücher sind
dementsprechend am besten für lange Texte geeignet, die
sich sinnvoll in Kapitel unterteilen lassen und
möglichweiser noch Anhänge und ähnliches
enthalten können.Alle Tutorien von
FreeBSD sind als Artikel verfaßt, während
hingegen die FreeBSD-FAQ und das FreeBSD-Handbuch als
Bücher verfaßt wurden.Bücher schreibenDer Inhalt eines Buches wird in einem
book-Element abgelegt. Neben dem
Textteil des Buches kann dieses Element weitergehende
Informationen über das Buch selbst,
wie Meta-Informationen zum Erstellen eines
Stichwortverzeichnisses oder zusätzliche
Inhalte zum Erstellen einer Titelei, enthalten. Diese
zusätzlichen Inhalte sollten in einem
bookinfo-Element abgelegt werden.Buchvorlage book mit
bookinfo<book>
<bookinfo>
<title>Titel</title>
<author>
<firstname>Vorname</firstname>
<surname>Nachname</surname>
<affiliation>
<address><email>E-Mail-Adresse</email></address>
</affiliation>
</author>
<copyright>
<year>1998</year>
<holder role="mailto:E-Mail-Adresse">Vollständiger Name</holder>
</copyright>
<releaseinfo>$FreeBSD$</releaseinfo>
<abstract>
<para>Kurze Zusammenfassung des Buchinhaltes.</para>
</abstract>
</bookinfo>
…
</book>Artikel schreibenDer Inhalt eines Artikels wird in einem
article-Element abgelegt. Neben
dem Textteil kann dieses Element weitere Teile,
wie Meta-Informationen zum Erstellen eines
Stichwortverzeichnisses oder zusätzliche
Inhalte zum Erstellen einer Titelei, enthalten.
Analog zu einem Buch, sollten diese Informationen in einem
articleinfo-Element abgelegt
werden.Artikelvorlage article mit
articleinfo<article>
<articleinfo>
<title>Titel</title>
<author>
<firstname>Vorname</firstname>
<surname>Nachname</surname>
<affiliation>
<address><email>E-Mail-Adresse</email></address>
</affiliation>
</author>
<copyright>
<year>1998</year>
<holder role="mailto:E-Mail-Adresse">Vollständiger Name</holder>
</copyright>
<releaseinfo>$FreeBSD$</releaseinfo>
<abstract>
<para>Kurze Zusammenfassung des Artikelinhalts.</para>
</abstract>
</articleinfo>
…
</article>KapitelKapitel werden mit dem
chapter-Element angelegt und müssen ein
title-Element enthalten. Verwendet werden
können sie nur in Büchern.Ein einfaches KapitelKapitelüberschrift
…
]]>Kapitel können nicht leer sein. Nebem einem
title-Element müssen sie weiteren Inhalt
beinhalten. Falls ein leeres Kapitel benötig wird, kann dies
durch das Einfügen eines leeren Absatzes
(para) erreicht werden.Ein leeres KapitelDas ist ein leeres Kapitel
]]>UnterkapitelBücher werden auf der obersten Gliederungsebene
durch chapter-Elemente in Kapitel
unterteilt. Eine weitergehende Untergliederung kann durch
das Anlegen von Unterkapiteln erreicht werden. Im Gegensatz
zu Kapiteln, die durch chapter-Elemente
ausgezeichnet werden, erfolgt die Auszeichnung von
Unterkapitel mit dem Element
sectn. Das
n in Elementnamen trifft eine
Aussage über die Gliederungstiefe, auf der sich das
Unterkapitel befindet. Ein sect1-Element
kann mehrere Elemente vom Typ sect2
enthalten, die die Unterkapitel der
nächsten Gliederungsebene darstellen.
sect5 ist das letzte Element, das auf
diese Art zur Gliederung eingesetzt werden kann.UnterkapitelEin BeispielkapitelEin beliebiger Text.Erster Abschnitt (1.1)
…
Zweiter Abschnitt (1.2)Erster Unterabschnitt (1.2.1)Erster Unterunterabschnitt (1.2.1.1)
…
Zweiter Unterabschnitt (1.2.2)
…
]]>Die Unterkapitel dieses Beispiels wurden zu
Demonstrationszwecken manuell durchnummeriert. In
normalen Dokumenten wird diese Aufgabe von
den Stylesheets übernommen.Bücher mittels part
unterteilenIn den Fällen, in denen die Unteilung eines Buches in
Kapitel nicht ausreichend ist, können mehrere
Kapitel mit dem Element part zu
einem Teil zusammengefasst werden.EinführungÜberblick
…
Was ist FreeBSD?
…
Die Geschichte von FreeBSD
…
]]>BlockelementeAbsätzeDocBook kennt drei Arten von Absätzen: Absätze
mit Überschrift (formalpara),
normale Absätze (para) und einfache
Absätze (simpara).Normale Absätze und einfache Absätze
unterscheiden sich dadurch, dass innerhalb von
para Blockelemente erlaubt sind,
innerhalb von simpara hingegen nicht. Es
ist empfehlenswert, para den Vorzug
zu geben.Absatz mit paraDas ist ein Absatz. Absätze können fast jedes andere
Element aufnehmen.]]>Darstellung:Das ist ein Absatz. Absätze können fast jedes andere
Element aufnehmen.BlockzitateBlockzitate sind textlich umfangreichere Zitate aus
einem anderen Text, die nicht innerhalb des aktuellen
Absatzes angezeigt werden sollen. Wahlweise können
Blockzitate eine Überschrift haben und die Zitatquelle
nennen.blockquoteEin Auszug aus dem Grundgesetz:
Menschenwürde; Grundrechtsbindung der staatlichen GewaltAus dem GrundgesetzDie Würde des Menschen ist unantastbar. Sie zu achten
und zu schützen ist Verpflichtung aller staatlichen
Gewalten.Das Deutsche Volk bekennt sich darum zu unverletzlichen
und unveräußerlichen Menschenrechten als Grundlage jeder
menschlichen Gemeinschaft, des Friedens und der
Gerechtigkeit in der Welt.Die nachfolgenden Grundrechte binden Gesetzgebung,
vollziehende Gewalt und Rechtsprechung als
unmittelbar geltendes Recht.
]]>Darstellung:
Menschenwürde; Grundrechtsbindung der
staatlichen GewaltAus dem GrundgesetzDie Würde des Menschen ist unantastbar. Sie
zu achten und zu schützen ist Verpflichtung
aller staatlichen Gewalten.Das Deutsche Volk bekennt sich darum zu
unverletzlichen und unveräußerlichen
Menschenrechten als Grundlage jeder menschlichen
Gemeinschaft, des Friedens und der Gerechtigkeit in
der Welt.Die nachfolgenden Grundrechte binden
Gesetzgebung, vollziehende Gewalt und Rechtsprechung
als unmittelbar geltendes Recht.
Tipps, Anmerkungen, Warnungen, wichtige Informationen
und RandbemerkungenIn bestimmten Fällen kann es nützlich sein,
dem Leser zusätzliche Informationen zu geben, die sich
vom Haupttext abheben, damit der Leser sie besser wahrnimmt.
Abhängig von der Art der Information, können
solche Stellen mit einem der Elemente tip
(für Tipps), note (für
Anmerkungen), warning (für
Warnungen), caution (für besonders
ernstzunehmende Warnungen) und important
(für wichtige Anmerkungen) ausgezeichnet werden. Trifft
keines dieser Element für die auszuzeichnende Stelle
zu, sollte diese mit dem Element sidebar
ausgezeichnet werden.Da die richtige Einordnung einer auszuzeichnenden
Textstelle nicht immer leicht zu treffen ist, werden in der
DocBook-Dokumentation folgende Empfehlungen gegeben:Eine Anmerkung (note) ist eine
Information, die von jedem Leser beachtet werden
sollte.Eine wichtige Anmerkung
(important) eine Variation einer
Anmerkung.Eine Warnung (warning)
betrifft einen möglichen Hardwareschaden
oder weist auf eine Gefahr für Leib und Leben
hin.Eine besonders ernstzunehmende Warnung
(caution) betrifft einen möglichen
Datenverlust oder Softwareschaden.warningWenn Sie FreeBSD auf Ihrer Festplatte installieren,
kann es sein, daß Sie Windows nie mehr benutzen wollen.
]]>Eine Warnung wird wie folgt dargestellt:Wenn Sie FreeBSD auf Ihrer Festplatte installieren,
kann es sein, dass Sie Windows nie mehr benutzen wollen.Listen und HandlungsanweisungenListen sind ein oft gebrauchtes Hilfsmittel, wenn es
darum geht, Informationen für den Benutzer
übersichtlich darzustellen oder eine Abfolge von
Arbeitsschritten zu beschreiben, die notwendig sind, um ein
bestimmtes Ziel zu erreichen. Zur Auszeichnung von Listen
stellt DocBook die Elemente itemizedlist,
orderedlist und
procedure zur Verfügung.DocBook kennt noch andere Elemente für die
Auszeichnung von Listen, die an dieser Stelle jedoch
nicht behandelt werden..itemizedlist und
orderedlist ähneln sehr stark ihren
HTML-Gegenstücken ul und
ol. Beide Listenarten müssen
mindestens ein Element listitem
enthalten. Das listitem Element
muss mindestens ein weiteres Blockelement
enthalten.procedure unterscheidet sich ein
wenig von den vorhergehenden. Es enthält
step-Elemente, die wiederum
step- oder
substel-Elemente enthalten können.
Ein step-Element kann nur Blockelemente
aufnehmen.itemizedlist,
orderedlist und
procedureDas ist das erste Listenelement.Das ist das zweite Listenelement.Das ist das erste Aufzählungselement.Das ist das zweite Aufzählungselement.Machen Sie zuerst dies.Und dann machen Sie das..Und jetzt noch das…]]>Darstellung:Das ist das erste Listenelement.Das ist das zweite Listenelement.Das ist das erste Aufzählungselement.Das ist das zweite Aufzählungselement.Machen Sie zuerst dies.Und dann machen Sie das..Und jetzt noch das…Dateiinhalte auszeichnenTechnische Dokumente enthalten oft auch
Konfigurationsbeispiele oder Quellcodeschnipsel. Zur
Auszeichnung dieser Inhalte, stellt Docbook das Element
programmlisting zur Verfügung. Im
Gegensatz zu anderen DocBook-Elementen wird der
Elementinhalt von programmlistingnicht normalisiert, das heißt,
dass alle Leerzeichen, Tabulatoren und
Zeilenumbrüche unverändert übernommen werden.
Aus diesem Grund ist es unter anderem wichtig, dass
sich der öffende Tag in der selben Zeile wie der Anfang
des darzustellenden Textes befindet. Gleiches gilt für
den schließenden Tag: Er muss sich am Ende der
letzten Zeile befinden. Wird das nicht beachtet, kann es
sein, dass unerwartete Leerzeichen und Leerzeilen in
der Ausgabe auftauchen.programlistingAm Ende sollte Ihr Programm wie folgt
aussehen:
#include <stdio.h>
int
main(void)
{
printf("Hallo Welt!\n");
}]]>Die spitzen Klammern der
#include-Anweisung können nicht direkt
verwendet werden, sondern müssen über ihre Entitäten
eingebunden werden.Darstellung:Am Ende sollte Ihr Programm wie folgt aussehen:#include <stdio.h>
int
main(void)
{
printf("Hallo Welt!\n");
}TextanmerkungenTextanmerkungen
auf Englisch:
callout
sind ein Mechanismus, um auf bestimmte Stellen in einem
vorhergehenden Beispiel oder Text zu verweisen.Um solche Verweise anzulegen, müssen die betreffenden
Stellen in den Beispielen
(programlisting,
literallayout, …) mit
co-Elementen markiert werden, wobei jedes
Element ein eindeutiges id-Attribut
besitzen muss. Anschließend sollte ein
calloutlist-Element eingefügt werden,
dessen Elemente sich auf die co-Elemente
des Beispiels beziehen und die jeweiligen Anmerkungen
enthalten.Das co- und das
calloutlist-ElementAm Ende sollte Ihr Programm wie folgt
aussehen:
#include <stdio.h>
int
main(void)
{
printf("Hallo Welt\n");
}Bindet die Headerdatei stdio.h ein.Bestimmt den Typ des Rückgabewertes von main().Ruft die Funktion printf() auf, die
Hallo Welt! auf der Standardausgabe ausgibt]]>Darstellung:Am Ende sollte Ihr Programm wie folgt aussehen:#include <stdio.h>
int
main(void)
{
printf("Hallo Welt\n");
}Bindet die Headerdatei stdio.h ein.Bestimmt den Typ des Rückgabewertes von main().Ruft die Funktion printf() auf, die
Hallo Welt! auf der Standardausgabe ausgibtTabellenIm Gegensatz zu HTML ist es nicht notwendig, Tabellen zu
Layoutzwecken einzusetzen, da die Layoutaufgabe von den
Stylesheets übernommen wird. Stattdessen sollten Tabellen
nur für die Auszeichnung von Daten in Tabellenform genutzt
werden.Vereinfacht betrachtet (für Details sollte die
DocBook-Dokumentation zu Rate gezogen werden) besteht eine
Tabelle, die entweder als formelle oder als informelle
Tabelle angelegt werden kann, aus einem
table-Element. Dieses Element selbst
beinhaltet mindestens ein Element tgroup,
das über ein Attribut die Spaltenanzahl der Tabelle
bestimmt. Innerhalb des Elementes tgroup
kann sich ein Element thead mit den
Spaltenüberschriften und ein Element
tbody mit dem eigentlichen Tabelleninhalt
befinden. Beide Elemente beinhalten
row-Elemente, die wiederum
entry-Elemente beinhalten. Jedes
entry-Element stellt eine einzelne
Tabellenzelle dar.Tabellen mittels informaltable
auszeichnenSpaltenüberschrift 1Spaltenüberschrift 2Zeile 1, Spalte 1Zeile 1, Spalte 2Zeile 2, Spalte 1Zeile 2, Spalte 2
]]>Darstellung:Spaltenüberschrift 1Spaltenüberschrift 2Zeile 1, Spalte 1Zeile 1, Spalte 2Zeile 2, Spalte 1Zeile 2, Spalte 2Verwenden Sie stets das Attribut pgwide
mit dem Wert 1, wenn Sie das Element
informaltable benutzen. Ein Bug des
Internet Explorers verhindert ansonsten die korrekte
Darstellung dieser Tabellen.Soll die Tabelle keinen Rand haben, kann das Attribut
frame mit dem Wert
none dem Element
informaltable hinzugefügt werden
(<informaltable frame="none">)).Tabelle mit Attribut
frame="none"Darstellung:Spaltenüberschrift 1Spaltenüberschrift 2Zeile 1, Spalte 1Zeile 1, Spalte 2Zeile 2, Spalte 1Zeile 2, Spalte 2Beispiele für den LeserOft gilt es, für dem Benutzer Beispiele
zu geben, die er dann selber nachvollziehen soll. Meist
handelt es sich dabei um interaktive Dialoge zwischen Mensch
und Maschine: Der Benutzer gibt einen Befehl ein und
erhält eine Antwort vom System. Ein Satz
von speziellen Elementen und Entitäten unterstützt
den Autor bei der Auszeichnung solcher Textstellen:screenGedacht zur Auszeichnung von Bildschirminhalten.
Im Unterschied zu anderen Elementen werden Leerzeichen
innerhalb des Elementes screen
unverändert übernommen.prompt,
&prompt.root; und
&prompt.user;Eingabeaufforderungen des Rechners
(Betriebssysten, Shell oder Anwendung) sind ein häufig
auftretender Teil dessen, was der Benutzer auf dem
Bildschirm zu sehen bekommt. Sie sollten mit
prompt ausgezeichnet werden.Ein Spezialfall sind die beiden
Eingabeaufforderungen der Shell für normale
Benutzer und den Superuser root.
Jedesmal wenn auf eine von diesen beiden Nutzerrollen
hingewiesen werden soll, sollte entweder
&prompt.root; oder
&prompt.user; eingesetzt
werden. Beide Entitäten können auch
außerhalb von screen
verwendet werden.&prompt.root; und
&prompt.user; sind
FreeBSD-spezifische Erweiterungen der DocBook DTD
und nicht in der originalen DocBook DTD
enthalten.userinputDas Element userinput ist
für die Auszeichnung von Benutzereingaben
gedacht.screen, prompt
und userinput&prompt.user; ls -1
foo1
foo2
foo3
&prompt.user; ls -1 | grep foo2
foo2
&prompt.user; suPassword:
&prompt.root; cat foo2
This is the file called 'foo2']]>Darstellung:&prompt.user; ls -1
foo1
foo2
foo3
&prompt.user; ls -1 | grep foo2
foo2
&prompt.user; suPassword:
&prompt.root; cat foo2
This is the file called 'foo2'Obgleich der Inhalt der Datei
foo2 in dem obigen Beispiel angezeigt
wird, sollte dieser nicht mit
programlisting ausgezeichnet werden.
Vielmehr sollte programlisting einzig
und allein für die Darstellung von Dateifragmenten
außerhalb von Benutzeraktionen gewählt
werden.FlußelementeHervorhebungenWenn es darum geht bestimmte Wörter oder Textstellen
hervorzuheben, sollte dafür das Element
emphasis verwendet werden. Das so
ausgezeichnete Text wird dann kursiv oder fett dargestellt;
im Falle einer Sprachausgabe würde es anders betont
werden.Im Gegensatz zu den HTML mit seinen Elementen
b und i, kennt DocBook
keinen Weg, um diese Darstellung zu
ändernAnmerkung des
Übersetzers: Hier sollte man sich noch einmal ins
Gedächtnis rufen, dass mittels der DocBook DTD nur
Inhalte ausgezeichnet werden und nicht das Layout
bestimmt wird.. Handelt es sich bei
dem darzustellenden um eine wichtige Information, kann
alternativ important verwendet
werden.Das Element emphasisFreeBSD ist zweifelslos das führende
Unix-artige Bestriebssystem für die Intel-Plattform.]]>Darstellung:FreeBSD ist zweifelslos das führende
Unix-artige Bestriebssystem für die Intel-Plattform.ZitateUm einen Auszug aus einer anderen Quelle zu zitieren
oder kenntlich zu machen, dass eine bestimmte Wendung
im übertragenen Sinne zu verstehen ist, kann der
betreffende Text mit Hilfe des Elementes
quote ausgezeichnet werden. Innerhalb von
quote können die meisten der
normalerweise zur Verfügung stehenden Elemente genutzt
werden.Richtig zitierenEs sollte immer sichergestellt werden, dass die Suche die Grenzen
zwischen lokaler und öffentlicher Administration
(RFC 1535) einhält.]]>Darstellung:Es sollte immer sichergestellt werden, das die Suche
die Grenzen zwischen lokaler und öffentlicher
Administration (RFC 1535) einhält.Tasten, Maustasten und TastenkombinationenDas Element keycap beschreibt
eine bestimmte Taste der Tastatur.
Für die Auszeichnung von Maustasten
steht analog das Element mousebutton zur
Verfügung. Mit Hilfe von keycombo
können beliebige Tasten- und Maustastenkombinationen
beschrieben werden.Das Element keycombo besitzt ein
Attribut action, dem einer der Werte
click, double-click,
other, press,
seq oder simul
zugewiesen werden kann. Die letzten beiden Werte deuten an,
dass die genannte Kombination nacheinander oder
gleichzeitig gedrückt werden soll. Die Stylesheets
fügen zwischen die einzelnen Unterelemente von
keycombo+-Zeichen
ein.Tasten, Maustasten und TastenkombinationenDiese Eingaben zeichnen Sie wie folgt aus:Mit der Tastenkombination AltF1 kann auf die zweite virtuelle Konsole
umgeschaltet werden.
Um vi zu beenden, ohne die Änderungen zu
speichern, muss Esc:q! eingegeben werden.Der Fenstermanager ist so konfiguriert, dass mittels
Altrechter Maustaste
Fenster verschoben werden können.]]>Darstellung:Mit der Tastenkombination AltF1 kann auf die zweite
virtuelle Konsole umgeschaltet werden.Um vi zu beenden, ohne die
Änderungen zu speichern, muss Esc:q! eingegeben werden.Der Fenstermanager ist so konfiguriert, dass mittels
Altrechter Maustaste
Fenster verschoben werden können.Anwendungen, Befehle, Optionen und HilfeseitenOft besteht die Notwendigkeit auf bestimmte Anwendungen
und Befehle zu verweisen. Der Unterschied zwischen einer
Anwendung und einem Befehl liegt darin, dass eine
Anwendung ein einzelnes oder eine Gruppe von Programmen ist,
mit denen eine bestimmte Aufgabe erledigt werden kann. Ein
Befehl hingegen ist der Name eines Programmes, dass der
Benutzer aufrufen kannDer Befehl
mozilla startet das Programm
mozilla..Desweiteren kann es auch vorkommen, dass die
von einem Programm (in einem bestimmten Fall)
akzeptierten Optionen genannt werden müssen.Schlußendlich ist es oft gewünscht, zu einem
Befehl dessen Abschnitt der Manualseiten im
Unix-üblichen Stil Befehl(Zahl)
anzugeben.Anwendungsnamen können mit application
ausgezeichnet werden.Befehle können zusammen mit der betreffenden
Hilfeseite über das DocBook-Element
citerefentry ausgezeichnet werden.
citerefentry muss zwei weitere
Elemente enthalten: refentrytitle,
für den Befehlsnamen, und manvolnum,
für die Kategorie der Hilfeseite.Diese Art auf Befehle zu verweisen kann sehr
ermüdent sein. Daher gibt es einen Satz von
Allgemeinen
Entitäten, der diese Arbeit erleichtert. Er
ist in der Datei
doc/share/sgml/man-refs.ent enhalten
und kann über den folgenden Bezeichner eingebunden
werden:PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN"Jede Entität in dieser Datei ist wie folgt aufgebaut:
&man.Hilfeseite.Kategorie;.Der Anfang eines Dokumentes, das diese Entitäten
einbindet, könnte so aussehen:<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
%man; … ]>Um Befehle innerhalb des Fließtextes auszuzeichen,
kann das Element command genutzt werden.
Die Optionen eines Befehles können mit Hilfe von
option ausgezeichnet werden.Wenn man sich mehrmals hintereinander auf den gleichen
Befehl bezieht, sollte man beim ersten Auftreten die Notation
&man.command.section;
verwenden. Für alle folgenden Referenzen sollte hingegen
command verwendet werden. Dadurch
verbessert sich das Erscheinungsbild, insbesondere von HTML,
deutlich.Die Unterscheidung zwischen command
und application kann schwer sein, und
manchmal ist die Entscheidung, welches Element das richtige
ist, nicht leicht. Das folgende Beispiel soll diese
Unterscheidung erleichtern.Anwendungen, Befehle und OptionenSendmail ist der verbreitetste
UNIX-Mailserver.
Sendmail besteht aus den Programmen
sendmail8, &man.mailq.1;, und &man.newaliases.1;.Mittels der Option kann
sendmail8 den Status der Mailwarteschlange ausgeben.
Der Status der Mailwarteschlange kann durch den Befehl
sendmail -bp überprüft werden.]]>Darstellung:Sendmail ist der
verbreitetste UNIX-Mailserver.Sendmail besteht aus den
Programmen
sendmail8,
&man.mailq.1; sowie &man.newaliases.1;.Mittels der Option kann
sendmail8 den Status der Mailwarteschlange ausgeben.
Der Status der Mailwarteschlange kann durch den Befehl
sendmail -bp überprüft
werden.Die Schreibweise
&man.Hilfeseite.Kategorie;
ist leichter lesbar.Dateien, Verzeichnisse und ErweiterungenImmer wenn in einem Text der Name einer Datei, eines
Verzeichnisses oder eine Dateierweiterung vorkommt, sollte
die betreffende Stelle mit dem Element
filename ausgezeichnet werden.Das Element filenameDie SGML-Quellen des
englischen Handbuches befinden sich im Verzeichnis
/usr/doc/en/handbook/. In
diesem Verzeichnis befindet sich eine Datei
handbook.sgml. Desweiteren sollte
sich eine Datei mit dem Namen
Makefile zusammen mit mehreren
Dateien mit der Endung .ent in diesem
Verzeichnis befinden.]]>Darstellung:Die SGML-Quellen des englischen Handbuches befinden
sich im Verzeichnis
/usr/doc/en/handbook/. In diesem
Verzeichnis befindet sich eine Datei
handbook.sgml. Desweiteren sollte
sich eine Datei mit dem Namen
Makefile zusammen mit mehreren
Dateien mit der Endung .ent in diesem
Verzeichnis befinden.PortnamenFreeBSD-ErweiterungDie hier genannten Elemente sind Bestandteil der
FreeBSD-Erweiterung für DocBook und sind nicht in der
originalen DocBook DTD enthalten.An einigen Stellen ist es notwendig, den Namen eines
Ports aus FreeBSDs Ports-Sammlung in Dokumenten zu verwenden.
In diesem Fall sollte ebenfalls das Element
filename eingesetzt werden, dabei aber
dem Element das Attribut role mit dem
Wert package zugewiesen werden. Da die
Ports-Sammlung an jeder beliebigen Stelle im Dateisystem
installiert werden kann, sollte filename
nur die Kategorie und den Namen des Ports enthalten, aber
nicht das Verzeichnis
/usr/ports.Portsnamen und das Element filenameWenn Sie Ihr Netz und dessen Datenverkehr analysieren
möchten, dann installieren Sie bitte den Port net/ethereal.]]>Darstellung:Wenn Sie Ihr Netz und dessen Datenverkehr analysieren
möchten, dann installieren Sie bitte den Port net/ethereal.Gerätedateien unterhalb von
/devFreeBSD-ErweiterungDie hier genannten Elemente sind Bestandteil der
FreeBSD-Erweiterung für DocBook und sind nicht in der
originalen DocBook DTD enthalten.Wird in einem Dokument Bezug auf Gerätedateien
unterhalb von dev
genommen, dann gibt es zwei Möglichkeiten diese
auszuzeichnen. Zum einen kann man sich auf das Gerät
beziehen, so wie es unter /dev zu
finden ist, und zum anderen kann man sich auf den
Gerätenamen beziehen, wie es innerhalb des Kerns
verwendet wird. Für letztere Möglichkeit sollte
das Element devicename genutzt
werden.Allerdings besteht nicht immer diese
Wahlmöglichkeit. Einige Geräte, wie zum Beispiel
Netzwerkkartenm haben keinen Eintrag unter
/dev oder werden anders
dargestellt.Gerätenamen per devicename
auszeichnenUnter FreeBSD wird die serielle Datenübertragung über
sio abgewickelt, das unterhalb von
/dev eine Reihe von Einträgen anlegt.
Zu diesen Einträgen behören beispielsweise
/dev/ttyd0 und
/dev/cuaa0.
Andererseits erscheinen Geräte wie beispielsweise
ed0 nicht unterhalb von
/dev.Unter MS-DOS wird das erste Diskettelaufwerk als
a: bezeichnet. FreeBSD
bezeichnet es als /dev/fd0.]]>Darstellung:Unter FreeBSD wird die serielle Datenübertragung
über sio abgewickelt, das
unterhalb von /dev eine Reihe von
Einträgen anlegt. Zu diesen Einträgen
behören beispielsweise
/dev/ttyd0 und
/dev/cuaa0.Andererseits erscheinen Geräte wie beispielsweise
ed0 nicht unterhalb von
/dev.
Unter MS-DOS wird das erste Diskettelaufwerk als
a: bezeichnet. FreeBSD bezeichnet
es als /dev/fd0.Rechner, Domains, IP-Adressen und mehrFreeBSD-ErweiterungDie hier genannten Elemente sind Bestandteil der
FreeBSD-Erweiterung für DocBook und sind nicht in der
originalen DocBook DTD enthalten.Bezeichner für Rechner können in Abhängigkeit
der Bezeichnungsweise auf verschiedene Art und Weise
ausgezeichnet werden. Gemeinsam ist allen, dass sie
das Element hostid benutzen. Über das
Attribut role wird die Art des Bezeichners
genauer bestimmt.Kein Rollenattribut oder
role="hostname"Ohne Rollenattribut stellt der umschlossene Text
einen normlen Rechnernamen wie
freefall oder
wcarchive dar. Wenn es
gewünscht ist, kann mittels
role="hostname" explizit angegeben
werden, dass es sich um einen Rechnernamen
handelt.role="domainname"Ein Domainname wie FreeBSD.org
oder ngo.org.uk. Er enthält keinen
Rechnernamen.role="fqdn"Vollqualifizierter Domainname wie
www.FreeBSD.org. Enthält sowohl
einen Domainnamen als auch einen Rechnernamen.role="ipaddr"Eine IP-Adresse, meistens als durch Doppelpunkte
getrenntes Tupel von vier Zahlen dargestellt.role="ip6addr"Eine IPv6-Adresse.role="netmask"Eine Netzwerkmaske, dargestellt als ein durch
Doppelpunkte getrenntes Vierzahlentupel, einer Hexzahl
oder als ein /, dem eine Zahl
folgt.role="mac"Eine MAC-Adresse, dargestellt durch zweistellige
Hexzahlen, die durch Doppelpunkte getrennt
sind.role und
hostidDer lokale Rechner kann immer über den Namen
localhost angesprochen werden, dem immer
die IP-Adresse
127.0.0.1 zugeordnet ist.
Zur Domain FreeBSD.org
gehören verschiedene Rechner, inklusive freefall.FreeBSD.org und pointyhat.FreeBSD.org.Wenn eine IP-Adresse einer Netzwerkkarte zugeordnet wird,
was mit der Hilfe von ifconfig geschieht,
sollte immer die Netzmaske
255.255.255.255, die auch
hexadezimal als 0xffffffff
abgegeben werden kann, benutzt werden.Die MAC-Adresse ist für jede existierende Netzwerkkarte
auf der Welt eindeutig. Eine typische MAC-Adresse ist
beispielsweise 08:00:20:87:ef:d0.]]>Darstellung:Der lokale Rechner kann immer über den Namen
localhost angesprochen werden, dem immer
die IP-Adresse 127.0.0.1
zugeordnet ist.Zur Domain FreeBSD.org gehören
verschieden Rechner, inklusive freefall.FreeBSD.org und bento.FreeBSD.org.Wenn eine IP-Adresse einer Netzwerkkarte zugeordnet
wird, was mit der Hilfe von ifconfig
geschieht, sollte immer die Netzmaske
255.255.255.255, die auch
hexadezimal als 0xffffffff
abgegeben werden kann, benutzt werden.Die MAC-Adresse ist für jede existierende
Netzwerkkarte auf der Welt eindeutig. Eine typische
MAC-Adresse ist beispielsweise 08:00:20:87:ef:d0.BenutzernamenFreeBSD-ErweiterungDie hier genannten Elemente sind Bestandteil der
FreeBSD-Erweiterung für DocBook und sind nicht in der
originalen DocBook DTD enthalten.Namen von Benutzern, wie
root oder bib,
können mit dem Element username
ausgezeichnet werden.Das Element usernameFür die meisten Administrationsaufgaben müssen
Sie als root angemeldet sein.]]>Darstellung:Für die meisten Administrationsaufgaben müssen Sie als
root angemeldet sein.Beschreibung von MakefilesFreeBSD-ErweiterungDie hier genannten Elemente sind Bestandteil der
FreeBSD-Erweiterung für DocBook und sind nicht in der
originalen DocBook DTD enthalten.Zur Beschreibung von Teilen einer Makedatei stehen die
beiden Elemente marketarget und
makevar zur Verfügung.
maketarget bezeichnet ein Ziel eines
Makefiles, das als Parameter beim
Aufruf von make angegeben werden kann.
makevar hingegen bezeichnet eine
Variable, die entweder in einem
Makefile definiert oder
make auf der Befehlszeile übergeben
werden kann, um so den Bauprozess zu beeinflussen.maketarget und
makevarZwei übliche Ziele in einem Makefile
sind all und
clean.
Üblicherweise wird, wenn das Ziel all
aufgerufen wird, die gesamte Anwendung neu erstellt. Der Aufruf
des Zieles clean veranlaßt das
Löschen aller temporären Dateien (zum Beispiel
.o), die während der Übersetzung erzeugt
wurden.Das genaue Verhalten von clean
kann von einer Reihe von Variablen beeinflußt werden.
Stellvertretend seien hier CLOBBER und
RECURSE genannt.]]>Darstellung:Zwei übliche Ziele in einem
Makefile sind
all und
clean.Üblicherweise wird, wenn das Ziel
all aufgerufen wird, die gesamte
Anwendung neu erstellt. Der Aufruf des Zieles
clean veranlaßt das
Löschen aller temporären Dateien (zum Beispiel
.o), die während der
Übersetzung erzeugt wurden.Das genaue Verhalten von
clean kann von einer Reihe von
Variablen beeinflußt werden. Stellvertretend seien
hier CLOBBER und
RECURSE genannt.Text buchstabengetreu übernehmenFür das Handbuch ist es oft notwendig, Textausschnitte
buchstabengetreu darzustellen. Hierbei kann es sich um Texte
handeln, die aus einer anderen Datei stammen oder die der
Leser eins-zu-eins aus dem Handbuch kopieren können
soll.In einigen Fällen ist zu diesem Zwecke
programlisting ausreichend, jedoch nicht
immer. So ist programlisting zum Beispiel
nicht einsetzbar, wenn es darum geht, einen Auszug aus einer
Datei innerhalb eines Absatzes einzufügen. In solchen Fällen
sollte das Element literal zum Einsatz
kommen.literalDie Zeile maxusers 10 in der
Kernelkonfigurationsdatei beeinflußt die Größe vieler
Systemtabellen und kann als ungefähr als Richtwert dafür
gelten, wie viele paralle Anmeldungen das System handhaben
kann.]]>Darstellung:Die Zeile maxusers 10 in der
Kernelkonfigurationsdatei beeinflußt die Größe vieler
Systemtabellen und kann als ungefähr als Richtwert dafür
gelten, wie viele paralle Anmeldungen das System handhaben
kann.Benutzerspezifische Eingaben darstellenEs kommt oft vor, dass der Leser Beispiele,
Dateinamen oder Kommandozeilen verändern muss.
Für einen solchen Anwendungsfall
ist das Element replaceable gedacht. Es
kann innerhalb von anderen Elementen
genutzt werden, um die Teile auszuzeichnen, die es zu
ersetzen gilt.Das Element replaceable&prompt.user; man command]]>Darstellung:&prompt.user; man commandDieses Beispiel zeigt, dass nur der Text mit
replaceable umschlossen werden soll,
den der Benutzer einzusetzen hat. Sämtlicher anderer
Text sollte wie üblich ausgezeichnet werden.Die Zeile
maxusers n
in der Kernelkonfigurationsdatei bestimmt die Größe vieler Systemtabellen
und stellt einen groben Richtwert dafür dar, wie viele gleichzeitige Anmeldungen
das System unterstützt.
Für einen Arbeitsplatzrechner stellt 32 einen guten
Wert für n dar.]]>Darstellung:Die Zeile maxusers
n in der
Kernelkonfigurationsdatei bestimmt die Größe
vieler Systemtabellen und stellt einen groben Richtwert
dafür dar, wie viele gleichzeitige Anmeldungen das
System unterstützt.Für einen Arbeitsplatzrechner stellt
32 einen guten Wert für
n dar.Fehlermeldungen des Systems darstellenIn manchen Fällen kann es nötig sein,
Fehlermeldungen darzustellen, die von FreeBSD erzeugt werden
können. Für solche Fälle ist das Element
errorname vorgesehen.Das Element errornamePanic: cannot mount root ]]>Darstellung:Panic: cannot mount rootBilder und GrafikenDie Verwendung von Grafiken innerhalb der Dokumentation
ist momentan noch in einem experimentellen Stadium. Es ist
daher wahrscheinlich, dass sich die hier beschriebenen
Mechanismen noch ändern werden.Für die Verwendung von Grafiken ist es notwendig,
den Port graphics/ImageMagick
zusätzlich zu installieren, da er
nicht vom Port textproc/docproj mitinstalliert
wird.Das beste Beispiel für den Einsatz von Grafiken ist
der unter
doc/en_US.ISO8859-1/articles/vm-design/
zu findene Artikel Design elements of the FreeBSD VM
system. Falls beim Lesen der folgenden Kapitel
Fragen unbeantwortet oder unklar bleiben, empfiehlt es sich,
die unter dem genannten Verzeichnis befindlichen Dateien zu
studieren und anhand ihrer zu verstehen, wie alles
zusammenhängt. Es empfiehlt sich, den Artikel in
verschiedenen Ausgabeformaten zu erzeugen, da man so sehen
kann, wie die Grafiken in Abhängigkeit vom
Ausgabemedium angeordnet werden.Unterstütze GrafikformateZur Zeit werden nur zwei Grafikformate unterstützt.
Welches von beiden Formaten zum Einsatz kommen sollte,
hängt von der Art der Grafik ab.Für Bilder, die vorrangig Vektorelemente wie
Netzwerkdiagramme, Zeitlinien und ähnliches beinhalten,
sollte Encapsulated Postscript als Format gewählt
werden. Wichtig ist es in diesem Fall, dass die
Grafikdatei die Endung .eps hat.
Für Bitmapgrafiken, wie zum Beispiel Bildschirmfotos,
steht das Portable Network Grafic Format zur
Verfügung. In diesem Fall, sollte die Grafikdatei immer
die Endung .png haben.In das CVS-Archiv sollten nur
Grafiken in diesen beiden Formaten übernommen
werden.Es sollte darauf sehr darauf geachtet werden, das
richtige Format für das richtige Bild zu wählen.
Erwartungsgemäß wird es Dokumente geben, die eine
Mischung aus PNG- und EPS-Grafiken enthalten. In solchen
Fällen, stellen die Makedateien die Verwendung des
richtigen Formats in Abhängigkeit vom Ausgabeformat
sicher. Deshalb sollte die gleiche Grafik niemals
in zwei unterschiedlichen Formaten in das CVS-Archiv
übernommen werden.Es ist absehbar, dass das Dokumentationsprojekt
in Zukunft das Scalable Vector Graphic-Format (SVG) als
Standardformat für Vektorgrafiken übernehmen
wird. Zum jetzigen Zeitpunkt ist dieser Wechsel noch nicht
möglich, da der Stand der jetzigen SVG-Anwendungen
noch nicht den dafür notwendigen Erfordernissen
entspricht.DocBook-Elemente für den GrafikeinsatzDas Auszeichnen von Bildern mittels DocBook ist relativ
einfach. Zuerst wird ein
mediaobject-Element eingefügt, das
als Container für medienspezifische Elemente fungieren
kann. Für die Zwecke des FDPs sind das die Elemente
imageobject und
textobject.In das mediaobject-Element sollten
ein Element vom Typ imageobject und zwei
textobject-Elemente eingefügt
werden. Das imageobject-Element verweist
auf die eigentliche Grafikdatei. Dabei ist allerdings nur
der Dateipfad ohne Erweiterung anzugegeben. Die
textobject-Elemente werden dafür
genutzt, Texte aufzunehmen, die dem Leser anstelle des
Bildes oder zusammen mit dem Bild angezeigt werden.Dies kann unter zwei Umständen geschehen:Wenn ein Dokument als HTML-Datei durch einem Browser
angezeigt wird. In diesem Falle muss jeder Grafik
ein Alternativtext zugeordnet werden, der dem Leser
angezeigt werden kann. Meist ist das notwendig, wenn der
Browser die Grafik noch nicht geladen hat oder wenn der
Benutzer den Mauszeiger über die Grafik
führt.Wenn das Dokument als Textdatei gelesen wird. Da in
einer Textdatei keine Grafiken angezeigt werden können,
sollte es für die Grafik eine Textentsprechung geben,
die alternativ angezeigt werden kann.Das folgende Beispiel soll das bisher geschriebene
illustrieren. Angenommen es liegt eine einzubindene Grafik
in der Datei bild1 vor, die die
Darstellung eines As in einem Rechteck enthält. Die
ASCII-Alternative könnte so ausgezeichnet werden:<mediaobject>
<imageobject>
<imagedata fileref="bild1">
</imageobject>
<textobject>
<literallayout class="monospaced">+ - - - - - - - - - - - - - - -+
| A |
+- - - - - - - - - - - - - - -+</literallayout>
</textobject>
<textobject>
<phrase>Ein Bild</phrase>
</textobject>
</mediaobject>Innerhalb vom Element imageobject
befindet sich ein Element imagedata,
welches mit Hilfe des Attributes
fileref den Namen der Grafikdatei
(ohne Erweiterung) angibt. Die Bestimmung der
Dateierweiterung wird von den Stylesheets
übernommen.Das erste textobject-Element
enthält ein literallayout-Element,
dessen Attribut class den Wert
monospaced zugewiesen bekommt. Der
Inhalt dieses Elements wird genutzt, wenn das Dokument
in Textform ausgegeben wird. An dieser Stelle hat der
Autor die Möglichkeit seine
Textzeichenkünste unter Beweis zu
stellen.Wichtig ist, dass die erste und die letzte
Zeile sich gleichauf mit dem öffenden und dem
schließenden Tag befindet. Dadurch wird
sichergestellt, dass keine unnötigen
Leerzeichen in die Ausgabe aufgenommen werden.Das zweite textobject-Element
sollte lediglich ein phrase-Element
enthalten. Wird das Dokument nach HTML konvertiert, wird
dessen Inhalt für das Attribut
alt des img-Tags
verwendet.Die Makefile-EinträgeAlle in einem Dokument verwendeten Grafiken müssen in
dem zugehörigen Makefile in der Variable
IMAGES enthalten sein.
IMAGES sollte immer die Namen der
Quellgrafiken enthalten. Werden in
einem Dokument beispielsweise die drei Grafiken
bild1.eps,
bild2.png und
bild3.png referenziert, sollte das
Makefile die folgende Zeile
enthalten:…
IMAGES= bild1.eps bild2.png bild3.png
…Eine andere Möglichkeit wäre:…
IMAGES= bild1.eps
IMAGES+= bild2.png
IMAGES+= bild3.png
…Es kann nicht oft genug betont werden: Welche
Grafikdateien für das zu erzeugende Dokument benötigt
werden, wird von dem Makefiles bestimmt.
IMAGES darf nur die Originaldateien
enthalten.Grafiken und Kapitel in UnterverzeichnissenWenn Sie Ihre Dokumentation in mehrere kleine
Dateien aufspalten (siehe
),
müssen Sie sorgfältig vorgehen.Angenommen es handelt sich um ein Buch, dessen drei
Kapitel in separaten Verzeichnissen angelegt wurden
(kapitel1/kapitel.sgml,
kapitel2/kapitel.sgml und
kapitel3/kapitel.sgml). Enthalten die
Kapitel Grafiken, empfiehlt es sich, diese in den gleichen
Verzeichnisses abzulegen, wie die Kapitel selbst. In diesem
Falle gilt es jedoch zu beachten, dass die Pfade der
Grafikdateien in der Variable IMAGES und
in den imagedata-Elementen immer auch den
Verzeichnisnamen mitenthalten.Soll beispielsweise die Datei
kapitel1/bild1.png in das in
kapitel1/kapitel.sgml enthaltene
Kapitel eingebunden werden, sollte dies so erfolgen:<mediaobject>
<imageobject>
<imagedata fileref="kapitel1/bild1">
</imageobject>
…
</mediaobject>fileref muss den
Datei- und den Verzeichnisnamen enthalten.Das Makefile muss dementsprechend
die Zeile
…
IMAGES= kapitel1/bild1.png
…
enthalten.Wird dies beachtet, sollte es zu keinen Problemen
kommen.QuerverweiseQuerverweise sind auch Flußelemente.Querverweise innerhalb eines DokumentesUm innerhalb eines Dokumentes Verweise anzulegen, muss
angegeben werden, von welcher Textstelle aus wohin verwiesen
werden soll.Jedes DocBook-Element besitzt ein Attribut
id, über das seinem Element ein
eindeutiger Bezeichner zugewiesen werden kann.In den meisten Fällen werden Querverweise nur zu
Kapiteln gesetzt. Die chaper- und
sect*-Elemente sollten aus diesem Grunde
ein gesetztes id-Attribut
besitzen.chapter und section
mit dem Attribut idEinführungDas ist eine Einführung. Sie enthält ein Unterkapitel, das
ebenfalls einen eigenen Bezeichner hat.Unterkapitel 1Das ist ein Unterkapitel.
]]>Als Wert für das Attribut id
sollte immer ein selbsterklärender Bezeichner gewählt
werden. Zudem ist es notwendig, dass dieser Bezeichner
innerhalb des Dokumentes eindeutig ist. Im obigen Beispiel
wurde der Bezeichner für das Unterkapitel gebildet,
indem der Bezeichner des übergeordneten Kapitels um den
Titel des Unterkapitels erweitert wurde. Diese
Vorgehensweise hilft sicherzustellen, dass Bezeichner
eindeutig sind und bleiben.Manchmal soll jedoch nicht auf den Anfang eines Kapitels
verwiesen werden, sondern zum Beispiel auf eine Stelle in
einem Absatz oder auf ein bestimmtes Beispiel. In solchen
Fällen kann an der Stelle, auf die verwiesen werden
soll, das Element anchor mit gesetztem
Attribut id eingefügt werden.
anchor kann selber keinen weiteren Inhalt
aufnehmen.Querverweise und das Element
anchorDieser Absatz enthält ein
Ziel für Querverweise, was jedoch keine
Auswirkung auf dessen Darstellung hat.]]>Zum Anlegen des eigentlichen Querverweises selbst kann
eines der beiden Elemente xref oder
link genutzt werden. Beide besitzen das
Attribut linkend, dem der
id-Wert des Verweiszieles zugewiesen
wird. Ob sich das Ziel vor oder nach dem Verweis befindet,
spielt keine Rolle.xref und link
unterscheiden sich jedoch hinsichtlich der Art und Weise,
auf die der Text erzeugt wird, auf dem der Querverweis
liegt. Kommt xref zum Einsatz, hat der
Autor keine Kontrolle darüber – der Text wird
automatisch für ihn erzeugt.Einsatz von xrefFür dieses Beispiel wird davon ausgegangen, dass sich
folgendes Textfragment irgendwo innerhalb eines Dokumentes
auftaucht, dass das vorherige
id-Beispiel enthält.Weitere Informationen gibt
es im .
Genauere Informationen können im
gefunden werden.]]>Der Verweistext wird automatisch von den Stylesheets
erzeugt und so hervorgehoben, dass ersichtlich ist,
dass es sich bei dem Text um einen Verweis
handelt.
Weitere Informationen können in der
Einführung gefunden
werden.Genauere Informationen können im
Unterkapitel 1 gefunden
werden.
Der Text, auf dem der HTML-Link für den Querverweis
liegt, wurde von den Kapitelüberschriften
übernommen.Das bedeutet, dass es nicht
möglich ist, mit der Hilfe von
xref einen Querverweis zu einer mit
anchor gekennzeichneten Stelle
anzulegen. Da anchor keinen Inhalt
aufnehmen kann, können die Stylesheets nicht
automatisch einen Text für den Verweis
erzeugen.Möchte man selber den für den Verweis
benutzten Text bestimmen können, sollte das Element
link verwendet werden. Im Gegensatz zu
xref kann link Inhalt
aufnehmen, der dann für den Verweis verwendet
wird.link beutzenFür dieses Beispiel wird davon ausgegangen, dass
es sich in dem Dokument befindet, das auch
das id-Beispiel enthält.Weitere Informationen können
im ersten Kapitel gefunden
werden.
Genauere Informationen können in
diesem Kapitel
gefunden werden.]]>Aus diesem SGML-Fragment würden die Stylesheets
folgendes generieren (der hervorgehobene Text deutet den
erzeugten Verweis an):
Weitere Informationen können im ersten
Kapitel gefunden werden.Genauere Informationen können in
diesem Kapitel gefunden
werden.
Das letzte Beispiel ist schlecht. Es sollten niemals
Wörter wie dieses oder
hier als Linktext benutzt werden. Solche
Wörter zwingen den Leser dazu, den Kontext des
Verweises zu lesen, um zu verstehen, wohin der Verweis
führt.Mit dem Element linkkann auf mit
anchor gekennzeichnete Stellen im
Dokument verwiesen werden, da der Inhalt von
link als Text für den Querverweise
genutzt wird.Verweise auf Dokumente im WWWDas Anlegen von Verweisen auf externe Dokumente ist
wesentlich einfacher – solange die URL des zu
referenzierenden Dokumentes bekannt ist. Um von einem
bestimmten Textabschnitt auf das gewünschte externe
Dokument zu verweisen, muss die jeweilige Stelle mit
dem Element ulink ausgezeichnet werden.
Mittels des Attributes url kann die
Adresse des Zieldokumentes angegeben werden. Bei der
Umformung des Quelldokumentes in die verschiedenen
Ausgabeformate wird der sich zwischen Start- und Endtag
befindliche Text für den Verweis übernommen, den
der Leser aufrufen kann.Verweise mit ulinkNatürlich ist es möglich, anstatt diesen Text
weiterzulesen, sofort die
FreeBSD-Homepage
aufzurufen.]]>Darstellung:Natürlich ist es möglich, anstatt diesen Text
weiterzulesen, sofort die FreeBSD-Homepage
aufzurufen.
diff --git a/de_DE.ISO8859-1/books/handbook/config/chapter.sgml b/de_DE.ISO8859-1/books/handbook/config/chapter.sgml
index 5807a46954..e9e19ae17f 100644
--- a/de_DE.ISO8859-1/books/handbook/config/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/config/chapter.sgml
@@ -1,3492 +1,3492 @@
ChernLeeGeschrieben von MikeSmithNach einem Tutorium von MattDillonBasiert ebenfalls auf tuning(7) von MartinHeinenÜbersetzt von Konfiguration und TuningÜbersichtSystem-KonfigurationSystem-OptimierungEin korrekt konfiguriertes System kann die Arbeit,
die bei der zukünftigen Pflege und bei Migrationen des Systems
entsteht, erheblich reduzieren. Dieses Kapitel beschreibt die
Konfiguration von &os; sowie Maßnahmen zur Leistungssteigerung
von &os;-Systemen.Nachdem Sie dieses Kapitel durchgearbeitet haben,
werden Sie Folgendes wissen:Wie Sie effizient Dateisysteme und
Swap-Partitionen auf Ihrer Festplatte einrichten.Die Grundlagen der Konfiguration mit
rc.conf und des Systems zum Starten
von Anwendungen in /usr/local/etc/rc.d.Wie Sie Netzwerkkarten konfigurieren und testen.Wie Sie virtuelle Hosts und Netzwerkgeräte
konfigurieren.Wie Sie die verschiedenen Konfigurationsdateien
in /etc benutzen.Wie Sie mit sysctl-Variablen &os;
einstellen können.Wie Sie die Platten-Performance einstellen und Kernel-Parameter
modifizieren können.Bevor Sie dieses Kapitel lesen, sollten Siedie Grundlagen von &unix; und &os; ()
verstehen.Damit vertraut sein, wie Sie einen Kernel konfigurieren
und kompilieren ().Vorbereitende KonfigurationLayout von PartitionenLayout von Partitionen/etc/var/usrPartitionenWenn Sie Dateisysteme mit &man.bsdlabel.8; oder
&man.sysinstall.8; anlegen, sollten Sie beachten, dass
Festplatten auf Daten in den äußeren Spuren
schneller zugreifen können als auf Daten in den
inneren Spuren. Daher sollten die kleineren oft benutzten
Dateisysteme, wie das Root-Dateisystem oder die Swap-Partition,
an den äußeren Rand der Platte gelegt werden.
Die größeren Partitionen wie /usr sollten in die inneren Bereiche
gelegt werden. Es empfiehlt sich, die Partitionen in einer
ähnlichen Reihenfolge wie Root-Partition, Swap, /var und /usr anzulegen.Die Größe der /var-Partition ist abhängig vom
Zweck der Maschine. Das /var-Dateisystem enthält
hauptsächlich Postfächer, den Spoolbereich zum Drucken und
Logdateien. Abhängig von der Anzahl der Systembenutzer und der
Aufbewahrungszeit für Logdateien, können gerade
die Postfächer und Logdateien zu ungeahnten Größen
wachsen. Die meisten Benutzer werden selten mehr als etwa ein
Gigabyte in /var
benötigen.Ein paar Mal wird es vorkommen, dass viel Festplattenspeicher
in /var/tmp gebraucht
wird. Wenn neue Software mit &man.pkg.add.1; installiert wird,
extrahieren die Paketwerkzeuge eine vorübergehende Kopie der
Pakete unter /var/tmp. Die
Installation grosser Softwarepakete wie
Firefox oder
Openoffice kann sich wegen zu wenig
Speicherplatz in /var/tmp
als trickreich herausstellen.
-
+
Die /usr-Partition
enthält viele der Hauptbestandteile des Systems, dazu
gehöhren die &man.ports.7;-Sammlung (empfohlen) und die Quellen
(optional). Sowohl die Ports als auch die Quellen des Basissystems
sind zum Zeitpunkt der Installation optional, trotzdem sollten Sie
mindestens zwei Gigabyte für diese Partition
vorsehen.Wenn Sie die Größe der Partitionen festlegen,
beachten Sie bitte das Wachstum Ihres Systems. Wenn Sie den
Platz auf einer Partition vollständig aufgebraucht haben,
eine andere Partition aber kaum benutzen, kann die Handhabung des
Systems schwierig werden.Die automatische Partitionierung von &man.sysinstall.8;
mit Auto-defaults legt manchmal zu kleine
/ und /var-Partition an. Partitionieren Sie
weise und großzügig.Swap PartitionSwap-PartitionGrößeSwap-PartitionAls Daumenregel sollten Sie doppelt soviel Speicher
für die Swap-Partition vorsehen, als Sie Hauptspeicher
haben. Verfügt die Maschine beispielsweise über
128 Megabyte Hauptspeicher, sollten Sie 256 Megabyte
für den Swap-Bereich vorsehen. Systeme mit weniger Speicher
werden wahrscheinlich mit viel mehr Swap mehr leisten. Es
wird nicht empfohlen, weniger als 256 Megabyte Swap einzurichten.
Außerdem sollten Sie künftige Speichererweiterungen
beachten, wenn Sie die Swap-Partition einrichten. Die
VM-Paging-Algorithmen im Kernel sind so eingestellt, dass
Sie am besten laufen, wenn die Swap-Partition mindestens
doppelt so groß wie der Hauptspeicher ist. Zu wenig
Swap kann zu einer Leistungsverminderung im
VM page scanning
Code führen, sowie Probleme verursachen, wenn Sie später
mehr Speicher in Ihre Maschine bauen.Auf größeren Systemen mit mehreren SCSI-Laufwerken
(oder mehreren IDE-Laufwerken an unterschiedlichen Controllern)
empfehlen wir Ihnen, Swap-Bereiche auf bis zu
vier Laufwerken einzurichten. Diese Swap-Partitionen sollten
ungefähr dieselbe Größe haben. Der Kernel
kann zwar mit beliebigen Größen umgehen, aber
die internen Datenstrukturen skalieren bis zur vierfachen
Größe der größten Partition. Ungefähr
gleich große Swap-Partitionen erlauben es dem Kernel,
den Swap-Bereich optimal über die Laufwerke zu verteilen.
Große Swap-Bereiche, auch wenn sie nicht oft gebraucht
werden, sind nützlich, da sich ein speicherfressendes
Programm unter Umständen auch ohne einen Neustart des Systems
beenden lässt.Warum partitionieren?Gegen eine einzelne Partition sprechen mehrere Gründe.
Jede Partition hat im Betrieb unterschiedliche Eigenschaften
und die Trennung der Partitionen erlaubt es, die Dateisysteme
an diese Eigenschaften anzupassen. Die Root- und /usr-Partitionen weisen meist nur
lesende Zugriffe auf, während /var und /var/tmp hauptsächlich
beschrieben werden.Indem Sie ein System richtig partitionieren, verhindern
Sie, dass eine Fragmentierung in den häufig beschriebenen
Partitionen auf die meist nur gelesenen Partitionen
übergreift. Wenn Sie die häufig beschriebenen
Partitionen an den Rand der Platte, legen, dann wird die
I/O-Leistung diesen Partitionen steigen.
Die I/O-Leistung ist natürlich auch für große
Partitionen wichtig, doch erzielen Sie eine größere
Leistungssteigerung, wenn Sie /var an den Rand der Platte legen.
+ class="directory">/var an den Rand der Platte legen.
Schließlich sollten Sie noch die Stabilität des Systems
beachten. Eine kleine Root-Partition, auf die meist nur lesend
zugegriffen wird, überlebt einen schlimmen Absturz
wahrscheinlich eher als eine große Partition.Basiskonfigurationrc-Dateienrc.confInformationen zur Systemkonfiguration sind hauptsächlich
in /etc/rc.conf, die meist beim Start
des Systems verwendet wird, abgelegt. Der Name der Datei zeigt
ihren Zweck an: Sie enthält die Konfigurationen für
die rc* Dateien.In rc.conf werden die Vorgabewerte aus
/etc/defaults/rc.conf überschrieben.
Die Vorgabedatei sollte nicht nach /etc kopiert werden, da sie die
Vorgabewerte und keine Beispiele enthält. Jede systemspezifische
Änderung wird in rc.conf vorgenommen.Um den administrativen Aufwand gering zu halten, existieren
in geclusterten Anwendungen mehrere Strategien,
globale Konfigurationen von systemspezifischen Konfigurationen
zu trennen. Der empfohlene Weg hält die globale Konfiguration
in einer separaten Datei z.B. rc.conf.site.
Diese Datei wird dann in /etc/rc.conf,
die nur systemspezifische Informationen enthält, eingebunden.Da rc.conf von &man.sh.1; gelesen
wird, ist das einfach zu erreichen:rc.conf: . /etc/rc.conf.site
hostname="node15.example.com"
network_interfaces="fxp0 lo0"
ifconfig_fxp0="inet 10.1.1.1"rc.conf.site: defaultrouter="10.1.1.254"
saver="daemon"
blanktime="100"rc.conf.site kann dann auf jedes
System mit rsync verteilt werden,
rc.conf bleibt dabei systemspezifisch.Bei einem Upgrade des Systems mit &man.sysinstall.8; oder
make world wird rc.conf
nicht überschrieben, so dass die Systemkonfiguration
erhalten bleibt.Konfiguration von AnwendungenInstallierte Anwendungen haben typischerweise
eigene Konfigurationsdateien, die eine eigene Syntax
verwenden. Damit diese Dateien leicht von der
Paketverwaltung gefunden und verwaltet werden können,
ist es wichtig, sie vom Basissystem zu trennen./usr/local/etcFür gewöhnlich werden diese Dateien in /usr/local/etc installiert. Besitzt
eine Anwendung viele Konfigurationsdateien, werden
diese in einem separaten Unterverzeichnis abgelegt.Wenn ein Port oder ein Paket installiert wird, werden
normalerweise auch Beispiele für die Konfigurationsdateien
installiert. Diese erkennt man gewöhnlich an dem
Suffix .default. Wenn keine Konfigurationsdateien
für eine Anwendung existieren, werden sie durch
Kopieren der .default Dateien erstellt.Als Beispiel sei /usr/local/etc/apache gezeigt:-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf
-rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default
-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf
-rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default
-rw-r--r-- 1 root wheel 12205 May 20 1998 magic
-rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default
-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types
-rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default
-rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf
-rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.defaultAnhand der Dateigröße erkennen Sie, dass sich
nur srm.conf geändert hat. Eine
spätere Aktualisierung des Apache-Ports
überschreibt diese Datei nicht.TomRhodesBeigetragen von Start von DienstenDiensteViele Benutzer installieren Software Dritter auf &os;
mithilfe der Ports-Sammlung. Häufig soll die
Software bei einem Systemstart mitgestartet werden.
Beispielsweise sollen die Dienste
mail/postfix oder
www/apache13 nach
einem Systemstart laufen. Dieser Abschnitt stellt
die Startprozeduren für Software Dritter vor.Unter &os; werden die meisten der im System enthaltenen
Dienste wie &man.cron.8; mithilfe von Systemskripten gestartet.
Diese Skripten sind abhängig von der &os;- oder
Hersteller-Version. Allerdings kann ein Dienst mit
einfachen Skripten gestartet werden.Dienste über das
rc.d-System startenMit rc.d lässt sich der Start
von Anwendungen besser steuern als mit den vorher besprochenen
Startskripten. Mit den im Abschnitt
rc.d
besprochenen Schlüsselwörtern können
Anwendungen in einer bestimmten Reihenfolge (zum Beispiel
nach DNS) gestartet werden und
Optionen können in rc.conf
statt fest im Startskript der Anwendung festgelegt werden.
Ein einfaches Startskript sieht wie folgt aus:#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# KEYWORD: shutdown
./etc/rc.subr
name="utility"
rcvar=`set_rcvar`
command="/usr/local/sbin/utility"
load_rc_config $name
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
utility_enable=${utility_enable-"NO"}
utility_pidfile=${utility_pidfile-"/var/run/utility.pid"}
pidfile="${utility_pidfile}"
run_rc_command "$1"Dieses Skript stellt sicher, dass
utility nach den
DAEMON-Pseudodiensten gestartet wird.
Es stellt auch eine Methode bereit, die
Prozess-ID (PID)
der Anwendung in einer Datei zu speichern.In /etc/rc.conf könnte
für diese Anwendung die folgende Zeile stehen:utility_enable="YES"Die Methode erleichtert den Umgang mit
Kommandozeilenargumenten, bindet Funktionen aus
/etc/rc.subr ein, ist kompatibel
zum Werkzeug &man.rcorder.8; und lässt sich
über rc.conf leichter
konfigurieren.Andere Arten, um Dienste zu startenDienste wie POP3 oder
IMAP können über
&man.inetd.8; gestartet werden. Nach der Installation
der Anwendung aus der Ports-Sammlung muss eine
Konfigurationszeile in der Datei
/etc/inetd.conf hinzugefügt oder
in der aktuellen Konfiguration durch Entfernen der Kommentare
aktiviert werden. Der Abschnitt beschreibt den
inetd und dessen Konfiguration.Systemdienste können auch mit &man.cron.8; gestartet
werden. Dieser Ansatz hat einige Vorteile; nicht zuletzt, weil
&man.cron.8; die Prozesse unter dem Eigentümer der
crontab startet, ist es möglich, dass
Dienste von nicht-root Benutzern gestartet
und gepflegt werden können.Dies nutzt eine Eigenschaft von &man.cron.8;:
Für die Zeitangabe kann @reboot
eingesetzt werden. Damit wird das Kommando gestartet, wenn
&man.cron.8; kurz nach dem Systemboot gestartet wird.TomRhodesBeigetragen von Programme mit cron startencronEin sehr nützliches Werkzeug von &os; ist &man.cron.8;.
cron läuft im Hintergrund und
überprüft fortlaufend die Datei
/etc/crontab. Beim Start sucht
cron neue crontab-Dateien
- im Verzeichnis /var/cron/tabs.
+ im Verzeichnis /var/cron/tabs.
In den crontab-Dateien wird
festgelegt, welche Programme zu welchem Zeitpunkt laufen sollen.Das Werkzeug cron verwendet
zwei verschiedene Konfigurationsdateien: Die
System-crontab und die
Benutzer-crontab. Der einzige Unterschied
zwischen beiden Formaten ist das sechste Feld. In der
System-crontab gibt das sechste Feld das
Konto an, unter dem ein Kommando läuft. Aus der
System-crontab können daher
Kommandos unter beliebigen Konten gestartet werden.
In der Benutzer-crontab gibt das
sechste Feld das auszuführende Kommando an. Alle
Kommandos laufen unter dem Konto, unter dem die
crontab erstellt wurde (ein
wichtiges Sicherheitsmerkmal).Benutzer können mit Benutzer-crontabs
ohne root-Rechte Befehle terminieren.
Die Kommandos in Benutzer-crontabs laufen
unter dem Benutzer, der die crontab
erstellt hat.Der Benutzer root kann, wie
jeder andere Benutzer, eine Benutzer-crontab
besitzen. Die Benutzer-crontab von
root ist nicht mit der Datei
/etc/crontab, der
System-crontab, zu verwechseln.
Normalerweise besitzt root, wegen
der Existenz der System-crontab, keine
eigene Benutzer-crontab.Der folgende Auszug aus der System-crontab/etc/crontab zeigt den Aufbau
einer crontab-Datei:# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
#
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#
#minute hour mday month wday who command
#
#
*/5 * * * * root /usr/libexec/atrun Das Zeichen # leitet, wie in
den meisten Konfigurationsdateien, einen Kommentar ein.
Benutzen Sie Kommentare, um die Funktion eines Eintrags
zu erläutern. Kommentare müssen in einer
extra Zeile stehen. Sie können nicht in derselben
Zeile wie ein Kommando stehen, da sie sonst Teil des
Kommandos wären. Leerzeilen in dieser Datei
werden ignoriert.Umgebungsvariablen werden mit dem Gleichheits-Zeichen
(=) festgelegt. Im Beispiel werden
die Variablen SHELL, PATH
und HOME definiert. Wenn die Variable
SHELL nicht definiert wird, benutzt
cron die Shell sh.
Wird die Variable PATH nicht gesetzt,
müssen alle Pfadangaben absolut sein, da es keinen
Vorgabewert für PATH gibt. Der
Vorgabewert für HOME ist das
Heimatverzeichnis des Accounts, dem die
crontab gehört.In dieser Zeile werden sieben Felder beschrieben:
minute, hour,
mday, month,
wday, who
und command. Die ersten Felder
legen den Zeitpunkt fest, an dem ein Kommando laufen
soll. Das Feld minute legt die
Minute fest, das Feld hour die
Stunde, das Feld mday den Tag
des Monats. Im Feld month
wird der Monat und im Feld wday
der Wochentag festgelegt. Alle Felder müssen
numerische Werte enthalten und die Zeitangaben sind
im 24-Stunden-Format. Das Feld who
gibt es nur in der Datei /etc/crontab
und gibt den Account an, unter dem das Kommando laufen
soll. In den crontab-Dateien
einzelner Accounts existiert dieses Feld nicht. Im
letzten Feld wird schließlich das auszuführende
Kommando angegeben.Diese Zeile definiert die Zeitpunkte an denen das
Kommando atrun laufen soll. Beachten
Sie die Zeichenfolge */5 gefolgt von
mehreren *-Zeichen. Das Zeichen
* ist ein Platzhalter und steht
für jede mögliche Zeit.
Diese Zeile führt das Kommando atrun
unter dem root-Account alle fünf
Minuten aus. Mehr über das Kommando
atrun erfahren Sie in der
Hilfeseite &man.atrun.8;.Bei den Kommandos können beliebige Optionen
angegeben werden. Wenn das Kommando zu lang ist und
auf der nächsten Zeile fortgesetzt werden soll,
muss am Ende der Zeile das Fortsetzungszeichen
(\) angegeben werden.Bis auf das sechste Feld, das den Account angibt, sieht
jede crontab-Datei so wie das Beispiel
aus. Das sechste Feld existiert nur in der Systemdatei
/etc/crontab. In den restlichen
crontab-Dateien fehlt dieses Feld.crontab installierenDie nachstehende Prozedur gilt nur für
Benutzer-crontabs. Die
System-crontab können
Sie einfach mit Ihrem Lieblingseditor editieren.
Das Werkzeug cron bemerkt, dass
sich die Datei geändert hat und wird die neue
Version benutzen. Lesen Sie bitte auch die FAQ
zur Meldung root: not found.Eine Benutzer-crontab, beispielsweise
die Datei crontab, können Sie mit
jedem Editor erstellen. Die Benutzer-crontab
installieren Sie mit dem nachstehenden Befehl:&prompt.root; crontab crontabDas Argument zum Befehl crontab
ist die vorher erstellte Datei crontab.Der Befehl crontab -l zeigt
die installierte crontab-Datei an.Benutzer, die eine eigene crontab-Datei
ohne Vorlage erstellen wollen, können den Befehl
crontab -e verwenden. Dieser Befehl
ruft einen Editor auf und installiert beim Verlassen des
Editors die crontab-Datei.Wollen Sie die installierte
Benutzer-crontab entfernen, rufen Sie den
Befehl crontab mit der Option
auf.TomRhodesBeigetragen von Das rc-System für Systemdienste2002 wurde das rc.d-System von
NetBSD zum Start von Systemdiensten in &os; integriert.
Die zu diesem System gehörenden Dateien sind im
Verzeichnis /etc/rc.d abgelegt.
Die Skripten in diesem Verzeichnis akzeptieren die
Optionen ,
und . Beispielsweise kann
&man.sshd.8; mit dem nachstehenden Kommando neu gestartet
werden:&prompt.root; /etc/rc.d/sshd restartAnalog können Sie andere Dienste starten und stoppen.
Normalerweise werden die Dienste beim Systemstart über
Einträge in der Datei &man.rc.conf.5; automatisch gestartet.
Der Network Address
Translation Dæmon wird zum Beispiel mit dem folgenden
Eintrag in /etc/rc.conf aktiviert:natd_enable="YES"Wenn dort bereits die Zeile
existiert, ändern Sie einfach in
. Die rc-Skripten starten, wie unten
beschrieben, auch abhängige Dienste.Da das rcNG-System primär
zum automatischen Starten und Stoppen von Systemdiensten
dient, funktionieren die Optionen ,
und nur,
wenn die entsprechenden Variablen in
/etc/rc.conf gesetzt sind. Beispielsweise
funktioniert das Kommando sshd restart
nur dann, wenn in /etc/rc.conf die
Variable sshd_enable auf
gesetzt wurde. Wenn Sie die Optionen ,
oder
unabhängig von den Einstellungen in
/etc/rc.conf benutzen wollen,
müssen Sie den Optionen mit dem Präfix
one verwenden. Um beispielsweise
sshd unabhängig von den
Einstellungen in /etc/rc.conf neu
zu starten, benutzen Sie das nachstehende Kommando:&prompt.root; /etc/rc.d/sshd onerestartOb ein Dienst in /etc/rc.conf
aktiviert ist, können Sie leicht herausfinden, indem
Sie das entsprechende rc.d-Skript
mit der Option aufrufen. Ein
Administrator kann beispielsweise wie folgt prüfen, ob
der sshd-Dienst in
/etc/rc.conf aktiviert ist:&prompt.root; /etc/rc.d/sshd rcvar
# sshd
$sshd_enable=YESDie zweite Zeile (# sshd) wird
vom Kommando sshd ausgegeben; sie
kennzeichnet nicht die Eingabeaufforderung von
root.Ob ein Dienst läuft, kann mit der Option
abgefragt werden. Das folgende
Kommando überprüft, ob der sshd
auch wirklich gestartet wurde:&prompt.root; /etc/rc.d/sshd status
sshd is running as pid 433.Einige Dienste können über die Option
neu initialisiert werden. Dazu wird
dem Dienst über ein Signal mitgeteilt,
dass er seine Konfigurationsdateien neu einlesen soll.
Oft wird dazu das Signal SIGHUP
verwendet. Beachten Sie aber, dass nicht alle Dienste diese
Option unterstützen.Die meisten Systemdienste werden beim Systemstart vom
rc.d-System gestartet. Zum Beispiel
aktiviert das Skript bgfsck die Prüfung
von Dateisystemen im Hintergrund. Das Skript gibt die folgende
Meldung aus, wenn es gestartet wird:Starting background file system checks in 60 seconds.Viele Systemdienste hängen von anderen Diensten
ab. NIS und andere RPC-basierende Systeme hängen
beispielsweise von dem rpcbind-Dienst
(portmapper) ab. Im Kopf der Startskripten befinden sich
die Informationen über Abhängigkeiten von anderen
Diensten und weitere Metadaten.Mithilfe dieser Daten
bestimmt das Programm &man.rcorder.8; beim Systemstart die
Startreihenfolge der Dienste.Folgende Schlüsselwörter müssen im Kopf aller
Startskripten verwendet werden (da sie von &man.rc.subr.8; zum
Aktivieren des Startskripts benötigt
werden:PROVIDE: Gibt die Namen der Dienste an,
die mit dieser Datei zur Verfügung gestellt werden.Die folgenden Schlüsselwörter können im Kopf
des Startskripts angegeben werden. Sie sind zwar nicht unbedingt
notwendig, sind aber hilfreich beim Umgang mit
&man.rcorder.8;:REQUIRE: Gibt die Namen der Dienste an,
von denen dieser Dienst abhängt. Diese Datei wird
nach den angegebenen Diensten
ausgeführt.BEFORE: Zählt Dienste auf,
die auf diesen Dienst angewiesen sind. Diese Datei wird
vor den angegebenen Diensten
ausgeführt.Durch das Verwenden dieser Schlüsselwörter kann
ein Administrator die Startreihenfolge von Systemdiensten
feingranuliert steuern, ohne mit den
Schwierigkeiten des runlevel-Systems
anderer &unix; Systeme kämpfen zu müssen.Weitere Informationen über das
rc.d-System finden sich in den
Manualpages zu &man.rc.8; sowie &man.rc.subr.8;. Wenn Sie
Ihre eigenen rc.d-Skripte schreiben
wollen, sollten Sie den Artikel
Practical rc.d
scripting in BSD lesen.MarcFonvieilleBeigetragen von Einrichten von NetzwerkkartenNetzwerkkarteneinrichtenEin Rechner ohne Netzanschluss ist heute nicht mehr
vorstellbar. Die Konfiguration einer Netzwerkkarte gehört zu
den alltäglichen Aufgaben eines &os; Administrators.Bestimmen des richtigen TreibersNetzwerkkartenTreiberBevor Sie anfangen, sollten Sie das Modell Ihrer Karte kennen,
wissen welchen Chip die Karte benutzt und bestimmen, ob es sich
um eine PCI- oder ISA-Karte handelt. Eine Aufzählung der
unterstützten PCI- und ISA-Karten finden Sie in der
Liste der unterstützen Geräte. Schauen Sie nach, ob Ihre
Karte dort aufgeführt ist.Wenn Sie wissen, dass Ihre Karte unterstützt wird,
müssen Sie den Treiber für Ihre Karte bestimmen.
/usr/src/sys/conf/NOTES und
/usr/src/sys/arch/conf/NOTES
enthalten eine
Liste der verfügbaren Treiber mit Informationen zu den
unterstützten Chipsätzen und Karten. Wenn Sie sich nicht
sicher sind, ob Sie den richtigen Treiber ausgewählt haben,
lesen Sie die Hilfeseite des Treibers. Die Hilfeseite enthält
weitere Informationen über die unterstützten Geräte
und macht auch auf mögliche Probleme aufmerksam.Wenn Sie eine gebräuchliche Karte besitzen, brauchen Sie
meistens nicht lange nach dem passenden Treiber zu suchen. Die
Treiber zu diesen Karten sind schon im
GENERIC-Kernel enthalten und die Karte sollte
während des Systemstarts erkannt werden:dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
dc0: Ethernet address: 00:a0:cc:da:da:da
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
dc1: Ethernet address: 00:a0:cc:da:da:db
miibus1: <MII bus> on dc1
ukphy1: <Generic IEEE 802.3u media interface> on miibus1
ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, autoIm Beispiel erkennt das System zwei Karten, die den
&man.dc.4; Treiber benutzen.Ist der Treiber für Ihre Netzwerkkarte nicht
in GENERIC enthalten, müssen
Sie den Treiber laden, um die Karte zu benutzen.
Sie können den Treiber auf zwei Arten laden:Am einfachsten ist es, das Kernelmodul für
Ihre Karte mit &man.kldload.8; zu laden. Allerdings
gibt es nicht für alle Karten Kernelmodule;
zum Beispiel gibt es keine Kernelmodule für
ISA-Karten.Alternativ können Sie den Treiber für die
Karte fest in den Kernel einbinden. Schauen Sie sich dazu
/usr/src/sys/conf/NOTES,
/usr/src/sys/arch/conf/NOTES
und die Hilfeseite des Treibers, den Sie in den Kernel
einbinden möchten, an. Die Übersetzung des Kernels
wird in beschrieben. Wenn
Ihre Karte während des Systemstarts vom Kernel
(GENERIC) erkannt wurde, müssen
Sie den Kernel nicht neu übersetzen.&windows;-NDIS-Treiber einsetzenNDISNDISulator&windows;-TreiberMicrosoft WindowsMicrosoft WindowsGerätetreiberKLD (kernel loadable object)Leider stellen nach wie vor viele Unternehmen die
Spezifikationen ihrer Treiber der Open Source Gemeinde
nicht zur Verfügung, weil sie diese Informationen
als Geschäftsgeheimnisse betrachten. Daher haben die
Entwickler von FreeBSD und anderen Betriebssystemen nur
zwei Möglichkeiten. Entweder versuchen sie in einem
aufwändigen Prozess den Treiber durch
Reverse Engineering
nachzubauen, oder sie versuchen, die vorhandenen
Binärtreiber der µsoft.windows;-Plattform zu
verwenden. Die meisten Entwickler, darunter auch die an
FreeBSD beteiligten, haben sich für den zweiten Ansatz
entschieden.Bill Paul (wpaul) ist es zu verdanken, dass es seit
FreeBSD 5.3-RELEASE eine
native Unterstützung der
Network Driver Interface
Specification (NDIS) gibt. Der
FreeBSD NDISulator (auch als Project Evil bekannt) nutzt
den binären &windows;-Treiber, indem er diesem vorgibt,
unter &windows; zu laufen. Da der &man.ndis.4;-Treiber
eine &windows;-Binärdatei nutzt, kann er nur auf
&i386;- und amd64-Systemen verwendet werden.Der &man.ndis.4;-Treiber unterstützt primär
PCI-, CardBus- sowie PCMCIA-Geräte, USB-Geräte
werden hingegen noch nicht unterstützt.Um den NDISulator zu verwenden, benötigen Sie drei
Dinge:Die KernelquellenDen &windowsxp;-Binärtreiber
(mit der Erweiterung .SYS)Die Konfigurationsdatei des &windowsxp;-Treibers
(mit der Erweiterung .INF)Suchen Sie die Dateien für Ihre Karte. Diese
befinden sich meistens auf einer beigelegten CD-ROM, oder
können von der Internetseite des Herstellers
heruntergeladen werden. In den folgenden Beispielen werden
die Dateien W32DRIVER.SYS und
W32DRIVER.INF verwendet.Sie können einen &windows;/i386-Treiber nicht
unter &os;/amd64 einsetzen, vielmehr benötigen Sie
dafür einen &windows;/amd64-Treiber.Als Nächstes kompilieren Sie den binären
Treiber, um ein Kernelmodul zu erzeugen. Dazu rufen Sie als
root &man.ndisgen.8; auf:&prompt.root; ndisgen /path/to/W32DRIVER.INF/path/to/W32DRIVER.SYS&man.ndisgen.8; arbeitet interaktiv, benötigt es
weitere Informationen, so fragt es Sie danach. Als Ergebnis
erhalten Sie ein Kernelmodul im Arbeitsverzeichnis, das Sie
wie folgt laden können:&prompt.root; kldload ./W32DRIVER.koNeben dem vorhin erzeugten Kernelmodul müssen Sie
auch die Kernelmodule ndis.ko und
if_ndis.ko laden. Diese Module sollten
automatisch geladen werden, wenn Sie ein von &man.ndis.4;
abhängiges Modul laden. Wollen Sie die Module hingegen
manuell laden, geben Sie die folgenden Befehle ein:&prompt.root; kldload ndis
&prompt.root; kldload if_ndisDer erste Befehl lädt dabei den NDIS-Miniport-Treiber,
der zweite das tatsächliche Netzwerkgerät.Überprüfen Sie nun die Ausgabe von &man.dmesg.8;
auf eventuelle Fehler während des Ladevorgangs. Gab es
dabei keine Probleme, sollten Sie eine Ausgabe ähnlich
der folgenden erhalten:ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54MbpsAb jetzt können Sie mit dem Gerät
ndis0 wie mit jeder anderen
Gerätedatei (etwa dc0)
arbeiten.Wie jedes Kernelmodul können auch die NDIS-Module
beim Systemstart automatisch geladen werden. Dazu kopieren
Sie das erzeugte Modul (W32DRIVER.ko)
in das Verzeichnis /boot/modules. Danach
fügen Sie die folgende Zeile in
/boot/loader.conf ein:W32DRIVER_load="YES"Konfiguration von NetzwerkkartenNetzwerkkarteneinrichtenNachdem der richtige Treiber für die Karte geladen ist,
muss die Karte konfiguriert werden. Unter Umständen ist
die Karte schon während der Installation mit
sysinstall konfiguriert worden.Das nachstehende Kommando zeigt die Konfiguration der Karten
eines Systems an:&prompt.user; ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:a0:cc:da:da:da
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
ether 00:a0:cc:da:da:db
media: Ethernet 10baseT/UTP
status: no carrier
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.0.0.1 netmask 0xff000000
tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500In alten Versionen von &os; müssen Sie vielleicht
noch auf der Kommandozeile von &man.ifconfig.8;
angeben. Hinweise zum Gebrauch von &man.ifconfig.8; entnehmen
Sie bitte der Hilfeseite. Beachten Sie, dass in diesem
Beispiel die IPv6-Ausgaben (inet6 etc.)
ausgelassen wurden.Im Beispiel werden Informationen zu den folgenden Geräten
angezeigt:dc0: Der erste
Ethernet-Adapterdc1: Der zweite
Ethernet-Adapterlp0: Die parallele
Schnittstellelo0: Das Loopback-Gerättun0: Das von
ppp benutzte Tunnel-GerätDer Name der Netzwerkkarte wird aus dem Namen des Treibers und
einer Zahl zusammengesetzt. Die Zahl gibt die Reihenfolge an, in
der die Geräte beim Systemstart erkannt wurden. Die dritte
Karte, die den &man.sis.4; Treiber benutzt, würde
beispielsweise sis2 heißen.Der Adapter dc0 aus dem Beispiel ist
aktiv. Sie erkennen das an den folgenden Hinweisen:UP bedeutet, dass die Karte
konfiguriert und aktiv ist.Der Karte wurde die Internet-Adresse (inet)
192.168.1.3 zugewiesen.Die Subnetzmaske ist richtig
(0xffffff00 entspricht
255.255.255.0).Die Broadcast-Adresse 192.168.1.255 ist richtig.Die MAC-Adresse der Karte (ether)
lautet 00:a0:cc:da:da:da.Die automatische Medienerkennung ist aktiviert
(media: Ethernet autoselect (100baseTX
<full-duplex>)). Der Adapter
dc1 benutzt das Medium
10baseT/UTP. Weitere Informationen
über die einstellbaren Medien entnehmen
Sie bitte der Hilfeseite des Treibers.Der Verbindungsstatus (status) ist
active, das heißt es wurde ein
Trägersignal entdeckt. Für
dc1 wird status: no
carrier angezeigt. Das ist normal, wenn kein Kabel
an der Karte angeschlossen ist.Wäre die Karte nicht konfiguriert, würde die Ausgabe
von &man.ifconfig.8; so aussehen:dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
ether 00:a0:cc:da:da:daSie brauchen die Berechtigungen von root, um
Ihre Karte zu konfigurieren. Die Konfiguration kann auf der
Kommandozeile mit &man.ifconfig.8; erfolgen, allerdings
müsste sie dann nach jedem Neustart wiederholt werden.
Dauerhaft wird die Karte in /etc/rc.conf
konfiguriert.Öffnen Sie /etc/rc.conf mit Ihrem
Lieblingseditor und fügen Sie für jede Karte Ihres
Systems eine Zeile hinzu. In dem hier diskutierten Fall wurden
die nachstehenden Zeilen eingefügt:ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"Ersetzen Sie dc0,
dc1 usw. durch die Gerätenamen Ihrer
Karten und setzen Sie die richtigen IP-Adressen ein. Die
Hilfeseiten des Treibers und &man.ifconfig.8; enthalten weitere
Einzelheiten über verfügbare Optionen. Die Syntax von
/etc/rc.conf wird in &man.rc.conf.5;
erklärt.Wenn Sie das Netz während der Installation
konfiguriert haben, existieren vielleicht schon Einträge
für Ihre Karten. Überprüfen Sie
/etc/rc.conf bevor Sie weitere Zeilen
hinzufügen.In /etc/hosts können Sie die Namen
und IP-Adressen der Rechner Ihres LANs eintragen. Weitere
Informationen entnehmen Sie bitte &man.hosts.5; und
/usr/share/examples/etc/hosts.Test und FehlersucheNachdem Sie die notwendigen Änderungen in
/etc/rc.conf vorgenommen haben, führen
Sie einen Neustart Ihres Systems durch. Dadurch werden die Adapter
konfiguriert und Sie stellen sicher, dass der Start ohne
Konfigurationsfehler erfolgt.Wenn das System gestartet ist, sollten Sie die Netzwerkkarten
testen.Test der Ethernet-KarteNetzwerkkartentestenMit zwei Tests können Sie prüfen, ob die
Ethernet-Karte richtig konfiguriert ist. Testen Sie zuerst mit
ping den Adapter selbst und sprechen Sie dann
eine andere Maschine im LAN an.Zuerst, der Test des Adapters:&prompt.user; ping -c5 192.168.1.3
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms
--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 msJetzt versuchen wir, eine andere Maschine im LAN zu
erreichen:&prompt.user; ping -c5 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms
--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 msSie können auch den Namen der Maschine anstelle von
192.168.1.2 benutzen, wenn Sie
/etc/hosts entsprechend eingerichtet
haben.FehlersucheNetzwerkkartenFehlersucheFehler zu beheben, ist immer sehr mühsam.
Indem Sie die einfachen Sachen zuerst prüfen,
erleichtern Sie sich die Aufgabe. Steckt das Netwerkkabel?
Sind die Netzwerkdienste richtig konfiguriert? Funktioniert
die Firewall? Wird die Netwerkkarte von &os;
unterstützt? Lesen Sie immer die Hardware-Informationen
des Releases, bevor Sie einen Fehlerbericht einsenden.
Aktualisieren Sie Ihre &os;-Version
auf -STABLE. Suchen Sie in den Archiven der Mailinglisten
oder auf dem Internet nach bekannten Lösungen.Wenn die Karte funktioniert, die Verbindungen aber
zu langsam sind, lesen Sie bitte die Hilfeseite
&man.tuning.7;. Prüfen Sie auch die
Netzwerkkonfiguration, da falsche Einstellungen die
Ursache für langsame Verbindungen sein können.Wenn Sie viele device timeout
Meldungen in den Systemprotokollen finden, prüfen
Sie, dass es keinen Konflikt zwischen der Netzwerkkarte
und anderen Geräten Ihres Systems gibt.
Überprüfen Sie nochmals die Verkabelung.
Unter Umständen benötigen Sie eine neue
Netzwerkkarte.Wenn Sie in den Systemprotokollen
watchdog timeout Fehlermeldungen
finden, kontrollieren Sie zuerst die Verkabelung.
Überprüfen Sie dann, ob der PCI-Steckplatz der
Karte Bus Mastering unterstützt. Auf einigen
älteren Motherboards ist das nur für einen
Steckplatz (meistens Steckplatz 0) der Fall. Lesen Sie
in der Dokumentation Ihrer Karte und Ihres Motherboards
nach, ob das vielleicht die Ursache des Problems sein
könnte.Die Meldung No route to host
erscheint, wenn Ihr System ein Paket nicht zustellen
kann. Das kann vorkommen weil beispielsweise keine
Default-Route gesetzt wurde oder das Netzwerkkabel
nicht richtig steckt. Schauen Sie in der Ausgabe
von netstat -rn nach, ob eine
Route zu dem Zielsystem existiert. Wenn nicht, lesen
Sie bitte das .Die Meldung ping: sendto: Permission
denied wird oft von einer falsch konfigurierten
Firewall verursacht. Wenn keine Regeln definiert wurden,
blockiert eine aktivierte Firewall alle Pakete, selbst
einfache ping-Pakete. Weitere
Informationen erhalten Sie in .Falls die Leistung der Karte schlecht ist, setzen
Sie die Medienerkennung von autoselect
(automatisch) auf das richtige Medium. In vielen Fällen
löst diese Maßnahme Leistungsprobleme. Wenn
nicht, prüfen Sie nochmal die Netzwerkeinstellungen
und lesen Sie die Hilfeseite &man.tuning.7;.Virtual Hostsvirtual hostsIP-AliaseEin gebräuchlicher Zweck von &os; ist das
virtuelle Hosting, bei dem ein Server im Netzwerk wie
mehrere Server aussieht. Dies wird dadurch erreicht,
dass einem Netzwerkinterface mehrere Netzwerk-Adressen
zugewiesen werden.Ein Netzwerkinterface hat eine echte
Adresse und kann beliebig viele alias Adressen
haben. Die Aliase werden durch entsprechende alias Einträge
in /etc/rc.conf festgelegt.Ein alias Eintrag für das Interface
fxp0 sieht wie folgt aus:ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"Beachten Sie, dass die Alias-Einträge mit
alias0 anfangen müssen und
weiter hochgezählt werden, das heißt
_alias1, _alias2,
und so weiter. Die Konfiguration der Aliase hört
bei der ersten fehlenden Zahl auf.Die Berechnung der Alias-Netzwerkmasken ist wichtig, doch
zum Glück einfach. Für jedes Interface muss es
eine Adresse geben, die die Netzwerkmaske des Netzwerkes richtig
beschreibt. Alle anderen Adressen in diesem Netzwerk haben dann
eine Netzwerkmaske, die mit 1 gefüllt
ist (also 255.255.255.255
oder hexadezimal
0xffffffff).Als Beispiel betrachten wir den Fall, in dem
fxp0 mit zwei Netzwerken verbunden
ist: dem Netzwerk 10.1.1.0 mit der
Netzwerkmaske 255.255.255.0
und dem Netzwerk 202.0.75.16 mit der
Netzwerkmaske 255.255.255.240.
Das System soll die Adressen 10.1.1.1
bis 10.1.1.5 und
202.0.75.17 bis
202.0.75.20 belegen.
Wie eben beschrieben, hat nur die erste Adresse in einem
Netzwerk (hier 10.0.1.1
und 202.0.75.17) die
richtige Netzwerkmaske. Alle anderen Adressen
(10.1.1.2 bis 10.1.1.5 und 202.0.75.18 bis 202.0.75.20) erhalten die Maske
255.255.255.255.Die folgenden Einträge in
/etc/rc.conf konfigurieren den Adapter
entsprechend dem Beispiel:ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"Konfigurationsdateien/etc LayoutKonfigurationsdateien finden sich in einigen Verzeichnissen
unter anderem in:/etcEnthält generelle Konfigurationsinformationen,
die Daten hier sind systemspezifisch./etc/defaultsDefault Versionen der Konfigurationsdateien./etc/mailEnthält die &man.sendmail.8; Konfiguration
und weitere MTA Konfigurationsdateien./etc/pppHier findet sich die Konfiguration für
die User- und Kernel-ppp Programme./etc/namedbDas Vorgabeverzeichnis, in dem Daten von
&man.named.8; gehalten werden. Normalerweise
werden hier named.conf und Zonendaten
abgelegt./usr/local/etcInstallierte Anwendungen legen hier ihre
Konfigurationsdateien ab. Dieses Verzeichnis kann
Unterverzeichnisse für bestimmte Anwendungen
enthalten./usr/local/etc/rc.dOrt für Start- und Stopskripten installierter
Anwendungen./var/dbAutomatisch generierte systemspezifische Datenbanken,
wie die Paket-Datenbank oder die
locate-Datenbank.HostnamenhostnameDNS/etc/resolv.confresolv.confWie der &os;-Resolver auf das Internet Domain Name
System (DNS) zugreift, wird in /etc/resolv.conf
festgelegt.Die gebräuchlichsten Einträge in
/etc/resolv.conf sind:nameserverDie IP-Adresse eines Nameservers, den
der Resolver abfragen soll. Bis zu drei Server werden
in der Reihenfolge, in der sie aufgezählt
sind, abgefragt.searchSuchliste mit Domain-Namen zum Auflösen von
Hostnamen. Die Liste wird normalerweise durch den
Domain-Teil des lokalen Hostnamens festgelegt.domainDer lokale Domain-Name.Beispiel für eine typische
resolv.conf:search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30Nur eine der Anweisungen search
oder domain sollte benutzt werden.Wenn Sie DHCP benutzen, überschreibt &man.dhclient.8;
für gewöhnlich resolv.conf
mit den Informationen vom DHCP-Server./etc/hostshosts/etc/hosts ist eine einfache textbasierte
Datenbank, die aus alten Internetzeiten stammt. Zusammen
mit DNS und NIS stellt sie eine Abbildung zwischen Namen und
IP-Adressen zur Verfügung. Anstatt &man.named.8;
zu konfigurieren, können hier lokale Rechner, die über
ein LAN verbunden sind, eingetragen werden. Lokale Einträge
für gebräuchliche Internet-Adressen in
/etc/hosts verhindern die Abfrage eines
externen Servers und beschleunigen die Namensauflösung.# $FreeBSD$
#
#
# Host Database
#
# This file should contain the addresses and aliases for local hosts that
# share this file. Replace 'my.domain' below with the domainname of your
# machine.
#
# In the presence of the domain name service or NIS, this file may
# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
#
#
::1 localhost localhost.my.domain
127.0.0.1 localhost localhost.my.domain
#
# Imaginary network.
#10.0.0.2 myname.my.domain myname
#10.0.0.3 myfriend.my.domain myfriend
#
# According to RFC 1918, you can use the following IP networks for
# private nets which will never be connected to the Internet:
#
# 10.0.0.0 - 10.255.255.255
# 172.16.0.0 - 172.31.255.255
# 192.168.0.0 - 192.168.255.255
#
# In case you want to be able to connect to the Internet, you need
# real official assigned numbers. Do not try to invent your own network
-# numbers but instead get one from your network provider (if any) or
+# numbers but instead get one from your network provider (if any) or
# from your regional registry (ARIN, APNIC, LACNIC, RIPE NCC, or AfriNIC.)
#/etc/hosts hat ein einfaches Format:[Internet Adresse] [Offizieller Hostname] [Alias1] [Alias2] ...Zum Beispiel:10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2Weitere Informationen entnehmen Sie bitte &man.hosts.5;.Konfiguration von LogdateienLogdateiensyslog.confsyslog.confsyslog.conf ist die Konfigurationsdatei
von &man.syslogd.8;. Sie legt fest, welche
syslog Meldungen in welche
Logdateien geschrieben werden.# $FreeBSD$
#
# Spaces ARE valid field separators in this file. However,
# other *nix-like systems still insist on using tabs as field
# separators. If you are sharing this file between systems, you
# may want to use only tabs as field separators here.
# Consult the syslog.conf(5) manpage.
*.err;kern.debug;auth.notice;mail.crit /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
security.* /var/log/security
mail.info /var/log/maillog
lpr.info /var/log/lpd-errs
cron.* /var/log/cron
*.err root
*.notice;news.err root
*.alert root
*.emerg *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
#*.* /var/log/all.log
# uncomment this to enable logging to a remote log host named loghost
#*.* @loghost
# uncomment these if you're running inn
# news.crit /var/log/news/news.crit
# news.err /var/log/news/news.err
# news.notice /var/log/news/news.notice
!startslip
*.* /var/log/slip.log
!ppp
*.* /var/log/ppp.logWeitere Informationen enthält &man.syslog.conf.5;.newsyslog.confnewsyslog.confDie Konfigurationsdatei für &man.newsyslog.8;, das
normalerweise von &man.cron.8; aufgerufen wird, ist
newsyslog.conf. &man.newsyslog.8;
stellt fest, ob Logdateien archiviert oder verschoben
werden müssen. So wird logfile
nach logfile.0 geschoben und
logfile.0 nach logfile.1
usw. Zudem können Logdateien mit &man.gzip.1;
komprimiert werden. Die Namen der Logdateien sind dann
logfile.0.gz, logfile.1.gz
usw.newsyslog.conf legt fest, welche
Logdateien wann bearbeitet und wie viele Dateien behalten werden.
Logdateien können auf Basis ihrer Größe oder zu
einem gewissen Zeitpunkt archiviert bzw. umbenannt werden.# configuration file for newsyslog
# $FreeBSD$
#
# filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num]
/var/log/cron 600 3 100 * Z
/var/log/amd.log 644 7 100 * Z
/var/log/kerberos.log 644 7 100 * Z
/var/log/lpd-errs 644 7 100 * Z
/var/log/maillog 644 7 * @T00 Z
/var/log/sendmail.st 644 10 * 168 B
/var/log/messages 644 5 100 * Z
/var/log/all.log 600 7 * @T00 Z
/var/log/slip.log 600 3 100 * Z
/var/log/ppp.log 600 3 100 * Z
/var/log/security 600 10 100 * Z
/var/log/wtmp 644 3 * @01T05 B
/var/log/daily.log 640 7 * @T00 Z
/var/log/weekly.log 640 5 1 $W6D0 Z
/var/log/monthly.log 640 12 * $M1D0 Z
/var/log/console.log 640 5 100 * ZUm mehr zu erfahren, lesen Sie bitte &man.newsyslog.8;.sysctl.confsysctl.confsysctlsysctl.conf sieht ähnlich
wie rc.conf aus. Werte werden in der
Form Variable=Wert gesetzt.
Die angegebenen Werte werden gesetzt, nachdem sich das
System bereits im Mehrbenutzermodus befindet. Allerdings
lassen sich im Mehrbenutzermodus nicht alle Werte
setzen.Um das Protokollieren von fatalen Signalen abzustellen
und Benutzer daran zu hindern, von anderen Benutzern
gestartete Prozesse zu sehen, können Sie in der
Datei sysctl.conf die folgenden
Variablen setzen:# Do not log fatal signal exits (e.g. sig 11)
kern.logsigexit=0
# Prevent users from seeing information about processes that
# are being run under another UID.
security.bsd.see_other_uids=0Einstellungen mit sysctlsysctlEinstellungenmit sysctlMit &man.sysctl.8; können Sie Änderungen an
einem laufenden &os;-System vornehmen. Unter anderem
können Optionen des TCP/IP-Stacks oder des
virtuellen Speichermanagements verändert werden. Unter
der Hand eines erfahrenen Systemadministrators kann dies
die Systemperformance erheblich verbessern. Über 500
Variablen können mit &man.sysctl.8; gelesen und gesetzt
werden.Der Hauptzweck von &man.sysctl.8; besteht darin, Systemeinstellungen
zu lesen und zu verändern.Alle auslesbaren Variablen werden wie folgt angezeigt:&prompt.user; sysctl -aSie können auch eine spezielle Variable, z.B.
kern.maxproc lesen:&prompt.user; sysctl kern.maxproc
kern.maxproc: 1044Um eine Variable zu setzen, benutzen Sie die Syntax
Variable=
Wert:&prompt.root; sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000Mit sysctl können Sie Strings, Zahlen oder
Boolean-Werte setzen. Bei Boolean-Werten setzen sie 1
für wahr und 0 für falsch.Wenn Sie Variablen automatisch während des Systemstarts
setzen wollen, fügen Sie die Variablen in die Datei
/etc/sysctl.conf ein. Weiteres
entnehmen Sie bitte der Hilfeseite &man.sysctl.conf.5;
und dem .TomRhodesContributed by Schreibgeschützte VariablenSchreibgeschützte sysctl-Variablen können nur
während des Systemstarts verändert werden.Beispielsweise hat &man.cardbus.4; auf einigen Laptops
Schwierigkeiten, Speicherbereiche zu erkennen. Es treten
dann Fehlermeldungen wie die folgende auf:cbb0: Could not map register memory
device_probe_and_attach: cbb0 attach returned 12Um dieses Problem zu lösen, muss eine
schreibgeschützte sysctl-Variable verändert
werden. Eine OID kann in der Datei
/boot/loader.conf überschrieben
werden. Die Datei /boot/defaults/loader.conf
enthält Vorgabewwerte für sysctl-Variablen.Das oben erwähnte Problem wird durch die Angabe von
in
/boot/loader.conf gelöst.
Danach sollte &man.cardbus.4; fehlerfrei funktionieren.Tuning von LaufwerkenSysctl Variablenvfs.vmiodirenablevfs.vmiodirenableDie Variable vfs.vmiodirenable besitzt
in der Voreinstellung den Wert 1. Die Variable kann auf den Wert
0 (ausgeschaltet) oder 1 (angeschaltet) gesetzt werden. Sie
steuert, wie Verzeichnisse vom System zwischengespeichert
werden. Die meisten Verzeichnisse sind klein und benutzen
nur ein einzelnes Fragment, typischerweise 1 kB,
im Dateisystem. Im Buffer-Cache verbrauchen sie mit
512 Bytes noch weniger Platz. Ist die Variable
ausgeschaltet (auf 0) wird der Buffer-Cache nur
eine limitierte Anzahl Verzeichnisse zwischenspeichern, auch
wenn das System über sehr viel Speicher verfügt.
Ist die Variable aktiviert (auf 1), kann der Buffer-Cache den
VM-Page-Cache benutzen, um Verzeichnisse zwischenzuspeichern.
Der ganze Speicher steht damit zum Zwischenspeichern von
Verzeichnissen zur Verfügung. Der Nachteil bei dieser
Vorgehensweise ist, dass zum Zwischenspeichern eines
Verzeichnisses mindestens eine physikalische Seite im
Speicher, die normalerweise 4 kB groß ist,
anstelle von 512 Bytes gebraucht wird. Wir empfehlen,
diese Option aktiviert zu lassen, wenn Sie Dienste zur
Verfügung stellen, die viele Dateien manipulieren.
Beispiele für solche Dienste sind Web-Caches,
große Mail-Systeme oder Netnews. Die aktivierte
Variable vermindert, trotz des verschwendeten Speichers,
in aller Regel nicht die Leistung des Systems, obwohl Sie
das nachprüfen sollten.vfs.write_behindvfs.write_behindIn der Voreinstellung besitzt die Variable
vfs.write_behind den Wert
1 (aktiviert). Mit dieser Einstellung
schreibt das Dateisystem anfallende vollständige Cluster,
die besonders beim sequentiellen Schreiben großer Dateien
auftreten, direkt auf das Medium aus. Dies verhindert,
dass sich im Buffer-Cache veränderte Puffer
(dirty buffers) ansammeln,
die die I/O-Verarbeitung nicht mehr beschleunigen
würden. Unter bestimmten Umständen blockiert
diese Funktion allerdings Prozesse. Setzen Sie in diesem
Fall die Variable vfs.write_behind auf
den Wert 0.vfs.hirunningspacevfs.hirunningspaceDie Variable vfs.hirunningspace
bestimmt systemweit die Menge ausstehender Schreiboperationen,
die dem Platten-Controller zu jedem beliebigen Zeitpunkt
übergeben werden können. Normalerweise können
Sie den Vorgabewert verwenden. Auf Systemen mit
vielen Platten kann der Wert aber auf 4 bis
5 Megabyte erhöht werden.
Beachten Sie, dass ein zu hoher Wert (größer
als der Schreib-Schwellwert des Buffer-Caches) zu
Leistungverlusten führen kann. Setzen Sie den Wert daher
nicht zu hoch! Hohe Werte können auch Leseoperationen
verzögern, die gleichzeitig mit Schreiboperationen
ausgeführt werden.Es gibt weitere Variablen, mit denen Sie den Buffer-Cache
und den VM-Page-Cache beeinflussen können. Wir raten
Ihnen allerdings davon ab, diese Variablen zu verändern,
da das VM-System den virtuellen Speicher selbst sehr gut
verwaltet.vm.swap_idle_enabledvm.swap_idle_enabledDie Variable vm.swap_idle_enabled
ist für große Mehrbenutzer-Systeme gedacht, auf
denen sich viele Benutzer an- und abmelden und auf denen
es viele Prozesse im Leerlauf
(idle) gibt. Solche Systeme
fragen kontinuierlich freien Speicher an. Wenn Sie die
Variable vm.swap_idle_enabled aktivieren,
können Sie die Auslagerungs-Hysterese von Seiten mit
den Variablen vm.swap_idle_threshold1 und
vm.swap_idle_threshold2 einstellen. Die
Schwellwerte beider Variablen geben die Zeit in Sekunden an,
in denen sich ein Prozess im Leerlauf befinden muss. Wenn die
Werte so eingestellt sind, dass Seiten früher als nach dem
normalen Algorithmus ausgelagert werden, verschafft das dem
Auslagerungs-Prozess mehr Luft. Aktivieren Sie diese Funktion
nur, wenn Sie sie wirklich benötigen: Die Speicherseiten
werden eher früher als später ausgelagert. Der
Platz im Swap-Bereich wird dadurch schneller verbraucht und
die Plattenaktivitäten steigen an. Auf kleine Systeme
hat diese Funktion spürbare Auswirkungen. Auf großen
Systemen, die sowieso schon Seiten auslagern müssen,
können ganze Prozesse leichter in den Speicher geladen
oder ausgelagert werden.hw.ata.wchw.ata.wcIn &os; 4.3 wurde versucht, den IDE-Schreib-Zwischenspeicher
abzustellen. Obwohl dies die Bandbreite zum Schreiben auf
IDE-Platten verringerte, wurde es aus Gründen der
Datenkonsistenz als notwenig angesehen. Der Kern des
Problems ist, dass IDE-Platten keine zuverlässige
Aussage über das Ende eines Schreibvorgangs treffen.
Wenn der Schreib-Zwischenspeicher aktiviert ist, werden die Daten
nicht in der Reihenfolge ihres Eintreffens geschrieben. Es kann
sogar passieren, dass das Schreiben mancher Blöcke
im Fall von starker Plattenaktivität auf unbefristete
Zeit verzögert wird. Ein Absturz oder Stromausfall
zu dieser Zeit kann die Dateisysteme erheblich beschädigen.
Wir entschieden uns daher für die sichere Variante
und stellten den Schreib-Zwischenspeicher ab. Leider war
damit auch ein großer Leistungsverlust verbunden, so
dass wir die Variable
nach dem Release wieder aktiviert haben. Sie sollten den
Wert der Variable hw.ata.wc auf Ihrem
System überprüfen. Wenn der Schreib-Zwischenspeicher
abgestellt ist, können Sie ihn aktivieren, indem Sie die
Variable auf den Wert 1 setzen. Dies muss zum Zeitpunkt
des Systemstarts im Boot-Loader geschehen. Eine Änderung
der Variable, nachdem der Kernel gestartet ist, hat keine
Auswirkungen.Weitere Informationen finden Sie in &man.ata.4;.SCSI_DELAY
(kern.cam.scsi_delay)kern.cam.scsi_delayKerneloptionenSCSI_DELAYMit der Kerneloption SCSI_DELAY kann
die Dauer des Systemstarts verringert werden. Der Vorgabewert
ist recht hoch und er verzögert den Systemstart um 15 oder
mehr Sekunden. Normalerweise kann dieser Wert, insbesondere
mit modernen Laufwerken, auf 5 Sekunden heruntergesetzt
werden. Ab &os; 5.0 wird dazu die
sysctl-Variable
kern.cam.scsi_delay benutzt. Die Variable
sowie die Kerneloption verwenden für die Zeitangabe
Millisekunden und nicht Sekunden.Soft UpdatesSoft UpdatestunefsMit &man.tunefs.8; lassen sich Feineinstellungen an
Dateisystemen vornehmen. Das Programm hat verschiedene Optionen,
von denen hier nur Soft Updates betrachtet werden. Soft Updates
werden wie folgt ein- und ausgeschaltet:&prompt.root; tunefs -n enable /filesystem
&prompt.root; tunefs -n disable /filesystemEin eingehängtes Dateisystem kann nicht mit &man.tunefs.8;
modifiziert werden. Soft Updates werden am besten im Single-User
Modus aktiviert, bevor Partitionen eingehangen sind.Durch Einsatz eines Zwischenspeichers wird die Performance
im Bereich der Metadaten, vorwiegend beim Anlegen und Löschen
von Dateien, gesteigert. Wir empfehlen, Soft Updates auf allen
Dateisystemen zu aktivieren. Allerdings sollten Sie sich über
die zwei Nachteile von Soft Updates bewusst sein:
Erstens garantieren Soft Updates zwar die Konsistenz der Daten
im Fall eines Absturzes, aber es kann leicht passieren, dass
das Dateisystem über mehrere Sekunden oder gar eine Minute
nicht synchronisiert wurde. Im Fall eines Absturzes verlieren
Sie mit Soft Updates unter Umständen mehr Daten als ohne.
Zweitens verzögern Soft Updates die Freigabe von
Datenblöcken. Eine größere Aktualisierung
eines fast vollen Dateisystems, wie dem Root-Dateisystem,
z.B. während eines make installworld,
kann das Dateisystem vollaufen lassen. Dadurch würde
die Aktualisierung fehlschlagen.Details über Soft UpdatesSoft UpdatesDetailsEs gibt zwei klassische Herangehensweisen, wie
man die Metadaten des Dateisystems (also Daten
über Dateien, wie inode Bereiche oder Verzeichniseinträge)
aktualisiert auf die Platte zurückschreibt:Das historisch übliche Verfahren waren synchrone
Updates der Metadaten, d. h. wenn eine Änderung an
einem Verzeichnis nötig war, wurde anschließend
gewartet, bis diese Änderung tatsächlich auf die
Platte zurückgeschrieben worden war. Der
Inhalt der Dateien wurde im
Buffer Cache zwischengespeichert und
asynchron irgendwann später auf die Platte geschrieben.
Der Vorteil dieser Implementierung ist, dass sie
sicher funktioniert. Wenn während eines Updates ein
Ausfall erfolgt, haben die Metadaten immer einen
konsistenten Zustand. Eine Datei ist entweder komplett
angelegt oder gar nicht. Wenn die Datenblöcke einer
Datei im Fall eines Absturzes noch nicht den Weg aus dem
Buffer Cache auf die Platte gefunden haben,
kann &man.fsck.8; das Dateisystem reparieren, indem es die
Dateilänge einfach auf 0 setzt. Außerdem
ist die Implementierung einfach und überschaubar. Der
Nachteil ist, dass Änderungen der Metadaten sehr
langsam vor sich gehen. Ein rm -r
beispielsweise fasst alle Dateien eines Verzeichnisses
der Reihe nach an, aber jede dieser Änderungen am
Verzeichnis (Löschen einer Datei) wird einzeln synchron
auf die Platte geschrieben. Gleiches beim Auspacken
großer Hierarchien (tar -x).Der zweite Fall sind asynchrone Metadaten-Updates. Das
ist z. B. der Standard bei Linux/ext2fs oder die Variante
mount -o async für *BSD UFS. Man
schickt die Updates der Metadaten einfach auch noch
über den Buffer Cache, sie werden also
zwischen die Updates der normalen Daten eingeschoben.
Vorteil ist, dass man nun nicht mehr auf jeden Update
warten muss, Operationen, die zahlreiche Metadaten
ändern, werden also viel schneller. Auch
hier ist die Implementierung sehr einfach und wenig
anfällig für Fehler. Nachteil ist, dass
keinerlei Konsistenz des Dateisystems mehr gesichert ist.
Wenn mitten in einer Operation, die viele Metadaten
ändert, ein Ausfall erfolgt (Stromausfall, drücken
des Reset-Tasters), dann ist das Dateisystem
anschließend in einem unbestimmten Zustand. Niemand
kann genau sagen, was noch geschrieben worden ist und was
nicht mehr; die Datenblöcke einer Datei können
schon auf der Platte stehen, während die inode Tabelle
oder das zugehörige Verzeichnis nicht mehr aktualisiert
worden ist. Man kann praktisch kein fsck
mehr implementieren, das diesen Zustand
wieder reparieren kann, da die dazu nötigen
Informationen einfach auf der Platte fehlen. Wenn ein
Dateisystem derart beschädigt worden ist, kann man es
nur neu erzeugen (&man.newfs.8;) und die Daten
vom Backup zurückspielen.
Der historische Ausweg aus diesem Dilemma war ein
dirty region logging (auch als
Journalling bezeichnet, wenngleich
dieser Begriff nicht immer gleich benutzt und manchmal auch
für andere Formen von Transaktionsprotokollen gebraucht
wird). Man schreibt die Metadaten-Updates zwar synchron,
aber nur in einen kleinen Plattenbereich, die
logging area. Von da aus werden sie
dann asynchron auf ihre eigentlichen Bereiche verteilt. Da
die logging area ein kleines
zusammenhängendes Stückchen ist, haben die
Schreibköpfe der Platte bei massiven Operationen auf
Metadaten keine allzu großen Wege zurückzulegen,
so dass alles ein ganzes Stück schneller geht als
bei klassischen synchronen Updates. Die Komplexität
der Implementierung hält sich ebenfalls in Grenzen,
somit auch die Anfälligkeit für Fehler. Als
Nachteil ergibt sich, dass Metadaten zweimal auf die
Platte geschrieben werden müssen (einmal in die
logging area, einmal an die richtige
Stelle), so dass das im Falle regulärer
Arbeit (also keine gehäuften Metadatenoperationen) eine
Pessimisierung des Falls der synchronen
Updates eintritt, es wird alles langsamer. Dafür hat man
als Vorteil, dass im Falle eines Crashes der
konsistente Zustand dadurch erzielbar ist, dass die
angefangenen Operationen aus dem dirty region
log entweder zu Ende ausgeführt oder
komplett verworfen werden, wodurch das Dateisystem schnell
wieder zur Verfügung steht.Die Lösung von Kirk McKusick, dem Schöpfer von
Berkeley FFS, waren Soft Updates: die
notwendigen Updates der Metadaten werden im Speicher
gehalten und dann sortiert auf die Platte geschrieben
(ordered metadata updates). Dadurch hat man
den Effekt, dass im Falle massiver
Metadaten-Änderungen spätere Operationen die
vorhergehenden, noch nicht auf die Platte geschriebenen
Updates desselben Elements im Speicher
einholen. Alle Operationen, auf ein
Verzeichnis beispielsweise, werden also in der Regel noch im
Speicher abgewickelt, bevor der Update überhaupt auf
die Platte geschrieben wird (die dazugehörigen
Datenblöcke werden natürlich auch so sortiert,
dass sie nicht vor ihren Metadaten auf der Platte
sind). Im Fall eines Absturzes hat man ein implizites log
rewind: alle Operationen, die noch nicht den Weg auf
die Platte gefunden haben, sehen danach so aus, als
hätten sie nie stattgefunden. Man hat so also den
konsistenten Zustand von ca. 30 bis 60 Sekunden früher
sichergestellt. Der verwendete Algorithmus garantiert
dabei, dass alle tatsächlich benutzten Ressourcen
auch in den entsprechenden Bitmaps (Block- und inode
Tabellen) als belegt markiert sind. Der einzige Fehler, der
auftreten kann, ist, dass Ressourcen noch als
belegt markiert sind, die tatsächlich
frei sind. &man.fsck.8; erkennt dies und
korrigiert diese nicht mehr belegten Ressourcen. Die
Notwendigkeit eines Dateisystem-Checks darf aus diesem
Grunde auch ignoriert und das Dateisystem mittels
mount -f zwangsweise eingebunden werden.
Um noch allozierte Ressourcen freizugeben muss
später ein &man.fsck.8; nachgeholt werden. Das ist
dann auch die Idee des background fsck:
beim Starten des Systems wird lediglich ein
Schnappschuss des Filesystems
gemacht, mit dem &man.fsck.8; dann später arbeiten
kann. Alle Dateisysteme dürfen unsauber
eingebunden werden und das System kann sofort in den
Multiuser-Modus gehen. Danach wird ein
Hintergrund-fsck für die
Dateisysteme gestartet, die dies benötigen, um
möglicherweise irrtümlich belegte Ressourcen
freizugeben. (Dateisysteme ohne Soft
Updates benötigen natürlich immer noch
den üblichen (Vordergrund-)fsck,
bevor sie eingebunden werden können.)Der Vorteil ist, dass die Metadaten-Operationen
beinahe so schnell ablaufen wie im asynchronen Fall (also
durchaus auch schneller als beim logging, das
ja die Metadaten immer zweimal schreiben muss). Als
Nachteil stehen dem die Komplexität des Codes (mit
einer erhöhten Fehlerwahrscheinlichkeit in einem
bezüglich Datenverlust hoch sensiblen Bereich) und ein
erhöhter Speicherverbrauch entgegen. Außerdem
muss man sich an einige Eigenheiten
gewöhnen: Nach einem Absturz ist ein etwas älterer
Stand auf der Platte – statt einer leeren, aber bereits
angelegten Datei (wie nach einem herkömmlichen
fsck Lauf) ist auf einem Dateisystem mit
Soft Updates keine Spur der
entsprechenden Datei mehr zu sehen, da weder die Metadaten
noch der Dateiinhalt je auf die Platte geschrieben wurden.
Weiterhin kann der Platz nach einem rm -r
nicht sofort wieder als verfügbar markiert werden,
sondern erst dann, wenn der Update auch auf die Platte
vermittelt worden ist. Dies kann besonders dann Probleme
bereiten, wenn große Datenmengen in einem Dateisystem
ersetzt werden, das nicht genügend Platz hat, um alle
Dateien zweimal unterzubringen.Einstellungen von Kernel LimitsEinstellungenvon Kernel LimitsDatei und Prozeß Limitskern.maxfileskern.maxfilesAbhängig von den Anforderungen Ihres Systems
kann kern.maxfiles erhöht oder
erniedrigt werden. Die Variable legt die maximale
Anzahl von Dateideskriptoren auf Ihrem System fest. Wenn
die Dateideskriptoren aufgebraucht sind, werden Sie
die Meldung file: table is full
wiederholt im Puffer für Systemmeldungen sehen. Den
Inhalt des Puffers können Sie sich mit dmesg
anzeigen lassen.Jede offene Datei, jedes Socket und jede FIFO verbraucht
einen Dateideskriptor. Auf dicken Produktionsservern
können leicht Tausende Dateideskriptoren benötigt
werden, abhängig von der Art und Anzahl der gleichzeitig
laufenden Dienste.In älteren &os;-Versionen wurde die Voreinstellung
von kern.maxfile aus der
Kernelkonfigurationsoption maxusers
bestimmt. kern.maxfiles wächst
proportional mit dem Wert von maxusers.
Wenn Sie einen angepassten Kernel kompilieren, empfiehlt es sich
diese Option entsprechend der maximalen Benutzerzahl Ihres
Systems einzustellen. Obwohl auf einer Produktionsmaschine
vielleicht nicht 256 Benutzer gleichzeitig angemeldet sind,
können die benötigten Ressourcen ähnlich denen
eines großen Webservers sein.Die Variable kern.maxusers wird beim
Systemstart automatisch aus dem zur Verfügung stehenden
Hauptspeicher bestimmt. Im laufenden Betrieb kann dieser Wert
aus der (nur lesbaren) sysctl-Variable
kern.maxusers ermittelt werden. Falls ein
System für diese Variable einen anderen Wert benötigt,
kann der Wert über den Loader angepasst werden.
Häufig verwendete Werte sind dabei 64, 128, sowie 256.
Es ist empfehlenswert, die Anzahl der Dateideskriptoren nicht
auf einen Wert größer 256 zu setzen, es sei denn,
Sie benötigen wirklich eine riesige Anzahl von ihnen.
Viele der von kern.maxusers auf einen
Standardwert gesetzten Parameter können beim Systemstart
oder im laufenden Betrieb in der Datei
/boot/loader.conf (sehen Sie sich dazu
auch &man.loader.conf.5; sowie die Datei
/boot/defaults/loader.conf an) an Ihre
Bedürfnisse angepasst werden, so wie es bereits an anderer
Stelle dieses Dokuments beschrieben ist.Ältere &os;-Versionen setzen diesen Wert selbst,
wenn Sie in der Konfigurationsdatei den Wert 0Der verwendete Algorithmus setzt
maxusers auf die Speichergröße
des Systems. Der minimale Wert beträgt dabei
32, das Maximum ist
384.
angeben. Wenn Sie den Wert selbst bestimmen wollen,
sollten Sie maxusers mindestens auf
4 setzen. Dies gilt insbesondere dann,
wenn Sie beabsichtigen, das X Window-System zu benutzen
oder Software zu kompilieren. Der Grund dafür ist, dass
der wichtigste Wert, der durch maxusers
bestimmt wird, die maximale Anzahl an Prozessen ist, die auf
20 + 16 * maxusers gesetzt wird. Wenn Sie
also maxusers auf 1 setzen, können
gleichzeitig nur 36 Prozesse laufen, von denen ungefähr
18 schon beim Booten des Systems gestartet werden. Dazu
kommen nochmals etwa 15 Prozesse beim Start des
X Window-Systems. Selbst eine einfache Aufgabe wie das
Lesen einer Manualpage benötigt neun Prozesse zum Filtern,
Dekomprimieren und Betrachten der Datei. Für die meisten
Benutzer sollte es ausreichen, maxusers auf
64 zu setzen, womit 1044 gleichzeitige Prozesse zur
Verfügung stehen. Wenn Sie allerdings den
gefürchteten Fehler proc table full
beim Start eines Programms oder auf einem Server mit einer
großen Benutzerzahl (wie
ftp.FreeBSD.org) sehen, dann
sollten Sie den Wert nochmals erhöhen und den Kernel
neu bauen.Die Anzahl der Benutzer, die sich auf einem Rechner
anmelden kann, wird durch maxusersnicht begrenzt. Der Wert dieser
Variablen legt neben der möglichen Anzahl der Prozesse
eines Benutzers weitere sinnvolle Größen für
bestimmte Systemtabellen fest.kern.ipc.somaxconnkern.ipc.somaxconnDie Variable kern.ipc.somaxconn
beschränkt die Größe der Warteschlange
(Listen-Queue) für
neue TCP-Verbindungen. Der Vorgabewert von
128 ist normalerweise zu klein, um neue
Verbindungen auf einem stark ausgelasteten Webserver
zuverlässig zu handhaben. Auf solchen Servern sollte
der Wert auf 1024 oder höher gesetzt
werden. Ein Dienst (z.B. &man.sendmail.8;, oder
Apache) kann die Größe
der Queue selbst einschränken. Oft gibt es die
Möglichkeit, die Größe der Listen-Queue in
einer Konfigurationsdatei einzustellen. Eine große
Listen-Queue übersteht vielleicht auch einen
Denial of Service Angriff (DoS).Netzwerk LimitsDie Kerneloption NMBCLUSTERS schreibt
die Anzahl der Netzwerkpuffer (Mbufs) fest, die das System besitzt.
Eine zu geringe Anzahl Mbufs auf einem Server mit viel Netzwerkverkehr
verringert die Leistung von &os;. Jeder Mbuf-Cluster nimmt
ungefähr 2 kB Speicher in Anspruch, so dass ein Wert
von 1024 insgesamt 2 Megabyte Speicher für Netzwerkpuffer
im System reserviert. Wie viele Cluster benötigt werden,
lässt sich durch eine einfache Berechnung herausfinden.
Wenn Sie einen Webserver besitzen, der maximal 1000 gleichzeitige
Verbindungen servieren soll und jede der Verbindungen je einen
16 kB großen Puffer zum Senden und Empfangen braucht,
brauchen Sie ungefähr 32 MB Speicher für
Netzwerkpuffer. Als Daumenregel verdoppeln Sie diese Zahl,
so dass sich für NMBCLUSTERS der Wert
2x32 MB / 2 kB = 32768 ergibt.
Für Maschinen mit viel Speicher sollten Werte zwischen
4096 und 32768 genommen werden. Sie können diesen Wert
nicht willkürlich erhöhen, da dies bereits zu einem
Absturz beim Systemstart führen kann. Mit der Option
von &man.netstat.1; können Sie den
Gebrauch der Netzwerkpuffer kontrollieren.Die Netzwerkpuffer können beim Systemstart mit der
Loader-Variablen kern.ipc.nmbclusters
eingestellt werden. Nur auf älteren &os;-Systemen
müssen Sie die Kerneloption NMBCLUSTERS
verwenden.Die Anzahl der &man.sendfile.2; Puffer muss auf ausgelasteten
Servern, die den Systemaufruf &man.sendfile.2; oft verwenden,
vielleicht erhöht werden. Dazu können Sie die
Kerneloption NSFBUFS verwenden oder die
Anzahl der Puffer in /boot/loader.conf
(siehe &man.loader.8;) setzen. Die Puffer sollten erhöht
werden, wenn Sie Prozesse im Zustand sfbufa
sehen. Die schreibgeschützte sysctl-Variable
kern.ipc.nsfbufs zeigt die Anzahl
eingerichteten Puffer im Kernel. Der Wert dieser Variablen
wird normalerweise von kern.maxusers bestimmt.
Manchmal muss die Pufferanzahl jedoch manuell eingestellt
werden.Auch wenn ein Socket nicht blockierend angelegt wurde,
kann der Aufruf von &man.sendfile.2; blockieren, um auf
freie struct sf_buf Puffer zu warten.net.inet.ip.portrange.*net.inet.ip.portrange.*Die sysctl-Variable net.inet.ip.portrange.*
legt die Portnummern für TCP- und UDP-Sockets fest.
Es gibt drei Bereiche: den niedrigen Bereich, den
normalen Bereich und den hohen Bereich. Die meisten
Netzprogramme benutzen den normalen Bereich. Dieser Bereich
umfasst in der Voreinstellung die Portnummern 500 bis 5000
und wird durch die Variablen
net.inet.ip.portrange.first und
net.inet.ip.portrange.last festgelegt.
Die festgelegten Bereiche für Portnummern werden von
ausgehenden Verbindungen benutzt. Unter bestimmten
Umständen, beispielsweise auf stark ausgelasteten
Proxy-Servern, sind alle Portnummern für ausgehende
Verbindungen belegt. Bereiche
für Portnummern spielen auf Servern keine Rolle, die
hauptsächlich eingehende Verbindungen verarbeiten (wie ein
normaler Webserver) oder nur eine begrenzte Anzahl ausgehender
Verbindungen öffnen (beispielsweise ein Mail-Relay).
Wenn Sie keine freien Portnummern mehr haben, sollten Sie
die Variable net.inet.ip.portrange.last
langsam erhöhen. Ein Wert von 10000,
20000 oder 30000 ist
angemessen. Beachten Sie auch eine vorhandene
Firewall, wenn Sie die Bereiche für Portnummern
ändern. Einige Firewalls sperren große Bereiche
(normalerweise aus den kleinen Portnummern) und erwarten,
dass hohe Portnummern für ausgehende Verbindungen
verwendet werden. Daher kann es erforderlich sein, den
Wert von net.inet.ip.portrange.first
zu erhöhen.TCP Bandwidth Delay Product BegrenzungTCP Bandwidth Delay Product Begrenzungnet.inet.tcp.inflight.enableDie TCP Bandwidth Delay Product Begrenzung gleicht
TCP/Vegas von NetBSD. Die
Begrenzung wird aktiviert, indem Sie die sysctl-Variable
net.inet.tcp.inflight.enable auf den
Wert 1 setzen. Das System wird dann
versuchen, für jede Verbindung, das Produkt aus der
Übertragungsrate und der Verzögerungszeit zu
bestimmen. Dieses Produkt begrenzt die Datenmenge, die
für einen optimales Durchsatz zwischengespeichert
werden muss.Diese Begrenzung ist nützlich, wenn Sie Daten
über Verbindungen mit einem hohen Produkt aus
Übertragungsrate und Verzögerungszeit wie Modems,
Gigabit-Ethernet oder schnellen WANs, zur Verfügung
stellen. Insbesondere wirkt sich die Begrenzung aus, wenn
die Verbindung die TCP-Option
Window-scaling verwendet oder
große Sende-Fenster
(send window) benutzt.
Schalten Sie die Debug-Meldungen aus, wenn Sie die Begrenzung
aktiviert haben. Dazu setzen Sie die Variable
net.inet.tcp.inflight.debug auf
0. Auf Produktions-Systemen sollten Sie
zudem die Variable net.inet.tcp.inflight.min
mindestens auf den Wert 6144 setzen.
Allerdings kann ein zu hoher Wert, abhängig von der
Verbindung, die Begrenzungsfunktion unwirksam machen.
Die Begrenzung reduziert die Datenmenge in den Queues von Routern
und Switches, sowie die Datenmenge in der Queue der lokalen
Netzwerkkarte. Die Verzögerungszeit
(Round Trip Time) für
interaktive Anwendungen sinkt, da weniger Pakete
zwischengespeichert werden. Dies gilt besonders für
Verbindungen über langsame Modems. Die Begrenzung
wirkt sich allerdings nur auf das Versenden von Daten aus
(Uploads, Server). Auf den Empfang von Daten (Downloads)
hat die Begrenzung keine Auswirkungen.Die Variable net.inet.tcp.inflight.stab
sollte nicht angepasst werden. Der
Vorgabewert der Variablen beträgt 20,
das heißt es werden maximal zwei Pakete zu dem Produkt
aus Übertragungsrate und Verzögerungszeit addiert.
Dies stabilisiert den Algorithmus und verbessert die
Reaktionszeit auf Veränderungen. Bei langsamen
Verbindungen können sich aber die Laufzeiten der Pakete
erhöhen (ohne diesen Algorithmus wären sie
allerdings noch höher). In solchen Fällen
können Sie versuchen, den Wert der Variablen auf
15, 10 oder
5 zu erniedrigen. Gleichzeitig müssen
Sie vielleicht auch net.inet.tcp.inflight.min
auf einen kleineren Wert (beispielsweise 3500)
setzen. Ändern Sie diese Variablen nur ab, wenn Sie
keine anderen Möglichkeiten mehr haben.Virtueller Speicher (Virtual
Memory)kern.maxvnodesEin vnode ist die interne Darstellung einer Datei oder
eines Verzeichnisses. Die Erhöhung der Anzahl der
für das Betriebssystem verfügbaren vnodes
verringert also die Schreib- und Lesezugriffe auf
Ihre Festplatte. vnodes werden im Normalfall vom
Betriebssystem automatisch vergeben und müssen
nicht von Ihnen angepasst werden. In einigen Fällen
stellt der Zugriff auf eine Platte allerdings einen
Flaschenhals dar, daher sollten Sie in diesem Fall die Anzahl
der möglichen vnodes erhöhen, um dieses Problem zu
beheben. Beachten Sie dabei aber die Größe
des inaktiven und freien Hauptspeichers.Um die Anzahl der derzeit verwendeten vnodes zu sehen,
geben Sie Folgendes ein:&prompt.root; sysctl vfs.numvnodes
vfs.numvnodes: 91349Die maximal mögliche Anzahl der vnodes erhalten
Sie durch die Eingabe von:&prompt.root; sysctl kern.maxvnodes
kern.maxvnodes: 100000Wenn sich die Anzahl der genutzten vnodes dem maximal
möglichen Wert nähert, sollten Sie den Wert
kern.maxvnodes zuerst um etwa 1.000
erhöhen. Beobachten Sie danach die Anzahl der vom
System genutzten vfs.numvnodes.
Nähert sich der Wert wiederum dem definierten
Maximum, müssen Sie kern.maxvnodes
nochmals erhöhen. Sie sollten nun eine Änderung
Ihres Speicherverbrauches (etwa über &man.top.1;)
registrieren können und über mehr aktiven
Speicher verfügen.Hinzufügen von Swap-BereichenEgal wie vorausschauend Sie planen, manchmal entspricht ein System
einfach nicht Ihren Erwartungen. Es ist leicht, mehr Swap-Bereiche
hinzuzufügen. Dazu stehen Ihnen drei Wege offen: Sie
können eine neue Platte einbauen, den Swap-Bereich über NFS
ansprechen oder eine Swap-Datei auf einer existierenden Partition
einrichten.Für Informationen zur Verschlüsselung von
Swap-Partitionen, zu den dabei möglichen Optionen sowie
zu den Gründen für eine Verschlüsselung des
Auslagerungsspeichers lesen Sie bitte
des Handbuchs.Swap auf einer neuen FestplatteDer einfachste Weg, zusätzlich einen Swap-Bereich
einzurichten, ist der Einbau einer neuen Platte, die Sie
sowieso gebrauchen können. Die Anordnung von
Swap-Bereichen wird in
des Handbuchs besprochen.Swap-Bereiche über NFSSwap-Bereiche über NFS sollten Sie nur dann einsetzen,
wenn Sie über keine lokale Platte verfügen, da es durch
die zur Verfügung stehende Bandbreite limitiert wird und
außerdem den NFS-Server zusätzlich belastet.Swap-DateienSie können eine Datei festgelegter Größe als
Swap-Bereich nutzen. Im folgenden Beispiel werden wir eine 64 MB
große Datei mit Namen /usr/swap0
benutzen, Sie können natürlich einen beliebigen Namen
für den Swap-Bereich benutzen.Erstellen einer Swap-DateiStellen Sie sicher, dass der Kernel RAM-Disks
(&man.md.4;) unterstützt. Dies ist in der
GENERIC-Konfiguration
voreingestellt.device md # Memory "disks"Legen Sie die Swap-Datei
/usr/swap0 an:&prompt.root; dd if=/dev/zero of=/usr/swap0 bs=1024k count=64Setzen Sie die richtigen Berechtigungen für
/usr/swap0:&prompt.root; chmod 0600 /usr/swap0Aktivieren Sie die Swap-Datei
/etc/rc.conf:swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.Um die Swap-Datei zu aktivieren, führen Sie
entweder einen Neustart durch oder geben das folgende Kommando
ein:&prompt.root; mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0HitenPandyaVerfasst von TomRhodesEnergie- und RessourcenverwaltungEs ist wichtig, Hardware effizient einzusetzen. Vor der
Einführung des Advanced Configuration and Power
Interface (ACPI) konnten
Stromverbrauch und Wärmeabgabe eines Systems nur
schlecht von Betriebssystemen gesteuert werden. Die Hardware
wurde vom BIOS gesteuert, was die Kontrolle
der Energieverwaltung für den Anwender erschwerte. Das
Advanced Power Management (APM) erlaubte
es lediglich, einige wenige Funktionen zu steuern, obwohl die
Überwachung von Energie- und Ressourcenverbrauch zu den
wichtigsten Aufgaben eines Betriebssystems gehört, um auf
verschiedene Ereignisse, beispielsweise einen unerwarteten
Temperaturanstieg, reagieren können.Dieser Abschnitt erklärt das Advanced Configuration and
Power Interface (ACPI).Was ist ACPI?ACPIAPMAdvanced Configuration and Power Interface
(ACPI) ist ein Standard verschiedener
Hersteller, der die Verwaltung von Hardware und
Energiesparfunktionen festlegt. Die
ACPI-Funktionen können von einem
Betriebssystem gesteuert werden. Der Vorgänger des
ACPI, Advanced Power Management
(APM), erwies sich in modernen Systemen
als unzureichend.Mängel des Advanced Power Managements (APM)Das Advanced Power Management (APM)
steuert den Energieverbrauch eines Systems auf Basis
der Systemaktivität. Das APM-BIOS wird von dem
Hersteller des Systems zur Verfügung gestellt
und ist auf die spezielle Hardware angepasst. Der
APM-Treiber des Betriebssystems greift auf das
APM Software Interface zu, das den
Energieverbrauch regelt. APM findet sich in der Regel
nur noch in Systemen, die vor 2001 produziert
wurden.Das APM hat hauptsächlich
vier Probleme. Erstens läuft die Energieverwaltung
unabhängig vom Betriebssystem in einem
(herstellerspezifischen) BIOS. Beispielsweise kann
das APM-BIOS die Festplatten nach einer konfigurierbaren
Zeit ohne die Zustimmung des Betriebssystems herunterfahren.
Zweitens befindet sich die ganze APM-Logik im BIOS; das
Betriebssystem hat gar keine APM-Komponenten. Bei Problemen
mit dem APM-BIOS muss das Flash-ROM aktualisiert werden.
Diese Prozedur ist gefährlich, da sie im Fehlerfall
das System unbrauchbar machen kann. Zum Dritten ist APM
eine Technik, die herstellerspezifisch ist und nicht
koordiniert wird. Fehler im BIOS eines Herstellers werden
nicht unbedingt im BIOS anderer Hersteller korrigiert.
Das letzte Problem ist, dass im APM-BIOS nicht genügend
Platz vorhanden ist, um eine durchdachte oder eine auf den
Zweck der Maschine zugeschnittene Energieverwaltung
zu implementieren.Das Plug and Play BIOS (PNPBIOS)
war ebenfalls unzureichend. Das PNPBIOS verwendet eine
16-Bit-Technik. Damit das Betriebssystem das PNPBIOS
ansprechen kann, muss es in einer 16-Bit-Emulation laufen.Der APM-Treiber von &os; ist in
der Hilfeseite &man.apm.4; beschrieben.Konfiguration des ACPIDas Modul acpi.ko wird
standardmäßig beim Systemstart vom &man.loader.8;
geladen und sollte daher nicht
fest in den Kernel eingebunden werden. Dadurch kann
acpi.ko ohne einen Neubau des Kernels ersetzt
werden und das Modul ist leichter zu testen. Wenn Sie in der
Ausgabe von &man.dmesg.8; das Wort ACPI sehen,
ist das Modul geladen worden. Das ACPI-Modul im laufenden
Betrieb zu laden, führt oft nicht zum gewünschten
Ergebnis. Treten bei Ihrem System Probleme auf, können
Sie ACPI auch komplett deaktivieren.
Dazu definieren Sie die Variable
hint.acpi.0.disabled="1" in der Datei
/boot/loader.conf. Alternativ können
Sie die Variable auch am &man.loader.8;-Prompt eingeben.
Das Modul kann im laufenden Betrieb nicht entfernt werden,
da es zur Kommunikation mit der Hardware verwendet wird.ACPI und APM
können nicht zusammen verwendet werden. Das zuletzt
geladene Modul beendet sich, sobald es bemerkt, dass das andere
Modul geladen ist.Mit &man.acpiconf.8; können Sie das System in einen
Ruhemodus (sleep mode) versetzen.
Es gibt verschiedene Modi (von 1 bis
5), die Sie auf der Kommandozeile mit
angeben können. Für die meisten
Anwender sind die Modi 1 und
3 völlig ausreichend. Der Modus
5 schaltet das System
aus (Soft-off) und entspricht
dem folgenden Befehl:&prompt.root; halt -pVerschiedene Optionen können als
&man.sysctl.8;-Variablen gesetzt werden. Lesen Sie dazu
die Manualpages zu &man.acpi.4; sowie &man.acpiconf.8;.NateLawsonVerfasst von PeterSchultzMit Beiträgen von TomRhodesACPI-FehlersucheACPIProbleme mitACPI ist ein gänzlich neuer
Weg, um Geräte aufzufinden und deren Stromverbrauch
zu regulieren. Weiterhin bietet ACPI
einen einheitlichen Zugriff auf Geräte, die vorher
vom BIOS verwaltet wurden. Es werden
zwar Fortschritte gemacht, dass ACPI
auf allen Systemen läuft, doch tauchen immer wieder
Fehler auf: fehlerhafter Bytecode der
ACPI-Machine-Language
(AML) einiger Systemplatinen,
ein unvollständiges &os;-Kernel-Subsystem oder
Fehler im ACPI-CA-Interpreter von &intel;.Dieser Abschnitt hilft Ihnen, zusammen mit den Betreuern
des &os;-ACPI-Subsystems, Fehlerquellen
zu finden und Fehler zu beseitigen. Danke, dass Sie diesen
Abschnitt lesen; hoffentlich hilft er, Ihre Systemprobleme
zu lösen.Fehlerberichte einreichenBevor Sie einen Fehlerbericht einreichen, stellen
Sie bitte sicher, dass Ihr BIOS
und die Firmware Ihres Controllers aktuell sind.Wenn Sie sofort einen Fehlerbericht einsenden wollen,
schicken Sie bitte die folgenden Informationen an
die Mailingliste freebsd-acpi:Beschreiben Sie den Fehler und alle Umstände,
unter denen der Fehler auftritt. Geben Sie
ebenfalls den Typ und das Modell Ihres Systems
an. Wenn Sie einen neuen Fehler entdeckt haben,
versuchen Sie möglichst genau zu beschreiben,
wann der Fehler das erste Mal aufgetreten ist.Die Ausgabe von &man.dmesg.8; nach der Eingabe
von boot -v.
Geben Sie auch alle Fehlermeldungen an, die erscheinen,
wenn Sie den Fehler provozieren.Die Ausgabe von &man.dmesg.8; nach der Eingabe
von boot -v und mit deaktiviertem
ACPI, wenn das Problem ohne
ACPI nicht auftritt.Die Ausgabe von sysctl hw.acpi.
Dieses Kommando zeigt die vom System unterstützten
ACPI-Funktionen an.Die URL, unter der die
ACPI-Source-Language
(ASL) liegt. Schicken Sie
bitte nicht die ASL
an die Mailingliste, da die ASL
sehr groß sein kann. Eine Kopie der
ASL erstellen Sie mit dem
nachstehenden Befehl:&prompt.root; acpidump -td > name-system.aslSetzen Sie bitte für name
den Namen Ihres Kontos und für
system den Hersteller und
das Modell Ihres Systems ein. Zum Beispiel:
njl-FooCo6000.asl.Obwohl die meisten Entwickler die Mailingliste
&a.current.name; lesen, sollten Sie Fehlerberichte an
die Liste &a.acpi.name; schicken. Seien Sie bitte
geduldig; wir haben alle Arbeit außerhalb des Projekts.
Wenn der Fehler nicht offensichtlich ist, bitten
wir Sie vielleicht, einen offiziellen Fehlerbericht
(PR) mit &man.send-pr.1; einzusenden.
Geben Sie im Fehlerbericht bitte dieselben Informationen
wie oben an. Mithilfe der PRs
verfolgen und lösen wir Probleme. Senden Sie
bitte keinen PR ein, ohne vorher
den Fehlerbericht an die Liste &a.acpi.name; zu senden.
Wir benutzen die PRs als Erinnerung
an bestehende Probleme und nicht zum Sammeln aller
Probleme. Es kann sein, dass der Fehler schon von
jemand anderem gemeldet wurde.ACPI-GrundlagenACPIACPI gibt es in allen modernen Rechnern
der ia32- (x86), ia64- (Itanium) und amd64- (AMD) Architektur.
Der vollständige Standard bietet Funktionen
zur Steuerung und Verwaltung der CPU-Leistung,
der Stromversorgung, von Wärmebereichen, Batterien,
eingebetteten Controllern und Bussen. Auf den meisten
Systemen wird nicht der vollständige Standard implementiert.
Arbeitsplatzrechner besitzen meist nur Funktionen zur
Verwaltung der Busse, während Notebooks Funktionen
zur Temperaturkontrolle und Ruhezustände besitzen.Ein ACPI konformes System
besitzt verschiedene Komponenten. Die BIOS-
und Chipsatz-Hersteller stellen mehrere statische
Tabellen bereit (zum Beispiel die
Fixed-ACPI-Description-Table,
FADT). Die Tabellen enthalten beispielsweise
die mit SMP-Systemen benutzte
APIC-Map, Konfigurationsregister und
einfache Konfigurationen. Zusätzlich gibt es die
Differentiated-System-Description-Table (DSDT),
die Bytecode enthält. Die Tabelle ordnet Geräte
und Methoden in einem baumartigen Namensraum an.Ein ACPI-Treiber muss die statischen
Tabellen einlesen, einen Interpreter für den Bytecode
bereitstellen und die Gerätetreiber im Kernel so
modifizieren, dass sie mit dem ACPI-Subsystem
kommunizieren. Für &os;, Linux und NetBSD hat &intel;
den Interpreter ACPI-CA, zur Verfügung
gestellt. Der Quelltext zu ACPI-CA
befindet sich im Verzeichnis
src/sys/contrib/dev/acpica.
Die Schnittstelle von ACPI-CA zu &os;
befindet sich unter src/sys/dev/acpica/Osd.
Treiber, die verschiedene ACPI-Geräte
implementieren, befinden sich im Verzeichnis
src/sys/dev/acpica.Häufige ProblemeACPIProbleme mitDamit ACPI richtig funktioniert,
müssen alle Teile funktionieren. Im Folgenden
finden Sie eine Liste mit Problemen und möglichen
Umgehungen oder Fehlerbehebungen. Die Liste ist nach
der Häufigkeit, mit der die Probleme auftreten,
sortiert.MausproblemeEs kann vorkommen, dass die Maus nicht mehr funktioniert,
wenn Sie nach einem Suspend weiterarbeiten wollen. Ist dies
bei Ihnen der Fall, reicht es meistens aus, den Eintrag
hint.psm.0.flags="0x3000" in Ihre
/boot/loader.conf aufzunehmen. Besteht
das Problem weiterhin, sollten Sie einen Fehlerbericht
an das FreeBSD Project senden.Suspend/ResumeACPI kennt drei
Suspend-to-RAM-Zustände
(STR):
S1-S3.
Es gibt einen Suspend-to-Disk-Zustand:
S4. Der Zustand S5
wird Soft-Off genannt. In diesem Zustand befindet
sich ein Rechner, wenn die Stromversorgung angeschlossen
ist, der Rechner aber nicht hochgefahren ist. Der
Zustand S4 kann auf zwei Arten
implementiert werden:
S4BIOS und
S4OS.
Im ersten Fall wird der Suspend-to-Disk-Zustand durch
das BIOS hergestellt im zweiten
Fall alleine durch das Betriebssystem.Die Suspend-Zustände sind Ruhezustände,
in denen der Rechner weniger Energie als im
Normalbetrieb benötigt. Resume bezeichnet
die Rückkehr zum Normalbetrieb.Die Suspend-Zustände können Sie mit
dem Kommando sysctl hw.acpi
ermitteln. Das Folgende könnte beispielsweise
ausgegeben werden:hw.acpi.supported_sleep_state: S3 S4 S5
hw.acpi.s4bios: 0Diese Ausgabe besagt, dass mit dem Befehl
acpiconf -s die Zustände
S3, S4OS
und S5 eingestellt werden können.
Hätte den Wert
1, gäbe es den Zustand
S4BIOS anstelle
von S4OS.Wenn Sie die Suspend- und Resume-Funktionen
testen, fangen Sie mit dem S1-Zustand
an, wenn er angeboten wird. Dieser Zustand wird
am ehesten funktionieren, da der Zustand wenig
Treiber-Unterstützung benötigt. Der Zustand
S2 ist ähnlich wie
S1, allerdings hat ihn noch niemand
implementiert. Als nächstes sollten Sie den
Zustand S3 ausprobieren. Dies
ist der tiefste STR-Schlafzustand.
Dieser Zustand ist auf massive Treiber-Unterstützung
angewiesen, um die Geräte wieder richtig zu
initialisieren. Wenn Sie Probleme mit diesem Zustand
haben, können Sie die Mailingliste
&a.acpi.name; anschreiben. Erwarten Sie allerdings
nicht zu viel: Es gibt viele Treiber und Geräte,
an denen noch gearbeitet und getestet wird.Um das Problem einzugrenzen, entfernen Sie soviele
Treiber wie möglich aus dem Kernel. Sie können
das Problem isolieren, indem Sie einen Treiber nach
dem anderen laden, bis der Fehler wieder auftritt.
Typischerweise verursachen binäre Treiber wie
nvidia.ko, X11-Grafiktreiber und
USB-Treiber die meisten Fehler,
hingegen laufen Ethernet-Treiber für gewöhnlich
sehr zuverlässig. Wenn ein Treiber
zuverlässig geladen und entfernt werden kann,
können Sie den Vorgang automatisieren, indem
Sie die entsprechenden Kommandos in die Dateien
/etc/rc.suspend und
/etc/rc.resume einfügen.
In den Dateien finden Sie ein deaktiviertes Beispiel,
das einen Treiber lädt und wieder entfernt.
Ist die Bildschirmanzeige bei der Wiederaufnahme
des Betriebs gestört, setzen Sie bitte die
Variable auf
0. Versuchen Sie auch, die Variable
auf kürzere
Zeitspannen zu setzen.Die Suspend- und Resume-Funktionen können
Sie auch auf einer neuen Linux-Distribution
mit ACPI testen. Wenn es mit
Linux funktioniert, liegt das Problem wahrscheinlich
bei einem &os;-Treiber. Es hilft uns, das Problem
zu lösen, wenn Sie feststellen können, welcher
Treiber das Problem verursacht. Beachten Sie bitte,
dass die ACPI-Entwickler normalerweise
keine anderen Treiber pflegen (beispielsweise Sound- oder
ATA-Treiber). Es ist wohl das beste,
die Ergebnisse der Fehlersuche an die Mailingliste
&a.current.name; und den Entwickler des Treibers
zu schicken. Wenn Ihnen danach ist, versuchen Sie,
den Fehler in der Resume-Funktion zu finden, indem
Sie einige &man.printf.3;-Anweisungen in den Code
des fehlerhaften Treibers einfügen.Schließlich können Sie ACPI
noch abschalten und stattdessen APM
verwenden. Wenn die Suspend- und Resume-Funktionen mit
APM funktionieren, sollten Sie
vielleicht besser APM verwenden
(insbesondere mit alter Hardware von vor dem Jahr 2000).
Die Hersteller benötigten einige Zeit, um
ACPI korrekt zu implementieren, daher
gibt es mit älterer Hardware oft
ACPI-Probleme.Temporäre oder permanente SystemhängerDie meisten Systemhänger entstehen durch verlorene
Interrupts oder einen Interrupt-Sturm.
Probleme werden verursacht durch die Art, in der das
BIOS Interrupts vor dem Systemstart
konfiguriert, durch eine fehlerhafte
APIC-Tabelle und durch die
Zustellung des System-Control-Interrupts
(SCI).Interrupt-SturmAnhand der Ausgabe des Befehls
vmstat -i können Sie verlorene
Interrupts von einem Interrupt-Sturm unterscheiden.
Untersuchen Sie die Ausgabezeile, die acpi0
enthält. Ein Interrupt-Sturm liegt vor, wenn
der Zähler öfter als ein paar Mal pro
Sekunde hochgezählt wird. Wenn sich das System
aufgehangen hat, versuchen Sie mit der Tastenkombination
CtrlAltEsc in den Debugger DDB
zu gelangen. Geben Sie dort den Befehl
show interrupts ein.APICdeaktivierenWenn Sie Interrupt-Probleme haben, ist es vorerst
wohl am besten, APIC zu deaktivieren.
Tragen Sie dazu die Zeile
hint.apic.0.disabled="1" in
loader.conf ein.Abstürze (Panics)Panics werden so
schnell wie möglich behoben; mit ACPI
kommt es aber selten dazu. Zuerst sollten Sie
die Panic reproduzieren und dann versuchen einen
backtrace (eine
Rückverfolgung der Funktionsaufrufe) zu erstellen.
Richten Sie dazu den DDB über
die serielle Schnittstelle (siehe
) oder eine gesonderte
&man.dump.8;-Partition ein. In DDB
können Sie den backtrace
mit dem Kommando tr erstellen.
Falls Sie den backtrace
vom Bildschirm abschreiben müssen, schreiben
Sie bitte mindestens die fünf ersten und die
fünf letzten Zeile der Ausgabe auf.Versuchen Sie anschließend, das Problem
durch einen Neustart ohne ACPI
zu beseitigen. Wenn das funktioniert hat, können
Sie versuchen, das verantwortliche
ACPI-Subsystem durch Setzen der
Variablen
herauszufinden. Die Hilfeseite &man.acpi.4; enthält
dazu einige Beispiele.Nach einem Suspend oder einem Stopp startet
das System wiederSetzen Sie zuerst in &man.loader.conf.5; die Variable
auf
0. Damit wird verhindert, dass
ACPI während des Systemabschlusses
die Bearbeitung verschiedener Ereignisse deaktiviert.
Auf manchen Systemen muss die Variable den Wert
1 besitzen (die Voreinstellung).
Normalerweise wird der unerwünschte Neustart
des Systems durch Setzen dieser Variablen behoben.Andere ProblemeWenn Sie weitere Probleme mit ACPI
haben (Umgang mit einer Docking-Station, nicht erkannte
Geräte), schicken Sie bitte eine Beschreibung an die
Mailingliste. Allerdings kann es sein, dass einige
Probleme von noch unvollständigen Teilen des
ACPI-Subsystems abhängen und
es etwas dauern kann bis diese Teile fertig sind.
Seien Sie geduldig und rechnen Sie damit, dass wir
Ihnen Fehlerbehebungen zum Testen senden.ASL, acpidump und
IASLACPIASLEin häufiges Problem ist fehlerhafter Bytecode
des BIOS-Herstellers. Dies erkennen
Sie an Kernelmeldungen auf der Konsole wie die folgende:ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
(Node 0xc3f6d160), AE_NOT_FOUNDOft können Sie das Problem dadurch lösen,
dass Sie eine aktuelle BIOS-Version
einspielen. Die meisten Meldungen auf der Konsole sind
harmlos, wenn aber beispielsweise der Batteriestatus
falsch angezeigt wird, können Sie in den
Meldungen nach Problemen mit der
AML-Machine-Language
(AML) suchen. Der Bytecode der
AML wird aus der
ACPI-Source-Language (ASL)
übersetzt und in einer Tabelle, der DSDT,
abgelegt. Eine Kopie der ASL
können Sie mit dem Befehl &man.acpidump.8; erstellen.
Verwenden Sie mit diesem Befehl sowohl die Option
(die Inhalte der statischen
Tabellen anzeigen) als auch die Option
(die AML in ASL
zurückübersetzen). Ein Beispiel für
die Syntax finden Sie im Abschnitt Fehlerberichte einreichen.Sie können einfach prüfen, ob sich die
ASL übersetzen lässt.
Für gewöhnlich können Sie Warnungen
während des Übersetzens ignorieren.
Fehlermeldungen führen normal dazu, dass
ACPI fehlerhaft arbeitet. Ihre
ASL übersetzen Sie mit dem
nachstehenden Kommando:&prompt.root; iasl ihre.aslDie ASL reparierenACPIASLAuf lange Sicht ist es unser Ziel, dass
ACPI ohne Eingriffe des Benutzers
läuft. Zurzeit entwickeln wir allerdings noch
Umgehungen für Fehler der BIOS-Hersteller.
Der µsoft;-Interpreter (acpi.sys
und acpiec.sys) prüft die
ASL nicht streng gegen den Standard.
Daher reparieren BIOS-Hersteller,
die ACPI nur unter &windows; testen,
ihre ASL nicht. Wir hoffen, dass
wir das vom Standard abweichende Verhalten des
µsoft;-Interpreters dokumentieren und in &os; replizieren
können. Dadurch müssen Benutzer ihre
ASL nicht selbst reparieren.
Sie können Ihre ASL selbst reparieren,
wenn Sie ein Problem umgehen und uns helfen möchten.
Senden Sie uns bitte die mit &man.diff.1; erstellte Differenz
zwischen alter und neuer ASL. Wir
werden versuchen, den Interpreter ACPI-CA
zu korrigieren, damit die Fehlerbehebung nicht mehr
erforderlich ist.ACPIFehlermeldungenDie nachfolgende Liste enthält häufige
Fehlermeldungen, deren Ursache und eine Beschreibung,
wie die Fehler korrigiert werden:Abhängigkeiten vom BetriebssystemEinige AMLs gehen davon aus, dass
die Welt ausschließlich aus verschiedenen
&windows;-Versionen besteht. &os; kann vorgeben, irgendein
Betriebssystem zu sein. Versuchen Sie das Betriebssystem,
das Sie in der ASL finden, in der
Datei /boot/loader.conf anzugeben:
hw.acpi.osname="Windows 2001".Fehlende Return-AnweisungenEinige Methoden verzichten auf die vom Standard
vorgeschriebene Rückgabe eines Wertes. Obwohl
der Interpreter ACPI-CA dies nicht
beheben kann, besitzt &os; die Möglichkeit, den
Rückgabewert implizit zu setzen. Wenn Sie
wissen, welcher Wert zurückgegeben werden muss,
können Sie die fehlenden Return-Anweisungen
selbst einsetzen. Die Option
zwingt iasl, die ASL
zu übersetzen.Überschreiben der vorgegebenen
AMLNachdem Sie Ihre ASL in der
Datei ihre.asl angepasst haben,
übersetzen Sie die ASL wie folgt:&prompt.root; iasl ihre.aslMit der Option erzwingen Sie das
Erstellen der AML auch wenn während
der Übersetzung Fehler auftreten. Beachten Sie,
dass einige Fehler, wie fehlende Return-Anweisungen,
automatisch vom Interpreter umgangen werden.In der Voreinstellung erstellt der Befehl
iasl die Ausgabedatei
DSDT.aml. Wenn Sie diese Datei
anstelle der fehlerhaften Kopie des BIOS
laden wollen, editieren Sie /boot/loader.conf
wie folgt:acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/DSDT.aml"Stellen Sie bitte sicher, dass sich die Datei
DSDT.aml im Verzeichnis
/boot befindet.ACPI-Meldungen zur
Fehlersuche erzeugenACPIProbleme mitACPIFehlersucheDer ACPI-Treiber besitzt
flexible Möglichkeiten zur Fehlersuche. Sie
können sowohl die zu untersuchenden Subsysteme
als auch die zu erzeugenden Ausgaben festlegen. Die zu
untersuchenden Subsysteme werden als so genannte
layers angegeben. Die Subsysteme sind in
ACPI-CA-Komponenten
(ACPI_ALL_COMPONENTS) und
ACPI-Hardware (ACPI_ALL_DRIVERS)
aufgeteilt. Welche Meldungen ausgegeben werden, wird über
level gesteuert. level reicht
von ACPI_LV_ERROR (es werden nur Fehler
ausgegeben) bis zu ACPI_LV_VERBOSE (alles
wird ausgegeben). level ist eine Bitmaske,
sodass verschiedene Stufen auf einmal (durch Leerzeichen
getrennt) angegeben werden können. Die erzeugte
Ausgabemenge passt vielleicht nicht in den Konsolenpuffer.
In diesem Fall sollten Sie die Ausgaben mithilfe einer
seriellen Konsole sichern. Die möglichen Werte
für layers und level
werden in der Hilfeseite &man.acpi.4; beschrieben.Die Ausgaben zur Fehlersuche sind in der Voreinstellung
nicht aktiviert. Wenn ACPI im Kernel
enthalten ist, fügen Sie options ACPI_DEBUG
zur Kernelkonfigurationsdatei hinzu. Sie können die
Ausgaben zur Fehlersuche global aktivieren, indem Sie in der
Datei /etc/make.conf die Zeile
ACPI_DEBUG=1 einfügen. Das Modul
acpi.ko können Sie wie folgt
neu übersetzen:&prompt.root; cd /sys/modules/acpi/acpi
&& make clean &&
make ACPI_DEBUG=1Installieren Sie anschließend
acpi.ko im Verzeichnis
/boot/kernel.
In der Datei loader.conf stellen Sie
level und layer ein. Das
folgende Beispiel aktiviert die Ausgabe von Fehlern für
alle ACPI-CA-Komponenten und alle
ACPI-Hardwaretreiber (wie
CPU, LID):debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
debug.acpi.level="ACPI_LV_ERROR"Wenn ein Problem durch ein bestimmtes Ereignis,
beispielsweise den Start nach einem Ruhezustand, hervorgerufen
wird, können Sie die Einstellungen für
level und layer auch mit dem
Kommando sysctl vornehmen. In diesem
Fall müssen Sie die Datei loader.conf
nicht editieren. Auf der sysctl-Kommandozeile
geben Sie dieselben Variablennamen wie in
loader.conf an.ACPI-InformationsquellenWeitere Informationen zu ACPI
erhalten Sie an den folgenden Stellen:die &a.acpi; Mailingliste,die Archive der ACPI-Mailingliste:
,die alten Archive der ACPI-Mailingliste:
,die ACPI-Spezifikation (Version 2.0):
,in den nachstehenden &os;-Hilfeseiten:
&man.acpi.4;, &man.acpi.thermal.4;, &man.acpidump.8;,
&man.iasl.8; und &man.acpidb.8;,
DSDT debugging resource
(als Beispiel wird Compaq erläutert, die
Ressource ist aber dennoch nützlich).
diff --git a/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml b/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml
index c45b9d17db..50977c343f 100644
--- a/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/desktop/chapter.sgml
@@ -1,1222 +1,1246 @@
ChristopheJunietBeigetragen von MartinHeinenÜbersetzt von Desktop-AnwendungenÜbersichtFreeBSD 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 (Firefox,
Opera,
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 SieSoftware Dritter installieren können
() undLinux-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.BrowserBrowserWebFreeBSD 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/dillo2,
www/links oder
www/w3m.Dieser Abschnitt behandelt die nachstehenden Anwendungen:AnwendungRessourcenbedarfInstallationsaufwand aus den Portswichtige AbhängigkeitenFirefoxmittelhochGtk+OperaniedrigniedrigEs gibt eine &os;- und eine Linux-Version.
Die Linux-Version hängt von der
Linux-Kompatibilität (Linux
Binary Compatibility) und
linux-openmotif ab.KonquerormittelhochKDE-BiliothekenFirefoxFirefoxFirefox 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,
+ 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 firefoxDamit installieren Sie Firefox 3.6, wenn
Sie stattdessen Firefox 3.5 einsetzen
möchten, geben Sie folgenden Befehl ein:&prompt.root; pkg_add -r firefox35
-
+
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 cleanErsetzen Sie im vorherigen Kommando firefox
durch firefox35 für
Firefox 3.5.Firefox und das &java;-PluginDieser und der nächste Abschnitt gehen davon aus,
dass Sie Firefox bereits installiert
haben.Das &java;-Plugin funktioniert aktuell nicht mit
Firefox 3.6.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.
+
+ Die eben genannte Seite bietet keine dezidierten Pakete
+ für &os; 8.X an. Es ist
+ allerdings problemlos möglich, Pakete für
+ &os; 7.X auf einem
+ 8.X-System einzusetzen. Dazu
+ installieren Sie den Port misc/compat7x, bevor Sie das
+ Java-Binärpaket installieren.
+
+ Alternativ können Sie das
+ Diablo &jre; (ebenso wie das
+ (Diablo &jdk;) auch über die
+ Ports-Sammlung installieren (über die Ports
+ java/diablo-jre16 sowie
+ java/diablo-jdk16).
+ Damit die Installation über die Ports-Sammlung klappt,
+ müssen Sie die Quelldateien manuell herunterladen (da
+ deren Lizenz den automatischen Download nicht erlaubt).
+ Führen Sie den Befehl
+ make install aus,
+ um Informationen zum Download der Quelldateien zu erhalten.
+
+
Damit Firefox &java; unterstützt,
müssen Sie zuerst den Port java/javavmwrapper installieren.
Anschließend laden Sie das
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, muss jeder Benutzer noch das folgende Kommando
ausführen:&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.Bei den Befehlen oben wird davon ausgegangen, dass Sie die
&arch.i386;-Architektur verwenden. Pakete für &arch.amd64;
sind ebenfalls erhältlich.Firefox und das ¯omedia; &flash;-PluginFlashDas ¯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.Je nachdem, welche Version von &os; Sie verwenden, sind
unterschiedliche Schritte notwendig:Für &os; 7.X
-
- Installieren Sie den Port 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 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.
+ &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 -iDas &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.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.OperaOperaOpera 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 operaEinige 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 cleanWenn 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.KonquerorKonquerorKonqueror 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
nachlesen.BüroanwendungenNeue 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:AnwendungRessourcenbedarfInstallationsaufwand aus den Portswichtige AbhängigkeitenKOfficeniedrighochKDEAbiWordniedrigniedrigGtk+ oder
GNOMEThe GimpniedrighochGtk+OpenOffice.orghochenorm&jdk;,
MozillaKOfficeKOfficeOffice-PaketeKOfficeDie 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 kofficeWenn 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 cleanAbiWordAbiWordAbiWord 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 AbiWordSollte 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 cleanThe GIMPThe GIMPThe 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 gimpBenutzen 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 cleanDie 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.orgOpenOffice.orgOffice-PaketeOpenOffice.orgOpenOffice.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.orgDiese 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.orgNach dem ersten Start werden Ihnen einige Fragen gestellt.
Außerdem wird in Ihrem Heimatverzeichnis der neue
Unterordner .openoffice.org
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-3
&prompt.root; make install cleanWenn Sie ein lokalisierte Version bauen wollen, ersetzen
Sie den letzten Befehl durch die folgende Zeile:&prompt.root; make LOCALIZED_LANG=Ihre_Sprache install cleanDabei 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.orgAnzeigen von DokumentenEinige 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:AnwendungRessourcenbedarfInstallationsaufwand aus den Portswichtige Abhängigkeiten&acrobat.reader;niedrigniedrigLinux Binary CompatibilitygvniedrigniedrigXaw3dXpdfniedrigniedrigFreeTypeGQviewniedrigniedrigGtk+ oder
GNOME&acrobat.reader;Acrobat ReaderPDFanzeigenViele 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; 8 über
die Ports-Sammlung zu installieren, geben Sie Folgendes ein:&prompt.root; cd /usr/ports/print/acroread8
&prompt.root; make install cleanAufgrund der Lizenzbedinungen ist eine Paketversion leider
nicht verfügbar.gvgvPDFanzeigenPostScriptanzeigengv 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 gvBenutzen Sie die Ports-Sammlung, wenn das Paket nicht zur
Verfügung steht:&prompt.root; cd /usr/ports/print/gv
&prompt.root; make install cleanXpdfXpdfPDFanzeigenEin 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 xpdfWenn 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 cleanWenn Sie nach Abschluss der Installation
Xpdf starten, öffnen Sie
das Menü mit der rechten Maustaste.GQviewGQviewMit 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 gqviewIst 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 cleanFinanzsoftwareWenn 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:AnwendungRessourcenbedarfInstallationsaufwand aus den Portswichtige AbhängigkeitenGnuCashniedrighochGNOMEGnumericniedrighochGNOMEAbacusniedrigniedrigTcl/TkKMyMoneyniedrighochKDEGnuCashGnuCashGnuCash 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 gnucashWenn das Paket nicht zur Verfügung steht, benutzen Sie die
Ports-Sammlung:&prompt.root; cd /usr/ports/finance/gnucash
&prompt.root; make install cleanGnumericGnumericTabellenkalkulationGnumericGnumeric 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 gnumericWenn das Paket nicht zur Verfügung steht, benutzen Sie die
Ports-Sammlung:&prompt.root; cd /usr/ports/math/gnumeric
&prompt.root; make install cleanAbacusAbacusTabellenkalkulationAbacusAbacus 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 abacusWenn das Paket nicht zur Verfügung steht, benutzen Sie die
Ports-Sammlung:&prompt.root; cd /usr/ports/deskutils/abacus
&prompt.root; make install cleanKMyMoneyKMyMoneyTabellenkalkulationKMyMoneyBei 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 kmymoney2Sollte 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 cleanZusammenfassungFreeBSD 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:AnwendungPaket-NamePort-NameOperaoperawww/operaFirefoxfirefoxwww/firefoxKOfficekoffice-kde3editors/koffice-kde3AbiWordabiwordeditors/abiwordThe GIMPgimpgraphics/gimpOpenOffice.orgopenofficeeditors/openoffice.org-3&acrobat.reader;acroreadprint/acroread8gvgvprint/gvXpdfxpdfgraphics/xpdfGQviewgqviewgraphics/gqviewGnuCashgnucashfinance/gnucashGnumericgnumericmath/gnumericAbacusabacusdeskutils/abacus
-
+
KMyMoneykmymoney2finance/kmymoney2
-
+
diff --git a/de_DE.ISO8859-1/books/handbook/geom/chapter.sgml b/de_DE.ISO8859-1/books/handbook/geom/chapter.sgml
index 5c92674d83..61f3113a96 100644
--- a/de_DE.ISO8859-1/books/handbook/geom/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/geom/chapter.sgml
@@ -1,938 +1,935 @@
TomRhodesGeschrieben von DanielSeuffertÜbersetzt von JohannKoisGEOM: Modulares Framework zur
PlattentransformationÜbersichtGEOMGEOM Disk FrameworkGEOMDieses Kapitel behandelt den Einsatz von Laufwerken mit
dem GEOM-Framework in &os;. Dies beinhaltet auch die wichtigen
RAID-Überwachungswerkzeuge, welche das
Framework zur Konfiguration nutzen. Dieses Kapitel enthält
keine tiefschürfenden Betrachtungen, wie GEOM I/O nutzt
oder steuert, sein zugrundeliegendes Subsystem oder den
Quelltext von GEOM. Diese Information wird durch die
&man.geom.4;-Manualpage und seine zahlreichen SEE ALSO-Verweise
bereitgestellt. Dieses Kapitel ist auch kein ausführlicher
Führer für
RAID-Konfigurationen. Nur durch GEOM
unterstützte RAID-Klassen werden
erörtert.Nach Lesen dieses Kapitels werden Sie folgendes
wissen:Welche Art von
RAID-Unterstützung durch GEOM
verfügbar ist.Wie man die Basis-Dienstprogramme nutzt, um
verschiedene RAID-Stufen zu
konfigurieren, zu manipulieren und zu warten.Wie man mittels GEOM spiegelt, striped,
verschlüsselt und entfernte Laufwerke verbindet.Wie man an Laufwerken, welche an das GEOM-Framework
angeschlossen sind, Fehler behebt.Bevor Sie dieses Kapitel lesen, sollten Sie:Verstehen, wie &os; Laufwerke behandelt
().Wissen wie man einen neuen &os;-Kernel installiert
und konfiguriert ().Einführung in GEOMGEOM erlaubt den Zugriff und die Kontrolle von Klassen
— Master Boot Records, BSD-Label usw.
— durch die Nutzung von Datenträgern (Providern) oder
den besonderen Dateien in /dev. Verschiedene Software
RAID-Konfigurationen unterstützend, wird
GEOM Ihnen transparenten Zugriff auf das Betriebssystem und
System-Dienstprogramme gewähren.TomRhodesGeschrieben von MurrayStokelyRAID0 - StripingGEOMStripingStriping (stripe = Streifen) ist eine Methode, um
verschiedene Laufwerke in einem einzigen Datenträger
zusammenzufassen. In vielen Fällen wird dies durch die
Nutzung von Hardware-Controllern bewerkstelligt. Das
GEOM-Subsystem unterstützt
Software-RAID0 (welches auch als Striping
bekannt ist).In einem RAID0-System werden die Daten
in einzelne Blöcke aufgeteilt, welche über alle
angeschlossenen Laufwerke in einem Datenfeld (Array) geschrieben
werden. Anstatt darauf warten zu müssen, dass 256K auf
ein einzelnes Laufwerk geschrieben werden, kann ein
RAID0-System gleichzeitig 64K auf jedes von 4
Laufwerken schreiben mit entsprechend besserer I/O-Leistung.
Dieser Durchsatz kann durch die Verwendung mehrerer
Controller noch zusätzlich gesteigert werden.Jedes Laufwerk in einem RAID0-Stripe
muss die gleiche Größe haben, da
I/O-Anforderungen für das Lesen und Schreiben
abwechselnd auf mehrere Laufwerke parallel erfolgen.Disk Striping IllustrationErzeugen eines Stripe von unformatierten
ATA-PlattenLaden Sie das
geom_stripe.ko-Modul:&prompt.root; kldload geom_stripeStellen Sie sicher, dass ein geeigneter Mount-Punkt
existiert. Falls dieser Datenträger eine Root-Partition
werden soll, dann nutzen Sie zeitweise einen anderen
Mount-Punkt, beispielsweise /mnt:&prompt.root; mkdir /mntBestimmen Sie die Gerätenamen derjenigen Platten,
welche gestriped werden sollen, und erzeugen Sie ein neues
Stripe-Gerät. Das folgende Beispiel verwendet zwei
unbenutzte und unpartitionierte
ATA-Platten, die gestriped werden sollen.
Lauten die Gerätenamen /dev/ad2
und /dev/ad3, so verwenden Sie folgenden
Befehl:&prompt.root; gstripe label -v st0 /dev/ad2 /dev/ad3
Metadata value stored on /dev/ad2.
Metadata value stored on /dev/ad3.
Done.Schreiben Sie einen Standard-Label (auch als
Partitions-Tabelle bekannt) auf den neuen Datenträger
und installieren Sie den normalen Bootstrap-Code:&prompt.root; bsdlabel -wB /dev/stripe/st0Dieser Prozess sollte zwei weitere Geräte im
Verzeichnis /dev/stripe (zusätzlich zum
Gerät st0) erzeugt haben. Diese
schliessen st0a und
st0c ein. Nun kann ein Dateisystem
auf dem Gerät st0a mit dem
newfs-Dienstprogramm erzeugt
werden:&prompt.root; newfs -U /dev/stripe/st0aViele Zahlen rauschen nun über Ihren Bildschirm
und nach ein paar Sekunden wird der Prozess abgeschlossen
sein. Der Datenträger wurde erzeugt und kann in den
Verzeichnisbaum eingehängt werden.Um das erzeugte Stripe manuell zu mounten:&prompt.root; mount /dev/stripe/st0a /mntUm das erzeugte Dateisystem automatisch während des
Startvorgangs zu mounten, müssen Sie die
Datenträgerinformation in die Datei
/etc/fstab schreiben. Dazu legen Sie einen
permanenten Mountpunkt namens
stripe an:&prompt.root; mkdir /stripe
&prompt.root; echo "/dev/stripe/st0a /stripe ufs rw 2 2" \>> /etc/fstabDas geom_stripe.ko-Modul muss
ebenfalls automatisch beim Systemstart geladen werden (durch
die Aufnahme der folgenden Zeile in die Datei
/boot/loader.conf):&prompt.root; echo 'geom_stripe_load="YES"' >> /boot/loader.confRAID1 - SpiegelungGEOMDisk MirroringSpiegelung (Mirroring) ist eine Technik, welche von vielen
Firmen und Heimnutzern eingesetzt wird, um Daten ohne
Unterbrechung zu sichern. Wenn ein Spiegel existiert, dann
bedeutet dies einfach nur, dass PlatteB die PlatteA
dupliziert. Oder PlatteC+D duplizieren PlatteA+A. Der
wichtigste Aspekt ist, dass Daten einer Platte oder
Partition dupliziert werden, unabhängig von der
Konfiguration der Platte. Dadurch kann später diese
Information leichter wiederhergestellt, ohne
Zugriffsunterbrechung gesichert oder sogar physisch in einem
Datentresor gelagert werden.Stellen Sie zu Beginn sicher, dass ihr System zwei
Platten mit identischer Größe aufweist. In dieser
Übung gehen wir davon aus, dass es direkt
zugängliche (&man.da.4;) SCSI-Platten
sind.Die primäre Platte spiegelnAngenommen, &os; wurde auf der ersten Platte
da0 installiert, dann sollte
&man.gmirror.8; angewiesen werden, seine primären Daten
auf dieser Platte zu speichern.Bevor Sie den Spiegel aufbauen, sollten Sie die maximale
Protokollierung aktivieren und den Zugang zum Gerät
gestatten. Dazu setzen Sie die &man.sysctl.8;-Option
kern.geom.debugflags auf den folgenden
Wert:&prompt.root; sysctl kern.geom.debugflags=17Nun können Sie den Spiegel aufbauen. Beginnen Sie den
Prozess, indem Sie die Metadaten-Informationen auf das Gerät
der primären Platte speichern. Konkret erzeugen Sie dabei
das Gerät
/dev/mirror/gm, indem Sie
den folgenden Befehl ausführen:Die Spiegelung der Bootplatte kann zu Datenverlust
führen, wenn Sie Daten im letzten Sektor der Platte
gespeichert haben. Dieses Risiko lässt sich minimieren,
wenn Sie den Spiegel unmittelbar nach der Installation von
&os; aufsetzen.&prompt.root; gmirror label -vb round-robin gm0 /dev/da0Ihr System sollte wie folgt antworten:Metadata value stored on /dev/da0.
Done.Initialisieren Sie GEOM. Dadurch wird das Kernelmodul
/boot/kernel/geom_mirror.ko geladen:&prompt.root; gmirror loadWenn dieser Befehl erfolgreich ausgeführt wurde, wird
die Gerätedatei gm0 im
Verzeichnis /dev/mirror
erzeugt.Stellen Sie sicher, dass das Kernelmodul
geom_mirror.ko beim Systemstart automatisch
geladen wird:&prompt.root; echo 'geom_mirror_load="YES"' >> /boot/loader.confBearbeiten Sie die Datei /etc/fstab
und ersetzen Sie alle Verweise auf die alte Gerätedatei
da0 durch die neue Gerätedatei
gm0 des Plattenspiegels. Um die Datei
/etc/fstab bearbeiten zu können,
müssen Sie als Benutzer root am
System angemeldet sein.Sollte &man.vi.1; ihr bevorzugter Texteditor sein,
kouml;nnen Sie diese Änderungen ganz einfach wie
folgt durchführen:&prompt.root; vi /etc/fstabBevor Sie die Datei bearbeiten, sollten Sie ein Backup
anlegen. Haben Sie die Datei mit &man.vi.1; geöffnet,
können Sie durch die Eingabe von
:w /etc/fstab.bak eine Sicherungskopie
der Datei anlegen. Danach ersetzen Sie alle alten Referenzen
auf da0 durch
gm0, indem Sie
:%s/da/mirror\/gm/g eingeben.Die geänderte fstab sollte nun
ähnlich wie im folgenden Beispiel aussehen. Es spielt
dabei keine Rolle, ob Sie SCSI- oder
ATA-Platten verwenden. Das
RAID-Gerät heißt in jedem Fall
gm.# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1
/dev/mirror/gm0s1d /usr ufs rw 0 0
/dev/mirror/gm0s1f /home ufs rw 2 2
#/dev/mirror/gm0s2d /store ufs rw 2 2
/dev/mirror/gm0s1e /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0Führen Sie einen Systemneustart durch:&prompt.root; shutdown -r nowWenn das System gestartet wird, sollten Sie nun nur noch
gm0-Geräte anstatt der bisherigen
da0-Geräte sehen. Nachdem das
System vollständig initialisiert wurde, können Sie
die neue Konfiguration testen, indem Sie den Befehl
mount ausführen:&prompt.root; mount
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/mirror/gm0s1a 1012974 224604 707334 24% /
devfs 1 1 0 100% /dev
/dev/mirror/gm0s1f 45970182 28596 42263972 0% /home
/dev/mirror/gm0s1d 6090094 1348356 4254532 24% /usr
/dev/mirror/gm0s1e 3045006 2241420 559986 80% /var
devfs 1 1 0 100% /var/named/devHier ist alles in Ordnung. Alle Werte sehen aus wie
erwartet. Um die Synchronisierung zu beginnen, integrieren
Sie nun die Platte da1 in den
Spiegel, indem Sie den folgenden Befehl eingeben:&prompt.root; gmirror insert gm0 /dev/da1Während die Platten gespiegelt werden, können
Sie den Fortschritt durch die Eingabe des folgenden Befehls
überprüfen:&prompt.root; gmirror statusNachdem die Plattenspiegelung erfolgreich abgeschlossen
wurde (und alle Daten synchronisiert wurden), sollte Sie
eine Ausgabe ähnlich der folgenden erhalten, wenn Sie
den Befehl erneut ausführen: Name Status Components
mirror/gm0 COMPLETE da0
da1Sollten Probleme aufgetreten oder sollte die
Synchronisierung noch nicht abgeschlossen sein, wäre
der Status DEGRADED anstatt
COMPLETE.FehlerbehebungDas System weigert sich zu startenFalls das System startet und eine Eingabeaufforderung
ähnlich der folgenden erscheint:ffs_mountroot: can't find rootvp
Root mount failed: 6
mountroot>Starten Sie den Rechner neu mit der Power- oder
Resettaste. Wählen Sie im Startmenü Option sechs
(6). Dadurch erscheint eine Eingabeaufforderung für
&man.loader.8;. Laden Sie nun das Kernelmodul
händisch:OK? load geom_mirror
OK? bootFalls dies funktioniert, wurde das Modul (aus welchen
Gründen auch immer) nicht richtig geladen. Prüfen
Sie, ob Ihr Eintrag in der Datei
/boot/loader.conf korrekt ist. Sollte
das Problem weiterhin bestehen, nehmen Sie die Zeileoptions GEOM_MIRRORin die Konfigurationsdatei des Kernels auf und führen
Sie einen Rebuild und eine erneute Installation durch. Dies
sollte das Problem beseitigen.Wiederherstellung des Systems nach einem
PlattenausfallDas Schöne an der Plattenspiegelung ist, dass eine
kaputte Platte ersetzt werden kann, ohne dass Sie dabei
Daten verlieren.Basierend auf der vorhin besprochenen
RAID1-Konfiguration, nehmen wir nun an, dass
die Platte da1 ausgefallen ist und daher
ersetzt werden muss. Um dies zu tun, müssen Sie
feststellen, welche Platte ausgefallen ist und das System
herunterfahren. Nun können Sie die kaputte Platte gegen
eine neue Platte austauschen und das System wieder starten.
Nachdem der Systemstart abgeschlossen ist, verwenden Sie die
folgenden Befehle, um die Plattenspiegelung wieder zu
reaktivieren:&prompt.root; gmirror forget gm0&prompt.root; gmirror insert gm0 /dev/da1Der Befehl gmirror
erlaubt es Ihnen, den Fortschritt bei der Wiederherstellung der
Plattenspiegelung zu beobachten. Das ist alles, was Sie tun
müssen.GEOM Gate NetzwerkgeräteGEOM unterstützt die Verwendung entfernter Geräte
wie Festplatten, CD-ROMs, Dateien usw. mittels Nutzung
der Gate-Dienstprogramme. Dies ist vergleichbar mit
NFS.Zu Beginn muss eine Exportdatei erzeugt werden. Diese
Datei legt fest, wer Zugriff auf die exportierten Ressourcen
hat und welche Zugriffstechniken angeboten werden. Um zum
Beispiel den vierten Slice auf der ersten
SCSI-Platte zu exportieren, ist die
folgende Datei /etc/gg.exports
mehr als ausreichend:192.168.1.0/24 RW /dev/da0s4dSie wird allen Hosts innerhalb des privaten Netzwerkes
den Zugriff auf das Dateisystem auf der Partition
da0s4d erlauben.Um dieses Gerät zu exportieren, stellen Sie bitte
sicher, dass es momentan nicht gemounted ist und
starten Sie den &man.ggated.8; Server-Daemon:&prompt.root; ggatedUm nun mount auf der Client-Maschine
auszuführen, geben Sie bitte die folgenden Befehle
ein:&prompt.root; ggatec create -o rw 192.168.1.1 /dev/da0s4d
ggate0
&prompt.root; mount /dev/ggate0 /mntVon nun an kann auf das Gerät über den Mount-Punkt
/mnt zugegriffen
werden.Es sollte darauf hingewiesen werden, dass dies
scheitern wird, falls das Gerät momentan entweder
auf dem Server oder irgendeiner anderen Maschine
gemountet ist.Wenn das Gerät nicht länger gebraucht wird,
dann kann es mit dem Befehl &man.umount.8;
ausgehängt werden (genauso wie jedes andere Laufwerk
auch).Das Labeln von LaufwerkenGEOMDisk LabelsWährend der Initialisierung des Systems legt der
&os;-Kernel für jedes gefundene Gerät Knotenpunkte
an. Diese Methode für die Überprüfung auf
vorhandene Geräte wirft einige Fragen auf. Was passiert
beispielsweise, wenn ein neues
USB-Laufwerk hinzugefügt wird?
Es ist sehr wahrscheinlich, dass ein
Flash-Speicher-Gerät den Gerätenamen
da0 erhält, während
gleichzeitig das bisherige da0
zu da1 wird. Dies verursacht
Probleme beim Einhängen von Dateisystemen, wenn diese
in der /etc/fstab aufgeführt
sind und schlussendlich mag das auch dazu führen,
dass das System nicht mehr startet.Eine Lösung für dieses Problem ist das
Aneinanderketten der SCSI-Geräte,
damit ein neues Gerät, welches der
SCSI-Karte hinzugefügt wird,
unbenutzte Gerätenummern erhält. Aber was
geschieht, wenn ein USB-Gerät
möglicherweise die primäre
SCSI-Platte ersetzt? Dies kann
passieren, weil USB-Geräte
normalerweise vor der SCSI-Karte
geprüft werden. Eine Lösung ist das
Hinzufügen dieser Geräte, nachdem das System
gestartet ist. Eine andere Lösung könnte sein,
nur ein einzelnes ATA-Laufwerk zu
nutzen und die SCSI-Geräte niemals
in der /etc/fstab aufzuführen.Es gibt allerdings eine bessere Lösung. Durch
Verwendung des glabel-Dienstprogramms
kann ein Administrator oder Benutzer seine Laufwerke mit
Labeln versehen und diese in der /etc/fstab
nutzen. Da glabel seine Label im letzten
Sektor jedes vorhandenen Datenträgers speichert, wird
das Label persistent bleiben (auch über Neustarts hinweg).
Durch Nutzung dieses Labels als Gerät kann das
Dateisystem immer gemountet sein, unabhängig davon,
durch welchen Geräte-Knotenpunkt auf ihn zugegriffen
wird.Der Label muss permanent (dauerhaft) sein.
Man kann das Dienstprogramm glabel
nutzen, um sowohl transiniente als auch permanente Label
zu erzeugen. Aber nur permanente (persistente) Label
bleiben konsistent über Neustarts hinweg. Lesen
Sie die &man.glabel.8;-Manualpage für weitere
Unterschiede zwischen den Label-Typen.Label-Typen und BeispieleEs gibt zwei Arten von Labeln: generische Label und
Dateisystem-Label. Label können dauerhaft (permanent)
oder temporär sein. Permanente Label können mit
&man.tunefs.8; oder &man.newfs.8; in einem speziellen
spezielles Verzeichnis in /dev erzeugt werden, welches
entsprechend der Dateisystem-Art benannt wird.
UFS2-Dateisystem-Label werden zum
Beispiel im Verzeichnis
/dev/ufs
angelegt. Permanente Label können außerdem durch
den Befehl glabel label erzeugt werden.
Diese Label sind dann allerdings nicht dateisystemspezisch
und werden im Unterverzeichnis /dev/label erzeugt.Ein temporäres Label verschwindet mit dem
nächsten Systemstart. Diese Label werden im
Verzeichnis /dev/label
erzeugt und sind ideal für Testzwecke. Ein temporäres
Label kann durch den Befehl glabel create
erzeugt werden. Weitere Informationen finden sich in der
Manualpage &man.glabel.8;.Um ein permanentes Label auf einem
UFS2-Dateisystem ohne
Löschung von Daten zu erzeugen, kann man folgenden
Befehl verwenden:&prompt.root; tunefs -L home/dev/da3Wenn das Dateisystem voll ist, kann dies zu
Datenkorruption führen; aber egal wie, falls das
Dateisystem voll ist, sollte das Hauptziel die
Entfernung ungenützter Dateien und nicht das
Hinzufügen von Labeln sein.Ein Label sollte nun in
/dev/ufs vorhanden
sein, der zu /etc/fstab
hinzugefügt wird:/dev/ufs/home /home ufs rw 2 2Das Dateisystem darf nicht gemountet sein beim
Versuch, tunefs auszuführen.Nun kann das Dateisystem wie üblich gemountet
werden:&prompt.root; mount /homeVon nun an kann der Geräte-Knotenpunkt sich ohne
negative Effekte auf das System ändern, solange das
Kernelmodul geom_label.ko beim
Systemstart mittels /boot/loader.conf
geladen wird oder die
GEOM_LABEL-Kernel-Option aktiv ist.Dateisysteme können auch mit einem Standard-Label
erzeugt werden (mittels des Flags in
newfs). Lesen Sie bitte die Manualpage
von &man.newfs.8; für weitere Informationen.Der folgende Befehl kann genutzt werden, um das Label
zu beseitigen:&prompt.root; glabel destroy homeDas folgende Beispiel zeigt Ihnen, wie Sie Label für
die Partitionen einer Bootplatte erzeugen.Die Partitionen einer Bootplatte labelnDurch das Erstellen von permanenten Labeln für die
Partitionen einer Bootplatte sollte das System selbst dann noch
normal starten können, wenn Sie die Platte an einen
anderen Controller anschließen oder in ein anderes
System installieren. In diesem Beispiel nehmen wir an, dass
nur eine einzige ATA-Platte verwendet wird,
die Ihr System derzeit als ad0
erkennt. Weiters nehmen wir an, dass Sie das
Standard-Partionierungsschema von &os; vewendet haben und Ihre
Platte daher die Dateisysteme
/,
/var,
/usr sowie
/tmp aufweist.
Zusätzlich wurde eine Swap-Partition angelegt.Starten Sie das System neu. Am &man.loader.8;-Prompt
drücken Sie die Taste 4, um in den
Single-User-Modus zu gelangen. Dort führen Sie die
folgenden Befehle aus:&prompt.root; glabel label rootfs /dev/ad0s1a
GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs
&prompt.root; glabel label var /dev/ad0s1d
GEOM_LABEL: Label for provider /dev/ad0s1d is label/var
&prompt.root; glabel label usr /dev/ad0s1f
GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr
&prompt.root; glabel label tmp /dev/ad0s1e
GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp
&prompt.root; glabel label swap /dev/ad0s1b
GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap
&prompt.root; exitDas System startet daraufhin in den Multi-User-Modus.
Nachdem der Startvorgang abgeschlossen ist, editieren Sie die
Datei /etc/fstab und ersetzen die
konventionellen Gerätedateien durch die entsprechenden
Label. Ihre modifizierte /etc/fstab
sollte nun ähnlich der folgenden Ausgabe aussehen:# Device Mountpoint FStype Options Dump Pass#
/dev/label/swap none swap sw 0 0
/dev/label/rootfs / ufs rw 1 1
/dev/label/tmp /tmp ufs rw 2 2
/dev/label/usr /usr ufs rw 2 2
/dev/label/var /var ufs rw 2 2Starten Sie Ihr System neu. Traten keine Probleme auf,
wird das System normal hochfahren und Sie erhalten die folgende
Ausgabe, wenn Sie den Befehl mount
ausführen:&prompt.root; mount
/dev/label/rootfs on / (ufs, local)
devfs on /dev (devfs, local)
/dev/label/tmp on /tmp (ufs, local, soft-updates)
/dev/label/usr on /usr (ufs, local, soft-updates)
/dev/label/var on /var (ufs, local, soft-updates)Beginnend mit &os; 7.2, unterstützt
&man.glabel.8; einen neuen Labeltyp für
UFS-Dateisysteme. Dieser basiert auf der
eindeutigen Dateisystem-ID ufsid.
Derartige Label finden sich im Verzeichnis
/dev/ufsid und werden
während des Systemstarts automatisch erzeugt. Es ist
möglich, diese ufsid-Label zum
automatischen Einhängen von Partitionen in der Datei
/etc/fstab einzusetzen. Verwenden Sie
den Befehl glabel status, um eine Liste
aller Dateisysteme und ihrer ufsid-Label
zu erhalten:&prompt.user; glabel status
Name Status Components
ufsid/486b6fc38d330916 N/A ad4s1d
ufsid/486b6fc16926168e N/A ad4s1fIn diesem Beispiel repräsentiert
ad4s1d das
/var-Dateisystem,
während ad4s1f dem
/usr-Dateisystem
entspricht. Wenn Sie die angegebenen
ufsid-Werte verwenden, können
diese Dateisysteme durch die folgenden Einträge in
der Datei /etc/fstab gemountet
werden:/dev/ufsid/486b6fc38d330916 /var ufs rw 2 2
/dev/ufsid/486b6fc16926168e /usr ufs rw 2 2Jede Partition, die ein ufsid-Label
aufweist, kann auf diese Art gemountet werden. Dies hat
den Vorteil, dass Sie keine permanenten Label mehr anlegen
müssen, wobei sich die Platten nach wie vor über
geräteunabhängige Namen ansprechen und mounten
lassen.UFS Journaling in GEOMGEOMJournalingMit &os; 7.0 wurde eine lang erwartete Funktion,
- das UFS-Journaling, implementiert. Diese
- Funktion wird über das
- GEOM-Subsystem realisiert und kann
+ das Journaling, implementiert. Diese Funktion wird über
+ das GEOM-Subsystem realisiert und kann
über das Werkzeug &man.gjournal.8; eingerichtet
werden.Was ist Journaling? Bei Journaling wird ein Protokoll
über alle Dateisystemtransaktionen angelegt, inklusive
aller Veränderungen, aus denen ein kompletter
Schreibvorgang besteht, bevor diese Änderungen (Metadaten
sowie tatsächliche Schreibvorgänge) physikalisch auf
der Festplatte ausgeführt werden. Dieses Protokoll kann
später erneut aufgerufen werden, um diese Vorgänge
zu wiederholen (beispielsweise um Systeminkonsistenzen zu
vermeiden).Diese Technik bietet eine weitere Möglichkeit,
sich vor Datenverlust und Dateisystem-Inkonsistenzen zu
schützen. Im Gegensatz zu Soft Updates (die
Metadaten-Aktualisierungen verfolgen und erzwingen) und
Snapshots (die ein Image eines Dateisystems darstellen) wird
bei Journaling ein tatsächliches Protokoll in einem
speziell dafür bereitgestellten Bereich der Festplatte
(oder manchmal sogar auf einer separaten Platte)
gespeichert.Im Gegensatz zu anderen Journaling-Dateisystemen arbeitet
die gjournal-Methode blockbasiert und wurde
nicht als Teil des Dateisystems implementiert, sondern als
GEOM-Erweiterung.Um die gjournal-Unterstützung zu
aktivieren, muss der &os;-Kernel die folgende Option enthalten
- (was auf 7.X-Systemen bereits in der Voreinstellung der Fall
+ (was seit &os; 7.0 bereits in der Voreinstellung der Fall
ist):options UFS_GJOURNALUm ein Volume mit Journalunterstützung beim Systemstart
automatisch zu mounten, muss das Kernelmodul
geom_journal.ko ebenfalls automatisch geladen
werden (durch einen entsprechenden Eintrag in der Datei
/boot/loader.conf):geom_journal_load="YES"Alternativ können Sie auch einen angepassten Kernel
bauen, der diese Funktionalität enthält, indem Sie die
folgende Zeile in Ihrer Kernelkonfigurationsdatei
aufnehmen:options GEOM_JOURNALDas Anlegen eines neuen Journals auf einem freien Dateisystem
erfolgt durch die folgenden Schritte (im Folgenden wird
angenommen, dass es sich bei da4 um
eine neue SCSI-Platte handelt):
- &prompt.root; gjournal label /dev/da4
-&prompt.root; gjournal load
+ &prompt.root; gjournal load
+&prompt.root; gjournal label /dev/da4Danach sollten die Gerätedateien
/dev/da4 sowie
/dev/da4.journal vorhanden sein. Nun
können Sie auf diesem Gerät ein Dateisystem
anlegen:&prompt.root; newfs -O 2 -J /dev/da4.journal
- Dieser Befehl erzeugt ein
- UFS2-Dateisystem, für das Journaling
- aktiviert wurde.
+ Dieser Befehl erzeugt ein UFS2-Dateisystem
+ auf dem Gerät, für das im letzten Schritt das
+ Journaling aktiviert wurde.Danach hängen Sie das neue Dateisystem mit
mount in Ihren Verzeichnisbaum ein:&prompt.root; mount /dev/da4.journal /mntFalls auf Ihrem System mehrere Slices angelegt sind
(beispielsweise ad4s1 sowie
ad4s2), wird
gjournal für jedes Slice ein
Journal anlegen (also ad4s1.journal
- sowie ad4s2.journal). Wird der
- Befehl zweimal ausgeführt, werden auch für jedes
- Slice zwei Journale angelegt.
+ sowie ad4s2.journal).
- Unter bestimmten Umständen ist es sinnvoll, das Journal
- auf eine externe Platte auszulagern. In einem solchen Fall
+ Um die Leistung zu optimieren, kann das Journal auf eine
+ externe Platte ausgelagert werden. In einem solchen Fall
geben Sie die Gerätedatei der Platte nach dem Gerät
an, für das Sie Journaling aktivieren wollen.
Theoretisch ist es auch möglich, Journaling auf bereits
existierenden Dateisystemen durch das Werkzeug
tunefs zu aktivieren. Machen Sie aber
in jedem Fall ein Backup Ihrer Daten, bevor Sie versuchen,
ein existierendes Dateisystem zu ändern.
gjournal wird zwar den Vorgang abbrechen,
wenn es das Journal nicht erzeugen kann, allerdings schützt
Sie dies nicht vor Datenverlust durch einen fehlerhaften Einsatz
von tunefs.Es ist möglich, Journale auch für die Bootplatte
eines &os;-System zu verwenden. Lesen Sie bitte den Artikel
Implementing UFS Journaling on a Desktop PC, wenn Sie
an einer derartigen Konfiguration interessiert sind.
diff --git a/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml b/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml
index d71617e67c..a29e212bab 100644
--- a/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/mirrors/chapter.sgml
@@ -1,3338 +1,3348 @@
Bezugsquellen für &os;CD-ROM und DVD Verleger&os;-Pakete&os;-Pakete (&os;-CDs, zusätzliche Software und
gedruckte Dokumentation) erhalten Sie von mehreren
Händlern:CompUSA
WWW: Frys Electronics
WWW: &os;-CDs und -DVDsDie &os;-CDs und -DVDs werden von vielen Online-Händlern
angeboten:&os; Mall, Inc.700 Harvest Park Ste FBrentwood, CA94513USA
Telefon: +1 925 240-6652
Fax: +1 925 674-0821
E-Mail: info@freebsdmall.com
WWW: Dr. Hinner EDVSt. Augustinus-Str. 10D-81825MünchenGermany
Telefon: (089) 428 419
WWW: Ikarios22-24 rue Voltaire92000NanterreFrance
WWW: JMC SoftwareIreland
Telefon: 353 1 6291282
WWW: The Linux EmporiumHilliard House, Lester WayWallingfordOX10 9TAUnited Kingdom
Telefon: +44 1491 837010
Fax: +44 1491 837016
WWW: Linux+ DVD MagazineLewartowskiego 6Warsaw00-190Poland
Telefon: +48 22 860 18 18
E-Mail: editors@lpmagazine.org
WWW: Linux System Labs Australia21 Ray DriveBalwyn NorthVIC - 3104Australia
Telefon: +61 3 9857 5918
Fax: +61 3 9857 8974
WWW: LinuxCenter.RuGalernaya Street, 55Saint-Petersburg190000Russia
Telefon: +7-812-3125208
E-Mail: info@linuxcenter.ru
WWW: LieferantenWenn Sie &os;-CD-ROM-Produkte weiterverkaufen möchten,
kontaktieren Sie einen der folgenden Lieferanten:Cylogistics809B Cuesta Dr., #2149Mountain View, CA94040USA
Telefon: +1 650 694-4949
Fax: +1 650 694-4953
E-Mail: sales@cylogistics.com
WWW: Ingram Micro1600 E. St. Andrew PlaceSanta Ana, CA92705-4926USA
Telefon: 1 (800) 456-8000
WWW: Kudzu, LLC7375 Washington Ave. S.Edina, MN55439USA
Telefon: +1 952 947-0822
Fax: +1 952 947-0876
E-Mail: sales@kudzuenterprises.comLinuxCenter.KzUst-KamenogorskKazakhstan
Telefon: +7-705-501-6001
E-Mail: info@linuxcenter.kz
WWW: LinuxCenter.RuGalernaya Street, 55Saint-Petersburg190000Russia
Telefon: +7-812-3125208
E-Mail: info@linuxcenter.ru
WWW: Navarre Corp7400 49th Ave SouthNew Hope, MN55428USA
Telefon: +1 763 535-8333
Fax: +1 763 535-0341
WWW: FTP-ServerDie offiziellen Quellen von &os; sind mit anonymous FTP
über ein weltweites Netz von FTP-Spiegeln erhältlich.
Obwohl
über eine gute Anbindung verfügt, sollten Sie einen
Spiegel in Ihrer Nähe verwenden (insbesondere, wenn Sie
selber einen Spiegel einrichten wollen).Die Datenbank
der &os;-Spiegel ist aktueller als die folgende Liste, da
sie im Gegensatz zu einer statischen Liste die Informationen aus
dem DNS erhält.Sie können &os; auch über anonymous FTP von den
folgenden Spiegeln beziehen. Wenn Sie &os; über anonymous
FTP beziehen wollen, wählen Sie bitte einen Spiegel in Ihrer
Nähe. Die unter Haupt-Spiegel aufgeführten
Spiegel stellen normalerweise das komplette &os;-Archiv
(alle momentan erhältlichen Versionen für jede
unterstützte Architektur) zur Verfügung. Wahrscheinlich
geht es aber schneller, wenn Sie einen Spiegel in Ihrer
Nähe benutzen. Die Länder-Spiegel stellen die neusten
Versionen für die beliebtesten Architekturen bereit,
sie stellen aber unter Umständen nicht das komplette
&os;-Archiv bereit. Auf alle Server kann mit
anonymous FTP zugegriffen werden, einige Server bieten
auch andere Zugriffsmethoden an. Die zur Verfügung
stehenden Zugriffsmethoden sind bei jedem Server in Klammern
angegeben.
&chap.mirrors.ftp.inc;
BitTorrent
-
+
BitTorrent
-
+
Die ISO-Images für die Release-CDs sind via BitTorrent
abrufbar. Eine Sammlung von Torrent-Dateien zum Herunterladen der
- Images ist unter http://torrents.freebsd.org:8080
verfügbar.
-
+
Die BitTorrent Client-Software ist als Port net-p2p/py-bittorrent oder als vorkompiliertes
Paket erhältlich.
-
+
Nach dem Herunterladen der ISO-Images mit BitTorrent können Sie
- diese auf CD oder DVD brennen, so wie im burncd- beschrieben.Anonymous CVSEinführungCVSanonymousAnonymous CVS (oder anoncvs) dient zum
Synchronisieren mit entfernten Repositories und steht mit
den CVS Werkzeugen, die im &os;
Basissystem enthalten sind, zur Verfügung. Benutzer von
&os; können damit unter anderem lesende Operationen
auf den Anoncvs Servern des
&os; Projects durchführen,
ohne über besondere Berechtigungen zu verfügen. Um es
zu benutzen, setzen Sie einfach die CVSROOT
Umgebungsvariable auf einen Anoncvs Server
und geben beim Login mit cvs login das
Passwort anoncvs an. Danach können
Sie mit &man.cvs.1; wie auf jedes lokale Repository (allerdings nur
lesend) zugreifen.cvs login speichert Passwörter
zur Authentifizierung an einem CVS Server in der Datei
.cvspass in Ihrem
HOME-Verzeichnis. Wenn diese Datei beim ersten
Benutzen von cvs login nicht existiert,
erhalten Sie vielleicht eine Fehlermeldung. In diesem Fall
legen Sie einfach eine leere .cvspass
Datei an und melden sich erneut an.CVSup und
Anoncvs bieten dieselbe
Funktionalität, die folgenden Kriterien helfen Ihnen zu
entscheiden, welche Methode Sie benutzen sollen.
CVSup
geht wesentlich effizienter mit Netzwerk-Ressourcen um und ist
auch technisch ausgereifter. Allerdings müssen Sie zuerst
einen speziellen Client installieren und konfigurieren, bevor Sie
CVSup benutzen können. Weiterhin
können Sie mit CVSup nur relativ
große Teile der Quellen, die Sammlungen
genannt werden, synchronisieren.Im Gegensatz dazu können Sie mit
Anoncvs jede beliebige Datei oder
indem Sie einfach den CVS Namen des
Moduls angeben, ein beliebiges Programm, wie ls
oder grep, bearbeiten. Natürlich
können Sie mit Anoncvs nur lesend
auf ein CVS Repository zugreifen.
Wenn Sie lokal mit dem &os;-Repository entwickeln wollen, dann
ist CVSup die einzige Wahl.Benutzen von Anonymous CVSSetzen Sie einfach die CVSROOT
Umgebungsvariable, um &man.cvs.1; das
CVS Repository eines &os;
Anoncvs-Servers bekannt zu geben.
Zurzeit stehen folgende Server zur Verfügung:Frankreich:
:pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs
(Das Passwort für pserver ist
- anoncvs, ssh-Zugriffe
+ anoncvs, SSH-Zugriffe
verwenden kein Passwort.)
-
+
Taiwan:
:pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
(pserver: Benutzen Sie cvs login
- und ein beliebiges Passwort. ssh: kein Passwort.)
+ und ein beliebiges Passwort. SSH-Zugriffe erfordern
+ kein Passwort.)
SSH2 HostKey: 1024 02:ed:1b:17:d6:97:2b:58:5e:5c:e2:da:3b:89:88:26 /etc/ssh/ssh_host_rsa_key.pub
SSH2 HostKey: 1024 e8:3b:29:7b:ca:9f:ac:e9:45:cb:c8:17:ae:9b:eb:55 /etc/ssh/ssh_host_dsa_key.pub
-
- USA:
- freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs
- (nur ssh ohne Passwort).
-
- SSH HostKey: 1024 a1:e7:46:de:fb:56:ef:05:bc:73:aa:91:09:da:f7:f4 root@sanmateo.ecn.purdue.edu
-SSH2 HostKey: 1024 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65 ssh_host_dsa_key.pub
-
-
USA:
anoncvs@anoncvs1.FreeBSD.org:/home/ncvs
- (nur ssh ohne Passwort).
+ (nur SSH2 ohne Passwort).
SSH2 HostKey: 2048 53:1f:15:a3:72:5c:43:f6:44:0e:6a:e9:bb:f8:01:62 /etc/ssh/ssh_host_dsa_key.pubMit CVS können Sie praktisch
jede Version von &os;, die schon einmal existiert hat (oder in
manchen Fällen existieren wird) auschecken. Sie sollten
daher damit vertraut sein, wie Sie mit Tags unter &man.cvs.1;
arbeiten (die Option). Zudem müssen Sie
die Namen der Tags im &os;-Repository kennen.Es gibt zwei verschiedene TagsTags sind
symbolische Namen, die im Repository vergeben werden.
: Tags, die Revisionen bezeichnen und Tags, die
Zweige bezeichnen. Die Ersten sind statisch und fest an eine
Revision gebunden. Ein Tag, das einen Zweig bezeichnet,
bezieht sich dagegen zu einem gegebenen Zeitpunkt immer auf die
aktuellste Revision. Da ein Tag eines Zweiges nicht an eine
bestimmte Revision gebunden ist, kann sich dessen Bedeutung von
heute auf morgen ändern.In finden Sie eine Liste der
gültigen Tags. Beachten Sie bitte, dass keines der
Tags auf die Ports-Sammlung anwendbar ist, da diese nicht
über Zweige verfügt.Wenn Sie ein Tag eines Zweiges verwenden, erhalten Sie die
aktuellsten Dateien dieses Entwicklungszweiges. Wenn Sie eine
frühere Revision erhalten möchten, können Sie zum
Beispiel einen Zeitpunkt mit der Option
angeben. Weitere Informationen dazu entnehmen Sie bitte
&man.cvs.1;.BeispieleIm Folgenden finden Sie einige Beispiele für den Umgang
mit Anonymous CVS. Sie sollten sich
aber die Manualpage von &man.cvs.1; sorgfältig durchlesen,
bevor Sie anfangen.&man.ls.1; von -CURRENT auschecken&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs loginWenn Sie dazu aufgefordert werden, benutzen Sie ein beliebigesPasswort.
&prompt.user; cvs co lsDen src/-Baum über
SSH auschecken
- &prompt.user; cvs -d freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs co src
-The authenticity of host 'anoncvs.freebsd.org (128.46.156.46)' can't be establiestablished.
-DSA key fingerprint is 52:02:38:1a:2f:a8:71:d3:f5:83:93:8d:aa:00:6f:65.
+ &prompt.user; cvs -d anoncvs@anoncvs1.FreeBSD.org:/home/ncvs co src
+The authenticity of host 'anoncvs1.freebsd.org (216.87.78.137)' can't be established.
+DSA key fingerprint is 53:1f:15:a3:72:5c:43:f6:44:0e:6a:e9:bb:f8:01:62.
Are you sure you want to continue connecting (yes/no)? yes
-Warning: Permanently added 'anoncvs.freebsd.org' (DSA) to the list of known hosts.
+Warning: Permanently added 'anoncvs1.freebsd.org' (DSA) to the list of known hosts.&man.ls.1; aus dem 6-STABLE-Zweig auschecken&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs loginWenn Sie dazu aufgefordert werden, benutzen Sie ein beliebigesPasswort.
&prompt.user; cvs co -rRELENG_6 lsÄnderungen in &man.ls.1; zwischen 5.3 RELEASE und
5.4 RELEASE (als unified diff)&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs loginWenn Sie dazu aufgefordert werden, benutzen Sie ein beliebigesPasswort.
&prompt.user; cvs rdiff -u -rRELENG_5_3_0_RELEASE -rRELENG_5_4_0_RELEASE lsGültige Modulnamen herausfinden&prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
&prompt.user; cvs loginWenn Sie dazu aufgefordert werden, benutzen Sie ein beliebigesPasswort.
&prompt.user; cvs co modules
&prompt.user; more modules/modulesWeitere RessourcenDie folgenden Ressourcen sind nützlich, um den Umgang
mit CVS zu lernen:CVS Tutorial von der California Polytechnic State
University.CVS Home,
die Homepage des CVS-Projekts.CVSweb das
Web Interface zu CVS des &os;
Projekts.CTMCTMMit CTM
Abkürzung für CVS Through eMail
können Sie einen
entfernten Verzeichnisbaum mit einem zentralen Baum
synchronisieren. Es wurde extra zum Synchronisieren der &os;
Quellen entwickelt, obwohl es mit der Zeit vielleicht auch andere
Anwendungen geben wird. Zurzeit existiert leider so gut wie keine
Dokumentation zum Erstellen der Deltas. Wenn Sie Hilfe
benötigen oder CTM für
andere Zwecke einsetzen wollen, wenden Sie sich bitte an
die Mailingliste &a.ctm-users.name;.Warum soll ich CTM benutzen?Mit CTM erhalten Sie eine lokale
Kopie des &os;-Quellbaums, den es in mehreren
Varianten gibt. Sie können das ganze
Repository oder nur einen Zweig spiegeln. Wenn Sie ein aktiver
&os;-Entwickler mit einer schlechten oder gar keiner TCP/IP
Verbindung sind, oder die Änderungen einfach automatisch
zugesandt bekommen wollen, dann ist CTM
das Richtige für Sie. Für die Zweige mit der
meisten Aktivität müssen Sie sich täglich bis zu drei
Deltas beschaffen, Sie sollten allerdings erwägen, die
Deltas automatisch über E-Mail zu beziehen. Die
Größe der Updates wird so klein wie möglich
gehalten. Normalerweise sind sie kleiner als 5 kB, manchmal
sind sie 10-50 kB groß (etwa jedes 10. Update) und ab
und an werden Sie auch einmal ein Update mit 100 kB oder
mehr erhalten.Sie sollten sich über die Vorbehalte gegen die
Verwendung der Quellen anstelle eines offiziellen Releases
bewusst sein. Das trifft besonders auf &os.current; zu, lesen
Sie dazu bitte den Abschnitt
&os.current;.Was brauche ich, um CTM zu
benutzen?Zwei Sachen: Das CTM Programm und
die initialen Deltas, von denen aus Sie auf die
aktuellen Stände kommen.CTM ist schon seit der
Version 2.0 Teil des &os;-Basissystems. Sie finden es in
/usr/src/usr.sbin/ctm, wenn Sie eine Kopie
der Quellen besitzen.Die Deltas, die CTM verarbeitet,
können Sie über FTP oder E-Mail beziehen. Wenn Sie
über einen FTP Zugang zum Internet verfügen, erhalten
Sie die Deltas unter der folgenden URL:Die Deltas werden auch von
CTM Spiegeln
bereitgehalten.Wechseln Sie in das passende Verzeichnisse zum Beispiel
src-cur für &os.current; und laden Sie
sich von dort die Deltas herunter.Sie können die Deltas auch über E-Mail
beziehen.Abonnieren Sie dazu eine der
CTM-Verteilerlisten.
Über &a.ctm-cvs-cur.name; erhalten Sie den kompletten
CVS-Baum, über
&a.ctm-src-cur.name; erhalten Sie &os.current; und über
&a.ctm-src-4.name; erhalten Sie den &os;
4.X-Zweig. Wenn Sie nicht wissen, wie Sie eine der
Mailinglisten abonnieren, folgen Sie einem der Verweise
von oben oder besuchen Sie die Seite &a.mailman.lists.link;.
Weitere Informationen erhalten Sie, wenn Sie dort
auf die gewünschte Liste klicken.Benutzen Sie ctm_rmail, um die
CTM Updates, die Sie per
E-Mail empfangen, auszupacken und anzuwenden. Wenn Sie diesen
Prozess automatisiert ablaufen lassen möchten,
können Sie dazu einen Eintrag in
/etc/aliases verwenden. Genauere
Informationen finden Sie in der Manualpage von
ctm_rmail.Sie sollten die Mailingliste &a.ctm-announce.name;
abonnieren, egal wie Sie die
CTM-Deltas erhalten.
Ankündigungen, die den Betrieb des
CTM-Systems betreffen, werden
nur auf dieser Liste bekannt gegeben. Klicken Sie
auf den Namen der Liste oder besuchen Sie die Seite
&a.mailman.lists.link;, um diese Liste zu abonnieren.Initialisieren von CTMBevor Sie die CTM Deltas benutzen
können, brauchen Sie einen Startpunkt, auf den die
nachfolgenden Deltas angewendet werden.Sie können natürlich mit einem leeren Verzeichnis
beginnen. In diesem Fall benötigen Sie ein
XEmpty-Delta, mit dem Sie den
CTM-Verzeichnisbaum initialisieren.
Wenn Sie Glück haben, finden Sie ein
XEmpty-Delta, mit dem sie beginnen können,
auf einer der CDs Ihrer Distribution.Da die Verzeichnisbäume mehrere Megabyte groß
sind, sollten Sie nach Möglichkeit etwas schon vorhandenes
benutzen. Wenn Sie eine -RELEASE CD besitzen, können Sie
die Quellen von dieser CD benutzen. Sie ersparen sich damit das
Übertragen großer Datenmengen.Die Deltas, mit denen Sie beginnen können, enthalten ein
X in ihrem Namen, wie in
src-cur.3210XEmpty.gz. Hinter dem
X wird der Startpunkt der Deltas
angegeben, in diesem Fall steht Empty
für ein leeres Verzeichnis. Nach etwa 100 Deltas wird ein
neues XEmpty-Delta erstellt.
Mit ungefähr 75 Megabyte komprimierter Daten sind diese
XEmpty-Deltas übrigens sehr
groß.Nachdem Sie Ihren Startpunkt festgelegt haben, benötigen
Sie alle Deltas mit einer höheren Nummer.Benutzen von CTMUm ein Delta einzuspielen, benutzen Sie das folgende
Kommando:&prompt.root; cd /Pfad/zu/den/Quellen
&prompt.root; ctm -v -v /Pfad/zu/den/Deltas/src-xxx.*CTM kann mit Deltas arbeiten, die
mit gzip komprimiert wurden. Sie brauchen die
Deltas vorher nicht mit gunzip zu
dekomprimieren und sparen damit Plattenplatz.Ihr Quellbaum wird erst dann verändert, wenn
CTM die Deltas sauber verarbeiten
kann. Die Integrität der Deltas und ihre Anwendbarkeit auf
den Quellbaum lassen sich durch die Angabe des Schalters
-c überprüfen,
CTM ändert in diesem Fall Ihren
Quellbaum nicht.CTM verfügt über weitere
Kommandozeilenoptionen, Informationen dazu finden Sie in der
Manualpage oder dem Quellcode.Das war schon alles. Um Ihre Quellen aktuell zu halten,
verwenden Sie CTM jedes Mal, wenn Sie
neue Deltas bekommen.Löschen Sie die Deltas nicht, wenn Sie diese nur schwer
wieder beschaffen können. Behalten Sie sie für den
Fall, das etwas passiert. Auch wenn Sie nur Disketten besitzen,
sollten Sie erwägen, die Deltas mit
fdwrite zu sichern.Umgang mit lokalen ÄnderungenEntwickler wollen mit den Dateien im Quellbaum
experimentieren und diese verändern. In beschränkter
Weise werden lokale Änderungen von
CTM unterstützt. Wenn
CTM die Datei foo
bearbeiten will, überprüft es zuerst ob die Datei
foo.ctm existiert. Wenn diese Datei
existiert, werden Änderungen in ihr anstatt in
foo vorgenommen.Mit diesem Verfahren ist eine leichte Handhabung lokaler
Änderungen möglich. Kopieren Sie die Dateien, die Sie
ändern möchten, in Dateien, die das Suffix
.ctm tragen. Sie können dann
ungestört mit dem Quellcode arbeiten, während
CTM die
.ctm Dateien aktualisiert.Weitere CTM-OptionenWas wird aktualisiert?Eine Liste der Änderungen, die
CTM an Ihrem Quellbaum vornehmen
wird, erhalten Sie, wenn Sie die Option
angeben.Das ist nützlich, wenn Sie Logs über die
Änderungen führen wollen, geänderte Dateien vor-
oder nachbearbeiten wollen, oder einfach ein bisschen
paranoid sind.Sicherungen vor einer Aktualisierung erstellenSie wollen vielleicht die Dateien, die durch eine
CTM Aktualisierung verändert
werden, sichern.Mit weisen Sie
CTM an, alle Dateien, die durch ein
CTM Delta verändert
würden, nach backup-file zu
sichern.Dateien ausschließenManchmal wollen Sie nur bestimmte Teile aktualisieren
oder nur bestimmte Dateien aus einer Folge
von Deltas extrahieren.Sie können die Liste der Dateien, mit denen
CTM arbeitet, einschränken,
indem Sie reguläre Ausdrücke mit den Optionen
und angeben.Wenn Sie eine aktuelle Kopie von
lib/libc/Makefile aus den gesicherten
CTM Deltas erhalten wollen, setzen
Sie das folgende Kommando ab:&prompt.root; cd /wo/Sie/es/auspacken/wollen/
&prompt.root; ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.*Die Optionen und
werden in der Reihenfolge angewandt, in der sie auf der
Kommandozeile angegeben wurden. Eine Datei wird nur dann von
CTM verarbeitet, wenn dies nach der
Anwendung der Optionen und
noch erlaubt ist.Pläne für CTMMehrere:Hinzufügen eines Authentifizierungsmechanismus,
damit gefälschte CTM-Deltas
erkannt werden können.Aufräumen der
CTM-Optionen, die mit der Zeit
unübersichtlich und irreführend wurden.VerschiedenesEs gibt Deltas für die Ports-Sammlung, die
aber nicht intensiv genutzt werden.CTM-SpiegelDie CTM-Deltas können Sie mit anonymous FTP von den folgenden
Spiegeln beziehen. Versuchen Sie bitte einen Spiegel in Ihrer
Nähe zu benutzen.Bei Problemen wenden Sie sich bitte an die
Mailingliste &a.ctm-users.name;.Kalifornien, Bay Area, Offizieller ServerSüdafrika, Backup-Server für alte DeltasTaiwan/R.O.C.Wenn die Liste keinen Spiegel in Ihrer Nähe enthält
oder Sie Probleme mit dem ausgewählten Spiegel haben, versuchen
Sie einen Spiegel mit einer Suchmaschine, wie
alltheweb, zu
finden.Benutzen von CVSupEinführungCVSup ist eine Anwendung, die
Verzeichnisbäume von einem entfernten
CVS-Server bereitstellt und
aktualisiert. Die Quellen von &os; werden in einem
CVS-Repository auf einer
Entwicklungsmaschine in Kalifornien gepflegt. Mit
CVSup können sich &os;-Benutzer
den eigenen Quellbaum auf aktuellem Stand halten.Zum Aktualisieren benutzt CVSup die
Pull-Methode, bei der die Aktualisierungen vom Client angefragt
werden. Der Server wartet dabei passiv auf Anfragen von Clients,
das heißt er verschickt nicht unaufgefordert
Aktualisierungen. Somit gehen alle Anfragen vom Client aus und die
Benutzer müssen CVSup entweder
manuell starten oder einen cron Job einrichten, um
regelmäßig Aktualisierungen zu erhalten.CVSup in genau dieser Schreibweise
bezeichnet die Anwendung, die aus dem Client cvsup
und dem Server cvsupd besteht.
cvsup läuft auf den Maschinen der Benutzer,
cvsupd läuft auf jedem der
&os;-Spiegel.Wenn Sie die &os;-Dokumentation und die Mailinglisten lesen,
werden Sie oft auf Sup, dem
Vorgänger von CVSup stoßen.
CVSup wird in gleicher Weise wie
Sup benutzt und verfügt sogar
über Konfigurationsdateien, die kompatibel zu denen von
Sup sind. Da
CVSup schneller und flexibler als
Sup ist, wird
Sup vom &os; Project nicht mehr
benutzt.Mit csup gibt es in inzwischen
auch eine in C geschriebene Neuimplementierung von
CVSup. Der größte
Vorteil dieser neuen Version ist neben einer höheren
Geschwindigkeit der, dass dieses Programm nicht von der
Sprache Modula-3 abhängig ist und Sie daher dieses
Paket nicht mitinstallieren müssen. Ab &os; 6.2
ist csup bereits im Basissystem
enthalten und kann sofort verwendet werden. Verwenden Sie
hingegen eine ältere &os;-Version, können Sie
&man.csup.1; über den Port net/csup installieren. Alternativ
können Sie zur Installation auch ein vorkompiliertes
Paket (Package) verwenden.
Wollen Sie künftig csup
einsetzen, überspringen Sie in den folgenden
Ausführungen einfach den Abschnitt zur Installation von
CVSup und ersetzen alle Vorkommen
von CVSup durch
csup.Installation von CVSupCVSup können Sie leicht
installieren, wenn Sie das vorkompilierte Paket
net/cvsup aus der
Ports-Sammlung benutzen.
Alternativ können Sie
net/cvsup auch ausgehend von
den Quellen bauen, doch seien Sie gewarnt:
net/cvsup hängt vom
Modula-3 System ab, das viel Zeit und
Platz zum Herunterladen und Bauen braucht.Wenn Sie CVSup auf einer
Maschine ohne &xfree86;
oder &xorg;,
beispielsweise einem Server, benutzen, stellen Sie sicher,
dass Sie den Port ohne das
CVSup-GUI,
net/cvsup-without-gui
verwenden.Wollen Sie csup unter
&os; 6.1 oder älter installieren, können Sie
dazu das vorkompilierte Paket net/csup oder den Port
net/csup (zur Installation
aus den Quellen) verwenden.Konfiguration von CVSupDas Verhalten von CVSup wird mit
einer Konfigurationsdatei gesteuert, die
supfile genannt wird. Beispiele für
Konfigurationsdateien finden Sie in dem Verzeichnis
.Ein supfile enthält die folgenden
Informationen:Welche Dateien Sie
erhalten wollen.Welche Versionen der
Dateien Sie benötigen.Woher Sie die Dateien
beziehen wollen.Wo Sie die erhaltenen
Dateien speichern.Wo Sie die
Status-Dateien aufbewahren wollen.In den folgenden Abschnitten erstellen wir ein typisches
supfile indem wir nach und nach diese Punkte
klären. Zuerst beschreiben wir aber den Aufbau dieser
Konfigurationsdatei.Ein supfile ist eine Textdatei.
Kommentare beginnen mit einem # und gelten bis zum
Zeilenende. Leerzeilen und Zeilen, die nur Kommentare enthalten,
werden ignoriert.Die anderen Zeilen legen die Dateien fest, die ein Benutzer
erhalten will. Der Server organisiert verschiedene Dateien in
einer Sammlung, deren Name auf einer Zeile angegeben
wird. Nach dem Namen der Sammlung können mehrere durch
Leerzeichen getrennte Felder folgen, die die oben angesprochenen
Informationen festlegen. Es gibt zwei Arten von Feldern: Felder,
die Optionen festlegen und Felder mit Parametern.
Optionen bestehen aus einem Schlüsselwort, wie
oder und
stehen alleine. Ein Parameterfeld beginnt mit einem
Schlüsselwort, dem = und ein Parameter,
wie in ,
folgt. Dieses Feld darf keine Leerzeichen enthalten.In einem supfile werden normalerweise
mehrere Sammlungen angefordert. Die erforderlichen Felder
können explizit für jede Sammlung angegeben werden,
dann werden jedoch die Zeilen ziemlich lang. Außerdem ist
dieses Vorgehen sehr unhandlich, da die meisten Felder für
alle Sammlungen gleich sind. CVSup
bietet die Möglichkeit, Vorgaben für die Felder der
Sammlungen festzulegen. Zeilen, die mit der Pseudo-Sammlung
*default beginnen, legen Optionen und Parameter
für nachfolgende Sammlungen im supfile
fest. Der Vorgabewert kann in der Zeile einer bestimmten Sammlung
überschrieben werden. Durch Hinzufügen weiterer
*default Zeilen können die Vorgaben auch
mitten im supfile überschrieben oder
erweitert werden.Mit diesem Wissen können wir nun ein
supfile erstellen, das den Quellbaum von
&os;-CURRENT anfordert und
aktualisiert.Welche Dateien wollen Sie
empfangen?Dateien werden von CVSup in
Sammlungen organisiert. Die erhältlichen
Sammlungen werden später
beschrieben. Wir wollen den Quellbaum von &os; empfangen,
der in der Sammlung src-all enthalten ist.
Das supfile enthält pro Zeile eine
Sammlung, in diesem Fall also nur eine einzige Zeile:src-allWelche Versionen der Dateien
werden benötigt?Mit CVSup können Sie jede
Version der Quellen bekommen, da der
cvsupd-Server seine Daten direkt aus
dem CVS-Repository bezieht. Sie
können die benötigten Versionen in den
Parameterfeldern tag= und
angeben.Achten Sie darauf, dass Sie das richtige
tag=-Feld angeben. Einige Tags sind nur
für spezielle Sammlungen gültig. Wenn Sie ein
falsches Tag angeben oder sich verschreiben, wird
CVSup Dateien löschen, die
Sie wahrscheinlich gar nicht löschen wollten.
Achten Sie insbesondere bei den
ports-*-Sammlungen darauf,
ausschließlichtag=. zu verwenden.Mit tag= wird ein symbolischer Name aus
dem Repository angegeben. Es gibt zwei verschiedene Tags:
Tags, die Revisionen bezeichnen und Tags, die Zweige
bezeichnen. Die ersteren sind statisch und fest an eine
Revision gebunden. Ein Tag, das einen Zweig bezeichnet,
bezieht sich dagegen zu einem gegebenen Zeitpunkt immer auf
die aktuellste Revision. Da ein Tag eines Zweiges nicht an
eine bestimmte Revision gebunden ist, kann sich dessen
Bedeutung von heute auf morgen ändern. zählt für Benutzer
relevante Tags auf. Wenn Sie in der Konfigurationsdatei ein
Tag, wie RELENG_4, angeben, müssen Sie
diesem tag= vorstellen:
tag=RELENG_4. Denken Sie daran, dass
es für die Ports-Sammlung nur tag=.
gibt.Achten Sie darauf, dass Sie den Namen eines Tags
richtig angeben. CVSup kann nicht
zwischen richtigen und falschen Tags unterscheiden. Wenn Sie
sich bei der Angabe eines Tags vertippen, nimmt
CVSup an, Sie hätten ein
gültiges Tag angegeben, dem nur keine Dateien zugeordnet
sind. Die Folge davon ist, dass Ihre vorhandenen Quellen
gelöscht werden.Wenn Sie ein Tag angeben, das sich auf einen Zweig bezieht,
erhalten Sie die aktuellsten Revisionen der Dateien auf diesem
Zweig. Wenn Sie eine frühere Revision erhalten
möchten, können Sie diese im
Feld angeben. Einzelheiten dazu finden Sie in der Manualpage
von cvsup.Wir möchten gerne &os;-CURRENT beziehen und
fügen die folgende Zeile am Anfang
der Konfigurationsdatei ein:*default tag=.Eine wichtige Ausnahme ist wenn Sie weder ein
tag=-Feld noch ein date=-Feld
angeben. In diesem Fall erhalten Sie anstelle einer speziellen
Revision die wirklichen RCS-Dateien aus dem CVS-Repository
des Servers. Diese Vorgehensweise wird von Entwicklern
bevorzugt, da sie mit einem eigenen Repository leicht die
Entwicklungsgeschichte und Veränderungen von Dateien
verfolgen können. Dieser Vorteil muss allerdings mit
sehr viel Plattenplatz bezahlt werden.Woher sollen die Dateien
bezogen werden?Im host=-Feld wird angegeben, woher
cvsup die Dateien holen soll. Sie
können hier jeden der CVSup-Spiegel angeben, doch
sollten Sie einen Server in Ihrer Nähe auswählen.
Für dieses Beispiel wollen wir den erfundenen Server
cvsup99.FreeBSD.org
verwenden:*default host=cvsup99.FreeBSD.orgBevor Sie CVSup laufen
lassen, sollten Sie hier einen existierenden Server
einsetzen. Den zu verwendenden Server können Sie auf der
Kommandozeile mit
überschreiben.Wo sollen die Dateien
gespeichert werden?Im prefix=-Feld teilen Sie
cvsup mit, wo die Dateien gespeichert werden
sollen. In diesem Beispiel werden wir die Quelldateien direkt
im Verzeichnisbaum für Quellen
/usr/src ablegen. Das Verzeichnis
src ist schon in der Sammlung, die wir
beziehen enthalten, so dass wir die folgende Zeile
angeben:*default prefix=/usrWo sollen die
Statusinformationen von cvsup gespeichert
werden?cvsup legt in einem Verzeichnis
Statusinformationen ab, die festhalten, welche Versionen schon
empfangen wurden. Wir verwenden das Verzeichnis
/var/db:*default base=/var/dbWenn das Verzeichnis für die Statusinformationen nicht
existiert, sollten Sie es jetzt anlegen, da
cvsup ohne dieses Verzeichnis nicht
startet.Verschiedene Einstellungen:Eine weitere Zeile sollte normalerweise in jedem
supfile sein:*default release=cvs delete use-rel-suffix compressMit release=cvs wird angegeben,
dass der Server das &os;-Haupt-Repository abfragen soll,
was praktisch immer der Fall ist (die Ausnahmen werden in
diesem Text nicht diskutiert).delete erlaubt es
CVSup, Dateien zu löschen.
Diese Option sollten Sie immer angeben, damit
CVSup Ihren Quellbaum auch wirklich
aktuell halten kann. CVSup
löscht nur Dateien für die es auch verantwortlich
ist. Andere Dateien, die sich in einem Baum unter Kontrolle
von CVSup befinden, werden nicht
verändert.Wenn Sie wirklich etwas über das obskure
use-rel-suffix erfahren wollen, lesen Sie
bitte in der Manualpage nach, ansonsten geben Sie es einfach an
und vergessen es.Wenn Sie compress angeben, werden Daten
auf dem Kommunikationskanal komprimiert. Wenn Sie über
eine T1-Leitung oder eine schnellere Netzanbindung
verfügen, brauchen Sie diese Option vielleicht nicht. In
allen anderen Fällen beschleunigt sie aber den
Ablauf.Zusammenfassung:Das vollständige supfile unseres
Beispiels sieht nun so aus:*default tag=.
*default host=cvsup99.FreeBSD.org
*default prefix=/usr
*default base=/var/db
*default release=cvs delete use-rel-suffix compress
src-allDie refuse DateiCVSup benutzt die Pull-Methode, das
heißt wenn sich ein Client mit einem Server verbindet,
erhält er eine Liste der verfügbaren Sammlungen und
wählt aus diesen die herunterzuladenden Dateien aus. In der
Voreinstellung wählt der Client alle Dateien aus, die zu
einer gegebenen Sammlung und zu einem gegebenen Tag passen.
Dieses Verhalten ist aber nicht immer erwünscht, besonders
wenn Sie die doc, ports
oder www Verzeichnisbäume
synchronisieren. Die wenigsten Leute beherrschen vier oder fünf
Sprachen und benötigen Dateien mit speziellen Anpassungen
für eine Sprache. Wenn Sie die Ports-Sammlung
synchronisieren, können Sie anstelle von
ports-all einzelne Ports, wie
ports-astrology oder
ports-biology angeben. Die
doc und www
Verzeichnisbäume verfügen aber nicht über
Sammlungen für spezielle Sprachen. In diesem Fall
müssen Sie eines der vielen eleganten Merkmale von
CVSup benutzen: Die
refuse Datei.Mit einer refuse Datei können Sie
bestimmte Dateien einer Sammlung von der Übertragung
ausschließen. Der Ort der refuse ist
base/sup/refuse,
wobei base in Ihrem
supfile festgelegt wurde.
Wir verwenden das Verzeichnis
/var/db, der Ort der
refuse Datei ist daher
/var/db/sup/refuse.Das Format der refuse Datei ist einfach:
Sie enthält eine Liste der Dateien und Verzeichnisse, die Sie
nicht herunterladen wollen. Wenn Sie zum Beispiel die
Dokumentation nicht in anderen Sprachen als Englisch
lesen wollen, könnte Ihre
refuse-Datei wie folgt aussehen:doc/bn_*
doc/da_*
doc/de_*
doc/el_*
doc/es_*
doc/fr_*
doc/hu_*
doc/it_*
doc/ja_*
doc_mn_*
doc/nl_*
doc/no_*
doc/pl_*
doc/pt_*
doc/ru_*
doc/sr_*
doc/tr_*
doc/zh_*Die Aufzählung setzt sich für andere Sprachen fort.
Eine vollständige Liste finden Sie im
&os;
CVS Repository.Die refuse Datei spart Anwendern von
CVSup, die über eine langsame
Internetanbindung verfügen oder deren Internetverbindung
zeitlich abgerechnet wird, wertvolle Zeit, da sie Dateien, die sie
nicht benötigen, nicht mehr herunterladen müssen.
Weitere Informationen zu refuse Dateien und
anderen Eigenschaften von CVSup
entnehmen Sie bitte der Manualpage.Ausführen von CVSupWir können nun eine Aktualisierung mit der folgenden
Kommandozeile starten:&prompt.root; cvsup supfilesupfile gibt
dabei das eben erstelle supfile an. Wenn Sie
X11 benutzen, wird
cvsup ein GUI starten.
Drücken Sie go und schauen Sie
zu.Das Beispiel aktualisiert die Dateien im Verzeichnisbaum
/usr/src. Sie müssen
cvsup als root starten,
damit Sie die nötigen Rechte haben, die Dateien zu
aktualisieren. Sie sind vielleicht ein bisschen nervös
weil Sie das Programm zum ersten Mal anwenden und möchten
zuerst einmal einen Testlauf durchführen. Legen Sie dazu ein
temporäres Verzeichnis an und übergeben es auf der
Kommandozeile von cvsup:&prompt.root; mkdir /var/tmp/dest
&prompt.root; cvsup supfile /var/tmp/destAktualisierungen werden dann nur in dem angegebenen Verzeichnis
vorgenommen. CVSup untersucht die
Dateien in /usr/src, wird aber keine dieser
Dateien verändern. Die veränderten Dateien finden Sie
stattdessen in /var/tmp/dest/usr/src. Die
Statusdateien von CVSup werden ebenfalls
nicht geändert, sondern in dem angegebenen Verzeichnis
abgelegt. Wenn Sie Leseberechtigung in
/usr/src haben, brauchen Sie das Programm
noch nicht einmal unter root laufen zu
lassen.Wenn Sie X11 nicht benutzen wollen
oder keine GUIs mögen, sollten Sie
cvsup wie folgt aufrufen:&prompt.root; cvsup -g -L 2 supfile verhindert den Start des
GUIs. Wenn Sie kein
X11 laufen haben, passiert das
automatisch, ansonsten müssen Sie diesen Schalter
angeben.Mit gibt CVSup
Einzelheiten zu jeder Aktualisierung aus. Die Wortfülle der
Meldungen können Sie von bis
einstellen. In der Voreinstellung
werden nur Fehlermeldungen ausgegeben.Eine Zusammenfassung der Optionen von
CVSup erhalten Sie mit
cvsup -H. Genauere Informationen finden Sie in
der Manualpage von CVSup.Wenn Sie mit dem Ablauf der Aktualisierung zufrieden sind,
können Sie CVSup
regelmäßig aus &man.cron.8; ausführen. In diesem
Fall sollten Sie natürlich nicht das GUI
benutzen.CVSup SammlungenDie CVSup Sammlungen sind
hierarchisch organisiert. Es gibt wenige große Sammlungen,
die in kleinere Teilsammlungen unterteilt sind. Wenn Sie eine
große Sammlung beziehen, entspricht das dem Beziehen aller
Teilsammlungen. Der Hierarchie der Sammlung wird in der folgenden
Aufzählung durch Einrückungen dargestellt.Die am häufigsten benutzen Sammlungen sind
src-all und ports-all. Die
anderen Sammlungen werden von wenigen Leuten zu speziellen Zwecken
benutzt und es kann sein, dass diese nicht auf allen Spiegeln
zur Verfügung stehen.cvs-all release=cvsDas &os;-Haupt-Repository einschließlich der
Kryptographie-Module.distrib release=cvsDateien, die zum Verteilen und Spiegeln von &os;
benötigt werden.doc-all release=cvsQuellen des &os;-Handbuchs und weiterer
Dokumentation. Diese Sammlung enthält nicht die
&os;-Webseite.ports-all release=cvsDie &os;-Ports-Sammlung.Wenn Sie nicht die gesamte Ports-Sammlung
(ports-all) aktualisieren wollen,
sondern nur eine der nachstehend aufgeführten
Teilsammlungen, aktualisieren Sie
immer die Teilsammlung
ports-base. Diese Teilsammlung
enthält das Bausystem der Ports. Immer wenn
ports-base geändert wird,
ist es so gut wie sicher, dass diese Änderung
auch tatsächlich von einem Port benutzt wird.
Der Bau eines Ports, der auf Änderungen
im Bausystem angewiesen wird, wird fehlschlagen,
wenn das Bausystem noch auf einem alten Stand ist.
Aktualisieren Sie vor allen Dingen
ports-base, wenn Sie bei
einem Bau merkwürdige Fehlermeldungen
erhalten und kein aktuelles Bausystem benutzen.Wenn Sie die Datei
ports/INDEX selbst
erzeugen, brauchen Sie unbedingt die
Sammlung ports-all (den
ganzen Ports-Baum). Es ist nicht möglich,
ports/INDEX nur mit
einem Teilbaum zu erstellen. Lesen Sie dazu
bitte die FAQ.ports-accessibility
release=cvsWerkzeuge für behinderte Benutzer.ports-arabic
release=cvsArabische Sprachunterstützung.ports-archivers
release=cvsWerkzeuge zum Archivieren.ports-astro
release=cvsAstronomie-Programme.ports-audio
release=cvsAudio-Programme.ports-base
release=cvsDas Bausystem der Ports-Sammlung.
Dazu gehören verschiedene Dateien in den
Unterverzeichnissen Mk/
und Tools/ von
/usr/ports.Aktualisieren Sie diese Teilsammlung
jedes Mal, wenn Sie
einen Teil der Ports-Sammlung aktualisieren.
Lesen Sie dazu auch den obigen
Hinweis zur Ports-Sammlung.ports-benchmarks
release=cvsBenchmarks.ports-biology
release=cvsBiologie.ports-cad
release=cvsComputer Aided Design Werkzeuge.ports-chinese
release=cvsChinesische Sprachunterstützung.ports-comms
release=cvsProgramme zur Datenkommunikation.ports-converters
release=cvsZeichensatz Konvertierer.ports-databases
release=cvsDatenbanken.ports-deskutils
release=cvsSachen, die sich vor dem Computer-Zeitalter
auf dem Schreibtisch befanden.ports-devel
release=cvsWerkzeuge für Entwickler.ports-dns
release=cvsSoftware für DNS.ports-editors
release=cvsEditoren.ports-emulators
release=cvsProgramme, die andere Betriebssysteme
emulieren.ports-finance
release=cvsFinanz-Anwendungen.ports-ftp
release=cvsWerkzeuge für FTP Clients und Server.ports-games
release=cvsSpiele.ports-german
release=cvsDeutsche Sprachunterstützung.ports-graphics
release=cvsGraphik-Programme.ports-hebrew
release=cvsHebräische Sprachunterstützung.ports-hungarian
release=cvsUngarische Sprachunterstützung.ports-irc
release=cvsInternet Relay Chat Werkzeuge.ports-japanese
release=cvsJapanische Sprachunterstützung.ports-java
release=cvs&java; Werkzeuge.ports-korean
release=cvsKoreanische Sprachunterstützung.ports-lang
release=cvsProgrammiersprachen.ports-mail
release=cvsE-Mail Programme.ports-math
release=cvsProgramme zur numerischen Mathematik.ports-mbone
release=cvsMBone Anwendungen.ports-misc
release=cvsVerschiedene Werkzeuge.ports-multimedia
release=cvsMultimedia-Anwendungen.ports-net
release=cvsNetzwerk-Programme.ports-net-im
release=cvsDiverse Instant-Messenger.ports-net-mgmt
release=cvsSoftware zum Verwalten von Netzwerken.ports-net-p2p
release=cvsSoftware für die Nutzung von
Peer-to-Peer-Netzwerken.ports-news
release=cvsUSENET News Werkzeuge.ports-palm
release=cvsProgramme für den
Palm.ports-polish
release=cvsPolnische Sprachunterstützung.ports-ports-mgmt
release=cvsWerkzeuge zum Management von Ports und
Paketen.ports-portuguese
release=cvsPortugiesische Sprachunterstützung.ports-print
release=cvsDruckprogramme.ports-russian
release=cvsRussische Sprachunterstützung.ports-science
release=cvsWissenschaft.ports-security
release=cvsWerkzeuge zum Thema Sicherheit.ports-shells
release=cvsKommandozeilen-Shells.ports-sysutils
release=cvsSystem-Werkzeuge.ports-textproc
release=cvsProgramme zur Textverarbeitung (ohne Desktop
Publishing).ports-ukrainian
release=cvsUkrainische Sprachunterstützung.ports-vietnamese
release=cvsVietnamesische
Sprachunterstützung.ports-www
release=cvsSoftware rund um das World Wide Web.ports-x11
release=cvsX-Window Programme.ports-x11-clocks
release=cvsX11-Uhren.ports-x11-drivers
release=cvsX11-Treiber.ports-x11-fm
release=cvsX11-Dateiverwalter.ports-x11-fonts
release=cvsX11-Zeichensätze und Werkzeuge dazu.ports-x11-toolkits
release=cvsX11-Werkzeuge.ports-x11-servers
release=cvsX11-Server.ports-x11-themes
release=cvsX11-Themes.ports-x11-wm
release=cvsX11-Fensterverwalter.projects-all release=cvsQuelltexte der verschiedenen &os;-Projekte.src-all release=cvsDie &os;-Quellen einschließlich der
Kryptographie-Module.src-base
release=cvsVerschiedene Dateien unter
/usr/src.src-bin
release=cvsBenutzer-Werkzeuge die im Einzelbenutzermodus
gebraucht werden
(/usr/src/bin).src-cddl
release=cvsWerkzeuge und Bibliotheken, die der
CDDL-Lizenz unterliegen
(/usr/src/cddl).src-contrib
release=cvsWerkzeuge und Bibliotheken, die nicht aus dem
&os; Project stammen und wenig verändert
übernommen werden.
(/usr/src/contrib).src-crypto release=cvsKryptographische Werkzeuge und Bibliotheken,
die nicht aus dem &os; Project stammen und
wenig verändert übernommen werden.
(/usr/src/crypto).src-eBones release=cvsKerberos und DES
(/usr/src/eBones). Wird
in aktuellen Releases von &os; nicht
benutzt.src-etc
release=cvsKonfigurationsdateien des Systems
(/usr/src/etc).src-games
release=cvsSpiele
(/usr/src/games).src-gnu
release=cvsWerkzeuge, die unter der GNU Public License
stehen (/usr/src/gnu).src-include
release=cvsHeader Dateien
(/usr/src/include).src-kerberos5
release=cvsKerberos5
(/usr/src/kerberos5).src-kerberosIV
release=cvsKerberosIV
(/usr/src/kerberosIV).src-lib
release=cvsBibliotheken
(/usr/src/lib).src-libexec
release=cvsSystemprogramme, die von anderen Programmen
ausgeführt werden
(/usr/src/libexec).src-release
release=cvsDateien, die zum Erstellen eines &os;
Releases notwendig sind
(/usr/src/release).src-rescue
release=cvsStatisch gelinkte Programme zur
Wiederherstellung eines defekten Systems.
Lesen Sie dazu auch die Manualpage
&man.rescue.8;
(/usr/src/rescue).src-sbin release=cvsWerkzeuge für den Einzelbenutzermodus
(/usr/src/sbin).src-secure
release=cvsKryptographische Bibliotheken und Befehle
(/usr/src/secure).src-share
release=cvsDateien, die von mehreren Systemen
gemeinsam benutzt werden können
(/usr/src/share).src-sys
release=cvsDer Kernel
(/usr/src/sys).src-sys-crypto
release=cvsKryptographie Quellen des Kernels
(/usr/src/sys/crypto).src-tools
release=cvsVerschiedene Werkzeuge zur Pflege von &os;
(/usr/src/tools).src-usrbin
release=cvsBenutzer-Werkzeuge
(/usr/src/usr.bin).src-usrsbin
release=cvsSystem-Werkzeuge
(/usr/src/usr.sbin).www release=cvsDie Quellen der &os;-WWW-Seite.distrib release=selfDie Konfigurationsdateien des
CVSup Servers. Diese werden von
den CVSup benutzt.gnats release=currentDie GNATS Datenbank, in der Problemberichte verwaltet
werden.mail-archive release=currentDas Archiv der &os;-Mailinglisten.www release=currentDie formatierten Dateien der &os;-WWW-Seite (nicht die
Quellen). Diese werden von den WWW-Spiegeln benutzt.Weiterführende InformationenDie CVSup FAQ und weitere
Informationen über CVSup finden Sie
auf The CVSup Home Page.&os; spezifische Diskussionen über
CVSup finden auf der Mailingliste
&a.hackers; statt. Dort und auf der Liste &a.announce; werden neue
Versionen von CVSup
angekündigt.Bei Fragen und Problemberichten zu
CVSup lesen Sie bitte die
CVSup FAQ.CVSup-ServerDie folgende Aufzählung enthält
CVSup Server für &os;:
&chap.mirrors.cvsup.inc;
CVS-TagsWenn Sie Quellen mit CVS oder
CVSup erhalten oder aktualisieren wollen,
müssen Sie ein Tag angeben. Ein Tag kann einen bestimmten
&os;-Zweig oder einen bestimmten Zeitpunkt
(Release-Tag) bestimmen.Tags für ZweigeMit Ausnahme von HEAD (das immer
ein gültiges Tag ist), können die folgenden
Tags nur im src/-Quellbaum verwendet
werden. Die Quellbäume ports/,
doc/ und www/
sind nicht verzweigt.HEADSymbolischer Name für den Hauptzweig, auch
&os.current; genannt. Dies ist die Vorgabe, wenn keine
Revision angegeben wird.In CVSup wird dieses Tag mit
einem . (Punkt) bezeichnet.In CVS ist das die Vorgabe,
wenn Sie kein Tag oder eine Revision angeben. Außer
Sie wollen einen -STABLE Rechner auf -CURRENT aktualisieren,
ist es nicht ratsam, die -CURRENT
Quellen auf einem -STABLE Rechner einzuspielen.RELENG_8Der Entwicklungszweig für &os;-8.X, auch bekannt
als &os; 8-STABLE.
+
+ RELENG_8_1
+
+
+ Der Zweig, auf dem sicherheitsrelevante oder kritische
+ Fehlerbehebungen für &os; 8.1
+ durchgeführt werden.
+
+
+
RELENG_8_0Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 8.0
durchgeführt werden.RELENG_7Der Entwicklungszweig für &os;-7.X, auch als
&os; 7-STABLE bekannt.
-
+
RELENG_7_3Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 7.3
durchgeführt werden.RELENG_7_2Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 7.2
durchgeführt werden.RELENG_7_1Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 7.1
durchgeführt werden.RELENG_7_0Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 7.0
durchgeführt werden.RELENG_6Der Entwicklungszweig für &os;-6.X, auch als
&os; 6-STABLE bekannt.RELENG_6_4
-
+
Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 6.4
durchgeführt werden.RELENG_6_3Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 6.3
durchgeführt werden.RELENG_6_2Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 6.2
durchgeführt werden.RELENG_6_1Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 6.1
durchgeführt werden.RELENG_6_0Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 6.0
durchgeführt werden.RELENG_5Der &os; 5.X Entwicklungszweig, der
auch &os; 5-STABLE genannt wird.RELENG_5_5Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 5.5
durchgeführt werden.RELENG_5_4Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 5.4
durchgeführt werden.RELENG_5_3Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 5.3
durchgeführt werden.RELENG_5_2Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 5.2 und
&os; 5.2.1 durchgeführt werden.RELENG_5_1Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 5.1 durchgeführt
werden.RELENG_5_0Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 5.0 durchgeführt
werden.RELENG_4Der &os; 4.X Entwicklungszweig,
der auch &os; 4-STABLE genannt wird.RELENG_4_11Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.11 durchgeführt
werden.RELENG_4_10Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.10 durchgeführt
werden.RELENG_4_9Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.9 durchgeführt
werden.RELENG_4_8Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.8 durchgeführt
werden.RELENG_4_7Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.7 durchgeführt
werden.RELENG_4_6Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.6 und
&os; 4.6.2 durchgeführt werden.RELENG_4_5Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.5 durchgeführt
werden.RELENG_4_4Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.4 durchgeführt
werden.RELENG_4_3Der Zweig, auf dem sicherheitsrelevante oder kritische
Fehlerbehebungen für &os; 4.3 durchgeführt
werden.RELENG_3Der &os;-3.X Entwicklungszweig, der auch 3.X-STABLE
genannt wird.RELENG_2_2Der &os;-2.2.X Entwicklungszweig, der auch 2.2-STABLE
genannt wird.Release-TagsDiese Tags geben den Zeitpunkt an, an dem eine bestimme
&os;-Version veröffentlicht wurde. Das Erstellen einer
Release ist in den Dokumenten
Release Engineering
Information und
Release
Process beschrieben. Der
src-Baum benutzt
Tags, deren Namen mit RELENG_ anfangen.
Die Bäume ports
und doc benutzen
Tags, deren Namen mit RELEASE anfangen.
Im Baum www werden
keine Release-Tags verwendet.
+
+ RELENG_8_1_0_RELEASE
+
+
+ &os; 8.1
+
+
+
RELENG_8_0_0_RELEASE&os; 8.0
-
+
RELENG_7_3_0_RELEASE
-
+
&os; 7.3
-
+
RELENG_7_2_0_RELEASE&os; 7.2RELENG_7_1_0_RELEASE&os; 7.1
-
+
RELENG_7_0_0_RELEASE&os; 7.0RELENG_6_4_0_RELEASE&os; 6.4RELENG_6_3_0_RELEASE&os; 6.3RELENG_6_2_0_RELEASE&os; 6.2RELENG_6_1_0_RELEASE&os; 6.1RELENG_6_0_0_RELEASE&os; 6.0RELENG_5_5_0_RELEASE&os; 5.5RELENG_5_4_0_RELEASE&os; 5.4RELENG_4_11_0_RELEASE&os; 4.11RELENG_5_3_0_RELEASE&os; 5.3RELENG_4_10_0_RELEASE&os; 4.10RELENG_5_2_1_RELEASE&os; 5.2.1RELENG_5_2_0_RELEASE&os; 5.2RELENG_4_9_0_RELEASE&os; 4.9RELENG_5_1_0_RELEASE&os; 5.1RELENG_4_8_0_RELEASE&os; 4.8RELENG_5_0_0_RELEASE&os; 5.0RELENG_4_7_0_RELEASE&os; 4.7RELENG_4_6_2_RELEASE&os; 4.6.2RELENG_4_6_1_RELEASE&os; 4.6.1RELENG_4_6_0_RELEASE&os; 4.6RELENG_4_5_0_RELEASE&os; 4.5RELENG_4_4_0_RELEASE&os; 4.4RELENG_4_3_0_RELEASE&os; 4.3RELENG_4_2_0_RELEASE&os; 4.2RELENG_4_1_1_RELEASE&os; 4.1.1RELENG_4_1_0_RELEASE&os; 4.1RELENG_4_0_0_RELEASE&os; 4.0RELENG_3_5_0_RELEASE&os;-3.5RELENG_3_4_0_RELEASE&os;-3.4RELENG_3_3_0_RELEASE&os;-3.3RELENG_3_2_0_RELEASE&os;-3.2RELENG_3_1_0_RELEASE&os;-3.1RELENG_3_0_0_RELEASE&os;-3.0RELENG_2_2_8_RELEASE&os;-2.2.8RELENG_2_2_7_RELEASE&os;-2.2.7RELENG_2_2_6_RELEASE&os;-2.2.6RELENG_2_2_5_RELEASE&os;-2.2.5RELENG_2_2_2_RELEASE&os;-2.2.2RELENG_2_2_1_RELEASE&os;-2.2.1RELENG_2_2_0_RELEASE&os;-2.2.0AFS-ServerDie folgende Aufzählung enthält AFS Server für
&os;:SchwedenDie Dateien sind unter dem Pfad
/afs/stacken.kth.se/ftp/pub/FreeBSD/
erreichbar.stacken.kth.se # Stacken Computer Club, KTH, Sweden
130.237.234.43 #hot.stacken.kth.se
130.237.237.230 #fishburger.stacken.kth.se
130.237.234.3 #milko.stacken.kth.seBetreuer ftp@stacken.kth.sersync-Serverrsync wird ähnlich wie
&man.rcp.1; verwendet, besitzt aber mehr Optionen und
verwendet das rsync remote-update Protokoll, das nur
geänderte Dateien überträgt und damit viel schneller
als ein normaler Kopiervorgang ist. rsync
ist sehr nützlich, wenn Sie einen &os;-FTP-Spiegel oder einen
CVS-Spiegel betreiben. Das Programm ist für viele
Betriebssysteme erhältlich, mit &os; können Sie den
Port net/rsync oder das fertige
Paket benutzen. Die folgenden Server stellen &os; über das
rsync Protokoll zur Verfügung:Großbritannienrsync://rsync.mirrorservice.org/Verfügbare Sammlungen:sites/ftp.freebsd.org: Kompletter Spiegel des
&os;-FTP-Servers.Niederlandersync://ftp.nl.FreeBSD.org/Verfügbare Sammlungen:&os;: Kompletter Spiegel des
&os;-FTP-Servers.Russlandrsync://ftp.mtu.ru/Verfügbare Sammlungen:&os;: Kompletter Spiegel des
&os;-FTP-Servers.&os;-gnats: Die GNATS-Datenbank
zur Verwaltung von Problemberichten.&os;-Archive: Ein Spiegel des
&os;-Archive-FTP-Servers.Taiwanrsync://ftp.tw.FreeBSD.org/rsync://ftp2.tw.FreeBSD.org/rsync://ftp6.tw.FreeBSD.org/Verfügbare Sammlungen:&os;: Kompletter Spiegel des
&os;-FTP-Servers.Tschechische Republikrsync://ftp.cz.FreeBSD.org/Verfügbare Sammlungen:ftp: Unvollständiger Spiegel des
&os;-FTP-Servers.&os;: Vollständiger Spiegel des
&os;-FTP-Servers.USArsync://ftp-master.FreeBSD.org/Dieser Server darf nur von primären Spiegeln benutzt
werden.Verfügbare Sammlungen:&os;: Das Hauptarchiv des &os;
FTP Servers.acl: Die primäre ACL-Liste.rsync://ftp13.FreeBSD.org/Verfügbare Sammlungen:&os;: Kompletter Spiegel des
&os;-FTP-Servers.
diff --git a/de_DE.ISO8859-1/books/handbook/ppp-and-slip/chapter.sgml b/de_DE.ISO8859-1/books/handbook/ppp-and-slip/chapter.sgml
index 593e4da97f..2e2bb7f10c 100644
--- a/de_DE.ISO8859-1/books/handbook/ppp-and-slip/chapter.sgml
+++ b/de_DE.ISO8859-1/books/handbook/ppp-and-slip/chapter.sgml
@@ -1,3373 +1,3408 @@
JimMockRestrukturiert, neu organisiert und aktualisiert von
-
ThomasSchwarzkopfÜbersetzt von
-
PPP und SLIPÜbersichtPPPSLIPUnter FreeBSD stehen verschiedene Möglichkeiten zur
Verfügung, um Computer miteinander zu verbinden. Der Aufbau
einer Netzwerk- oder Internetverbindung mit Hilfe eines Einwahlmodems
– für den eigenen oder für andere Rechner –
erfordert den Einsatz von PPP oder SLIP.Nachdem Sie dieses Kapitel gelesen haben, werden Sie wissen:Wie Sie User-PPP einrichten.
- Wie Sie Kernel-PPP einrichten.
+ Wie Sie Kernel-PPP einrichten (nur für
+ &os; 7.X relevant).Was zu tun ist, um PPPoE (PPP over
Ethernet) einzurichten.Wie Sie PPPoA (PPP over
ATM) einrichten.Wie Sie einen SLIP-Client und -Server einrichten und
- konfigurieren
+ konfigurieren ((nur für &os; 7.X relevant)
PPPUser-PPPPPPKernel-PPPPPPover EthernetBevor Sie dieses Kapitel lesen, sollten Sie:mit den grundlegenden Begriffen der Netzwerktechnik
vertraut sein.die Grundlagen und den Zweck einer Einwahlverbindung sowie
PPP und/oder SLIP kennen.Sie fragen sich vielleicht, worin denn der Hauptunterschied
zwischen User-PPP und Kernel-PPP liegt. Die Antwort ist einfach:
User-PPP verarbeitet die ein- und ausgehenden Daten im Userland,
statt im Kernel. Dies ist zwar aufwändig, im Hinblick auf
die Daten, die dadurch zwischen Kernel und Userland hin und her
kopiert werden müssen, doch es ermöglicht auch eine
PPP-Implementierung mit weitaus mehr Funktionen. User-PPP verwendet
das Gerät tun, um mit anderen Rechnern
zu kommunizieren, während Kernel-PPP hierfür das
Gerät ppp benutzt.In diesem Kapitel wird durchgängig vom Programm
ppp gesprochen, wenn damit User-PPP
gemeint ist. Ausnahmen werden gemacht, wenn eine
Unterscheidung gegenüber anderer PPP-Software, wie
pppd, notwendig wird. Soweit nichts
anderes angegeben ist, sollten alle Befehle, die in diesem
Kapitel erklärt werden, als root
ausgeführt werden.TomRhodesAktualisiert und erweitert von BrianSomersUrsprünglich geschrieben von NikClaytonMit Beiträgen von DirkFrömbergPeterChildsUser-PPP
+
+ Mit &os; 8.0 wurden die Gerätedateien für
+ serielle Ports umbenannt:
+ /dev/cuadN wurde
+ zu /dev/cuauN,
+ /dev/ttydN zu
+ /dev/ttyuN.
+ Verwenden Sie noch &os; 7.X, müssen Sie dies beim
+ Lesen der folgenden Abschnitte berücksichtigen.
+
+
User-PPPVoraussetzungenDieses Dokument geht davon aus, dass Sie Folgendes zur
Verfügung haben:ISPPPPEinen Account bei einem Internet Service Provider (ISP),
zu dem Sie mit PPP eine Verbindung aufbauen können.Ein Modem oder ein anderes Gerät, das, richtig
konfiguriert und mit Ihrem Rechner verbunden, Ihnen die
Herstellung einer Verbindung zu Ihrem ISP erlaubt.Die Einwahlnummer(n) Ihres ISP.PAPCHAPUNIXLogin NamePasswortIhren Login-Namen und Ihr Passwort (entweder ein
reguläres Login/Passwort-Paar im &unix;-Stil oder
ein PAP bzw. CHAP Login/Passwort-Paar).NameserverDie IP-Adresse von einem oder mehreren Nameservern.
Üblicherweise werden Ihnen von Ihrem ISP zwei
IP-Adressen für diesen Zweck zur Verfügung gestellt.
Wenn Sie keine solche IP-Adresse von Ihrem
Provider bekommen haben, können Sie das Kommando
enable dns in der Datei
ppp.conf verwenden, um
ppp anzuweisen, den Nameserver
für Sie einzutragen. Diese Funktion setzt allerdings
voraus, dass Ihr ISP eine PPP-Implementierung verwendet,
die das Aushandeln eines Nameservers unterstützt.Die folgenden Informationen werden Ihnen möglicherweise
von Ihrem ISP zur Verfügung gestellt, sie sind aber nicht
zwingend erforderlich:Die Gateway IP-Adresse Ihres ISP. Als Gateway wird
der Computer bezeichnet, zu dem Sie eine Verbindung aufbauen.
Die IP-Adresse dieses Rechners wird als
default route eingetragen. Wenn Sie
diese Information nicht zur Verfügung haben, kann PPP so
konfiguriert werden, dass der PPP-Server Ihres ISP während
des Verbindungsaufbaus eine gültige Adresse
übermittelt.ppp bezieht sich mit
HISADDR auf diese IP-Adresse.Die Netzmaske, die Sie verwenden sollten. Falls Ihnen Ihr
ISP keine Netzmaske vorgegeben hat, können Sie
255.255.255.255 verwenden.feste IP-AdresseWenn Ihnen Ihr ISP eine statische IP-Adresse zur
Verfügung stellt, können Sie diese eintragen.
Andernfalls lassen wir uns einfach von der Gegenstelle
eine IP-Adresse zuweisen.Falls Ihnen die erforderlichen Informationen fehlen
sollten, nehmen Sie bitte Kontakt mit Ihrem ISP auf.Die Beispieldateien, die in diesem Kapitel dargestellt werden,
enthalten Zeilennummern. Die Nummerierung dient lediglich einer
leichteren Orientierung und sollte von Ihnen nicht in Ihre Dateien
übernommen werden. Richtiges Einrücken, durch
Tabulatoren und Leerzeichen, ist ebenfalls wichtig.Automatische Konfiguration von
PPPPPPKonfigurationSowohl ppp als auch pppd
(die PPP-Implementierung auf Kernelebene) verwenden die
- Konfigurationsdateien im Verzeichnis /etc/ppp.
Beispiele für User-PPP sind in /usr/share/examples/ppp/
+ class="directory">/usr/share/examples/ppp/
zu finden.Die Konfiguration von ppp erfordert,
je nach Ihren besonderen Bedingungen, die Bearbeitung
einiger Dateien. Was Sie in diese Dateien eintragen, hängt
unter anderem davon ab, ob Ihnen Ihr ISP eine statische
IP-Adresse (Sie verwenden immer dieselbe IP-Adresse,
die Ihnen einmal zugeteilt wurde) oder eine dynamische IP-Adresse
(Ihre IP-Adresse ändert sich bei jeder Verbindung
mit dem ISP) zugewiesen hat.PPP und statische IP-AdressenPPPmit fester IP-AdresseSie müssen die Konfigurationsdatei
/etc/ppp/ppp.conf bearbeiten. Sie sollte
so aussehen, wie in dem unten angegebenen Beispiel.Zeilen die mit einem : enden,
beginnen in der ersten Spalte (am Beginn der Zeile). Alle
anderen Zeilen sollten wie dargestellt durch Leerzeichen
oder Tabulatoren eingerückt werden.1 default:
2 set log Phase Chat LCP IPCP CCP tun command
3 ident user-ppp VERSION (built COMPILATIONDATE)
-4 set device /dev/cuad0
+4 set device /dev/cuau0
5 set speed 115200
6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
8 set timeout 180
9 enable dns
10
11 provider:
12 set phone "(123) 456 7890"
13 set authname foo
14 set authkey bar
15 set login "TIMEOUT 10 \"\" \"\" gin:--gin: \\U word: \\P col: ppp"
16 set timeout 300
17 set ifaddr x.x.x.xy.y.y.y 255.255.255.255 0.0.0.0
18 add default HISADDRZeile 1:Gibt den Standardeintrag an. Befehle dieses
Eintrags werden automatisch ausgeführt, wenn
ppp läuft.Zeile 2:Schaltet die Loggingparameter ein. Wenn die
Verbindung zufriedenstellend funktioniert, können
Sie diese Zeile verkürzen:set log phase tunDies verhindert ein übermäßiges
Anwachsen der Logdateien.Zeile 3:Gibt PPP an, wie es sich gegenüber der
Gegenstelle identifizieren soll. PPP identifiziert
sich gegenüber der Gegenstelle, wenn es Schwierigkeiten
bei der Aushandlung und beim Aufbau der Verbindung gibt.
Dabei werden Informationen bereitgestellt, die dem
Administrator der Gegenstelle helfen
können, die Ursache der Probleme zu finden.Zeile 4:Gibt das Device an, an dem das Modem
angeschlossen ist.
COM1 entspricht /dev/cuad0 und
COM2 entspricht /dev/cuad1.Zeile 5:Legt die Geschwindigkeit fest, mit der Sie
die Verbindung betreiben möchten. Falls ein Wert
von 115200 nicht funktioniert (was aber bei jedem
einigermaßen neuen Modem
funktionieren sollte), versuchen Sie es stattdessen
mit 38400.Zeilen 6 & 7:PPPUser-PPPDie Zeichenfolge für die Einwahl. User-PPP
verwendet eine expect-send Syntax, ähnlich dem
&man.chat.8;-Programm. Weitere Informationen zu den
Eigenschaften dieser Sprache bietet die Manual-Seite.Beachten Sie, dass dieser Befehl aufgrund der
besseren Lesbarkeit auf der nächsten Zeile weitergeht.
Das kann für jeden Befehl in
ppp.conf gelten, wenn
- \ das letzte Zeichen in einer Zeile
+ \ das letzte Zeichen in einer Zeile
ist.Zeile 8:Legt den Zeitrahmen fest, innerhalb dessen eine Reaktion
erfolgen muss. Der Standardwert liegt bei 180 Sekunden, so
dass diese Zeile lediglich einen kosmetischen Charakter
hat.Zeile 9:Weist PPP an, bei der Gegenstelle eine Bestätigung
der lokalen Resolvereinstellungen anzufordern. Wenn Sie
einen lokalen Nameserver betreiben, sollte diese Zeile
auskommentiert oder gelöscht werden.Zeile 10:Eine leere Zeile zur besseren Lesbarkeit. Leere Zeilen
werden von PPP ignoriert.Zeile 11:Bestimmt einen Provider, namens
provider. Wenn Sie hier den Namen Ihres
ISP einsetzen, können Sie später die Verbindung
mit
aufbauen.Zeile 12: Gibt die Telefonnummer des Providers an. Mehrere
Telefonnummern können angegeben werden, indem Doppelpunkte
(:) oder Pipe-Zeichen
(|) als Trennzeichen verwendet werden.
Der Unterschied zwischen diesen beiden Trennzeichen ist in
&man.ppp.8; beschrieben.
Zusammenfassend: Wenn Sie die verschiedenen Nummern
abwechselnd verwenden möchten, sollten Sie die
Nummern durch einen Doppelpunkt trennen.
Wenn Sie immer die erste Nummer verwenden möchten und
die anderen nur zum Einsatz kommen sollen, wenn eine Einwahl
mit der ersten Telefonnummer nicht möglich ist, sollten
Sie das Pipe-Zeichen zur Trennung verwenden.
Wie im Beispiel, sollten Sie die gesamte Reihe der
Telefonnummern in Anführungszeichen setzen.Sie müssen die Telefonnummer in
Anführungszeichen (") setzen,
wenn Sie Leerzeichen in der Telefonnummer verwenden,
ansonsten rufen Sie einen Fehler hervor, der vielleicht
schwer zu finden ist.Zeilen 13 & 14:Gibt den Benutzernamen und das Passwort an. Wenn Sie
zur Verbindung einen Login-Prompt im UNIX-Stil verwenden,
bezieht sich der Befehl set login
mit den \U und \P Variablen auf diese Werte. Wenn Sie
zum Verbindungsaufbau PAP oder CHAP verwenden, werden
diese Werte zum Zeitpunkt der
Authentifizierung verwendet.Zeile 15:PAPCHAPWenn Sie PAP oder CHAP einsetzen, gibt es an
dieser Stelle keinen Login-Prompt, weshalb Sie diese
Zeile auskommentieren oder löschen sollten. Der
Abschnitt Authentifizierung
mit PAP und CHAP enthält hierzu weitere
Einzelheiten.Der Login-String hat die gleiche chat-ähnliche
Syntax, wie der Einwahlstring. Der String in diesem
Beispiel funktioniert mit einem ISP, dessen
Login-Session folgendermaßen aussieht:J. Random Provider
login: foo
password: bar
protocol: pppSie müssen dieses Skript noch an Ihre
eigenen Erfordernisse anpassen. Wenn Sie dieses Skript
zum ersten Mal schreiben, sollten Sie sicherstellen,
dass Sie chat-logging aktiviert haben,
damit Sie überprüfen zu können, ob
die Konversation zwischen Ihrem Rechner und dem Rechner
des Providers wie erwartet abläuft.Zeile 16:ZeitbeschränkungSetzt einen Zeitrahmen (in Sekunden), innerhalb
dessen eine Reaktion erfolgen muss. In diesem Fall,
wird die Verbindung nach 300 Sekunden automatisch
geschlossen, wenn keine Aktivität zu
verzeichnen ist. Wenn Sie keinen Zeitrahmen festlegen
wollen, nach dessen Überschreiten die Verbindung
geschlossen wird, können Sie diesen Wert auf 0
setzen oder die Kommandozeilen-Option
verwenden.Zeile 17:ISPGibt die IP-Adresse für das Interface an.
Der String x.x.x.x sollte
durch die IP-Adresse ersetzt werden, die Ihnen Ihr
Provider zugeteilt hat. Der String
y.y.y.y sollte durch die
IP-Adresse ersetzt werden, die Ihr ISP als Gateway
angegeben hat (das ist der Rechner, mit dem Ihr Rechner
eine Verbindung aufbaut). Wenn Ihnen Ihr ISP keine
Gateway Adresse zur Verfügung gestellt hat,
verwenden Sie hier einfach 10.0.0.2/0. Wenn Sie
eine erratene IP-Adresse verwenden
müssen, sollten Sie in der Datei
/etc/ppp/ppp.linkup einen
entsprechenden Eintrag machen. Folgen Sie dazu den
Anweisungen im Abschnitt PPP und dynamische
IP-Adressen. Wenn diese Zeile ausgelassen
wird, kann ppp nicht im
Modus betrieben werden.Zeile 18:Fügt eine Defaultroute für das Gateway Ihres
Providers hinzu. Das Wort HISADDR wird
dabei durch die in Zeile 17 angegebene Gateway
Adresse ersetzt. Wichtig ist, dass diese Zeile nach
Zeile 17 erscheint, da andernfalls
HISADDR noch nicht initialisiert
ist.Wenn Sie ppp nicht im
Modus betreiben, sollte diese Zeile in die Datei
ppp.linkup
verschoben werden.Wenn Sie eine statische IP-Adresse verwenden und ppp im
Modus läuft, ist es nicht notwendig,
einen Eintrag in die Datei ppp.linkup
hinzuzufügen. In diesem Fall hat ihre Routingtabelle
bereits die richtigen Einträge, bevor Sie die Verbindung
aufbauen. Sie möchten aber vielleicht einen Eintrag
hinzufügen, um ein Programm aufzurufen, nachdem die
Verbindung aufgebaut ist. Dies wird weiter unten am Beispiel
von Sendmail erklärt.Beispiele für Konfigurationsdateien finden Sie
- im Verzeichnis /usr/share/examples/ppp/.PPP und dynamische IP-AdressenPPPmit dynamischen IP-AdressenIPCPWenn Ihnen Ihr ISP keine statische IP-Adresse zuteilt,
kann ppp so konfiguriert werden, dass die
lokale und die entfernte IP-Adresse beim Verbindungsaufbau
ausgehandelt werden. Dies geschieht, indem zunächst eine
IP-Adresse erraten wird, die von
ppp, unter Verwendung des IP
Configuration Protocol (IPCP) durch eine richtige ersetzt wird,
wenn die Verbindung aufgebaut ist. Die Konfiguration der Datei
ppp.conf entspricht derjenigen, die im
Abschnitt PPP und statische IP-
Adressen dargestellt wurde, jedoch mit folgender
Änderung:17 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255Auch hier dient die Zeilennummerierung lediglich der
besseren Übersichtlichkeit. Einrückungen, von
mindestens einem Leerzeichen, sind allerdings erforderlich.Zeile 17:Die Zahl nach dem / Zeichen,
gibt die Anzahl der Bits der Adresse an, auf die ppp
besteht. Sie möchten vielleicht andere IP-Adressen
verwenden, die oben angegebenen werden aber immer
funktionieren.Das letzte Argument (0.0.0.0) weist
PPP an, den Verbindungsaufbau mit der Adresse 0.0.0.0 zu beginnen, statt 10.0.0.1 zu verwenden. Dies ist bei
einigen ISPs notwendig. Verwenden Sie nicht
0.0.0.0
als erstes Argument für set ifaddr,
da so verhindert wird, dass
PPP im Modus eine initiale Route
setzt.Wenn PPP nicht im Modus läuft,
müssen Sie die Datei/etc/ppp/ppp.linkup
editieren. ppp.linkup kommt zum Einsatz, wenn
eine Verbindung aufgebaut worden ist. Zu diesem Zeitpunkt hat
ppp die Interface Adressen vergeben und es ist
möglich, die Einträge in der Routingtabelle
hinzuzufügen:1 provider:
2 add default HISADDRZeile 1:Beim Aufbau einer Verbindung sucht ppp
in der Datei ppp.linkup nach einem
Eintrag. PPP geht dabei nach folgenden Regeln vor:
Suche zunächst nach der gleichen Bezeichnung,
die wir auch in der Datei ppp.conf
verwendet haben. Falls das nicht
funktioniert, suche nach einem Eintrag der IP-Adresse unseres
Gateways. Dieser Eintrag ist eine Bezeichnung im Stil von
IP-Adressen, die sich aus vier Oktetts zusammensetzt. Falls
immer noch kein passender Eintrag gefunden wurde, suche nach
dem Eintrag MYADDR.Zeile 2:Diese Zeile weist ppp an, eine
Defaultroute zu verwenden, die auf HISADDR
zeigt. HISADDR wird nach der
Aushandlung mit IPCP durch die IP-Adresse des
Gateways ersetzt.Die Dateien
/usr/share/examples/ppp/ppp.conf.sample
und /usr/share/examples/ppp/ppp.linkup.sample
bieten detaillierte Beispiele für pmdemand
Einträge.Annahme eingehender AnrufePPPeingehende Anrufe annehmenWenn Sie ppp auf einem Rechner,
der in ein LAN eingebunden ist, so konfigurieren, dass eingehende
Anrufe angenommen werden, müssen Sie entscheiden,
ob Pakete an das LAN weitergeleitet werden sollen. Wenn Sie das
möchten, sollten Sie an die Gegenstelle eine IP-Adresse aus
Ihrem lokalen Subnetz vergeben und den Befehl
enable proxy
in die Datei /etc/ppp/ppp.conf einfügen.
Außerdem sollte die Datei /etc/rc.conf
Folgendes enthalten:gateway_enable="YES"Welches getty?Der Abschnitt Einwählverbindungen
bietet eine gute Beschreibung, wie Einwählverbindungen unter
Verwendung von &man.getty.8; genutzt werden können.Eine Alternative zu getty ist mgetty,
+ url="http://mgetty.greenie.net/">mgetty,
eine raffiniertere Version von getty, die mit
- Blick auf Einwählverbindungen entworfen wurde.
+ Blick auf Einwählverbindungen entworfen wurde. Sie
+ können dieses Paket über den Port comms/mgetty+sendfax
+ installieren.
Der Vorteil von mgetty ist,
dass es auf aktive Weise mit Modems spricht,
das heißt wenn ein Port in /etc/ttys
ausgeschaltet ist, wird Ihr Modem nicht auf Anrufe
reagieren.Spätere Versionen von mgetty (von
0.99beta aufwärts) unterstützen auch die automatische
Erkennung von PPP-Streams, was Ihren Clients den skriptlosen
Zugang zu Ihren Servern erlaubt.Der Abschnitt Mgetty und
AutoPPP bietet weitere Informationen zu
mgetty.PPP und RechteDer Befehl ppp muss normalerweise als
root ausgeführt werden. Wenn Sie
jedoch möchten, dass ppp im Server-Modus
auch von einem normalen Benutzer, wie unten beschrieben,
durch Aufruf von ppp
ausgeführt werden kann, müssen Sie
diesem Benutzer die Rechte erteilen, ppp
auszuführen, indem Sie ihn in der Datei
/etc/group der Gruppe
network hinzufügen.Sie werden ihm ebenfalls den Zugriff auf einen oder mehrere
Abschnitte der Konfigurationsdatei geben müssen, indem Sie
den allow Befehl verwenden:allow users fred maryWenn dieser Befehl im default
Abschnitt verwendet wird, erhalten die angegebenen Benutzer
vollständigen Zugriff.PPP-Shells für dynamische IP-AdressenPPP ShellsErzeugen Sie eine Datei mit dem Namen
/etc/ppp/ppp-shell, die Folgendes
enthält:#!/bin/sh
IDENT=`echo $0 | sed -e 's/^.*-\(.*\)$/\1/'`
CALLEDAS="$IDENT"
TTY=`tty`
if [ x$IDENT = xdialup ]; then
IDENT=`basename $TTY`
fi
echo "PPP for $CALLEDAS on $TTY"
echo "Starting PPP for $IDENT"
exec /usr/sbin/ppp -direct $IDENTDieses Skript sollte ausführbar sein. Nun
erzeugen Sie einen symbolischen Link
ppp-dialup auf dieses Skript
mit folgendem Befehl:&prompt.root; ln -s ppp-shell /etc/ppp/ppp-dialupSie sollten dieses Skript als
Shell für alle Benutzer von
Einwählverbindungen verwenden. Dies ist ein Beispiel
aus der Datei /etc/passwd
für einen Benutzer namens pchilds,
der PPP für Einwählverbindungen verwenden kann
(Denken Sie daran, die Passwortdatei nicht direkt zu
editieren, sondern dafür &man.vipw.8; zu
verwenden).pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialupErstellen Sie ein Verzeichnis /home/ppp, das von allen Benutzern
- gelesen werden kann und die folgenden leeren Dateien
+ gelesen werden kann und die folgenden leeren Dateien
enthält:-r--r--r-- 1 root wheel 0 May 27 02:23 .hushlogin
-r--r--r-- 1 root wheel 0 May 27 02:22 .rhostsDies verhindert, dass /etc/motd
angezeigt wird.PPP-Shells für statische IP-AdressenPPP ShellsErstellen Sie die Datei ppp-shell
wie oben oben dargestellt. Erzeugen Sie nun für
jeden Account mit statischer IP-Adresse einen symbolischen
Link auf ppp-shell.Wenn Sie beispielsweise die drei Kunden,
fred, sam und
mary haben, für die Sie
CIDR-/24-Netzwerke routen, schreiben Sie Folgendes:&prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-fred
&prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-sam
&prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-maryJeder Einwählzugang dieser Kunden sollte den
oben erzeugten symbolischen Link als Shell haben
(mary's Shell
sollte also /etc/ppp/ppp-mary sein).Einrichten von ppp.conf für
dynamische IP-AdressenDie Datei /etc/ppp/ppp.conf sollte in
etwa wie folgt aussehen:default:
set debug phase lcp chat
set timeout 0
-ttyd0:
+ttyu0:
set ifaddr 203.14.100.1 203.14.100.20 255.255.255.255
enable proxy
-ttyd1:
+ttyu1:
set ifaddr 203.14.100.1 203.14.100.21 255.255.255.255
enable proxyDie Einrückungen sind wichtig.Der Abschnitt default: wird für
jede Sitzung geladen. Erstellen Sie für jede
Einwählverbindung, die Sie in der Datei
/etc/ttys ermöglicht haben, einen
- Eintrag, wie oben für ttyd0: gezeigt.
+ Eintrag, wie oben für ttyu0: gezeigt.
Jede Verbindung sollte eine eigene IP-Adresse aus dem Pool
der Adressen bekommen, die sie für diese Benutzergruppe
reserviert haben.Einrichten von ppp.conf für
statische IP-AdressenZu dem bisher dargestellten Inhalt der Beispieldatei
/usr/share/examples/ppp/ppp.conf sollten
Sie einen Abschnitt für jeden Benutzer mit statisch
zugewiesener IP-Adresse hinzufügen. Wir werden nun
unser Beispiel mit den
Accounts fred, sam und
mary weiterführen.fred:
set ifaddr 203.14.100.1 203.14.101.1 255.255.255.255
sam:
set ifaddr 203.14.100.1 203.14.102.1 255.255.255.255
mary:
set ifaddr 203.14.100.1 203.14.103.1 255.255.255.255Die Datei /etc/ppp/ppp.linkup sollte,
falls erforderlich, ebenfalls Routinginformationen für
jeden Benutzer mit statischer IP-Adresse enthalten. Die unten
dargestellte Zeile würde dem Netzwerk 203.14.101.0/24 eine Route über die
PPP-Verbindung des Client hinzufügen.fred:
add 203.14.101.0 netmask 255.255.255.0 HISADDR
sam:
add 203.14.102.0 netmask 255.255.255.0 HISADDR
mary:
add 203.14.103.0 netmask 255.255.255.0 HISADDRmgetty und AutoPPPmgettyAutoPPPLCP
- Wird mgetty mit der Option
- AUTO_PPP konfiguriert und kompiliert,
- kann mgetty die LCP Phase von PPP-Verbindungen
+ In der Voreinstellung wird mgetty
+ mit der Option AUTO_PPP konfiguriert
+ und kompiliert. Dadurch kann mgetty
+ die LCP Phase von PPP-Verbindungen
erkennen und automatisch eine ppp-Shell starten.
Da hierbei jedoch die Login/Passwort-Sequenz nicht
durchlaufen wird, ist es notwendig, Benutzer durch PAP
oder CHAP zu authentifizieren.In diesem Abschnitt wird davon ausgegangen, dass der
- Benutzer eine Version von mgetty mit
- der Option AUTO_PPP (v0.99beta oder
- neuer) erfolgreich konfiguriert, kompiliert und
- installiert hat.
+ Benutzer den Port comms/mgetty+sendfax auf seinem
+ System kompiliert und installiert hat.Stellen Sie sicher, dass die Datei
/usr/local/etc/mgetty+sendfax/login.config
Folgendes enthält:/AutoPPP/ - - /etc/ppp/ppp-pap-dialupHierdurch wird mgetty angewiesen,
das Skript ppp-pap-dialup für
die erkannten PPP-Verbindungen auszuführen.Erstellen Sie nun die Datei
/etc/ppp/ppp-pap-dialup mit folgendem
Inhalt (die Datei sollte ausführbar sein):#!/bin/sh
exec /usr/sbin/ppp -direct pap$IDENTErstellen Sie bitte für jede Einwählverbindung,
die Sie in /etc/ttys ermöglicht haben,
einen korrespondierenden Eintrag in der Datei
/etc/ppp/ppp.conf. Diese
Einträge können problemlos, mit den Definitionen
die wir weiter oben gemacht haben, koexistieren.pap:
enable pap
set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
enable proxyJeder Benutzer, der sich auf diese Weise anmeldet,
benötigt einen Benutzernamen und ein Passwort in der Datei
/etc/ppp/ppp.secret. Sie haben auch die
Möglichkeit, Benutzer mit Hilfe von PAP zu authentifizieren,
indem Sie der Datei /etc/passwd folgende
Option hinzufügen:enable passwdauthWenn Sie bestimmten Benutzern eine statische IP-Adresse
zuweisen möchten, können Sie diese als drittes
Argument in der Datei
/etc/ppp/ppp.secret angeben. In
/usr/share/examples/ppp/ppp.secret.sample
finden Sie hierfür Beispiele.MS-ErweiterungenDNSNetBIOSPPPErweiterungen von MicrosoftEs ist möglich PPP so zu konfigurieren, dass bei Bedarf
DNS und NetBIOS Nameserveradressen bereitgestellt werden.Um diese Erweiterungen für die PPP Version 1.x
zu aktivieren, sollte der entsprechende Abschnitt der Datei
/etc/ppp/ppp.conf um folgende Zeilen
ergänzt werden:enable msext
set ns 203.14.100.1 203.14.100.2
set nbns 203.14.100.5Für PPP Version 2 und höher:accept dns
set dns 203.14.100.1 203.14.100.2
set nbns 203.14.100.5Damit werden den Clients die primären und sekundären
Nameserveradressen sowie ein NetBIOS Nameserver-Host
mitgeteilt.In Version 2 und höher verwendet PPP die Werte, die
in /etc/resolv.conf zu finden sind, wenn
die Zeile set dns weggelassen wird.Authentifizierung durch PAP und CHAPPAPCHAPEinige ISPs haben ihr System so eingerichtet, dass der
Authentifizierungsteil eines Verbindungsaufbaus mit Hilfe von
PAP oder CHAP-Mechanismen durchgeführt wird. Wenn dies bei
Ihnen der Fall sein sollte, wird Ihnen Ihr ISP bei der Verbindung
keinen login:-Prompt präsentieren,
sondern sofort mit der Aushandlung der PPP-Verbindung
beginnen.PAP ist nicht so sicher wie CHAP, doch die Sicherheit ist
hierbei normalerweise kein Problem, da Passwörter, obgleich
von PAP im Klartext versandt, lediglich über die
serielle Verbindung verschickt werden. Es gibt für Cracker
wenig Möglichkeiten zu lauschen.Zurückkommend auf die Abschnitte
PPP und statische
IP-Adressen oder PPP und dynamische IP-Adressen
müssen folgende Veränderungen vorgenommen werden:13 set authname MyUserName
14 set authkey MyPassword
15 set loginZeile 13:Diese Zeile legt Ihren PAP/CHAP Benutzernamen fest.
Sie müssen den richtigen Wert für
MyUserName eingeben.Zeile 14:PasswortDiese Zeile legt Ihr PAP/CHAP Passwort fest. Sie
müssen den richtigen Wert für
MyPassword eingeben.
Sie können eine zusätzliche Zeile, wie etwa:16 accept PAPoder16 accept CHAPverwenden, um deutlich zu machen, dass dies
beabsichtigt ist, aber sowohl PAP wie auch CHAP als
standardmäßig akzeptiert werden.Zeile 15:Ihr ISP wird normalerweise nicht von Ihnen verlangen,
dass Sie sich am Server einloggen, wenn Sie PAP oder CHAP
verwenden. Sie müssen deshalb den String
set login deaktivieren.Veränderung Ihrer ppp
Konfiguration im laufenden BetriebEs ist möglich, dem Programm ppp
Befehle zu erteilen, während es im Hintergrund läuft.
Dazu ist jedoch die Einrichtung eines passenden Diagnose-Ports
erforderlich. Ergänzen Sie hierzu Ihre Konfigurationsdatei
um folgende Zeile:set server /var/run/ppp-tun%d DiagnosticPassword 0177Damit wird PPP angewiesen, auf den angegebenen
UNIX-Domainsocket zu hören und Clients nach dem angegebenen
Passwort zu fragen, bevor der Zugang Gewährt wird. Das
%d wird durch die Nummer des benutzten
tun-Devices ersetzt.Wenn ein Socket eingerichtet ist, kann das Programm
&man.pppctl.8; in Skripten verwendet werden, mit denen in das
laufende Programm eingegriffen wird.Interne NAT von PPP benutzenPPPNATPPP kann Network Address Translation (NAT) ohne Hilfe des
Kernels durchführen. Wenn Sie diese Funktion benutzen
wollen, fügen Sie die folgende Zeile in
/etc/ppp/ppp.conf ein:nat enable yesSie können NAT mit der Option
auf der Kommandozeile von PPP aktivieren. Weiterhin kann
NAT in /etc/rc.conf mit der Variablen
ppp_nat aktiviert werden. Dies ist auch die
Voreinstellung.Die nachstehende /etc/ppp/ppp.conf
benutzt NAT für bestimmte eingehende Verbindungen:nat port tcp 10.0.0.2:ftp ftp
nat port tcp 10.0.0.2:http httpWenn Sie Verbindungen von außen überhaupt nicht
trauen, benutzen Sie die folgende Zeile:nat deny_incoming yesAbschließende SystemkonfigurationPPPKonfigurationSie haben ppp nun konfiguriert,
aber bevor PPP eingesetzt werden kann, gibt noch einige
weitere Dinge zu erledigen, die alle die Bearbeitung der
Datei /etc/rc.conf erfordern.Gehen Sie diese Datei von oben nach unten durch, und stellen Sie
als Erstes sicher, dass die Zeile hostname=
vorhanden ist:hostname="foo.example.com"Wenn Ihnen Ihr ISP eine statische IP-Adresse und einen Namen
zugewiesen hat, ist es wahrscheinlich am besten, wenn Sie diesen
Namen als Hostnamen verwenden.Schauen Sie nach der Variable
network_interfaces. Wenn Sie Ihr System
so konfigurieren möchten, dass bei Bedarf
eine Verbindung zu Ihrem ISP aufgebaut wird, sollten Sie das Device
tun0 zu der Liste hinzufügen oder es
andernfalls entfernen.network_interfaces="lo0 tun0"
ifconfig_tun0=Die Variable ifconfig_tun0 sollte leer sein
und eine Datei namens /etc/start_if.tun0 sollte
erstellt werden. Diese Datei sollte die nachfolgende Zeile
enthalten:ppp -auto mysystemDieses Skript startet Ihren ppp-Dæmon im Automatik-Modus.
Es wird bei der Netzwerkkonfiguration ausgeführt.
Wenn Ihr Rechner als Gateway für ein LAN fungiert,
möchten Sie vielleicht auch die Option
verwenden. In der Manual-Seite sind
weitere Einzelheiten hierzu zu finden.Stellen Sie sicher, dass der Start eines Routerprogramms
in /etc/rc.conf wie folgt deaktiviert
ist:router_enable="NO"routedEs ist wichtig, dass der routed
Dæmon nicht gestartet wird da routed
dazu tendiert, die von ppp erstellten
Einträge der Standardroute zu überschreiben.Es ist außerdem sinnvoll, darauf zu achten, dass die Zeile
sendmail_flags nicht die Option
enthält, da sendmail sonst ab und zu
die Netzwerkverbindung prüfen wird, was möglicherweise dazu
führt, dass sich Ihr Rechner einwählt. Sie können
hier Folgendes angeben:sendmail_flags="-bd"sendmailDer Nachteil dieser Lösung ist, dass Sie
sendmail nach jedem Aufbau einer
ppp-Verbindung auffordern müssen, die Mailwarteschlange
zu überprüfen, indem Sie Folgendes eingeben:&prompt.root; /usr/sbin/sendmail -qVielleicht möchten Sie den Befehl !bg
in der Datei ppp.linkup verwenden, um dies
zu automatisieren:1 provider:
2 delete ALL
3 add 0 0 HISADDR
4 !bg sendmail -bd -q30mSMTPWenn Sie dies nicht möchten, ist es möglich,
einen dfilter einzusetzen, um SMTP-Verkehr
zu blockieren. Weitere Einzelheiten hierzu finden Sie in den
Beispieldateien.Das Einzige, was nun noch zu tun bleibt, ist Ihren Rechner neu
zu starten. Nach dem Neustart können Sie entweder:&prompt.root; pppund danach dial provider eingeben,
um eine PPP-Sitzung zu starten, oder Sie geben:&prompt.root; ppp -auto providerein, um ppp bei Datenverkehr aus Ihrem
Netzwerk heraus, automatisch eine Verbindung herstellen
zu lassen (vorausgesetzt Sie haben kein
start_if.tun0 Skript erstellt).ZusammenfassungDie folgenden Schritte sind nötig, wenn ppp zum ersten Mal
eingerichtet werden soll:Clientseite:Stellen Sie sicher, dass das
tun Device in den Kernel
eingebaut ist.Vergewissern Sie sich, dass die Gerätedatei tunN
- im Verzeichnis /dev vorhanden ist.Bearbeiten Sie die Datei
/etc/ppp/ppp.conf. Das Beispiel
pmdemand sollte für die meisten
ISP ausreichen.Wenn Sie eine dynamische IP-Adresse haben, erstellen Sie
einen Eintrag in der Datei
/etc/ppp/ppp.linkup.Aktualisieren Sie die Datei
/etc/rc.conf.Erstellen Sie das Skript start_if.tun0,
wenn Sie einen bedarfgesteuerten Einwahlprozess
(demand dialing)
benötigen.Serverseite:Stellen Sie sicher, dass das
tun Device in den Kernel
eingebaut ist.Vergewissern Sie sich, dass die Gerätedatei
tunN
im Verzeichnis /dev vorhanden istErstellen Sie einen Eintrag in der Datei
/etc/passwd
(verwenden Sie dazu das Programm &man.vipw.8;).Erstellen Sie ein Profil im Heimatverzeichnis des
Benutzers, das
ppp -direct direct-server o.Ä.
ausführt.Bearbeiten Sie die Datei
/etc/ppp/ppp.conf. Das Beispiel
direct-server sollte ausreichen.Erzeugen Sie einen Eintrag in
/etc/ppp/ppp.linkup.Aktualisieren Sie die Datei
/etc/rc.conf.Gennady B.SorokopudTeile wurden ursprünglich beigetragen von RobertHuffKernel-PPP
+
+ Der folgende Abschnitt ist ausschließlich
+ für &os; 7.X relevant und gültig.
+
+
Einrichtung von Kernel-PPPPPPKernel-PPPBevor Sie PPP auf Ihrem Computer einrichten, sollten Sie
dafür sorgen, dass pppd im Verzeichnis /usr/sbin vorhanden ist und /etc/ppp existiert.pppd kann auf zweierlei Weise arbeiten:Als Client – Sie möchten
Ihren Rechner mit einem Netz verbinden, indem Sie eine
serielle PPP-Verbindung aufbauen.PPPServerAls Server – Ihr Rechner ist in
ein Netzwerk eingebunden und stellt die PPP-Verbindung
für andere Rechner im Netzwerk her.In beiden Fällen werden Sie eine Datei mit den
benötigten Optionen erstellen müssen
(/etc/ppp/options oder,
wenn mehr als ein Benutzer PPP verwendet,
~/.ppprc).Sie benötigen außerdem eine Software
(vorzugsweise comms/kermit), mit der
Sie seriell per Modem wählen und eine Verbindung zu dem
entfernten Host aufbauen können.TrevRoydhouseBasierend auf Informationen von Verwendung von pppd als ClientPPPClientCiscoDie folgende Datei /etc/ppp/options
kann für einen Verbindungsaufbau mit PPP zu einem Cisco
Terminalserver verwendet werden.crtscts # enable hardware flow control
modem # modem control line
noipdefault # remote PPP server must supply your IP address
# if the remote host does not send your IP during IPCP
# negotiation, remove this option
passive # wait for LCP packets
domain ppp.foo.com # put your domain name here
:remote_ip # put the IP of remote PPP host here
# it will be used to route packets via PPP link
# if you didn't specified the noipdefault option
# change this line to local_ip:remote_ip
defaultroute # put this if you want that PPP server will be your
# default routerUm eine Verbindung herzustellen, sollten Sie:KermitModemMit Kermit (oder einem
anderen Modemprogramm) den entfernten Host anwählen
und Ihren Benutzernamen sowie Ihr Passwort (oder was
sonst nötig ist, um PPP auf dem entfernten Host
zu aktivieren) eingeben.Kermit beenden
(ohne die Verbindung abzubrechen).Folgendes eingeben:&prompt.root; /usr/sbin/pppd /dev/tty0119200Achten Sie darauf, dass sie eine geeignete Geschwindigkeit
wählen und das richtige Device verwenden.Nun ist Ihr Computer mit Hilfe von PPP verbunden. Wenn
die Verbindung nicht funktionieren sollte, können Sie
die Option in die Datei
/etc/ppp/options eintragen und die Ausgaben
auf der Konsole beobachten, um die Fehler zu finden.Das folgende Skript /etc/ppp/pppup
führt alle 3 Schritte automatisch aus:#!/bin/sh
pgrep -l pppd
pid=`pgrep pppd`
if [ "X${pid}" != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
ifconfig ppp0 down
ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.dial
pppd /dev/tty01 19200Kermit/etc/ppp/kermit.dial ist
ein Kermit-Skript
das den Einwählvorgang und alle notwendigen Autorisationen auf
dem entfernten Host durchführt (ein Beispiel für ein
solches Skript ist im Anhang zu diesem Dokument zu finden).Verwenden Sie das folgende Skript
/etc/ppp/pppdown, um die PPP-Verbindung
abzubrechen:#!/bin/sh
pid=`pgrep pppd`
if [ X${pid} != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill -TERM ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
/sbin/ifconfig ppp0 down
/sbin/ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.hup
/etc/ppp/ppptestPrüfen Sie, ob pppd immer
noch läuft, indem Sie
/usr/etc/ppp/ppptest ausführen.
Dieses Skript sollte folgendermaßen aussehen:#!/bin/sh
pid=`pgrep pppd`
if [ X${pid} != "X" ] ; then
echo 'pppd running: PID=' ${pid-NONE}
else
echo 'No pppd running.'
fi
set -x
netstat -n -I ppp0
ifconfig ppp0Um die Modemverbindung abzubrechen, können Sie das Skript
/etc/ppp/kermit.hup verwenden, das Folgendes
enthalten sollte:set line /dev/tty01 ; put your modem device here
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
pau 1
out +++
inp 5 OK
out ATH0\13
echo \13
exitHier ist eine alternative Methode, bei der chat
an Stelle von Kermit eingesetzt wird:Die folgenden beiden Dateien reichen aus, um eine
Verbindung über pppd herzustellen./etc/ppp/options:/dev/cuad1 115200
crtscts # enable hardware flow control
modem # modem control line
connect "/usr/bin/chat -f /etc/ppp/login.chat.script"
noipdefault # remote PPP serve must supply your IP address
# if the remote host doesn't send your IP during
# IPCP negotiation, remove this option
passive # wait for LCP packets
domain <your.domain> # put your domain name here
: # put the IP of remote PPP host here
# it will be used to route packets via PPP link
# if you didn't specified the noipdefault option
# change this line to local_ip:remote_ip;
defaultroute # put this if you want that PPP server will be
# your default router/etc/ppp/login.chat.script:Die folgenden Angaben sollten in einer Zeile stehen.ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDTphone.number
CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: login-id
TIMEOUT 5 sword: passwordWenn diese Dateien richtig installiert und modifiziert sind,
müssen Sie pppd, nur noch wie folgt
starten:&prompt.root; pppdVerwendung von pppd als Server/etc/ppp/options sollte etwa Folgendes
enthalten:crtscts # Hardware flow control
netmask 255.255.255.0 # netmask (not required)
192.114.208.20:192.114.208.165 # IP's of local and remote hosts
# local ip must be different from one
# you assigned to the Ethernet (or other)
# interface on your machine.
# remote IP is IP address that will be
# assigned to the remote machine
domain ppp.foo.com # your domain
passive # wait for LCP
modem # modem lineDas folgende Skript /etc/ppp/pppserv
lässt pppd als Server zu arbeiten:#!/bin/sh
pgrep -l pppd
pid=`pgrep pppd`
if [ "X${pid}" != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
# reset ppp interface
ifconfig ppp0 down
ifconfig ppp0 delete
# enable autoanswer mode
kermit -y /etc/ppp/kermit.ans
# run ppp
pppd /dev/tty01 19200Verwenden Sie das Skript/etc/ppp/pppservdown,
um den Server zu beenden:#!/bin/sh
pgrep -l pppd
pid=`pgrep pppd`
if [ "X${pid}" != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
ifconfig ppp0 down
ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.noansMit dem Kermit-Skript
(/etc/ppp/kermit.ans) lässt sich
die Funktion Ihres Modems, automatisch zu antworten, ein- bzw.
ausschalten. Es sollte folgendermaßen aussehen:set line /dev/tty01
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
pau 1
out +++
inp 5 OK
out ATH0\13
inp 5 OK
echo \13
out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable
; autoanswer mode
inp 5 OK
echo \13
exitEin Skript namens /etc/ppp/kermit.dial wird
für die Einwahl und Authentifizierung am entfernten Host verwendet.
Sie müssen es noch an Ihre lokalen Gegebenheiten anpassen.
Geben Sie in diesem Skript Ihren Benutzernamen und Ihr Passwort ein.
In Abhängigkeit von der Reaktion Ihres Modems und des
entfernten Hosts, werden Sie auch noch die input
Anweisungen verändern müssen.;
; put the com line attached to the modem here:
;
set line /dev/tty01
;
; put the modem speed here:
;
set speed 19200
set file type binary ; full 8 bit file xfer
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
set modem hayes
set dial hangup off
set carrier auto ; Then SET CARRIER if necessary,
set dial display on ; Then SET DIAL if necessary,
set input echo on
set input timeout proceed
set input case ignore
def \%x 0 ; login prompt counter
goto slhup
:slcmd ; put the modem in command mode
echo Put the modem in command mode.
clear ; Clear unread characters from input buffer
pause 1
output +++ ; hayes escape sequence
input 1 OK\13\10 ; wait for OK
if success goto slhup
output \13
pause 1
output at\13
input 1 OK\13\10
if fail goto slcmd ; if modem doesn't answer OK, try again
:slhup ; hang up the phone
clear ; Clear unread characters from input buffer
pause 1
echo Hanging up the phone.
output ath0\13 ; hayes command for on hook
input 2 OK\13\10
if fail goto slcmd ; if no OK answer, put modem in command mode
:sldial ; dial the number
pause 1
echo Dialing.
output atdt9,550311\13\10 ; put phone number here
assign \%x 0 ; zero the time counter
:look
clear ; Clear unread characters from input buffer
increment \%x ; Count the seconds
input 1 {CONNECT }
if success goto sllogin
reinput 1 {NO CARRIER\13\10}
if success goto sldial
reinput 1 {NO DIALTONE\13\10}
if success goto slnodial
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 60 goto look
else goto slhup
:sllogin ; login
assign \%x 0 ; zero the time counter
pause 1
echo Looking for login prompt.
:slloop
increment \%x ; Count the seconds
clear ; Clear unread characters from input buffer
output \13
;
; put your expected login prompt here:
;
input 1 {Username: }
if success goto sluid
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 10 goto slloop ; try 10 times to get a login prompt
else goto slhup ; hang up and start again if 10 failures
:sluid
;
; put your userid here:
;
output ppp-login\13
input 1 {Password: }
;
; put your password here:
;
output ppp-password\13
input 1 {Entering SLIP mode.}
echo
quit
:slnodial
echo \7No dialtone. Check the telephone line!\7
exit 1
; local variables:
; mode: csh
; comment-start: "; "
; comment-start-skip: "; "
; end:TomRhodesBeigetragen von
-
Probleme bei PPP-VerbindungenPPPFehlersuche
+
+ Mit &os; 8.0 wurde der &man.sio.4;-Treiber durch den
+ Treiber &man.uart.4; ersetzt. Parallel dazu wurden auch die
+ entsprechenden Gerätedateien für die seriellen Ports
+ umbenannt:
+ /dev/cuadN wurde
+ zu /dev/cuauN,
+ /dev/ttydN zu
+ /dev/ttyuN.
+ Verwenden Sie noch &os; 7.X, müssen Sie dies beim
+ Lesen der folgenden Abschnitte berücksichtigen.
+
+
Dieser Abschnitt behandelt Probleme, die auftauchen
können, wenn PPP über ein Modem verwendet wird.
Sie müssen beispielsweise genau die Eingabeaufforderung
des Systems kennen, in das Sie sich einwählen.
Einige ISPs verwenden ssword
andere verwenden password; wenn
das Einwahlskript falsch ist, scheitert die Anmeldung.
Üblicherweise suchen Sie nach Fehlern der PPP-Verbindung
indem Sie sich manuell verbinden. Wie das genau geht,
wird im Folgenden gezeigt.Gerätedateien überprüfenWenn Sie einen eigenen Kernel verwenden, stellen Sie sicher, dass
- die folgende Zeile in der Kernelkonfigurationsdatei vorhanden
+ die folgende Zeile in der Kernelkonfigurationsdatei vorhanden
ist:
-
- device sio
-
- Das sio-Gerät ist bereits
+
+ device uart
+
+ Das uart-Gerät ist bereits
im GENERIC-Kernel vorhanden, deshalb sind in
diesem Fall keine zusätzlichen Schritte vonnöten.
Kontrollieren Sie die Ausgabe von dmesg:
- &prompt.root; dmesg | grep sio
+ &prompt.root; dmesg | grep uartIn der Ausgabe sollten die entsprechenden
- sio-Geräte, beispielsweise
- sio1
+ uart-Geräte, beispielsweise
+ uart1
(COM2), angezeigt werden.
Wird ein passendes Gerät angezeigt, brauchen Sie
keinen neuen Kernel zu erstellen. Wenn Ihr Modem an
- sio1
+ uart1
angeschlossen ist (in DOS ist dieser Anschluss als
COM2 bekannt), ist /dev/cuad1 die dazugehörende
+ class="devicefile">/dev/cuau1 die dazugehörende
Gerätedatei.Manuelle VerbindungenEin Verbindungsaufbau zum Internet durch manuelle Steuerung
von ppp geht schnell, ist einfach und
stellt einen guten Weg dar, eine Verbindung auf Fehler hin
zu überprüfen oder einfach Informationen darüber
zu sammeln, wie Ihr ISP Verbindungen handhabt.
Lassen Sie uns PPP von der
Kommandozeile aus starten. Beachten Sie, dass in allen
Beispielen example
der Hostname der Maschine ist, auf der
PPP läuft. Sie starten
ppp, indem Sie einfach ppp
eingeben:&prompt.root; pppWir haben ppp nun gestartet.
- ppp ON example> set device /dev/cuad1
+ ppp ON example> set device /dev/cuau1Wir geben das Device an, an das unser Modem angeschlossen ist.
- In diesem Fall ist es cuad1.
+ In diesem Fall ist es cuau1.
ppp ON example> set speed 115200Wir geben die Verbindungsgeschwindigkeit an. Im Beispiel
verwenden wir 115200 kbpsppp ON example> enable dnsWir weisen ppp an, unseren
Resolver zu konfigurieren und in der Datei
/etc/resolv.conf Einträge für
den Nameserver hinzuzufügen. Falls ppp
unseren Hostnamen nicht bestimmen kann, geben wir diesen
später manuell an.ppp ON example> termWir wechseln in den Terminal-Modus, um
das Modem manuell kontrollieren zu können.
- deflink: Entering terminal mode on /dev/cuad1
+ deflink: Entering terminal mode on /dev/cuau1
type '~h' for helpat
OK
atdt123456789Sie verwenden at zur Initialisierung
Ihres Modems und dann atdt sowie die Nummer Ihres
ISP, um den Einwählprozess zu starten.CONNECTDies ist die Bestätigung, dass eine Verbindung aufgebaut
wurde. Falls wir Verbindungsprobleme bekommen, die nicht
mit der Hardware zusammenhängen, werden wir an dieser
Stelle ansetzen müssen, um eine Lösung zu finden.ISP Login:myusernameHier werden Sie nach einem Benutzernamen gefragt. Geben Sie
am Prompt den Namen ein, den Ihnen Ihr ISP
zur Verfügung gestellt hat.ISP Pass:mypasswordAn dieser Stelle müssen Sie das Passwort angeben, das
Ihnen von Ihrem ISP vorgegeben wurde. Das
Passwort wird, analog dem normalen Anmeldevorgang,
nicht angezeigt.Shell or PPP:pppAbhängig von Ihrem ISP, kann es sein,
dass dieser Prompt bei Ihnen gar nicht erscheint. Wir werden
hier gefragt, ob wir eine Shell beim Provider verwenden oder
ppp starten wollen. Weil wir eine
Internetverbindung aufbauen wollen, haben wir uns in diesem
Beispiel für ppp entschieden.Ppp ON example>Beachten Sie, dass sich in diesem Beispiel das erste
in einen Großbuchstaben verwandelt hat.
Dies zeigt, dass wir erfolgreich eine Verbindung
zu unserem ISP hergestellt haben.PPp ON example>An dieser Stelle haben wir uns erfolgreich bei unserem
ISP authentifiziert und warten darauf, dass
uns eine IP-Adresse zugewiesen wird.PPP ON example>Wir haben uns mit der Gegenstelle auf eine
IP-Adresse geeinigt und den Verbindungsaufbau
erfolgreich abgeschlossenPPP ON example> add default HISADDRHier geben wir unsere Standardroute an. Weil zu diesem
Zeitpunkt unsere einzige Verbindung zu unserer Gegenstelle besteht,
müssen wir dies tun, bevor wir Kontakt zu unserer Umwelt
aufnehmen können. Falls dies aufgrund bestehender Routen
nicht funktionieren sollte, können Sie ein Ausrufungszeichen
! vor setzen.
Sie können diese Standardroute aber auch vor dem
eigentlichen Verbindungsaufbau angeben und
PPP wird entsprechend eine neue Route
aushandeln.Wenn alles gut ging, sollten wir nun eine aktive
Internetverbindung haben, die wir mit
Ctrlz
in den Hintergrund schicken können
Wenn sie feststellen, dass PPP wieder zu
ppp wird, ist die Verbindung abgebrochen.
Es ist gut dies zu wissen, weil dadurch der Verbindungsstatus
angezeigt wird. Große Ps zeigen an,
dass wir eine Verbindung zum ISP haben und
kleine ps zeigen an, dass
wir aus irgendeinem Grund die Verbindung verloren haben.
ppp hat nur diese beiden Zustände.FehlersucheWenn sie einen Direktanschluss haben und keine Verbindung
aufbauen können, schalten Sie die Hardware-Flusssteuerung
CTS/RTS aus, indem Sie die Option
verwenden. Dies ist
zumeist dann der Fall, wenn Sie mit einem
PPP-fähigen Terminalserver
verbunden sind. Hier bleibt PPP
bei dem Versuch hängen, Daten über Ihre
Nachrichtenverbindung zu schicken, weil auf ein
CTS-Signal (Clear-to-Send) gewartet
wird, das nie kommt. Wenn Sie diese Option jedoch gebrauchen,
sollten Sie auch die Option
verwenden, die erforderlich sein kann, um bestimmte Hardware
zu kontrollieren, die auf die Übertragung bestimmter
Zeichen zwischen den Kommunikations-Endpunkten (zumeist
XON/XOFF) angewiesen ist. Die Manual-Seite &man.ppp.8;
bietet mehr Informationen zu dieser Option und ihrer
Verwendung.Wenn Sie ein älteres Modem haben, benötigen Sie
vielleicht die Option .
Standardmäßig wird keine Parität vorausgesetzt,
sie ist aber für die Fehlerprüfung bei älteren
Modems und bei bestimmten ISPs erforderlich.
Sie könnten diese Option für den
ISP Compuserve benötigen.PPP kehrt möglicherweise
nicht in den Befehlsmodus zurück, was normalerweise
auf einen Fehler bei der Aushandlung hinweist, wobei der
ISP wartet, dass Ihre Seite den
Aushandlungsprozess beginnt. Die Option ~p
erzwingt in diesem Fall den Beginn des
Aushandlungsprozesses.Wenn Sie nie einen Login-Prompt erhalten, müssen
Sie statt des im Beispiel gezeigten UNIX-Stils höchst
wahrscheinlich PAP oder
CHAP für die Authentifizierung
verwenden. Um PAP oder
CHAP zu verwenden, ergänzen Sie
PPP einfach um folgende Optionen,
bevor Sie in den Terminalmodus wechseln:ppp ON example> set authname myusernameHierbei sollte myusername
durch den Benutzernamen ersetzt werden, den Sie von Ihrem
ISP bekommen haben.ppp ON example> set authkey mypasswordmypassword sollten Sie
durch das Passwort ersetzen, das Ihnen Ihr ISP
gegeben hat.Wenn die Verbindung aufgebaut wird, Sie aber keine Rechner
unter ihrem Domänen-Namen erreichen können, versuchen
Sie, einen Rechner mit &man.ping.8; und seiner
IP-Adresse zu erreichen. Wenn 100% der Pakete
verloren gehen, ist es sehr wahrscheinlich, dass Ihnen
keine Standardroute zugewiesen wurde. Überprüfen Sie,
ob während des Verbindungsaufbaus die Option
gesetzt war. Wenn Sie zu
einer entfernten IP-Adresse eine Verbindung
aufbauen können, ist es möglich, dass die
Adresse eines Nameservers nicht in die Datei
/etc/resolv.conf eingetragen
wurde. Diese Datei sollte folgendermaßen aussehen:domain example.com
nameserver x.x.x.x
nameserver y.y.y.y Dabei sollten x.x.x.x und
y.y.y.y durch die
IP-Adressen der DNS-Server Ihres
ISPs ersetzt werden. Diese Information
ist Ihnen bei Vertragsabschluss mitgeteilt worden. Wenn
nicht, sollte ein Anruf bei Ihrem ISP
Abhilfe schaffen.Mit &man.syslog.3; können Sie Ihre
PPP-Verbindung protokollieren.
Fügen Sie einfach die folgende Zeile in
/etc/syslog.conf ein:!ppp
*.* /var/log/ppp.logIn den meisten Fällen existiert diese
Funktionalität bereits.JimMockBeigetragen (durch http://node.to/freebsd/how-tos/how-to-freebsd-pppoe.html) von PPP over Ethernet (PPPoE)PPPover EthernetPPPoEPPP, over EthernetDieser Abschnitt beschreibt, wie Sie PPP over Ethernet
(PPPoE) einrichten.Konfiguration des KernelsEine besondere Kernelkonfiguration ist für PPPoE nicht
mehr erforderlich. Sofern die notwendige NetGraph-Unterstützung
nicht in den Kernel eingebaut wurde, wird diese von
ppp dynamisch geladen.Einrichtung von ppp.confDies hier ist ein Beispiel einer funktionierenden
ppp.conf:default:
set log Phase tun command # you can add more detailed logging if you wish
set ifaddr 10.0.0.1/0 10.0.0.2/0
name_of_service_provider:
set device PPPoE:xl1 # replace xl1 with your Ethernet device
set authname YOURLOGINNAME
set authkey YOURPASSWORD
set dial
set login
add default HISADDRppp ausführenAls root, geben Sie ein:&prompt.root; ppp -ddial name_of_service_providerppp beim Systemstart
ausführenFügen Sie Folgendes in Ihre Datei
/etc/rc.conf ein:ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO
ppp_profile="name_of_service_provider"Verwendung einer PPPoE-Dienstbezeichnung (service tag)Manchmal kann es notwendig sein, eine Dienstbezeichnung
(service tag) zu verwenden, um
eine Verbindung aufzubauen.
Dienstbezeichnungen werden eingesetzt, um zwischen verschiedenen
PPPoE-Servern unterscheiden zu können, die einem
bestehenden Netzwerk zugeteilt sind.Die erforderlichen Dienstbezeichnungen sollten in der
Dokumentation, zu finden sein, die Ihnen Ihr ISP zur Verfügung
gestellt hat. Wenn Sie diese Informationen dort nicht finden,
fragen Sie beim technischen Kundendienst Ihres ISP danach.Als letzte Möglichkeit, bleibt die Methode, die von
dem Programm Roaring Penguin PPPoE
vorgeschlagen wird, das in der Ports-Sammlung zu finden ist. Bedenken
Sie aber, dass dadurch Daten Ihres Modems gelöscht werden
können, so dass es nicht mehr benutzt werden kann.
Überlegen Sie also genau, ob Sie dies machen wollen.
Installieren Sie einfach das Programm, das Ihnen Ihr Provider
zusammen mit dem Modem geliefert hat. Gehen Sie dann in das
Menü System dieses Programms. Der Name
Ihres Profils, sollte in der Liste aufgeführt sein.
Normalerweise ist dies ISP.Der Name des Profils (service tag)
wird im Eintrag für
die PPPoE-Konfiguration in der Datei ppp.conf
verwendet, als der Teil des Befehls
set device (die manpage &man.ppp.8;
enthält Einzelheiten hierzu), der den Provider angibt.
Dieser Eintrag sollte folgendermaßen aussehen:set device PPPoE:xl1:ISPVergessen Sie nicht, statt xl1
das richtige Device Ihrer Netzwerkkarte anzugeben.Denken sie auch daran, ISP
durch das Profil, das Sie oben gefunden haben zu ersetzen.Weitere Informationen bieten:Nutzung von T-DSL und T-Online mit
FreeBSD von Udo ErdelhoffCheaper Broadband with FreeBSD on
DSL von Renaud Waldura.PPPoE mit einem &tm.3com;
HomeConnect
ADSL Modem Dual LinkDieses Modem folgt nicht dem RFC 2516
(A Method for transmitting PPP over Ethernet
(PPPoE), verfasst von L. Mamakos, K. Lidl, J. Evarts,
D. Carrel, D. Simone, und R. Wheeler). Stattdessen wurden andere
Pakettyp-Codes für die Ethernet Frames verwendet.
Bitte beschweren Sie sich unter 3Com, wenn Sie
der Ansicht sind, dass dieses Modem die PPPoE-Spezifikation einhalten
sollte.Um FreeBSD in die Lage zu versetzen, mit diesem Gerät zu
kommunizieren, muss ein sysctl Befehl angegeben werden. Dies kann
beim Systemstart automatisch geschehen, indem die Datei
/etc/sysctl.conf angepasst wird:net.graph.nonstandard_pppoe=1oder, wenn der Befehl unmittelbar wirksam werden soll,
durch:&prompt.root; sysctl net.graph.nonstandard_pppoe=1Da hiermit eine systemweit gültige Einstellung vorgenommen
wird, ist es nicht möglich, gleichzeitig mit einem normalen
PPPoE-Client oder Server und einem &tm.3com;
HomeConnect ADSL Modem
zu kommunizieren.PPP over ATM (PPPoA)PPPover ATMPPPoAPPP, over ATMNachfolgend wird beschrieben, wie PPP over ATM (PPPoA)
eingerichtet wird. PPPoA ist vor allem unter europäischen
DSL-Providern populär.Der Einsatz von PPPoA mit dem Alcatel &speedtouch; USBPPPoA-Unterstützung für dieses Gerät ist
unter FreeBSD als Port verfügbar, da die Firmware unter Alcatels
Lizenzvereinbarung vertrieben wird und deshalb nicht
mit dem FreeBSD-Basissystem frei verteilt werden kann.Um die Software zu installieren, verwenden Sie einfach die Ports-Sammlung. Installieren Sie den Port
net/pppoa und folgen Sie den dabei
angegebenen Instruktionen.Für den ordnungsgemäßen Betrieb muss
das Alcatel &speedtouch; USB, wie viele USB-Geräte,
Firmware auf den Gastrechner laden. FreeBSD kann die
Firmware automatisch laden, wenn das Gerät mit
dem USB-Anschluss verbunden wird. Dazu fügen Sie
als Benutzer root die nachstehenden
Zeilen in /etc/usbd.conf ein:device "Alcatel SpeedTouch USB"
devname "ugen[0-9]+"
vendor 0x06b9
product 0x4061
attach "/usr/local/sbin/modem_run -f /usr/local/libdata/mgmt.o"Den USB-Dæmon aktivieren Sie mit der folgenden
Zeile in /etc/rc.conf:usbd_enable="YES"Wenn die Verbindung beim Start von
ppp aufgebaut werden soll,
fügen Sie die nachstehenden Zeilen als Benutzer
root in /etc/rc.conf
ein:ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="adsl"Verwenden Sie bitte diese Einstellungen zusammen mit
der Beispielkonfiguration in ppp.conf
des Ports net/pppoa.Die Verwendung von mpdSie können mpd verwenden,
um zu einer Reihe von Diensten, insbesondere PPTP-Diensten eine
Verbindung herzustellen. Sie finden
mpd in der Ports-Sammlung unter
net/mpd. Viele ADSL Modems,
wie das Alcatel &speedtouch; Home, sind auf einen PPTP-Tunnel
zwischen dem Modem und dem Rechner angewiesen.Zuerst müssen Sie den Port installieren, um danach
mpd entsprechend Ihren Anforderungen
und den Vorgaben Ihres Providers konfigurieren zu können. Der
Port installiert auch einige
gut dokumentierte Beispielkonfigurationsdateien in PREFIX/etc/mpd/.
Beachten Sie, dass PREFIX hier das Verzeichnis
angibt, in das Ihre Ports installiert werden. Standardmäßig
ist dies das Verzeichnis /usr/local/.
Ein kompletter Leitfaden zur Konfiguration von
mpd ist im HTML-Format verfügbar,
sobald der Port installiert ist. Dieser ist in PREFIX/share/doc/mpd/
zu finden. Hier ist eine Beispielkonfiguration, um mit
mpd eine Verbindung zu einem
ADSL-Dienst aufzubauen. Die Konfiguration ist auf zwei Dateien
verteilt. Zunächst die Datei
mpd.conf:default:
load adsl
adsl:
new -i ng0 adsl adsl
set bundle authname username
set bundle password password
set bundle disable multilink
set link no pap acfcomp protocomp
set link disable chap
set link accept chap
set link keep-alive 30 10
set ipcp no vjcomp
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set iface route default
set iface disable on-demand
set iface enable proxy-arp
set iface idle 0
openDer Benutzername, den Sie zur Authentifizierung bei
Ihrem ISP verwenden.Das Passwort, das Sie zur Authentifizierung bei
Ihrem ISP verwenden.Die Datei mpd.links enthält
Informationen über die Verbindung(en), die Sie aufbauen
möchten. Eine Beispieldatei mpd.links,
die das vorige Beispiel ergänzt, wird unten
angegeben:adsl:
set link type pptp
set pptp mode active
set pptp enable originate outcall
set pptp self 10.0.0.1
set pptp peer 10.0.0.138Die IP-Adresse des &os;-Rechners von dem aus Sie
mpd verwenden.Die IP-Adresse des ADSL-Modems.
Das Alcatel &speedtouch; Home hat die Adresse
10.0.0.138 voreingestellt.Ein Verbindungsaufbau kann einfach durch Eingabe des folgenden
Befehls als root gestartet werden:&prompt.root; mpd -b adslSie können sich den Status der Verbindung durch folgenden Befehl
anzeigen lassen:&prompt.user; ifconfig ng0
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500
inet 216.136.204.117 --> 204.152.186.171 netmask 0xffffffffDie Verwendung von mpd ist der
empfehlenswerteste Weg, um mit &os; eine Verbindung zu
einem ADSL-Dienst aufzubauen.Die Verwendung von pptpclientEs ist außerdem möglich, mit FreeBSD eine
Verbindung zu anderen PPPoA-Diensten aufzubauen. Dazu wird
net/pptpclient verwendet.Um mit net/pptpclient eine
eine Verbindung zu einem DSL-Dienst aufbauen zu können,
müssen Sie den entsprechenden Port bzw. das Paket installieren
und die Datei /etc/ppp/ppp.conf bearbeiten.
Sie müssen root sein, um diese Schritte
durchführen zu können. Eine Beispieldatei für
ppp.conf ist weiter unten angegeben.
Weitere Informationen zu den Optionen von ppp.conf
bietet die Manual-Seite ppp
&man.ppp.8;:adsl:
set log phase chat lcp ipcp ccp tun command
set timeout 0
enable dns
set authname username
set authkey password
set ifaddr 0 0
add default HISADDRDer Benutzername für den Zugang zu den Diensten
Ihres ISP.Das Passwort für Ihren Account.Weil Sie Ihr Passwort in der Datei
ppp.conf in Klartext angeben müssen,
sollten Sie sicherstellen, dass niemand den Inhalt dieser Datei
lesen kann. Die folgende Reihe von Befehlen stellt sicher,
dass die Datei nur von root lesbar ist.
Zusätzliche Informationen bieten die Manual-Seiten
&man.chmod.1; und &man.chown.8;:&prompt.root; chown root:wheel /etc/ppp/ppp.conf
&prompt.root; chmod 600 /etc/ppp/ppp.confDies wird einen Tunnel für eine PPP-Session zu Ihrem
DSL-Router öffnen. Ethernet-DSL-Modems haben eine
vorkonfigurierte LAN-IP-Adresse, mit der Sie eine Verbindung
aufbauen. Im Falle des Alcatel &speedtouch; Home handelt es sich
dabei um die Adresse 10.0.0.138.
In der Dokumentation Ihres Routers sollte angegeben sein, welche
Adresse Ihr Gerät verwendet. Um den Tunnel zu öffnen
und eine PPP-Session zu starten, führen
Sie bitte folgenden Befehl aus:&prompt.root; pptp addressadslVielleicht möchten Sie ein kaufmännisches Und
(&) an das Ende oben angegebenen Kommandos
anfügen, da pptp sonst den
Prompt nicht zurückgibt.Ein virtuelles Tunnel-Device tun
wird für das Zusammenspiel der Prozesse
pptp und ppp
geschaffen. Wenn Sie den Prompt zurückerhalten haben
oder der pptp-Prozess das Vorliegen
einer Verbindung bestätigt, können Sie den Tunnel
folgendermaßen überprüfen:&prompt.user; ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 216.136.204.21 --> 204.152.186.171 netmask 0xffffff00
Opened by PID 918Wenn Sie nicht in der Lage sein sollten, eine Verbindung
aufzubauen, überprüfen Sie die Konfiguration Ihres Routers,
den Sie normalerweise per telnet
oder mit einem Web-Browser erreichen können. Falls
dennoch keine Verbindung zustande kommt, sollten Sie die
Ausgabe des Befehls pptp und die
Logdatei /var/log/ppp.log von
ppp nach Hinweisen auf die Ursache
durchsuchen.SatoshiAsamiUrsprünglich beigetragen von GuyHelmerMit Beiträgen von PieroSeriniSLIPSLIP
+
+ Der folgende Abschnitt ist ausschließlich
+ für &os; 7.X relevant und gültig.
+
+
Einrichtung eines SLIP-ClientsSLIPClientIm Folgenden wird ein Weg beschrieben, SLIP auf einer
FreeBSD-Maschine für ein Netzwerk mit festen Hostnamen
einzurichten. Bei einer dynamischen Zuweisung des Hostnamens
(das heißt wenn sich Ihre Adresse bei jeder Einwahl ändert)
wird die Einrichtung wahrscheinlich etwas komplexer aussehen.Bestimmen Sie zuerst, an welcher seriellen Schnittstelle Ihr Modem
angeschlossen ist. Viele Leute erzeugen einen symbolischen Link,
- wie etwa /dev/modem, der auf den wirklichen
Gerätenamen /dev/cuadN verweist. Damit ist es Ihnen
- möglich, vom eigentlichen Gerätenamen zu abstrahieren,
+ möglich, vom eigentlichen Gerätenamen zu abstrahieren,
sollten Sie das Modem einmal an eine andere Schnittstelle
anschließen müssen. Es kann ziemlich umständlich sein,
wenn Sie eine viele Dateien in /etc und
+ class="directory">/etc und
.kermrc-Dateien, die über das ganze System
verstreut sind, anpassen müssen!/dev/cuad0 ist
- COM1, /dev/cuad1
+ class="devicefile">/dev/cuau0 ist
+ COM1, /dev/cuau1
ist COM2, etc.Stellen Sie sicher, dass Folgendes in Ihrer
Kernelkonfigurationsdatei steht:device sl 1Dieses pseudo-device ist im GENERIC Kernel
enthalten. Falls es von Ihnen nicht gelöscht wurde, sollten
Sie hier kein Problem haben.Dinge, die Sie nur einmal erledigen müssenTragen Sie Ihren lokalen Rechner, das Gateway, sowie
die Nameserver in Ihre Datei /etc/hosts
ein. Diese Datei sieht bei mir so aus:127.0.0.1 localhost loghost
136.152.64.181 water.CS.Example.EDU water.CS water
136.152.64.1 inr-3.CS.Example.EDU inr-3 slip-gateway
128.32.136.9 ns1.Example.EDU ns1
128.32.136.12 ns2.Example.EDU ns2Vergewissern Sie sich, dass in der Datei
- /etc/host.conf im Abschnitt
+ /etc/host.conf im Abschnitt
hosts:files vor
dns steht. Ohne diese Reihenfolge
könnten lustige Dinge passieren.Editieren Sie die Datei
/etc/rc.conf.Ihren Hostnamen geben Sie an, indem Sie folgende Zeile
bearbeiten:hostname="myname.my.domain"Hier sollte der vollständige Internethostname
Ihres Rechners angegeben werden.DefaultrouteDen Defaultrouter geben Sie durch die Modifikation
folgender Zeile an:defaultrouter="NO"wird zu:defaultrouter="slip-gateway"Erstellen Sie die Datei
/etc/resolv.conf, die Folgendes
enthält:domain CS.Example.EDU
nameserver 128.32.136.9
nameserver 128.32.136.12NameserverDomain NameWie Sie sehen, werden hiermit die Nameserver angegeben.
Natürlich hängen die tatsächlichen Domainnamen
und Adressen von Ihren Gegebenheiten ab.Legen Sie ein Passwort für root und
toor (sowie für alle anderen Accounts
die kein Passwort haben) fest.Starten Sie Ihren Rechner neu und überprüfen
Sie, ob er mir dem richtigen Hostnamen startet.Aufbau einer SLIP-VerbindungSLIPVerbindungsaufbauWählen Sie sich ein, geben Sie
slip und am Prompt den Namen Ihres
Rechners sowie Ihr Passwort ein. Was Sie eingeben müssen,
hängt von Ihren Gegebenheiten ab. Wenn Sie
Kermit verwenden, können Sie
ein Skript ähnlich dem Folgenden verwenden:# kermit setup
set modem hayes
set line /dev/modem
set speed 115200
set parity none
set flow rts/cts
set terminal bytesize 8
set file type binary
# The next macro will dial up and login
define slip dial 643-9600, input 10 =>, if failure stop, -
output slip\x0d, input 10 Username:, if failure stop, -
output silvia\x0d, input 10 Password:, if failure stop, -
output ***\x0d, echo \x0aCONNECTED\x0aNatürlich müssen Sie hier Ihren Benutzernamen
und Ihr Passwort eintragen. Wenn Sie das getan haben,
können Sie am Kermit-Prompt
einfach slip eingeben, um sich zu
verbinden.Es ist generell eine schlechte
Idee, Ihr Passwort in einer unverschlüsselten
Textdatei irgendwo im Dateisystem zu speichern.
Tun Sie dies auf Ihr eigenes Risiko.Belassen Sie Kermit so (Sie
können es mit
Ctrlz unterbrechen) und geben Sie als
root ein:&prompt.root; slattach -h -c -s 115200 /dev/modemWenn Sie mit ping Hosts auf der anderen
Seite des Routers erreichen können, sind Sie verbunden!
Wenn es nicht funktionieren sollte, können Sie versuchen
statt als Argument
für slattach zu verwenden.Beenden der VerbindungUm slattach zu beenden, geben Sie
Folgendes ein:&prompt.root; kill -INT `cat /var/run/slattach.modem.pid`Beachten Sie, dass Sie
root sein müssen, um dies
durchführen zu können. Kehren Sie zu kermit
zurück (mit Hilfe von fg, wenn Sie es
unterbrochen haben) und beenden Sie dieses Programm
(q).&man.slattach.8; gibt an,
dass ifconfig sl0 down verwendet werden
soll, um das Interface zu deaktivieren, doch das
scheint keinen Unterschied zu machen.
(ifconfig sl0 gibt dasselbe aus).Es kann vorkommen, dass Ihr Modem sich weigert, das
Trägersignal zu beenden. In diesem Fall starten Sie
kermit einfach neu und beenden es wieder.
Beim zweiten Versuch geht es meist aus.Lösungen bei ProblemenWenn es nicht funktionieren sollte, können Sie
an die Mailingliste &a.net.name; schreiben. Über
diese Dinge sind Benutzer bisher gestolpert:Nicht oder in
slattach verwenden (Das sollte
nicht entscheidend sein, aber einige Benutzer haben
berichtet, dass dies ihre Probleme löst).Verwendung von statt
(bei einigen Schriftarten kann der
Unterschied schwer zu erkennen sein).Probieren Sie ifconfig sl0,
um den Status Ihrer Schnittstelle abzufragen. Das Ergebnis
könnte beispielsweise so aussehen:&prompt.root; ifconfig sl0
sl0: flags=10<POINTOPOINT>
inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00Wenn &man.ping.8; die Fehlermeldung
no route to host ausgibt, kann
die Routingtabelle falsch sein. Die Routen können Sie
sich mit dem Kommando netstat -r
ansehen:&prompt.root; netstat -r
Routing tables
Destination Gateway Flags Refs Use IfaceMTU Rtt Netmasks:
(root node)
(root node)
Route Tree for Protocol Family inet:
(root node) =>
default inr-3.Example.EDU UG 8 224515 sl0 - -
localhost.Exampl localhost.Example. UH 5 42127 lo0 - 0.438
inr-3.Example.ED water.CS.Example.E UH 1 0 sl0 - -
water.CS.Example localhost.Example. UGH 34 47641234 lo0 - 0.438
(root node)Die Zahlen im Beispiel stammen von einer recht
ausgelasteten Maschine. Die Zahlen auf Ihrem System werden,
je nach Netzaktivität, von den gezeigten
abweichen.Einrichtung eines SLIP-ServersSLIPServerDieses Dokument bietet Empfehlungen, wie Sie Ihr FreeBSD-System als
SLIP-Server einrichten. Typischerweise bedeutet dies, Ihr System so zu,
konfigurieren, dass beim Login automatisch eine Verbindung für
entfernte SLIP-Clients aufgebaut wird.VoraussetzungenTCP/IP NetzeDieser Abschnitt ist ausgesprochen technischer Natur, weshalb
Hintergrundwissen erforderlich ist. Wir gehen davon aus, dass Sie
mit dem TCP/IP Protokoll, insbesondere mit
Netzwerk- und Rechneradressierung, Netzwerkmasken, Subnetzen,
Routing und Routingprotokollen, wie RIP, vertraut sind.
Die Konfiguration von SLIP-Diensten
auf einem Einwählserver erfordert die Kenntnis dieser Konzepte.
Wenn Sie damit nicht vertraut sein sollten, lesen Sie bitte
Craig Hunt's TCP/IP Network Administration
publiziert von O'Reilly & Associates, Inc. (ISBN Nummer
0-937175-82-X) oder die Bücher von Douglas Comer über
das TCP/IP Protokoll.ModemWir gehen außerdem davon aus, dass Sie Ihr(e) Modem(s)
eingerichtet haben und die entsprechenden Systemdateien so
konfiguriert haben, dass Logins durch Ihr Modem zugelassen sind.
Wenn Sie Ihr System dafür noch nicht vorbereitet haben,
lesen Sie bitte , um Ihre
Einwahlverbindung zu konfigurieren. Hilfreich sind auch die
Manualpages &man.sio.4; mit Informationen zum Gerätetreiber
der seriellen Schnittstelle &man.ttys.5;, sowie &man.gettytab.5;,
&man.getty.8; und &man.init.8; für Informationen zur
Konfiguration von Logins über ein Modem. &man.stty.1; bietet
Informationen zur Einstellung der Parameter der seriellen
Schnittstelle (etwa von clocal für
direkt angeschlossene serielle Geräte).Ein kurzer ÜberblickMit der normal verwendeten Konfiguration funktioniert der
FreeBSD-SLIP-Server folgendermaßen: Ein SLIP-Benutzer
wählt einen FreeBSD-SLIP-Server an und meldet sich mit einer
speziellen SLIP-Login-ID ein, wobei
/usr/sbin/sliplogin als Shell dieses
besonderen Accounts dient. Das Programm
sliplogin durchsucht die Datei
/etc/sliphome/slip.hosts nach einer
passenden Zeile für diesen Account. Falls ein
Treffer erzielt wird, verbindet es den seriellen Anschluss mit
einem verfügbaren SLIP-Interface und führt das
Shellskript /etc/sliphome/slip.login
aus, um das SLIP-Interface zu konfigurieren.Ein Beispiel für ein Login eines SLIP-ServersWenn beispielsweise die Kennung eines SLIP-Benutzers,
Shelmerg wäre, könnte der Eintrag des
Benutzers Shelmerg in der Datei
/etc/master.passwd etwa so aussehen:Shelmerg:password:1964:89::0:0:Guy Helmer - SLIP:/usr/users/Shelmerg:/usr/sbin/sliploginWenn sich Shelmerg anmeldet,
wird sliplogin die Datei
/etc/sliphome/slip.hosts nach einer
übereinstimmenden Benutzerkennung durchsuchen. So
könnte etwa folgende Zeile in
/etc/sliphome/slip.hosts stehen:Shelmerg dc-slip sl-helmer 0xfffffc00 autocompsliplogin wird die passende Zeile finden,
den seriellen Anschluss mit dem nächsten verfügbaren
SLIP-Interface verbinden und dann
/etc/sliphome/slip.login wie hier
dargestellt ausführen:/etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocompWenn alles gut läuft, wird
/etc/sliphome/slip.login ein
ifconfig für das SLIP-Interface
durchführen, mit dem sich sliplogin
verbunden hat (in obigem Beispiel ist das slip 0, der als
erster Parameter in der Liste an slip.login
übergeben wurde), um die lokale IP-Adresse
(dc-slip), die entfernte IP-Adresse
(sl-helmer), die Netzmaske
des SLIP-Interface (0xfffffc00) und
alle zusätzlichen Optionen (autocomp)
festzulegen. Wenn etwas schief laufen sollte, bietet,
sliplogin normalerweise informative
Meldungen durch den syslogd-Daemon,
der die Meldungen standardmäßig nach
/var/log/messages schreibt (sehen Sie
hierzu auch in den Manual-Seiten für &man.syslogd.8;
und &man.syslog.conf.5; nach). Überprüfen Sie
auch /etc/syslog.conf,
um zu sehen, was syslogd aufzeichnet und
wo es aufgezeichnet wird.KernelkonfigurationKernelKonfigurationDer Standardkernel von &os; (GENERIC)
bietet bereits SLIP-Unterstützung (&man.sl.4;). Falls
Sie einen angepassten Kernel verwenden, müssen Sie
sicherstellen, dass Ihre Kernelkonfigurationsdatei folgende
Zeile enthält:device slIn der Voreinstellung leitet Ihr &os;-Rechner keine
Pakete weiter. Wenn Sie Ihren FreeBSD-SLIP-Server als
Router einsetzen möchten, müssen Sie die Datei
/etc/rc.conf bearbeiten und den Wert
der Variable gateway_enable auf
setzen. Dadurch ist sichergestellt, dass
die Routingoptionen auch nach einem Neustart erhalten bleiben.Um die Einstellungen sofort anzuwenden, führen Sie den
folgenden Befehl als root-Benutzer aus:
-
+
&prompt.root; /etc/rc.d/routing startWeitere Informationen zur Konfiguration Ihres Kernels,
finden Sie in dieses Handbuches.Konfiguration des SliploginWie bereits erwähnt, gibt es im Verzeichnis /etc/sliphome drei Dateien, die Teil der
Konfiguration für /usr/sbin/sliplogin
sind (sliplogin ist in &man.sliplogin.8;
beschrieben): slip.hosts,
definiert die SLIP-Benutzer sowie deren IP-Adresse;
slip.login, womit normalerweise nur das
SLIP-Interface konfiguriert wird und (optional)
slip.logout, womit die Auswirkungen von
slip.login rückgängig gemacht
werden, wenn die serielle Verbindung beendet wird.Konfiguration der Datei
slip.hosts/etc/sliphome/slip.hosts enthält
Zeilen, die mindestens vier durch Leerzeichen getrennte Elemente
enthalten:Login-Kennung des SLIP-BenutzersLokale Adresse (lokal für den SLIP-Server)
der SLIP-VerbindungEntfernte Adresse der SLIP-VerbindungNetzwerkmaskeDie lokalen und entfernten Adressen können
Hostnamen sein, deren zugehörige IP-Adresse durch die
Datei /etc/hosts oder mithilfe des
Domain Name Service aufgelöst wird. Wie die Adressen
aufgelöst werden, hängt von den Einstellungen in
/etc/nsswitch.conf ab. Die Netzwerkmaske
kann ein Name sein, der durch
eine Suche in /etc/networks aufgelöst
werden kann. Auf einem Beispielsystem, würde die Datei
/etc/sliphome/slip.hosts
folgendermaßen aussehen:#
# login local-addr remote-addr mask opt1 opt2
# (normal,compress,noicmp)
#
Shelmerg dc-slip sl-helmerg 0xfffffc00 autocompAm Ende der Zeile stehen eine oder mehrere der folgenden
Optionen. – keine
Header-Kompression – Header werden
komprimiert – Header werden
komprimiert, sofern die Gegenstelle es erlaubt – ICMP-Pakete werden
deaktiviert (ping Pakete werden
unterdrückt, statt die Ihnen zur Verfügung
stehende Bandbreite aufzubrauchen)SLIPTCP/IP NetzeDie Auswahl von lokalen und entfernten Adressen für Ihre
SLIP-Verbindung, hängt davon ab, ob Sie ein TCP/IP-Subnetz
reservieren oder ob Sie proxy ARP auf Ihrem
SLIP-Server verwenden (es handelt sich nicht um
echtes proxy ARP, aber dieser Begriff wird
in diesem Abschnitt verwendet, um diesen Sachverhalt zu
beschreiben). Wenn Sie nicht sicher sind, welche Methode
Sie wählen sollen oder wie IP-Adressen zugewiesen werden,
lesen Sie bitte in den Büchern
zum Thema TCP/IP nach, die als Voraussetzungen für SLIP
() angegeben worden sind
oder fragen Sie Ihren IP-Netzwerkadministrator.Wenn Sie für Ihre SLIP-Clients ein eigenes Subnetz
verwenden, werden Sie die Nummer des Subnetzes aus der Ihnen
zugewiesenen IP-Netzwerknummer zuteilen und die IP-Adressen
Ihrer SLIP-Clients aus diesem Subnetz verwenden müssen.
Dann können Sie eine statische Route zu Ihrem
SLIP-Subnetz über Ihren SLIP-Server auf Ihren
nächsten IP-Router konfigurieren.EthernetWenn Sie aber andererseits die proxy ARP
Methode verwenden möchten, werden Sie die IP-Adressen Ihrer
SLIP-Clients aus dem Subnetz Ihres SLIP-Server nehmen und die
Skripte /etc/sliphome/slip.login/etc/sliphome/slip.logout anpassen
müssen, damit diese &man.arp.8; zur Verwaltung der
- proxy ARP-Einträge in der ARP-Tabelle Ihres
+ proxy ARP-Einträge in der ARP-Tabelle Ihres
SLIP-Servers verwenden.Konfiguration von slip.loginEine typische Datei
/etc/sliphome/slip.login sieht
folgendermaßen aus:#!/bin/sh -
#
# @(#)slip.login 5.1 (Berkeley) 7/1/90
#
# generic login file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6Diese slip.login Datei führt
lediglich ifconfig für das entsprechende
SLIP-Interface mit den lokalen und entfernten Adressen und der
Netzwerkmaske des SLIP-Interface aus.Wenn Sie sich dafür entschieden haben, die
proxy ARP Methode zu verwenden (statt eines
separaten Subnetzes für Ihre SLIP-Clients)
sollte Ihre Datei /etc/sliphome/slip.login
etwa folgendermaßen aussehen:#!/bin/sh -
#
# @(#)slip.login 5.1 (Berkeley) 7/1/90
#
# generic login file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6
# Answer ARP requests for the SLIP client with our Ethernet addr
/usr/sbin/arp -s $5 00:11:22:33:44:55 pubDie zusätzliche Zeile arp -s
$5 00:11:22:33:44:55 pub in der Datei
slip.login erzeugt einen ARP-Eintrag
in der ARP-Tabelle des SLIP-Servers. Dieser ARP-Eintrag
veranlasst den SLIP-Server mit seiner Ethernet MAC-Adresse
zu antworten, sobald ein anderer IP-Knoten im Ethernet mit
der IP-Adresse des SLIP-Clients Kontakt aufnehmen
möchte.EthernetMAC AdresseWenn Sie das Beispiel von oben verwenden, achten Sie darauf
die Ethernet MAC-Adresse (00:11:22:33:44:55) durch die MAC-Adresse der
Ethernetkarte Ihres Systems zu ersetzen. Sonst wird Ihr
proxy ARP sicher nicht funktionieren! Sie
können die MAC-Adresse Ihres SLIP-Servers herausfinden,
indem Sie sich die Ausgabe von netstat -i
ansehen. Die zweite Zeile der Ausgabe sollte ungefähr
aussehen wie diese hier:ed0 1500 <Link>0.2.c1.28.5f.4a 191923 0 129457 0 116Dies zeigt an, dass die Ethernet MAC-Adresse dieses
Systems 00:02:c1:28:5f:4a lautet.
Die Punkte in der Ethernet MAC-Adresse, die von
netstat -i ausgegeben wird, müssen
durch Doppelpunkte ersetzt werden. Bei jeder einstelligen
Hexadezimalzahl sollten außerdem führende Nullen
hinzugefügt werden, um die Adresse in die Form zu bringen,
die von &man.arp.8; verlangt wird.
Die Manual-Seite von &man.arp.8; bietet hierzu eine
vollständige Übersicht.Wenn Sie die Dateien
/etc/sliphome/slip.login und
/etc/sliphome/slip.logout erstellen,
müssen diese ausführbar gemacht werden
(chmod 755 /etc/sliphome/slip.login
/etc/sliphome/slip.logout),
da sliplogin auf deren Ausführbarkeit
angewiesen ist. Konfiguration von slip.logoutDie Datei/etc/sliphome/slip.logout ist
nicht zwingend erforderlich (außer Sie verwenden proxy
ARP), aber falls Sie diese Datei erzeugen möchten,
ist hier ein Beispiel für ein grundlegendes
slip.logout Skript:#!/bin/sh -
#
# slip.logout
#
# logout file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 downWenn Sie proxy ARP einsetzen, muss
/etc/sliphome/slip.logout den
ARP-Eintrag für den SLIP-Client löschen:#!/bin/sh -
#
# @(#)slip.logout
#
# logout file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 down
# Quit answering ARP requests for the SLIP client
/usr/sbin/arp -d $5arp -d $5 löscht den ARP-Eintrag,
den die proxy ARPslip.login
hinzufügte, als der SLIP-Client sich eingeloggt hatte.Es soll nochmals darauf hingewiesen werden, dass für die
Datei /etc/sliphome/slip.logout das
Ausführungs-Bit gesetzt werden muss, nachdem die Datei
erstellt worden ist (z.B. chmod 755
/etc/sliphome/slip.logout).Überlegungen zum RoutingSLIPRoutingWenn Sie nicht die proxy ARP Methode benutzen,
um Datenpakete zwischen Ihren SLIP-Clients und dem Rest Ihres
Netzwerkes (oder vielleicht dem Internet) zu routen, werden Sie
wahrscheinlich statische Routen zu Ihrem nächsten
Standardrouter hinzufügen müssen, um Pakete aus dem
Subnetz Ihres SLIP-Clients über Ihren SLIP-Server
weiterzuleiten.Statische Routenstatische RoutenDas Hinzufügen von statischen Routen zu Ihrem
nächsten Standardrouter kann problematisch sein
(oder unmöglich, wenn Sie nicht die erforderliche
Berechtigung haben...). Wenn Sie in Ihrer Organisation ein
Netzwerk mit mehreren Routern haben, müssen einige Router,
wie etwa die von Cisco und Proteon hergestellten, nicht nur mit
der statischen Route zum SLIP-Subnetz konfiguriert werden, sondern
es muss ihnen auch mitgeteilt werden, über welche statischen
Routen sie andere Router informieren sollen. Daher ist einiges
an Fachwissen und Problemlösungskompetenz erforderlich, um auf
statischen Routen basierendes Routing erfolgreich
einzurichten.