QCOW2 virtual machine management using libvirt. Creates VMs from pre-built images downloaded from R2 CDN with cloud-init customization. Supports SSH, VNC, and virtiofs home directory sharing. Use when users need to create, manage, or connect to bazzite-ai VMs.
/plugin marketplace add atrawog/bazzite-ai-plugins/plugin install atrawog-bazzite-ai-bazzite-ai@atrawog/bazzite-ai-pluginsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
The vm command manages bazzite-ai virtual machines using libvirt. VMs are created from pre-built QCOW2 images downloaded from R2 CDN, customized via cloud-init.
Key Concept: VMs run in user session (qemu:///session), not requiring root. Home directory is shared via virtiofs at /workspace in the VM.
| Action | Command | Description |
|---|---|---|
| Add VM | ujust vm add [NAME] [PARAMS...] | Download + create VM |
| Update VM | ujust vm update [NAME] [WHAT=...] | Update VM config |
| Delete VM | ujust vm delete [NAME] | Remove VM |
| Download | ujust vm download [BRANCH] | Download QCOW2 image |
| Seed | ujust vm seed [NAME] [PARAMS...] | Create cloud-init ISO |
| Create | ujust vm create [NAME] [PARAMS...] | Create VM from image |
| Start | ujust vm start [NAME] | Start VM |
| Stop | ujust vm stop [NAME] | Stop VM |
| SSH | ujust vm ssh [NAME] | SSH to VM |
| VNC | ujust vm vnc [NAME] | Open VNC viewer |
| Status | ujust vm status [NAME] | Show VM status |
| Help | ujust vm help | Show help |
ujust vm ACTION VM_NAME PARAM1=value PARAM2=value...
| Parameter | Default | Description |
|---|---|---|
URL | R2 CDN URL | QCOW2 image URL |
CPUS | 4 | Number of CPUs |
RAM | 8192 | Memory in MB |
DISK_SIZE | 100G | Disk size |
USERNAME | $USER | VM username |
PASSWORD | (empty) | VM password |
AUTOLOGIN | true | Enable autologin |
SSH_PORT | 4444 | SSH port forwarding |
VNC_PORT | 5900 | VNC port |
SHARE_DIR | $HOME | Directory to share |
BRANCH | stable | Image branch (stable/testing) |
# Default: bazzite-ai VM with auto-detect settings
ujust vm add
# Named VM with custom config
ujust vm add myvm CPUS=8 RAM=16384 DISK_SIZE=200G
# Testing branch image
ujust vm add testing-vm BRANCH=testing
# Different SSH port
ujust vm add dev-vm SSH_PORT=4445
# No home sharing
ujust vm add isolated SHARE_DIR=''
The add command:
# Stable image
ujust vm download
# Testing branch
ujust vm download testing
# Custom URL
ujust vm download URL=[https://example.com/custom.qcow2]([https://example.com/custom.qcow2](https://example.com/custom.qcow2))
ujust vm seed myvm USERNAME=developer PASSWORD=secret
ujust vm create myvm CPUS=4 RAM=8192
ujust vm start # Default VM
ujust vm start myvm # Named VM
Auto-adds VM if it doesn't exist.
ujust vm stop # Graceful shutdown
ujust vm stop myvm FORCE=yes # Force stop
ujust vm delete myvm # Remove VM and disk
# Connect to VM
ujust vm ssh
# Named VM
ujust vm ssh myvm
# Different user
ujust vm ssh myvm SSH_USER=root
# Run command
ujust vm ssh myvm -- ls -la
Default SSH: ssh -p 4444 localhost
ujust vm vnc # Opens VNC viewer
ujust vm vnc myvm
Default VNC: Port 5900
By default, your home directory is shared to the VM at /workspace via virtiofs.
# Default: $HOME -> /workspace
ujust vm add
# Disable sharing
ujust vm add isolated SHARE_DIR=''
# Share specific directory
ujust vm add project SHARE_DIR=/path/to/project
Inside VM:
ls /workspace # Your home directory
| Branch | Tag | Description |
|---|---|---|
stable | :stable | Production, tested |
testing | :testing | Latest features |
ujust vm download stable
ujust vm download testing
| Item | Location |
|---|---|
| Download cache | ~/.local/share/bazzite-ai/vm/cache/ |
| VM disks | ~/.local/share/libvirt/images/ |
| VM config | ~/.local/share/bazzite-ai/vm/<name>.conf |
| Seed ISO | ~/.local/share/bazzite-ai/vm/<name>-seed.iso |
# Add and start default VM
ujust vm add
ujust vm start
ujust vm ssh
# Create dev VM with more resources
ujust vm add dev CPUS=8 RAM=16384 DISK_SIZE=200G
# Start it
ujust vm start dev
# SSH in
ujust vm ssh dev
# Your home is at /workspace
# Test latest features
ujust vm add testing-vm BRANCH=testing
ujust vm start testing-vm
ujust vm ssh testing-vm
# Create VMs on different ports
ujust vm add dev1 SSH_PORT=4444
ujust vm add dev2 SSH_PORT=4445
ujust vm add dev3 SSH_PORT=4446
# Start all (not a built-in command, use loop)
for vm in dev1 dev2 dev3; do ujust vm start $vm; done
Check:
ujust vm status myvm
virsh --connect qemu:///session list --all
Common causes:
Disk image not found
Port conflict
Virtiofs path issue
Fix:
ujust vm delete myvm
ujust vm add myvm
Check:
ssh -p 4444 localhost
Common causes:
VM not fully booted
Wrong SSH port
SSH not started in VM
Fix:
# Wait longer after start
sleep 30
ujust vm ssh myvm
# Check VM console via VNC
ujust vm vnc myvm
Symptom: /workspace empty or not mounted
Cause: SHARE_DIR path issue (symlinks)
Fix:
# Delete and recreate with canonical path
ujust vm delete myvm
ujust vm add myvm SHARE_DIR=$(readlink -f $HOME)
Check:
qemu-img info ~/.local/share/libvirt/images/myvm.qcow2
Fix:
# Create new VM with larger disk
ujust vm delete myvm
ujust vm add myvm DISK_SIZE=200G
Related Skills: bootc (alternative: bootc-based VMs)
Prerequisites: ujust configure libvirtd enable
bcvk alternative: ujust install bcvk + ujust bootc
Use when the user asks about:
"create VM", "add VM", "start VM"
"ssh to VM", "connect to VM"
"download qcow2", "VM image"
"VM not starting", "VM connection failed"
"share directory with VM", "virtiofs"