Un pan de l'histoire: 4.3 BSD sur VAX 11/780 avec SIMH
Ça fait un bout de temps que j’avais envie d’installer des vieilles versions d’Unix car c’est quand même de là que démarre toute l’informatique moderne, les concepts sous-jacents des systèmes d’exploitation et l’essor même d’Internet (DARPA, TCP/IP, …).
Entre temps je suis tombé sur des anciennes vidéos Youtube de Emile `iMil’ Heitor sur le monde BSD, Unix qui sont super intéressantes.
Et donc je me suis lancé dans l’aventure: quoi de mieux pour cela que d’installer et faire tourner un 4.3 BSD, dérivé d’Unix, un sacré morceau d’histoire!
4.3 BSD est d’ailleurs cité comme étant le The Greatest Software Ever Written
The single Greatest Piece of Software Ever, with the broadest impact on the world, was BSD 4.3. Other Unixes were bigger commercial successes. But as the cumulative accomplishment of the BSD systems, 4.3 represented an unmatched peak of innovation. BSD 4.3 represents the single biggest theoretical undergirder of the Internet. Moreover, the passion that surrounds Linux and open source code is a direct offshoot of the ideas that created BSD: a love for the power of computing and a belief that it should be a freely available extension of man’s intellectual powers–a force that changes his place in the universe.
Installation et configuration
Je ne vais pas rentrer dans le détail de l’installation car j’ai suivi à la lettre ce guide: https://gunkies.org/wiki/Installing_4.3_BSD_on_SIMH et cela a parfaitement fonctionné du 1er coup.
En prérequis, j’ai juste installé Open SimH (sur une VM NetBSD) ainsi que l’interpréteur Perl:
- Open SimH - Bringing Antiquities back to life est un simulateur pour les vieux ordinateurs des années 60/70/80 (VAX, PDP11, IBM 1401, Altair, etc…)
- Perl: on en a besoin pour lancer un script perl qui créera des images de bande de disques nécessaires à SIMH
Pour installer ces packages, on peut utiliser au choix pkg_add ou bien pkgin (il installera également les dépendances).
Les packages que j’ai installé sont les suivants:
- perl-5.40.2
- open-simh-4.1.0.20250117nb2
1er démarrage du système 4.3 BSD
Après avoir suivi le tutoriel et initialisé le système en restorant des dumps, il ne reste plus qu’à démarrer notre illustre 4.3 BSD depuis la ligne de commande:
simh-vax780 boot.ini
Et là on ouvre grand les yeux et on retourne près de 40 ans en arrière.
Rien que ça!
VAX 11/780 simulator Open SIMH V4.1-0 Current simh git commit id: feb155fb Build: Unsupported=include+lib
/home/vince/simh/43bsd/boot.ini-11> att ts 43.tap
%SIM-INFO: TS: Tape Image '43.tap' scanned as SIMH format
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
dz1 at uba0 csr 160110 vec 310, ipl 15
dz2 at uba0 csr 160120 vec 320, ipl 15
dz3 at uba0 csr 160130 vec 330, ipl 15
Changing root device to ra0a
Automatic reboot in progress...
Wed May 28 07:21:16 PDT 1986
/dev/ra0a: 334 files, 4221 used, 3208 free (8 frags, 400 blocks, 0.1% fragmentation)
/dev/rra0h: 4651 files, 35659 used, 102925 free (453 frags, 12809 blocks, 0.3% fragmentation)
/dev/rra0g: 2 files, 9 used, 245216 free (16 frags, 30650 blocks, 0.0% fragmentation)
Wed May 28 07:21:18 PDT 1986
checking quotas: done.
starting system logger
checking for core dump... /a/crash: No such file or directory
May 28 07:21:18 myname savecore: /a/crash: No such file or directory
starting local daemons:May 28 07:21:19 myname named[53]: /etc/named.boot: No such file or directory
named sendmail.
preserving editor files
clearing /tmp
standard daemons: update cronWed May 28 07:21:19 PDT 1986
accounting.
starting network daemons: rwhod inetd printer.
Wed May 28 07:21:19 PDT 1986
May 28 07:21:21 myname getty: /dev/tty07: No such file or directory
May 28 07:21:21 myname getty: /dev/tty05: No such file or directory
May 28 07:21:21 myname getty: /dev/tty04: No such file or directory
May 28 07:21:21 myname getty: /dev/tty01: No such file or directory
May 28 07:21:21 myname getty: /dev/tty02: No such file or directory
May 28 07:21:21 myname getty: /dev/tty03: No such file or directory
4.3 BSD UNIX (myname.my.domain) (console)
login: May 28 07:21:21 myname getty: /dev/tty06: No such file or directory
May 28 07:21:21 myname getty: /dev/tty00: No such file or directory
root
Last login: Wed May 28 04:22:35 on console
May 28 07:22:06 myname login: ROOT LOGIN console
4.3 BSD UNIX #1: Fri Jun 6 19:55:29 PDT 1986
Would you like to play a game?
Don't login as root, use su
myname# date
Wed May 28 07:22:31 PDT 1986
La dinguerie: nous voici revenus le 28 Mai 1986 avec 4.3 BSD et une implémentation de la pile TCP/IP!
Rien que ça!
On fait un tour rapide
On tape quelques commandes pour en savoir un peu plus.
myname# date
Wed May 28 08:20:04 PDT 1986
Voyons voir les processus qui tourent au démarrage de 4.3BSD:
myname# ps ax
PID TT STAT TIME COMMAND
0 ? D 0:00 swapper
1 ? I 0:00 init
2 ? D 0:00 pagedaemon
46 co S 0:00 /etc/syslogd
58 ? I 0:00 /usr/lib/sendmail -bd -q30m
61 ? S 0:00 -running queue (sendmail)
68 ? S 0:00 /etc/update
71 ? I 0:00 /etc/cron
79 ? I 0:00 /etc/rwhod
83 ? I 0:00 /etc/inetd
88 ? I 0:00 /usr/lib/lpd
93 co S 0:00 -csh (csh)
94 ? S 0:00 - std.9600 tty00 (getty)
95 ? S 0:00 - std.9600 tty01 (getty)
96 ? S 0:00 - std.9600 tty02 (getty)
97 ? S 0:00 - std.9600 tty03 (getty)
98 ? S 0:00 - std.9600 tty04 (getty)
99 ? S 0:00 - std.9600 tty05 (getty)
100 ? S 0:00 - std.9600 tty06 (getty)
101 ? S 0:00 - std.9600 tty07 (getty)
109 co R 0:00 ps ax
Et oui on retrouve entre autre:
- le processus init (pid 1) forcément!
- ainsi que inetd qui gère les connexions et services réseaux (remplacé depuis par
la grosse bousesystemd) - cron
- les services d’envoi de mail et d’impression
Tiens c’est marrant, on a le owner mais pas le group sur la sortie standard de la commande ls:
myname# ls -l /
total 959
-rw-r--r-- 1 root 995 Sep 16 1985 .cshrc
-rw-r--r-- 1 root 137 Jun 23 1985 .login
-rw-r--r-- 1 root 121 Jun 23 1985 .profile
drwxrwxr-x 2 root 512 Jun 23 1985 a/
drwxr-xr-x 2 root 1024 Jun 6 1986 bin/
-rw-r--r-- 1 root 27648 Jun 6 1986 boot
-rwxrwxr-x 1 root 24184 Jun 6 1986 copy*
drwxrwxr-x 2 root 2048 May 28 08:18 dev/
-rwxrwxr-x 1 root 16000 Jun 6 1986 drtest*
drwxrwxr-x 2 root 2560 May 28 08:18 etc/
-rwxrwxr-x 1 root 21104 Jun 6 1986 format*
-rwxr-xr-x 2 root 407552 Jun 6 1986 genvmunix*
drwxr-xr-x 2 root 512 Jun 5 1986 lib/
drwxr-xr-x 2 root 8192 Feb 1 21:42 lost+found/
drwxr-xr-x 3 root 512 May 28 03:35 mnt/
-r--r--r-- 1 root 11264 Jun 6 1986 pcs750.bin
-rw-r--r-- 1 root 20740 May 28 03:27 restoresymtable
lrwxr-xr-x 1 root 8 May 28 03:34 sys@ -> /usr/sys
drwxrwxrwt 2 root 512 May 28 08:18 tmp/
drwxr-xr-x 23 root 512 May 28 03:32 usr/
-rwxr-xr-x 2 root 407552 Jun 6 1986 vmunix*
Sinon on reconnaît une arborescence Unix à-peu-près standard: /bin, /usr, /lib, /mnt, etc…
La commande uname n’existait pas encore à cette époque:
myname# uname
uname: Command not found.
Allons voir du côté du fichier /etc/passwd:
myname# cat /etc/passwd
root::0:10:Charlie &:/:/bin/csh
toor::0:10:Bourne-again Superuser:/:
daemon:*:1:31:The devil himself:/:
operator::2:28:System &:/usr/guest/operator:/bin/csh
uucp::66:1:UNIX-to-UNIX Copy:/usr/spool/uucppublic:/usr/lib/uucp/uucico
nobody:*:32767:9999:Unprivileged user:/nonexistent:/dev/null
notes:*:5:31:Notesfile maintainer:/usr/spool/notes:/bin/csh
karels:QOrZFUGpxDUlo:6:10:Mike &:/usr/guest/karels:/bin/csh
sam:Yd6H6R7ejeIP2:7:10:& Leffler:/usr/guest/sam:/bin/csh
wnj:ZDjXDBwXle2gc:8:10:Bill Joy:/usr/guest/wnj:/bin/csh
mckusick:6l7zMyp8dZLZU:201:10:Kirk &:/usr/guest/mckusick:/bin/csh
dmr:AiInt5qKdjmHs:10:31:Dennis Ritchie:/usr/guest/dmr:
ken:sq5UDrPlKj1nA:11:31:& Thompson:/usr/guest/ken:
shannon:NYqgD2jjeuozk:12:31:Bill &:/usr/guest/shannon:/bin/csh
peter:y5G5mbEX4HhOY:13:31:peter b. kessler:/usr/guest/peter:/bin/csh
kre:vpyVBWM3ARc0.:14:31:Robert Elz:/usr/guest/kre:/bin/csh
ingres:64c19dZOElp9I:267:74:& Group:/usr/ingres:/bin/csh
ralph:s.EZm/wQTqbro:16:31:& Campbell:/usr/guest/ralph:/bin/csh
linton:1/WWIjn5Sd8qM:19:31:Mark &:/usr/guest/linton:/bin/csh
sklower:p0taJy06Qye1g:20:31:Keith &:/usr/guest/sklower:/bin/csh
eric:PcEfNNJN.UHpM:22:31:& Allman:/usr/guest/eric:/usr/new/csh
rrh:lj1vXnxTAPnDc:23:31:Robert R. Henry:/usr/guest/rrh:/bin/csh
arnold:5vTJh54EqjZsU:25:31:Kenneth C R C &:/usr/guest/arnold:/bin/csh
jkf:G6cip/I8C792U:26:31:John Foderaro:/usr/guest/jkf:/bin/csh
ghg:FA/4weg1/wy2c:32:31:George Goble:/usr/guest/ghg:/bin/csh
bloom:n0QtVD80F82MM:33:10:Jim &:/usr/guest/bloom:/bin/csh
miriam:hnZ1ZK5H2qapE:36:10:& Amos:/usr/guest/miriam:/bin/csh
kjd:ogYPQZGnihezk:37:10:Kevin Dunlap:/usr/guest/kjd:/bin/csh
rwh:LReNSwE9gQF7w:38:10:Robert W. Henry:/usr/guest/rwh:/bin/csh
tef:OciUqGHcs9YOw:39:31:Thomas Ferrin:/usr/guest/tef:/bin/csh
van:STpwu/Ggmk78A:40:31:& Jacobson:/usr/guest/van:/bin/csh
rich:uxxJaRZvgyiPg:41:31:& Hyde:/usr/guest/rich:/bin/csh
jim:.6s.pzMqjyMrU:42:10:& McKie:/usr/guest/jim:/bin/csh
donn:5cJ5uHclmVJKA:43:31:& Seeley:/usr/guest/donn:/bin/csh
falcon:.MTZpW8TC8tqs:32766:31:Prof. Steven &:/usr/games:/usr/games/wargames
On reconnaît bien quelques sommités dans ce fichier, je vous laisse les retrouver!
On va faire un tour rapide dans les sources du système:
myname# cd /usr/sys/sys
myname# ls
Makefile quota_kern.c tty_pty.c uipc_proto.c
init_main.c quota_subr.c tty_subr.c uipc_socket.c
init_sysent.c quota_sys.c tty_tb.c uipc_socket2.c
kern_acct.c quota_ufs.c tty_tty.c uipc_syscalls.c
kern_clock.c subr_log.c ufs_alloc.c uipc_usrreq.c
kern_descrip.c subr_mcount.c ufs_bio.c vm_drum.c
kern_exec.c subr_prf.c ufs_bmap.c vm_mem.c
kern_exit.c subr_rmap.c ufs_dsort.c vm_mon.c
kern_fork.c subr_xxx.c ufs_fio.c vm_page.c
kern_mman.c sys_generic.c ufs_inode.c vm_proc.c
kern_proc.c sys_inode.c ufs_mount.c vm_pt.c
kern_prot.c sys_process.c ufs_namei.c vm_sched.c
kern_resource.c sys_socket.c ufs_subr.c vm_subr.c
kern_sig.c syscalls.c ufs_syscalls.c vm_sw.c
kern_subr.c tags ufs_tables.c vm_swap.c
kern_synch.c tty.c ufs_xxx.c vm_swp.c
kern_time.c tty_bk.c uipc_domain.c vm_text.c
kern_xxx.c tty_conf.c uipc_mbuf.c
myname#
C’est génial de voir tout ça! Ces vestiges du passé qu’on retrouve toujours dans de très nombreux devices qu’on utilise au quotidien (ordinateur, téléphone, IoT, embarqué, consoles de jeux, etc…).
L’implémentation d’un fork:
myname# more kern_fork.c
/*
* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)kern_fork.c 7.1 (Berkeley) 6/5/86
*/
#include "../machine/reg.h"
#include "../machine/pte.h"
#include "../machine/psl.h"
#include "param.h"
#include "systm.h"
#include "map.h"
#include "dir.h"
#include "user.h"
#include "kernel.h"
#include "proc.h"
#include "inode.h"
#include "seg.h"
#include "vm.h"
#include "text.h"
#include "file.h"
#include "acct.h"
#include "quota.h"
/*
* fork system call.
*/
fork()
{
u.u_cdmap = zdmap;
u.u_csmap = zdmap;
if (swpexpand(u.u_dsize, u.u_ssize, &u.u_cdmap, &u.u_csmap) == 0) {
u.u_r.r_val2 = 0;
return;
}
fork1(0);
}
vfork()
{
fork1(1);
}
fork1(isvfork)
int isvfork;
{
register struct proc *p1, *p2;
register a;
a = 0;
if (u.u_uid != 0) {
for (p1 = allproc; p1; p1 = p1->p_nxt)
if (p1->p_uid == u.u_uid)
a++;
for (p1 = zombproc; p1; p1 = p1->p_nxt)
if (p1->p_uid == u.u_uid)
a++;
}
/*
* Disallow if
* No processes at all;
* not su and too many procs owned; or
* not su and would take last slot.
*/
p2 = freeproc;
if (p2==NULL)
tablefull("proc");
if (p2==NULL || (u.u_uid!=0 && (p2->p_nxt == NULL || a>MAXUPRC))) {
u.u_error = EAGAIN;
if (!isvfork) {
(void) vsexpand((size_t)0, &u.u_cdmap, 1);
(void) vsexpand((size_t)0, &u.u_csmap, 1);
}
goto out;
}
p1 = u.u_procp;
if (newproc(isvfork)) {
u.u_r.r_val1 = p1->p_pid;
u.u_r.r_val2 = 1; /* child */
u.u_start = time;
u.u_acflag = AFORK;
return;
}
u.u_r.r_val1 = p2->p_pid;
out:
u.u_r.r_val2 = 0;
}
/*
* Create a new process-- the internal version of
* sys fork.
* It returns 1 in the new process, 0 in the old.
*/
newproc(isvfork)
int isvfork;
{
register struct proc *rpp, *rip;
register int n;
register struct file *fp;
static int pidchecked = 0;
/*
* First, just locate a slot for a process
* and copy the useful info from this process into it.
...
...
...
Last but not least: la pile TCP/IP
Enorme ça:
cd /usr/sys/netinet
myname# ls -l
total 197
-r--r--r-- 1 root 984 Jun 5 1986 icmp_var.h
-r--r--r-- 1 root 13637 Jun 5 1986 if_ether.c
-r--r--r-- 1 root 2286 Jun 5 1986 if_ether.h
-r--r--r-- 1 root 9852 Jun 5 1986 in.c
-r--r--r-- 1 root 2801 Jun 5 1986 in.h
-r--r--r-- 1 root 9122 Jun 5 1986 in_pcb.c
-r--r--r-- 1 root 1262 Jun 5 1986 in_pcb.h
-r--r--r-- 1 root 2921 Jun 5 1986 in_proto.c
-r--r--r-- 1 root 832 Jun 5 1986 in_systm.h
-r--r--r-- 1 root 1456 Jun 5 1986 in_var.h
-r--r--r-- 1 root 3150 Jun 5 1986 ip.h
-r--r--r-- 1 root 10110 Jun 5 1986 ip_icmp.c
-r--r--r-- 1 root 3427 Jun 5 1986 ip_icmp.h
-r--r--r-- 1 root 22317 Jun 5 1986 ip_input.c
-r--r--r-- 1 root 10531 Jun 5 1986 ip_output.c
-r--r--r-- 1 root 2954 Jun 5 1986 ip_var.h
-r--r--r-- 1 root 3224 Jun 5 1986 raw_ip.c
lrwxr-xr-x 1 root 11 May 28 03:33 tags@ -> ../sys/tags
-r--r--r-- 1 root 1313 Jun 5 1986 tcp.h
-r--r--r-- 1 root 2656 Jun 5 1986 tcp_debug.c
-r--r--r-- 1 root 666 Jun 5 1986 tcp_debug.h
-r--r--r-- 1 root 1956 Jun 5 1986 tcp_fsm.h
-r--r--r-- 1 root 27338 Jun 5 1986 tcp_input.c
-r--r--r-- 1 root 11027 Jun 5 1986 tcp_output.c
-r--r--r-- 1 root 1013 Jun 5 1986 tcp_seq.h
-r--r--r-- 1 root 6579 Jun 5 1986 tcp_subr.c
-r--r--r-- 1 root 4992 Jun 5 1986 tcp_timer.c
-r--r--r-- 1 root 4145 Jun 5 1986 tcp_timer.h
-r--r--r-- 1 root 10615 Jun 5 1986 tcp_usrreq.c
-r--r--r-- 1 root 3094 Jun 5 1986 tcp_var.h
-r--r--r-- 1 root 885 Jun 5 1986 tcpip.h
-r--r--r-- 1 root 474 Jun 5 1986 udp.h
-r--r--r-- 1 root 7821 Jun 5 1986 udp_usrreq.c
-r--r--r-- 1 root 912 Jun 5 1986 udp_var.h
Tu es plutôt TCP ou UDP? socket local ou remote?
Je ne suis pas développeur C mais je trouve que ça se lit plutôt facilement et qu’on comprend l’idée et les concepts généraux.
myname# more /usr/sys/h/socket.h
/*
* Copyright (c) 1982,1985, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)socket.h 7.1 (Berkeley) 6/4/86
*/
/*
* Definitions related to sockets: types, address families, options.
*/
/*
* Types
*/
#define SOCK_STREAM 1 /* stream socket */
#define SOCK_DGRAM 2 /* datagram socket */
#define SOCK_RAW 3 /* raw-protocol interface */
#define SOCK_RDM 4 /* reliably-delivered message */
#define SOCK_SEQPACKET 5 /* sequenced packet stream */
...
...
...
/*
* Address families.
*/
#define AF_UNSPEC 0 /* unspecified */
#define AF_UNIX 1 /* local to host (pipes, portals) */
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
...
...
...
/*
* Structure used by kernel to store most
* addresses.
*/
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
Voyons le contenu du fichier /etc/hosts:
myname# cat /etc/hosts
#
# Host Database
# This file should contain the addresses and aliases
# for local hosts that share this file.
# It is used only for "ifconfig" and other operations
# before the nameserver is started.
#
# Choose a distinguished local network address for localhost.
#
0.1 localhost localhost.my.domain
#
# Imaginary network.
0.2 myname.my.domain myname
0.3 myfriend.my.domain myfriend
D’ailleurs dans le répertoire /etc on y trouve aussi des fichiers exécutables, on y trouve par exemple:
- ftpd et tftpd
- telnetd: on utilise depuis un bout de temps ssh pour les connexions distantes mais il y a longtemps on utilisait telnet (même pour tester la connexion à un service distant)
myname# ls /etc
MAKEDEV flcopy* hosts.equiv passwd rshd*
XNSrouted* fsck* htable* passwd.dir rwhod*
ac* fstab icheck* passwd.pag rxformat*
accton* fstab.hp ifconfig* ping* sa*
arff* fstab.hp400m implog* printcap savecore*
arp* fstab.ra60 implogd* protocols services
bad144* fstab.ra80 inetd* psdatabase shells
badsect* fstab.ra81 inetd.conf pstat* shutdown*
catman* fstab.rb80 init* quot* swapon*
chown* fstab.rk07 kgmon* quotacheck* syslog.conf
clri* fstab.rm03 lpc* quotaoff* syslog.pid
comsat* fstab.rm05 map3270 quotaon* syslogd*
config* fstab.rm80 mkfs* rc talkd*
cron* fstab.rp06 mklost+found* rc.local telnetd*
dcheck* fstab.rp07 mknod* rdump* termcap
diskpart* fstab.up mkpasswd* reboot* tftpd*
disktab fstab.up160m mkproto* remote timed*
dmesg* fstab.up300m motd renice* timedc*
dump* ftpd* mount* repquota* trpt*
dump.4.1* ftpusers mtab restore* ttys
dumpdates gettable* named* rexecd* tunefs*
dumpfs* getty* ncheck* rlogind* umount*
edquota* gettytab networks rmt* update*
fastboot* group newfs* route* utmp
fasthalt* halt* ntalkd* routed* uucpd*
fingerd* hosts pac* rrestore* vipw*
Aller j’arrête là car je pourrais y passer des heures et jours entier!
Un coup de dmesg
pour voir ce que ça raconte:
myname# dmesg
May 28 09:00
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
dz1 at uba0 csr 160110 vec 310, ipl 15
dz2 at uba0 csr 160120 vec 320, ipl 15
dz3 at uba0 csr 160130 vec 330, ipl 15
Changing root device to ra0a
Même si cela ne sert à rien car on est dans un simulateur, on lance un arrêt du système proprement, c’est la classe qu’en même:
myname# shutdown -h now
Shutdown at 08:45 (in 0 minutes) [pid 168]
myname#
*** FINAL System shutdown message from root@myname.my.domain ***
System going down IMMEDIATELY
System shutdown time has arrived
May 28 08:45:31 myname shutdown: halt by root:
May 28 08:45:34 myname syslogd: going down on signal 15
syncing disks... done
halting (in tight loop); hit
^P
HALT
Infinite loop, PC: 8002AFCD (BRB 8002AFCD)
sim> q
Goodbye
Pour en finir
Rappelons tout même que le VAX 11/780 ressemblait à ceci:
Je me suis vraiment amusé et j’ai pris beaucoup de plaisir à installer et jouer un peu avec 4.3BSD!
J’espère que vous ferez autant! Je retenterai l’expérience sur d’autres systèmes et d’autres vestiges du passé, je pense notamment au serveur web httpd du CERN !