OpenVMX AA–OVMX3–IN

OpenVMX documentation set

Installation Guide

Build the bootable image, boot it under QEMU, install the product kit onto a system disk, and log in to the installed system.

Order numberAA–OVMX3–IN
Applies toOpenVMX V0.7
EditionSecond
DateAugust 2026

This guide installs OpenVMX. It covers four tasks: build a bootable image from source, boot it under QEMU, install a product kit onto a system disk with PRODUCT INSTALL, and log in to the disk you installed. Every command is one you can run. The install commands are the ones a continuous-integration gate runs on every change: it boots OpenVMX, types these commands, and checks that the files land on the target volume.

About this manual This edition applies to OpenVMX V0.7. OpenVMX is under development. Steps that are not implemented yet are marked in the text and listed in Appendix C. If a command here and the project's own test scripts disagree, the test scripts are correct. Report the difference as a documentation bug.

Revision history

EditionDateApplies toSummary
FirstAugust 2026V0.4 First edition. Documents the PRODUCT INSTALL path to a rooted system disk.
SecondAugust 2026V0.6 Reissued for V0.6 (cluster correctness). TCP/IP Services and cluster participation shipped; Appendix C and the grounding manifest updated to match the compatibility register.

1Before you begin

1.1What this guide installs

OpenVMX reimplements a VMS operating environment: the DCL command language, Record Management Services, the system services, and a kernel-resident executive (vms.ko) that userspace reaches through /dev/vms. It runs as a QEMU virtual machine.

This guide follows the install path the current release runs. You build a bootable image, boot it, and use PRODUCT INSTALL to write a product kit onto a target volume. The install lays the volume out as a rooted system disk, under [SYS0.SYSCOMMON]. You then boot that disk on its own and log in. The result is a system disk that holds an OpenVMX system tree and a product database, and that boots to a login prompt without any further step.

1.2What you need

Table 1–1 · Supported hosts
Host architectureQEMU usedStatus
x86-64qemu-system-x86_64Primary. The commands in this guide are shown for this host.
aarch64qemu-system-aarch64Supported. Substitute the machine and console values from Appendix A.

1.3The accounts you use

Two accounts authenticate on a stock system. Use SYSTEM for the install. Every other account in the user authorization file ships with no password and is refused at login.

Table 1–2 · Default accounts
UsernamePasswordPrivileges
SYSTEMMANAGERALL
GUESTGUESTTMPMBX

2Building the bootable image

The build runs in a container and produces a tagged image named ovmx-boot. That image carries the kernel, the bootstrap, a distribution system disk, and the product kit.

2.1Get the source

host shellsh
# clone the source
$ git clone https://github.com/3dl-dev/vms.git
$ cd vms

2.2Build the image

Build with plain docker build -t. This needs no build plugins and works on a stock Docker install.

host shellsh
# build the bootable image; all build tools run in the container
$ docker build -f distro/Dockerfile.bootable -t ovmx-boot .

The build compiles the kernel modules, the userland, and the system-image graph, then packs the boot artifacts. On a cold build this takes about ten minutes. When it finishes, docker images ovmx-boot shows the tagged image.

2.3What the build produces

The ovmx-boot image carries the pieces you boot. They sit under /boot inside the image.

Table 2–1 · Boot artifacts in the image
ArtifactRole
vmlinuzThe kernel.
initramfs-ovmx.cpio.gzThe bootstrap. It loads the executive and mounts the system disk. It does not carry DCL or the system libraries.
ovmx-distrib.imgA distribution system disk. It holds a full OpenVMX system tree, and the product kit staged at SYS$UPDATE:.
ovmx-os.kitThe product kit. PRODUCT INSTALL reads it from SYS$UPDATE:.
Note The bootstrap carries no DCL and no system libraries. Those live on the system disk. This is what makes booting the installed disk in Chapter 5 a real test: if the disk reaches a login, the install wrote a working system onto it, because the bootstrap alone cannot supply one.

3Booting the system

Boot the distribution disk first, to confirm the image works before you install. The image runs OpenVMX under QEMU. It selects the QEMU binary for the host architecture.

3.1Boot the distribution disk

Run the image with DISTRIB set. On first run it copies the distribution disk into place and boots it. Mount a host directory at /data to keep the disk between runs.

host shellsh
# boot the distribution disk under QEMU
$ docker run --rm -it -e DISTRIB=1 -v "$PWD/dist:/data" ovmx-boot

3.2Reach the login prompt

The console shows the kernel and startup messages, then stops. Press RETURN. The operator terminal waits for it before it prompts. The system displays:

OpenVMX consoleOPA0:
Username: SYSTEM
Password: MANAGER

    Welcome to OpenVMX
$

The password is not echoed. After a correct login the system displays its banner and the DCL prompt, $. To leave QEMU, press Ctrl-A then X.

3.3Conversational boot

To stop before the executive attaches and inspect the boot parameters, set BOOT_FLAGS to 0,1. Bit 0 of the second value is the conversational bit.

host shellsh
$ docker run --rm -it -e DISTRIB=1 -e BOOT_FLAGS=0,1 -v "$PWD/dist:/data" ovmx-boot

The boot halts at the SYSBOOT> prompt. There you can SHOW and SET parameters. Type CONTINUE to resume the boot.

4Installing to a system disk

You now install the product kit onto a separate target volume. The install writes a rooted system tree and a product database onto that volume. The install commands in this chapter (MOUNT, PRODUCT INSTALL, PRODUCT SHOW PRODUCT, DISMOUNT) are the ones the gate tests/qemu/test_product_install_e2e.sh types on every change; a release cut and every documentation change re-check this manual against that gate, command for command.

4.1Prepare a target volume

The target must be a formatted volume before you mount it. Build the volume tool with the local tools target, create a blank disk file, and format it. The tool build needs a C compiler and CMake on the host; see Appendix A.

host shellsh
# build INITIALIZE.EXE, the volume tool
$ cmake -B build -DBUILD_TOOLS=ON
$ cmake --build build -j$(nproc)

# create a blank 64 MB disk and format it as a volume labelled WORK
$ truncate -s 64M target.img
$ build/bin/INITIALIZE.EXE target.img WORK 64

4.2Boot with the target attached

Boot the distribution disk with the target attached as a second virtio disk. Inside the running system the target appears as VDA100:. Bind-mount the current directory so the install writes to target.img on the host.

host shellsh
$ docker run --rm -it -v "$PWD:/work" --entrypoint qemu-system-x86_64 ovmx-boot \
    -kernel /boot/vmlinuz -initrd /boot/initramfs-ovmx.cpio.gz \
    -nographic -append "console=ttyS0 loglevel=3 quiet" \
    -m 512M -smp 1 -nic none -nodefaults -serial mon:stdio \
    -drive file=/boot/ovmx-distrib.img,format=raw,if=virtio \
    -drive file=/work/target.img,format=raw,if=virtio \
    -no-reboot

Log in as SYSTEM, as in Chapter 3. The next four commands run at the DCL prompt.

4.3Mount the target volume

Type MOUNT with the device and its label. The system mounts the volume through the executive and confirms it.

OpenVMX consoleDCL
$ MOUNT VDA100: WORK
%MOUNT-I-MOUNTED, WORK mounted on _VDA100:

4.4Install the kit

Type PRODUCT INSTALL, naming the kit at SYS$UPDATE: and the destination device. The install reads the kit and writes the system tree onto VDA100:.

OpenVMX consoleDCL
$ PRODUCT INSTALL VMS /SOURCE=SYS$UPDATE:OVMX-OS.KIT /DESTINATION=VDA100:
%PCSI-I-DONE

A %PCSI-I-DONE line with no %PCSI-E- or %PCSI-F- line means the files landed.

Caution Install with /DESTINATION. That writes the rooted [SYS0.SYSCOMMON] layout, which a bootable system disk needs. A flat layout does not boot: the installed disk halts with %OVMX-F-SYSINIT, because startup cannot find DCL.EXE on the path it resolves.

4.5Confirm the files and dismount

List a file the install wrote, to confirm the rooted layout. Then read the product database on the target, and dismount to flush the volume.

OpenVMX consoleDCL
$ DIRECTORY VDA100:[SYS0.SYSCOMMON.SYSEXE]DCL.EXE
Directory VDA100:[SYS0.SYSCOMMON.SYSEXE]
DCL.EXE;1
Total of 1 file.

$ PRODUCT SHOW PRODUCT /DESTINATION=VDA100:
PRODUCT                          KIT TYPE      STATE
X86VMS VMS                       Full LP       Installed

$ DISMOUNT VDA100:
%DISMOUNT-I-DISMOUNTED, WORK dismounted from _VDA100:

The product name comes from the kit. On an x86-64 build the kit is named X86VMS VMS. Shut the machine down with Ctrl-A then X.

5First boot and login

5.1Boot the installed disk

Boot the installed target on its own, as the only system disk, with the bootstrap. Because the bootstrap carries no DCL and no system libraries, reaching a login prompt proves the install wrote a working system onto the disk.

host shellsh
$ docker run --rm -it -v "$PWD:/work" --entrypoint qemu-system-x86_64 ovmx-boot \
    -kernel /boot/vmlinuz -initrd /boot/initramfs-ovmx.cpio.gz \
    -nographic -append "console=ttyS0 loglevel=3 quiet" \
    -m 512M -smp 1 -nic none -nodefaults -serial mon:stdio \
    -drive file=/work/target.img,format=raw,if=virtio \
    -no-reboot

The disk mounts as DKA0:, the system disk, and startup runs. If the console shows %OVMX-F-SYSINIT and stops, the installed layout is not bootable; see Appendix B.

5.2Log in

Press RETURN at Username:. Log in as SYSTEM with the password MANAGER. The system reaches the DCL prompt. DCL activated from the installed disk, since the bootstrap does not carry it.

6Verifying the installation

Run these commands at the DCL prompt on the booted system. Each one reads from the installed disk.

6.1Confirm DCL is running

Type SHOW TIME. The system displays the current date and time. This confirms DCL activated from the installed disk.

OpenVMX consoleDCL
$ SHOW TIME
  13-AUG-2026 09:14:07

6.2Check the system tree and product database

List the DCL image through the SYS$SYSTEM: logical name, which resolves into the rooted tree on the booted disk. Then list the installed product.

OpenVMX consoleDCL
$ DIRECTORY SYS$SYSTEM:DCL.EXE
Directory SYS$COMMON:[SYSEXE]
DCL.EXE;1
Total of 1 file.

$ PRODUCT SHOW PRODUCT
PRODUCT                          KIT TYPE      STATE
X86VMS VMS                       Full LP       Installed

6.3List the system

Type SHOW SYSTEM. The system lists its processes. Table 6–1 lists other commands that read installed state.

Table 6–1 · Commands that read installed state
CommandShows
SHOW TIMEThe current date and time.
SHOW SYSTEMThe processes on the system.
SHOW DEFAULTThe current device and directory.
SHOW DEVICEThe mounted devices.
DIRECTORYThe files in a directory.
PRODUCT SHOW PRODUCTThe installed product kit.

AAppendix A. Build prerequisites

On an aarch64 host, the direct QEMU commands in Chapters 4 and 5 change in three values. Use qemu-system-aarch64 for the entrypoint, add -machine virt -cpu cortex-a57, and set the console to console=ttyAMA0 in the -append string. The rest of each command is the same.

BAppendix B. Troubleshooting

Table B–1 · Common problems
SymptomCause and action
No Username: prompt The operator terminal waits for a keypress. Press RETURN once.
MOUNT reports an error The target is not formatted, or the label does not match. Format it with INITIALIZE.EXE (Section 4.1) and mount it with the same label.
%OVMX-F-SYSINIT on the installed disk The install did not write the rooted layout, or you booted the wrong disk. Reinstall with /DESTINATION and confirm VDA100:[SYS0.SYSCOMMON.SYSEXE]DCL.EXE lists before you dismount.
The build stops in the link stage A system image was linked with the wrong toolchain, and the build refuses to ship it. This is a check, not a workaround target. Report it as a build bug.
QEMU will not exit Press Ctrl-A, then X.

CAppendix C. Not yet available

OpenVMX is under development. These parts of a VMS install are not implemented in V0.6. This guide does not use them.

For the current status of every facility, see the compatibility surface.