This guide covers migrating cloud-native Linux distributions (Photon OS, CoreOS, Flatcar, etc.) from VMware to KVM.
Cloud-native distributions are purpose-built for virtualization and include:
Result: These distributions migrate easily with minimal configuration!
| Distribution | Virtio Support | Initramfs Tool | Special Notes |
|---|---|---|---|
| VMware Photon OS | ✅ Built-in | dracut | systemd-networkd default |
| Fedora CoreOS | ✅ Built-in | dracut | Immutable OS |
| Flatcar Container Linux | ✅ Built-in | dracut | CoreOS successor |
| RancherOS | ✅ Built-in | N/A | Docker-based |
| K3OS | ✅ Built-in | N/A | K3s-optimized |
| Talos Linux | ✅ Built-in | N/A | Kubernetes-native |
cmd: local
vmdk: /path/to/photon.vmdk
output_dir: /output
to_output: photon-converted.qcow2
out_format: qcow2
# Standard fixes
flatten: true
fstab_mode: stabilize-all
regen_initramfs: true
no_grub: false
checksum: true
# Optional: Test boot
libvirt_test: true
vm_name: photon-test
keep_domain: true
sudo h2kvmctl --config photon-migration.yaml
⚠️ initramfs rebuild failed: mtime+size unchanged
This is expected and correct! It means:
# Use virtio for best performance (recommended)
sudo virsh define test-confs/photon-virtio.xml
sudo virsh start photon-converted
# Verify boot
sudo virsh domifaddr photon-converted # Get IP
nc -zv <IP> 22 # Test SSH
⚠️ initramfs rebuild failed: mtime+size unchanged (mtime=1769251671, size=22324924)
Explanation:
Action Required: None! This is the expected behavior.
Cloud-native distributions are designed for:
All major cloud providers use virtio, so these distros ship with virtio support by default.
After conversion, verify successful migration:
# 1. Check VM is running
sudo virsh list --all
# Expected: "running" state
# 2. Get IP address
sudo virsh domifaddr photon-converted
# Expected: IP address assigned via DHCP
# 3. Test SSH connectivity
nc -zv <IP> 22
# Expected: Connection successful
# Inside the VM, check loaded drivers
lsmod | grep virtio
# Expected output:
# virtio_net
# virtio_blk
# virtio_pci
# virtio_ring
# Check disk is using virtio
sudo virsh dumpxml photon-converted | grep "target dev"
# Expected:
# <target dev='vda' bus='virtio'/>
<!-- Recommended for cloud-native distros -->
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/path/to/photon.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
Only use if virtio fails (very rare with modern versions):
<!-- Fallback configuration -->
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/path/to/photon.qcow2'/>
<target dev='sda' bus='sata'/>
</disk>
Cloud-native distros typically use:
Most will auto-configure with DHCP - no manual network fixes needed!
Check DHCP on libvirt network:
sudo virsh net-list --all
sudo virsh net-start default
sudo virsh net-info default
Inside VM, check network service:
# Photon OS
systemctl status systemd-networkd
# CoreOS/Flatcar
systemctl status NetworkManager
Verify SSH is running:
# Get VM IP
IP=$(sudo virsh domifaddr photon-converted | awk '/ipv4/{print $4}' | cut -d/ -f1)
# Test SSH port
nc -zv $IP 22
# Check from VM console
sudo virsh console photon-converted
# Login and check: systemctl status sshd
If virtio boot fails (unlikely with cloud-native distros):
sudo virsh define test-confs/photon-sata.xml
sudo virsh start photon-converted
sudo virt-ls -a photon.qcow2 /boot/
sudo virt-cat -a photon.qcow2 /boot/initramfs-*
sudo virt-customize -a photon.qcow2 \
--run-command 'dracut -f --add-drivers "virtio_blk virtio_scsi virtio_net"'
Cloud-native distros are typically small, but compression helps:
compress: true
compress_level: 6 # Balance speed/size
<cpu mode='host-passthrough'/>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
<driver name='vhost' queues='4'/> <!-- Multi-queue -->
</interface>
# batch-photon-migration.yaml
batch_manifest: photon-vms.json
batch_parallel: 4
batch_continue_on_error: true
// photon-vms.json
[
{"vmdk": "/vms/photon-web-01.vmdk", "name": "web-01"},
{"vmdk": "/vms/photon-web-02.vmdk", "name": "web-02"},
{"vmdk": "/vms/photon-app-01.vmdk", "name": "app-01"}
]
sudo h2kvmctl --config photon.yaml --deploy-k8s \
--k8s-namespace production \
--k8s-vm-name photon-app \
--k8s-auto-start
# Create template from first conversion
# Then clone for additional VMs
virt-clone -o photon-template -n photon-prod-01 --auto-clone
test-confs/04-local-photon-os-vmdk.yamltest-confs/photon-virtio.xmltest-confs/photon-sata.xmltest-confs/README-photon.mddocs/os-support/photon-os.mddocs/guides/troubleshooting.mddocs/getting-started/02-Quick-Start.mdFor cloud-native distribution migrations:
docs/os-support/verbose: 2report: /path/to/report.mdLast Updated: 2026-02-08 Tested Distributions: Photon OS 3.0, 4.0, 5.0 | CoreOS | Flatcar Status: Production Ready ✅