Today I am revisiting a guide I originally wrote c. 2009 on installing and using OpenVMS 7.3 on a SIMH VAX. As well as updating some dead links and going through the processes in the article there's also the twist of using OpenBSD as the host, which in turn is running as a Proxmox VE Qemu/KVM guest.
OpenVMS is an operating system originally developed by DEC (Digital Equipment Corporation), a company acquired by Compaq which was then acquired by HP for the VAX platform.
Although development started in the mid-1970s into the 1980s, OpenVMS is still very much alive today - you can find 7.3 and 8.4 installations running in the wild, though 7.3 is the last available version available for VAX (which is no longer being maintained), and the odd patches released in recent years for 8.4 on the DEC Alpha (AXP) and Intel Itanium (IA-64) architectures. With the release of VSI's port of OpenVMS to x86-64, there is continued interest and development in this somewhat esoteric operating system that dominated industry for its rock-solid reliability, security, and multi-user performance.
OpenVMS pioneered high availability systems, with clusters of VMS machines allowing shared disks and memories - contributing to the exceptional 'uptime' of these systems; Its versioning file system kept file histories automatically, allowing previous versions to be accessed or reverted to at any time - an important feature for enterprise computing; and unlike early Unix it had fine-grained privilege levels and excellent security model that attracted governments, banks, airlines, and healthcare providers as well as enterprises to it.
Even Oracle, who acquired DEC's Rdb RDBMS, previously stated that they will continue to support and develop Rdb on OpenVMS, creating a lesser gap between it and Oracle Database systems - though as is often the case with Oracle, resource/developer allocation for these things changes and eventually dies out as business needs change but they have continued to maintain it with a major release in 2020 of Rdb 7.4 supporting Alpha and Itanium OpenVMS systems with an x86-64 port in development since 2018. Minor releases are as recent as June of 2025 with the 7.4.1.4 kit.
SIMH is a set of emulators for various systems and is developed by Bob Supnik, who is a former engineer for DEC. One of the systems it is able to emulate is the VAX. This is what we're interested in. An excellent feature of SIMH (among many) is that it supports networking (albeit experimental support; I've had no problems so far).
Although the VAX architecture and OpenVMS 7.3 are considered properly EOL now, they make fascinating hobbyist systems that can be emulated extremely well thanks to SIMH. Considering how quickly technology reaches EOL these days and despite VAX hardware being replaced by Alpha in 1997, OpenVMS/VAX 7.3 was still being supported as recently as 2015.
As VSI replaced the ~20-year hobbyist programme (DECUS/Encompass, Compaq, then HP), then with their own, those wishing to use OpenVMS/VAX for hobbyist purposes must use other means to secure OpenVMS PAKs (Product Authorization Keys).
You will also need install media, here are the files I'm using:
- MD5 (OpenVMS-VAX-7.3.iso) = 47230b92b15693c5e50b4ce18e2d6010
- MD5 (Openvms%20Vax%2073%20Supplement.zip) = 1536f14fd598d4efb735b3cbf77c4907
Installing SIMH
OpenBSD
doas pkg_add simh
Alternatively, build what you need:
doas pkg_add gmake pcre sdl2 sdl2-ttf png
git clone https://github.com/simh/simh
cd simh
gmake -j$(sysctl -n hw.ncpu) vax
Others
Most GNU/Linux distro package repos ought to have SIMH but it is quite simple to compile and, in some cases, better if you intend to use VDE (Virtual Distributed Ethernet).
Optional proxmox/KVM/qemu guest stuff
doas pkg_add qemu-ga
doas rcctl enable qemu_ga
doas rcctl set qemu_ga flags -t /var/run/qemu-ga \
-f /var/run/qemu-ga/qemu-ga.pid -m isa-serial -p /dev/cua00
In Proxmox, enable QEMU Guest Agent in options and make sure Type is set to ISA.
Network configuration
We will create our network config line by line, but also modify the relevent files after each change (assuming you want changes to persist).
On GNU/Linux systems you can take advantage of VDE (https://github.com/virtualsquare/vde-2) which can be used to allow SIMH to be run with networking as a non-root user (as well as providing a lot of flexibility), but it's not supported on OpenBSD.
On OpenBSD, we will manually create a virtual ethernet device, a tap interface, and add them to a bridge. We then create a group for the user running SIMH and change permissions on the tap device.
Create an ethernet tunnel interface / tap(4) device for our sim:
doas ifconfig tap0 create
/etc/hostname.tap0:
up
Create the layer 3 endpoint for the internal LAN using a virtual ethernet device - vether(4):
doas ifconfig vether0 create
doas ifconfig vether0 10.69.69.1/24 up
/etc/hostname.vether0:
inet 10.69.69.1 255.255.255.0
up
Create an internal layer 2 switch and add our tap(4) and vether(4) devices:
doas ifconfig bridge0 create
doas ifconfig bridge0 add vether0 add tap0 up
/etc/hostname.bridge0:
add vether0
add tap0
up
Create a group for the user running SIMH and modify group+perms for tap0:
doas groupadd simhnet
doas usermod -G simhnet openvms
doas chgrp simhnet /dev/tap0
doas chmod 660 /dev/tap0
Persist these changes through boots in /etc/rc.local:
chgrp simhnet /dev/tap0
chmod 660 /dev/tap0
Enable and persist IPv4 forwarding:
doas sysctl net.inet.ip.forwarding=1
echo 'net.inet.ip.forwarding=1' | doas tee -a /etc/sysctl.conf
NAT and port forwarding using PF
Let's assume our SIMH VAX guest will have an IP of 10.69.69.2 and our host (OpenBSD) has vio0 as its external interface:
/etc/pf.conf:
ext_if="vio0"
int_net="10.69.69.0/24"
int_if="vether0"
set skip on lo
block all
# NAT from the SIMH bridge/vether to the external interface
pass out on $ext_if inet from $int_if:network nat-to ($ext_if)
# OpenVMS telnet (forwarded 6923->23)
pass in on egress inet proto tcp to port 6923 rdr-to 10.69.69.2 port 23
pass out on $int_if proto tcp to 10.69.69.2 port 23 received-on $ext_if nat-to $int_if
# SSH (for OpenBSD host-guest)
pass in quick proto tcp to ($ext_if) port ssh flags S/SA keep state
# Web (for OpenBSD host-guest)
pass in on egress proto tcp from any to egress port 80
pass in on egress proto tcp from any to egress port 443
Test, enable, and apply:
doas pfctl -f /etc/pf.conf
doas pfctl -e
OpenVMS
Grab the OpenVMS media and ka655x.bin:
ftp https://mirrors.pdp-11.ru/_vax/_VMS/_distrib/7.X/OpenVMS-VAX-7.3.iso
cp /usr/local/lib/simh/vax/ka655x.bin ./
openvms.ini:
; Load CPU microcode
load -r ka655x.bin
;
; Set memory allocation to 64M
set cpu 64m
set cpu simhalt
set cpu idle=vms
;
attach nvr /home/openvms/nvram.bin
;
; We will have 2 DEC RA92 disk drives, about 1.5G capacity.
set rq0 ra92
set rq1 ra92
;
; rq3 will be a CD-ROM drive
set rq3 cdrom
;
; Attach the devices to files, these will be our virtual disks
attach rq0 d0.dsk
attach rq1 d1.dsk
;
; Attach our installation media ISO to CD-ROM drive rq3
attach -r rq3 OpenVMS-VAX-7.3.iso
;
; We don't need rl and ts devices, so we can disable them.
;
set rl disable
set ts disable
set xq enable
set xq type=delqa
set xq max=08-00-2b-11-22-33
attach xq tap:tap0
; 10.69.69.2/24, gw 10.69.69.1
boot cpu
Run SIMH with our config as our user 'openvms':
simh-vax ./openvms.ini
If everything went okay, you should see something like:
cgx$ simh-vax ./openvms.ini
VAX simulator V3.9-0
RQ: unit is read only
Eth: opened OS device tap0
KA655-B V5.3, VMB 2.7
Performing normal system tests.
40..39..38..37..36..35..34..33..32..31..30..29..28..27..26..25..
24..23..22..21..20..19..18..17..16..15..14..13..12..11..10..09..
08..07..06..05..04..03..
Tests completed.
>>>
Boot our install media on dua3:
>>>boot dua3
(BOOT/R5:0 DUA3
2..
-DUA3
1..0..
%SYSBOOT-I-SYSBOOT Mapping the SYSDUMP.DMP on the System Disk
%SYSBOOT-W-SYSBOOT Can not map SYSDUMP.DMP on the System Disk
%SYSBOOT-W-SYSBOOT Can not map PAGEFILE.SYS on the System Disk
OpenVMS (TM) VAX Version X7G7 Major version id = 1 Minor version id = 0
%WBM-I-WBMINFO Write Bitmap has successfully completed initialization.
PLEASE ENTER DATE AND TIME (DD-MMM-YYYY HH:MM) 15-OCT-2025 16:27
Configuring devices . . .
Now configuring HSC, RF, and MSCP-served devices . . .
Please check the names of the devices which have been configured,
to make sure that ALL remote devices which you intend to use have
been configured.
If any device does not show up, please take action now to make it
available.
Available device DUA0: device type RA92
Available device DUA1: device type RA92
Available device DUA2: device type RD54
Available device DUA3: device type RRD40
Available device DYA0: device type RX02
Available device DYA1: device type RX02
Available device MUA0: device type TK50
Available device MUA1: device type TK50
Available device MUA2: device type TK50
Available device MUA3: device type TK50
Enter "YES" when all needed devices are available: YES
%BACKUP-I-IDENT, Stand-alone BACKUP T7.2; the date is 15-OCT-2025 16:29:13.31
You will now be dropped at what looks like a shell-prompt. OpenVMS and OpenVMS components are generally installed by extracting backup archives. This of course comes from the days when tape drives were more common. Let's extract the backup saveset to our first drive with "backup dua3:vms073.b/save_set dua0:":
$ backup dua3:vms073.b/save_set dua0:
%BACKUP-I-PROCDONE, operation completed. Processing finished at 15-OCT-2025 16:30:45.73
If you do not want to perform another standalone BACKUP operation,
use the console to halt the system.
If you do want to perform another standalone BACKUP operation,
ensure the standalone application volume is online and ready.
Enter "YES" to continue:
This will take a short time, and you won't be informed until it is complete. We are finished with this for now, so you may press CTRL-E to halt our system and drop you at the SIMH prompt. Now we boot the system again with "boot cpu":
sim> boot cpu
KA655-B V5.3, VMB 2.7
Performing normal system tests.
40..39..38..37..36..35..34..33..32..31..30..29..28..27..26..25..
24..23..22..21..20..19..18..17..16..15..14..13..12..11..10..09..
08..07..06..05..04..03..
Tests completed.
Great. Now this time, instead of booting dua3, we will boot our first virtual hard disk where we just installed the backup to - dua0:
>>>set boot dua0
>>>boot
(BOOT/R5:0 DUA0
2..
-DUA0
1..0..
%SYSBOOT-I-SYSBOOT Mapping the SYSDUMP.DMP on the System Disk
%SYSBOOT-W-SYSBOOT Can not map SYSDUMP.DMP on the System Disk
%SYSBOOT-I-SYSBOOT Mapping PAGEFILE.SYS on the System Disk
%SYSBOOT-I-SYSBOOT SAVEDUMP parameter not set to protect the PAGEFILE.SYS
OpenVMS (TM) VAX Version BI73-7G7 Major version id = 1 Minor version id = 0
%WBM-I-WBMINFO Write Bitmap has successfully completed initialization.
OpenVMS VAX V7.3 Installation Procedure
Model: VAXserver 3900 Series
System device: RA92 - _DUA0:
Free Blocks: 2854566
CPU type: 10-01
* Please enter the date and time (DD-MMM-YYYY HH:MM) 15-OCT-2025 16:33
As you can see, we are now entering the real OpenVMS installation and it reports that we are using a VAXServer 3900, the system disk is a DEC RA92 and we have 2854566 blocks free. Enter the current date+time, then hit enter.
You'll see quite a few messages scrolling up the screen, one which may seem quite alarming is:
Message from user SYSTEM
%LICENSE-E-NOAUTH, DEC VAX-VMS use is not authorized on this node
-LICENSE-F-NOLICENSE, no license is active for this software product
-LICENSE-I-SYSMGR, please see your system manager
During the install, we will enter our license for DEC VAX-VMS; So just ignore this for now. Let's continue:
If this system disk is to be used in an OpenVMS Cluster with multiple
system disks, then each system disk must have a unique volume label.
Any nodes having system disks with duplicate volume labels will fail
to boot into the cluster.
You can indicate a volume label of 1 to 12 characters in length. If you
want to use the default name of OVMSVAXSYS, press RETURN in response
to the next question.
* Enter the volume label for this system disk [OVMSVAXSYS]: CGXVAXSYS1
Enter the CD-ROM device DUA3 and confirm it is ready to be mounted when prompted:
* Enter name of drive holding the OpenVMS distribution media: DUA3
* Is the OpenVMS media ready to be mounted? [N] Y
%MOUNT-I-MOUNTED, VAXVMS073 mounted on _DUA3:
Select optional software you want to install. You can install one
or more of the following OpenVMS or DECwindows components:
o OpenVMS library - 52200 blocks
o OpenVMS optional - 19000 blocks
o OpenVMS Help Message - 10400 blocks
o OpenVMS Management Station - 20000 blocks
o DECwindows base support - 4400 blocks
o DECwindows workstation support - 23800 blocks
- 75 dots per inch video fonts - (included)
- 100 dots per inch video fonts - 6200 blocks
o DECnet-Plus networking - 80000 blocks
o DECnet Phase IV networking - 800 blocks
Space remaining on system disk: 2854377 blocks
* Do you want to install the OpenVMS library files? (Y/N)
Install everything, answering Y to each question or customise to your liking then confirm:
The following options will be provided:
OpenVMS library
OpenVMS optional
OpenVMS Help Message
OpenVMS Management Station Software -- PC files
DECwindows base support
DECwindows workstation support with:
- 75 dots per inch video fonts
- 100 dots per inch video fonts
DECnet-Plus
Space remaining on system disk: 2638377 blocks
* Is this correct? (Y/N) Y
Phew! Now, at last - the backup save sets will be extracted/restored. This will take some time, enough for a cigarette at least. When it completes, you'll be presented with some useful information regarding OpenVMS Clusters:
In an OpenVMS Cluster, you can run multiple systems sharing all files
except PAGEFILE.SYS, SWAPFILE.SYS, SYSDUMP.DMP, and VAXVMSSYS.PAR.
Cluster configuration cannot be done at this time because no network
is present. In order to configure a cluster you must FIRST do one
or both of the following:
o Install DECnet-Plus (or DECnet Phase IV), or
o Execute SYS$STARTUP:LAN$STARTUP.COM by removing the
comment delimiter ("!") from the line
$! @SYS$STARTUP:LAN$STARTUP
in SYS$MANAGER:SYSTARTUP_VMS.COM.
Then configure the cluster by executing the following command:
@ @SYS$MANAGER:CLUSTER_CONFIG
See the OpenVMS System Manager's Manual: Essentials for more information.
For future reference, you should keep a copy of such messages for future configuration of components.
* Do you want DECwindows Motif as the default windowing system? (Y/N) Y
Now we will ask you for new passwords for the following accounts:
SYSTEM, SYSTEST, FIELD
Passwords must be a minimum of 8 characters in length. All passwords
will be checked and verified. Any passwords that can be guessed easily
will not be accepted.
Now, this is the equivalent of setting your root password on a UNIX-like Operating System. Make sure to set a decent password for SYSTEM and different passwords for SYSTESY and FIELD. You could make them all the same if you're not planning on allowing anyone else to access your new OpenVMS system.
* Enter password for SYSTEM:
* Re-enter for verification:
%UAF-I-MDFYMSG, user record(s) updated
%VMS-I-PWD_OKAY, account password for SYSTEM verified
You'll see similar messages for the remaining accounts.
Creating RIGHTS database file, SYS$SYSTEM:RIGHTSLIST.DAT
Ignore any "-SYSTEM-F-DUPIDENT, duplicate identifier" errors.
%UAF-I-RDBCREMSG, rights database created
%UAF-I-RDBADDMSGU, identifier DEFAULT value [000200,000200] added to rights database
%UAF-I-RDBADDMSGU, identifier FIELD value [000001,000010] added to rights database
%UAF-I-RDBADDMSGU, identifier SYSTEM value [000001,000004] added to rights database
%UAF-I-RDBADDMSGU, identifier SYSTEST value [000001,000007] added to rights database
%UAF-E-RDBADDERRU, unable to add SYSTEST_CLIG value [000001,000007] to rights database
-SYSTEM-F-DUPIDENT, duplicate identifier
%UAF-I-NOMODS, no modifications made to system authorization file
%UAF-I-RDBDONEMSG, rights database modified
Creating MODPARAMS.DAT database file, SYS$SYSTEM:MODPARAMS.DAT
These UAF messages confirm that the rights database has been created, and the system users have been added. We will use the UAF (User Authorization File) tool later to add a normal user.
Next you'll be prompted for the SCSNODE name and SCSSYSTEMID for your VMS node, as this is your first installation and not part of a cluster - enter what you like (within reason, the SCSSYSTEMID should be between 1025 and 65535).
* Please enter the SCSNODE name: CGXV01
* Please enter the SCSSYSTEMID: 6901
Before continuing with the installation, you will be given some handy tips:
After the installation finishes, you might want to do one or more of the
following tasks:
o DECOMPRESS THE SYSTEM LIBRARIES - To save space, many of the system
libraries are shipped in a data-compressed format. If you have
enough disk space, you can decompress the libraries for faster access.
To data expand the libraries, type:
$ @SYS$UPDATE:LIBDECOMP.COM
If you do not decompress these libraries, you will experience
slower response to the HELP and LINK commands.
o BUILD A STANDALONE BACKUP KIT - You can build a standalone backup kit
using the procedure described in the "Backup Procedures" chapter of
tye upgrade and installation supplement provided for your VAX computer.
o TAILOR THE SYSTEM DISK - You might want to review the files provided or
not provided during this installation. If you find there are files
you want to remove from the system disk (TAILOR OFF) or files you want
to add (TAILOR ON), use the following utilities to perform the
desired tailoring.
OpenVMS tailoring: $ RUN SYS$UPDATE:VMSTAILOR
DECwindows tailoring: $ RUN SYS$UPDATE:DECW$TAILOR
NOTE: The tailor procedure cannot be used to TAILOR ON or TAILOR OFF
files located on an alternate disk.
Now you should have your OpenVMS licenses/PAKs (Product Authorization Keys) ready.
Continuing with OpenVMS VAX V7.3 Installation Procedure.
Configuring all devices on the system ...
If you have Product Authorization Keys (PAKs) to register, you can
register them now.
* Do you want to register any Product Authorization Keys? (Y/N): Y
VMS License Management Utility Options:
1. REGISTER a Product Authorization Key
...
Enter one of the above choices [1]: 1
Do you have your Product Authorization Key? [YES]: YES
Find your PAK for "VAX-VMS". This PAK will be entered manually by extracting the information from each field and entering them when prompted...
For future PAKs, you may copy-paste the command straight from your e-mail.
....
Here is a list of the license information just entered:
Issuer: VLF
Authorization: VLF-HOBBYIST-0000-001297
Product Name: VAX-VMS
Producer: DEC
Units: 0
Release Date:
Version:
Termination Date:
Availability:
Activity: CONSTANT=100
Options: MOD_UNITS
Token:
Hardware ID:
Checksum: 2-EHHG-NPFD-BFDB-KCEJ
Is that correct? [YES]:
Registering VAX-VMS license in SYS$COMMON:[SYSEXE]LMF$LICENSE.LDB...
Do you want to LOAD this license on this system? [YES]:
%LICENSE-I-LOADED, DEC VAX-VMS was successfully loaded with 0 units
You may enter some other PAKs now, or wait until later. I will install others later. Enter '99 [enter]' to exit the license management utility.
********************************************************************************
After the system has rebooted you should register any additional
Product Authorization Keys (PAKs) you have, or receive in the
future, by executing the following procedure:
$ @SYS$UPDATE:VMSLICENSE
See the OpenVMS License Management Utility Manual for any additional
information you need.
********************************************************************************
Another piece of useful information to remember for later. Now, you'll be prompted to set your time zone. Follow the prompts until you're asked to provide information about DECnet-Plus, then respond as follows:
* Enter name of drive holding the DECnet-Plus kit: DUA3
* Is DUA3: ready to be mounted? [N] y
The following product has been selected:
DEC VAXVMS DECNET_OSI V7.3 Layered Product
~~
This product requires one of two PAKs: DVNETEND or DVNETRTG.
Do you want the defaults for all options? [YES] YES
This set isn't required, but as we had had chosen to install everything earlier - we may as well. Installation will run for a few minutes, then OpenVMS Installation will run AUTOGEN to update the system. This will take a couple of minutes, then the system will be rebooted - dropping you back at the SIMH prompt. Start the system back up:
Do you want to review the options? [NO]
Execution phase starting ...
The following product will be installed to destination:
DEC VAXVMS DECNET_OSI V7.3 DISK$VAXVMSV73:[VMS$COMMON.]
Portion done: 0%...10%...20%...30%...40%...80%...90%
SHUTDOWN message from user SYSTEM at Batch 17:01:44
The system will shut down in 0 minutes; back up SOON. Please log off.
Reboot system with AUTOGENerated parameters
%SHUTDOWN-I-STOPUSER, all user processes will now be stopped
%SHUTDOWN-I-REMOVE, all installed images will now be removed
%SHUTDOWN-I-DISMOUNT, all volumes will now be dismounted
Let's boot into our system proper:
>>> boot cpu
>>> boot
*****************************************************************
OpenVMS VAX V7.3
You have SUCCESSFULLY installed the OpenVMS VAX Operating System.
The system is now executing the STARTUP procedure. Please
wait for the completion of STARTUP before logging in to the
system.
*****************************************************************
%UAF-I-RDBADDMSG, identifier SYS$NODE_CGXV01 value %X80010000 added to rights database
%SET-I-INTSET, login interactive limit = 64, current interactive value = 0
SYSTEM job terminated at 15-OCT-2025 17:04:29.49
Accounting information:
Buffered I/O count: 1621 Peak working set size: 1700
Direct I/O count: 613 Peak page file size: 5504
Page faults: 5877 Mounted volumes: 0
Charged CPU time: 0 00:00:04.47 Elapsed time: 0 00:00:06.85
Congratulations! You have installed OpenVMS 7.3 \o/. Now after all those pages of instructions and console-pastes, we'll proceed to configure OpenVMS a little bit.
Configuring OpenVMS
You are now presented with some information about your new system. Where do you go from here? Press enter and you'll see a welcome-banner followed by a prompt for you to login. Enter 'SYSTEM' as the username, and the password you set during installation.
Username: SYSTEM
Password:
Welcome to OpenVMS (TM) VAX Operating System, Version V7.3
$
At this point, I can see all you UNIX-like OS users gagging to explore the system and run commands such as 'uptime' and 'uname -a' to show off to all your friends. Well, I'm extremely sorry to disappoint you (and perhaps wasted your time so far!) but OpenVMS is not UNIX or in fact similar to any derivatives in any way. You can throw any hopes of POSIX compatibility out the window, too (well, there is a POSIX compatibility interface/set for OpenVMS but we won't go into that ;).
To satisfy the needs of your e-penis, you may run "sh sys" or in its full form: "show system". The "show" command is used to spit out a variety of information, many embedded devices such as routers have similar functions.
$ sh sys
OpenVMS V7.3 on node CGXV01 15-OCT-2025 18:04:22.39 Uptime 0 01:00:22
Pid Process Name State Pri I/O CPU Page flts Pages
00000201 SWAPPER HIB 16 0 0 00:00:00.04 0 0
00000205 CONFIGURE HIB 8 5 0 00:00:00.01 112 175
00000206 LANACP HIB 12 33 0 00:00:00.04 364 666
00000208 IPCACP HIB 10 6 0 00:00:00.01 99 177
00000209 ERRFMT HIB 8 56 0 00:00:00.02 153 234
0000020B OPCOM HIB 9 46 0 00:00:00.03 304 150
0000020C AUDIT_SERVER HIB 9 129 0 00:00:00.06 483 927
0000020D JOB_CONTROL HIB 8 25 0 00:00:00.01 191 342
0000020E SECURITY_SERVER HIB 10 35 0 00:00:00.06 759 1328
00000210 SYSTEM CUR 7 79 0 00:00:00.07 692 512
$
This isn't too different from what you'd see in a screen-dump of the 'top' command on UNIX-like systems.
Now, let's get back on track. OpenVMS uses DIGITAL Command Language, a scripting language developed by DIGITAL for their Operating Systems. You may think of it as the OpenVMS equivalent of BASH in that it's used as a "shell"/CLI as well as a normal scripting language.
So far, we have used DUA3 (our virtual CD-ROM drive) and DUA0 (Our first hard disk), now we will initialise DUA1, our second virtual hard disk. It is good practice to keep system files on one disk, and data on others. This is especially useful for when/if you need to reinstall the Operating System, you can keep your users' data. Let's initialise the disk now and mount it:
$ initialize dua1: DATA
$ mount/system dua1 data
%MOUNT-I-MOUNTED, DATA mounted on _CGXV01$DUA1:
n.B. Remember to have around another 1.5G of space free for this else bad things will happen. On initialisation of the new volume, the file d1.dsk grew to 719M
This is what you don't want to happen, else you'll need to boot the system again:
$ initialize dua1: DATA
RQ I/O error: No space left on device
I/O error, PC: 83430D36 (ASHL #1,R3,R0)
sim>
Now that we have a new disk initialised and mounted, we will edit the site-specific startup file "sys$manager:systartup_vms.com" and add the mount command above so we don't have to manually mount the volume at each startup. We will need to let OpenVMS know that we are using a VT100-compatible terminal so we can use the full-screen VMS editor "edit" properly:
$ set term/vt100
$ edit sys$manager:systartup_vms.com
There's no right or wrong place to put this command really, but I like to mount volumes just before DECnet is setup+started. A general rule is to mount any additional volumes first, before running any startup processes which may rely on the volume being available:
$! To start a batch queue, remove the comment delimiter ($!) from the
$! following command line.
$!
$!$ START /QUEUE SYS$BATCH
$!
$ mount/system dua1: data
$!
$! In order to use asynchronous DECnet Phase IV on OpenVMS VAX systems only,
$! remove the comment delimiter ($!) from the next two lines.
Press CTRL-Z to save and quit 'EDIT'.
409 lines written to file SYS$COMMON:[SYSMGR]SYSTARTUP_VMS.COM;2
$
You may be wondering why ";2" is appended to the filename. OpenVMS stores multiple revisions of files as they are updated/edited. Some other operating systems and/or filesystems work in this manner including Novell Netware. You shouldn't have any problems with this, until you try and delete a file - OpenVMS will ask you to specify which revision you'd like to delete.
Adding Users
As in UNIX-like systems, OpenVMS has user and group IDs, however, unlike UNIX - they are not entities you can reference separately. The UID and GID-like values are an exclusive singleton, which is called a UIC (User Identification Code), the format of a UIC is [###,###] - where the first part is the group, and the second is the user. By default, users added to the UAF are disabled. We will now add our first user, whose 'home' directory is on our new disk, will have full system privileges and won't be disabled:
$ set def sys$system
$ r authorize
UAF> add int16h/password=t3mp123/owner="int16h"/dev=dua1/dir=[int16h]/uic=[200,201]/flag=nodisuser/priv=all
%UAF-I-ADDMSG, user record successfully added
...
- 'set def' is short for "set default", which is the equivalent of the "cd" command on UNIX-like operating systems. Navigating around an OpenVMS system may take some getting used to, just think of it as the step after moving from DOS to UNIX. In this case:
sys$system
is an alias for: CGXVAX$DUA0:[SYS0.SYSCOMMON.][SYSEXE]
- 'r authorize': "r" is the shortened command for run. We need to be in the sys$system logical directory to run 'authorize' as this is where SYSUAF.DAT is stored.
So, basically we are adding the user 'int16h', with initial password of 't3mp123' (this will be changed at first-login), owner is the user's real-name, dev is the device where the user's initial/home directory will reside, dir is the name of the directory on 'dev', uic is the user's UIC (groupid,uid - default group is 200), we have added the nodisuser flag to ensure the account isn't disabled, and finally we have given the uses all privileges on the system.
After you run the 'add' line at the UAF prompt, your screen will fill with security notices. You should get used to them while connected to the system console, anything important you update on the system will trigger such alerts.
Now, at the UAF prompt, type 'exit'. UAF will inform you that the User Authorisation file and rights database have been modified:
UAF> exit
%UAF-I-DONEMSG, system authorization file modified
%UAF-I-RDBDONEMSG, rights database modified
Great! Now you have a 'normal' user you can login as, and gain full privs if you need them! Well, not quite. We need to manually create the user's directory and set the correct permissions:
$ create/dir dua1:[int16h]
$ set directory/owner=int16h dua1:[int16h]
Here you can see that we use the create command to create our new directory, then set to set the owner of the directory. DCL is quite flexible and efficient, most of the time you can turn a few commands into one longer command.
$ create/dir dua1:[int16h]/owner=[int16h]
As you can see, DCL commands are quite logical and natural - it's just getting used to them which can be a problem when you usually spend your time in a UNIX shell.
Now that we have added our user, and created a home-directory for it - you can logout and try to login with those credentials. Use "lo" (or "logout") to log out of the system.
$ logout
SYSTEM logged out at 15-OCT-2025 18:18:09.64
Welcome to OpenVMS (TM) VAX Operating System, Version V7.3
Username: int16h
Password:
Welcome to OpenVMS (TM) VAX Operating System, Version V7.3
Your password has expired; you must set a new password to log in
New password:
Verification:
As we are still using the system console, you will be notified of a "System UAF record modification" security event because we changed the password of a user.
Now that we're logged in, we want to enable our full system privileges. This is done by running "set proc/priv=all". This is like running "su" on a UNIX-like system, except that we will still be the same user - just with "superuser" powers.
$ set proc/priv=all
Phil Wherry was a great help with the following, as before reading his tips - I had never installed OpenVMS and additional components from scratch, only used existing systems. We are going to be installing the OpenVMS TCP/IP stack+programs, this will require us to modify resource allocations within the system. We need to edit modparams.dat in sys$system:
$ set def sys$system
$ edit modparams.dat
The following lines should be added to the end of the file, save+exit by pressing CTRL-Z:
ADD_GBLPAGES=10000
ADD_GBLSECTIONS=100
ADD_NPAGEDYN=800000
ADD_NPAGEVIR=800000
MIN_SPTREQ=6000
Now, these changes to the system won't take affect straight away. You may remember earlier on that the OpenVMS Installation ran "AUTOGEN" to update the system. We will now run it manually:
$ set def sys$update
$ @autogen getdata reboot nofeedback
%AUTOGEN-I-BEGIN, GETDATA phase is beginning.
%AUTOGEN-I-NEWFILE, A new version of SYS$SYSTEM:PARAMS.DAT has been created.
You may wish to purge this file.
%AUTOGEN-I-END, GETDATA phase has successfully completed.
%AUTOGEN-I-BEGIN, GENPARAMS phase is beginning.
%AUTOGEN-I-NEWFILE, A new version of SYS$MANAGER:VMSIMAGES.DAT has been created.
You may wish to purge this file.
....
After many more messages, the system will shutdown and you will be back at the SIMH prompt. "boot cpu" then "boot dua0" again. To bring up the system again. Finally, login with your user-account and "set proc/priv=all". We will then set some additional system parameters and shutdown the system again. As Phil said, these two processes could be done with only 1 reboot - but it's more clear this way and will help remind you that a reboot /is/ required after such alterations to the system.
$ set proc/priv=all
$ r sys$system:sysgen
SYSGEN> SET INTSTKPAGES 20
SYSGEN> WRITE CURRENT
SYSGEN> EXIT
$ @sys$system:shutdown
Bring up the system again, and login.
Installing the OpenVMS TCP/IP Stack+Programs
Multiuser operating systems these days are mostly useless without a TCP/IP stack, and a way for remote users to login. Now we will install the PAK for TCP/IP and install it.
$ set proc/priv=all
$ mount/over=id dua3:
MOUNT-I-WRITELOCK, volume is write locked
%MOUNT-I-MOUNTED, VAXVMS073 mounted on _CGXVAX$DUA3:
$ set def dua3:[tcpip_vax051.kit]
Traditionally, CD-ROMs are mounted by specifying the device and volume-ID. Providing the "/over=id" parameter instructs mount to mount the volume, ignoring the name of the volume. If you now execute "DIR" ("DIRECTORY"), you can see the contents of ua3:[tcpip_vax051.kit]:
$ dir
Directory DUA3:[TCPIP_VAX051.KIT]
DEC-VAXVMS-TCPIP-V0501-15-1.PCSI;1
Total of 1 file.
As you can see, there is 1 file in this directory and it has a .PCSI extension. This is handled by the POLYCENTER Software Installation Utility. OpenVMS applications generally come in 1 of 3 kit formats:
- PCSI - These are installed with the "product install" command
- VMSINSTAL - These are 1 or more files with a sequential extension beginning with .A
- Self-Extracting - The extension can vary, usually something like SFX_AXPEXE, SFX_I64EXE or SFX_VAXEXE
Anyway, to get back to our installation - we first need to install the UCX PAK. Refer to where you got your licenses from and paste it in:
$ LICENSE REGISTER UCX -
/ISSUER=VLF -
/AUTHORIZATION=VLF-HOBBYIST-0000-001278 -
/PRODUCER=DEC -
/UNITS=0 -
/ACTIVITY=CONSTANT=100 -
/OPTIONS=(MOD_UNITS) -
/CHECKSUM=2-LPDD-AAFN-MHED-AOJI
$ LICENSE LOAD UCX
%LICENSE-I-LOADED, DEC UCX was successfully loaded with 0 units
Proceed to install the kit by issuing: "product install *" this will scan the current directory for all packages to install - as there is only one, we don't need to select which we want and don't want:
$ product install *
The following product has been selected:
DEC VAXVMS TCPIP V5.1-15 Layered Product
Do you want to continue? [YES] YES
When prompted, go for the default options.
The following product will be installed to destination:
DEC VAXVMS TCPIP V5.1-15 DISK$OVMSVAXSYS:[VMS$COMMON.]
Portion done: 0% ~
%PCSI-I-PRCOUTPUT, output from subprocess follows ...
% - HELP has been updated. You may purge SYS$COMMON:[SYSHLP]HELPLIB.HLB
%
%PCSI-I-PRCOUTPUT, output from subprocess follows ...
% TCPIP-W-PCSI_INSTALL
% - Execute SYS$MANAGER:TCPIP$CONFIG.COM to proceed with configuration of
% Compaq TCP/IP Services.
%
Portion done: 100%
The following product has been installed:
DEC VAXVMS TCPIP V5.1-15 Layered Product
DEC VAXVMS TCPIP V5.1-15: Compaq TCP/IP Services for OpenVMS.
Go ahead and choose the default install options.
Excellent. We now have TCP/IP Services installed as well as a PAK loaded so we can actually use it (remember how I mentioned limitations if you didn't have licenses earlier?).
As recommended by the installation, we will run: SYS$MANAGER:TCPIP$CONFIG.COM
to configure TCP/IP on our system. Remember to prefix it with @
so the system knows to run it.
$ @sys$manager:tcpip$config
TCP/IP Network Configuration Procedure
This procedure helps you define the parameters required
to run Compaq TCP/IP Services for OpenVMS on this system.
*CLS*
Compaq TCP/IP Services for OpenVMS Configuration Menu
Configuration options:
1 - Core environment
2 - Client components
3 - Server components
4 - Optional components
5 - Shutdown Compaq TCP/IP Services for OpenVMS
6 - Startup Compaq TCP/IP Services for OpenVMS
7 - Run tests
A - Configure options 1 - 4
[E] - Exit configuration procedure
Enter configuration option:
We start by configuring the core environment. I won't paste all menus here, just the prompts to save space.
Enter configuration option: 1
DOMAIN Configuration
Enter Internet domain: cgxvaxsys1.cryogenix.org
Enter configuration option: 2
QE0 is the Ethernet device XQA0:
QE0 has not been configured
Compaq TCP/IP Services for OpenVMS Interface QE0 Configuration Menu
Configuration options:
1 - Configure interface manually
2 - Let DHCP configure interface
[E] - Exit menu (Do not configure interface QE0)
Enter configuration option: 1
Enter fully qualified host name: cgxvax.cgx.org.uk
Enter Internet address for cgxvax: 10.69.69.2
Enter Internet network mask for cgxvax [255.255.255.0]: [enter]
Enter broadcast mask for cgxvax [10.69.69.255]: [enter]
* Is the above correct [YES]: YES
We have now set the domain for our system, as well as manually configured the ethernet interface manually. You can configure this as you please of course.
Next we'll configure basic routing. At the moment, we wouldn't really want to use our system as a router, though the Compaq TCP/IP services does support a variety of protocols.
* Do you want to configure dynamic ROUTED or GATED routing [NO]: NO
A default route has not been configured.
* Do you want to configure a default route [YES]: YES
Enter your Default Gateway host name or address: 10.0.0.1
10.0.0.1 is not in the local host database.
If you want to enter the default gateway in the local host
database, enter its host name. Otherwise, enter .
Enter the Default Gateway host name []: [ENTER]
Next, to resolve hostnames we will need to specify a nameserver.
Enter configuration option: 4
Enter your BIND server name: 10.0.0.1
Enter remote BIND server name []: [enter]
Enter next BIND server name: [enter]
Enter configuration option: E
Now that the core configuration is complete, we can enable telnet:
Enter configuration option: 2
Enter configuration option: 6
TELNET Configuration
Service is not defined in the TCPIP$SERVICE database.
Service is not enabled.
Service is stopped.
TELNET configuration options:
1 - Enable service on this node
[E] - Exit TELNET configuration
Enter configuration option: 1
Creating TELNET Service entry
You should enable FTP from the client menu also, then exit to the main menu. Once at the main menu, chose option #6 to startup TCP/IP services.
6 - Startup Compaq TCP/IP Services for OpenVMS
Begin Startup...
%TCPIP-I-INFO, TCP/IP Services startup beginning at 15-OCT-2025 18:30:04.47
%TCPIP-I-INFO, creating UCX compatibility file SYS$COMMON:[SYSEXE]UCX$SERVICE.DAT
%TCPIP-I-NORMAL, timezone information verified
More messages will follow, you will then be prompted to "Press Resturn to continue". Finally exit, and press 'Y' when prompted to start your services (if not already started). You should now be able to connect to your system using telnet and FTP (though, not from the host system! This is a flaw in winpcap/libpcap not in OpenVMS or SIMH).
Finally, add: $ @sys$startup:tcpip$startup
to the sys$manager:systartup_vms.com
file to enable TCP/IP services to run at boot-time (uncomment the relevent line):
$ set term/vt100
$ edit sys$manager:systartup_vms.com
...
$! Remove the comment delimiter ($!) from the following line to start
$! versions of Digital TCP/IP Services for OpenVMS beginning with V5.0.
$!
$ @SYS$STARTUP:TCPIP$STARTUP.COM
$!
Don't forget to CTRL-Z to exit!
Finally, to test connectivity, you can ping a host like so:
$ TCPIP ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=117 time=10 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=10 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=10 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=10 ms
----8.8.8.8 PING Statistics----
4 packets transmitted, 4 packets received, 0% packet loss
round-trip (ms) min/avg/max = 10/10/10 ms
That ends the first part of this article.
Part 2!
Welcome to the second part of Getting Started with OpenVMS and SIMH. This article assumes that you have already followed part 1 or have at least installed OpenVMS VAX 7.3 on a system, with dua0 containing the OS, dua1 containing user-directories, and TCP/IP services are functional. If in doubt, have a quick read over what we did in the first part. For this part, we will install and use UNZIP, wget, Compaq C and the WASD HTTP server.
Although I'd /love/ to throw you in at the deep-end, I think the transition to OpenVMS will be easier if we introduce a couple of utilities you may be familiar with and break you in gently. This is a bit of a 'ghetto' guide to OpenVMS 7.3, and is primarily for users learning through SIMH - so, we will use the easiest methods of retrieving and installing what we need (despite them not being the most traditional methods).
UNZIP & WGET
These two utilities, in my opinion, are extremely useful when getting started with OpenVMS 7.3 in SIMH. The main reason being that you will find many 3rd-party applications will be ZIP archived, and nowadays - HTTP is much more common for files than FTP. WGET, although slightly bloated, is one of the most popular utilities in the UNIX(-like) world for grabbing files over HTTP and FTP. Although you should be ashamed for bringing it and similar utilities into your nice, clean, OpenVMS installation - it will aid you in the transition from UNIX to OpenVMS by providing some niceties you have become accustomed to having. So, let's grab 'wget' first. Login to your OpenVMS system as a normal user, and type 'sh def'. This is short for 'SHOW DEFAULT' and is like the 'pwd' command on UNIX/Unix-like systems. It will display the current directory you are in. If you followed the first tutorial on installing OpenVMS in SIMH, you should see something like the following:
$ sh def
DUA1:[INT16H]
This means that you are in a directory named "INT16H" at the root of the DUA1: drive. We will discover more about how directories are addressed in a moment.
We should create a directory for our downloaded files to live in. Looking at the above 'path', how would you expect a full path to 'DOWNLOADS' within the 'INT16H' directory to look? On a Unix-like system, you would probably expect something like '/home/int16h/downloads' - but this is not UNIX.
For clarity, we will create a directory using its full path using the 'create' command like when we created the user-directory:
$ create/dir dua1:[INT16H.DOWNLOADS]
As you can see, we first reference the device, then the path from there is [enclosed], with each directory separated by a period/dot/full-stop. This is probably more similar to AmigaDOS than any other modern operating systems you may have came across.
You will receive no confirmation of the command's success, but if it did not succeed - you will receive an error message. To see that your new directory does actually exist, run 'dir' (DIRECTORY), which will provide you with a directory-listing, similar to that below.
$ dir
Directory DUA1:[INT16H]
DOWNLOADS.DIR;1
Total of 1 file.
We can now move into this directory by issuing the "set def" (SET DEFAULT) command. You could pass 'dua1:[INT16H.DOWNLOADS]' as the path to change to, but as we are in the directory where our target directory exists - that wouldn't be the quickest path. Instead, run 'set def [.DOWNLOADS]' - the '.' before 'DOWNLOADS' tells the system that we want to change to a directory named 'DOWNLOADS' within the current directory. Although it may be tempting to issue 'set def DOWNLOADS' or 'set def [DOWNLOADS]' but this wouldn't work how you may expect:
$ set def [.DOWNLOADS]
$ sh def
DUA1:[INT16H.DOWNLOADS]
$ set def dua1:[INT16H.DOWNLOADS]
$ sh def
DUA1:[INT16H.DOWNLOADS]
As you can see from either command above, we are now in the correct directory. If you were to change to '[DOWNLOADS]' instead of [.DOWNLOADS] we would receive:
$ set def [DOWNLOADS]
$ sh def
DUA1:[DOWNLOADS]
%DCL-I-INVDEF, DUA1:[DOWNLOADS] does not exist
This is because '[DOWNLOADS]' would take us to 'DUA1:[DOWNLOADS]' which doesn't currently exist.
It would be quite useful if we knew how to go back a directory. In many operating systems, 'cd ..' would allow you to do this, but as you know - we use 'set def ('SET DEFAULT'), and rather than '..' we use '[-]'. So, we will move back into your 'home' directory now:
$ set def [-]
$ sh def
DUA1:[INT16H]
Now that you know how to create directories and navigate around the data disk, we will create one more directory, naming it "BIN" - so store programs you want for your own use.
$ create/dir [.BIN]
Change directory to [.BIN] and we shall download the UNZIP utility.
$ set def [.BIN]
Available for OpenVMS is a wide range of freeware utilities and applications, formerly made available from the OpenVMS Freeware CDs. These were available as large zip files from Compaq (HP) or alternatively, you could browse and download programs from the Freeware CDs as well as many others via SAIC.com's OpenVMS Freeware Archive. The problem is, many of them are zipped - and we do not have the means to unzip these archives.
Until a few years ago, many FTP sites contain useful tools such as UNZIP in a compiled executable for Alpha, ia64 and VAX; suitable for running straight away. Such sites include Process.com and the SAIC OpenVMS Freeware Archive mentioned above.
Nowadays you can currently find freeware from Hunter Goatley's vms.process.com, VMS Software, Tenox at PDP-11.ru, and similar places.
Use the 'FTP' client supplied with OpenVMS to connect to ftp.process.com and login Anonymously:
$ ftp ftp.process.com
220 triton.process.com MultiNet FTP Server Process V6.0(17) at Wed 15-Oct-2025 3:21PM-EDT
Connected to ftp.process.com.
Name (ftp.process.com:int16h): Anonymous
331 Anonymous user ok. Send real ident as password.
Password:
230-Welcome to Process's TCPware Anonymous FTP directory
230-Thanks for stopping by.
230-
230-Note: If you're looking for MultiNet related files, please try
230-ftp.multinet.process.com.
230-
230-Here's a roadmap for what's available:
230-
230-Subdirectory Contents
230------------- --------
230-DECUS The session notes for talks given by Process
230- Software Corporation personnel at recent
230- DECUS National Events.
230-SUPPORT Update kits for TCPware for OpenVMS - check
230- out the 00SUMMARY.TXT file in this subdirectory
230- for more details.
230-TCPWARE Contains various TCPware related subdirectories.
230-
230-VMS-FREEWARE Hunter Goatley's VMS Freeware archive, plus mirrors
230- of the WASD web server and other freeware packages
230-
230-Other files and directories exist.
230-
230-This system is an emulated AlphaServer DS20E running VSI OpenVMS V8.4-2.
230-The emulation is provided by Stromasys CHARON-AXP.
230-
230-Guest User INT16H logged into /delta_anonymous at Wed 15-Oct-2025 3:21PM-EDT, job 5c52.
230 Directory and access restrictions apply
FTP>
You will see that we logged in as user Anonymous and we gave our ident (username) as the password. As you connect to more FTP servers running OpenVMS, you will notice that the 'Anonymous' login will always require your ident - rather than an e-mail address like many other servers nowadays.
The utilities we will be downloading are located in [.VMS-FREEWARE]. Although the server has been set to use UNIX syntax by default (as we were informed by the MOTD), we can still navigate through the server like a normal OpenVMS system. Let's go to the directory we require now.
FTP> passive on
FTP> sh def
257 "/delta_anonymous" is current directory.
FTP> set def [.VMS-FREEWARE]
250 Connected to DELTA_ANONYMOUS:[000000.VMS-FREEWARE].
FTP> dir
227 Entering passive mode; use PORT (192,42,95,32,52,255)
150 List started.
DELTA_ANONYMOUS:[000000.VMS-FREEWARE]
.WELCOME;1 1 26-MAR-2001 21:56 [GOATLEY] (RWED,RWED,,RE)
ANTINODE.DIR;1 3 16-JUL-2024 11:18 [GOATLEY] (RWE,RWE,RE,RE)
FILESERV.DIR;1 35 9-MAY-2001 23:58 [GOATLEY] (RWE,RWE,RE,RE)
FILESERV.README;29 225 20-FEB-2025 09:56 [GOATLEY] (RWED,RWED,,RE)
FREE-VMS.DIR;1 1 10-MAY-2001 00:07 [GOATLEY] (RWE,RWE,RE,RE)
FREEWARE_CD.DIR;1 1 10-MAY-2001 00:07 [GOATLEY] (RWE,RWE,RE,RE)
MATHOG.DIR;1 4 14-OCT-2001 16:22 [GOATLEY] (RWE,RWE,RE,RE)
NARNIA.DIR;1 2 10-MAY-2001 00:08 [GOATLEY] (RWE,RWE,RE,RE)
ROBOTS.TXT;1 1 3-JUL-2024 11:07 [GOATLEY] (RWED,RWED,,RE)
UNSUPPORTED.DIR;1 1 10-MAY-2001 00:10 [GOATLEY] (RWE,RWE,RE,RE)
UNZIP.ALPHA_EXE;1 398 24-MAY-2016 09:43 [GOATLEY] (RWED,RWED,,RE)
UNZIP.IA64_EXE;1 976 24-MAY-2016 09:50 [GOATLEY] (RWED,RWED,,RE)
UNZIP.VAX_EXE;1 265 24-MAY-2016 09:48 [GOATLEY] (RWED,RWED,,RE)
WASD.DIR;1 136 10-MAY-2001 00:10 [GOATLEY] (RWE,RWE,RE,RE)
WASD_SSL.DIR;1 23 24-JAN-2011 19:11 [GOATLEY] (RWE,RWE,RE,RE)
ZIP.IA64_EXE;1 1306 10-JUL-2008 11:08 [GOATLEY] (RWED,RWED,,RE)
You may download any utilities you will require, but for now we will just grab UNZIP.VAX_EXE. Remember to switch to binary mode for transfers though, else you won't be able to execute the files:
FTP> binary
200 Type I ok.
FTP> GET UNZIP.VAX_EXE
227 Entering passive mode; use PORT (192,42,95,32,56,39)
150 IMAGE retrieve of DELTA_ANONYMOUS:[000000.VMS-FREEWARE]UNZIP.VAX_EXE;1 (135680 bytes) started.
226 Transfer completed. 135680 (8) bytes transferred.
local: DUA1:[INT16H.BIN]UNZIP.VAX_EXE;1 remote: UNZIP.VAX_EXE
135680 bytes received in 00:00:01.29 seconds (102.71 Kbytes/s)
If you have any problems retrieving directory listings, downloading files etc - you can adjust the PASV/PASSIVE FTP settings with the 'passive' command. Type "exit" to disconnect and terminate FTP. Using the 'r' ('RUN') command, we can check that the binaries/images will run successfully:
$ r UNZIP.VAX_EXE
UnZip 6.00 of 20 April 2009, by Info-ZIP. For more details see: unzip -v.
...
Perfect! Or is it? Let's try to run unzip.exe again, but this time we'll append '-v' to it.
$ r unzip.vax_exe -v
%DCL-W-MAXPARM, too many parameters - reenter command with fewer parameters
That's not very useful, not for running a command which requires parameters anyway. OpenVMS has an extremely useful online help system (online as in live, within the OS). Let's have a brief look at that now and hope we can discover why we can't use 'RUN' how we would like:
$ help run
RUN
Executes an image within the context of your process (see Image).
If you are invoking an image requiring one or more parameters,
you must use the Automatic Foreign Command format or the Foreign
Command format.
Creates a subprocess or a detached process to run an image and
deletes the process when the image completes execution (see
Process).
Additional information available:
Image Process
RUN Subtopic?
We have established that 'run' won't let us use programs which require argc/argv-style parameters, and now the help system has informed us that we must use the Automatic Foreign Command format or the Foreign Command format. Foreign Commands are usually programs which aren't native to OpenVMS and as such don't comply with how OpenVMS expects applications to be run - or can be any programs/commands outside of DCL. For example the 'RUN' command, if issued without a filename as a parameter, will prompt you to enter a filename. This is not the case with the vast majority of programs which have been ported from UNIX and other systems. To exit from the help system, press CTRL-Z.
To be able to run these commands, we will define a symbol. A symbol is a symbolic name or alias for a string, the result isn't unlike setting environment variables in other operating systems. == is used for global symbols, and prepended a colon (':') is used for strings. Here are a couple of examples of setting symbols:
$ A == 1
$ B :== bee
The online help system can tell us the format used for setting symbols:
symbol-name =[=] expression
symbol-name[bit-position,size] =[=] replacement-expression
Using the 'SHOW' command, you can display the value of any single symbol or all of them at once:
$ show symbol A
A = 1 Hex = 00000001 Octal = 00000000001
$ show symbol/all
A = 1 Hex = 00000001 Octal = 00000000001
B = "BEE"
These can be used like variables, aliases for commands etc. If we wanted to create a symbol called 'ls' which had the string value "DIR" associated with it, we could use 'ls' in place of 'DIR':
$ ls :== DIR
$ sh symbol ls
LS = "DIR"
$ ls
Directory DUA1:[INT16H.BIN]
UNZIP.EXE;1 ZIP.EXE;1
Total of 2 files.
This is all very useful, but it doesn't quite let us run our Foreign Commands yet. Try creating a symbol which will point to 'DUA1:[INT16H.BIN]UNZIP.EXE', then issue your new symbol as a command:
$ unzip :== DUA1:[INT16H.BIN]UNZIP.EXE
$ unzip
%DCL-W-IVVERB, unrecognized command verb - check validity and spelling \DUA1\
We need to flag the symbol as being associated with a foreign command, so it will treat it as such. This is done by adding '$' at the beginning of the 'path':
$ unzip :== $DUA1:[INT16H.BIN]UNZIP.EXE
$ sh symbol unzip
UNZIP == "$DUA1:[INT16H.BIN]UNZIP.EXE"
Now let's try running 'unzip' again, and then try issuing the '-v' parameter.
$ unzip
UnZip 5.52 of 28 February 2005, by Info-ZIP. For more details see: unzip -v.
~
$ unzip -v
UnZip 5.52 of 28 February 2005, by Info-ZIP. Maintained by C. Spieler. Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.
Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ;
see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites.
Compiled with VAX C for VMS (V5.4-2 VAX) on Feb 28 2005.
Congratulations, you can now unzip files. Usually you would put system utilities somewhere such as SYS$SYSTEM
this is a logical name which points to 'SYS$SYSROOT:[SYSEXE]' which has another logical name ;). If you would like to see a list of defined logical names, you may run 'show logical/all'.
Because it's not ideal to create symbols for every Foreign Command program you wish to use, OpenVMS now has something comparable to the $PATH environment variable - 'dcl$path'. This is defined with the 'define' command, and will allow you to set one or more directories to be in your "path" for running Foreign Commands. To enable us to run any executables from our [.BIN] directory, we shall add it to 'dcl$path' now:
$ define dcl$path dua1:[INT16H.BIN]
You can check that it is working by running "zip" from the command-line.
Finally we have acquired the ZIP and UNZIP utilities, but have also learned some basic but important OpenVMS commands. Next we will download 'wget', another utility from the UNIX world, and install it into our personal 'BIN' directory.
Wget - the web-getter Wget for OpenVMS is available from AntiNode.info amongst other places (ftp.process.com/vms-freeware/fileserv/wget.exe if you have problems with AntiNode!), as are a few other utilities you may find useful. We will be downloading a ZIP file to our DOWNLOADS directory, extracting it, then copying the wget binary to BIN:
$ set def [-.DOWNLOADS]
$ ftp ftp.antinode.info
220- Antinode FTP Server. Please be nice.
220 its.antinode.info FTP Server (Version 5.7) Ready.
Connected to gwx.antinode.info.
220- Antinode FTP Server. Please be nice.
220 its.antinode.info FTP Server (Version 5.7) Ready.
Name (ftp.antinode.info:int16h): Anonymous
331 Guest login OK, send ident as password.
Password:
230- Using a Web browser and having problems?
Try using a better and/or simpler FTP client.
Alternatively, use HTTP instead of FTP:
ftp://antinode.info/something ->
http://antinode.info/ftp/something
230 Guest login OK, access restrictions apply.
Remote system type is VMS.
FTP> set def [.WGET.wget-1_20_3d_vms]
250-CWD command successful.
250 New default directory is SYS$SYSDEVICE:[ANONYMOUS.WGET.WGET-1_20_3D_VMS]
FTP> binary
200 TYPE set to IMAGE.
FTP> get WGET-1_20_3D_VMS.ZIP
200 PORT command successful.
150 Opening data connection for SYS$SYSDEVICE:[ANONYMOUS.WGET.WGET-1_20_3D_VMS]WGET-1_20_3D_VMS.ZIP;
(79.xxx.xxx.xxx,49166) (3171539 bytes)
226 Transfer complete.
local: DUA1:[INT16H.DOWNLOADS]WGET-1_20_3D_VMS.ZIP;1 remote: WGET-1_20_3D_VMS.ZIP
3171539 bytes received in 00:00:54.61 seconds (56.71 Kbytes/s)
FTP> exit
221 Goodbye.
We will now extract 'WGET-1_10_2C_VMS.ZIP'. Run 'unzip WGET-1_10_2C_VMS.ZIP'. You will see a lot of files extracting, but we only need one - WGET.EXE from [.wget-1_10_2c_vms.src.vax]. We will copy it to our BIN directory:
$ unzip WGET-1_20_3D_VMS.ZIP
inflating: ~~
$ copy [.wget-1_20_3d_vms.src.vax]WGET.EXE DUA1:[INT16H.BIN]WGET.EXE
$ wget :== $DUA1:[INT16H.BIN]WGET.EXE
$ sh symbol wget
WGET == "$DUA1:[INT16H.BIN]WGET.EXE"
You probably want to delete the other files to save precious disk space, and this isn't quite as straightforward as rm -rf:
DELETE/NOLOG/NOCONFIRM [.WGET-1_20_3A_VMS]*.*;*
SET FILE/REMOVE_DIRECTORY [.WGET-1_20_3A_VMS]*.*;*
SET FILE/REMOVE_DIRECTORY WGET-1_20_3A_VMS.DIR;1
By default OpenVMS will log deletions, but with something like this we don't need to so we specify NOLOG; and there's no point confirming hundreds of non-critical files so we add NOCONFIRM.
You will be left with a load of empty directories which DELETE cannot remove, so an additional step is needed - similar to rmdir - to accomplish this. You can also use [...] to expand to all sub directories, for example if you wanted to remove all files and directories in DUA1, you could do:
$ DELETE/NOLOG/NOCONFIRM DUA1:[...]*.*;*
$ SET FILE/REMOVE_DIRECTORY DUA1:[...]*.*
Now you can run 'wget' from anywhere:
$ wget
WGET: missing URL
Usage: WGET [OPTION]... [URL]...
Try `WGET --help' for more options.
Installing Supplemental Software
A supplemental disc is available for OpenVMS 7.3, this contains developer tools which can be essential if you want a fully-functional learning system. It includes the following kits:
- DEC ACRTL (C Run-Time Library) update kit v6.0
- VAX BASIC v3.9
- Compaq C v6.4
- DECprint Supervisor v2.1
- FORTRAN v6.6
- DECset v12.4 developer tools (MMS, LSE, SCA, PCA, CMS)
- DECterm v1.0
- DECtrace v7.2
- VAX Pascal v5.8
- VMS Internationalization components
This will give us an opportunity to make use of our recently-installed 'wget' utility. While still in [.DOWNLOADS], create a new directory called SUPP, change to this dir then use 'wget' to retrieve your ZIP:
$ create/dir [.SUPP]
$ set def [.SUPP]
$ wget "http://mirrors.pdp-11.ru/_vax/_VMS/_distrib/7.X/Openvms%20Vax%2073%20Supplement.zip"
--22:24:46-- http://mirrors.pdp-11.ru/_vax/_VMS/_distrib/7.X/Openvms%20Vax%2073%20Supplement.zip
=> `Openvms Vax 73 Supplement.zip'
Resolving ... xxx.xxx.xxx.xxx
Connecting to ...|xxx.xxx.xxx.xxx|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 54545839 (52M) [application/zip]
Saving to: 'Openvms_Vax_73_Supplement.zip'
Openvms_Vax_73_Supp 100%[===================>] 52.02M 524KB/s in 1m 46s
2025-10-16 16:16:11 (503 KB/s) - 'Openvms_Vax_73_Supplement.zip' saved [54545839/54545839]
Unzip the file, and have a look at the contents. Unzipping will probably take some time.
$ dir
Directory DUA1:[INT16H.DOWNLOADS.SUPP]
OPENVMS_VAX_73_SUPPLEMENT.ZIP;1
Total of 1 file.
$ unzip OPENVMS_VAX_73_SUPPLEMENT.ZIP
Archive: DUA1:[INT16H.DOWNLOADS.SUPP]OPENVMS_VAX_73_SUPPLEMENT.ZIP;1
inflating: AACRT060.A
inflating: BASIC039.A
...
$ dir
Directory DUA1:[INT16H.DOWNLOADS.SUPP]
AACRT060.A;1 BASIC039.A;1 BASIC039.B;1 BASIC039.C;1
BASIC039.D;1 BASIC039.E;1 CC064.A;1 CC064.B;1
DCPSVAX021.A;1 DCPSVAX021.B;1 DCPSVAX021.C;1 DEC-VAXVMS-FORTRAN-V0606-201-1.PCSI;1
DECSET124.A;1 DECSET124.B;1 DECSET124.C;1 DECSET124.D;1
DECSET124.E;1 DECSET124.F;1 DECSET124.G;1 DECSET124.H;1
DECSET124.I;1 DECSET124.J;1 DECSET124.K;1 DTC010.A;1
DTC010.B;1 DTRA072.A;1 DTRA072.B;1 DTRA072.C;1
FORT066.A;1 OPENVMS-VAX-7_3-SUPPLEMENT.ZIP;1 PASCAL058.A;1
PASCAL058.B;1 PASCAL058.C;1 PASCAL058.D;1 VMSI18N073.A;1
VMSI18N073.B;1 VMSI18N073.C;1
Total of 37 files.
Ok, so you've waited for this archive to decompress - and now you are presented with 37 files. You will notice that most of the files end in a one-letter extension, the two exceptions being the .ZIP and .PCSI files. Lets delete the ZIP file to save space.
$ DELETE OPENVMS_VAX_73_SUPPLEMENT.ZIP;1
You should get used to using full filenames, including the revision appendage(;#) when working with files in OpenVMS.
Back to our supplements! When you 'registered' for your hobbyist PAKs, I hope you chose every one which was available as you will need licenses/PAKs for C, PASCAL, FORTRAN and anything else you'd like to install. Check your 'e-mail' and look for the PAK which begins with: '$ LICENSE REGISTER C -'. Paste it into your terminal, and load it:
$ $ LICENSE REGISTER C -
_$ /ISSUER=VLF -
_$ /AUTHORIZATION=VLF-HOBBYIST-0000-000191 -
_$ /PRODUCER=DEC -
_$ /UNITS=0 -
_$ /ACTIVITY=CONSTANT=100 -
_$ /OPTIONS=(MOD_UNITS) -
_$ /CHECKSUM=2-NMNN-APKM-KJGH-AMFN
$ $ LICENSE LOAD C
%LICENSE-I-LOADED, DEC C was successfully loaded with 0 units
We now have a license installed and loaded for C. Now we may install it safely, without complaints. When installing 'system' software, it is often preferred it is done as the 'SYSTEM' user. Issue 'lo' to logout of the system, then re-login as SYSTEM:
$ lo
Connection closed by foreign host.N-2009 00:44:44.56
cgxlap:~ int16h$
cgxlap:~ int16h$ telnet 10.0.0.69
Trying 10.0.0.69...
Connected to 10.0.0.69.
Escape character is '^]'.
Welcome to OpenVMS (TM) VAX Operating System, Version V7.3
Username: SYSTEM
Password:
Welcome to OpenVMS (TM) VAX Operating System, Version V7.3
Last interactive login on Friday, 26-DEC-2008 19:26
Now we will change into the directory where our supplements are stored, and install Compaq C.
$ set def DUA1:[INT16H.DOWNLOADS.SUPP]
$ @SYS$UPDATE:VMSINSTAL CC064 DUA1:[INT16H.DOWNLOADS.SUPP]
OpenVMS VAX Software Product Installation Procedure V7.3
It is 14-JAN-2009 at 00:52.
Enter a question mark (?) at any time for help.
* Are you satisfied with the backup of your system disk [YES]?
The following products will be processed:
CC V6.4
Beginning installation of CC V6.4 at 00:52
%VMSINSTAL-I-RESTORE, Restoring product save set A ...
WARNING! If you downloaded these sets and you are not using an original CD/ISO, it's likely they do not have the correct attributes set for VMSINSTAL to acknowledge them. You may receive messages like:
%BACKUP-F-NOTSAVESET, DUA1:[INT16H.SUPP]CC064.A;1 is not a BACKUP save set
%VMSINSTAL-E-NOSAVESET, Save set A cannot be restored.
This may sound quite serious, but usually - as mentioned above, it's due to incorrect file attributes. This can be fixed quite easily:
$ SET FILE/ATT=(LRL:32256,MRS:32256,RFM:FIX) CC064.*;*
$ @SYS$UPDATE:VMSINSTAL CC064 DUA1:[INT16H.DOWNLOADS.SUPP]
Installation should now continue, most of the answers to questions will be quite easy to answer; If in doubt - answer 'YES' to any questions regarding installing something.
Product: C
Producer: DEC
Version: 6.4
Release Date: 05-JAN-2001
* Does this product have an authorization key registered and loaded? YES
As we have already installed and loaded our PAK, you should answer 'YES' here.
The file SYS$STARTUP:CCXX$STARTUP.COM contains commands to be
executed at system startup to allow for the best compilation
performance. You may want to invoke this command file from your
system's site specific start up file. This command file does not
have to be invoked for correct operation of Compaq C.
Again, these kind of installation notes can be very useful. In this case it's not crucial to perform this task for the product to function, but sometimes there will be additional steps you must take.
$ set term/vt100
$ edit SYS$MANAGER:SYSTARTUP_VMS.COM
Then add the following line somewhere down the bottom with the other layered product startups:
$ @SYS$STARTUP:CCXX$STARTUP.COM
Testing Compaq C
Let's test Compaq C in ANSI89 mode (as your own user, not SYSTEM)!
$ EDIT hello.c
#include <stdio.h>
int main(void)
{
if (printf("Hello, VMS World!\n") < 0) {
return 1;
}
return 0;
}
Compile:
$ CC/STANDARD=ANSI89/WARNINGS=ENABLE=ALL HELLO.C
Link:
$ LINK HELLO
Run:
$ r hello
Hello, VMS World!
$ r hello.exe
Hello, VMS World!
$
Installing WASD VMS Hypertext Services
WASD is the HTTP server package exclusive to OpenVMS. Unfortunately, VAX is no longer supported (boo!), but there are versions of WASD preserved from the 2020 era which still supported VAX and are considerably newer than the 9.30 version I originally covered here - https://wasd.vsm.com.au/wasd/vax/
We're going to compile and install it now so you can test out the compiler you just installed. There are architecture-specific packages we could use to install WASD, but I'm sure you're eager to let it compile while you go make some coffee. We'll start by downloading WASD1151_EXPAT32.ZIP and WASD1151_EXPAT32-VAX.ZIP from wasd.vsm.com.au/wasd/; make sure you are in your DOWNLOADSdirectory. After the transfer has completed, logout and then login as the SYSTEM user.
$ wget "http://wasd.vsm.com.au/wasd/vax/WASD1151_EXPAT32.ZIP"
$ wget "http://wasd.vsm.com.au/wasd/vax/WASD1151_EXPAT32-VAX.ZIP"
$ lo
Because we have not covered the LOGIN.COM file yet, added our dcl$path to it and have not installed our utilities in [BIN] to a system-wide directory... we will have to manually set dcl$path. After this, we will change to the root of dua1 using DUA1:[000000] as the path, and will finally unzip WASD there, and begin the installation.
$ SET DEF dua1:[000000]
$ UNZIP dua1:[INT16H.DOWNLOADS]WASD1151_EXPAT32.ZIP
Extraction will take some time, it will result in the directory dua1:[WASD_ROOT] being created. As per the WASD1151_EXPAT32.TXT file - we may now proceed to install WASD.
$ @DUA1:[WASD_ROOT]INSTALL
%DCL-S-SPAWNED, process SYSTEM_1 spawned
%DCL-S-ATTACHED, terminal now attached to process SYSTEM_1
WASD VMS Web Services, Copyright (C) 1996-2020 Mark G.Daniel.
This package (all associated programs), comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under the
conditions of the GNU GENERAL PUBLIC LICENSE, version 3, or any later version.
http://www.gnu.org/licenses/gpl.txt
*******************************************
* INSTALL WASD VMS Web Services v11.5.1 *
*******************************************
All sections may be individually declined before making any modifications.
In this sense the install may be undertaken step-by-step or sections repeated.
The first section is COMPILING/LINKING, after which you will be able to quit.
In a mixed architecture cluster (including both Alpha and VAX systems) the
compile/link section must be performed on both!
Press RETURN to continue:
*******************
* BUILD PACKAGE *
*******************
Package executables must be built.
0. skip this step
1. compiling from source, then linking
2. linking (separate package) object modules
Select build method [0]: 1
**************************************
* NO SSL TOOLKIT COULD BE LOCATED! *
**************************************
None of the following SSL toolkits could be located.
o OpenSSL (prior to v1.1.0) toolkit
o OpenSSL (v1.1.0 or later) toolkit
o VMS SSL1 product (HP)
o VMS SSL111 product (VSI)
o WASD OpenSSL package
A non-SSL version of the server will be built.
Press RETURN to continue:
**************************
* BUILDING EXECUTABLES *
**************************
%DCL-I-IGNQUAL, qualifiers appearing before this item were ignored
\VERSION\
Compaq C V6.4-005 on OpenVMS VAX V7.3
--- EXPAT ---
Building "EXPAT" for "VAX"
%DELETE-W-SEARCHFAIL, error searching for WASD_ROOT:[SRC.EXPAT.OBJ_VAX]*.OBJ;*
-RMS-E-FNF, file not found
$ CC /INCLUDE=([]) /DEFINE=(HAVE_EXPAT_CONFIG_H) /OBJ=[.OBJ_VAX] XMLPARSE.C
$ CC /INCLUDE=([]) /DEFINE=(HAVE_EXPAT_CONFIG_H) /OBJ=[.OBJ_VAX] XMLROLE.C
$ CC /INCLUDE=([]) /DEFINE=(HAVE_EXPAT_CONFIG_H) /OBJ=[.OBJ_VAX] XMLTOK.C
$ CC /INCLUDE=([]) /DEFINE=(HAVE_EXPAT_CONFIG_H) /OBJ=[.OBJ_VAX] OUTLINE.C
$ CC /INCLUDE=([]) /DEFINE=(HAVE_EXPAT_CONFIG_H) /OBJ=[.OBJ_VAX] ELEMENTS.C
You could install one of the listed SSL toolkits, but we don't really need SSL encryption for our little test (emulated) box at the moment. As previously mentioned, this will take some time - so find something constructive to do while you wait. I suggest looking for VAX or Alpha hardware on an auction site ;-).
Eventually the build will finish. We have some more steps to do though:
********************
* BUILD FINISHED *
********************
************************
* SERVER QUICK-CHECK *
************************
This executes the package demonstration procedure, allowing the basic package
to be evaluated or checked. You may run this at any time to again check the
package for basic functionality using @HT_ROOT:[INSTALL]DEMO.COM
Execute the demonstration procedure? [NO]: NO
****************************
* CONTINUE INSTALLATION? *
****************************
Continue the installation? [NO]: YES
%SECHAN-I-RDBADDMSG, identifier WASD_HTTP_SERVER value 80010001 added to rights database
%SECHAN-I-RDBADDMSG, identifier WASD_HTTP_NOBODY value 80010002 added to rights database
%SECHAN-I-RDBADDMSG, identifier WASD_IGNORE_THIS value 80010003 added to rights database
**********************************
* CREATE/MODIFY SERVER ACCOUNT *
**********************************
The 'server' account HTTP$SERVER is the one the HTTPd process executes as.
It is considered a security advantage to script using a different account.
It must have a unique UIC, preferably in a group of it's own.
DO NOT choose the SYSTEM group ([1,*]) or other privileged group, or [3nn,*]
which is reserved to OpenVMS!
Note: [077,1] is a suggested UIC.
You will be shown whether the entered uic exists before continuing.
Entering "NONE" OR "0" skips account creation/modification.
[077,1]: 077,1
%UAF-W-BADSPC, no user matches specification
If no user matched the specification then the UIC is available!
Choices: YES, create the account using this UIC. NO, select another.
[NO]: YES
The server account "HTTP$SERVER" must have a unique home directory.
The default is a reasonable location for most sites.
If another device is preferred or already in place, out of the package tree,
then that can be specified and used. The directory name should remain as
[HTTP$SERVER] however. Package security settings are applied to this.
You will be shown whether the home area already exists before continuing.
Entering "NONE" OR "0" exits this dialog.
[HT_ROOT:]: HT_ROOT
The area HT_ROOT:[HTTP$SERVER] currently exists.
Continue to use this?
[NO]: YES
HTTP$SERVER account created, setting ...
%UAF-I-MDFYMSG, user record(s) updated
%UAF-I-MDFYMSG, user record(s) updated
%UAF-I-MDFYMSG, user record(s) updated
%UAF-I-MDFYMSG, user record(s) updated
%UAF-I-GRANTMSG, identifier WASD_HTTP_SERVER granted to HTTP$SERVER
Username: HTTP$SERVER Owner: WASD Server
Account: UIC: [77,1] ([HTTP$SERVER])
CLI: DCL Tables: DCLTABLES
Default: HT_ROOT:[HTTP$SERVER]
LGICMD: LOGIN.COM
Flags: DisNewMail DisMail
Primary days: Mon Tue Wed Thu Fri
Secondary days: Sat Sun
Primary 000000000011111111112222 Secondary 000000000011111111112222
Day Hours 012345678901234567890123 Day Hours 012345678901234567890123
Network: ##### Full access ###### ##### Full access ######
Batch: ##### Full access ###### ##### Full access ######
Local: ----- No access ------ ----- No access ------
Dialup: ----- No access ------ ----- No access ------
Remote: ----- No access ------ ----- No access ------
Expiration: (none) Pwdminimum: 6 Login Fails: 0
Pwdlifetime: 90 00:00 Pwdchange: (pre-expired)
Last Login: (none) (interactive), (none) (non-interactive)
Maxjobs: 0 Fillm: 300 Bytlm: 5000000
Maxacctjobs: 0 Shrfillm: 0 Pbytlm: 0
Maxdetach: 0 BIOlm: 2000 JTquota: 4000
Prclm: 100 DIOlm: 1000 WSdef: 1000
Prio: 4 ASTlm: 2000 WSquo: 4000
Queprio: 0 TQElm: 100 WSextent: 20000
CPU: (none) Enqlm: 500 Pgflquo: 500000
Authorized Privileges:
NETMBX TMPMBX
Default Privileges:
NETMBX TMPMBX
Identifier Value Attributes
WASD_HTTP_SERVER %X80010001
Press RETURN to continue:
What is displayed at the end may be a lot to take in. It's what user-accounts look like from UAF. There are a lot of different fields here which will be discussed at a later time, for now all you need to know that a user has been created for the server: HTTP$SERVER with a UIC of [77,1]. Hit RETURN to continue, and you will be presented with another prompt for creating an additional user - HTTP$NOBODY, which is used for the execution of DCL & DECnet scripts. The defaults will be fine for us.
~
Note: [076,1] is a suggested UIC.
You will be shown whether the entered uic exists before continuing.
Entering "NONE" OR "0" skips account creation/modification.
[076,1]:
[NO]: YES
[HT_ROOT:]:
The area HT_ROOT:[HTTP$NOBODY] currently exists.
Continue to use this?
[NO]: YES
Press RETURN to continue:
********************************************************
* GRANT WASD_HTTP_NOBODY TO OTHER SCRIPTING ACCOUNTS *
********************************************************
If you have other accounts that script using files contained in the general
scripting areas ([CGI-BIN], [AXP-BIN], [IA64-BIN] or [VAX-BIN]) you almost
certainly will need to grant the WASD_HTTP_NOBODY rights identifer to allow
those accounts access to the files in the scripting directories.
If you use a scripting account (HTTP$NOBODY) separate to the server account
(HTTP$SERVER) you should never, and should never need to, grant the
WASD_HTTP_NOBODY identifier to the server account. The idea is to isolate the
two environments as much as possible.
Account name? []: *ENTER*
*****************************
* (RE)SECURE THE PACKAGE? *
*****************************
Begin to make changes to files and security settings in the package.
Secure the package? [NO]: YES
**************************************
* SETTING PACKAGE FILE PROTECTIONS *
**************************************
Please be patient, this may take some (considerable) time ...
PROGRESS: 100...200...300...
We can proceed with with the installation, just install everything - I'm sure you'll want to play with all the different scripts at some point.
*****************************
* SERVER WRITE TO [LOCAL] *
*****************************
To allow updating of configuration files located in HT_ROOT:[LOCAL] via the
Server Administration interface, the [LOCAL] directory must have a specific
access control entry added. Note that write access cannot occur unless
HTTPD$AUTH path access is also configured.
Allow server write access to [LOCAL]? [NO]: YES
~
*************************
* HTTPD SUPPORT FILES *
*************************
Copies files from HT_ROOT:[EXAMPLE]
STARTUP.COM to HT_ROOT:[STARTUP]
SHUTDOWN.COM to HT_ROOT:[STARTUP]
STARTUP_DECNET.COM to HT_ROOT:[STARTUP]
STARTUP_LOCAL.COM to HT_ROOT:[STARTUP]
STARTUP_SERVER.COM to HT_ROOT:[STARTUP]
HTTPD$AUTH.CONF to HT_ROOT:[LOCAL]
HTTPD$CONFIG.CONF to HT_ROOT:[LOCAL]
HTTPD$MAP.CONF to HT_ROOT:[LOCAL]
HTTPD$MSG.CONF to HT_ROOT:[LOCAL]
Copy the files? [NO]: YES
*****************************
* INSTALL PACKAGE SCRIPTS *
*****************************
The procedure HT_ROOT:[INSTALL]SCRIPTS.COM installs package scripts.
It prompts for selected groups of scripts to be installed or removed. More
information is available when using the procedure. Scripts available with this
release of the package will not be available for use by the server until this
procedure is performed.
You can execute the procedure now or do it later manually.
Execute the procedure now? [NO]: YES
****************************
* SERVER UTILITY SCRIPTS *
****************************
PCACHE.EXE ......... proxy cache reporting and maintainance script
PROXYMUNGE.EXE ..... reverse-proxy URL rewriting for HTML and CSS
QDLOGSTATS.EXE ..... Quick and Dirty LOG STATisticS
Install these scripts? [NO]: YES
************************
* USEFUL VMS SCRIPTS *
************************
Conan The Librarian ..... Help and Text Library access
HyperReader ............. Online Documentation, Bookreader and BNU access
HyperSPI ................ System Performance Information
hyperDISK ............... graphical disk usage report
SHOW ................... provides system information (must be enabled)
Install these scripts? [NO]: YES
*****************************
* DOCUMENT/FILE SEARCHING *
*****************************
QUERY and EXTRACT are scripts that can be used to perform ad hoc searching of
HTML and plain-text documents and files, returning all or partial documents.
The scope of where they can search should be carefully controlled but they can
be very useful. Check script source descriptive prologue for more detail.
Install these scripts? [NO]: YES
***************************************
* CGIPLUS/RTE DEMONSTRATION SCRIPTS *
***************************************
The CGIplus demonstration scripts are examples of how to create persistent
scripting using DCL and the C language. See the "Scripting Overview" document
for further information on CGIplus.
Includes the CGIsapi (ISAPI) environment and demonstration DLL.
Includes the RTE (Run Time Environment) example interpreter.
Install these scripts? [NO]: YES
*******************************
* DCL DEMONSTRATION SCRIPTS *
*******************************
The DCL demonstration scripts are examples of CGI scripting using DCL.
CGI_SYMBOLS.COM ....... displays the CGI variables available to a script
CGIUTL.EXE ............ utility for assisting with DCL scripts
COOKIE_DEMO.COM ....... an example of cookie manipulation using DCL.
FORMWORK.EXE .......... HTML form data validation and CSV processor
IPCTICKLER.EXE ........ script programmer education tool
TMAILER.EXE ........... email using a template
Some include using the CGIUTL utility within the DCL environment.
Install these scripts? [NO]: YES
***************************
* MISCELLANEOUS SCRIPTS *
***************************
Calendar ........ simple calendar maker
Charset ......... displays the browser character set
Colors .......... displays fonts with different fore/background colors
Fetch ........... can get pages and other resources from HTTP servers
gList ........... list and display graphics in a directory
Install these scripts? [NO]: YES
**************************************
* OSU/DECNET DEMONSTRATION SCRIPTS *
**************************************
These are some OSU demonstration scripts (from the OSU package).
There are also WASD-specific CGI DECnet script examples.
Install these scripts? [NO]: YES
********************************
* JAVA DEMONSTRATION CLASSES *
********************************
The JAVA.COM java script wrapper procedure and example Java classes.
Install these scripts? [NO]: YES
Well done! You now have a working HTTP server installed on your system. You can start it up now by running its startup file.
$ set def DUA1:[HT_ROOT.STARTUP]
$ @startup.com
%WASD-I-STARTUP, begin
%WASD-I-STARTUP, using non-SSL image
%HTTPD-S-PROC_ID, identification of created process is 00000218
%WASD-I-STARTUP, end
Everything appears to be in order, let's have a look at the running processes:
$ show system/full
OpenVMS V7.3 on node CGXVAX 14-JAN-2009 20:28:15.61 Uptime 1 21:25:15
VAXserver 3900 Series
Pid Process Name State Pri I/O CPU Page flts Pages
00000201 SWAPPER HIB 16 0 0 00:00:00.15 0 0
[SYSTEM] 0Kb
00000205 CONFIGURE HIB 8 5 0 00:00:00.06 112 175
[SYSTEM] 87Kb
00000206 LANACP HIB 12 41 0 00:00:00.11 354 712
[SYSTEM] 356Kb
00000208 IPCACP HIB 10 6 0 00:00:00.10 99 177
[SYSTEM] 88Kb
00000209 ERRFMT HIB 8 1475 0 00:00:00.41 146 227
[1,6] 113Kb
0000020B OPCOM HIB 8 264 0 00:00:00.31 328 180
[SYSTEM] 90Kb
0000020C AUDIT_SERVER HIB 10 96 0 00:00:01.00 528 919
[SYSTEM] 459Kb
0000020D JOB_CONTROL HIB 10 48 0 00:00:00.17 192 343
[SYSTEM] 171Kb
0000020E SECURITY_SERVER HIB 10 32 0 00:00:03.05 1869 1509
[SYSTEM] 754Kb
0000020F TP_SERVER HIB 9 10886 0 00:00:44.46 205 317
[SYSTEM] 158Kb
00000210 TCPIP$INETACP HIB 10 155 0 00:00:00.53 757 855
[SYSTEM] 427Kb
00000214 INT16H LEF 9 120 0 00:00:00.37 714 512
[INT16H] 256Kb
00000216 SYSTEM CUR 5 20474 0 00:02:13.67 7147 336
[SYSTEM] 168Kb
00000218 HTTPd:80 HIB 6 840 0 00:00:05.02 3764 3091
[HTTP$SERVER] 1545Kb
Excellent. Not only is WASD HTTPd running, it's running as the user it should be - HTTP$SERVER. Try opening a browser and accessing your new server. Many of the demo scripts+functions won't work for security reasons - you will be able to enable what you like later on when you configure and customize your server. For now, you can run 'DEMO.COM' from 'DUA1:[HT_ROOT.INSTALL]' which will start a demonstration server up on port 7080 in "promiscuous" mode. This should allow you to test the examples included with WASD. Be warned though, some scripts will cause the demo instance to die due the 'SYSTEM' account's AST quota. Quotas and the UAF will be explained at a later time.
Written by int16h (Danyal Samak / DN)
- Web: Cryogenix.org / Greencore.org.uk
- Email: int16h@gmail.com
References and Links
- http://en.wikipedia.org
- http://simh.trailing-edge.com
- http://www.openvmshobbyist.com
- http://connect-community.de
- http://www.wherry.com
- http://64.223.189.234 (HoffmanLabs)
- https://www.process.com/resources/openvms/