www.fabiankeil.de/blog-surrogat/2006/03/22/freebsd-auf-pentium-90.html
FreeBSD 6.1-PRERELEASE auf Pentium 90Vor 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.
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.
und make buildworld
wurde auf dem ThinkPad erledigt, Africanqueen war für
make buildkernel KERNCONF=CASABLANCA
MODULES_OVERRIDE=
,
mergemaster -D /mnt/samba-platte
und make installworld DESTDIR=/mnt/samba-platte
zuständig.
make installkernel
KERNCONF=CASABLANCA DESTDIR=/mnt/samba-platte MODULES_OVERRIDE=
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).
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
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?)
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.
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.