Skip to content

Latest commit

 

History

History
447 lines (325 loc) · 18.1 KB

appliance.md

File metadata and controls

447 lines (325 loc) · 18.1 KB

The appliance: a ready-to-play virtual machine

Audience: anyone on Windows or macOS who wants to play labs without installing anything, and anyone who prefers a throwaway machine to their own. No knowledge of virtualization is assumed: this page goes from the download to the first lab, step by step.

Language: English · Français

The appliance is a Debian 13 virtual machine with dsoxlab, Ansible, Terraform and a desktop already in place. You import it, you start it, you play.

The dsoxlab appliance: dsoxlab doctor in a terminal on the XFCE desktop

The appliance running in VirtualBox, a few minutes after import: dsoxlab doctor on the desktop, 86 labs discovered, and the only choice left to make — the hypervisor — named together with the command that settles it.

On Linux it is the wrong answer, and this page says so plainly: downloading half a gigabyte to avoid uv tool install dsoxlab makes no sense. It exists for the systems where that command is not an option.


What you need

Minimum Comfortable
Memory 4 GB free for the VM 8 GB, required for vm labs
Disk 25 GB free 70 GB, if you work through several catalogs
CPU 2 cores 4 cores
Software VirtualBox (free) —
Network a connection, for the first boot —

The first boot downloads about 1.5 GB (dsoxlab, the hypervisors, the desktop). That is deliberate: nothing is pinned in the image, so nothing in it is stale.


Step 1 — Install VirtualBox

Go to https://www.virtualbox.org/wiki/Downloads and take the package for your system:

  • Windows: Windows hosts. Double-click, follow the wizard, and accept the network driver installation when Windows asks.
  • macOS Intel: macOS / Intel hosts. After installing, macOS may block the extension: open System Settings → Privacy & Security and click Allow for Oracle.
  • Linux: your package manager, or the package on that page.

The Extension Pack it offers is not needed here.


Step 2 — Download the image

The images are attached to the project's Releases, on every published version. Which means: take the latest, there is nothing to check.

File For Tested
dsoxlab-appliance-<version>.ova VirtualBox — Windows, Linux, Intel Mac yes: import, boot, desktop
the same .ova VMware Workstation and Fusion not directly; the OVF validates against the DMTF schema and declares what VMware expects
dsoxlab-appliance-<version>.qcow2 QEMU/KVM, libvirt, Proxmox yes
SHA256SUMS checking what you downloaded —

<version> is the release number, exactly as the Releases page shows it without its v: the file on release v0.2.3 is dsoxlab-appliance-0.2.3.ova.

If you are starting out, take the .ova.

Check the digest before importing half a gigabyte from the internet. Download SHA256SUMS next to the image, then:

# Windows, in PowerShell
Get-FileHash .\dsoxlab-appliance-<version>.ova -Algorithm SHA256
# macOS and Linux
shasum -a 256 dsoxlab-appliance-<version>.ova

The value printed must match the one SHA256SUMS gives for that file. If it differs, the download is incomplete or tampered with: start it again.

Both images are x86-64. See Apple Silicon below.

Only the last two sets of images are kept. Older releases keep their page, their changelog and their Python distributions, but their .ova and .qcow2 are removed — roughly 900 MB each, for images that pin no dsoxlab version and install the latest at first boot. An old image offers nothing but its weight.


Step 3 — Import the image

In VirtualBox: File → Import Appliance, pick the .ova file, then Next. Double-clicking the .ova opens the same window.

The next screen lists what the machine advertises: 4 CPUs and 8192 MB of memory. Both can be changed right here, and this is the moment to do it:

  • your machine has 8 GB of RAM in total: bring the VM down to 4096 MB. shell labs will work, vm labs will not — and dsoxlab doctor will say so rather than leave you guessing;
  • your machine has 16 GB or more: leave 8192 MB.

Click Finish. The import takes one to three minutes, while VirtualBox decompresses the disk.


Step 4 — For vm labs: enable nested virtualization

Skip this if you only want shell labs.

Read this before ticking the box. Running KVM inside VirtualBox works poorly, and we are working on it. VirtualBox exposes partial nested virtualisation: enough for /dev/kvm to appear and for libvirt to agree to start a machine, not enough for that machine to run correctly.

What it looks like, measured on 2026-10-10 with VirtualBox 7: dsoxlab provision creates all three machines in two seconds, then one of them burns a whole core at 100% without ever allocating its memory — 369 MB touched out of 2048 requested. Adding memory and CPUs changes nothing (tried up to 16 GB and 8 vCPUs), and the appliance eventually freezes.

If you are after vm labs, prefer one of the two paths below. If you stay on VirtualBox, shell labs work perfectly, and there are many of them: the whole Terraform catalog, and a good share of the others.

What you want to play The solid path
vm labs, comfortably dsoxlab directly on your Linux machine — uv tool install dsoxlab, native KVM, no nesting at all. This is the tool's primary use case
vm labs, from a virtual machine the appliance under KVM/QEMU rather than VirtualBox: the .qcow2 is made for it, and KVM-inside-KVM behaves far better
shell labs VirtualBox is fine, and you can leave the box unticked

A vm lab starts real machines inside the appliance. Your computer therefore has to allow a virtual machine to launch others, which is set outside the appliance, with it powered off.

In VirtualBox, select the machine, then Settings → System → Processor. Three settings matter on that tab, and two of them are easy to miss:

VirtualBox's Processor tab, set correctly: 4 CPUs, Processing Cap at 100%, and nested virtualisation ticked

Setting Value Why
Nested VT-x/AMD-V ticked without it, no vm lab starts at all
Number of CPUs 4 the image asks for it, but the import does not always carry it over
Processing Cap 100% one import left it at 1%: the machine is then not slow, it is unusable

On the command line:

VBoxManage modifyvm "dsoxlab-appliance-<version>" --nested-hw-virt on
VBoxManage modifyvm "dsoxlab-appliance-<version>" --cpus 4 --cpuexecutioncap 100

If the box is greyed out, there are two likely causes: on an Intel host, some VirtualBox versions only expose the setting from the command line; and on Windows, Hyper-V must be disabled, otherwise it keeps virtualisation to itself. If nothing helps, your CPU or your BIOS does not expose it: shell labs remain entirely playable.


Step 5 — Start it, and let it work

Select the machine and click Start. Here is what you will see, in three acts, with nothing to type:

  1. a few seconds of white text on black — Debian booting;
  2. several minutes where the machine appears to sit at a login prompt. It is not idle: it is installing dsoxlab, the hypervisors and the desktop. Count five to fifteen minutes depending on your connection;
  3. the machine reboots on its own and shows the login screen.

The appliance's login screen

That reboot is not a failure: group membership and the desktop only take effect at the next boot.

If something fails, the machine says so and starts over at the next boot: it never marks itself configured when it is not. The usual cause is no network in the virtual machine — check its adapter under Settings → Network, then restart it.


Step 6 — Log in

user student
password dsoxlab

You only need that password if you skipped the wizard's question: at the very first boot, before the login prompt, the machine asks you to choose another one. The build password is public, it is written in this repository.

If you did not answer, it is still dsoxlab and the appliance said so on screen. Change it once logged in:

passwd

Up to 0.3.3 this change was forced by the system at first login. That was a defect: LightDM's graphical greeter cannot carry that dialogue, and the session could not be opened at all without switching to a text console.

You land on an XFCE desktop. The terminal is in the bottom bar, second icon.


Switching to a text console when the desktop will not cooperate

A full-screen terminal without any desktop stays available: that is how you repair a graphical session that refuses to open.

In VirtualBox, Ctrl+Alt+F3 does not work: your host system grabs it, and the virtual machine never sees a thing. You need the host key, shown at the bottom right of the window — Right Ctrl by default:

go to a console Right Ctrl+F3
back to the desktop Right Ctrl+F1 (sometimes F7)

Many compact keyboards have no Right Ctrl key. The combination can be changed: File → Preferences → Input, Virtual Machines tab, Host Key Combination — click the field and press the key you want.


Step 7 — Play a first lab

In the terminal:

dsoxlab demo                 # installs a one-lab demonstration catalog
cd ~/.local/share/dsoxlab/demo

dsoxlab course premiers-pas     # the lesson
dsoxlab run premiers-pas        # drops you into the lab's work directory
dsoxlab challenge premiers-pas  # the mission
dsoxlab check premiers-pas      # the tests, and the score

That demonstration lab needs no VM and no container: it proves the whole loop works before you invest in a full catalog.

Then install a real catalog:

dsoxlab catalog add https://github.com/stephrobert/linux-dsoxlab-training
dsoxlab doctor                  # what this machine can do, and what is missing
dsoxlab list-labs               # the catalog's 86 labs

doctor will tell you whether a choice is still pending — the hypervisor, for instance, when the catalog offers several:

dsoxlab use --provider kvm
dsoxlab start <lab-id>          # context, prerequisites, infrastructure, session

dsoxlab provisioning a lab's machines from the appliance's terminal

dsoxlab start on a vm lab, inside the appliance: sixteen required checks green, then Terraform bringing up the lab's three machines — VMs inside the VM.


When something goes wrong

Symptom Most likely cause What to do
The machine stays on a console, no desktop the first boot did not complete it starts over at the next boot: check the VM's network, then restart it
The login prompt appears and nothing seems to happen the first configuration runs in the background press Enter: the prompt shows the current step. Since 0.3.2 it says so by itself
The keyboard is QWERTY images up to 0.3.1 since 0.3.2 the image ships AZERTY. On an earlier image: sudo apt install console-setup keyboard-configuration && sudo dpkg-reconfigure keyboard-configuration
"Temporary failure in name resolution" the VM has no network Settings → Network, adapter 1 enabled, attached to NAT
dsoxlab doctor reports missing nested virtualization it is enabled on your computer, not inside the VM step 4, appliance powered off
doctor says "RAM: … available for … declared" the VM is too small for this catalog give it more memory, or play shell labs
The import fails on an OVF error incomplete download check the SHA256 digest again
VMware refuses the import: "SHA256 digest of file does not match manifest" a defect in images up to 0.2.5 — see below use 0.3.0 or later, or import with ovftool --skipManifestCheck
VMware says the OS identifier is not supported and maps it to "Other (32-bit)" same versions same fix; the guest is 64-bit either way, so the appliance still runs

On the manifest digest, for images up to 0.2.5. A stream-optimized VMDK ends at a marker its reader stops on; qemu-img left a zero-filled alignment tail after that marker, and ovftool therefore hashed 64 512 fewer bytes than our manifest declared. The disk was intact — only the two readings disagreed. Measured on the published file, fixed in 0.3.0, and now checked at build time: the build refuses to ship an image whose file digest is not also its stream digest.

A report beats a workaround: dsoxlab support --issue fills in the diagnosis and opens the issue in the right place.


Apple Silicon (M1-M4)

The appliance does not run on an Apple Silicon Mac, and saying otherwise would waste your afternoon. Both images are x86-64; Parallels, VMware Fusion and UTM virtualize arm64 on these machines and do not emulate another architecture at a usable speed. UTM can emulate x86-64 through QEMU's interpreter, at roughly a tenth of native speed — enough to watch a boot, not to play a lab.

An arm64 image is the obvious answer, and it is planned rather than done, for two reasons worth knowing:

  • GitHub's hosted arm64 runners do not expose /dev/kvm, so the CI would have to build that image under emulation, for hours.
  • Nested virtualization on Apple Silicon only exists from the M3 with macOS 15 or later. So even with an arm64 image, vm labs would stay out of reach on most Macs; only shell labs would run.

Until then, on an Apple Silicon Mac, install the tool: uv tool install dsoxlab. Every shell lab works, which is the whole Terraform catalog and a good part of the others.


What is inside

Debian 13, minimal, plus what a lab workstation needs: git, curl, vim, python3, man, Ansible, Terraform, and after the first boot dsoxlab, the hypervisors and the desktop. Documentation and locales other than English and French are excluded from the packages, which is most of what keeps the image under half a gigabyte.

The recipe is in packer/, built by the CI on a GitHub-hosted runner. It is reproducible: nothing is hand-made in the image.

Known limits

  • vm labs under VirtualBox: work in progress. KVM inside VirtualBox behaves badly — a machine burning a core without booting, then a freeze. It is not a matter of memory or CPUs. Until that improves, vm labs want dsoxlab on a plain Linux machine, or the appliance under KVM/QEMU; shell labs work everywhere. See step 4.
  • One user, one machine. The appliance is not a shared classroom server; a trainer serving several learners wants the trainer's page.
  • The disk declares 64 GB, and it grows on your side. It is thin: the file you download stays under 500 MB, and space is taken from your host only as you go. So there is nothing to enlarge — the three-node Kubernetes cluster that 20 GB could not hold now fits — but plan for the free space: one catalog with its base images and its VMs approaches thirty gigabytes, two go past it.
  • No automatic update. uv tool upgrade dsoxlab updates the tool inside an appliance you already run. Importing a newer image only brings you an updated system: dsoxlab itself is installed fresh at every machine's first boot.

Keyboard and language

The image ships a French AZERTY keyboard, because the training is French. The layout data is in the image: nothing to download, and it works from the console before any network.

For another layout, one command:

sudo dpkg-reconfigure keyboard-configuration   # then: sudo setupcon

The system locale stays English, deliberately: an error message gets searched word for word in a search engine. It is the same reason dsoxlab's own log is written in English. fr_FR.UTF-8 is generated in the image all the same, so switching does not mean reinstalling:

sudo localectl set-locale LANG=fr_FR.UTF-8

And for dsoxlab's own interface, independently of the system:

export DSOXLAB_LANG=fr        # or en

Following the first boot

It downloads about 1.5 GB and takes several minutes. It does not block login: the prompt appears while it works.

Three ways to know where it stands, from simplest to most precise:

  1. Press Enter at the login prompt. It shows the current step — getty re-reads /etc/issue at every prompt.
  2. journalctl -u dsoxlab-premier-demarrage -f to follow it live.
  3. ls -l /var/lib/dsoxlab-premier-demarrage.fait: that marker exists only after a complete success.

Three signs that it is done: the machine reboots by itself, it comes back to a desktop rather than a console, and dsoxlab --version answers.

On failure, the login prompt names the steps that failed, and nothing is lost: everything starts again at the next boot.


The first-boot wizard

At the very first boot, before the login prompt, the machine asks three questions on its own console:

  Keyboard layout

    * 1) French (AZERTY)          2) Belgian      3) Swiss French
      4) Canadian French          5) US (QWERTY)  6) German (QWERTZ)

  Your choice [1] (30 s):

Then the timezone and dsoxlab's interface language.

The menus are numbered on purpose: digits sit in the same place on every layout, so answering "2" works whatever keyboard the machine believes it has — which is exactly the problem being solved.

You may answer nothing. After 30 seconds the starred value is kept: AZERTY, Europe/Paris, French. A boot with nobody watching is therefore never blocked, and dsoxlab.oobe=0 on the kernel command line skips the wizard entirely.

It does not run twice: its marker is /var/lib/dsoxlab-assistant.fait. To run it again deliberately, remove that file and reboot.