VPS Qemu

Iš Žinynas.
11:13, 15 liepos 2020 versija, sukurta \dev\null (Aptarimas | indėlis)
(skirt) ← Ankstesnė versija | Dabartinė versija (skirt) | Vėlesnė versija → (skirt)
Jump to navigation Jump to search

Šiame straipsnyje aprašoma kaip įdiegti bei valdyti Qemu paremta Linux hipervisoriaus virtualizacija Debian GNU/Linux distribucijoje. Informacija taikytina ir kitoms panašioms distribucijoms bei sistemoms.

Diegimas[keisti]

apt-get install qemu-kvm libvirt-bin virtinst

Tinklo konfigūravimas[keisti]

Plačiau apie tinklus

Bridge tipo fizinis tinklas (Išoriniai ip)[keisti]

apt install resolvconf bridge-utils

Standartinis /etc/network/interfaces maždaug atrodo taip:

allow-hotplug eth0
iface eth0 inet dhcp

Užkomentuodami pastarąsias eilutes, pridedame teksto:

iface eth0 manual
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_maxwait 0
bridge_fd 0

Išsaugome failą, tuomet atsidarome /etc/sysctl.conf ir įrašome šias eilutes (išjungiame nenaudojamą ipv6 bridžinimą):

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

Išsaugome ir paleidžiame:

/sbin/sysctl -p /etc/sysctl.conf

Tuomet reikia pridėti šias eilutes į /etc/rc.local (būtų gerai rankomis dar prieš exit eilutę, jeigu pastaroji yra):

echo "iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu" >> /etc/rc.local

Galų gale kuriant VPS galima bus panaudoti parametrą, pvz.: --bridge=br0,model=rtl8139,mac=54:52:01:94:92:96 Arba, tinklo konfigūracijos XML apačioje.

 
  <interface type='bridge'>
      <mac address='52:54:00:00:99:c5'/>
      <source bridge='br0'/>
    </interface>

Dabar mums reikia kreiptis į ISP arba Hostingo provaiderį, kad kiekvienam papildomam ip adresui priskirtų po atskirą MAC adresą, kai gausime sąrašą galime konfigūruoti virtualių mašinų ip adresus, pvz.:

iface eth0 inet static
 address PAP_IL_DOM_AS_IP
 netmask 255.255.255.0
 gateway GATEWAY_KAIP_IR_HYPERVISORIUJE
 dns-nameservers 1.1.1.1 8.8.8.8

Perkrauname ir žiūrime koks bus rezultatas, visada galima pasitelkti tcpdump ir stebėti vnet0 kaip eina paketai.


NAT'intas bridžintas virtualus tinklas[keisti]

Sukuriam failą vps_tinklas.xml kurio viduje turim turėti:

<network>
       <name>tinklas</name>
       <bridge name="virbr10" />
       <forward mode="nat"/>
       <ip address="10.0.0.1" netmask="255.255.255.0">
         <dhcp>
           <range start="10.0.0.2" end="10.0.0.254" />
         </dhcp>
       </ip>
</network>

Sukuriam šį tinklą per virsh

# net-create --file /pathas/iki/failo/vps_tinklas.xml
# net-start tinklas
# net-autostart tinklas

Priskiriame tinklą kokiam nors vps'ui, atsidarę jo konfigą:

 <interface type='network'>
 <mac address='52:54:00:b9:cc:31'/>
 <source network='tinklas'/>
 <model type='rtl8139'/>
 <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
 </interface>

NAT'intas į External IP tinklas[keisti]

Kai nėra galimybių užbindinti ip prie mac adresų. Pirmaiusia reikia sugeneruoti mac adresą kurį pripažintų libvirt

hexdump -vn3 -e '/3 "52:54:00"' -e '/1 ":%02x"' -e '"\n"' /dev/urandom

Tuomet reikia užkurti virtualų bridžą ir sudėti mūsų virtualaus tinklo 192.168.100.0/24 šliuzą

ip link add virbr10-dummy address 52:54:00:e6:1d:48 type dummy
brctl addbr virbr10
brctl stp virbr10 on
brctl addif virbr10 virbr10-dummy
ip address add 192.168.100.1/24 dev virbr10 broadcast 192.168.100.255

Vidinio tinklo vps konfigūracija būtų tokia:

iface ens3 inet static
  address 192.168.100.9
  network 192.168.100.0
  broadcast 192.168.100.255
  gateway 192.168.100.1
  dns-servers 1.1.1.1

Perforwardinam trafficą iš ir į external ip, tai pat nukreipdami į vidinį tinklo resurso ip

iptables -t nat -A POSTROUTING -s 192.168.100.9 -j SNAT --to-source EXTERNAL_IP
iptables -t nat -A PREROUTING -d EXTERNAL_IP -j DNAT --to-destination 192.168.100.9

Jokių papildomų portų forwardinti nereikia, vidinio ip adreso visi portai ir kiti resursai taps pasiekiami per išorinį pririštą ip. O pačio vps xml tinklo konfigūracija būtų tokia:

 <interface type='bridge'>
     <mac address='52:54:00:47:9e:bd'/>
     <model type='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
   </interface>

Diegiant naują vps, reiktų naudoti šiuos tinklo parametrus

--bridge=virbr10

PASTABA! Tinklas jau buvo sukonfiguruotas taip, kad jo pagrindinis interfeisas sukištas į br0 taip pat ten sudėti ir visi papildomi external ip adresai.

Tinklas pagal nutylėjimą[keisti]

# virsh net-start default
# virsh net-autostart default

Paleidimas[keisti]

/etc/init.d/libvirtd start

Virtualių VPS mašinų valdymas[keisti]

Įeiname į virsh VPS valdymo komandinę konsolę parašę "virsh". Arba šias komandas vykdome iš shell'o darašius priekyje virsh, pvz.: virsh destroy vps_pavadinimas.

Sukūrimas[keisti]

create_vps skriptas su komentarais, kuriuos būtinai perskaitykite ir pagal tai keiskite jo konfigūraciją.

#!/bin/sh
truncate --size=50192M /srv/vps/windows.img # Virtualus 50GB diskas (truncate reiškia, kad jis bus sukurtas ne pilnos 50GB talpos, o pagal VPS užimtą vietą)
virt-install --force -r 1596 -n Win10 \ # nurodome 1596MB Ram ir pavadinimą Win10
 --os-type=windows \ # Nurodome OS tipą
 -f /srv/vps/windows.img \ # Nurodome HDD atvaizdą
 --network network:tinklas \  # Nurodome tinko tipą (APIE TINKLO KONFIGŪRACIJĄ APRAŠYTA VIRŠUJE)
 --cdrom /srv/vps/win10.iso \ # Nurodome ISO failą iš kurio diegsime operacijų sistemą
 --graphics vnc,password=slaptazodis,listen=0.0.0.0,port=5913 # Nurodome VNC serverio portą bei slaptažodį
echo "VPS Sukurtas"

Galimos problemos su win7/8/10 diegimu senesnėse libvirt versijose todėl reiktų keletos pakeitimų skripte:

virt-install --force -r 1596 --vcpus=2 -n Win7 \
--os-type=windows --noapic --noreboot \
-f /srv/vps/windows.img \
--network network:tinklas \
--cdrom /srv/vps/windows7.iso \
--graphics vnc,password=slaptazodis,listen=0.0.0.0,port=5913

Valdymas[keisti]

# virsh list
# virsh start vps_pavadinimas
# vncdisplay vps_pavadinimas # parodo kaip sukonfigūruotas VNC serveris
# nodeinfo # informacija apie VPS
# list # parodo visus veikiančius VPS
# setmem <vps_pavadinimas> 16G --config # suteikti daugiau darbinės atminties (tik išjungtam hostui)

CPU priskyrimai

Konfiguracijos koregavimas[keisti]

Jeigu norint pakeisti viena ar kita parametra, pvz.: prideti cpu branduoliu arba prideti ram, pakeisti aparatine iranga, reikia atsidaryti guest'o konfiga su komanda:

# virsh edit <vps_pavadinimas>

Didinam cpu resursus (statiniai cpu)

<vcpu placement=’static’>8</vcpu>

Keiciam cpu loginius resursus bei cpu modeli ir t.t.

<cpu>
<model>power8</model> 
<topology sockets=’1’ cores=’2’ threads=’4’/>
</cpu>

Po viso sito, virsh shutdown <vps_pavadinimas>, virsh start <vps_pavadinimas>

Krovimas is CDROM[keisti]

virsh edit <virtualas>

Pridedam sias eilutes tarp <os> </os>

   <boot dev='cdrom'/>
   <boot dev='hd'/>
   <bootmenu enable='yes'/>

Virtualaus disko prapletimas[keisti]

Prieš ką nors darydami pirmiausia išjungiame virtualią mašiną Pažiūrime info:

virt-filesystems --long -h --all -a olddisk

Praplečiame diską papildomais 5GB

truncate -r olddisk newdisk
truncate -s +5G newdisk

Particijų dydžių keitimas tiesiogiai virtualiame hdd (PASTABA! particija yra sename disko imidže)

virt-resize --expand /dev/sda2 olddisk newdisk

Įjungiame mašiną

Virtualaus disko konvertavimas i cow2 format[keisti]

qemu-img convert -f raw -O qcow2 /path/to/your/hdd/vm01.img /path/to/your/hdd/vm01.qcow2

Po to nepamirstame pakeisti disko tipo:

virsh edit <vm>

Virtualių diskų managinimas[keisti]

apt-get install libguestfs-tools
guestfish -a vps.img
 Welcome to guestfish, the guest filesystem shell for
 editing virtual machine filesystems and disk images.

 Type: 'help' for help on commands
      'man' to read the manual
      'quit' to quit the shell

><fs> run
 100% [###########################################################################################################################################################################################################] 00:00
><fs> 
><fs> list-filesystems
/dev/sda1: ext4
/dev/sda2: ext4
><fs> fsck ext4 /dev/sda1

Virtualių diskų pridėjimas[keisti]

Sukuriame diską:

truncate --size=30192M /srv/vps/30additional.img

Sukuriame konfiga /srv/vps/NewStorage.xml

  <disk type='file' device='disk'>
   <driver name='qemu' type='raw' cache='none'/>
   <source file='/srv/vps/30additional.img'/>
   <target dev='hdd' bus='virtio'/>
 </disk>

Prijungiame:

virsh attach-device Win10 NewStorage.xml

Jeigu norime prijungti diską ne vienam kartui tuomet pridedame parametrą "--persistent"

virsh attach-device --persistent Win10 NewStorage.xml

Jeigu tai windows Guest OS būtina papildomai įdiegti draiverius: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso viostor ir vioscsi Tuomet per disk manager initializuojame naują diską su pasirinkta failų sistema ir galime naudoti.

Pašalinimas[keisti]

Komandos skirtos išjungti ir pašalinti virtualų hostą:

# destroy vps_pavadinimas
# undefine vps_pavadinimas

Atvaizdu akturimas[keisti]

Apie netyčia arba tyčia ištrintų image atvaizdų atkūrimą, skaitykite photorec puslapyje.

Migracija[keisti]

Nukopijuojame hdd .img ar .qcow2 disko atvaizdus i naujaji serveri. Tuomet padarome vm'u konfiguraciju dump'us

virsh dumpxml <VPS> > manovps.xml
virsh net-dumpxml <tinklas> > netxml.xml

Kitoje masinoje rasome

virsh define manovps.xml
virsh net-define netxml.xml
virsh net-start <netname>
virsh net-autostart <netname>

Live Migracija[keisti]

Nukopijuojame vm hdd image:

scp {volume-file} {user}@{host}:{path}

Atliekame live migracija:

virsh migrate --live --copy-storage-all {vm-name} qemu+ssh://{host}/system

Ex.:

administrator@jungle:~$ scp test-vm/tmpZFu5C7.qcow2 forest.cnx.rice.edu:/homes/administrator/test-vm/tmpZFu5C7.qcow2
administrator@jungle:~$ virsh migrate --live --copy-storage-all test-vm qemu+ssh://forest.cnx.rice.edu/system