1. Giriş

1.1. Belgenin Amacı

Bu belge Dell PowerEdge sunucularda Red Hat Linux Enterprise 7 üzerinde KVM (Kernel-based Virtual Machine) sanallaştırma ortamanın kurulum ve yönetimini ele almaktadır. Bu sanallaştırma veya KVM üzerine derin bir makale değildir ancak fiziksel sunuculara nasıl kurulacağı ve yöneteceği konusunda takip etmesi kolay bir açıklama sunmaktadır.

Muhtemelen sanallaştırmanın en büyük avantajı maliyet tasarrufudur. En küçük kurulumda bile donanım ve zamana maliyetinden tasarruf edebilirsiniz. Örnek olarak ben kendi laboratuvarımda 3 ayrı fiziksel sunucu tüm servislerimi programlarımı çalıştırıyordum, şimdi 1 fiziksel sunucuda 4 sanal makine (cpu, bellek ve depolama kaynakları birbirinden ayrı) çalıştırıyorum. Bu belgede kendi laboratuvarımdaki sanal ortamın oluşturmak için atılacak adımları ve nasıl yönetileceğini paylaşacağım.

Laboratuvar ortamında Windows makine kullanmıyorum, sadece Linux sanal makineleri bulunuyor. Windows makine kurma adımları da Linux makine kurma adımlarıyla birebir aynı ancak haricen kurulması gereken virtio sürücüsü bulunmaktadır. Bu sürücü ile birlikte Windows daha performanslı çalışabilecektir.

1.2. KVM Hakkında Kısa Bilgi

KVM hakkında bir kaç satır, sonrasında eğlenceli kısma geçebiliriz. KVM İntel ve AMD işlemciler üzerindeki sanallaştırma özelliğine erişim imkanı olan kullanıcı alanındaki (user space) programlara erişen Linux kernel modülüdür. KVM kernel modülü ile birlikte sanal makineler kullanıcı alanında sıradan süreçler olarak çalışabilir.

KVM donanım G/Ç (Giriş/Çıkış, I/O) öykünmesi (emulation) için QEMU kullanır. QEMU kullanıcı alanındaki öykünücü olarak konuk (guest) süreçlerin, ev sahibi (host) üzerindeki süreçlerde daha düzgün çalışması için öykünür. KVM kernel modülü sayesinde bu öykünme süreçleri çok hissedilmemekte ve neredeyse doğal hıza erişilebilmektedir.

KVM, libvirt API ve araçları ile yönetilir. Bu belgede şu araçlar gözden geçirilecektir; virsh, virt-install, virt-clone

1.3. Terimler

Bazı terim ve kullanım şekilleri üzerinde anlaşalım:

  • Host - Sanallaştırma ortamı veya üzerinde sanal makine konumlandırılan fiziksel sunucu
  • VMs - Fiziksel sunucu üzerinde konumlandırılmış sanal makinelerdir. Bazı çevrimiçi belgelerde “domain” veya “guests” olarak da karşılaşılabilir.
Belge içerisinde bu şekilde belirtlen yerler komut satırı veya çıktılardır.

2. Ortam Hazırlığı

2.1. Donanım

4-8 sanal makine için 2 soket (her birisi için 4-6 çekirdek), 8-16 GB bellek ve 100 GB disk alanı yeterli olmakla birlikte buradaki kaynak tanımları sizin ihtiyaçlarınıza göre değişecektir. Ben laboratuvarımda PowerEdge T610 için 2 Intel Xeon 4-core 5520 işlemci, 16 GB bellek ve 160 GB disk alanı ile kolaylıkla 8-10 RHEL çalıştırabileceğim. Tabi bu sunucular ağır işler yapmayacak. Çoğu sanal makine 1 GB bellek, 1 sanal çekirdek (vCPU) ve 15 GB civarında disk alanına ihtiyaç duyacak.

KVM içerisindeki en mükemmel özelliği aşırı kararlılık (overcommitting) konsepti ile host üzerinde erişilebilecek fazladan CPU ve bellek varsa bunlar kullanılabilir. Sanal makineler sadece ihtiyaçları kadar kaynak kullanırken diğer sanal makineler ayrılmamış kaynakları kullanır. Bundan ötürü sanal makine kaynak planı yaparken sahip olduğunuz kaynaktan daha fazlasını ayırabileceğinizi unutmayın ama bu durumda kullanım sınırın host üzerindeki kaynak kapasitesini aşmayacağını unutmayın.

2.2 Sanallaştırma Teknolojisi

Sunucunun BIOS’unda VT (Virtualization Technology) aktif mi doğrulayın. Bunun için sunucuyu yeniden başlatıp F2 ile BIOS’a ulaşıp (fiziksel makineden makineye değişebilir) “Processors Settings” üzerinden “Virtualization Technology” seçeneğinin “Enabled” olduğunu doğrulayın. Eğer “Disabled” konumda ise “Enabled” hale getirip kaydedebiliriz.

Sunucuda VT açık mı diye kontrol etmek için yeniden başlatmadan da kontrol sağlamak mümkündür. Bunun için komut satırına aşağıdaki satırı yazmanız yeterlidir.

grep svm /proc/cpuinfo
grep vmx /proc/cpuinfo
  • vmx - Intel İşlemciler
  • svm - AMD İşlemciler

2.3. Gerekli Paketler

KVM için indirilmesi gereken bir RHEL 7’de varsayılı olarak bulunmayan paketler vardır.

yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-tools

libvirtd servisinin başlangıçta çalışacak şekilde konumlandırılması..

systemctl enable libvirtd && systemctl start libvirtd

Aşağıdaki kernel modüllerinin yüklenip yüklenmediğini kontrol edin.

  • kvm
  • kvm_intel
lsmod | grep -i kvm
kvm_intel             188793  0
kvm                   653928  1 kvm_intel
irqbypass              13503  1 kvm

2.4. İşletim Sistemi İndirme Kaynağı

Sanal makineleri kurmak için işletim sistemleri kurulum kaynaklarına ihtiyacınız olacak. Iso veya ağ üzerinden kurulum(nfs, ftp, http) yöntemleri kullanılabilir.

2.5. Disk Alanı

Sanal makinenin imajı varsayılan olarak /var/lib/libvirt/images dizininde oluşturulur ama oluşturma aşamasında nerede oluşturacağınızı seçenebilirsiniz. Ancak tercih edeceğiniz dizinin bulunduğu disk bölümünde yeterli alan olduğuna emin olmalısınız. Örnek olarak ben bu makalede /vm-images dizinini kullanacağım.

KVM bir kaç farklı sanal makine imaj formatı desteklemekteyken bunların hepsi host üzerindeki disk alanını kullanmaktadır. Bu makalede, sanal makineler için raw dosya formatını kulanacağız. Bunun sebebi tüm formatlar arasına verilen disk boyutunu tam anlamıyla kullanabildiğimiz format olmasıdır.

Bu durumda uygulanabilecek en iyi pratik, sanal makinelerde ihtiyaç duyacağınız alandan biraz daha fazlasını tanımlamaktır. Bugünlerde diskler daha ucuz olduğu için burada bir sorun çıkmayacağını düşünüyorum.

2.6. Ağ

Varsayılan olarak sanal makineler sadece içinde bulundukları network ve host ile iletişim kurabilirler. Eğer sanal makinenin LAN’a bağlanmasını istiyorsanız köprü (bridge) oluşturmalısınız.

  1. “br0” adında bir köprü oluşturalım.
BRIDGE=br0
  1. /etc/sysconfig/network-scripts/ifcfg-br0 adında bir dosya oluşturup aşağıdakileri içine yazalım.
DEVICE=br0
BOOTPROTO="dhcp"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
ONBOOT="yes"
TYPE="Bridge"
DELAY="0"
  1. /etc/sysctl.conf dosyasına aşağıdaki satırı ekleyin, varsa değerini değiştirin.
net.ipv4.ip_forward = 1

sonrasında aşağıdaki komutu çalıştırın

sysctl -p /etc/sysctl.conf
  1. Son olarak NetworkManager servisini yeniden başlatın ve oluşacak yeni köprü ve IP adresini göreceksiniz.
systemctl restart NetworkManager

2.7. Firewalld

RHEL 6’da varsayılan paket filtreleme ve yönlendirme servisi iptables’dı. RHEL 7’de bu işi ayı kapasitede filtreleme ve yönlendirme yeteneklerine sahip firewalld varsayılan olarak yapıyor. Bunun yanı sıra ağ bölgeleri (network zones) aracılığı ile dinamik olarak kural yazma ve ağı yönetme imkanı tanımaktadır.

RHEL 7’de iptables hala bulunmatadır ve firewalld’nin kernel ile konuşmasına aracılık ettiği durumlar söz konusudur. Eğer ağı yönetmek için tercihiniz iptables olacaksa, kullnabilirsiniz.

2.8. SELinux

Eğer sistemde SELinux’u aktif olarak kullanıyorsanız dikkate almanız ve varsayılan olmayan ayarları kullandığınız durumda sorun oluşmaması için yapmanız gereken ayarlar vardır. Örnek olarak /var/lib/libvirt/images normalde imajların bulunduğu dizinken bunu /vm-images yaptığımızı düşünelim.

  1. Dizini oluştur.

     mkdir /vm-images
    
  2. Policycoreutils-pythob paketin indir.

     yum -y install policycoreutils-python
    
  3. Dizin için güvenlik tanımlarını yap.

     semanage fcontext --add -t virt_image_t '/vm-images(/.*)?'
    

    Bu ayarı doğrulamak için;

     semanage fcontext -l | grep virt_image_t
    
  4. Güvenlik bağlamını yükle, virt_image_t bağlamanı aktif hale getir.

     restorecon -R -v /vm-image
    

    Değişiklikleri görmek için

     ls -aZ /vm-images
    
  5. Eğer bu dizini NFS veya samba üzerinden eklediyseniz aşağıdaki tanımları da yapmanı gerekmektedir.

     setsebool -P virt_use_samba 1
     setsebool -P virt_use_nfs 1
    

3. VM Oluşturma

Sanal makine oluşturmak için virt-install aracını kullanacağız. Bu araç etkileşimli veya etkileşimsiz çalıştırılabilir. Hadi, etkileşimsiz modu kullanarak RHEL 7 x64, vm01 adında sanal makine oluşturalım.

virt-install \
--network bridge:virbr0 \
--name vm01 \
--ram=1024 \
--vcpus=1 \
--disk path=/vm-images/vm01.img,size=10 \
--graphics none
--location=http:/serverrhel7.com/rhel7/ \
--extra-args="console=tty0 console=ttyS0,115200"

–network bridge:virbr0

Oluşturacağınız sanal makineyi ağa nasıl bağlayacağınızı belirtiyorsunuz. Ben burada körpü modunda virbr0 üzerinden sağlayacağım.

–name vm01

Sanal makinenin adı

–ram=1024

Sanal makineye MB boyutunda ayıracağımız bellek miktarı

–vcpus=1

Sanal makineye vCPU bazında kaç sanal çekirdek ayıracağımızı belirtiriz

–disk path=/vm-images/vm01.img,size=10

Oluşturacağımız diski nerede konumlandıracağı ve boyutunu belirleyeceğiz

–graphics none Kurulumun VNC olarak mı devam edeceği yoksa komut satırı üzerinden mi yapılacağı ile ilgili tanımı yaptığımız yerdir.

–location=http:/serverrhel7.com/rhel7/
Kurulum cd/dvd’si nereden indireceğini belirttiğimiz kısımdır

–cdrom /root/vm-iso/rhel7.iso

Eğer internette indirmek yerine yerel dosyalar arasındaki iso

–extra-args=”console=tty0 console=ttyS0,115200”

Kurulumda kernel için ekstra parametreleri buradan tanımlarız.

4. VM Klonlama

Mevcut bir sanal makineyi aynı konfigürasyon ve işletim sistemleri özelliklerine göre klonlamak isteyebiliriz.

  1. Öncelikle klonlanacak sanal makineyi kapatmamız gerekiyor.

     virsh suspend vm01
    
  2. Sonra klonlama komutu çalıştırılır.

     virt-clone \
     --connect qemu:///system \
     --origical vm01 \
     --name vm02 \
     --file /vm-images/vm02.img
    

    Bu opeasyon 2-3 dakika kadar sürebilmektedir. Dosya boyutuna göre uzayıp kısalacaktır.

  3. Sonra asıl makinenin çalışmasını devam ettirebiliriz.

     virsh resume vm01
     virsh start vm02
    

Klonlama sonrasında vm02 makinesi vm01’i kapattığımız noktadan devam edecektir. Eğer DHCP kapalıysa aynı IP adresini alacağı için vm01’in operasyonunu etkileyecektir. Bu yüzden klonlama sonrasında hızlıca IP ve hostname konfigürasyonunu yapımak önerilmektedir.

5. VM Yönetimi

Sanal makine yönetmek için kullanılacak belli başlı komutlar vardır. Bu bölümde bu komutları inceleyeceğiz.

5.1. Genel Görevler

  • Çalışan tüm makineleri listelemek;

      virsh list --all
    
  • Sanal makine bilgilerinin detaylarını göstermek için;

      virsh dominfo vm02
    
  • vCPU/Bellek kullanımını gözlemek için;

      virt-top
    
  • Sanal makinelerin disk bölümlerini incelemek için;

      virt-df vm01
    
  • Sanal makineyi kapatmak için;

      virsh stop vm01
    
  • Sanal makineyi başlatmak için;

      virsh start vm01
    
  • Sanal makineyi otomatik başlatmak için;

      virsh autostart vm01
    
  • Sanal makineyi elle başlayacak şekilde ayarlamak için;

      virsh autostart -disable vm01
    

5.2. Sanal Makine Konsol Erişimi

Eğer sunucuda X server çalışmıyorsa ve makinede bir ağ erişimi mevcut değilse bağlanmak için sanal makine seri konsol bağlantısını kullanmanız gerekmektedir. Bu durum fiziksel makinedeki konsol bağlantısından farksızdır. Bunu sağlamak için grub dosyasında (/etc/grub.conf) console=tty0 console ttyS0,115200 tanımları eklenmelidir.

Eğer bu tanım varsa seri bağlantı için kullanacağımız komut;

virsh console vm01

5.3. Sanal Makine Depolama Birimi Bağlantısı

Sanal makineye bir USB bağlamak veya ikincil disk bağlamak isteyebiliriz.

virsh attach-disk vm01 /dev/sdb vdb --driver qemu --mode shareable
  • vdb, sanal makine içerisinde bağlanacak olan
virsh detach-disk vm01 vdb

5.4. GUI Araçları

Komut satırı yerine grafik arayüz üzerinden çalışmak istenirse iki pakete ihtiyaç vardır. Bunlar virt-viewer ve virt-manager araçlarıdır.

yum install virt-manager virt-viewer

6. Sanal Makine Parametrelerini Değiştirme

Sanal makine özelliklerini kolaylıkla değiştirebiliriz.

6.1. Bellek

Sanal makine ayaktayken maksimum bellek, dinamik olarak değiştirilebilir. Varsayılan olarak maksimum bellek miktarı virt-install aşamasında belirlenmiştir.

Bir örnek üzerinden gitmek gerekirse; vm01 için 1GB bellek atanmıştı, bunu 512 MB yapalım.

  1. Öncelikle kullanılan miktara bakalım.

     virsh dominfo vm01 | grep memory
    
  2. Sonrasında değeri değiştirelim.

     virsh setmem 524288
    
  3. Kontrol edelim.

     virsh dominfo vm01 | grep memory
    

Bir farklı örnek olarak 512 yaptığımız bu makineyi 2 GB olarak güncelleyelim.

  1. 2 GB yapmanın en iyi yolu konfigürasyon dosyasını editlemekten geçiyor.

     virsh shutdown vm01
    
  2. Konfigürasyon dosyasını açalım.

     virsh edit vm01
    

    Bu doksyada memory kısmını bulup değiştirelim.

     <memory>2097152</memory>
    
  3. Bu dosyayı kullanarak makineyi yeniden oluşturalım.

     virsh create /etc/libvirt/qemu/vm01.xml
    
  4. Bellek durumuna bakalım.

     virsh dominfo vm01 | grep memory
    
  5. Burada max memory değerinin değiştiğini göreceğiz. Artık used memory arttırılabilir.

virsh setmem vm01 2097152
virsh dominfo vm01 | grep memory

6.2. vCPUs

Sanal çekirdek değerini değiştirmek için yukarıdaki yöntemin aynısını kullanacağız.

virsh shutdown vm01
virsh edit vm01
<cpu>2</cpu>
virsh create /etc/libvirt/qemu/vm01.xml

6.3. Disk Kapasitesi

Herhangi bir anda ekstra bir disk ekleyebilirsiniz. Bunun 10GB’lık bir disk üzerinden gösterelim.

  1. 10GB’lik bir disk oluşturalım.

     dd if=/dev/zero of=/vm-images/vm01-add.img bs=1M count=10240
    
  2. Makineyi kapat

     virsh shutdown vm01
    
  3. Harici bir disk eklemek için yine konfigürasyon dosyasında değişiklik yapacağız. Bunun için dosyayı açıp, mevcut disk bölümünü kopyalayım dosya lokasyon ve ismini değiştireceğiz.

     virsh edit vm01
    
     <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='threads'/>
      <source file='/vm-images/vm1.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04'
     function='0x0'/>
      </disk>
    

    Yukarıdaki kısmı kopyalayıp aşağıdakini oluşturalım. Bu sırada source ve address kısmında değişiklikler olacak.

     <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='threads'/>
      <source file='/vm-images/vm1-add.img'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06'
     function='0x0'/>
      </disk>
    
  4. Makineyi bu konfigürasyona göre yeniden başlatalım.

     virsh create /etc/libvirt/qemu/vm01.xml
    

7. VM Silme

Eğer bir makineye daha fazla ihtiyaç yoksa silmek isteyebilirsiniz.

  1. Sanal makineyi kapat.

     virsh shutdown vm01
    
     virsh destroy vm01
    
  2. Üzerindeki tanımları kaldır.

     virsh undefine vm01
    
  3. Son olarak imajı silelim.

     rm /vm-images/vm01.img
    

8. Sonuç

Bu belge KVM üzerinde basitçe bir sanal makine nasıl oluşturulur ve yönetiliri ele almıştır.

9. Kaynak

https://linux.dell.com/files/whitepapers/KVM_Virtualization_in_RHEL_7_Made_Easy.pdf