Gentoo + libvirt + kvm + vlan + bridge avagy virtualizáljunk kényelmesen!

Gentoo-logo

A Gentoo-ban az a szép, hogy rendszerépítés közben az ember folyamatosan tanul. Egyrészt megtanulja, hogy mi hol van a rendszerben, másrészt pedig rájön, hogy kell levezetni a keletkező feszültséget, ami akkor jelentkezik, mikor fél óra konfigurálás után jobb esetben nem indul, rosszabb esetben nem fordul a kernel.

Apropó vicc: Mit csinál az elméleti fizikus, ha úrrá lesz rajta az idegesség? Papírt és ceruzát vesz elő és levezeti.

Cél

Azt szeretnénk elérni, hogy a libvirt és a rajta keresztül kezelt virtuális gépek (esetemben KVM alatt futók) ki tudjanak szólni a külvilágba. Ha a külvilág az n-edik VLAN-on található, akkor oda. Továbbá szeretnénk, hogy a virtuális gépeket kattogtatós módszerrel lehessen piszkálgatni virt-manager-en aka. „Virtuális gép vezérlőpulton” keresztül.

Első lépés

A következő programok kellenek: qemu és libvirt. A qemu alapértelmezett flagjei tökéletesek, és a libvirt is majdnem jó, mindössze a virt-network-öt kell hozzáadni, hogy tudja kezelni a virtuális hálózatokat is. Ennek függősége a dnsmasq is, hozzá pedig a script flag. A virt-network azon funkcióját, amihez a dnsmasq kellene, nem fogjuk használni, így futnia sem kell, egyszerűen csak függőség. Tehát a packages.use-ba ez kerül:

app-emulation/libvirt virt-network
net-dns/dnsmasq script

Szükséges kernel beállítások

libvirt logo

Ez részben nekem is dokumentáció, hogy mit pontosan merre találok. Nem nagyon vagyok hajlandó még egyszer eljátszani a „merre vagy te kis szemét” játékot. Fontos, hogy a beállítások (helyei) a 3.15.10-hardened-r1 (Gentoo) kernel alapján készültek, szóval ha nem találod a helyükön, akkor valaki megint átpakolta őket…

Folyamatosan haladunk, fentről lefelé feloldva az esetleges beállításbeli függőségeket, így kövesd az elejétől a dolgokat, mert nem tudok (és akarok) minden függőséget minden beállításnál leírni. A menuconfig-ban megszokott jelöléseket használom. Tehát [*] beleforgatva, <M> pedig modul.

Kiindulópontunk: Networking support > Networking options. Ha jobban tetszik: chroot. :)

Itt vagyunk: >
Kernel opció: CONFIG_BRIDGE
Beállítás: <M> 802.1d Ethernet Bridging

Kernel opció: CONFIG_BRIDGE_IGMP_SNOOPING
Beállítás: [*] IGMP/MLD snooping

Kernel opció: CONFIG_BRIDGE_VLAN_FILTERING
Beállítás: [*] VLAN filtering

Kernel opció: CONFIG_VLAN_8021Q
Beállítás: <M> 802.1Q/802.1ad VLAN support

Kernel opció: CONFIG_VLAN_8021Q_GVRP
Beállítás: [*] GVRP (GARP VLAN Registration Protocol) support

Kernel opció: CONFIG_VLAN_8021Q_MVRP
Beállítás: [*] MBRP (Multiple VLAN Registration Protocol) support

Kernel opció: CONFIG_NETFILTER_ADVANCED
Függősége: [*] Network packet filtering framework (Netfilter)
Itt van: Network packet filtering framework (Netfilter) >
Beállítás: [*] Advanced netfilter configuration

Itt vagyunk: > Network packet filtering framework (Netfilter)
Kernel opció: CONFIG_BRIDGE_NF_EBTABLES
Beállítás: <M> Ethernet Brdige tables (ebtalbes) support

Itt vagyunk: > Network packet filtering framework (Netfilter) > Ethernet Bridge tables (ebtables) support
Kernel opció: CONFIG_BRIDGE_EBT_T_NAT
Beállítás: <M>ebt: nat table support

Kernel opció: CONFIG_BRIDGE_EBT_MARK_T
Beállítás: <M> ebt: mark target support

Kitartást, nincs már sok hátra!

Itt vagyunk: > Network packet filtering framework (Netfilter) > Core Netfilter Configuration
Kernel opció: CONFIG_NETFILTER_XT_MARK
Beállítás: <M> nfmark target and match support

Kernel opció: CONFIG_NETFILTER_XT_CONNMARK
Függősége: <M> Netfilter connection tracking support (CONFIG_NT_CONNTRACK)
Beállítás: <M> ctmark target and match support

Kernel opció: CONFIG_NETFILTER_XT_TARGET_CHECKSUM
Függősége:
Itt vagyunk: > Network packet filtering framework (Netfilter) > IP: Netfilter Configuration
<M> IP tables support (required for filtering/masq//NAT) (CONFIG_IP_NF_TABLES)
<M> Packet mangling (CONFIG_IP_NF_MANGLE)
Beállítás: <M> CHECKSUM target support
kvm logo
Itt vagyunk >
Kernel opció: CONFIG_NET_SCH_HTB
Függősége: [*] QoS and/or fair queueing (CONFIG_NET_SCHED)
Ezen belül van: QuS and/or fair queuing -->
Beállítás: <M> Hierarchical Token Bucket (HTB)

Itt vagyunk: > QoS and/or fair queuing
Kernel opció: CONFIG_NET_SCH_SFQ
Beállítás: <M> Stochastic Fairness Queueing

Kernel opció: CONFIG_NET_SCH_INGRESS
Függősége: [*] Actions (CONFIG_NET_CLS_ACT)
Beállítás: <M> Ingress Qdisc

Kernel opció: CONFIG_NET_CLS_FW
Beállítás:<M> Netfilter mark (FW)

Kernel opció:CONFIG_NET_CLS_U32
Beállítás: <M> Universal 32bit comparasions w/ hashing (u32)

Kernel opció:CONFIG_NET_ACT_POLICE
Beállítás: <M>Traffic Plicing

Majdnem végeztünk. Már csak annyi dolgod van, hogy telepíted a bridge-utils-t és ízlés szerint konfigurálod a hálózatodat.

~# emerge -avD bridge-utils

Itt pedig egy példa konfiguráció a /etc/conf.d/net-be:

bridge_br1="eno2"
rc_net_need_br1="net.eno2"
brctl_br1="setfd0 sethello 1 stp off"
#
config_br1="192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255"
routes_br1="default via 192.168.0.1"
dns_servers_br1="8.8.8.8"
#
vlans_br1="2, 3"
config_br1_2="null"
config_br1_3="null"

Kész. Innentől annyi virtuális gépet pakolsz be, amennyit csak szeretnél és arra a VLAN-ra, amelyikre csak szeretnéd. :)