Environments¶
Environments define virtual machine configurations for running experiments.
Environment Configuration¶
Environments are defined using YAML files. The environment’s name always comes from the filename stem, never from a field inside the file.
Every environment declares exactly one VM source, and which one it is decides which other fields apply:
|
Source field |
Meaning |
|---|---|---|
|
|
A local disk image. Reference-only: not publishable. |
|
|
A baked disk hosted at an |
|
|
Built on load from declared inputs. See Recipe Environments. |
|
|
Default; infers |
Baked disk, local (vm_type: path)¶
vm: /Users/me/.adare/state/vms/win11.qcow2
vm_type: path
vm_sha256: "abc123..." # optional here; verified on load when present
os:
os: "Windows 11"
platform: "windows" # or "linux"
distribution: "Pro"
version: "11"
language: "English"
architecture: "x86_64" # or aarch64
hypervisor: qemu
tags: ["windows", "forensics"]
description: "Windows 11 forensics environment"
Baked disk, published (vm_type: url)¶
vm: https://cloud.example.org/s/TOKEN/download
vm_type: url
vm_sha256: "abc123..." # REQUIRED for a URL source
vm_format: qcow2 # REQUIRED when the URL has no disk extension
os: {os: "Ubuntu 24.04", platform: linux, distribution: ubuntu}
hypervisor: qemu
Produced by adare env publish-prepare <name> --vm-url <url>, which hashes the
local disk and rewrites the descriptor.
Recipe (vm_type: recipe)¶
vm_type: recipe
hypervisor: qemu
recipe:
profile: windows11arm64 # resolves via the OS profile catalog
iso_name: Win11_25H2_English_Arm64_v2.iso # or `iso:` (path / http(s) URL)
iso_sha256: "638aa2c8..." # REQUIRED; the integrity boundary
iso_notes: "Download from microsoft.com/software-download/windows11"
template: autounattend_win11_arm64.xml
params: {setup_level: 2, disk_size: 160G, ram_mb: 8192, cpus: 4}
provision: # build-time steps, run once (see below)
- {name: my-tool, command: "msiexec /i C:\\tmp\\t.msi /qn", allow_exit_codes: [0, 3010]}
os: {os: "Windows 11 (ARM64)", platform: windows, distribution: Home,
version: '11', language: English, architecture: aarch64}
In recipe mode the os: block is optional – it is derived from the profile when
omitted. Full details, including build-time provisioning and consumer-supplied
ISOs, are in Recipe Environments.
Required Fields¶
A VM source: one of
vm,recipe, or legacyvagrantbox.os.platform:
windowsorlinux(optional for a recipe, which derives it from the profile).vm_sha256: required when
vmis a URL.recipe.iso_sha256: required for every recipe.
Optional Fields¶
vm_type:
auto(default),path,url, orrecipe.vm_format: disk format hint (
qcow2/ova/vmdk/vdi/img/raw); required for a URL with no recognizable disk extension.postsetupinstallations: commands run inside every experiment run. Not the place to install software under test – see
recipe.provisionin Build-time provisioning for why.tags: labels for organization
description: environment purpose
hypervisor / hypervisor_config: hypervisor selection and per-hypervisor settings (e.g.
boot_mode: bios)vagrantbox: legacy Vagrant box (backward compatibility)
Managing Environments¶
# Load environment from config file (for a recipe, this BUILDS the disk)
adare environment load config.yml
# Recipe with a consumer-supplied ISO: point ADARE at the file (or its directory)
adare env load config.yml --iso ~/Downloads/Win11_25H2_English_Arm64_v2.iso
# Retry only the build-time provisioning stage, reusing the cached OS install
adare env load config.yml --reprovision
# List environments
adare environment list
# Delete environment
adare environment delete my-environment
Checking that an environment can actually boot¶
adare environment list shows a disk column and adare env info a
disk row, both reporting the backing disk of the environment’s registered VM:
ok/present– the disk file existsMISSING– the environment is registered but its disk is gone, so any run against it will fail during VM setup-– nothing local to check (for example a URL-baked environment)
This is deliberately separate from the file path column, which is the
environment’s YAML descriptor under ~/.adare/state/environments/. That
descriptor keeps existing after its qcow2 has been pruned, so an environment
whose disk is gone otherwise looks completely healthy in every listing and only
fails once a run reaches VM setup. Check the disk column, not the file path,
before concluding that an environment is usable.
An environment reported as MISSING can be removed with adare env remove.
Remove its name from any experiment that lists it first (adare experiment
remove-env): without --force, env remove refuses to orphan an
experiment, and with --force it deletes the orphaned experiments too.
VM Storage Options¶
By default, when you load an environment with a VM, ADARE copies the VM file (OVA) to managed
storage at ~/.adare/state/vms/. This ensures the VM is protected and always available for
experiments.
However, for very large VM files (e.g., >50GB), you may want to avoid duplicating the file to save disk space.
Using --no-copy Flag¶
The --no-copy flag tells ADARE to reference the VM at its original location instead of
copying it:
adare environment load my-environment.yml --no-copy
Important
When using --no-copy, the original VM file must remain at its current location.
Do not move or delete it, or your experiments will fail!
When to use ``–no-copy``:
You have very large VM files (50GB+) and limited disk space
You want to keep VMs on external storage or network drives
You are certain the VM file location won’t change
What happens if you move the file:
If the VM file is moved or deleted after loading with --no-copy, you’ll see an error when
trying to run experiments:
External VM file not found: /path/to/original/vm.ova
This VM was loaded with --no-copy and the original file is missing.
Note: The --no-copy flag only works with local file paths. If your environment specifies
a URL for the VM, the file will always be downloaded to managed storage.
The environment configuration determines what VM is used and any setup commands that run before experiments execute.