Libvirt Networking
Libvirt Uzerinde Calisan Default Network
Asagidaki komut ile libvirt ile birlikte calisan networkler listelenebilir.
virsh net-list --all
Libvirt kurulumu ile birlikte gelen varsayilan networkun adi defaultdur. Ilk kurulumda otomatik olarak baslamaz, el ile baslastilmasi ve duruma gore autostart hale getirilmesi gerekebilir.
Bu network baslatildiktan sonra virbr0 adinda bir network interfaceinin olustugunu gorebiliriz. 4 numarali interface. Bu interface sanal bir switch gorevi gorur. Olusturulan sanal makineler bu switch'e bagliymis gibi davranir.
berk@berk-notebook:~/Documents/repos/docs$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 88:a4:c2:54:35:af brd ff:ff:ff:ff:ff:ff
3: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether cc:15:31:ea:8d:ff brd ff:ff:ff:ff:ff:ff
inet 192.168.1.178/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp0s20f3
valid_lft 70988sec preferred_lft 70988sec
inet6 fd00::bdfb:aa4a:5494:e47d/64 scope global temporary dynamic
valid_lft 29sec preferred_lft 29sec
inet6 fd00::a54a:d2b6:a31e:cbc2/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 29sec preferred_lft 29sec
inet6 fe80::e6c3:321a:f4cc:d0c2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:91:e2:8d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
DHCP ve DNSMASQ
Libvirt kurulumu ile birlikte gelen, arkada calisan bir process mevcut. Adi dnsmasq.
berk@berk-notebook:~/Documents/repos/docs$ ps aux | grep -i dnsmasq
libvirt+ 3777 0.0 0.0 11484 2348 ? S 09:19 0:01 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
root 3778 0.0 0.0 11484 1708 ? S 09:19 0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
dnsmasq 4765 0.7 2.9 2037796 470492 ? Ssl 09:19 6:04 mysqld
berk 911011 0.0 0.0 9144 2304 pts/0 S+ 23:22 0:00 grep --color=auto -i dnsmasq
Dnsmasq, kucuk networkler icin tasarlanmis DNS ve DHCP sunucusudur. Genellikle local networklerde DNS isteklerini cozmek, ip adresleri atamak ve ag yonetimini kolaylastirmak amaciyla kullanilir. Yani libvirt'in default networkunu kullandigimizda aslinda ipleri dagitan yazilim dnsmasq diyebiliriz.
Buradan dnsmasq'in configine bakarak dhcp-range'ini ogrenebiliriz. Bu ayarlar libvirt tarafindan otomatik olarak yapilir.
berk@berk-notebook:~/Documents/repos/docs$ sudo cat /var/lib/libvirt/dnsmasq/default.conf
[sudo] password for berk:
##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
## virsh net-edit default
## or other application using the libvirt API.
##
## dnsmasq conf file created by libvirt
strict-order
user=libvirt-dnsmasq
pid-file=/run/libvirt/network/default.pid
except-interface=lo
bind-dynamic
interface=virbr0
dhcp-range=192.168.122.2,192.168.122.254,255.255.255.0
dhcp-no-override
dhcp-authoritative
dhcp-lease-max=253
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
Linux bir makineye libvirt kurulumu yapildiginda ve default network aktif edildiginde otomatik olarak sanal bir bridge ve dhcp serveri otomatik olarak kuruluyor.
Sanal Makineler ve Libvirt'in Network Sistemi
Simdi sanal makinelerimizin durumlarini inceleyelim.
berk@berk-notebook:~/Documents/repos/docs$ virsh list --all
Id Name State
---------------------------------
- debian12-fresh shut off
- ubuntu24.04 shut off
Goruldugu uzere 2 adet sanal makine var ve ikisi de kapali gozukuyor. virsh dumpxml
komutu ile bu sanal makinelerin ayar dosyalarini terminal uzerinde gorunteleyebiliriz.
berk@berk-notebook:~/Documents/repos/docs$ virsh dumpxml debian12-fresh | grep 'network='
<source network='default'/>
debian12-fresh isimli sanal makine network olarak default isimli networku kullaniyor. Yani Hypervisor olarak gorev yapan ana makinemizin uzerindeki virbr0 isimli interface uzerinden baglanti sagliyor.
Bu sanal makineyi calistirdiktan sonra gerceklesen degisiklikleri gozlemleyelim;
virsh start debian12-fresh
Sanal makinemizi baslattiktan sonra ip a komutu ile interfacelerimizi tekrar kontrol edelim:
14: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr0 state UNKNOWN group default qlen 1000
link/ether fe:54:00:81:86:f7 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe81:86f7/64 scope link
valid_lft forever preferred_lft forever
Yeni bir network interface'in belirdigini gozlemleyebiliriz. Bu olusan interface sanal makinenin bagli oldugu interfacedir. Gercekte sanal makinenin bagli oldugu switch olarak dusunebiliriz.
Ayrica Interface'in detaylarina baktigimizda master virbr0 state UNKNOWN
yazdigini gorebiliriz. Yani bu interface virbr0
isimli interface'e bagli. virbr0 da default isimli libvirt networkunun olusturdugu interface. Basitce asagidaki gibi gorsellestirebiliriz.
Hypervisor (KVM Host) Uzerindeki Routing Table
Trafik host uzerindeki routing table kurallarina gore yonlenir. Host berkbal.com'a ulasmak istediginde gateway uzerinden yonlenir. Asagidaki komut ile routing table'a goz atabiliriz.
berk@berk-notebook:~/Documents/repos/docs$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 600 0 0 wlp0s20f3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-970466c5d983
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-4b58726a0486
172.20.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-8fdaf0fbab2e
192.168.1.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp0s20f3
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
berk@berk-notebook:~/Documents/repos/docs$
default isimli kaynak wlp0s20f3
isimli interface uzerinden internete cikis yapiyor.
Lıbvırt'in varsayılan network yapisi bu sekilde calisiyor.
Bridge Olusturmak
Varsayilan bridge'i kullanmak istemiyorsak veya baska bir bridge ihtiyaci duyuyorsak yeni bir birdge olusturabiliriz.
ip
isimli araci kullanarak yeni bir bridge aygiti ekleyebiliriz.
ip link add name br1 type bridge
Bu sekilde bir bridge tanimladiktan sonra bunu default libvirt network yapisinda oldugu gibi fiziksel ethernet cihazina baglamamiz gerekiyor.
ip link set eno1 master br1
Buradaki eno1 fiziksel cihazinizi temsil eden interface olmali.
Simdi ekledigimiz bridge'e bir ip adresi verelim.
ip addr add 192.168.1.4/24 dev br1 brd 192.168.1.255
ip a
komutunun ciktisina baktigimizda bu interfacein bir ip adresine sahip oldugunu gorebiliriz.
18: br1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 16:6f:bb:49:6a:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.7/16 brd 192.168.255.255 scope global br1
valid_lft forever preferred_lft forever
interface'in state'i DOWN durumda. Ayaga kaldiralim:
ip link set up br1
Tekrar ip a komutu ile kontrol ettigimizde state UP olarak gormeliyiz.
18: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 16:6f:bb:49:6a:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.7/16 brd 192.168.255.255 scope global br1
valid_lft forever preferred_lft forever
inet6 fd00::d287:2e0d:95f7:bee6/64 scope global temporary dynamic
valid_lft 30sec preferred_lft 30sec
inet6 fd00::146f:bbff:fe49:6a09/64 scope global dynamic mngtmpaddr
valid_lft 30sec preferred_lft 30sec
inet6 fe80::146f:bbff:fe49:6a09/64 scope link
valid_lft forever preferred_lft forever
route add default gw 192.168.1.1
<>