Proxmox ortamında KVM tabanlı sanal makine yönetimi, sysadmin’lerin günlük rutininin ayrılmaz bir parçası haline geldi. Hypervisor’ün sunduğu web arayüzü işleri kolaylaştırsa da, komut satırından KVM sanal makinelerini yönetmek hem daha hızlı hem de otomasyon açısından çok daha güçlü bir yaklaşım. Bu yazıda Proxmox üzerinde KVM ile sanal makine oluşturmadan, klonlamaya, anlık görüntülerden disk yönetimine kadar her şeyi ele alacağız.
KVM ve Proxmox İlişkisi
Proxmox, arka planda QEMU/KVM kullanır. Yani aslında yaptığın her web arayüzü işlemi, arka planda qm komutlarına dönüşüyor. Bunu anlamak önemli çünkü qm CLI aracını doğrudan kullandığında, web arayüzünün sana sunduğu sınırların çok ötesine geçebiliyorsun.
KVM (Kernel-based Virtual Machine), Linux çekirdeğine gömülü bir hipervizördür. Proxmox bu altyapıyı kullanarak bare-metal performansa yakın sanallaştırma sunar. Özellikle CPU ve RAM yoğun iş yükleri için VMware ESXi’ye kıyasla ciddi bir maliyet avantajı sağlar.
Proxmox node’una SSH ile bağlandığında, qm aracı seni karşılar:
qm list
Bu komutun çıktısı şuna benzer:
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
100 web-server-01 running 2048 32.00 1234
101 db-server-01 stopped 4096 64.00 0
102 test-ubuntu running 1024 20.00 5678
İlk Sanal Makineyi Oluşturmak
Proxmox web arayüzünden VM oluşturmak pratik, ama 50 tane VM oluşturacaksan komut satırı senin dostun. qm create komutu temel oluşturma işlemini yapar:
qm create 200
--name "ubuntu-22-prod"
--memory 4096
--cores 2
--sockets 1
--cpu host
--net0 virtio,bridge=vmbr0
--ostype l26
--scsihw virtio-scsi-pci
--scsi0 local-lvm:32
--ide2 local:iso/ubuntu-22.04.3-live-server-amd64.iso,media=cdrom
--boot order=ide2
--vga std
Burada dikkat etmen gereken birkaç parametre var:
- –memory 4096: MB cinsinden RAM miktarı
- –cores 2: Sanal CPU çekirdek sayısı
- –cpu host: Fiziksel CPU özelliklerini sanal makineye geçir (performans için önemli)
- –net0 virtio: VirtIO ağ sürücüsü, bare-metal’e yakın ağ performansı sağlar
- –scsihw virtio-scsi-pci: VirtIO SCSI kontrolcüsü, disk I/O optimizasyonu için
- –ostype l26: Linux 2.6/3.x/4.x/5.x kernel
VM oluşturduktan sonra başlatmak için:
qm start 200
ISO ile Kurulum Yapmak
ISO dosyalarını Proxmox’a yüklemek için pvesm veya doğrudan wget kullanabilirsin. Önerim, ISO’ları doğrudan Proxmox node’una çekmek:
# ISO storage dizinine geç
cd /var/lib/vz/template/iso/
# Ubuntu 22.04 ISO'sunu indir
wget https://releases.ubuntu.com/22.04.3/ubuntu-22.04.3-live-server-amd64.iso
# Mevcut ISO'ları listele
pvesm list local | grep iso
Kurulum sırasında VNC konsoluna erişmek için:
# VNC bağlantı bilgisini göster
qm showcmd 200 --pretty
# Veya noVNC ile web üzerinden bağlan (default port)
# https://proxmox-ip:8006/vnc?vmid=200
Disk Yönetimi
Gerçek dünyada en sık karşılaşacağın operasyonlardan biri disk boyutlandırma. Bir üretim sunucusunun diski dolmaya başladığında, hızlı hareket etmen gerekir.
Disk Boyutu Artırma
# VM durdurulmadan online disk genişletme (destekleniyorsa)
qm resize 200 scsi0 +20G
# Mevcut disk bilgisini göster
qm config 200 | grep scsi
Bu komuttan sonra, sanal makine içinde de OS seviyesinde genişletme yapman gerekiyor. Linux için:
# VM içinde (SSH veya konsol)
# Partition tablosunu güncelle
growpart /dev/sda 3
# Dosya sistemini genişlet (ext4 için)
resize2fs /dev/sda3
# XFS için
xfs_growfs /
Ek Disk Ekleme
# Yeni 50GB disk ekle
qm set 200 --scsi1 local-lvm:50
# Disk listesini kontrol et
qm config 200
Snapshot Yönetimi
Snapshot’lar test ortamlarında can kurtarır. Bir güncelleme yapmadan önce snapshot almak, bir şeyler ters giderse hızlıca geri dönmenizi sağlar.
# Snapshot al
qm snapshot 200 "before-nginx-update" --description "nginx 1.24 guncellemesi oncesi"
# Mevcut snapshot'ları listele
qm listsnapshot 200
# Snapshot'a geri dön
qm rollback 200 "before-nginx-update"
# Snapshot sil
qm delsnapshot 200 "before-nginx-update"
Dikkat etmen gereken bir nokta: RAM state dahil snapshot almak istiyorsan --vmstate parametresini kullan. Bu sayede VM’nin tam bellek durumunu da kaydedersin ancak bu daha fazla alan kaplar:
qm snapshot 200 "full-state-snap" --vmstate 1 --description "RAM state ile tam snapshot"
Klonlama ve Template Oluşturma
Bir sanal makineyi defalarca oluşturacaksan, template kullanmak seni çok ciddi zamandan kurtarır. Örneğin bir şirkette 20 developer var ve her birine aynı konfigürasyonda geliştirme ortamı açman gerekiyor.
Template Hazırlama
Önce temel VM’i hazırlayıp, içine cloud-init veya manuel olarak ihtiyaç duyduğun yazılımları kur. Ardından:
# VM'i template'e dönüştür (geri alınamaz!)
qm template 200
# Template listesini görüntüle
qm list | grep template
Full Clone
# Full clone - tamamen bağımsız kopya
qm clone 200 201 --name "dev-ubuntu-01" --full
# Clone'u başlat
qm start 201
Linked Clone
Linked clone, disk alanından tasarruf sağlar çünkü temel diski paylaşır. Ancak template silindiğinde clone’lar da etkilenir:
# Linked clone oluştur
qm clone 200 202 --name "test-vm-linked"
Üretim ortamında linked clone kullanmaktan kaçın. Test ve geliştirme ortamları için idealdir.
Cloud-Init ile Otomatik Konfigürasyon
Modern altyapılarda Cloud-Init olmadan VM açmak düşünülemez. Proxmox, Cloud-Init’i doğrudan destekler.
Cloud-Init Destekli VM Hazırlama
# Ubuntu Cloud Image indir
cd /var/lib/vz/template/iso/
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
# Yeni VM oluştur
qm create 300
--name "cloud-init-template"
--memory 2048
--cores 2
--net0 virtio,bridge=vmbr0
--scsihw virtio-scsi-pci
--ostype l26
# Cloud image'i disk olarak import et
qm importdisk 300 /var/lib/vz/template/iso/jammy-server-cloudimg-amd64.img local-lvm
# Import edilen diski VM'e bağla
qm set 300 --scsi0 local-lvm:vm-300-disk-0
# Cloud-Init drive ekle
qm set 300 --ide2 local-lvm:cloudinit
# Boot sırasını ayarla
qm set 300 --boot c --bootdisk scsi0
# Serial konsol ekle (cloud-init logları için)
qm set 300 --serial0 socket --vga serial0
Cloud-Init Parametrelerini Ayarlama
# Kullanıcı adı ve şifre
qm set 300 --ciuser adminuser --cipassword "SuperSecure123!"
# SSH public key ile giriş (önerilir)
qm set 300 --sshkey ~/.ssh/id_rsa.pub
# Statik IP veya DHCP
qm set 300 --ipconfig0 ip=192.168.1.100/24,gw=192.168.1.1
# DNS sunucusu
qm set 300 --nameserver "8.8.8.8 8.8.4.4"
# Cloud-Init ayarlarını görüntüle
qm cloudinit dump 300 user
Bu VM’i template yaptıktan sonra her clone işleminde IP ve kullanıcı bilgilerini ayrıca belirtebilirsin:
# Template'den clone al
qm clone 300 301 --name "web-server-prod-01" --full
# Clone'a özgü network ayarı
qm set 301 --ipconfig0 ip=192.168.1.101/24,gw=192.168.1.1
# Başlat
qm start 301
Kaynak Yönetimi ve Performans Ayarları
CPU Pinning
Yüksek performans gerektiren veritabanı sunucuları için CPU pinning yapmak, NUMA mimarisinden maksimum verim almanı sağlar:
# NUMA topolojisini kontrol et
numactl --hardware
# CPU core bilgisi
lscpu | grep -E "Core|Socket|NUMA"
# VM'e CPU pinning uygula (VM durdurulmuş olmalı)
# Core 0-3'ü VM'e pin'le
qm set 200 --affinity 0-3
Bellek Ballooning
Bellek ballooning, VM’lerin kullanmadıkları RAM’i host’a iade etmesini sağlar. Overcommit yaparken kullanışlıdır:
# Ballooning'i etkinleştir (minimum 1GB, maksimum 8GB)
qm set 200 --balloon 1024 --memory 8192
I/O Throttling
Disk I/O’yu sınırlamak, bir VM’in tüm disk bant genişliğini tüketmesini engeller:
# Maksimum IOPS sınırı koy
qm set 200 --scsi0 local-lvm:vm-200-disk-0,iops_rd=1000,iops_wr=500
# Maksimum bant genişliği sınırı (MB/s)
qm set 200 --scsi0 local-lvm:vm-200-disk-0,mbps_rd=100,mbps_wr=50
Toplu VM Yönetimi
Gerçek dünya senaryosu: 10 tane web sunucusunu aynı anda yeniden başlatman gerekiyor. Bunları tek tek yapmak yerine:
#!/bin/bash
# Belirli bir tag'e sahip VM'leri yeniden başlat
VM_IDS="200 201 202 203 204"
for vmid in $VM_IDS; do
echo "VM $vmid yeniden baslatiliyor..."
qm reboot $vmid
sleep 5
done
echo "Tum VM'ler yeniden baslatildi."
Bir adım daha ileri gidelim. Belli bir isim pattern’ine sahip tüm VM’leri durduran script:
#!/bin/bash
# "test-" ile baslayan tum VM'leri durdur
qm list | grep "test-" | awk '{print $1}' | while read vmid; do
status=$(qm status $vmid | awk '{print $2}')
if [ "$status" == "running" ]; then
echo "VM $vmid durduruluyor..."
qm stop $vmid
fi
done
VM Backup ve Restore
Proxmox’un yerleşik backup aracı vzdump, KVM VM’leri için de kullanılır:
# Tek VM backup al
vzdump 200 --storage local --compress zstd --mode snapshot
# Tüm VM'leri backup al
vzdump --all --storage backup-nfs --compress lzo --mode suspend
# Backup listesini göster
pvesm list local | grep vzdump
# Backup'tan restore
qmrestore /var/lib/vz/dump/vzdump-qemu-200-2024_01_15-03_00_01.vma.zst 250
--storage local-lvm
--name "restored-web-server"
Gece otomatik backup için /etc/cron.d/ altına bir cron job ekleyebilirsin, ancak Proxmox’un kendi Backup Schedule özelliğini kullanmak daha güvenli ve yönetilebilir bir yaklaşım.
VM Durumunu İzlemek
# Tek VM'in detaylı durumu
qm status 200 --verbose
# VM'in mevcut konfigürasyonu
qm config 200
# Çalışan VM'lerin anlık kaynak kullanımı
for vmid in $(qm list | grep running | awk '{print $1}'); do
echo "=== VM $vmid ==="
qm monitor $vmid <<EOF
info status
info balloon
EOF
done
# QEMU monitor üzerinden I/O istatistikleri
qm monitor 200 <<EOF
info block
EOF
Ağ Konfigürasyonu
Bir VM’e birden fazla NIC eklemek production ortamlarında sık karşılaşılan bir senaryo. Örneğin bir veritabanı sunucusunun hem public hem de private network’e bağlı olması:
# İkinci NIC ekle (private network için)
qm set 200 --net1 virtio,bridge=vmbr1
# VLAN tag'i ile NIC ekle
qm set 200 --net2 virtio,bridge=vmbr0,tag=100
# Mevcut NIC konfigürasyonunu görüntüle
qm config 200 | grep net
# MAC adresi belirterek NIC ekle
qm set 200 --net3 virtio,bridge=vmbr0,macaddr=AA:BB:CC:DD:EE:FF
PCI Passthrough ile Donanım Geçişi
GPU veya network kartlarını doğrudan VM’e aktarmak istediğinde PCI passthrough devreye girer. Bu özellikle GPU computing veya yüksek performanslı ağ işlemleri için kritik:
# Kullanılabilir PCI cihazları listele
lspci | grep -i "nvidia|mellanox|intel"
# PCI cihazının adresini bul (örnek: 01:00.0)
lspci -nn | grep "NVIDIA"
# VM'e PCI cihazı ekle
qm set 200 --hostpci0 01:00.0,pcie=1,x-vga=1
# IOMMU grubunu kontrol et (passthrough için gerekli)
find /sys/kernel/iommu_groups/ -type l | sort -V
IOMMU’nun etkin olması gerekiyor. /etc/default/grub dosyasında şu parametreleri eklemen lazım:
# Intel sistemler için
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
# AMD sistemler için
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
# Grub'u güncelle
update-grub
Hata Giderme
Günlük sysadmin hayatında karşılaşacağın birkaç yaygın sorun ve çözümleri:
VM başlamıyor, “TASK ERROR: start failed” hatası:
# VM loglarına bak
journalctl -u qemu-server@200 --since "1 hour ago"
# Proxmox log dosyası
tail -f /var/log/pve/tasks/active
Disk bozulması şüphesi:
# VM durdurulmuş olmalı
qm stop 200
# Disk imajını kontrol et
qemu-img check /dev/pve/vm-200-disk-0
# SMART değerlerini kontrol et (fiziksel disk için)
smartctl -a /dev/sda
Yüksek CPU steal time:
# Hangi VM'lerin en fazla CPU kullandığını gör
pvesh get /nodes/$(hostname)/qemu --output-format json |
python3 -c "import json,sys; vms=json.load(sys.stdin)['data'];
[print(f"VM {v['vmid']}: CPU {v.get('cpu',0):.2%}") for v in sorted(vms, key=lambda x: x.get('cpu',0), reverse=True)]"
Sonuç
KVM sanal makine yönetimi, qm komut setini iyi öğrendiğinde ciddi bir operasyonel güç kazandırıyor. Web arayüzü günlük işler için yeterli olsa da, bulk operasyonlar, otomasyon senaryoları ve ince ayar gerektiren konfigürasyonlar için komut satırı kaçınılmaz.
Öğrendiklerini özetlemek gerekirse:
qm createile temel VM oluşturma parametrelerini iyi kavramak, uzun vadede sağlam VM template stratejisi kurmanı sağlar- Cloud-Init entegrasyonu, VM provisioning süreçlerini dramatik biçimde hızlandırır
- Snapshot yönetimi, değişiklik öncesi güvenli geri dönüş noktaları oluşturur
- Toplu yönetim script’leri, düzinelerce VM’i tek komutla yönetmenizi mümkün kılar
- Kaynak throttling, çok kiracılı ortamlarda adil kaynak dağılımı için kritiktir
Proxmox ortamında uzmanlaşmak biraz zaman alıyor, ancak bu altyapının üzerine Ansible ile otomasyon katmanı eklediğinde, VM yaşam döngüsü yönetimi gerçek anlamda endüstriyel ölçeğe taşınıyor. Bir sonraki yazıda Proxmox üzerinde Ansible ile sıfır dokunuşlu VM provisioning konusunu ele alacağız.