Domácí server s Debianem a Libvirtem s VLAN

Domácí server s Debianem a Libvirtem s VLAN

You are here:
< Zpět

Ú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/

Poslední úprava článku March 26, 2018

Leave a Reply

Your email address will not be published. Required fields are marked *