00 KVM mimarisi
KVM (Kernel-based Virtual Machine), Linux kernel'ını tam teşekküllü bir hypervisor'a dönüştüren bir çekirdek modülüdür. Intel VT-x ve AMD-V donanım sanallaştırma uzantılarını kullanır.
Type-1 vs Type-2 hypervisor
| Tür | Tanım | Örnek | Performans |
|---|---|---|---|
| Type-1 (bare-metal) | Doğrudan donanım üzerinde çalışır; OS yoktur | VMware ESXi, Xen (dom0), Hyper-V | Yüksek — doğrudan donanım erişimi |
| Type-2 (hosted) | Var olan OS üzerinde çalışır | VirtualBox, VMware Workstation | Düşük — host OS overhead'ı |
| KVM (hybrid) | Linux kernel modülü; host OS = hypervisor | KVM + QEMU | Type-1'e yakın — HW sanallaştırma |
KVM, Linux kernel'ını Type-1 hypervisor'a dönüştürür. kvm.ko modülü yüklendikten sonra Linux hem normal OS görevi görür hem de VM'leri çalıştırır. Her VM, kernel tarafından özel izinlerle yönetilen bir process olarak görünür.
/dev/kvm arayüzü
# Intel VT-x / AMD-V desteğini kontrol et
egrep -c '(vmx|svm)' /proc/cpuinfo
# 0: sanallaştırma yok, >0: destekli
# kvm-ok aracı (cpu-checker paketi)
sudo apt install cpu-checker
kvm-ok
# INFO: /dev/kvm exists
# KVM acceleration can be used
# KVM modülünü yükle
sudo modprobe kvm
sudo modprobe kvm_intel # Intel için
sudo modprobe kvm_amd # AMD için
# /dev/kvm yetki kontrolü
ls -la /dev/kvm
# crw-rw---- 1 root kvm 10, 232 ...
sudo usermod -aG kvm $USER # kullanıcıyı kvm grubuna ekle
KVM mimarisi — VM çalıştırma akışı
QEMU (userspace) → /dev/kvm ioctl → kvm.ko → VT-x VMLAUNCH → Guest code → VM-exit → kvm.ko handler → QEMU emulation → tekrar
ARM v8 EL2 (KVM/ARM)
ARM mimarisinde sanallaştırma EL2 (Exception Level 2) ile sağlanır. KVM/ARM, Cortex-A ve server sınıfı ARM64 işlemcilerinde çalışır. QEMU ile -M virt -cpu cortex-a57 kombinasyonu ARM64 guest'leri çalıştırır.
Bu bölümde
- KVM: Linux modülü olarak Type-1 hypervisor — host OS = hypervisor
- /dev/kvm: QEMU → kernel arasındaki ioctl arayüzü
- Intel VT-x: vmx; AMD-V: svm — /proc/cpuinfo ile kontrol
- ARM EL2: ARM64 sunucularda KVM; QEMU -M virt ile kullanım
01 QEMU + KVM
QEMU, cihaz emülasyonu ve VM yaşam döngüsü yönetimi yapan userspace programdır. KVM ile birlikte CPU işlemleri donanım hızında çalışır; yalnızca I/O emüle edilir.
Temel QEMU + KVM kullanımı
# QEMU kurulumu
sudo apt install qemu-kvm qemu-utils virtinst
# Hızlı Alpine VM başlat (ISO ile)
qemu-system-x86_64 \
-enable-kvm \
-m 1024 \
-smp 2 \
-cdrom alpine-virt-3.19.0-x86_64.iso \
-nographic
# Disk imajı oluştur ve VM başlat
qemu-img create -f qcow2 vm.qcow2 20G
qemu-system-x86_64 \
-enable-kvm \
-m 2048 \
-smp 4 \
-drive file=vm.qcow2,format=qcow2,if=virtio \
-cdrom ubuntu-22.04-server.iso \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-nographic
# Kurulu sistemi başlat
qemu-system-x86_64 \
-enable-kvm \
-m 2048 \
-smp 4 \
-drive file=vm.qcow2,format=qcow2,if=virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-nographic \
-serial mon:stdio
KVM hızlandırmasını doğrulama
# Guest içinde: sanallaştırma tespit
systemd-detect-virt
# kvm
# CPUID kontrol (guest içinde)
cpuid | grep -i hypervisor
# dmesg'de KVM hypervisor mesajı
dmesg | grep -i kvm
# [ 0.000000] Hypervisor detected: KVM
# KVM paravirt clock (yüksek çözünürlüklü zaman)
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
# kvm-clock
Önemli QEMU bayrakları
| Bayrak | Açıklama | Örnek |
|---|---|---|
| -enable-kvm | KVM hızlandırmasını etkinleştir | -enable-kvm |
| -cpu | vCPU modeli | -cpu host (host özelliklerini aktar) |
| -smp | vCPU sayısı ve topoloji | -smp 4,sockets=1,cores=2,threads=2 |
| -m | RAM miktarı | -m 2G veya -m 2048M |
| -drive | Disk bağlantısı | -drive file=disk.qcow2,if=virtio |
| -net | Ağ adaptörü | -net nic,model=virtio -net bridge,br=br0 |
| -nographic | Grafik yok, konsol STDIO | Headless server |
| -daemonize | Arka planda çalış | -daemonize -pidfile /run/vm.pid |
| -monitor | QEMU monitor bağlantısı | -monitor unix:/tmp/qemu.sock,server |
Bu bölümde
- QEMU + -enable-kvm: CPU işlemleri donanım hızında; I/O emüle edilir
- -cpu host: host CPU özelliklerini guest'e geç — performans için önerilir
- qemu-img create: qcow2 format — thin-provisioned, snapshot destekli
- systemd-detect-virt: guest'te KVM'i doğrula; kvm-clock: yüksek çözünürlüklü saat
02 Virtio sürücüleri
Virtio, hypervisor ile guest arasında yüksek performanslı I/O için tasarlanmış paravirtualization standardıdır. Tam emülasyon yerine guest ve host arasında protokol düzeyinde işbirliği yapar.
Paravirtualization vs tam emülasyon
| Yaklaşım | Nasıl çalışır | Performans | Uyumluluk |
|---|---|---|---|
| Tam emülasyon (e1000, IDE) | QEMU gerçek donanım davranışını taklit eder | Düşük — her I/O VM-exit + emülasyon | Yüksek — modifiye edilmemiş OS |
| Paravirtualization (virtio) | Guest, hypervisor'ı biliyor; özel driver kullanır | Yüksek — optimize edilmiş I/O yolu | Orta — guest'te virtio driver gerekli |
Temel virtio cihazları
# virtio-blk: disk (en yüksek I/O throughput)
qemu-system-x86_64 \
-drive file=disk.qcow2,format=qcow2,if=virtio \
...
# virtio-scsi: çok disk, SCSI komutları
qemu-system-x86_64 \
-device virtio-scsi-pci \
-drive file=disk.qcow2,if=none,id=disk0 \
-device scsi-hd,drive=disk0 \
...
# virtio-net: ağ adaptörü
qemu-system-x86_64 \
-device virtio-net-pci,netdev=net0 \
-netdev bridge,id=net0,br=br0 \
...
# virtio-console: seri konsol
qemu-system-x86_64 \
-device virtio-serial \
-device virtconsole,chardev=con0 \
-chardev socket,id=con0,server=on,wait=off,path=/tmp/console.sock \
...
# virtio-balloon: dinamik bellek
qemu-system-x86_64 \
-device virtio-balloon \
...
vhost-net — kernel bypass
vhost-net, virtio-net'in kernel içi implementasyonudur. Ağ paketleri QEMU userspace'ten geçmez; kernel doğrudan guest ring buffer'ını işler. Özellikle yüksek paket hızı (10G+) uygulamalarında kritik fark yaratır.
# vhost-net kernel modülünü yükle
sudo modprobe vhost-net
ls /dev/vhost-net
# QEMU'da vhost-net kullan
qemu-system-x86_64 \
-device virtio-net-pci,netdev=net0 \
-netdev bridge,id=net0,br=br0,vhost=on \
...
# Guest içinde virtio sürücüleri doğrula
lspci | grep -i virtio
# 00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
# 00:04.0 SCSI storage controller: Red Hat, Inc. Virtio block device
Bu bölümde
- Virtio: paravirtualization — guest hypervisor'ı biliyor, optimize I/O yolu
- virtio-blk: disk; virtio-net: ağ; virtio-console: seri port; virtio-balloon: RAM
- vhost-net: ağ işlemlerini kernel'a taşır — QEMU bypass, düşük latency
- Linux guest'te virtio driver'lar kernel'da mevcut — ekstra kurulum gerekmez
03 libvirt ve virsh
libvirt, KVM/QEMU'nun üzerinde oturan VM yönetim katmanıdır. virsh komut satırı aracı, libvirt API'sini kullanarak VM'leri XML ile tanımlar ve yönetir.
libvirt kurulumu
# Ubuntu/Debian
sudo apt install libvirt-daemon-system libvirt-clients virt-manager
# Servis başlat
sudo systemctl enable --now libvirtd
# Kullanıcıyı libvirt grubuna ekle
sudo usermod -aG libvirt $USER
# Bağlantıyı doğrula
virsh -c qemu:///system version
# Compiled against library: libvirt 8.0.0
Domain XML anatomisi
<domain type='kvm'>
<name>alpine-test</name>
<memory unit='MiB'>1024</memory>
<currentMemory unit='MiB'>1024</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/> <apic/>
</features>
<cpu mode='host-passthrough' check='none'/>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none' io='native'/>
<source file='/var/lib/libvirt/images/alpine.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
</devices>
</domain>
virsh temel komutları
# VM tanımla (XML dosyasından)
virsh define alpine.xml
# VM başlat
virsh start alpine-test
# Tüm VM'leri listele
virsh list --all
# VM konsola bağlan
virsh console alpine-test # Ctrl+] ile çık
# Düzgün kapat
virsh shutdown alpine-test
# Zorla kapat
virsh destroy alpine-test
# VM sil (disk dahil)
virsh undefine alpine-test --remove-all-storage
# Anlık görüntü (snapshot)
virsh snapshot-create-as alpine-test snap1 "Temiz kurulum" --disk-only
virsh snapshot-list alpine-test
virsh snapshot-revert alpine-test snap1
# Canlı göç (live migration) — iki host arasında
virsh migrate --live alpine-test qemu+ssh://host2/system
Bu bölümde
- libvirt: KVM/QEMU yönetim API'si; virsh CLI, virt-manager GUI
- Domain XML: VM'nin tüm konfigürasyonu — CPU, RAM, disk, ağ, cihazlar
- virsh define/start/shutdown/destroy: VM yaşam döngüsü
- snapshot-create-as: anlık görüntü; migrate --live: sıcak göç
04 vCPU pinning ve NUMA
Gerçek zamanlı ve yüksek performanslı VM'lerde vCPU'ları belirli fiziksel CPU'lara sabitlemek (pinning) ve NUMA topolojisine uygun bellek tahsisi kritik öneme sahiptir.
vCPU pinning — XML ile
<domain type='kvm'>
<vcpu placement='static'>4</vcpu>
<!-- vCPU'ları fiziksel CPU'lara sabitle -->
<cputune>
<vcpupin vcpu='0' cpuset='2'/> <!-- vCPU 0 → pCPU 2 -->
<vcpupin vcpu='1' cpuset='3'/> <!-- vCPU 1 → pCPU 3 -->
<vcpupin vcpu='2' cpuset='4'/>
<vcpupin vcpu='3' cpuset='5'/>
<emulatorpin cpuset='0-1'/> <!-- QEMU emulator thread'leri için -->
</cputune>
<!-- Hugepage backed memory -->
<memoryBacking>
<hugepages>
<page size='2048' unit='KiB'/> <!-- 2 MB hugepage -->
</hugepages>
<nosharepages/>
<locked/>
</memoryBacking>
<numatune>
<memory mode='strict' nodeset='0'/> <!-- NUMA node 0'dan bellek -->
</numatune>
</domain>
Hugepage hazırlığı
# 2MB hugepage sayısını ayarla (1024 * 2MB = 2GB)
sudo sysctl vm.nr_hugepages=1024
# Kalıcı konfigürasyon
echo "vm.nr_hugepages=1024" | sudo tee /etc/sysctl.d/99-hugepages.conf
# Hugepage durumunu kontrol et
cat /proc/meminfo | grep -i huge
# HugePages_Total: 1024
# HugePages_Free: 1024
# Hugepagesize: 2048 kB
# 1GB hugepage (NUMA destekli sistemlerde)
sudo sysctl vm.nr_hugepages=2 # 2 * 1GB = 2GB
# ya da kernel parametresi:
# hugepagesz=1G hugepages=2
# NUMA topolojisini incele
numactl --hardware
numactl --show
Runtime CPU pinning
# Çalışan VM'in vCPU'larını sabitle
virsh vcpupin alpine-test 0 2 # vCPU 0 → pCPU 2
virsh vcpupin alpine-test 1 3 # vCPU 1 → pCPU 3
# Mevcut CPU pinning'i göster
virsh vcpuinfo alpine-test
# numactl ile process bağla (QEMU süreci)
QEMU_PID=$(virsh dominfo alpine-test | grep "CPU time" | ...)
numactl --cpubind=0 --membind=0 qemu-system-x86_64 ...
# CPU izolasyonu (isolcpus) — kernel parametresi
# GRUB_CMDLINE_LINUX="isolcpus=2,3,4,5 nohz_full=2,3,4,5 rcu_nocbs=2,3,4,5"
Bu bölümde
- vCPU pinning: vCPU N → pCPU M; NUMA-aware düzenle — cache thrash önlenir
- Hugepages: TLB miss azaltır — 2MB veya 1GB; VM için locked memory
- numatune strict: belleği tek NUMA node'a kısıtla — cross-NUMA gecikmeyi önler
- isolcpus kernel parametresi: pCPU'ları OS zamanlayıcısından ayır
05 PCIe passthrough — VFIO
VFIO (Virtual Function I/O), PCIe cihazlarını (GPU, NIC, NVMe) doğrudan guest'e geçirmeyi sağlar. Guest, cihaza neredeyse bare-metal performansıyla erişir.
IOMMU etkinleştirme
# GRUB kernel parametreleri ekle:
# Intel: intel_iommu=on iommu=pt
# AMD: amd_iommu=on iommu=pt
sudo vim /etc/default/grub
# GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt"
sudo update-grub
sudo reboot
# IOMMU aktif olduğunu doğrula
dmesg | grep -e DMAR -e IOMMU
# [ 0.000000] ACPI: DMAR 0x00000000BFAF1890 000088 (v01 ...)
# [ 0.326874] Intel-IOMMU: enabled
# IOMMU gruplarını listele
for g in /sys/kernel/iommu_groups/*; do
echo "Group $(basename $g):"
ls $g/devices/
done
VFIO ile cihaz ayırma
# Passthrough yapılacak cihazı bul (örnek: GPU)
lspci -nn | grep NVIDIA
# 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation [10de:2204]
# 01:00.1 Audio device [0403]: NVIDIA Corporation [10de:1aef]
# VFIO modüllerini yükle
sudo modprobe vfio-pci
# Cihazı VFIO'ya bağla (GPU+Audio — aynı IOMMU grubunda)
echo "10de 2204" | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
echo "10de 1aef" | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
# Ya da mevcut sürücüyü önce ayır
echo "0000:01:00.0" | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo "0000:01:00.0" | sudo tee /sys/bus/pci/drivers/vfio-pci/bind
# QEMU'da GPU passthrough
qemu-system-x86_64 \
-enable-kvm \
-m 8G \
-device vfio-pci,host=01:00.0,multifunction=on \
-device vfio-pci,host=01:00.1 \
...
NIC passthrough (SR-IOV)
# SR-IOV destekli NIC'de sanal fonksiyon oluştur
echo 4 | sudo tee /sys/class/net/eth0/device/sriov_numvfs
# VF'leri listele
lspci | grep "Virtual Function"
# VF'yi VFIO'ya bağla ve VM'e geç
echo "0000:00:10.1" | sudo tee /sys/bus/pci/drivers/vfio-pci/bind
qemu-system-x86_64 \
-enable-kvm \
-device vfio-pci,host=00:10.1 \
...
Bu bölümde
- IOMMU: intel_iommu=on veya amd_iommu=on kernel parametresi — temel gereksinim
- IOMMU grubu: aynı gruptaki tüm cihazlar birlikte geçirilmeli
- vfio-pci: cihazı host sürücüsünden ayır, guest'e geç — neredeyse native performans
- SR-IOV: tek fiziksel NIC'den çok sayıda sanal fonksiyon — her VM'e ayrı VF
06 Nested virtualization
Nested KVM, bir VM içinde başka VM çalıştırmayı sağlar. L0 (bare-metal host), L1 (nested hypervisor) ve L2 (guest içi guest) katmanlarından oluşur.
Nested KVM etkinleştirme
# Intel için nested etkinleştir
sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
# Kalıcı konfigürasyon
echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
# AMD için
echo "options kvm_amd nested=1" | sudo tee /etc/modprobe.d/kvm-amd.conf
# Etkin olduğunu doğrula
cat /sys/module/kvm_intel/parameters/nested
# Y
# L1 VM'i nested özelliğiyle başlat
qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-m 4G \
-drive file=nested-host.qcow2,if=virtio \
...
L0/L1/L2 katmanları
| Katman | Tanım | Rol |
|---|---|---|
| L0 | Bare-metal Linux host | Gerçek donanım, kvm.ko modülü, VMCS sahibi |
| L1 | İlk seviye VM (nested hypervisor) | L0'ın guest'i; kendi içinde KVM çalıştırır |
| L2 | İkinci seviye VM | L1'in guest'i; çift sanallaştırma katmanı |
# L1 VM içinde (nested hypervisor)
egrep '(vmx|svm)' /proc/cpuinfo
# vmx: host -cpu host ile aktarıldı
kvm-ok
# INFO: /dev/kvm exists — nested çalışıyor
# L1 içinde L2 VM başlat
qemu-system-x86_64 \
-enable-kvm \
-m 512M \
-cdrom alpine.iso \
-nographic
Kullanım senaryoları
Bu bölümde
- options kvm_intel nested=1: L1'de /dev/kvm aktif — tek parametre
- -cpu host: VMCS özelliklerini L1'e aktar — nested için zorunlu
- L0/L1/L2: her geçiş ek VM-exit overhead'ı — üretim için kaçınılabilir
- CI/CD ve güvenlik araştırması: nested KVM'in pratik kullanım alanları
07 Otomotif / embedded IVI
Automotive Grade Linux (AGL) ve benzeri platformlarda KVM, araç içi bilgi-eğlence sistemlerinde (IVI) izolasyon ve güvenlik için kullanılır. Gerçek zamanlı guest ve virtio-vsock önemli role sahiptir.
Otomotif KVM kullanım senaryosu
| VM | İşlev | Gereksinim |
|---|---|---|
| Guest 1 (Android Auto) | Navigasyon, medya, ses | Yüksek performans GPU, latency tolerant |
| Guest 2 (RT Guest) | CAN/LIN bus, ADAS, araç kontrol | PREEMPT_RT, determinizm, watchdog |
| Guest 3 (Güvenlik) | Firmware imza, TPM, HSM | TrustZone / TEE izolasyonu |
| Host (AGL/Yocto) | Donanım yönetimi, hypervisor | Kararlı, minimal yüzey |
PREEMPT_RT guest konfigürasyonu
# RT guest için vCPU pinning + realtime öncelik
qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-smp 2 \
-m 1G \
-realtime mlock=on \
-drive file=rt-guest.qcow2,if=virtio,cache=none \
-device virtio-serial \
-device virtio-rng-pci \
-nographic
# QEMU thread'lerini RT sched politikasıyla çalıştır
sudo chrt -f 80 -p $(pgrep -f "qemu-system-x86_64")
virtio-vsock — VM'ler arası iletişim
# Host: vhost-vsock modülü
sudo modprobe vhost-vsock
# QEMU'da vsock ekle (her VM'in benzersiz CID'i olmalı)
qemu-system-x86_64 \
-enable-kvm \
-device vhost-vsock-pci,guest-cid=5 \
...
# Guest içinde vsock server (Python)
# import socket
# s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
# s.bind((socket.VMADDR_CID_ANY, 1234))
# s.listen(1)
# Host'tan guest'e bağlan (CID 5, port 1234)
socat - VSOCK-CONNECT:5:1234
Bu bölümde
- AGL + KVM: IVI sistemi — medya VM + RT kontrol VM + güvenlik VM izolasyonu
- RT guest: PREEMPT_RT kernel + -realtime mlock=on + vCPU pinning
- virtio-vsock: VM'ler arası lightweight socket — TCP/IP yok, overhead düşük
- chrt -f ile QEMU thread'lerine SCHED_FIFO: RT host-guest iletişimi
08 Pratik uygulamalar
Üç senaryo: minimal Alpine VM, bridge ağ, cloud-init ile hızlı deploy ve ARM64 QEMU KVM.
Minimal Alpine VM
# Alpine ISO indir
wget https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.0-x86_64.iso
# Disk imajı oluştur
qemu-img create -f qcow2 alpine.qcow2 4G
# Kurulum
qemu-system-x86_64 \
-enable-kvm \
-m 512M \
-smp 2 \
-drive file=alpine.qcow2,format=qcow2,if=virtio \
-cdrom alpine-virt-3.19.0-x86_64.iso \
-boot d \
-net nic,model=virtio \
-net user \
-nographic
# Kurulum tamamlandıktan sonra:
qemu-system-x86_64 \
-enable-kvm \
-m 512M \
-smp 2 \
-drive file=alpine.qcow2,format=qcow2,if=virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-nographic
# SSH bağlantısı
ssh -p 2222 root@localhost
Bridge ağ kurulumu
# Bridge oluştur
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set eth0 master br0
sudo ip addr add 192.168.1.1/24 dev br0
# Kalıcı (Netplan — Ubuntu)
# /etc/netplan/00-bridge.yaml:
# network:
# ethernets:
# eth0: {dhcp4: false}
# bridges:
# br0:
# interfaces: [eth0]
# dhcp4: true
# VM'i bridge'e bağla
qemu-system-x86_64 \
-enable-kvm \
-m 512M \
-net nic,model=virtio,macaddr=52:54:00:12:34:56 \
-net bridge,br=br0 \
...
cloud-init ile hızlı VM deploy
# Ubuntu cloud image indir (cloud-init destekli)
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
# Disk imajını genişlet
qemu-img resize jammy-server-cloudimg-amd64.img +10G
# cloud-init user-data hazırla
cat > user-data <<'EOF'
#cloud-config
users:
- name: ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA... user@host
packages:
- htop
- vim
runcmd:
- systemctl enable --now ssh
EOF
# cloud-init ISO oluştur
cloud-localds seed.img user-data
# VM başlat (cloud-init ilk boot'ta çalışır)
qemu-system-x86_64 \
-enable-kvm \
-m 2G \
-smp 2 \
-drive file=jammy-server-cloudimg-amd64.img,if=virtio \
-drive file=seed.img,if=virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-nographic
ARM64 KVM — qemu-system-aarch64
# ARM64 QEMU (ARM host'ta KVM, x86'da emülasyon)
sudo apt install qemu-system-arm
# ARM64 cloud image indir
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-arm64.img
# UEFI firmware (ARM64 için gerekli)
sudo apt install qemu-efi-aarch64
# ARM64 VM başlat
qemu-system-aarch64 \
-M virt \
-cpu cortex-a57 \
-m 2G \
-smp 4 \
-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
-drive file=jammy-server-cloudimg-arm64.img,if=virtio \
-drive file=seed.img,if=virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp::2223-:22 \
-nographic
# ARM64 host'ta KVM hızlandırma ile:
qemu-system-aarch64 \
-M virt \
-enable-kvm \
-cpu host \
-m 2G \
...
Bu bölümde
- Alpine: en küçük footprint — kurulum ~5 dk, 4GB disk yeterli
- bridge br0: VM'ler gerçek ağa katılır — DHCP sunucu gerekebilir
- cloud-init: ilk boot'ta user/ssh/package otomasyonu — sıfır elle müdahale
- qemu-system-aarch64 -M virt -cpu cortex-a57: ARM64 emülasyon; ARM host'ta -enable-kvm