Tek bir fiziksel sunucuda birden fazla işletim sistemini birbirinden izole biçimde çalıştırmak, KVM ve QEMU ikilisiyle mümkündür. KVM (Kernel-based Virtual Machine), Linux çekirdeğine gömülü bir modüldür ve işlemcinin donanımsal sanallaştırma desteğini doğrudan kullanır; bu sayede sanal makine neredeyse yerel donanım hızında çalışır. QEMU ise disk, ağ kartı ve USB gibi sanal donanım bileşenlerini öykünerek KVM'in eksik bıraktığı kısmı tamamlar.
Bu rehberde libvirt araçlarıyla sanal makine kurmayı, ağ ve disk yapılandırmasını, snapshot alma işlemini ve komut satırından yönetimi sırayla ele alıyorum. Grafik arayüze de kısaca değinilecek ama asıl odak, üretim sunucusunda gerçekten işe yarayan komutlar.
KVM mü, QEMU mu, İkisi Birden mi?
KVM, işlemcinin Intel VT-x veya AMD-V donanım sanallaştırma özelliğini kullanan bir çekirdek modülüdür. Tek başına bir sanal makineyi çalıştırmaz; donanım erişimini hızlandırma görevini üstlenir. QEMU ise sanal makineye disk, ağ arayüzü ve BIOS gibi bileşenleri sağlayan kullanıcı alanı programıdır. İkisi birlikte çalıştığında QEMU, KVM'in donanım hızlandırmasını kullanır ve ortaya hem esnek hem performanslı bir sanal makine çıkar.
Sisteminizde donanım sanallaştırmasının etkin olup olmadığını şu komutla kontrol edin:
egrep -c '(vmx|svm)' /proc/cpuinfo
Komut sıfırdan büyük bir sayı döndürürse işlemci donanım sanallaştırmasını destekliyor demektir. BIOS veya UEFI ayarlarında "Virtualization Technology" ya da "SVM Mode" seçeneğinin açık olduğunu da kontrol edin. Gerekli paketleri Ubuntu veya Debian tabanlı bir sistemde şu komutla kurarsınız:
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
Kurulumdan sonra kullanıcınızı libvirt ve kvm gruplarına ekleyin; aksi halde her komutu sudo ile çalıştırmanız gerekir:
sudo usermod -aG libvirt,kvm $USER
Değişikliğin etkili olması için oturumu kapatıp yeniden açmanız gerekir. Grup üyeliği anında yenilenmez ve bu, yeni başlayanların sık takıldığı bir noktadır.
Kurulumun doğru çalıştığını virsh komutuyla doğrulayın:
virsh list --all
virsh version
Boş bir liste ve sürüm bilgisi görüyorsanız libvirt servisi çalışıyor demektir; artık sanal makine oluşturmaya hazırsınız.
virt-install ile Sanal Makine Oluşturma
Grafik arayüz (virt-manager) yeni başlayanlar için pratik, ama komut satırı tekrarlanabilir ve otomasyona uygundur. virt-install komutuyla bir Ubuntu Server sanal makinesi kurmak şöyle yapılır:

sudo virt-install \\
--name ubuntu-vm1 \\
--ram 2048 \\
--vcpus 2 \\
--disk path=/var/lib/libvirt/images/ubuntu-vm1.qcow2,size=20 \\
--os-variant ubuntu22.04 \\
--network network=default \\
--graphics none \\
--console pty,target_type=serial \\
--location 'https://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/'
--graphics none ve --console pty parametreleri, kurulumu doğrudan terminalde metin tabanlı yürütmenizi sağlar. Bu, SSH üzerinden bağlandığınız uzak sunucularda özellikle işe yarar. Disk formatı için qcow2 kullanmak mantıklıdır; bu format hem thin-provisioning destekler hem de snapshot almanıza olanak tanır.
Elinizde hazır bir ISO dosyası varsa --location yerine --cdrom parametresini kullanırsınız:
sudo virt-install --name win-vm1 --ram 4096 --vcpus 4 \\
--disk path=/var/lib/libvirt/images/win-vm1.qcow2,size=40 \\
--cdrom /root/isolar/windows-server.iso --os-variant win2k22
Windows kurulumlarında --graphics none işe yaramaz; çünkü kurulum sihirbazı grafik arayüz ister. Bu durumda virt-manager üzerinden ya da VNC ile bağlanmanız gerekir.
Sanal Makineleri Komut Satırından Yönetmek
Sanal makineler oluşturulduktan sonra günlük yönetim virsh komutuyla yapılır. Çalışan makineleri listelemek için:
virsh list --all
Bir makineyi başlatmak, durdurmak veya yeniden başlatmak için:
virsh start ubuntu-vm1
virsh shutdown ubuntu-vm1
virsh reboot ubuntu-vm1
Güç kablosunu çekmek gibi sert bir kapatma gerektiğinde virsh destroy kullanılır. Bu komut makineyi anında durdurur ama içindeki dosya sistemine zarar verme riski taşır. Bir makinenin XML tanımını görüntülemek veya düzenlemek için:
virsh dumpxml ubuntu-vm1
virsh edit ubuntu-vm1
CPU ve RAM tahsisini sonradan değiştirmek de mümkündür. Makineyi kapatıp şu komutları çalıştırmanız yeterli:
virsh setmaxmem ubuntu-vm1 4096M --config
virsh setvcpus ubuntu-vm1 4 --config --maximum
Sunucu yeniden başladığında sanal makinelerin otomatik açılmasını istiyorsanız, autostart bayrağını ayarlamanız yeterli:
virsh autostart ubuntu-vm1
Bir sanal makineyi tamamen silerken hem tanımını hem disk imajını kaldırmanız gerekir. Aksi halde /var/lib/libvirt/images klasörü zamanla dolar:
virsh undefine ubuntu-vm1 --remove-all-storage
Bu komut geri alınamaz. Çalıştırmadan önce ihtiyacınız olan verinin başka bir yerde yedeklendiğinden emin olun.
Ağ Yapılandırması: NAT mı, Bridge mi?
Varsayılan libvirt kurulumu, sanal makinelere NAT üzerinden internet erişimi sağlayan bir sanal ağ oluşturur. Bu yapı test ortamları için yeterlidir ama sanal makinenin ağdaki diğer cihazlardan doğrudan erişilebilir olmasını istiyorsanız yetersiz kalır. Bu durumda bridge (köprü) ağ kullanmanız gerekir.

Bridge kurulumu dağıtıma göre değişir. Netplan kullanan bir Ubuntu sunucusunda /etc/netplan/01-netcfg.yaml dosyası düzenlenir ve fiziksel arayüz bir köprüye bağlanır. Değişikliği uygulamak için şu komut çalıştırılır:
sudo netplan apply
Bridge hazır olduktan sonra virt-install komutunda --network network=default yerine --network bridge=br0 kullanarak sanal makineyi doğrudan fiziksel ağa bağlarsınız. Bu yapılandırma sanal makineye ev veya ofis ağınızdan gerçek bir IP adresi kazandırır ve ona doğrudan SSH ile erişmenizi sağlar. NAT arkasında kalan bir makineye bu şekilde ulaşamazsınız.
Var olan bir sanal makinenin ağ arayüzünü sonradan değiştirmek isterseniz virsh edit ile XML tanımını açıp <interface> bloğundaki source network değerini güncellersiniz. Değişikliğin geçerli olması için makineyi kapatıp yeniden başlatmanız gerekir. Çalışan bir makinede ağ arayüzü canlı olarak değiştirilemez.
| Ağ modu | Dış erişim | Kullanım senaryosu |
|---|---|---|
| NAT (varsayılan) | Sadece çıkış yönü | Test, geliştirme |
| Bridge | Tam, gerçek IP | Sunucu, servis barındırma |
| Isolated | Yok | İzole test ağı |
Snapshot ile Anlık Görüntü Alma
Sanal makinelerin en pratik özelliklerinden biri, riskli bir değişiklik öncesinde anlık görüntü (snapshot) alıp gerektiğinde o duruma geri dönebilmektir. Bir snapshot almak tek komutla yapılır:

virsh snapshot-create-as ubuntu-vm1 oncesi-durum "Güncelleme öncesi durum"
Mevcut snapshot'ları listelemek ve gerektiğinde geri dönmek için:
virsh snapshot-list ubuntu-vm1
virsh snapshot-revert ubuntu-vm1 oncesi-durum
Snapshot'lar, disk imajının değişen bloklarını takip ederek çalışır. Bu yüzden çok sayıda snapshot biriktirmek disk performansını düşürür ve depolama alanını hızla tüketir. Snapshot zinciri uzadıkça her yeni yazma işlemi önceki katmanları da kontrol etmek zorunda kalır ve bu disk gecikmesini artırır. Artık ihtiyaç duymadığınız snapshot'ları düzenli aralıklarla silin:
virsh snapshot-delete ubuntu-vm1 oncesi-durum
Üretim ortamında büyük güncellemeler öncesi snapshot almak, bir sorun çıktığında dakikalar içinde önceki duruma dönmenizi sağlar. Bu, manuel yedeklemeden çok daha hızlı bir güvenlik ağıdır. Ancak snapshot, RAID gibi tam bir yedekleme stratejisinin yerine geçmez. Sunucunun tamamen çökmesi durumunda ayrı bir diskte veya uzak konumda tutulan yedekler gerekir.
KVM'i Konteynerlerle Karşılaştırmak
KVM sanal makinelerinin her biri kendi çekirdeğini ve işletim sistemini çalıştırır. Bu, güçlü bir izolasyon sağlar ama bellek ve disk açısından daha ağır bir yapıdır. Docker gibi konteyner teknolojileri ise ana sistemin çekirdeğini paylaşır ve bu sayede çok daha hafif, hızlı başlayan bir yapı sunar. İkisi birbirinin yerini almaz; farklı problemleri çözer. KVM ile birlikte çalışan QEMU'nun resmi belgeleri, sanallaştırma seçeneklerini ayrıntılı anlatır.
Farklı bir işletim sistemi çalıştırmanız gerekiyorsa, örneğin bir Linux sunucuda Windows sanal makinesi çalıştırmak istiyorsanız KVM zorunludur; çünkü konteynerler ana sistemle aynı çekirdek ailesini paylaşmak zorundadır. Mikroservis mimarilerinde hızlı başlangıç ve yüksek yoğunluk öncelikliyse konteyner daha uygun bir seçimdir. Birçok üretim ortamında ikisi bir arada kullanılır: KVM sanal makineleri içinde Docker konteynerleri çalıştırmak hem izolasyon hem esneklik sağlayan yaygın bir mimaridir.
Kaynak tüketimi açısından da fark belirgindir. Bir KVM sanal makinesi genelde en az 512 MB-1 GB RAM ve birkaç GB disk ile başlar; çünkü tam bir işletim sistemi taşır. Bir konteyner ise yalnızca uygulamayı ve gerekli kütüphaneleri içerdiği için birkaç on MB ile çalışmaya başlayabilir. Bu fark, aynı donanımda kaç izole birim çalıştırabileceğinizi doğrudan belirler.
Güvenlik açısından da KVM daha güçlü bir sınır çizer. Bir konteynerden kaçış (container escape) zafiyeti, doğru yapılandırılmamış bir sistemde ana makineye erişim riski taşır. Sanal makinede aynı zafiyet sınıfını uygulamak çok daha zordur; çünkü donanım seviyesinde ayrı bir çekirdek çalışır. Bu yüzden çok kiracılı (multi-tenant) barındırma hizmetlerinin çoğu, müşteri izolasyonu için hâlâ KVM tabanlı sanal makineleri tercih eder.
Performans İnceliği: virtio Sürücüleri
Varsayılan disk ve ağ sürücüleri yerine virtio tabanlı paravirtualize sürücüler kullanmak, sanal makinenin performansını belirgin biçimde artırır. virt-install ile makine oluştururken disk ve ağ arayüzünü açıkça virtio olarak belirtirsiniz:
sudo virt-install --disk path=/var/lib/libvirt/images/vm1.qcow2,size=20,bus=virtio \\
--network network=default,model=virtio
Windows sanal makineleri için virtio sürücülerini önceden ISO olarak indirip kurulum sırasında yüklemeniz gerekir; çünkü Windows bu sürücüleri varsayılan olarak tanımaz. Linux dağıtımlarının çoğu virtio desteğini çekirdeğe zaten gömülü getirir ve bu yüzden ek bir adım gerekmez.
CPU pinning, performans kritik iş yüklerinde işe yarayan bir başka tekniktir. Belirli vCPU'ları fiziksel çekirdeklere sabitleyerek zamanlayıcı gecikmelerini azaltırsınız:
virsh vcpupin ubuntu-vm1 0 2
virsh vcpupin ubuntu-vm1 1 3
Bellek tarafında da benzer bir kazanç hugepages kullanılarak elde edilir. Büyük bellek sayfaları sanal makinenin bellek erişim gecikmesini azaltır ve özellikle veritabanı iş yüklerinde fark yaratır. Bu ayar /etc/libvirt/qemu.conf dosyasında etkinleştirilir ve makine tanımına eklenir.
KVM ve libvirt hakkında güncel ve resmi dokümantasyona Ubuntu'nun sanallaştırma rehberlerinden ulaşırsınız; sürüm bazlı ayrıntılar için ilk başvurulacak kaynak burasıdır. virtio sürücüleri, CPU pinning ve hugepages birlikte kullanıldığında sanal makine fiziksel donanıma çok yakın bir performansa ulaşır.
Henüz yorum yok.
Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.