CV #52het - 52 projekt

Virtualizáljunk Xen 4.6-tal Ubuntu 16-on (Xenial)

Alaprendszer telepítés és beállítás

Először is feltelepítjük az Ubuntu 16-ot (Xenial, 16.04.3 LTS, kernel: 4.4.0-87) default beállításokkal a hoszt gépre (Dom0), értelemszerűen. Hasznos, ha a telepítés közben a gépnek van internethozzáférése, a csomagok egy részét így frissen le tudja tölteni.

A partíciókat a következőképpen állítottam be (a méretek most nem fontosak, inkább a felépítés):

Partíciók XEN virtualizációhoz

Csomagokból csak az SSH-t tettem fel, a többit majd az apt-get megoldja, amikor már fut a rendszer:

Telepítendő alapcsomagok

Újraindulás után a következő alapvető csomagok szükségesek a Xen virtualizációhoz:

root@ub16:~# apt update
root@ub16:~# apt upgrade
root@ub16:~# apt install xen-hypervisor debootstrap
root@ub16:~# reboot

Ellenőrizzük a Xen telepítés sikerességét:

root@ub16:~# xl list
Name     ID  Mem VCPUs  State Time(s)
Domain-0  0 1896     1 r-----     8.7

Virtuális környezet építőelemei

A virtuális gépek (guest-ek, DomU-k) lemezeit nem tanácsos hagyományos fájlrendszeren tárolni, mivel annak alapvető működése némi overhead-et adhat az adatok írásánál/olvasásánál. Erre használjuk a korábban LVM-nek beállított partíciót (nekem most épp /dev/sda6).

Az LVM három fő komponensből épül fel:

  1. PV = physical volume, fizikai diszk, partíció vagy storage lun
  2. VG = volume group, nem szükségszerűen, de több PV-ből is állhat
  3. LV = logical volume, virtuális partíció vagy logikai diszk, ezt az objektumot tudja kezelni a virtulis gép

LVM építőelemei

root@ub16:~# pvcreate /dev/sda6
Physical volume "/dev/sda6" successfully created
root@ub16:~# vgcreate -s 256M vg01 /dev/sda6
Volume group "vg01" successfully created
root@ub16:~# lvcreate -l 16 vg01 -n lv-system
Logical volume "lv-system" created.
root@ub16:~# lvcreate -l 4 vg01 -n lv-swap
Logical volume "lv-swap" created.

Egy kis magyarázat a paraméterekhez:

root@ub16:~# pvs
PV         VG   Fmt  Attr PSize  PFree
/dev/sda6  vg01 lvm2 a--  14.25g 9.25g
root@ub16:~# vgs
VG   #PV #LV #SN Attr   VSize  VFree
vg01   1   2   0 wz--n- 14.25g 9.25g
root@ub16:~# lvs
LV        VG   Attr       LSize...
lv-swap   vg01 -wi-a----- 1.00g
lv-system vg01 -wi-a----- 4.00g

Virtuális gép létrehozása paravirtuálizációhoz, NAT-tal

Előkészítjük (megformázzuk) a két partíciót:

root@ub16:~# mkfs.ext4 /dev/vg01/lv-system
root@ub16:~# mkswap /dev/vg01/lv-swap

Első megoldásként paravirtuálizált (PV) rendszert hozunk létre, amihez a debootstrapet használjuk.

root@ub16:~# mkdir -p /mnt/vm && mount /dev/vg01/lv-system /mnt/vm
root@ub16:~# cd /mnt/vm
root@ub16:/mnt/vm# debootstrap xenial .

...

I: Base system installed successfully.
root@ub16:/mnt/vm# cp -pr /lib/modules/`uname -r`/ ./lib/modules/

Az alaprendszer egyes elemeit még indulás előtt testre kell szabni, beállítani.

Root jelszó megadása

root@ub16:/mnt/vm# chroot . /usr/bin/passwd

Környezet

root@ub16:/mnt/vm# cp /etc/apt/sources.list ./etc/apt/sources.list 
root@ub16:/mnt/vm# chroot . locale-gen "en_US.UTF-8"
root@ub16:/mnt/vm# chroot . dpkg-reconfigure tzdata
root@ub16:/mnt/vm# chroot . apt update
root@ub16:/mnt/vm# chroot . apt upgrade

SSH telepítése és beállítása

root@ub16:/mnt/vm# chroot . apt install ssh
root@ub16:/mnt/vm# sed -i "s/PermitRootLogin.*/PermitRootLogin yes/" ./etc/ssh/sshd_config

Partíciók meghatározása (/etc/fstab tartalma)

root@ub16:/mnt/vm# vi ./etc/fstab
# file_system mount_point type  options dump pass
proc             /proc           proc    defaults        0       0
/dev/xvda1       /               ext4    defaults,errors=remount-ro 0       1
/dev/xvda2       none            swap    sw              0       0

Hosztnév

root@ub16:/mnt/vm# vi ./etc/hostname
ub16-vm

Hálózati beállítások

root@ub16:/mnt/vm# vi ./etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.168.2
    netmask 255.255.255.0
    gateway 192.168.168.1
    dns-nameservers 8.8.8.8

A hoszt szerver (Dom0) beállítása

Ahhoz, hogy a virtuális gép zökkenőmentesen elinduljon a felkészítés után, néhány dologról gondoskodni kell a Dom0-n:

Xen konfiguráció

Alapesetben a Xen úgy van beállítva, hogy a guest-eket bridge-elt kapcsolaton keresztül lássa el hálózattal. Ezt most átállítjuk NAT típusúra. Ehhez a következő fájlokban eképpen kell módosítani a konfigot:

root@ub16:~# vi /etc/xen/xend-config.sxp

...

#(vif-script vif-bridge)

...

(network-script network-nat)
(vif-script     vif-nat)

...
root@ub16:~# vi /etc/xen/xl.conf

...

vif.default.script="vif-nat"

...

Hálózat beállítása NATolásra

root@ub16:~# vi /etc/sysctl.conf

...

net.ipv4.ip_forward=1

...
root@ub16:~# mkdir /etc/firewall
root@ub16:~# vi /etc/firewall/firewall.sh
#!/bin/bash

echo iptables config...

IPT="/sbin/iptables"
IFACE_OUT="enp0s3" # ellenorizzuk a kovetkezo paranccsal: ip a

${IPT} --flush
${IPT} --flush --table nat
${IPT} --table nat --append POSTROUTING --out-interface ${IFACE_OUT} --jump MASQUERADE
${IPT} --append FORWARD --match state --state ESTABLISHED,RELATED --in-interface ${IFACE_OUT} --jump ACCEPT

${IPT} --append PREROUTING --table nat --source 192.168.168.0/24 --jump ACCEPT
root@ub16:~# vi /etc/rc.local

...

/bin/bash /etc/firewall/firewall.sh
exit 0

Guest konfig elkészítése

A konfigfájlokat a /etc/xen/machines könyvtárban fogjuk tárolni. Ahhoz, hogy a hoszt oprendszerrel automatikusan induljon a virtuális gép is, létrehozunk egy symlinket az /etc/xen/auto könyvtárban.

root@ub16:~# mkdir /etc/xen/{machines,auto}
root@ub16:~# vi /etc/xen/machines/vm.conf
kernel      = '/boot/vmlinuz-4.4.0-87-generic'
ramdisk     = '/boot/initrd.img-4.4.0-87-generic'
memory      = '1024'

root        = '/dev/xvda1 ro'
disk        = [
    'phy:/dev/vg01/lv-system,xvda1,w',
    'phy:/dev/vg01/lv-swap,xvda2,w',
]

name        = 'vm'

vif         = [ 'ip=192.168.168.2,mac=00:16:3E:00:00:02' ]

on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
vcpus       = '1'
extra       = 'xencons=tty1'
vnc         = '0'
sdl         = 0
opengl      = 0
serial      = 'pty'
tsc_mode    = 'default'
localtime   = 1
on_xend_start = 'start'
root@ub16:~# ln -s /etc/xen/machines/vm.conf /etc/xen/auto/
root@ub16:~# reboot

Ellenőrzés

Ellenőrizzük, hogy minden az elvártaknak megfelelően működik-e:

root@ub16:~# xl list
Name      ID  Mem VCPUs  State Time(s)
Domain-0   0  988     1 r-----     8.7
vm         1 1024     1 -b----     2.3

root@ub16:~# ssh 192.168.168.2
root@ub16-vm:~# ping index.hu
PING index.hu (217.20.130.99) 56(84) bytes of data.
64 bytes from index.hu (217.20.130.99): icmp_seq=1 ttl=56 time=5.25 ms
64 bytes from index.hu (217.20.130.99): icmp_seq=2 ttl=56 time=4.96 ms