# Kcli Vm Operations

> Guides VM lifecycle operations with kcli. Use when creating, managing, or troubleshooting virtual machines across providers.

- Skill: `karmab/kcli-vm-operations` (Agent Skill)
- Install (CLI): `npx skillmds@latest add karmab/kcli-vm-operations`
- Raw SKILL.md: https://api.skillmd.com/api/skills/karmab/kcli-vm-operations/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: karmab (https://skillmd.com/u/karmab)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/karmab/kcli-vm-operations

---


> **Important**: Before creating a VM, always run `kcli create vm -h` to check the latest available flags and examples.

# kcli VM Operations

## VM Lifecycle Commands

### Create VM
```bash
# From image
kcli create vm -i fedora40 myvm

# With parameters
kcli create vm -i centos9stream -P memory=4096 -P numcpus=4 -P disks=[20,50] myvm

# From profile
kcli create vm -p myprofile myvm

# Create multiple VMs at once with -c (count)
kcli create vm -c 3 myvm

# Create 3 VMs to emulate baremetal
kcli create vm -P start=false -P memory=20480 -P numcpus=16 -P disks=[200] -P uefi=true -P nets=[default] -c 3 myvm

# Create a VM with a static IP
kcli create vm -i centos9stream -P nets=['{"name":"default","ip":"192.168.122.250","netmask":"24","gateway":"192.168.122.1"}'] myvm

# Create a VM with a DNS reservation
kcli create vm -i centos9stream -P nets=['{"name":"default","reservedns":"true"}'] myvm

# Create a VM with a DHCP reservation
kcli create vm -i centos9stream -P nets=['{"name":"default","ip":"192.168.122.250","reserveip":"true"}'] myvm
```

### List VMs
```bash
kcli list vm                    # All VMs
kcli list vm -o yaml            # YAML output
kcli list vm -o json            # JSON output
```

### VM Info
```bash
kcli info vm myvm               # Full info
kcli info vm myvm -f ip         # Specific field
kcli info vm myvm -o yaml       # YAML format
```

### Start/Stop/Restart
```bash
kcli start vm myvm
kcli stop vm myvm
kcli restart vm myvm
```

### Delete VM
```bash
kcli delete vm myvm             # With confirmation
kcli delete vm myvm --yes       # Skip confirmation
kcli delete vm myvm --snapshots # Delete snapshots too
```

## SSH Access

```bash
kcli ssh myvm                   # SSH as default user
kcli ssh -u root myvm           # SSH as specific user
kcli ssh -l myvm                # List SSH command only
```

## Console Access

```bash
kcli console myvm               # Graphical console (VNC/SPICE)
kcli console myvm --serial      # Serial console
```

## Disk Operations

```bash
# Add disk
kcli create disk -s 20 -p default myvm  # 20GB disk
kcli create disk -s 50 --thin myvm      # Thin provisioned

# Delete disk
kcli delete disk myvm-disk1 myvm

# List disks
kcli list disk
```

## NIC Operations

```bash
# Add NIC
kcli create nic -n mynetwork myvm

# Delete NIC
kcli delete nic eth1 myvm

# Update NIC
kcli update nic -n newnetwork myvm --index 0
```

## Snapshots

```bash
# Create snapshot
kcli create snapshot myvm mysnapshot

# List snapshots
kcli list snapshot myvm

# Revert to snapshot
kcli revert snapshot myvm mysnapshot

# Delete snapshot
kcli delete snapshot myvm mysnapshot
```

## VM Configuration

### Configuration Hierarchy
Parameters are resolved in order (later overrides earlier):
1. `kvirt/defaults.py` - Built-in defaults
2. `~/.kcli/config.yml` default section
3. Provider-specific section in config.yml
4. Profile definition (`~/.kcli/profiles.yml`)
5. Plan file parameters
6. Command-line `-P` overrides

### Common Parameters
```yaml
# Compute
numcpus: 2                      # CPU count
memory: 512                     # Memory in MB
cpumodel: host-model            # CPU model

# Storage
pool: default                   # Storage pool
disks:                          # Disk configuration
  - size: 20                    # Size in GB
  - size: 50
    pool: otherpool
    thin: true

# Network
nets:                           # Network configuration
  - default                     # Simple: network name only
  - name: mynet                 # Advanced: with options
    ip: 192.168.1.10
    netmask: 255.255.255.0
    gateway: 192.168.1.1
    mac: aa:bb:cc:dd:ee:ff

# OS Customization
image: fedora40                 # Base image
cloudinit: true                 # Enable cloud-init
keys:                           # SSH public keys
  - ssh-rsa AAAA... user@host
cmds:                           # Post-boot commands
  - dnf -y update
  - systemctl enable nginx
files:                          # Files to inject
  - path: /etc/myconfig
    content: |
      key=value
```

## Images

```bash
# List available images
kcli list image

# Download image
kcli download image fedora40
kcli download image centos9stream -p mypool

# Delete image
kcli delete image fedora40

# List all available images (from kcli catalog)
kcli list available-images
```

## Profiles

Profiles in `~/.kcli/profiles.yml`:
```yaml
small:
  numcpus: 1
  memory: 1024
  disks:
    - size: 10

medium:
  numcpus: 2
  memory: 2048
  disks:
    - size: 20

webserver:
  image: centos9stream
  numcpus: 2
  memory: 4096
  nets:
    - default
  cmds:
    - dnf -y install nginx
    - systemctl enable --now nginx
```

Usage:
```bash
kcli create vm -p webserver myweb
```

## Update Operations

```bash
# Update memory
kcli update vm myvm -P memory=8192

# Update CPUs
kcli update vm myvm -P numcpus=4

# Update metadata
kcli update vm myvm -P information="Production server"
```

## Clone VM

```bash
kcli clone vm myvm myclone
kcli clone vm myvm myclone --full  # Full clone (not linked)
```

## Export VM

```bash
kcli export vm myvm                 # Export to image
kcli export vm myvm --image myimage # Custom image name
```

## Troubleshooting

### VM Won't Start
```bash
kcli -d start vm myvm              # Debug output
sudo virsh list --all               # Check libvirt state
sudo virsh start myvm               # Try direct start
```

### No IP Address
```bash
# Check DHCP is enabled on network
kcli info network default

# Check cloud-init completed
kcli ssh myvm
cat /var/log/cloud-init.log
```

### SSH Connection Issues
```bash
# Get SSH command details
kcli ssh -l myvm

# Check VM has IP
kcli info vm myvm -f ip

# Try direct SSH
ssh -i ~/.kcli/id_rsa user@<ip>
```

