Vorweg: Dieser Beitrag ist sinnlos und Zeitverschwendung, aber ich muss
ihn nun einfach posten, denn dann kann ich mir einreden etwas produktives
getan zu haben.
Letzte Woche trat ein Kunde an mich heran, deutete auf eine sehr
staubige Kiste in der Ecke seiner IT-Installation und sagte, dass es
eine MicroVAX irgendwann aus den tiefsten 80er Jahren sei. Natürlich
war sie seit sehr, sehr langer Zeit nicht mehr im Einsatz, es ist wohl
keine Untertreibung, dass der Prozessor einer USB-Maus über mehr
Rechenleistung verfügt. Allerdings war das damals doch extrem teure
Gerät auch immer zu schade zum Wegwerfen. Darauf war angeblich ein
4.3BSD - ich konnte es erst nicht wirklich glauben, es seinerzeit vor
allem im akademischen Bereich zu finden war und Endkunden die Maschinen
eher mit VMS betrieben - und ich sollte mal schauen, ob das Ding noch
funktioniert. Ich kenne mich ja mit "BSD aus und so".
Da 4.3BSD gerade einmal zwei Jahre jünger ist als ich, dachte ich mir,
dass ich mich erst einmal einarbeiten sollte. Die Erfahrung sagt, dass
unbekannte Systeme immer eine gewisse Neigung dazu haben schnell kaputt
gefrickelt zu werden. Wieder zu Hause fragte ich dann Google und es gab
mir tatsächlich eine Antwort. Angeblich soll man mit SIMH [1] eine alte
VAX emulieren können und darin sogar 4.3BSD ausführen. Gesagt, getan,
recht schnell fand ich dann auch eine Anleitung [2].
Leider stürzte der Emulator gleich beim ersten Start ab. Ich kapierte es
allerdings nicht, dachte es sein eine Ausgabe des emulierten Systems. Am
Ende stellte sich heraus, dass der FreeBSD-Port von SIMH kaputt ist. Er
baut das Programm mit -O2 und bricht es damit. Also entsprechende
Änderungen vorgenommen, ein neuer Versuch und es startete. Nach der
Installation dann der erste Multiuserboot und ich fühlte mich gleich
wie zu Hause:
Die Ähnlichkeit der Bootausgabe des 4.3BSD mit der aktueller FreeBSD
Versionen ist deutlich zu sehen. Nach dem Login blieb es so. Zwar ist
das System chaotischer als FreeBSD, es liegen Dateien im /, Dinge die
nach /var gehören zum Teil in /usr, aber die Tools sind meist gleich.
Leider hat der Emulator ein eher grütziges Terminal.
Das sollte jedoch kein Problem sein. Einfach ein "ifconfig de0 inet
192.168.0.17" und schon konnte ich das Hostsystem pingen. Dann noch
telnetd gestartet und eingeloggt. Ein wenig gespielt, festgestellt dass
vi damals irgendwie noch anders als FreeBSDs nvi war, aber auch nicht
sehr. Mich dann ein wenig in /usr/games aufgehalten. Wieso liefert
FreeBSD eigentlich nicht alle BSD-Games aus? Gerade "adventure" und
"zork" sind Klassiker, "wargames" immerhin ein guter Witz.
Es ist dabei erstaunlich, wie schnell das System läuft. Wobei man
natürlich beachten muss, dass es hier trotz Emulator sicher um den
Faktor 100 oder mehr Leistung unter dem Hintern hat als auf
Originalhardware. Praktisch machen kann man damit allerdings nicht
viel, denn die damalige Software ist doch irgendwo veraltet und
der alte pcc baut keine aktuellen C-Programme durch.
Also stieg ich ein wenig in die Tiefen hinab. Auf den ersten Blick sieht
der Quellcode FreeBSD sehr ähnlich, wenn man ein wenig drin liest fällt
aber wieder auf, dass spätestens mit FreeBSD 5 und SMPng kein Stein auf
dem anderen geblieben ist. Daher dazu hier nun auch nicht mehr, es gibt
bereits genügend Doku. Zu empfehlen ist Kirk McKusicks "The Design and
Implementation of the BSD Operating System".
Eine Ausgabe der Prozesse kommt bekannt vor, auch wenn es deutlich
weniger als heute sind. Aber man musste auch mit viel weniger RAM
auskommen:
"swapper" ist der Kernel, er hieß noch bis FreeBSD 7 so. "pagedaemon"
ist Teil des VM. Ihn findet man so nicht mehr, da alle aktuellen BSDs
das VM ausgetauscht haben. FreeBSD zu dem von MACH (in den 90ern von
John Dyson grundlegend umgebaut und deutlich verbessert), NetBSD zu
einem Eigenbau. OpenBSD basiert auf NetBSD. "named" ist der gute BIND
in der Version vom 15.11.1985. "sendmail" kommt in Version vom 22.5.1986
zum Einsatz.
Alles in allem kann man zwar sagen, dass 4.3BSD nach heutigen Maßstäben
spartanisch sein mag, aber man versteht wieso es gern mal als die beste
jemals geschriebene Software bezeichnet wird. Dafür, dass 25 Jahre
vergangen sind, hat sich verdammt wenig geändert. Wer aktuelle Unixe
kennt - wobei Linux natürlich weniger als BSD - fühlt sich gleich zu
Hause. Daran können sich die "Alle 2 Jahre muss alles neu"-Fetischisten
im Bereich der GUI ein großes Stück abschneiden.
Das führte dann natürlich zu einer interessanten Frage. 4.3BSD nutzte
FFS (vor dem Aufspalten in die 3 Layer FFS, UFS und VFS) und die VAX war
Little Endian, also sollte FreeBSD es lesen können. Gesagt getan:
Das sah nicht gut aus. Die dmesg sagte etwas von einem unsauberen
Dateisystem. Also weiß man, was zu tun ist:
"Mist", dachte ich mir. Tatsächlich fand ich schnell den Grund, beim
Sprung von FFS auf UFS1 wurde anscheinend was am internen Format
geändert. Warum allerdings die Option zum Konvertieren entfernt wurde,
ist mir nicht ganz klar. Es geschah im Rahmen von UFS2 [3]. Ich habe
dann einfach read only gemountet und war glücklich.
Natürlich brachte mir es nicht. Mein x86 kann keine VAX-Binaries
ausführen. Das führte zu der nächsten Idee. Die ältesten i386 Binaries
für ein BSD dürften in 386bsd enthalten sein, aus dem später FreeBSD und
NetBSD hervorgingen. Also Google angeworfen und ich wurde fündig.
Nun hatten alle BSDs vor FreeBSD 3.0 (wenigstens aus FreeBSD Sicht) aout
als Binaryformat, aus anderen Projekten wusste ich jedoch schon, dass
aout nie auf FreeBSD/amd64 portiert wurde. Ich glaube, es wäre auch nur
mit extremen Aufwand möglich. Daher habe ich erst einmal ein FreeBSD/i386
9.0-RC2 in einer VirtualBox installiert. Nun gibt es zwei Probleme:
1. Die Rückkompatiblität für (Free)BSD-Versionen vor FreeBSD 4.0 wurde
irgendwann mal aus GENERIC entfernt. Ist ja auch irgendwo
verständlich. Vorhanden ist sie aber natürlich noch.
2. Die "compat"-Ports für (Free)BSD 4 wurden ebenfalls mal entfernt.
Um das erste Problem zu lösen, habe ich also einen neuen Kernel gebaut,
der zusätzlich zu dem normalen GENERIC-Kram folgendes enthält:
COMPAT_43 fasst die Rückkompatiblität für alle BSD-Versionen vor FreeBSD
4 zusammen "COMPAT_43TTY" bietet das zugehörige TTY-Interface.
Das zweite Problem stellt sich nicht. Die Kompatiblitätsports finden
sich im CVS (ich sollte davon echt mal Pakete bauen), da dynamisches
Linken aber erst mit FreeBSD 2 kam, braucht man sie nicht. Also einfach
den Kernel gebaut und neu gestartet. Anschließend noch die Unterstützung
für aout geladen:
Dann die 386bsd CD gemountet und das System extrahiert. Bevor ich groß
mit einem chroot begann, wollte ich erst einmal teste:
Gar nicht gut. Ein ktrace zeigte:
Da stürzt also schon der Image Activator ab. Eine kurze Diskussion auf
der Mailingliste ergab dann, dass FreeBSDs Errata EN-09:05 [4] durch das
Verhindern von mmap() auf NULL sehr alte aout-Binaries gebrochen hat.
Das läst sich aber lösen:
Tada, es funktionierte. Ich machte also ein chroot und schon war ich in
meinem 386bsd. Einen Moment staunte ich. Diese Binaries sind uralt und
dennoch funktionieren sie:
Okay, das war auch trivial. Also ging ich einige nicht ganz so triviale
Dinge an. Schnell stellte ich fest, dass ich ein procfs nach /386bsd
mounten muss:
Das war irgendwo klar. Spätestens mit der Integration von Jails wurde
die Prozesstabelle grundlegend geändert, was ps brach. Hier scheitert er
allerdings schon an einem Device. "ifconfig" musste ich mir erst einmal
selbst bauen, aber dann:
Gut, er zeigt nur einen Bruchteil der Flags an, aber immerhin. Daher:
Und zack war die SSH-Verbindung in die VM weg. Man kann also mit einem
Tool von 1992 in aktuellen FreeBSD-Versionen noch die IP-Adresse ändern.
Das beeindruckte mich dann doch sehr. Ich beschloss das ganze noch
einmal mit "FreeBSD 1.0" vom Dezember 1993 durchzuprobieren. Auch da das
gleiche Ergebnis.
Ein "make world" dauerte übrigens knappe 55 Sekunden, Computer sind seit
dem doch ein wenig schneller geworden. FreeBSD 1 hatte auch schon Ports,
immerhin 70 Stück. Zum Glück liegt der Source bei. Schnell die tcsh
installiert, meine tcshrc hineinkopiert und endlich mal eine gute Shell.
Danach noch ein wenig weiter gespielt.
Tatsächlich habe ich nur drei Probleme gefunden:
1. Einige kernelnahe Tools wie ps funktionieren nicht.
2. Der mkdir() Syscall hatte einen Bug, der von mkdir(1) als
Feature missbraucht wurde [5]. Man kann das leicht patchen. Oder
mkdir(1) aus FreeBSD 2 bauen.
3. Der Kernel unterstützte damals 30.000 als höchste PID, aktuelle
Kernel gehen bis 99.999. Einige Programme mögen es nicht, wenn ihre
PID größer 30.000 ist und explodieren.
Insgesamt aber eine sehr interessante Erfahrung und ein hervorragendes
Beispiel dafür, wie rückkompatibel FreeBSD ist. Da kann sich so manches
andere System eine große Scheibe von abschneiden. Ebenso beeindruckend,
wie wenig sich in den letzten 25 Jahren aus Nutzersicht geändert hat und
in meinen Augen ein gutes Beispiel dafür, wie wichtig und sinnvoll die
"Policy of least astonishment" (POLA) doch ist.
Leider stellte sich heute morgen heraus, dass die MicroVAX keinen Mucks
mehr von sich gibt. Strom hat sie, aber sonst passiert nichts. Es
leuchten nicht einmal die LEDs auf. Ich vermute, dass das Netzteil
kaputt ist. Wir haben beschlossen sie in Frieden dort stehen zu
lassen.
----
Das Image für den VAX-Emulator findet sich hier:
ftp://ftp.bsdforen.de/pub/BSDForen/community/retrobsd/43bsd_simh.tar.xz
Die Dateien sind im Einzelnen:
43.tap -> 4.3BSD Installationstape
boot.ini -> Emulator-Konfiguration
boot42 -> Der Bootloader
rq.dsk -> Die Festplatte
Zum Ausführen muss SIMH (unter FreeBSD emulators/simh)
installiert werden. Er muss allerdings OHNE "-O2" gebaut
werden, denn sonst funktioniert er nicht! Anschließend kann
man die Maschine starten:
Wenn das Netzwerk genutzt werden soll, muss in der
boot.ini in Zeile 19 statt "em0" eure Netzwerkkarte
angegeben werden. Außerdem muss der Emulator
dann als root gestartet werden
Login: root
Passwort: Keines
IP-Adresse: 192.168.0.5 (kann in /etc/rc.local geändert werden)
----
386bsd findet sich unter:
http://ftp1.am.freebsd.org/pub/ancientBSD/386BSD/
FreeBSD 1.0 findet sich unter:
ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/ISO-IMAGES/FreeBSD-1.0-RELEASE/
----
1: http://simh.trailing-edge.com/
2: http://gunkies.org/wiki/Installing_4.3_BSD_on_SIMH
3: http://svnweb.freebsd.org/base/head/sbin/fsck_ffs/setup.c?r1=96475&r2=96483
4: http://security.freebsd.org/advisories/FreeBSD-EN-09:05.null.asc
5: http://unix.derkeiler.com/Mailing-Lists/FreeBSD/current/2004-02/0588.html
ihn nun einfach posten, denn dann kann ich mir einreden etwas produktives
getan zu haben.
Letzte Woche trat ein Kunde an mich heran, deutete auf eine sehr
staubige Kiste in der Ecke seiner IT-Installation und sagte, dass es
eine MicroVAX irgendwann aus den tiefsten 80er Jahren sei. Natürlich
war sie seit sehr, sehr langer Zeit nicht mehr im Einsatz, es ist wohl
keine Untertreibung, dass der Prozessor einer USB-Maus über mehr
Rechenleistung verfügt. Allerdings war das damals doch extrem teure
Gerät auch immer zu schade zum Wegwerfen. Darauf war angeblich ein
4.3BSD - ich konnte es erst nicht wirklich glauben, es seinerzeit vor
allem im akademischen Bereich zu finden war und Endkunden die Maschinen
eher mit VMS betrieben - und ich sollte mal schauen, ob das Ding noch
funktioniert. Ich kenne mich ja mit "BSD aus und so".
Da 4.3BSD gerade einmal zwei Jahre jünger ist als ich, dachte ich mir,
dass ich mich erst einmal einarbeiten sollte. Die Erfahrung sagt, dass
unbekannte Systeme immer eine gewisse Neigung dazu haben schnell kaputt
gefrickelt zu werden. Wieder zu Hause fragte ich dann Google und es gab
mir tatsächlich eine Antwort. Angeblich soll man mit SIMH [1] eine alte
VAX emulieren können und darin sogar 4.3BSD ausführen. Gesagt, getan,
recht schnell fand ich dann auch eine Anleitung [2].
Leider stürzte der Emulator gleich beim ersten Start ab. Ich kapierte es
allerdings nicht, dachte es sein eine Ausgabe des emulierten Systems. Am
Ende stellte sich heraus, dass der FreeBSD-Port von SIMH kaputt ist. Er
baut das Programm mit -O2 und bricht es damit. Also entsprechende
Änderungen vorgenommen, ein neuer Versuch und es startete. Nach der
Installation dann der erste Multiuserboot und ich fühlte mich gleich
wie zu Hause:
Code:
VAX780 simulator V3.8-1
Listening on port 8888 (socket 6)
Eth: opened em0
MAC=08:00:2B:CC:DD:EE
loading ra(0,0)boot
Boot
: ra(0,0)vmunix
279844+80872+100324 start 0x12f8
4.3 BSD UNIX #1: Fri Jun 6 19:55:29 PDT 1986
karels@monet.Berkeley.EDU:/usr/src/sys/GENERIC
real mem = 8388608
SYSPTSIZE limits number of buffers to 140
avail mem = 7187456
using 140 buffers containing 524288 bytes of memory
mcr0 at tr1
mcr1 at tr2
uba0 at tr3
hk0 at uba0 csr 177440 vec 210, ipl 15
rk0 at hk0 slave 0
rk1 at hk0 slave 1
rk2 at hk0 slave 2
rk3 at hk0 slave 3
uda0 at uba0 csr 172150 vec 774, ipl 15
ra0 at uda0 slave 0
zs0 at uba0 csr 172520 vec 224, ipl 15
ts0 at zs0 slave 0
dz0 at uba0 csr 160100 vec 300, ipl 15
de0 at uba0 csr 174510 vec 120, ipl 15
de0: hardware address 08:00:2b:cc:dd:ee
Changing root device to ra0a
Automatic reboot in progress...
Fri Dec 5 04:59:39 PST 1986
/dev/ra0a: 342 files, 4224 used, 3205 free (21 frags, 398 blocks, 0.3% fragmentation)
/dev/rra0h: 4653 files, 35746 used, 102838 free (166 frags, 12834 blocks, 0.1% fragmentation)
/dev/rra0g: 2 files, 9 used, 245216 free (16 frags, 30650 blocks, 0.0% fragmentation)
Fri Dec 5 04:59:43 PST 1986
checking quotas: done.
starting system logger
checking for core dump... /a/crash: No such file or directory
Dec 5 04:59:44 vax savecore: /a/crash: No such file or directory
starting local daemons: namedDec 5 04:59:44 vax named[54]: No root Nameserver
sendmail.
preserving editor files
clearing /tmp
standard daemons: update cron accounting.
starting network daemons: rwhod inetd printer.
Fri Dec 5 04:59:44 PST 1986
4.3 BSD UNIX (vax.happy.home.yamagi.org) (console)
login:
Die Ähnlichkeit der Bootausgabe des 4.3BSD mit der aktueller FreeBSD
Versionen ist deutlich zu sehen. Nach dem Login blieb es so. Zwar ist
das System chaotischer als FreeBSD, es liegen Dateien im /, Dinge die
nach /var gehören zum Teil in /usr, aber die Tools sind meist gleich.
Leider hat der Emulator ein eher grütziges Terminal.
Das sollte jedoch kein Problem sein. Einfach ein "ifconfig de0 inet
192.168.0.17" und schon konnte ich das Hostsystem pingen. Dann noch
telnetd gestartet und eingeloggt. Ein wenig gespielt, festgestellt dass
vi damals irgendwie noch anders als FreeBSDs nvi war, aber auch nicht
sehr. Mich dann ein wenig in /usr/games aufgehalten. Wieso liefert
FreeBSD eigentlich nicht alle BSD-Games aus? Gerade "adventure" und
"zork" sind Klassiker, "wargames" immerhin ein guter Witz.
Es ist dabei erstaunlich, wie schnell das System läuft. Wobei man
natürlich beachten muss, dass es hier trotz Emulator sicher um den
Faktor 100 oder mehr Leistung unter dem Hintern hat als auf
Originalhardware. Praktisch machen kann man damit allerdings nicht
viel, denn die damalige Software ist doch irgendwo veraltet und
der alte pcc baut keine aktuellen C-Programme durch.
Also stieg ich ein wenig in die Tiefen hinab. Auf den ersten Blick sieht
der Quellcode FreeBSD sehr ähnlich, wenn man ein wenig drin liest fällt
aber wieder auf, dass spätestens mit FreeBSD 5 und SMPng kein Stein auf
dem anderen geblieben ist. Daher dazu hier nun auch nicht mehr, es gibt
bereits genügend Doku. Zu empfehlen ist Kirk McKusicks "The Design and
Implementation of the BSD Operating System".
Eine Ausgabe der Prozesse kommt bekannt vor, auch wenn es deutlich
weniger als heute sind. Aber man musste auch mit viel weniger RAM
auskommen:
Code:
vax# ps auxww
USER PID %CPU %MEM SZ RSS TT STAT TIME COMMAND
root 94 0.0 1.6 127 103 co S 0:00 -csh (csh)
root 84 0.0 0.7 59 41 ? I 0:00 /etc/inetd
root 47 0.0 0.7 55 43 co I 0:00 /etc/syslogd
root 1 0.0 0.5 36 28 ? I 0:00 init
root 101 0.0 0.3 30 14 06 I 0:00 - std.9600 tty06 (getty)
root 102 0.0 0.3 30 14 07 I 0:00 - std.9600 tty07 (getty)
root 98 0.0 0.3 30 14 03 I 0:00 - std.9600 tty03 (getty)
root 59 0.0 2.0 177 131 ? I 0:00 /usr/lib/sendmail -bd -q30m
root 54 0.0 0.9 74 57 ? I 0:00 /etc/named /etc/named.boot
root 80 0.0 0.8 49 47 ? I 0:00 /etc/rwhod
root 72 0.0 0.5 40 27 ? I 0:00 /etc/cron
root 95 0.0 0.3 30 14 00 I 0:00 - std.9600 tty00 (getty)
root 60 0.0 1.9 177 129 ? I 0:00 -running queue (sendmail)
root 2 0.0 0.3 2048 0 ? D 0:00 pagedaemon
root 69 0.0 0.1 5 3 ? I 0:00 /etc/update
root 0 0.0 0.1 0 0 ? D 0:00 swapper
root 115 0.0 1.2 97 78 co R 0:00 ps auxww
root 89 0.0 1.0 80 67 ? I 0:00 /usr/lib/lpd
root 96 0.0 0.3 30 14 01 I 0:00 - std.9600 tty01 (getty)
root 100 0.0 0.3 30 14 05 I 0:00 - std.9600 tty05 (getty)
root 99 0.0 0.3 30 14 04 I 0:00 - std.9600 tty04 (getty)
root 97 0.0 0.3 30 14 02 I 0:00 - std.9600 tty02 (getty)
"swapper" ist der Kernel, er hieß noch bis FreeBSD 7 so. "pagedaemon"
ist Teil des VM. Ihn findet man so nicht mehr, da alle aktuellen BSDs
das VM ausgetauscht haben. FreeBSD zu dem von MACH (in den 90ern von
John Dyson grundlegend umgebaut und deutlich verbessert), NetBSD zu
einem Eigenbau. OpenBSD basiert auf NetBSD. "named" ist der gute BIND
in der Version vom 15.11.1985. "sendmail" kommt in Version vom 22.5.1986
zum Einsatz.
Alles in allem kann man zwar sagen, dass 4.3BSD nach heutigen Maßstäben
spartanisch sein mag, aber man versteht wieso es gern mal als die beste
jemals geschriebene Software bezeichnet wird. Dafür, dass 25 Jahre
vergangen sind, hat sich verdammt wenig geändert. Wer aktuelle Unixe
kennt - wobei Linux natürlich weniger als BSD - fühlt sich gleich zu
Hause. Daran können sich die "Alle 2 Jahre muss alles neu"-Fetischisten
im Bereich der GUI ein großes Stück abschneiden.
Das führte dann natürlich zu einer interessanten Frage. 4.3BSD nutzte
FFS (vor dem Aufspalten in die 3 Layer FFS, UFS und VFS) und die VAX war
Little Endian, also sollte FreeBSD es lesen können. Gesagt getan:
Code:
% mdconfig -a -t vnode -f /home/yamagi/vax/43bsd/rq.dsk
% mount /dev/md0 /mnt/
mount: /dev/md0 : Operation not permitted
Das sah nicht gut aus. Die dmesg sagte etwas von einem unsauberen
Dateisystem. Also weiß man, was zu tun ist:
Code:
% fsck_ffs /dev/md0
** /dev/md0
Format of file system is too old.
Must update to modern format using a version of fsck
from before 2002 with the command ``fsck -c 2''
"Mist", dachte ich mir. Tatsächlich fand ich schnell den Grund, beim
Sprung von FFS auf UFS1 wurde anscheinend was am internen Format
geändert. Warum allerdings die Option zum Konvertieren entfernt wurde,
ist mir nicht ganz klar. Es geschah im Rahmen von UFS2 [3]. Ich habe
dann einfach read only gemountet und war glücklich.
Code:
% mount -o ro /dev/md0 /mnt/
% mount
/dev/md0 on /mnt (ufs, NFS exported, local, read-only)
Natürlich brachte mir es nicht. Mein x86 kann keine VAX-Binaries
ausführen. Das führte zu der nächsten Idee. Die ältesten i386 Binaries
für ein BSD dürften in 386bsd enthalten sein, aus dem später FreeBSD und
NetBSD hervorgingen. Also Google angeworfen und ich wurde fündig.
Nun hatten alle BSDs vor FreeBSD 3.0 (wenigstens aus FreeBSD Sicht) aout
als Binaryformat, aus anderen Projekten wusste ich jedoch schon, dass
aout nie auf FreeBSD/amd64 portiert wurde. Ich glaube, es wäre auch nur
mit extremen Aufwand möglich. Daher habe ich erst einmal ein FreeBSD/i386
9.0-RC2 in einer VirtualBox installiert. Nun gibt es zwei Probleme:
1. Die Rückkompatiblität für (Free)BSD-Versionen vor FreeBSD 4.0 wurde
irgendwann mal aus GENERIC entfernt. Ist ja auch irgendwo
verständlich. Vorhanden ist sie aber natürlich noch.
2. Die "compat"-Ports für (Free)BSD 4 wurden ebenfalls mal entfernt.
Um das erste Problem zu lösen, habe ich also einen neuen Kernel gebaut,
der zusätzlich zu dem normalen GENERIC-Kram folgendes enthält:
Code:
options COMPAT_43
options COMPAT_43TTY
COMPAT_43 fasst die Rückkompatiblität für alle BSD-Versionen vor FreeBSD
4 zusammen "COMPAT_43TTY" bietet das zugehörige TTY-Interface.
Das zweite Problem stellt sich nicht. Die Kompatiblitätsports finden
sich im CVS (ich sollte davon echt mal Pakete bauen), da dynamisches
Linken aber erst mit FreeBSD 2 kam, braucht man sie nicht. Also einfach
den Kernel gebaut und neu gestartet. Anschließend noch die Unterstützung
für aout geladen:
Code:
% kldload aout
Dann die 386bsd CD gemountet und das System extrahiert. Bevor ich groß
mit einem chroot begann, wollte ich erst einmal teste:
Code:
% ./bin/csh
Abort
Gar nicht gut. Ein ktrace zeigte:
Code:
1065 ktrace RET ktrace 0
1065 ktrace CALL execve(0xbfbfee1b,0xbfbfecf8,0xbfbfed00)
1065 ktrace NAMI "./csh"
Da stürzt also schon der Image Activator ab. Eine kurze Diskussion auf
der Mailingliste ergab dann, dass FreeBSDs Errata EN-09:05 [4] durch das
Verhindern von mmap() auf NULL sehr alte aout-Binaries gebrochen hat.
Das läst sich aber lösen:
Code:
% sysctl security.bsd.map_at_zero=1
Tada, es funktionierte. Ich machte also ein chroot und schon war ich in
meinem 386bsd. Einen Moment staunte ich. Diese Binaries sind uralt und
dennoch funktionieren sie:
Code:
% ls /bin/csh
-r-xr-xr-x 1 bin bin 132k Jul 13 1992 cs
Okay, das war auch trivial. Also ging ich einige nicht ganz so triviale
Dinge an. Schnell stellte ich fest, dass ich ein procfs nach /386bsd
mounten muss:
Code:
% ps
ps: kvm_openfiles: can't open /dev/drum
Das war irgendwo klar. Spätestens mit der Integration von Jails wurde
die Prozesstabelle grundlegend geändert, was ps brach. Hier scheitert er
allerdings schon an einem Device. "ifconfig" musste ich mir erst einmal
selbst bauen, aber dann:
Code:
% ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX>
inet 192.168.0.106 netmask ffffff00 broadcast 192.168.0.255
Gut, er zeigt nur einen Bruchteil der Flags an, aber immerhin. Daher:
Code:
% ifconfig em0 inet 192.168.0.17
Und zack war die SSH-Verbindung in die VM weg. Man kann also mit einem
Tool von 1992 in aktuellen FreeBSD-Versionen noch die IP-Adresse ändern.
Das beeindruckte mich dann doch sehr. Ich beschloss das ganze noch
einmal mit "FreeBSD 1.0" vom Dezember 1993 durchzuprobieren. Auch da das
gleiche Ergebnis.
Ein "make world" dauerte übrigens knappe 55 Sekunden, Computer sind seit
dem doch ein wenig schneller geworden. FreeBSD 1 hatte auch schon Ports,
immerhin 70 Stück. Zum Glück liegt der Source bei. Schnell die tcsh
installiert, meine tcshrc hineinkopiert und endlich mal eine gute Shell.
Danach noch ein wenig weiter gespielt.
Tatsächlich habe ich nur drei Probleme gefunden:
1. Einige kernelnahe Tools wie ps funktionieren nicht.
2. Der mkdir() Syscall hatte einen Bug, der von mkdir(1) als
Feature missbraucht wurde [5]. Man kann das leicht patchen. Oder
mkdir(1) aus FreeBSD 2 bauen.
3. Der Kernel unterstützte damals 30.000 als höchste PID, aktuelle
Kernel gehen bis 99.999. Einige Programme mögen es nicht, wenn ihre
PID größer 30.000 ist und explodieren.
Insgesamt aber eine sehr interessante Erfahrung und ein hervorragendes
Beispiel dafür, wie rückkompatibel FreeBSD ist. Da kann sich so manches
andere System eine große Scheibe von abschneiden. Ebenso beeindruckend,
wie wenig sich in den letzten 25 Jahren aus Nutzersicht geändert hat und
in meinen Augen ein gutes Beispiel dafür, wie wichtig und sinnvoll die
"Policy of least astonishment" (POLA) doch ist.
Leider stellte sich heute morgen heraus, dass die MicroVAX keinen Mucks
mehr von sich gibt. Strom hat sie, aber sonst passiert nichts. Es
leuchten nicht einmal die LEDs auf. Ich vermute, dass das Netzteil
kaputt ist. Wir haben beschlossen sie in Frieden dort stehen zu
lassen.
----
Das Image für den VAX-Emulator findet sich hier:
ftp://ftp.bsdforen.de/pub/BSDForen/community/retrobsd/43bsd_simh.tar.xz
Die Dateien sind im Einzelnen:
43.tap -> 4.3BSD Installationstape
boot.ini -> Emulator-Konfiguration
boot42 -> Der Bootloader
rq.dsk -> Die Festplatte
Zum Ausführen muss SIMH (unter FreeBSD emulators/simh)
installiert werden. Er muss allerdings OHNE "-O2" gebaut
werden, denn sonst funktioniert er nicht! Anschließend kann
man die Maschine starten:
Code:
% vax780 boot.ini
Wenn das Netzwerk genutzt werden soll, muss in der
boot.ini in Zeile 19 statt "em0" eure Netzwerkkarte
angegeben werden. Außerdem muss der Emulator
dann als root gestartet werden
Login: root
Passwort: Keines
IP-Adresse: 192.168.0.5 (kann in /etc/rc.local geändert werden)
----
386bsd findet sich unter:
http://ftp1.am.freebsd.org/pub/ancientBSD/386BSD/
FreeBSD 1.0 findet sich unter:
ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/ISO-IMAGES/FreeBSD-1.0-RELEASE/
----
1: http://simh.trailing-edge.com/
2: http://gunkies.org/wiki/Installing_4.3_BSD_on_SIMH
3: http://svnweb.freebsd.org/base/head/sbin/fsck_ffs/setup.c?r1=96475&r2=96483
4: http://security.freebsd.org/advisories/FreeBSD-EN-09:05.null.asc
5: http://unix.derkeiler.com/Mailing-Lists/FreeBSD/current/2004-02/0588.html
Zuletzt bearbeitet: