Skip to content

brianmcarey/podvirt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

podvirt

podvirt wraps KubeVirt's virt-launcher container image with Podman, giving you a simple CLI to create, start, stop, and manage VMs using the same underlying technology as KubeVirt. This is useful on Atomic distros like Fedora Silverblue where you might not have the required packages layered to quickly spin up virtual machines.

For more on the back story behind the project, see the blog post podvirt.

Features

  • Create and run VMs from a simple YAML config or CLI flags
  • Uses KubeVirt's virt-launcher
  • Rootless operation via Podman (user only needs /dev/kvm access)
  • Full VM lifecycle: create, start, stop, list, status, delete, console, ssh, clean-cache
  • SSH access via cloud-init key injection and auto-detected port forwarding
  • Serial console access (attach to virsh console via podman exec)- Table, JSON, and YAML output formats

System Requirements

Component Requirement
Podman v5.0+
KVM /dev/kvm must exist; user must be in kvm group

Installation

Build from source

git clone https://github.com/brianmcarey/podvirt
cd podvirt
make build
sudo install -m 755 bin/podvirt /usr/local/bin/podvirt

Install from a release

Tagged releases are intended to include:

  • Linux x86_64 and aarch64 tarballs
  • raw Linux binaries
  • RPM packages

If you are installing manually from a release tarball:

tar -xzf podvirt_<version>_linux_x86_64.tar.gz
sudo install -m 755 podvirt /usr/local/bin/podvirt

Quick Start

1. Enable the Podman socket

systemctl --user enable --now podman.socket

2. Ensure KVM access

sudo usermod -aG kvm $USER
# Log out and back in for group membership to take effect

3. Create a VM with SSH access

podvirt create --name myvm --cpus 2 --memory 2Gi \
  --image quay.io/containerdisks/fedora:43 \
  --ssh-key ~/.ssh/ssh-key.pub \
  --user fedora \
  --port 2222:22
podvirt start myvm
podvirt ssh myvm

4. Create a VM from a config file

podvirt create --config examples/fedora-vm.yaml
podvirt start fedora-vm

5. Connect to the console

podvirt console fedora-vm              # serial by default
podvirt console fedora-vm --type vnc
podvirt console fedora-vm --type serial

6. Stop and delete

podvirt stop fedora-vm
podvirt delete fedora-vm

Commands

Command Description
podvirt create Create a VM (not started)
podvirt start <name> Start a VM
podvirt stop <name> Stop a VM
podvirt list List all VMs
podvirt status <name> Show detailed VM status
podvirt delete <name> Delete a VM
podvirt console <name> Connect to VM console
podvirt ssh <name> SSH into a running VM
podvirt clean-cache Remove cached podvirt data

Run podvirt <command> --help for full flag documentation.

Configuration

VMs are described in a simple YAML format:

apiVersion: podvirt.io/v1alpha1
kind: VirtualMachine
metadata:
  name: my-vm
spec:
  cpu:
    cores: 2
  memory: 2Gi
  disks:
    - name: rootdisk
      source:
        image: /var/lib/podvirt/images/fedora-43.qcow2
      bus: virtio
  networks:
    - name: default
      type: masquerade
      portForwards:
        - hostPort: 2222
          vmPort: 22
  cloudInit:
    user: fedora
    sshKeys:
      - ssh-ed25519 AAAA... user@host
  console:
    type: vnc
    port: 5900

See docs/configuration.md for the full schema reference and CLI flag documentation.

Example configs are in examples/.

How It Works

podvirt CLI
    │
    ├─► Podman API  ──► virt-launcher container
    │                       │
    │                       ├── libvirt (internal, no host daemon)
    │                       └── QEMU/KVM virtual machine
    │
    └─► podman exec virsh  ──► query domain state

Each VM runs as a Podman container using the quay.io/kubevirt/virt-launcher image. The virt-launcher process manages libvirt and QEMU internally, so no host-level daemons are needed.

The VM specification is passed via the STANDALONE_VMI environment variable as a JSON-encoded KubeVirt VirtualMachineInstance object.

Disk Images

Two disk source types are supported:

Local file (qcow2 or raw):

source:
  image: /path/to/disk.qcow2

Container disk (OCI image from a registry):

source:
  containerImage: quay.io/containerdisks/fedora:43

Container disks are pulled automatically. See quay.io/containerdisks for available images.

For cache behavior, extraction details, and cleanup guidance, see docs/storage.md.

virt-launcher Image

The default virt-launcher image is:

quay.io/kubevirt/virt-launcher:v1.8.3

Override it per-VM with the --launcher-image flag:

podvirt create --config vm.yaml --launcher-image quay.io/kubevirt/virt-launcher:v1.7.0

Debugging

Set PODVIRT_DEBUG=1 to preserve extra runtime diagnostics:

PODVIRT_DEBUG=1 podvirt create --name debugvm --image quay.io/containerdisks/fedora:43

When debug mode is enabled, additional logs may be written under ~/.cache/podvirt/libvirt-logs/.

License

Apache 2.0 — see LICENSE.

About

Run VMs with podman using KubeVirt's virt-launcher container image

Resources

License

Stars

6 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors