Install, run, snapshot, restore

Get started

FlashVMM works the same on macOS (Apple Silicon), Linux (x86_64 and arm64) and Windows (x64 and arm64): one flash CLI, one per-VM HTTP API, one set of flash-mcp tools. Install, run your first VM, then open the guide you need. Every command is shown as observed on a clean machine.

System requirements

PlatformArchitecturesRequirement
macOSApple Silicon (arm64)macOS 15 or later. Runs on Apple's Hypervisor.framework; no host configuration.
Linuxx86_64, arm64/dev/kvm available to the user who runs the VMs (bare metal, or a VM with nested virtualization).
Windowsx64, arm64Windows 10/11 x64 or Windows 11 on ARM, with the Windows Hypervisor Platform feature enabled and virtualization on in firmware.

Every installer carries the flash CLI, the flashvmm VMM, flash-mcp, the host daemon flashhostd, the warm-pool daemon flashpoold, and a guest kernel and root filesystem for that platform.

Install

Linux and macOS — one command. It detects the platform: on Linux it installs the signed binaries into /opt/flashvmm; on macOS it installs a Developer ID‑signed, notarized package into the same /opt/flashvmm layout. Either way flash lands on your PATH.

curl -fsSL https://release.flashvmm.com/dist/flashvmm/stable/install.sh | sudo bash

Windows — enable the hypervisor once (then reboot), and install the MSI for your architecture from PowerShell. The script picks x64 or arm64, verifies the published SHA-256, and installs into %ProgramFiles%\FlashVMM with flash on the system PATH.

dism /online /enable-feature /featurename:HypervisorPlatform /all   # once, as Administrator, then reboot

$arch = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { 'x64' }
$base = 'https://release.flashvmm.com/dist/flashvmm/stable'
$rel  = Invoke-RestMethod "$base/bootstrap-windows-$arch.json"
$msi  = Join-Path $env:TEMP $rel.msi
Invoke-WebRequest "$base/$($rel.msi)" -OutFile $msi -UseBasicParsing
if ((Get-FileHash $msi -Algorithm SHA256).Hash.ToLower() -ne $rel.sha256) { throw "checksum mismatch" }
Start-Process msiexec -ArgumentList "/i `"$msi`" /quiet /norestart" -Verb RunAs -Wait

Linux: grant KVM access once with sudo usermod -aG kvm "$USER" and start a new login session; VM commands then run without sudo, each user with a private registry under $XDG_RUNTIME_DIR/flashvm. Windows: each VM's endpoint is the named pipe \\.\pipe\flashvm-<id>. Move to a new release anytime by re-running the same install.

sudo flash self-update --show-trust   # confirms the install is genuinely signed
flash --version
/opt/flashvmm/bin/flashvmm --version  # Linux/macOS: flashvmm is not on PATH — flash finds it next to itself

Run a VM

flash run --bundle /opt/flashvmm/bundles/current --id vm1 \
  --vcpus 1 --mem-mib 512 \
  --cpu-template host-raw \
  --entry "sleep 600"
flash ls
flash rm vm1

Bundle paths: Linux /opt/flashvmm/bundles/current, macOS /opt/flashvmm/bundles/default, Windows "C:\Program Files\FlashVMM\guest".

Limits only when you ask

--vcpus and --mem-mib are required — they are what the VM is. Every cap (--cpu-millis, --disk-mib, --disk-bps, --disk-iops, and the NIC mbps/pps/ingress-mbps) is optional: omitted means uncapped, passed means enforced. flash never picks a limit for you, and a limit the platform cannot enforce is refused rather than silently dropped.

CPU templates are required for snapshots

A VM can run without a template, but flash snapshot will refuse to capture it. Templates cannot be added after creation, so any VM that may need to be captured should start with one. host-raw exposes the host's CPUID to the guest.

The same VM with every limit enforced

flash run --bundle /opt/flashvmm/bundles/current --id vm2 --vcpus 2 --mem-mib 1024 \
  --cpu-millis 1500 --disk-mib 2048 --disk-bps 100000000 --disk-iops 10000 \
  --cpu-template host-raw --entry "sleep 600"

Guides

Everything after the first run

Run with networking

Linux: flash does not create tap devices. The privileged flashnet helper creates the tap, drops its capabilities, and then executes an unprivileged flash run; the VMM itself never runs through sudo.

sudo flashnet --mode nat --vm-id demo -- \
flash run --bundle /opt/flashvmm/bundles/current --id demo --vcpus 1 --mem-mib 512 \
--nic '{NIC},mbps=100,pps=20000,ingress-mbps=100' --entry /mnt/demo/hello.sh

{NIC} is replaced with the generated tap configuration (tap=NAME,ip=...,gateway=...); the guest applies it and reports net: eth0=<addr> gw ok dns <resolver> in flash logs. --uplink is optional for NAT (the default-route interface is used). The NIC rates are optional. Bridge, NAT, and routed modes are implemented directly. macOS and Windows: NAT networking is user-mode and needs no elevation or host configuration; a VM can have up to 8 NICs, each on its own NAT segment. See Networking & flashnet for the complete device model.

Snapshot and restore
flash snapshot vm1 --path /var/tmp/vm1.snap
flash rm vm1
flash restore --from /var/tmp/vm1.snap --bundle /opt/flashvmm/bundles/current \
--id vm1 --vcpus 1 --mem-mib 512 --cpu-template host-raw

Restore returns a VM under the identity it had when captured: the original must be removed first, --id must match, and --vcpus/--mem-mib must match the capture. A different ID returns a named identity-mismatch error.

Clone

clone creates a new VM from a snapshot, while restore brings back the VM that was originally captured. Clone accepts the same flags as restore, but its ID does not need to match the source, and the source VM can continue running.

flash clone --from /var/tmp/vm1.snap --bundle /opt/flashvmm/bundles/current \
--id replica-1 --vcpus 1 --mem-mib 512 --cpu-template host-raw \
--nic tap=tap1,ip=10.110.0.11/24,gateway=10.110.0.1,mbps=1000,pps=100000,ingress-mbps=1000

Replicas share memory copy-on-write and resume from the captured execution state rather than booting from the beginning. In a measurement of ten 512 MiB replicas from one snapshot, the group used 3.4% of the memory required by ten private copies and resumed in 15–37 ms.

Fork a running VM

flash fork branches a VM while it runs: every child continues from the parent's state at that instant — same memory, same running program — with its own identity. The parent keeps running. Start the parent with --forkable and the first fork freezes its RAM in place (no copy); every later fork saves only the pages that changed since.

flash run --bundle /opt/flashvmm/bundles/current --id parent --vcpus 1 --mem-mib 1024 \
  --cpu-template host-raw --forkable --entry /your/agent --detach
flash fork parent --count 3                 # parent-fork1..3
flash fork parent --count 8 --nic pool=web  # each child its own NIC from a flashnetd pool (Linux)
flash rm parent-fork1                       # a child is an ordinary VM

Measured on bare metal (first fork / later diff fork): Linux x86_64 1 GiB 318 ms / 15 ms; macOS 512 MiB 18 ms / 166 ms; Windows x64 ~80 ms / ~65 ms; Windows arm64 ~100 ms / ~85 ms; Raspberry Pi 5 720 ms / 318 ms. Same command on every platform.

Sleep and wake a VM

flash sleep saves a running VM to a file and ends its process: while it sleeps it uses no memory and no CPU. flash wake brings it back under the same name, carrying on from the instant it slept, with its share, network rules, caps and secret proxies. flash ls shows sleeping VMs; flash rm deletes one. A sleeping VM survives a reboot.

flash sleep myvm
flash ls                                                          # myvm  sleeping
flash wake myvm                                                   # a VM with no network card
flashnet --mode nat --vm-id myvm -- flash wake myvm --nic '{NIC}'  # one that had a card gets one again

Linux x86_64 needs the VM started with --cpu-template, as for any snapshot. A VM with a GPU grant cannot sleep. Same command on every platform; MCP tools flash_sleep and flash_wake.

Run commands and move files (exec, cp, del)

Work inside a running VM with no network and no SSH: flash exec, flash cp and flash del ride a dedicated virtio-console port straight to the guest agent.

flash exec vm1 -- sh -c 'uname -a; df -h'      # streams; exits with the command's code
flash exec vm1 --json --timeout 60 -- ./job.sh   # one JSON object: exit_code, stdout, stderr, state
flash cp ./data vm1:/work/data                   # files and whole trees, permissions kept
flash cp vm1:/work/out.csv ./out.csv
flash del vm1:/work/data -r                      # / is always refused
flash execs vm1                                  # every exec is a resource
flash execs vm1 7 --kill                         # killed; the record and its output stay
flash execs vm1 7 --rm                           # the record is removed

Up to 64 concurrent execs per VM; 16 MiB of output kept per stream (live streaming is uncapped); timeouts kill the whole process tree (default 300 s); up to 1 GiB per file. A 100 MiB copy round trip takes ~0.6 s on macOS, ~0.9 s on Windows x64 and ~1.7 s on Linux x86_64. The REST form is resource CRUD: POST/GET /v1/flashvm/guest/execs, PATCH {"state":"killed"} and DELETE on /guest/execs/{id}, and PUT/GET/DELETE /v1/flashvm/guest/files?path=.

See what a VM changed (diff)

Compare two VMs, or a snapshot and a VM, file by file. Every mount is compared, RAM-backed ones included; changed text files come with a line diff.

flash fork vm1 --id vm1-try                       # try something in a copy
flash diff vm1 vm1-try                            # added, deleted, renamed, modified, with line diffs
flash diff vm1 vm1-try --patch > fix.patch        # just the patch (patch -p1 from the guest root)
flash diff vm1 vm1-try --json                     # for tools; MCP: flash_diff
flash diff before.snap vm1 --bundle ./bundle --vcpus 1 --mem-mib 256   # a snapshot side

The kernel's own trees are always skipped; logs, caches and root's shell history are left out unless --all; --exclude PATH leaves out more. A snapshot side is read through a short-lived clone, removed when the command returns. Nothing is stored.

Limit what a VM can reach (egress) and keep keys out of it (secret proxies)
flash run ... --nic '{NIC}' --egress public          # the internet, nothing private (LAN, host, metadata)
flash run ... --nic '{NIC}' --egress 'deny:pastebin.com'                  # public minus a blocklist
flash run ... --nic '{NIC}' --egress 'allow:pypi.org,*.github.com,10.0.0.0/8'   # only these
flash run ... --nic '{NIC}' --egress-file policy.json                    # {"policy": "public", "deny": [...]}
flash set vm1 --egress none                                              # change it on the running VM
flash connections vm1            # every connection and DNS question: allowed, or REFUSED and why
flash connections vm1 --follow

# an API the VM can use but never holds the key for
flash run ... --nic '{NIC}' --egress none \
  --secret-proxy model=~/.keys/model,upstream=https://api.example.com,header=x-api-key,max-calls=200
#   inside the guest: $FLASH_PROXY_MODEL_URL  (http://<host>:7730/<token>/)
flash proxies vm1                # URL, caps, calls, bytes, refused
flash proxies vm1 model          # each call: method, path, status, bytes, ms
flash proxies vm1 model --max-calls none

Enforced in FlashVMM's own network path on Linux, macOS and Windows. Under allow: a name is reachable at the addresses the guest's own lookup returned; any other name is answered REFUSED before it leaves the host. The policy survives restore and fork, and flashnet pool create --egress gives it to every claim. Measured overhead: within noise. A secret proxy reaches the host whatever the policy; the key is read by flash, held only in FlashVMM's memory, and masked in anything the upstream echoes.

Warm pools

flashpoold keeps pools of parked spares; a claim wakes one in milliseconds. Only the shape is required.

flash pool create --vcpus 1 --mem-mib 512 --count 3 --wait-idle 120
flash pool ls
flash claim <member-id> --entry /your/workload        # add --cpu-millis / --disk-mib only to cap it
Give VMs the GPU (GPU pools)

A GPU pool loads one AI model on the host's GPU once and shares it with every VM you allow. The VMs send it requests over their network card and get answers back; none of them touches the GPU or needs a driver. flashgpud runs the pools: Metal on Apple Silicon, Vulkan on Linux and Windows (NVIDIA, AMD and Intel alike). The model is any GGUF file.

flash gpu info                                  # backend (metal | vulkan | none), the GPU, its memory
flash gpu pool create --id qwen --model ~/models/qwen2.5-1.5b-instruct-q4_k_m.gguf --slots 4 --wait-ready 300

# a VM allowed to use it (flashnet's {NIC} gives the network card the pool is reached through)
flashnet --mode nat --vm-id agent1 -- flash run --id agent1 --vcpus 1 --mem-mib 512 \
  --nic '{NIC}' --gpu-pool qwen --entry /your/agent --detach

flash gpu grant ls --gpu-pool qwen              # which VMs may use it, requests running and waiting
flash gpu pool set qwen --slots 8               # more requests at once (the engine restarts only if a value changes)
flash gpu pool rm qwen

Inside the VM, the workload and every flash exec command get two variables: FLASH_GPU_URL (the pool's address) and FLASH_GPU_TOKEN (this VM's own key). The pool speaks the common chat-completions format:

curl -s "$FLASH_GPU_URL/chat/completions" \
  -H "Authorization: Bearer $FLASH_GPU_TOKEN" -H "Content-Type: application/json" \
  -d '{"messages":[{"role":"user","content":"Summarize this log in one line."}],"max_tokens":200}'
# add "stream": true for the answer token by token

No GPU? When flash gpu info says none, or the GPU can't run the model, create the pool with --gpu-layers 0: the same pool runs on the CPU and the VMs use it exactly the same way.

Measured from inside a VM, one request at a time, Qwen2.5 1.5B (Q4_K_M): about 258 tokens/s on an Apple M4 Max and about 67 tokens/s on a mini PC's integrated AMD Radeon 780M. --slots sets how many requests run at once; more wait in line, and requests from VMs that are gone are dropped. A VM holding a grant is not snapshotted or slept. Warm pools take --gpu-pool too. MCP tool flash_gpu; socket API in flashgpud-openapi.yaml beside the binary.

Inspect a running VM
flash metrics vm1     # one JSON object: cpu, memory, disk I/O, per-NIC bytes
flash inspect vm1     # the fuller view: caps, limits, cmdline, share, source

metrics returns a live sample. inspect adds the VM's configured limits and devices; a cap that was not passed reads 0 (uncapped), and flash ls shows such a VM as uncapped. Use workload activity as the final readiness signal.

Update FlashVMM
sudo flash self-update              # by hand, any time (Windows: elevated prompt, no sudo)
sudo flash self-update --dry-run    # see what's available first
sudo flash self-update --install-timer --interval 15min   # turn on auto-update — no reinstall needed

On Linux, automatic updates stay off until enabled; an update replaces the binaries in place and installs a new bundle in its own directory, and running VMs keep the files they already opened. On macOS and Windows (0.1.40 and later), flash self-update verifies the same signed release and installs the notarized .pkg or the .msi; on Windows it waits until no VMs are running. Re-running the install also works — a new MSI upgrades the old one in place.

Troubleshooting the install
SymptomCause and response
Installer exits 0, but the installation is incompleteThe Linux installer can return 0 even when its initial update check fails. Confirm with flash --version and --show-trust.
cannot fetch …This can indicate a local write failure rather than a network problem. Check available storage with df -h /.
manifest signature does not verify against this binary's trust anchorThe installed binary trusts a different key from the one used to sign the release. Run the install command again to establish the current trust anchor.
the following required arguments were not provided: --vcpus --mem-mibThe VM's shape is required. Pass both; caps stay optional.
capture refused: no CPU template was requestedThe VM was started without --cpu-template, which cannot be added later. Restart with at least --cpu-template host-raw before taking a snapshot.
Windows: the VM fails to start right after installThe Windows Hypervisor Platform feature is off, or virtualization is disabled in firmware. Enable it with the dism command above and reboot.
Uninstall

Linux:

sudo systemctl disable --now flashvm-self-update.timer flashpoold.service
sudo rm -rf /opt/flashvmm /var/lib/flashvmm /usr/local/bin/flash \
          /etc/systemd/system/flashvm-self-update.{timer,service} /etc/systemd/system/flashpoold.service
sudo systemctl daemon-reload

macOS: remove the installed files and the package receipt.

sudo rm -rf /opt/flashvmm /usr/local/bin/flash
sudo pkgutil --forget com.elysianedge.flashvmm

Windows: Settings → Apps → Installed apps → FlashVMM → Uninstall, or from an elevated prompt:

Get-CimInstance Win32_Product -Filter "Name='FlashVMM'" | Invoke-CimMethod -MethodName Uninstall

Command reference

flash CLI parameters

Every command and parameter below is available from the flash binary installed with FlashVMM. Required values, defaults, and creation-time constraints are called out where they affect how a command is used.

Complete command surface

Arguments shown without -- are positional. Run flash --help or flash <command> --help for the manual built into your installed version.

Show every command and parameter
CommandParametersWhat it does
Global options
flash --dir PATH
-h, --help
-V, --version
Selects the VM registry. Linux: /run/flashvm for root, $XDG_RUNTIME_DIR/flashvm for other users. macOS: $FLASHVM_API_DIR, else the per-user registry. Windows: named pipes \\.\pipe\flashvm-<id>. Help and version output are available globally.
Create, restore, and scale
run --bundle PATH (required)
--vcpus N (required)
--mem-mib N (required)
--id NAME
--mem-region-mib N
--cpu-millis N (optional cap)
--disk-mib N (optional cap)
--disk-bps N (optional cap)
--disk-iops N (optional cap)
--boot-grace-ms N
--kernel-cmdline STRING
--nic tap=NAME[,mbps=N][,pps=N][,ingress-mbps=N][,ip=CIDR,gateway=ADDR] (repeatable; rates optional)
--share host_dir=DIR,tag=TAG,at=PATH
--entry PATH
--entry-arg N
--engine NAME (macOS: hvf default, or vz — Rosetta + virtio-fs, NIC caps only)
--cpu-template NAME
--vmm PATH
--detach
--pool
--disable-dirty-tracking (default off — diagnostic/tuning escape hatch, see note below)
--http-port PORT (guest HTTP channel, for guest http)
--messaging-topics a,b|* (guest messaging, for guest send/recv)
--egress all|none|public|deny:...|allow:... or --egress-file FILE (what the VM may reach; see connections)
Boots a FlashVM from a kernel and root filesystem bundle. A cap you pass is enforced; a cap you omit is not applied — nothing is defaulted; --detach returns after acceptance, while --pool prepares a warm spare for a later claim. --disable-dirty-tracking skips dirty-page write-protection on this VM's memory — cheaper for write-heavy workloads (measured up to ~2x fewer page faults), but this VM can never be the source of a diff snapshot afterward. Only set it with a measured reason, never as a general speed guess; leave it off for anything live migration or snapshot/restore depends on. --http-port and --messaging-topics turn on the guest bridge at creation (* = every topic); without them guest http answers 503 and messages are not delivered.
restore --from PATH or --from-url URL
--total BYTES (required with --from-url)
--bundle PATH (required)
--vcpus N (required; must match the capture)
--mem-mib N (required; must match the capture)
--id NAME
--cpu-millis N (optional cap)
--disk-mib N (optional cap)
--disk-bps N (optional cap)
--disk-iops N (optional cap)
--nic SPEC (repeatable)
--share SPEC
--cpu-template NAME
--vmm PATH
--allow-bundle-mismatch
--detach
--disable-dirty-tracking (default off)
--diff-base PATH-or-URL (optional — see note below)
Rebuilds the captured VM from a local snapshot or a signed remote snapshot. The bundle and device configuration are supplied at restore time; CPU and memory topology must match the capture. --disable-dirty-tracking here is a stronger commitment than on run: it makes the restored VM permanently unable to serve a future diff snapshot, not just this session's. --diff-base binds this VM to a base snapshot so its NEXT flash snapshot captures only dirtied pages instead of a full image — measured on a real workload, a diff was 2% the size of a full capture and restored to fully correct state. Typically the same path/URL given to --from/--from-url.
clone Same parameters as restore Creates a new FlashVM from a snapshot without changing the source VM. Give each clone its own ID and network identity.
fork parent
--count N (1–64, default 1)
--id NAME (only with --count 1)
--nic pool=ID|tap=NAME,... (repeatable; one per child)
--messaging-topics a,b|*
Branches a RUNNING VM into N children that continue from its state this instant; the parent keeps running. A parent started with run --forkable forks with its RAM frozen in place, and later forks are diffs. Messaging grants are not inherited.
claim id
--entry PATH
--entry-arg N (default 0)
--from PATH
--bundle PATH (required with --from)
--identity STRING (required with --from)
--tenant STRING (required with --from)
--disk-mib N (optional cap)
--cpu-millis N (optional cap)
--claim-id N
Assigns a workload and its resource reservation to a warm spare created with flash run --pool, then wakes it for immediate use. --from hands the spare a snapshot to become instead of a program to run — restore-via-claim, arm64 hosts only — so the spare's own pre-claim state is discarded, not carried over; mutually exclusive with --entry/--entry-arg.
Operate and observe
ls None Lists the FlashVMs registered on the machine and reports the current state of each endpoint.
logs id
--stream run|console
--since N
--since-console N
--limit N
Reads a VM's workload log, guest console, or merged output. Cursor parameters support incremental collection without replaying earlier lines.
inspect id
--nic INDEX
Shows a VM's state, boot data, resource configuration, devices, share, and source. --nic adds detailed counters for one interface.
metrics id
--window SECONDS
Returns the VM's CPU, memory, disk, and network measurements in one call. --window sets the freshness limit for guest-reported fields.
connections id
--nic N (default 0)
--since SEQ
--follow
--for S
--json
The VM's outbound connections and DNS questions, allowed or refused, with the reason and bytes sent — what --egress decided.
watch id
--stream lifecycle|logs|metrics|guest (default lifecycle)
--for SECONDS
Streams lifecycle events, logs, metrics, or guest messages until interrupted or until the requested duration elapses.
pause id
--max-ms N
Freezes a guest for a bounded interval. The VM resumes automatically when the interval expires.
resume id Returns a paused guest to the running state.
stop id Stops the VM and closes its per-VM control socket.
set id
--cpu-millis N
--boot-grace-ms N
--mem-mib N
--disk-mib N
--disk-bps N
--disk-iops N
--nic INDEX
--mbps N
--pps N
--ingress-mbps N
Updates live CPU, disk, or per-NIC limits; only the flags you pass change. NIC rate parameters require --nic; a rate of 0 removes that cap. Guest RAM is fixed at creation, so use balloon to reclaim pages, or mem to resize a reserved region live, while a VM is running.
balloon id
--target-pages N
Asks the guest to return memory pages to the host. Without a target, it reads the latest balloon request and result.
mem id
--target-mib N
Sets the live target for a virtio-mem region created with --mem-region-mib. Without a target, it reads the region's size, block granularity, requested size, and what's actually plugged in.
snapshot id
--path PATH (required)
Captures a VM's execution state to a snapshot file and waits for the operation to complete.
snapshots ls id Lists the snapshots created by a VM.
snapshots show id
snapshot
Shows one snapshot's identity, size, and base information.
snapshots rm id
snapshot
Deletes the selected snapshot.
Devices and workload access
nic add id
--tap NAME
Requests a NIC topology change. NICs are attached when a VM is created; use run, restore, or clone --nic to define them, and set --nic to change live rate limits.
nic rm id
index
Requests removal of a NIC by index. The VM's NIC topology remains fixed for its lifetime.
share show id Shows the VM's virtio-9p host-directory share.
share add id
--host-dir PATH
--tag NAME
--guest-path PATH
Requests a host-directory share. The share is a creation-time device; configure it with run, restore, or clone --share.
share rm id Requests removal of the virtio-9p share. Share topology remains fixed for the VM's lifetime.
source show id Shows the bundle, local snapshot, or remote snapshot source used to create the VM.
source resign id
--url URL (required)
--total BYTES (required)
Replaces an expiring remote snapshot URL after confirming that the new URL identifies the same snapshot bytes.
guest http id
path
--method METHOD (default GET)
--body STRING
--body-file PATH
--out PATH
Sends an HTTP-style method, path, and body to the workload over the guest control channel. --body-file and --out carry binary bodies byte for byte (base64 on the wire when not UTF-8).
guest send id
topic
payload or --payload-file PATH
--from N (default 0)
Publishes a topic and payload to the workload with an optional sender identity. --payload-file sends binary payloads byte for byte.
guest recv id
--for SECONDS
Streams messages published by the guest until interrupted or until the requested duration elapses.
exec id
-- CMD ARGS... (required)
--timeout S (default 300)
--cwd DIR
--env K=V (repeatable)
--stdin FILE|-
--json
Runs a command inside the VM. stdout and stderr stream back and flash exits with the command's code (124 timed out, 137 killed); --json prints one object instead. Ctrl-C kills the exec.
execs id
exec (optional)
--kill
--rm
Lists a VM's execs, or shows one. --kill kills its process tree and keeps the record; --rm removes the record (killing first if needed).
cp src dst (one is ID:/path) Copies a file or a directory tree into or out of the VM, keeping permissions. Up to 1 GiB per file.
del ID:/path
-r, --recursive
Deletes a file, link or empty directory in the VM; -r deletes a tree. / and any path resolving to it is refused.
bundle inspect path Reads what a bundle directory declares about itself (kernel, rootfs, capabilities) before flash run touches it.
Warm pools (flashpoold)
pool create / ls / show / set / add / rm --vcpus N, --mem-mib N (required on create)
optional caps: --cpu-millis, --disk-mib, --disk-bps, --disk-iops, NIC rates
--count N, --wait-idle SECONDS
set --drain / --undrain / --resume-refill
Creates and manages warm pools of parked spares served by flashpoold over one socket (Linux, macOS) or pipe (Windows). Members are ordinary flash run --pool VMs; claim one with flash claim.
Lifecycle and maintenance
version id Reports the selected VM's VMM version and supported artifact formats. Use flash --version for the CLI version.
rm id Stops and removes a VM; the control socket disappearing confirms that the process is gone.
reap None Removes stale registry sockets whose VM process is no longer reachable while leaving inaccessible endpoints untouched.
self-update --dry-run
--status
--show-trust
--install-timer
--interval SPAN (default 15min)
--force
Checks or installs the signed FlashVMM release, displays the compiled-in trust anchor, or enables scheduled updates. Artifacts are signature- and checksum-verified before replacement, and running VMs continue uninterrupted.
gpu info / pool / grant / version --socket PATH (default $FLASHGPUD_SOCKET, else beside the registry) GPU pools through flashgpud: the host's GPU backend, models loaded on the host GPU and shared by VMs over their NIC (flash run --gpu-pool), and per-VM grants.
demo run [N] | rehearse | preflight | reset FlashVMM one feature at a time, in 23 scenarios: each explained in plain words, its exact command shown, run when you press Enter. VMs, networking and network walls, shared folders, live changes, pools, snapshots, clones, forks, hidden API keys, the GPU pool and MCP. run N starts at scenario N, rehearse runs it unattended, reset cleans up.