Dott. Luca Tasquier

Transcript

Dott. Luca Tasquier
XEN
Dott. Luca Tasquier
E-mail: [email protected]
XEN
Xen è un VMM Open Source rilasciato sotto licenza GPL per
piattaforma x86 e compatibili (al momento è in corso il supporto
alle famiglie dei processori x86-64 e per IA-64) sviluppato presso il
Computer Laboratory dell'Università di Cambridge.
Xen consente una completa emulazione hardware senza andare a
ridurre in modo drastico le risorse del sistema, emulando sistemi
operativi diversi tra loro.
Architettura
Organizzazione
- Il VMM si occupa della virtualizzazione della CPU, della memoria
e dei dispositivi per ogni macchina virtuale.
- Xen dispone di un'interfaccia di controllo in grado di gestire la
divisione di queste risorse tra i vari domini.
- L'accesso a questa interfaccia di controllo è ristretta: può
essere controllata solamente utilizzando una VM privilegiata,
conosciuta come domain 0.
- In questo dominio viene eseguita l'applicazione software che
gestisce il controllo di tutta la piattaforma.
Caratteristiche
- Paravirtualizzazione: Le macchine virtuali eseguono direttamente
le istruzioni non privilegiate. L'esecuzione di istruzioni privilegiate
viene delegata al VMM tramite chiamate al VMM (hypercalls).
- Protezione (x86): I sistemi operativi guest OS sono collocati nel
ring 1; VMM collocato nel ring 0.
Protezione
- Memory split: lo spazio di indirizzamento virtuale è strutturato in
modo da contenere XEN e il kernel in segmenti separati.
Paginazione
- Gestione della Memoria: i SO guest accedono alla memoria
virtuale, mediante i tradizionali meccanismi di paginazione; per le
architetture x86 i page faults sono gestiti direttamente a livello HW
(TLB).
- Soluzione adottata: le tabelle delle pagine sono accessibili in
modalità read-only anche ai guest; in caso di necessità di update,
interviene il VMM che valida le richieste di update dei guest e le
esegue.
Gestione della memoria
I guest OS si occupano della paginazione, delegando al VMM la
scrittura delle PTE (Page Table Entry).
Le tabella della pagine devono essere create e verificate dal VMM
su richiesta dei guest: una volta create, rimangono Read-only per il
guest.
Creazione di un processo 1
Il SO guest richiede una nuova tabella delle pagine al VMM:
- Alla tabella vengono aggiunte le pagine appartenenti al segmento
di XEN.
- XEN registra la nuova tabella delle pagine e acquisisce il diritto di
scrittura esclusiva.
- Ogni successiva update da parte del guest provocherà un
protection-fault, la cui gestione comporterà la verifica e l’effettivo
aggiornamento della PT.
Creazione di un processo 2
Gestione della memoria:
balloon process
- La paginazione è a carico dei guest. Occorre un meccanismo
efficiente che consenta al VMM di reclamare ed ottenere, in caso
di necessità, dalle diverse macchine virtuali pagine di memoria
meno utilizzate.
- Soluzione: su ogni macchina virtuale è in esecuzione un
processo (balloon process) che comunica con il VMM.
- Su richiesta del VMM, il balloon si gonfia, richiedendo al so guest
altre pagine.
- La richiesta del balloon process provoca da parte del S.O. guest
l’allocazione di nuove pagine al balloon process che le cede quindi
al VMM.
Virtualizzazione della CPU 1
- Il VMM definisce un'architettura virtuale simile a quella del
processore, nella quale, però, le istruzioni privilegiate sono
sostituite da opportune hypercalls:
l'invocazione di una hypercall determina il passaggio da guest a
XEN (ring1 -> ring 0). I kernel dei sistemi guest devono essere
modificati di conseguenza.
Virtualizzazione della CPU 2
- Il VMM si occupa dello scheduling delle macchine virtuali;
Borrowed Virtual Time scheduling algorithm: si basa sulla
nozione di virtual-time. E' un algoritmo general-purpose che
consente, in caso di vincoli temporali stringenti (es. applicazioni
time dependent, TCP/IP, servizi RT..), di ottenere schedulazioni
efficienti.
Vengono utilizzati due clock: real-time (tempo del processore,
inizia al boot); virtual-time (associato alla VM, avanza solo quando
la VM esegue).
I tempi vengono comunicati ai guest tramite eventi.
Virtualizzazione dell'I/O
- Back-end driver: per ogni dispositivo, il suo driver è isolato
all’interno di una particolare macchina virtuale (tipicamente Dom0).
Accesso diretto all’HW.
- Front-end driver: ogni guest prevede un driver virtuale
semplificato che consente l’accesso al device tramite il backend.
XEN installation
Requisiti hardware minimali
- 1GB di RAM;
- 1 Interfaccia di rete;
- Processore x86 64bit;
- Estensioni hardware alla virtualizzazione (Opzionale);
Installazione - 1
- Installare Debian 7.4 (Wheezy): nella gestione del disco, creare
le seguenti partizioni:
1 - /boot 300 MB ext2 - primaria
2 - / 15 GB ext3 - logica
3 - swap 1.5 volte la dimensione della RAM logica
4 - la restante parte come partizione per LVM logica
Installazione - 2
- Accedere come root.
- Installare LVM: $ aptitude install lvm2
- Creare un volume fisico ed un gruppo di volumi:
$ pvcreate /dev/volume_lvm
$ vgcreate vg0 /dev/volume_lvm
Installazione - 3
- Creare il bridge di rete: $ aptitude install bridge-utils
Supponendo che l’interfaccia di rete fisica sia eth0, configurare
/etc/network/interfaces come segue:
auto lo
iface lo inet loopback
iface eth0 inet manual
auto xenbr0
iface xenbr0 inet dhcp
bridge_ports eth0
Riavviare l’interfaccia di rete: $ service networking
restart
Installazione - 4
- Create il bridge di rete con interfaccia di rete wireless: se la rete
esterna è accessibile da un’interfaccia di rete wireless, non è
possibile creare il bridge direttamente su tale NIC. Per permettere
alle VM Guest di accedere alla rete esterna bisogna seguire il
seguente workaround:
Installazione - 5
creare un bridge sull’interfaccia di rete wired con indirizzo statico
(sarà il gateway per le macchine guest):
auto lo
iface lo inet loopback
iface eth0 inet manual
auto xenbr0
iface xenbr0 inet static
address 192.168.0.1
netmask 255.255.255.0
bridge_ports eth0
Riavviare l’interfaccia di rete: $ service networking
restart
Installazione - 6
Abilitare il forwarding di tutte le richieste da eth0 a wlan0
(interfaccia wireless):
$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ iptables -t nat -A POSTROUTING -o wlan0 -j
MASQUERADE
$ iptables -A FORWARD -i wlan0 -o eth0 -m state
--state RELATED,ESTABLISHED -j ACCEPT
$ iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
Salvare in un file la configurazione di iptables:
$ iptables-save > /root/xen-iptables.fw
Installazione - 7
- Installare Xen: $ aptitude install xen-linux-system
- Configurare GRUB:
Per permettere l’esecuzione di Xen prima dell’OS, è necessario
cambiare le priorità del bootloader:
$ dpkg-divert --divert /etc/grub.d/08_linux_xen
--rename /etc/grub.d/20_linux_xen
$ update-grub
$ reboot
- Installare Xen Tools: $ aptitude install xen-tools
Utilizzo - 1
- Creare un’immagine guest paravirtualizzata (creazione
automatica): per creare un’immagine paravirtualizzata
semplicemente è possibile utilizzare xen-create-image: utilizzando
debootstrap è possibile creare un’immagine Debian-based. Per
creare un’immagine guest di Debian 7.4 (Wheezy):
$ xen-create-image --hostname=xen-debian-pv \
--memory=512mb \
--vcpus=2 \
--lvm=vg0 \
--dhcp \
--pygrub \
--dist=wheezy
Utilizzo - 2
Nel caso in cui sia stato fissato un indirizzo statico sul bridge per
utilizzare l’interfaccia di rete wireless, creare l’immagine con
indirizzo statico (ad esempio 192.168.0.2 con gateway
192.168.0.1, che è l’indirizzo del bridge):
$ xen-create-image --hostname=xen-debian-pv \
--memory=512mb \
--vcpus=2 \
--lvm=vg0 \
--ip=192.168.0.2 \
--netmask=255.255.255.0 \
--gateway=192.168.0.1 \
--pygrub \
--dist=wheezy
Utilizzo - 3
- Lanciare l’immagine: $ xm create -c xen-debian-pv
Senza l’opzione -c l’immagine viene creata ma non viene
effettuato il prompt nella console dell’istanza. Per accedere in un
secondo tempo:
$ xm console xen-debian-pv
Per uscire dalla console CTRL+]. Per conoscere lo stato delle
macchine:
$ xm list
Per effettuare lo shutdown:
$ xm shutdown vmid
Per distruggere la macchina:
$ xm destroy vmid
Utilizzo - 4
- Creare un’immagine guest paravirtualizzata (creazione manuale):
per creare un’immagine guest paravirtualizzata di CentOS 6,
creare il la partizione ospitante (ad esempio da 8 GB):
$ lvcreate -nxen-centos-pv -L8G vg0
Utilizzo - 5
Scaricare il kernel d’installazione e l’initrd:
$ mkdir /tmp/xen-centos-pv
$ wget -q
http://isoredirect.centos.org/centos/6/os/x86_64/
images/pxeboot/initrd.img -O /tmp/xen-centospv/initrd.img
$ wget -q
http://isoredirect.centos.org/centos/6/os/x86_64/
images/pxeboot/vmlinuz -O /tmp/xen-centospv/vmlinuz
Utilizzo - 6
Per comodità, sulla macchina host ospitante il Dom0 creare un
server http e caricare nella root del server il file kickstart per
CentOS:
$ aptitude install apache2
$ service restart apache2
$ touch /var/www/centos6-minimal.cfg
Utilizzo - 7
Editare il file centos6-minimal.cfg:
install
url --url http://isoredirect.centos.org/centos/6/os/x86_64/
lang it_IT.UTF-8
keyboard it
rootpw root
firewall --enabled --port=22:tcp
selinux --enforcing
timezone --utc Europe/Rome
bootloader --location=mbr
network --bootproto=dhcp
zerombr yes
clearpart --all --initlabel
autopart
reboot
%packages
@core
Utilizzo - 8
Nel caso in cui si sia utilizzato l’ip statico (caso bridge-wlan)
modificare il campo network come segue:
network --bootproto=static --ip=192.168.0.3
--netmask=255.255.255.0 --gateway=192.168.0.1
--nameserver=8.8.8.8
Utilizzo - 9
Creare il cfg per l’installazione di CentOS: $ touch
/etc/xen/xen-centos_inst-pv.cfg
Editare il file come segue:
kernel
= '/tmp/xen-centos-pv/vmlinuz'
ramdisk
= '/tmp/xen-centos-pv/initrd.img'
memory
= '512'
disk
= [ 'phy:/dev/vg0/xen-centos-pv,xvda,w' ]
name
= 'xen-centos_inst-pv'
dhcp
= 'dhcp'
vif
= [ 'mac=00:00:00:00:ce:ce' ]
on_poweroff = 'destroy'
on_reboot
= 'destroy'
on_crash
= 'destroy'
extra
= “text ip=dhcp
ks=http://dom0_ip_address/centos6-minimal.cfg”
Utilizzo - 10
Nel caso in cui si sia utilizzato l’ip statico (caso bridge-wlan)
modificare i campi dhcp, vif ed extra come segue:
dhcp = ‘off’
vif = [ ‘ip=192.168.0.3 ,mac=00:00:00:00:ce:ce’ ]
extra = “text ip=192.168.0.3
netmask=255.255.255.0 gateway=192.168.0.1
dns=8.8.8.8,8.8.6.6”
Utilizzo - 11
Creare la macchina per far partire l’installazione: $ xm create
-c /etc/xen/xen-centos_inst-pv.cfg
Utilizzo - 12
Terminata l’installazione creare il cfg di CentOS: $ touch
/etc/xen/xen-centos-pv.cfg
Editare il file come segue:
bootloader
memory
disk
name
dhcp
vif
on_poweroff
on_reboot
on_crash
=
=
=
=
=
=
=
=
=
‘/usr/lib/xen-4.1/bin/pygrub’
'512'
[ 'phy:/dev/vg0/xen-centos-pv,xvda,w' ]
'xen-centos-pv’'
'dhcp'
[ 'mac=00:00:00:00:ce:ce' ]
'destroy'
'restart'
'restart'
Utilizzo - 13
Nel caso in cui si sia utilizzato l’ip statico (caso bridge-wlan)
modificare i campi dhcp, vif ed extra come segue:
dhcp = ‘off’
vif = [ ‘ip=192.168.0.3 ,mac=00:00:00:00:ce:ce’ ]
Lanciare la macchina virtuale: $ xm create -c
/etc/xen/xen-centos-pv.cfg
Utilizzo - 14
- Utilizzare la virtualizzazione hardware (HVM):
Per prima cosa bisogna verificare di avere una macchina che
abbia il supporto alla virtualizzazione hardware e che quest’ultimo
sia attivo:
$ egrep -i ‘vmx|svm’ --color=always /proc/cpuinfo
Se vengono prodotti risultati dal comando ed i flag colorati
contengono vmx (Intel VT) oppure svm (AMD-V), allora il supporto
alla virtualizzazione hardware è presente ed attivo (per attivarlo
utilizzare le opzione del bios).
Per versioni di Debian inferiori a Wheezy installare la versione
modificato di qemu per Xen:
$ aptitude install install xen-qemu-dm
Utilizzo - 15
Creare un volume logico del sistema operativo (ad esempio da 20
GB per Ubuntu):
$ lvcreate -nxen-ubuntu-hvm -L20G vg0
Utilizzo - 16
Creare /etc/xen/xen-ubuntu-hvm.cfg ed editarlo come segue (cambiare il path
della iso):
kernel = "/usr/lib/xen-4.1/boot/hvmloader"
builder='hvm'
memory = 1024
vcpus=1
name = 'xen-ubuntu-hvm'
vif = ['bridge=xenbr0']
disk = ['phy:/dev/vg0/xen-ubuntuhvm,hda,w','file:/root/ubuntu.iso,hdc:cdrom,r']
acpi = 1
device_model = 'qemu-dm'
boot='cd'
sdl=0
serial='pty'
vnc=1
vnclisten='0.0.0.0'
vncpasswd=''
Utilizzo - 17
Creare l’istanza: $ xm create xen-ubuntu-hvm.cfg
Utilizzando un’altra macchina (o la stessa se Debian è stato
installato con interfaccia grafica), accedere alla macchina guest:
$ gvncviewer dom0_ip_address::5900