2 Ocak 2015 Cuma

KVM ile Ağ Ayarları


Bu yazıdaki başlık biraz aldatıcı oldu çünkü bütün ağ ayarlarını değil yalnızca kurup kullandığım, hakkında bilgi sahibi olduğum ayarları anlatacağım. Amacım iki fiziksel makinadaki sanal makinaları haberleştirmek. Bunu iki farklı yoldan anlatacağım. 

Gerekli deney ortamı için ethernet kartı olan iki fiziksel makina gerekli. Makinalarda RedHat 6.5 bulunuyor, qemu-kvm ve buna bağlı paketler kurulu. Host makinalarının birbiriyle haberleştikleri ağ kartı bende eth4 olduğundan ayarları buna göre vereceğim. Eğer makinada birden fazla boş ethernet portu varsa bir bağlantıyı hostların kendi aralarındaki iletişimi diğer bağlantıyı sanal makinaların kendi aralarındaki iletişime atamak yararlı olur. Son olarak kurulumda kullanılan CentOS yada RHEL iso'su yada DVD'si şimdilik bir kenarda dursun. Sanal makinaların kurulumu için tekrar ihtiyaç olacak. 

Yazının ileriki kısımlarında birinci fiziksel makinayı host01, üzerindeki sanal makinayı vm01; ikinci fiziksel makinayı host02 ve üzerindeki sanal makinayı vm02 olarak adlandıracağım. Her iki durum için de sanal makinaların aralarında haberleştikleri alt-ağ ile fiziksel makinaların aralarında haberleştikleri alt-ağ farklı olacak. 


Host makinaları kurulduktan sonra herhangi bir sorun olmaması için iptables kapatılmalıdır. Ben hostların arasındaki bağlantıyı noktadan noktaya olarak tanımladım ama bununla ilgili herhangi bir kısıtlama yok. İkinci host üzerindeki eth4'ün ayarları şöyle olmalı:

[root@host02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth4
DEVICE=eth4
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.5.6
NETMASK=255.255.255.252
IPV4_FAILURE_FATAL=yes
NAME="System eth4"


Uygun ayarlar host01 makinasında da yapılır ve makinaların birbirini pingleyebildikleri görülür. 

[root@host02 ~]# ping -c 4 192.168.5.5
PING 192.168.5.5 (192.168.5.5) 56(84) bytes of data.
64 bytes from 192.168.5.5: icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from 192.168.5.5: icmp_seq=2 ttl=64 time=0.096 ms
....


Birinci Yol: İki Makina Farklı Alt-ağlardaysa (Routed vNet)


Bu başlığın ilk paragraflarında anlatacaklarım aslında genel konfigürasyona ait. Bu ayarlar ikinci konfigürasyonda da kullanılacak ancak bu başlıkta yazacaklarıma da bağlantılı. 

Makinalar birbirlerinin root kullanıcılarına şifresiz ssh yapacak şekilde ayarlanır. Yukarıda saydığım paketlere ek olarak virt-manager ve virt-viewer gibi paketler de yüklenmelidir. Paketler yüklendiyse 'virt-manager' komutunu verince sanal makina yönetim penceresinin gelmesi gerekir. Bu pencerede önce 'File -> Add Connection' seçilir. Makinaların birbirini görmesi için yanda bulunan görseldeki ayarlar girilir ve bağlan'a basılır. Bağlantı başarılı olursa host makinaları birbirlerini ve üzerlerinde çalışan sanal makinalar vb. bilgileri görebilir. 


Fiziksel ağ bağlantı ayarları
Bu adımı sorunsuz geçtikten sonra her iki hostta birer sanal arabirim, Edit -> Connection Details'te çıkan pencerenin Virtual Networks sekmesinde oluşturulur. Burada sol alttaki "+" simgesine basılır. Verilecek ağ adının herhangi bir önemi yoktur. Ben her iki hostta da routnet adını seçtim ve örneklerde bunu kullanacağım. Alt-ağ olarak birinden farklı iki ağ seçilir. Ben host01 üzerinde ağ olarak 10.0.0.0/24 ve host02 üzerinde 10.0.1.0/24 ağını seçtim. DHCP'nin bir önemi yok. Sanal makinaların ihtiyaçlarına göre seçilebilir. Önemli olan kısım bu sanal ağın fiziksel ağa nasıl bağlanacağının seçilmesi. Burada "destination" olarak eth4 ve "mode" olarak "routed" seçilmeli. Görselde de görülüyor.

Oluşturulan sanal arabirim bundan sonra listede görünecek. Hem de ifconfig komutuyla görüntülenebilecek. Sanal makina kaynaklı bir paket de eth4 üzerindeki ağa yönlendirilecek. Bu işlemin her iki makinada da yapılması gerekiyor. 


Bundan sonra sanal makina kurulumu gelir. Host02'de makina adına vm02 verip kurulum için "local media" seçilir. Diğer makinayla bağlantı sağlandıysa "Connection:" olarak localhost yerine diğer makina seçilerek, sanal makinanın onda da oluşturulması sağlanabilir. Sonraki adımda kurulum için DVD yada iso dosyası seçilir. Ben iso'yu tercih ettim. Alt kısımda "OS type: Linux" ve "Version: Red Hat Enterprise Linux 6" gözden kaçırılmamalıdır. Bu ayarlar KVM'in çalışma parametrelerini iyileştirmesini sağlar ancak herhangi birşey seçilmemişse de sorunsuz çalışacaktır. 



Sanal arabirimin seçilmesi
Makinalar deneme amaçlı kurulduğundan diğer seçenekleri olduğu gibi bıraktım. Gerekirse bu bilgiler amaç doğrultusunda özelleştirilebilir. Bu seçeneklerde en önemli adım en son ekranda, "Advanced Options"a basınca ortaya çıkıyor. Bu adımda kurulacak sanal makinın ağ kartının hangi sanal ağda olacağı belirleniyor. Burada önceden oluşturulan routnet ağı seçilmelidir. Böylelikle sanal makina oluşturma sihirbazı tamamlanmış olur. Bu işlemi komut satırından yapmak için şu komut girilmelidir:

virt-install --virt-type kvm \
--os-type=linux --os-variant=rhel6 \
--name vm02 --ram=1024 \
--vcpus sockets=1,cores=1,threads=1 \
--autostart --force \
--location=file:///root/CentOS-6.5-x86_64-minimal.iso \
--disk path=/var/libvirt/images/vm02.img \
--vnc --network bridge=routnet,mac=52:54:00:c6:f3:f0 & 

Bu işlemin benzeri diğer hostta da gerçekleştirilir ve vm01'in kurulumu yapılır. İşletim sistemleri kurulduktan sonra ağ kartlarına uygun IP atamaları sanal ağın IP aralıkları gözönüne alınarak yapılır. Başka bir deyişle 10.0.1.0/24 tanımlı arabirimde 10.0.0.2 IP'li bir sanal makina tanımlanmamalıdır. Ben her iki makinaya son okteti .2 olarak IP verdim. Gateway olarak sanal arabirimin ifconfig çıktısında görülen ve son okteti büyük olasılıkla .1 olan IP verilmelidir. Son olarak yine herhangi bir sorun yaşamamak için iptables sanal makinalarda da devre dışı bırakılır. 

Herşey doğru olarak ayarlandıysa artık KVM bir sanal router olarak çalışarak vm01 kaynaklı paketleri host01'e ve vm02 kaynaklı paketleri host02'ye yönlendirir. Bundan sonra yapılacak tek iş host01'e gelen paketleri host02'ye göndermek ve geri dönüşler için tam tersini yapmaktır. O da şu şekilde yapılır: 

[root@host01 ~]# ip route add 10.0.1.0/24 via 192.168.5.6
[root@host02 ~]# ip route add 10.0.0.0/24 via 192.168.5.5

Bundan sonra artık sanal makinalar birbirlerini ping'leyebilir.


İkinci Yol: İki Makina Aynı Alt-ağdaysa (Virtual Bridge)

Burada tekrar sanal makina kurmamak için aynı makinaları kullanarak açıklayacağım ancak artık routnet ağına gerek kalmadı. Önce sanal makinalar kapatılır ve Edit -> Connection Details'te çıkan pencerenin Virtual Networks sekmesinde önceki adımda oluşturulan routnet sanal arabirimi durdurulur (kırmızı çarpı) sonra da silinir (çöp tenekesi). Yalnız silmeden önce göstermek istediğim birşey daha var. Komut satırında "virsh net-dumpxml routnet" komutuyla routnet'e ait bilgilerin olduğu xml görüntülenebilir veya "virsh net-edit routnet" komutuyla düzenlenebilir. 

Virtual Bridge kurulumu için fiziksel ethernet arabiriminde bazı ayar değişiklikleri yapılması gerekir. Aşağıda bu değişikler gösteriliyor. 

[root@host02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth4
DEVICE=eth4
ONBOOT=yes
BRIDGE=virtbr0

[root@host02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-virtbr0
DEVICE=virtbr0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.5.6
NETMASK=255.255.255.252
DELAY=0
STP=off

Önce arabirim için bir bridge oluşturulur. Sonrasında bu bridge'le aynı adda bir ifcfg dosyası oluşturulur. Artık IP tanımlamalarını burada yapmak gerekir. Son satıradaki STP=off, arabirimin bağlı olduğu switch portunda Root Guard yada benzeri bir teknoloji çalışıyorsa portun swtich'ten düşmesini engelleyecektir. İstenirse arabirimin gerçek bir bridge gibi davranarak .1q etiketli paketler de göndermesi sağlanabilir. Bunun için STP=off yerine VLAN=XX yazılmalıdır. Sonra host makinanın ağ servisleri yeniden (bazı durumlarda iki kere) başlatılmalıdır. 

Benzer değişiklikler diğer hostta da yapıldıktan sonra artık hostlar birbirlerini bridge arabirimden ping'leyebilmelidir. Her ne kadar eski sanal makinalar üzerinden anlatacağımı söylesem de eğer yeni sanal makina kurulacaksa son adımda virtbr0 bridge'ine karşılık gelen "host device" seçilir. 

Varolan sanal makinalar üzerinde değişiklik, ya sanal makinaya sağ tuşla tıklayıp Open -> Details'da soldaki listede ağ kartı seçilip, bunu virtbr0 arabirimine atanarak yada daha önce arabirim için anlattığım gibi xml'i düzenlenerek yapılır. Birinci yol zaten açık. İkinci yol için "virsh edit vm01" ile ilgili sanal makinanın xml'i vi'da açılır ve xml'in ilgili yeri aşağıdaki gibi değiştirilir.

<interface type='bridge'>
  <mac address='52:54:00:c6:f3:f0'/>
  <source bridge='virtbr0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</interface>

Dosya kaydedilir ve çıkılır. Virsh kullanılarak düzenlemenin getirisi çıkışta yazımı denetleyerek bir ayar hatasında vi'dan çıkmaya izin vermemesidir. Yoksa aynı işlem virsh dumpxml çıktısı dosyaya kaydedilip virsh define komutuyla da yapılabilir. 

Son olarak aynı işlem vm02 için tekrarlanır. Artık sanal makinalar sanal virtbr0 switch'ine takılmış gibi davranacaktır. Bu değişiklikler sanal makinalar açıkken algılanmaz. Kapalı olmaları gerekir yada kapanıp tekrar açılmaları gerekir. Her iki sanal makina açıldıktan sonra sanal makinaların IP ayarları aynı alt-ağ üzerinde olacak şekilde değiştirilmelidir. Daha önceki IP ayarları aynı kalmak üzere alt-ağ maskesi (subnet mask) 255.255.254.0 olarak değiştirilir ve GW'ler kaldırılırsa artık sanal makinalar birbirini ping'leyebilir duruma geleceklerdir.