www.fabiankeil.de/blog-surrogat/2006/03/22/freebsd-auf-pentium-90.html

FreeBSD 6.1-PRERELEASE auf Pentium 90

[Foto: 14-Zoll-Monitor angeschlossen an beiges Rechnergehäuse aus der 486er-Generation] Vor drei oder vier Jahren habe ich einen alten Pentium-Rechner geschenkt bekommen. Anfangs wurde er kurz zum CD-Testen mit WSES genutzt, anschließend staubte er als Bücherständer vor sich hin.

Die Bücher stehen inzwischen im Regal, der Ausfall des File-Servers bot Gelegenheit den P90 als Ersatz zu testen.

Installations-Hürden

Die Installation von CD fiel flach, das BIOS bootet nur von Festplatte oder Diskette, der Installationskernel scheint außerdem mit den 16 Megabyte Arbeitsspeicher nicht auszukommen: nach dem Einlesen der dritten Boot-Diskette gibt es einen Neustart ohne Fehlermeldung.

Als nächstes setze ich die Boot-Festplatte des Samba-Server ein, der Bootvorgang scheiterte jedoch an der I686-Optimierung: den Kernel hatte ich ohne Unterstützung für Prozessoren unterhalb des Celerons kompiliert.

Um die FreeBSD-Installation auf dem P90 startfähig zu machen wurde die Festplatte in Africanqueen eingebaut und vom über NFS eingebundenen, deutlich schnelleren, ThinkPad neu bespielt.

make buildworld und make buildkernel KERNCONF=CASABLANCA MODULES_OVERRIDE= wurde auf dem ThinkPad erledigt, Africanqueen war für mergemaster -D /mnt/samba-platte, make installworld DESTDIR=/mnt/samba-platte und make installkernel KERNCONF=CASABLANCA DESTDIR=/mnt/samba-platte MODULES_OVERRIDE= zuständig.

Aufgrund des mageren Arbeitsspeichers wurde auf Module verzichtet und der Kernel etwas zusammengestutzt. Momentan ist er 2,9 Megabyte groß, etwa die Hälfte des Standardkernels (ohne Module).

Netzwerk-Durchsatz

Als dauerhafter File-Server wäre Casablanca dann doch etwas lahm, selbst das Hochladen einer Datei über FTP lastet den Prozessor aus, was auch daran liegen dürfte, dass die Festplatte nur über PIO angesprochen werden kann.

ftp> put anonymos-shmoo.iso 
local: anonymos-shmoo.iso remote: anonymos-shmoo.iso
229 Entering Extended Passive Mode (|||61941|)
150 Opening BINARY mode data connection for 'anonymos-shmoo.iso'.
100% |*************************************|   549 MB  785.47 KB/s    00:00 ETA
226 Transfer complete.
575774720 bytes sent in 11:56 (785.25 KB/s)

Die eingebaute Gigabit-Netzwerkkarte könnte problemlos durch eine kleinere Version ersetzt werden, auch netperf wird vom Prozessor limitiert. Dass sich TCP-Prüfsummen nicht selbst überprüfen wird ebenfalls deutlich:

fk@TP51 ~ $/usr/local/netperf/netperf -H 192.168.5.40
TCP STREAM TEST to 192.168.5.40
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

 65536  32768  32768    10.01      25.03

fk@TP51 ~ $/usr/local/netperf/netperf -H 192.168.5.40 -t UDP_STREAM
UDP UNIDIRECTIONAL SEND TEST to 192.168.5.40
Socket  Message  Elapsed      Messages                
Size    Size     Time         Okay Errors   Throughput
bytes   bytes    secs            #      #   10^6bits/sec

  9216    9216   10.01       75925 900366     559.48
 41600           10.01          36              0.27

NFS-Probleme

Der Versuch den ThinkPad von Casablanca aus über mount_nfs einzubinden führte reproduzierbar zu einer Panik:

Fatal trap 18: integer divide fault while in kernel mode
instruction pointer     = 0x20:0xc0579391
stack pointer           = 0x28:0xc31a68c4
frame pointer           = 0x28:0xc31a6964
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, def32 1, gran 1
processor eflags        = interrupt enabled, resume, IOPL = 0
current process         = 478 (mount_nfs)
panic: from debugger
Uptime: 3m23s
Dumping 15 MB (2 chunks)
  chunk 0: 1MB (159 pages) ... ok
  chunk 1: 15MB (3840 pages)

#0  doadump () at pcpu.h:165
165     pcpu.h: No such file or directory.
        in pcpu.h
(kgdb) bt
#0  doadump () at pcpu.h:165
#1  0xc04d3011 in boot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:402
#2  0xc04d32d8 in panic (fmt=0xc0620fe8 "from debugger") at /usr/src/sys/kern/kern_shutdown.c:558
#3  0xc04510c1 in db_panic (addr=-1068002415, have_addr=0, count=-1, modif=0xc31a6718 "")
    at /usr/src/sys/ddb/db_command.c:438
#4  0xc0451058 in db_command (last_cmdp=0xc066f244, cmd_table=0x0, aux_cmd_tablep=0xc063e2b8, aux_cmd_tablep_end=0xc063e2bc)
    at /usr/src/sys/ddb/db_command.c:350
#5  0xc0451120 in db_command_loop () at /usr/src/sys/ddb/db_command.c:458
#6  0xc0452d2d in db_trap (type=18, code=0) at /usr/src/sys/ddb/db_main.c:221
#7  0xc04ebabf in kdb_trap (type=18, code=0, tf=0xc31a6884) at /usr/src/sys/kern/subr_kdb.c:473
#8  0xc060be64 in trap_fatal (frame=0xc31a6884, eva=0) at /usr/src/sys/i386/i386/trap.c:827
#9  0xc060b990 in trap (frame=
      {tf_fs = 8, tf_es = 40, tf_ds = 40, tf_edi = -1057177600, tf_esi = -1058837120, tf_ebp = -1021679260, tf_isp = -1021679 
440, tf_ebx = -1055928320, tf_edx = 0, tf_ecx = 0, tf_eax = 2113536, tf_trapno = 18, tf_err = 0, tf_eip = -1068002415, tf_cs  
= 32, tf_eflags = 66118, tf_esp = -1067065632, tf_ss = -1021679392}) at /usr/src/sys/i386/i386/trap.c:631
#10 0xc05fddea in calltrap () at /usr/src/sys/i386/i386/exception.s:139
#11 0xc0579391 in mountnfs (argp=0xc31a6a30, mp=0xc0fcc000, nam=0xc0f08610, hst=0xc31a69d0 "127.0.0.1:/usr/home", 
    vpp=0xc31a6984, cred=0xc0f69a80) at /usr/src/sys/nfsclient/nfs_vfsops.c:826
#12 0xc0579222 in nfs_mount (mp=0xc0fcc000, td=0xc0e36d80) at /usr/src/sys/nfsclient/nfs_vfsops.c:745
#13 0xc0524974 in vfs_domount (td=0xc0e36d80, fstype=0xc10fb990 "\002", fspath=0xc0f086c0 "/mnt", fsflags=0, 
    fsdata=0xc0f08700) at /usr/src/sys/kern/vfs_mount.c:882
#14 0xc05241d2 in vfs_donmount (td=0xc0e36d80, fsflags=0, fsoptions=0xc31a6c08) at /usr/src/sys/kern/vfs_mount.c:640
#15 0xc05269e0 in kernel_mount (ma=0xc0f08860, flags=0) at pcpu.h:162
#16 0xc0579269 in nfs_cmount (ma=0xc0f08860, data=0xbfbfece0, flags=0, td=0xc0e36d80)
    at /usr/src/sys/nfsclient/nfs_vfsops.c:772
#17 0xc05243b6 in mount (td=0xc0e36d80, uap=0xc31a6d04) at /usr/src/sys/kern/vfs_mount.c:703
#18 0xc060c1b3 in syscall (frame=
      {tf_fs = 59, tf_es = 59, tf_ds = 59, tf_edi = -1077940598, tf_esi = -1077941024, tf_ebp = -1077940904, tf_isp = -102167
8236, tf_ebx = -1077942048, tf_edx = 5, tf_ecx = 4, tf_eax = 21, tf_trapno = 12, tf_err = 2, tf_eip = 671842411, tf_cs = 51,  
tf_eflags = 582, tf_esp = -1077942116, tf_ss = 59}) at /usr/src/sys/i386/i386/trap.c:981
#19 0xc05fde3f in Xint0x80_syscall () at /usr/src/sys/i386/i386/exception.s:200
#20 0x00000033 in ?? ()
Previous frame inner to this frame (corrupt stack?)

Posing Time

Das Problem ist Zeile 826 in /usr/src/sys/nfsclient/nfs_vfsops.c:

nmp->nm_wcommitsize = hibufspace / (desiredvnodes / 1000);

desiredvnodes ist als int deklariert, für den Wert der Division gilt damit das Selbe. Der Wert von desiredvnodes hängt von der Hardware ab und wird vom Kernel bestimmt. Er kann über sysctl kern.maxvnodes überprüft (und manipuliert) werden.

Auf dem ThinkPad wird er auf 35628 gesetzt, auf Casablanca auf bescheidene 946. Beim Ergebnis von 946 / 1000 fallen die Nachkommastellen weg, das Ergebnis ist 0 – die folgende Division führt zur Panik.

Die Fehlersuche und -lösung hat mich Stunden gekostet. Das kommt davon, wenn man nur bei Problemen im Quelltext wühlt.

Mit dem Patch funktioniert auch das Einbinden des Laptops, für zukünftige Updates werde ich die Festplatte nicht mehr ausbauen müssen, etwas Geduld ist jedoch erforderlich.

Auch wenn das Kompilieren von Kernel und Userland dem Laptop überlassen wird, braucht Casablanca 48 Minuten für make installworld, der ThinkPad erledigt das in etwa 3 Minuten.

Aussichten

Wie erwartet ist die Leistung des Pentium 90 für einen File-Server etwas mager, bleibt zu überprüfen, wie er sich als Firewall schlagen wird. PF ist bereits im Kernel vorhanden und für den Internetzugang wird kein Gigabit-Durchsatz benötigt.