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):
- 4 GB ext4, ami a root könyvtár lesz, bootable
- 2 GB swap, mert ennyi memória van a gépben
- maradék, itt most 15.5 GB LVM-ként lesz használva
Csomagokból csak az SSH-t tettem fel, a többit majd az apt-get megoldja, amikor már fut a rendszer:
Újraindulás után a következő alapvető csomagok szükségesek a Xen virtualizációhoz:
- xen-hypervisor
- debootstrap
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:
- PV = physical volume, fizikai diszk, partíció vagy storage lun
- VG = volume group, nem szükségszerűen, de több PV-ből is állhat
- LV = logical volume, virtuális partíció vagy logikai diszk, ezt az objektumot tudja kezelni a virtulis gép
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:
- vgcreate -s: meghatározza az extent méretét, azaz ekkora darabokból áll majd a logikai diszk, 256MB-nál kisebb diszkeket valószínűleg nem fogunk létrehozni, viszonylag könnyű vele számolni (4 db = 1GB). Persze meg lehet adni nagyobbat, mondjuk pont 1 GB-t, akkor még egyszerűbb a számolás.
- lvcreate -l: azt adja meg, hogy hány extentből álljon a logikai lemez, 16 annyit jelent, hogy 16 * 256MB = 4GB
- lvcreate -n: lv neve A fenti parancsok kiadása után így kell kinéznie az LVM struktúrának:
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ó
- környezet
- SSH
- partíciók (fstab)
- hosztnév
- hálózat
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ó
- hálózat beállítása NAT-ra
- virtuális gép definíciós fájl
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