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