Domácí server s Debianem a Libvirtem s VLAN
How Can We Help?
Domácí server s Debianem a Libvirtem s VLAN
Úvod
Asi každý potřebuje v dnešní době mít doma nějaký ten server, se síťovými službami jako je NAS, DLNA, kamerový systém a mnoho dalších. Jak už tomu v oblasti IT bývá, možností, jak to zajistit je víc. Velké množství lidí sáhne po hotových řešení v podobě různých NAS serverů od Synology, QNAP, apod. Já bych vám rád představil jinou cestu, která je mnohem více flexibilní a přitom není finančně náročná.
Jedná se o využití serveru s virtualizační technologií, openvswitchem s podporou VLAN (případně bez, pokud váš router / switch VLANy nepodporuje). Výhoda je právě ta flexibilita. Na serveru máte virtualizační technologii, která vám umožňuje vytvářet dílčí virtuální servery podle potřeby a navíc v různých segmentech VLAN. To umožní odseparovat od sebe jednotlivé síťové služby s ohledem na bezpečnost.
Virtualizačních technologií je spousta. Já jsem jich postupně vyzkoušel několik. Za zmínku stojí:
- VMware vSphere Hypervisor – dost striktní z pohledu potřebného HW. Na mém serveru bohužel nefungovalo PCI Passthrough, takže jsem ho rychle zavrhl
- Xenserver – Toto řešení je sice na první pohled hezké, ale … Ideální pro provoz v clusteru. Jako samostatný server se mi neosvědčilo. Často vydávané aktualizace vedou k pravidelným restartům, což se v případě clasterového řešení vyřeší převodem virtuálního serveru z jednoho Xenserveru na jiný v rámci clasteru a následnému restartu.
- Qemu (KVM) – To je cesta, která se mi ve spojení s Libvirtem osvědčila a tedy ji dále rozvedu
Server
V podstatě lze použít jakýkoliv stroj, který má v sobě procesor s podporou VT-x (v postatě všechny dnešní procesory Intel a AMD)
Pokud budete chtít virtuálnímu serveru předat z fyzického nějakou PCI kartu, budete potřebovat ještě VT-d. Zde pozor, VT-d už taková samozřejmost není a je třeba zkontrolovat podporu u procesoru, čipové sady a díky občasné chybné implementaci BIOSu MB i to nemusí být zárukou, i když v poslední době se to hodně zlepšilo. USB lze předávat i bez VT-d.
Co se týče zvoleného CPU a množství RAM, je třeba to uvážit na základě toho, kolik virtuálů budete provozovat a jak náročné na výkon procesoru budou. Raději volit rezervu.
Pro představu:
- Já mám doma 3 roky starou I5 4670T a 32 GB RAM. Aktuálně provozuji 13 virtuálních serverů.
- Vloni jsem kamarádovi postavil servřík na MB s integrovaným intelem N3150 s 16GB RAM a provozuje bez problémů 5 virtuálů.
- Soused si vloni koupil repasovaný server od HP s XEONem 2. generace a 32 GB RAM za cca 7000,-. Dokoupil 3 TB WD Red a taky na tom má nějakých 10 virtuálů.
Ještě je vhodné, aby server měl 2 síťové rozhraní, jedno pro správu a jedno pro vswitch – není ale podmínkou
Počet SATA portů podle počtu HDD, které chcete připojit.
Jako disky se mi osvědčili WD Red
Systém
Jako systém budeme v našem návodu předpokládat Debian 9 Stretch, kterého určitě doporučuji pro jeho stabilitu …
Návod by měl být do jisté míry kompatibilní s debianími deriváty (Ubuntu, Mint, …), nicméně u těchto systémů nejsem v případě dotazů schopen zaručit 100% podporu z mé strany.
Debiana si nainstalujeme bez grafického prostředí, protože to samozřejmě nebudeme potřebovat.
Libvirt
Nejprve si nainstalujeme Libvirt a Openvswitch(OvS):
sudo apt-get install libvirt-daemon-system openvswitch-switch
Konfigurace OvS
Zkontrolujeme existenci patche v /etc/init.d/openvswitch-switch
sudo nano /etc/init.d/openvswitch-switch
Musí existovat řádek SYSTEMCTL_SKIP_REDIRECT=yes za _SYSTEMCTL_SKIP_REDIRECT=yes
### END INIT INFO (test -x /usr/sbin/ovs-vswitchd && test -x /usr/sbin/ovsdb-server) || exit 0 _SYSTEMCTL_SKIP_REDIRECT=yes SYSTEMCTL_SKIP_REDIRECT=yes . /usr/share/openvswitch/scripts/ovs-lib
Nejprve zjistíme jaká síťová rozhraní máme v systému:
ip a
Něco takového nám vyjede. V ukázce jsou 2 fyzické síťové rozhraní eth0 a eth1
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 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 valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP group default qlen 1000 link/ether 01:01:01:01:01:54 brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 01:01:01:01:01:7a brd ff:ff:ff:ff:ff:ff inet 192.168.xxx.xxx/24 brd 192.168.xxx.255 scope global eno1 valid_lft forever preferred_lft forever
Musíme se rozhodnout, jak které rozhraní použijeme. Jedno pro management a jedno pro OvS. Pokud máme jen jedno, není co rozhodovat. Bude sloužit pro obojí.
Nyní si upravíme nastavení sítě.
sudo nano /etc/network/interfaces
eth0 a eth1 si nahraďte svými hodnotami
Případ pro 1 LAN (eth0):
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback #allow-hotplug eth0 #iface eth0 inet dhcp # OvS allow-ovs br0 iface br0 inet static address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1 ovs_type OVSBridge ovs_ports eth0 allow-br0 eth0 iface eth0 inet manual ovs_bridge br0 ovs_type OVSPort
Pokud přidělujeme adresu pomocí DHCP, zadáme v řádku iface br0 inet static namísto static hodnotu dhcp a následně vynecháme řádky address, netmask a gateway
Případ pro 2 rozhraní (eth0 a eth1):
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet static address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1 # OvS allow-ovs br0 iface br0 inet manual ovs_type OVSBridge ovs_ports eth1 allow-br0 eth1 iface eth1 inet manual ovs_bridge br0 ovs_type OVSPort
V případě DHCP u eth0 analogicky stejně jako u 1 rozhraní.
Nyní restarujeme systém.
sudo reboot
Konfigurace Libvirt
Nejprve se přidáme do skupin libvirt a libvirt-qemu (username nahraďte svým):
sudo adduser <username> libvirt sudo adduser <username> libvirt-qemu
Obecné info
Konfigurační soubory jsou uloženy v /etc/libvirt a postupně se tam přidávají definice síťí, virtuálů, …
Data jsou uložena ve /var/lib/libvirt
V cestě pro data je třeba mít dost prostoru, protože tam budou i diskové img virtuálů, pokud se nerozhodnete využívat LVM (to v tomto návodu ale není popsáno).
Pokud vám umístění dat nevyhovuje, lze adresáře /var/lib/libvirt přenést jinam a udělat na něj link z /var/lib/libvirt na nové umístění.
Konfigurace se provádí z příkazového řádku pomocí příkazu virsh. Připojení k libvirtu se provádí pomocí příkazu
virsh --connect qemu:///system
v případě lokálního libvirtu, nebo
virsh -c qemu+ssh://<username>@<ip_address>/system
Dále existuje grafický nástroj Virtual Manager (balíček virt-manager), který ovšem je vždy trošičku pozadu v podpoře nových technologií. Virtual Manager bohužel neexistuje pro Windows.
Definování sítě s VLANy
OvS již máme nakonfigurovaný, a tak nyní provedeme konfiguraci v libvirtu. Nejprve si připravíme konfigurační XML soubor:
cd nano ovs-vlan.xml
Vložíme následující, s úpravami dle místních potřeb. Jeden segment by měl být defaultní:
<network> <name>ovs-vlan</name> <forward mode='bridge'/> <bridge name='br0'/> <virtualport type='openvswitch'/> <portgroup name='vlan-100' default='yes'> <vlan> <tag id='100'/> </vlan> </portgroup> <portgroup name='vlan-200'> <vlan> <tag id='200'/> </vlan> </portgroup> <portgroup name='vlan-300'> <vlan> <tag id='300'/> </vlan> </portgroup> <portgroup name='vlan-400'> <vlan> <tag id='400'/> </vlan> </portgroup> <portgroup name='vlan-500'> <vlan> <tag id='500'/> </vlan> </portgroup> </network>
Pokud VLAN nechceme, použijeme následují XML:
<network> <name>ovs-vlan</name> <forward mode='bridge'/> <bridge name='br0'/> <virtualport type='openvswitch'/> <portgroup name='default' default='yes'> </portgroup> </network>
Nyní se připojíme k libvirtu:
virsh --connect qemu:///system
a vytvoříme síť, spustíme jí, nastavíme jí jako automaticky spouštěnou a opustíme virsh:
net-define /home/<username>/ovs-vlan.xml net-start ovs-vlan net-autostart ovs-vlan quit
Definování virtuálního serveru
Protože v případě virtuálních serverů narozdíl od virtuálních pracovních stanic nové technologie typu GPU Passthrough, Virtio-GPU, … obvykle nepotřebujeme, doporučuji nainstalovat si někam Debianí desktop s Virtual Managerem (případně lze vyřešit pomocí VM ve Windows pomocí VirtualBoxu, …) a nakonfigurovat si virtuální servery pomocí něho.
Storage
Po instalaci libvirtu je aktivní storage repositář “default”, který odkazuje do /var/lib/libvirt/images
Je možné přidat další. Já např. přidávám “iso”, který odkazuje na /var/lib/libvirt/iso a do něj si dávám CD instalační image Debiana, případně něčeho dalšího, co budu instalovat vícekrát. Stáhnout cd image z internetu můžete pomocí příkazu wget .
Defaultně je jako disk využíván image QCOW2. Pomocí příkazu qemu-img lze vytvořit image qcow2, který se automaticky zvětšuje dle obsazeného místa, neboli určujete maximální velikost a image v reálu zabere pouze tolik místa, kolik dosud maximálně obsahoval. Image pak přiřadíte v průvodci při vytvoření VM ve Virtual Manageru.
Vytvoření 50GB image test.qcow2:
cd /var/lib/libvirt/images qemu-img create -f qcow2 test.qcow2 50G
Maximální velikost image lze pozdějí zvětšit. Zmenšit nelze.
Zvětšení o 20GB:
qemu-img resize test.qcow2 +20G
Další možnosti příkazu qemu-img si zobrazíte pomocí qemu-img –help
Zdroje informací
https://libvirt.org/
https://www.qemu.org/
https://www.openvswitch.org/
https://www.debian.org/