\documentclass{beamer}

\usetheme{Warsaw}

\usepackage[italian]{babel}
\usepackage[utf8]{inputenc}
\usepackage{url}

\setbeamercovered{transparent}

\title{Sistemi di virtualizzazione su Linux}
\subtitle{Tecnologie di virtualizzazione e consolidamento}

\author{Simone Piccardi}
\institute{
Truelite Srl\\
Via Monferrato, 6 Firenze\\
\url{www.truelite.it}
}


\date{13 Maggio 2014}

\logo{\includegraphics[height=0.5cm,keepaspectratio]
{../images/logo-vettoriale.pdf}}

\begin{document}

\frame{\titlepage}

%\section[Sommario]{}
\frame{
  \frametitle{Di cosa parlerò}
  \tableofcontents
}


\section{Introduzione}

\subsection{Panoramica sui concetti}

\frame
{
  \frametitle{Perché la virtualizzazione}

  I server attuali sono spesso sotto-utilizzati:
  \begin{itemize}
  \item multiprocessori con carichi poco significativi
  \item grandi quantità di memoria, usata come cache
  \item dischi di dimensioni sempre maggiori 
  \end{itemize}
  è possibile tenere su una macchina fisica quello che prima stava su molte

}


\frame
{
  \frametitle{Vantaggi della virtualizzazione}

  La virtualizzazione consente di creare più macchine virtuali su una sola
  macchina reale:
  \begin{itemize}
  \item si possono consolidare su una sola macchina diversi server
  \item si possono utilizzare diversi sistemi operativi su una sola macchina
  \item si possono fornire risorse in maniera dinamica secondo le esigenze
  \item si risparmia energia elettrica usando meglio le risorse hardware
  \end{itemize}
}


\frame
{
  \frametitle{Vantaggi della virtualizzazione}

  La virtualizzazione consente di separare la manutenzione di hardware e
  software:
  \begin{itemize}
  \item si possono separare macchine virtuali con diversi livelli di
    sicurezza, dividendo i rischi
  \item si possono mantenere per compatibilità su hardware recente vecchie
    versioni di sistema operativo
  \item si può gestire l'aggiornamento delle macchine fisiche separatamente da
    quello delle macchine virtuali
  \end{itemize}
}


\frame
{
  \frametitle{Svantaggi della virtualizzazione}

  Gli svantaggi in realtà sono molto pochi:
  \begin{itemize}
  \item perdita di prestazioni, ma poco significativa nella maggior parte dei
    casi, e sempre minore grazie al supporto hardware
  \item minore sicurezza, in caso di compromissione del sistema di
    virtualizzazione si può prendere il controllo di molte macchine
  \end{itemize}
  lo svantaggio più significativo è quello relativo alla sicurezza

}


\frame
{
  \frametitle{Tipi di virtualizzazione}

  Le tecnologie di virtualizzazione si possono dividere sommariamente in tre
  categorie:
  \begin{itemize}
  \item \textbf{container} si usa il kernel per creare un \textsl{contenitore}
    in cui far girare un sistema operativo \textsl{ospite} all'interno di un
    ambiente virtuale.
  \item \textbf{software virtualization} si emula in software un intero
    computer fornendo un hardware virtuale su cui fare una installazione del
    tutto identica a quella di una macchina fisica
  \item \textbf{hardware virtualization} si sfrutta il supporto hardware dei
    moderni processori per emulare in maniera efficiente intero computer 
  \end{itemize}
}

\frame
{
  \frametitle{Container: Vantaggi e svantaggi}

  Vantaggi:
  \begin{itemize}
  \item prestazioni, lo stesso kernel esegue tutti i programmi di tutte le
    macchine virtuali
  \item ottimizzazione delle risorse, la memoria ed il disco sono sfruttati
    integralmente senza rigide allocazioni
  \end{itemize}
  Svantaggi:
  \begin{itemize}
  \item non si possono virtualizzare sistemi operativi diversi
  \end{itemize}
}

\frame
{
  \frametitle{Software virtualization: Vantaggi e svantaggi}

  Vantaggi:
  \begin{itemize}
  \item si possono utilizzare anche altri sistemi operativi
  \item non necessita di processori recenti con supporto hardware
  \item in certi casi si può utilizzare anche su architetture hardware diverse
  \end{itemize}
  Svantaggi:
  \begin{itemize}
  \item prestazioni ridotte di esecuzione, si esegue un emulatore su cui gira
    un sistema operativo che esegue altri programmi
  \item prestazioni ridotte di I/O, si devono emulare le periferiche
  \end{itemize}
}


\frame
{
  \frametitle{Hardware virtualization: Vantaggi e svantaggi}

  Vantaggi:
  \begin{itemize}
  \item si possono utilizzare anche altri sistemi operativi
  \item alta velocità per l'esecuzione nativa del sistema ospite
  \end{itemize}
  Svantaggi:
  \begin{itemize}
  \item necessita di processori recenti con il supporto hardware
  \end{itemize}
}


\subsection{Panoramica tecnologie}

\frame
{
  \frametitle{Tecnologie disponibili: container}

  Le tecnologie di virtualizzazione basate sulla realizzazione di
  \textit{container} sono: 
  \begin{itemize}
  \item \textbf{LXC}
  \item \textbf{linux-vserver}
  \item \textbf{OpenVZ}
  \end{itemize}
}

\frame
{
  \frametitle{linux-vserver}

  Una delle soluzioni presenti da maggior tempo:
  \begin{itemize}
  \item usa kernel modificato per la separazione dei server virtuali
  \item non richiede supporto dal processore
  \item accesso diretto all'hardware tramite il kernel in esecuzione
  \item qualche problema per la separazione della rete
  \item non supportato nel kernel ufficiale (e sviluppo quasi fermo)
  \end{itemize}
  molto veloce, funzionalità ridotte, sviluppo fermo.
}

\frame
{
  \frametitle{LXC}

  L'ultimo arrivato (iniziato con il kernel 2.6.19, usabile dal 2.6.26):
  \begin{itemize}
  \item usa le funzionalità già presenti nel kernel
  \item separa parzialmente i server virtuali con l'uso dei \textit{namespace}
  \item non richiede supporto dal processore
  \item accesso diretto all'hardware tramite il kernel in esecuzione
  \item procede di pari passo con lo sviluppo del kernel ufficiale
  \end{itemize}
  molto veloce ed efficiente, funzionalità ridotte, sviluppo costante.
  }

\frame
{
  \frametitle{OpenVZ}

  Nasce come applicazione proprietaria, rilasciato poi come GPL:
  \begin{itemize}
  \item usa un kernel modificato per la separazione dei server virtuali
  \item sfrutta dove possibile le funzionalità già presenti nel kernel
  \item accesso diretto all'hardware tramite il kernel in esecuzione
  \item non richiede supporto dal processore
  \item supporta diversi modelli di rete e live migration
  \end{itemize}
  molto veloce ed efficiente, molte funzionalità, sviluppo
  costante.

}


\frame
{
  \frametitle{Tecnologie disponibili: software virtualization}

  Le tecnologie di virtualizzazione basate sulla virtualizzazione software
  sono:
  \begin{itemize}
  \item \textbf{qemu}
  \item \textbf{kqemu}
  \item \textbf{Virtualbox}
  \end{itemize}
}


\frame
{
  \frametitle{qemu}

  E' stata una delle prime macchine virtuali create su Linux:
  \begin{itemize}
  \item emula completamente un PC, comprese alcune periferiche, vi si può
    installare qualunque sistema operativo
  \item eseguito come programma dal sistema ospite, non richiede modifiche al
    kernel, né supporto da parte del processore
  \item usa come sistema ospite Linux, FreeBSD, Solaris, MacOS e Windows
  \item gira su diverse piattaforme ospite (x86, PPC) e emula diverse
    piattaforme hardware (x86, PPC, ARM, SPARC, MIPS)
  \end{itemize}
  relativamente semplice da usare, molto lento, utilizza molta memoria,
  efficiente nell'uso dello spazio disco.
}

\frame
{
  \frametitle{kqemu}

  La versione originale di \textbf{qemu} è molto lenta, \textbf{kqemu}:
  \begin{itemize}
  \item usa modulo del kernel per accelerare l'esecuzione dei sistema ospitato
  \item il sistema operativo e le applicazioni ospiti sono eseguiti
    direttamente dal processore
  \item funziona solo per emulazioni di piattaforma x86 su x86
  \item disponibile solo sotto Linux, non può essere usato per installare
    Windows 
  \item non supportato dal kernel ufficiale, sviluppo fermo
  \end{itemize}
  relativamente semplice da usare, meno lento, utilizza molta memoria,
  efficiente nell'uso dello spazio disco, sviluppo fermo.

}

\frame
{
  \frametitle{VirtualBox}

  Era una applicazione proprietaria, rilasciata poi sotto GPL:
  \begin{itemize}
  \item approccio analogo a \textbf{kqemu}, accelerazione tramite moduli del
    kernel
  \item multi-piattaforma, può essere eseguita su Linux, Windows, Solaris,
    MacOSX
  \item può eseguire come sistema ospite qualunque sistema operativo
  \item non supportato nel kernel ufficiale ma ben sviluppato
  \end{itemize}
  estremamente semplice, ottima interfaccia di gestione, moderatemente veloce,
  richiede parecchie risorse (memoria e spazio disco), alcune funzionalità
  restano proprietarie.

 }


\frame
{
  \frametitle{Tecnologie disponibili: hardware virtualization}

  Le tecnologie di virtualizzazione basate sulla virtualizzazione assistita
  dall'hardware sono:
  \begin{itemize}
  \item \textbf{Xen} paravirtualization
  \item \textbf{Xen} full virtualization
  \item \textbf{KVM} 
  \end{itemize}
}

\frame
{
  \frametitle{Xen paravirtualization}

  La prima versione, basata sul concetto di \textit{hypervisor}, consente di
  eseguire più sistemi operativi:
  \begin{itemize}
  \item uno strato di controllo, l'\textit{hypervisor}, esegue un kernel
    principale (\texttt{dom0}) che esegue le restanti istanze virtuali
    (\texttt{domU}).
  \item senza supporto hardware occorrono delle modifiche al sistema operativo
    eseguito (disponibili per Linux e BSD)
  \item funzionalità avanzate come live-migration, interfacce virtuali,
    accesso a disco veloce con LVM.
  \item richiede modifiche non supportate dal kernel ufficiale
  \end{itemize}
  complesso da usare, molto veloce, ottime funzionalità, necessita di
  parecchie risorse (in memoria e spazio disco).

}



\frame
{
  \frametitle{Xen full virtualization}

  Versione che usa il supporto hardware:
  \begin{itemize}
  \item viene usato ancora l'\textit{hypervisor} ma può emulare una macchina
    fisica senza modifiche al sistema operativo eseguito
  \item l'accesso alle periferiche reali è più lento in quanto simulato
    appoggiandosi a \texttt{qemu} o moduli dedicati
  \item mantiene le funzionalità avanzate di live-migration, interfacce
    virtuali, dischi su LVM.
  \item quasi completamente supportato con le ultime versioni del kernel
    ufficiale
  \end{itemize}
  complesso da usare, molto veloce, ottime funzionalità, necessita di
  parecchie risorse (memoria e spazio disco).

}

\frame
{
  \frametitle{KVM}

  E' la tecnologia di virtualizzazione \textsl{nativa} su Linux:
  \begin{itemize}
  \item infrastruttura generica per la creazione di macchine virtuali
  \item parte del kernel ufficiale a partire dalla versione 2.6.20
  \item usa una versione modificata di \texttt{qemu} per fornire il supporto
    delle periferiche 
  \item funzionalità avanzate di live-migration, interfacce virtuali, dischi
    su LVM
  \end{itemize}
  complesso da usare, molto veloce, necessita di parecchie risorse.  

}


\frame
{
  \frametitle{Cosa usare}

  Ci concentreremo su KVM e OpenVZ per i seguenti motivi:
  \begin{itemize}
  \item disponibilità di un buon supporto  
  \item prodotti di punta nel rispettivo settore
  \item fortemente sviluppati
  \item disponibilità di Proxmox, un'interfaccia di gestione via web combinata
    di entrambi
  \end{itemize}
}


\section{OpenVZ}
\label{sec:OpenVZ}

\subsection{Architettura}
\label{sec:openvz_arch}

\frame
{
  \frametitle{OpenVZ}

  \begin{itemize}
  \item ogni istanza (\textit{virtual environment} o VE) è completamente
    separata dalle altre (riguardo file, processi, rete e IPC)
  \item ogni VE si comporta come un sistema ordinario, si può installare e
    configurare qualunque servizio
  \item il sistema consente un controllo molto dettagliato delle risorse
    associate a ciascun VE
  \item la rete è virtualizzata e la si può anche far gestire completamente
    dall'interno di ciascun VE
  \item sono supportate funzionalità avanzate come la sospensione dei processi
    e la live-migration 
  \end{itemize}
}


\frame
{
  \frametitle{OpenVZ}

  Alcune funzionalità di notevole interesse:
  \begin{itemize}
  \item supporto per la realizzazione di ``\textit{template}'' che rendono
    immediata l'installazione di macchine simili
  \item supporto per il backup completo di una istanza senza dover fermare la
    stessa (snapshot con LVM) o con downtime minimale
  \item spostamento dei dati da un VE all'altro con una semplice copia di file
    dalla macchina ospite
  \end{itemize}
  è una piattaforma ideale da usare per consolidare server linux, anche con
  distribuzioni diverse

}

\frame
{
  \frametitle{Directory}

  Le configurazioni di OpenVZ sono mantenute sotto \texttt{/etc/vz} in forma
  di assegnazione di variabili di shell, ogni VE è identificato da un numero
  (CTID o \textit{container ID}):
  \begin{itemize}
  \item la configurazione generale del sistema è mantenuta sotto
    \texttt{/etc/vz/vz.conf}
  \item le configurazioni di ogni VE sono mantenute in
    \texttt{/etc/vz/conf/\textsl{CTID}.conf}
  \item i file di ogni VE sono mantenuti in
    \texttt{/var/lib/vz/private/\textsl{CTID}/}
  \end{itemize}
}



\frame
{
  \frametitle{Architettura}

  OpenVZ è un'estensione del kernel per il già presente supporto per i
  container:
  \begin{itemize}
  \item I VE vengono attivati sul sistema ospitante, i relativi programmi
    girano come processi ordinari:
  \item all'interno di un VE viene eseguito l'userspace di una distribuzione
    (a partire da \texttt{init})
  \item un VE utilizza i pacchetti ordinari, eccetto quelli relativi al kernel
    ed alla gestione dell'hardware
  \item il sistema ospitante vede tutti i processi e tutti i file dei VE
  \end{itemize}
}


\frame
{
  \frametitle{Architettura}

  Ciascun VE vede un ambiente virtuale proprio, separato da quello degli altri
  VE e del sistema ospitante:
  \begin{itemize}
  \item ogni VE vede soltanto i processi lanciati al suo interno
  \item non possono essere montati filesystem (ma si possono predisporre
    \textit{bind mount} dal sistema ospitante)
  \item l'accesso diretto all'hardware non è disponibile (a meno di non
    passare i dispositivi al container)
  \item ci sono due modelli per la gestione della rete, routing
    (\texttt{venet}) e bridging (\texttt{veth})
  \end{itemize}
}


\frame
{
  \frametitle{Architettura}

  Tutti i file dei VE vengono mantenuti direttamente sul filesystem del
  sistema ospitante, non sono necessarie allocazioni predeterminate dello
  spazio disco:
  \begin{itemize}
  \item la radice di un VE corrisponde alla directory dove sono installati i
    relativi file (\texttt{/var/lib/vz/private/\textsl{\textit{CTID}}})
  \item ogni VE vede la suddetta directory come propria radice su un disco
    virtuale (\texttt{/dev/simfs})
  \item la dimensione del disco visto da un VE è impostata e controllata dal
    sistema ospitante
  \item il sistema ospitante è in grado di spostare/copiare i file di un VE
    come fa con qualunque altro file
  \end{itemize}
}

% TODO: da trattare
% \frame
% {
%   \frametitle{Architettura}

%   L'uso di file ha degli svantaggi, per questo le versioni più recenti possono
%   salvare il filesystem su un file (\textit{ploop}:
%   \begin{itemize}
%   \item 
%   \item 
%   \item 
%   \item 
%   \end{itemize}
% }


\frame
{
  \frametitle{Installazione}

  OpenVZ richiede un kernel modificato ed alcuni programmi di gestione in
  userspace:
  \begin{itemize}
  \item pacchettizzato da Debian fino a Squeeze (kernel \texttt{-openvz})
  \item pacchettizzato da Proxmox (\texttt{pve-kernel}) con supporto a lungo
    termine 
  \item un pacchetto omonimo per il programma di gestione \texttt{vzctl} e
    tutta la relativa infrastruttura
  \end{itemize}

}

\subsection{Gestione delle macchine virtuali}
\label{sec:openvz_ct_management}

\frame
{
  \frametitle{Introduzione}

  Un kernel con il supporto per OpenVZ fornisce le infrastrutture di gestione
  necessarie:
  \begin{itemize}
  \item il programma \texttt{vzlist} consente di elencare i VE attivi (e la
    presenza del supporto per openvz)
  \item nel file \texttt{/proc/user\_beancounters} sono elencate le
    impostazioni relative alle risorse assegnati, i contatori per l'uso e per
    l'eventuale superamento dei limiti
  \item ulteriori informazioni sono disponibili sotto \texttt{/proc/vz/}
  \end{itemize}

}

\frame
{
  \frametitle{Il programma \texttt{vzctl}}

  La gestione di OpenVZ viene effettuata principalmente attraverso il
  programma \texttt{vzctl} che consente di:
  \begin{itemize}
  \item installare e rimuovere i VE
  \item avviare, fermare, sospendere, spostare i VE
  \item impostare le caratteristiche, i limiti e le risorse dei VE
  \item entrare in un VE o eseguire un programma al suo interno
  \end{itemize}
  il comando richiede sempre l'indicazione del VE su cui operare tramite il
  suo CTID.
}


\frame
{
  \frametitle{La creazione di un VE}

  La creazione di un VE viene eseguita con il comando \texttt{vzctl create
    \textsl{CTID}}, dove CTID non sia già stato utilizzato:
  \begin{itemize}
  \item il comando crea il VE partendo da un template contenente tutti i file
    necessari al nuovo sistema
  \item il programma usa di default il template indicato dal parametro
    \texttt{DEF\_OSTEMPLATE} di \texttt{/etc/vz/vz.conf} a meno di una
    indicazione esplicita con \texttt{-{}-ostemplate}
  \item il nome del template indica il corrispondente file con estensione
    \texttt{.tar.gz} sotto \texttt{/var/lib/vz/template/cache/}
  \end{itemize}

}

\frame
{
  \frametitle{La creazione di un VE}

  Ad un nuovo VE vengono assegnate da \texttt{vzctl create} un insieme di
  risorse a partire da un default:
  \begin{itemize}
  \item caratteristiche e risorse vengono ottenute dal file indicato dal
    parametro \texttt{CONFIGFILE} di \texttt{vz.conf} o dall'opzione
    \texttt{-{}-config}
  \item al nome indicato deve corrispondere un file nella forma
    \texttt{/etc/vz/conf/ve-\textsl{nome}.conf-sample}
  \item tutte le risorse possono essere assegnate esplicitamente con le
    corrispondenti opzioni a riga di comando
  \end{itemize}

}

\frame
{
  \frametitle{Cancellazione di un VE}

  Un VE può essere rimosso con \texttt{vzctl destroy \textsl{CTID}}:
  \begin{itemize}
  \item tutti i file presenti sotto
    \texttt{/var/lib/vz/private/\textsl{CTID}} verranno eliminati
  \item tutti i file di configurazione relativi al template (sotto
    \texttt{/etc/vz/conf} verranno eliminati
  \item attenzione: il comando non chiede conferma, la cancellazione è
    definitiva e non si può tornare indietro
  \item per disabilitare temporaneamente l'uso di un VE si usi invece
    \texttt{vzctl set -{}-disabled yes \textsl{CTID}} 
  \end{itemize}
}


\frame
{
  \frametitle{Lancio di un VE}

  Una volta creato un VE deve essere esplicitamente avviato \texttt{vzctl
    start \textsl{CTID}}:
  \begin{itemize}
  \item il comando ritorna immediatamente, se si vuole attendere che le
    operazioni di avvio siano completate si usi l'opzione \texttt{-{}-wait}
  \item il comando non avvia un VE disabilitato, se si vuole forzare l'avvio
    occorre utilizzare l'opzione \texttt{-{}-force}
  \item per automatizzare l'avvio di un VE al riavvio della macchina ospite
    occorrerà impostarlo con \texttt{vzctl set -{}-onboot yes \textsl{CTID}} 
  \end{itemize}
}

\frame
{
  \frametitle{Fermata e riavvio di un VE}

  Un VE attivo può essere fermato con il comando \texttt{vzctl stop
    \textsl{CTID}}:
  \begin{itemize}
  \item il comando esegue \texttt{halt} all'interno del container, con uno
    shutdown pulito dello stesso 
  \item con l'opzione \texttt{-{}-fast} viene usata direttamente la system
    call \texttt{reboot} con terminazione immediata dei processi
  \item con \texttt{vzctl restart \textsl{CTID}} si effettua il riavvio
  \end{itemize}
}


\frame
{
  \frametitle{Ulteriori comandi}

  Oltre ai precedenti \texttt{vzctl} consente di eseguire alcune operazioni
  direttamente su un VE attivo:
  \begin{itemize}
  \item con \texttt{vzctl enter \textsl{CTID}} si ottiene una shell di root
    all'interno del VE (eseguibile solo da root del sistema ospitante)
  \item con \texttt{vzctl exec \textsl{CTID} comando} si esegue un comando
    all'intero del VE
  \item con \texttt{vzctl status \textsl{CTID}} si ottiene lo stato di un VE
  % \item con \texttt{vzctl chkpnt \textsl{CTID}} salva lo stato completo di un
  %   VE (compreso quello della mmero
  \end{itemize}
}


\frame
{
  \frametitle{Gestione della rete}

  Per la gestione della rete esistono due modalità alternative:
  \begin{itemize}
  \item \textit{routing}, in cui il VE dispone di una interfaccia
    virtuale punto-punto verso una corrisponde nel sistema ospitante su cui
    viene inviato il traffico, questo viene instradato poi dal sistema
    ospitate.
  \item \textit{bridging}, in cui il VE dispone di una interfaccia ethernet
    virtuale con una corrispondente nel sistema ospitante che deve essere
    configurata in bridge con una interfaccia reale dello stesso
  \end{itemize}
}


\frame
{
  \frametitle{Gestione della rete con il routing}

  La gestione della rete con il routing viene effettuata esclusivamente dal
  sistema ospitante:
  \begin{itemize}
  \item dal sistema ospitante si assegna un indirizzo IP al VE con
    \texttt{vzctl set -{}-ipadd \textsl{IP} \textit{CTID}}
  \item nel VE viene creata una interfaccia punto-punto \texttt{venet0} con
    assegnato in aliasing l'indirizzo indicato
  \item nel sistema ospitante viene creata una interfaccia \texttt{venet0}
    corrispondente alla analoga presente nel VE
  \item nel sistema ospitante viene creata una rotta statica per il traffico
    diretto all'indirizzo IP del VE verso l'interfaccia \texttt{venet0}
  \end{itemize}
}

\frame
{
  \frametitle{Gestione della rete con il routing}

  Nella gestione della rete con il routing oltre agli indirizzi di rete devono
  essere impostati dal sistema ospitante:
  \begin{itemize}
  \item l'hostname del VE con \texttt{vzctl set -{}-hostname \textsl{NOME}}
  \item i DNS con \texttt{vzctl set -{}-nameserver \textsl{IP\_DNS}}
  \item il dominio con \texttt{vzctl set -{}-searchdomain \textsl{DOMINO}}
  \end{itemize}
  infine un indirizzo deve essere rimosso con \texttt{vzctl set -{}-ipdel
    \textsl{IP}} e si possono assegnare più indirizzi ripetendo il comando
  \texttt{vzctl set -{}-ipadd \textsl{IP}}

}


\frame
{
  \frametitle{Gestione della rete con il bridging}

  Nella gestione della rete con il bridging si crea una interfaccia ethernet
  virtuale nel VE e questo ne può gestire l'impostazione:
  \begin{itemize}
  \item l'interfaccia deve essere creata con il comando \texttt{vzctl set
      -{}-netif\_add \textsl{nome}} (il default è \texttt{eth0}) 
  \item la si può rimuovere con \texttt{vzctl set -{}-netif\_del
      \textsl{nome}}
  \item se ne indica il MAC-address con \texttt{vzctl set -{}-mac
      \textsl{XX:..}}
  \end{itemize}
  l'interfaccia così creata corrisponderà ad una equivalente interfaccia
  virtuale \texttt{veth\texttt{CTID}.N} nel sistema ospitante che dovrà essere
  messa in bridge con una interfaccia reale
}


\frame
{
  \frametitle{Gestione della rete con il bridging}

  Una volta creata l'interfaccia ethernet nel VE il sistema ospitante dovrà
  gestire il traffico:
  \begin{itemize}
  \item si indica il MAC-address dell'interfaccia nel sistema ospitante con
    \texttt{vzctl set -{}-host\_mac \textsl{XX:..}}
  \item si indica il bridge di cui andrà a far parte con \texttt{vzctl set
      -{}-bridge \textsl{nome}}
  \item si dovrà predisporre un bridge (chiamato \texttt{nome}) con membro
    l'interfaccia reale su cui si vuole vengano fatti uscire i pacchetti
  \end{itemize}
}


\frame
{
  \frametitle{Gestione della rete con il bridging}

  Per il funzionamento di questa configurazione:
  \begin{itemize}
  \item il VE deve configurare la sua rete con le modalità ordinarie previste
    dalla distribuzione installata
  \item all'avvio del VE la corrispondente interfaccia \texttt{veth} nel
    sistema ospite viene inserita nel bridge indicato
  \item l'interfaccia accetta solo pacchetti ethernet diretti al MAC address
    indicato (a meno di non disabilitare il filtro con
    \texttt{-{}-mac\_filter})
  \item dall'interno del VE non è possibile cambiare il MAC address
    dell'interfaccia
  \end{itemize}
}



\subsection{Gestione delle risorse}
\label{sec:openvz_res_management}

\frame
{
  \frametitle{Le risorse di OpenVZ}

  OpenVZ consente un controllo molto dettagliato delle risorse associate ad un
  VE, ciascuna delle quali è identificata da un nome:
  \begin{itemize}
  \item il consumo delle risorse può essere controllato nel file
    \texttt{/proc/user\_beancounters}
  \item le risorse si impostano con il comando \texttt{vzctl set
      \textsl{CTID}} passando una opzione nella forma
    \texttt{-{}-nomerisorsa=BAR:LIM}
  \item per ogni risorsa si possono indicare una barriera (\texttt{BAR}) ed un
    limite (\texttt{LIM}), indicando un solo valore questo viene usato per
    entrambi
  \end{itemize}
  si può usare \texttt{unlimited} per indicare un valore illimitato ed il
  valore del limite deve essere maggiore o uguale di quello della barriera

}

\frame
{
  \frametitle{Limiti e garanzie}

  Il significato di una risorsa di OpenVZ varia a seconda della risorsa stessa:
  \begin{itemize}
  \item le risorse contenenti la stringa \texttt{guard} indicano una garanzia,
    cioè un valore minimo garantito per la stessa e non una limitazione
  \item per le garanzie la barriera indica il valore fino a cui l'uso della
    risorsa è garantito, non essendoci restrizioni il limite deve essere
    \texttt{unlimited}
  \item per le altre risorse il significato e l'eventuale differenza fra
    barriera e limite viene documentato nella descrizione della pagina di
    manuale
  \end{itemize}
  in genere si usano i default e non si modificano a meno di non riscontrare
  superamenti dei limiti in \texttt{/proc/user\_beancounter}
}


\frame
{
  \frametitle{Gestione della memoria}

  Nelle versioni più recenti di OpenVZ la gestione della ripartizione della
  memoria è stata notevolmente semplificata:
  \begin{itemize}
  \item con \texttt{vzctl set -{}-ram \textsl{bytes}} si imposta la quantità di
    RAM assegnata ad un VE, la barriera viene ignorata, vale solo il valore
    del limite
  \item con \texttt{vzctl set -{}-swap} si imposta la quantità di area di swap
    assegnata ad un VE, la barriera viene ignorata, vale solo il valore del
    limite
  \end{itemize}
  l'uso di queste funzionalità richiede la presenza di \texttt{/proc/vz/vswap}.
}

\frame
{
  \frametitle{Gestione del disco}

  Oltre alle impostazioni sull'uso delle risorse \texttt{vzctl set} consente
  di controllare l'utilizzo del disco:
  \begin{itemize}
  \item con \texttt{vzctl set -{}-diskspace} si imposta la dimensione del disco
    come vista dal VE in forma di quote disco, la barriera fa da \textit{soft
      limit} il limite da \textit{hard limit}
  \item con \texttt{vzctl set -{}-quotatime} si imposta il periodo di grazia
    per lo sforamento del limite imposto dalla barriera
  \item con \texttt{vzctl set -{}-ioprio} si imposta il valore di
    \textit{ionice} del VE (il default è 4)
  \end{itemize}
}


\section{KVM}
\label{sec:KVM}

\subsection{Architettura}
\label{sec:openvz_kvm}


\frame
{
  \frametitle{Caratteristiche generali di KVM}

  \begin{itemize}
  \item il sistema di ogni istanza viene eseguito a velocità nativa grazie al
    supporto hardware dei processori moderni
  \item è disponibile su piattaforma x86, con porting in corso per ARM e PPC
  \item può utilizzare come disco virtuale sia file che volumi logici
  \item emulazione dell'hardware con \texttt{qemu}, ma per disco e rete sono
    disponibili dispositivi virtuali per un accesso ad alta velocità
  \item uso più efficace della memoria: supporto per il \textit{memory
      ballooning} e l'unione di pagine identiche (KSM)
  \end{itemize}

}


\frame
{
  \frametitle{Caratteristiche generali di KVM}

  Le funzionalità di maggiore interesse di KVM:
  \begin{itemize}
  \item la virtualizzazione completa consente l'installazione di qualunque
    sistema operativo 
  \item supporta accesso diretto (con hotplug) di una istanza ai dispositivi
    PCI della macchina ospite
  \item supporta l'accesso ai dispositivi USB dalla macchina ospite
  \item live-migration delle istanze in presenza di storage con supporto
    dell'accesso condiviso
  \end{itemize}
  adatto all'installazione di altri sistemi operativi o macchine virtuali che
  necessitano accesso all'hardware della macchina ospite

}

\frame
{
  \frametitle{Installazione di KVM}

  Il supporto per KVM è presente nel kernel ufficiale da molti anni in genere
  necessario solo installare la parte in userspace:
  \begin{itemize}
  \item occorre il supporto da parte del processore, indicato dalla presenza
    delle estensioni \texttt{svm} o \texttt{vmx} in \texttt{/proc/cpuinfo}
  \item su Debian i programmi in user space sono forniti dal pacchetto
    \texttt{qemu-kvm}
  \item devono essere caricati i moduli \texttt{kvm} e, a seconda del
    processore, \texttt{kvm-intel} o \texttt{kvm-amd}
  \end{itemize}
}


\subsection{Funzionalità di base}
\label{sec:kvm_base}

\frame
{
  \frametitle{Esecuzione di una macchina virtuale}

  L'esecuzione di una macchina virtuale con KVM viene effettuata attraverso il
  programma \texttt{kvm}:
  \begin{itemize}
  \item ogni macchina virtuale viene gestita da una istanza di \texttt{kvm}
    che gira come singolo processo
  \item il programma avvia la macchina virtuale eseguendo un bios emulato e
    presenta un hardware virtualizzato completo
  \item i dischi vengono visti a seconda dell'emulazione come IDE, SCSI o
    VIRTIO (quest'ultimi nella forma \texttt{/dev/vdX})
  \item le caratteristiche della macchina virtuale sono impostate da
    specifiche opzioni a riga di comando
  \end{itemize}
}




\frame
{
  \frametitle{Opzioni generiche di \texttt{kvm}}

  Una prima serie di opzioni consentono di definire il comportamento del
  programma:
  \begin{itemize}
  \item \texttt{-daemonize} indica di lanciare il programma come demone
    distaccandosi dal terminale
  \item \texttt{-name \textsl{nome}} assegna un identificativo alla macchina
  \item \texttt{-boot order=\textsl{XXX}} indica l'ordine di avvio (\texttt{a}
    floppy, \texttt{c} hard disk, \texttt{d} CDROM, \texttt{n} rete)
  % \item \texttt{-nodefaults} evita la creazione dei dispositivi di default
  %   (seriale, parallela, VGA ecc.)
  \end{itemize}
}

\frame
{
  \frametitle{Opzioni di accesso alla console}

  Per l'avvio e l'accesso alla console della macchina virtuale sono
  disponibili le opzioni:
  \begin{itemize}
  \item \texttt{-vga \textsl{tipo}} indica il modello di scheda VGA da
    emulare (ex. \texttt{cirrus}, ecc.)
  \item \texttt{-vnc \textsl{display}} indica di associare la VGA emulata ad
    un display VNC che può essere indicato nella forma
    \texttt{\textsl{ip-o-hostname}:\textsl{N}} o
    \texttt{unix:/socket/path/name/}
  \item \texttt{-spice \textsl{opzioni}} abilita il protocollo di desktop
    remoto SPICE (più efficiente, ma richiede un client apposito) 
  \end{itemize}
}



\frame
{
  \frametitle{Installazione macchine virtuali}

  Si ricordi che KVM è un sistema di virtualizzazione completa, pertanto è
  sempre necessario procedere ad una installazione nella macchina virtuale:
  \begin{itemize}
  \item si deve disporre di un dispositivo di installazione per il proprio
    sistema operativo (in genere un CD o una sua immagine \texttt{.iso})
  \item si deve far partire una macchina virtuale associandovi il CD
    (\texttt{kvm -cdrom file.iso} o \texttt{kvm -cdrom /dev/cdrom})
  \item si deve procedere all'installazione ordinaria sulla macchina virtuale
    usando una console sulla stessa 
  \end{itemize}
}


\subsection{Gestione delle risorse}
\label{sec:kvm_res_manage}


\frame
{
  \frametitle{La gestione di CPU e memoria}

  Il numero di CPU e la memoria da assegnare ad una macchina virtuale vengono
  indicate attraverso delle opportune opzioni:
  \begin{itemize}
  \item \texttt{-cpu \textsl{tipo}} indica il modello di CPU da emulare
  \item \texttt{-m \textsl{N}} imposta la dimensione della memoria assegnata
    alla macchina virtuale in megabytes
  \item \texttt{-smp \textsl{n}} indica il numero di processori da emulare
  \item si possono indicare i processori per socket e cores usando un valore
    nella forma \texttt{sockets=\textsl{n},cores=\textsl{m}}
  \end{itemize}
}


\frame
{
  \frametitle{La gestione delle risorse hardware}

  La gestione delle altre risorse hardware è controllata da altrettante
  opzioni:
  \begin{itemize}
  \item \texttt{-drive} consente di gestire i dischi virtuali
  \item \texttt{-netdev} consente di gestire le interfacce di rete virtuali
  \item \texttt{-device} imposta un dispositivo virtuale
  \end{itemize}
  queste prendono i loro argomenti nella forma di serie di assegnazioni
  \texttt{chiave=valore} o valori singoli, separati da virgole

}


\frame
{
  \frametitle{La gestione delle risorse hardware}

  Con \texttt{-device} si imposta un dispositivo emulato nella macchina
  virtuale, il primo argomento è il tipo di dispositivo, ad esempio:
  \begin{itemize}
  \item \texttt{virtio-blk-pci} per un disco virtuale VIRTIO
  \item \texttt{virtio-net-pci} per una interfaccia di rete virtuale VIRTIO
  \item \texttt{ide-cd} per il cdrom
  \end{itemize}
  l'elenco di quelli disponibili si ottiene con \texttt{kvm -device help}
}


\frame
{
  \frametitle{La gestione delle risorse hardware}

  Gli ulteriori parametri di \texttt{-device} indicano come mappare il
  dispositivo e dipendono dal tipo dello stesso, ad esempio:
  \begin{itemize}
  \item \texttt{drive=nome} indica il nome con cui fare riferimento al
    dispositivo nell'opzione \texttt{-drive} nel caso di un disco
  \item \texttt{netdev=nome} indica un nome con cui fare riferimento al
    dispositivo nell'opzione \texttt{-netdev} nel caso di interfaccia di rete
  \item \texttt{bootindex=NNN} imposta un indice di priorità per l'avvio
  \end{itemize}
  parametri più specifici consentono di impostare le caratteristiche di un
  dispositivo (ad esempio \texttt{mac} imposta il MAC address) 

}

\frame
{
  \frametitle{La gestione dei dischi}

  La gestione dei dischi lato ospite viene effettuata con l'opzione
  \texttt{-{}-drive}, i principali parametri sono:
  \begin{itemize}
  \item \texttt{file=\textsl{/path}} indica il file dove mantenere i dati
    del disco (può essere un file di dispositivo)
  \item \texttt{media=\texttt{tipo}} indica il tipo di supporto (valori
    possibili \texttt{disk} o \texttt{cdrom})
  \item \texttt{id=dev} indica il nome associato al dispositivo specificato
    nel parametro \texttt{drive} di \texttt{-device}
  \end{itemize}
}

\frame
{
  \frametitle{La gestione dei dischi}

  Le prestazioni nell'uso dei dischi dipendono strettamente dalla modalità di
  gestione, in particolare se: 
  \begin{itemize}
  \item se nella macchina virtuale è necessario o meno emulare un controller
    (IDE o SCSI) o si può usare direttamente VIRTIO
  \item se nella macchina ospitante i dati vengono salvati su un file oppure si
    dà accesso diretto ad un dispositivo (o volume logico)
  \end{itemize}
}


\frame
{
  \frametitle{La gestione della rete}

  La gestione delle interfacce di lato ospite viene effettuata con l'opzione
  \texttt{-{}-netdev}, i principali parametri sono:
  \begin{itemize}
  \item \texttt{type=\textsl{tipo}} tipo dell'interfaccia, che si può indicare
    direttamente come primo argomento (ex. \texttt{user}, \texttt{tap})
  \item \texttt{id=dev} indica il nome associato al dispositivo specificato
    nel parametro \texttt{netdev} di \texttt{-device}
  \item \texttt{ifname=\textsl{nome}} indica il nome dell'interfaccia di rete
    nel sistema ospitante
  \end{itemize}
}




\frame
{
  \frametitle{La gestione della rete}

  Come per i dischi l'efficienza della rete dipende dalle modalità con cui la
  si gestisce:
  \begin{itemize}
  \item si possono emulare nella macchina virtuale varie schede di rete, ma
    qualora disponibile per essa il driver per il VIRTIO si ottengono migliori
    prestazioni
  \item è sempre opportuno utilizzare un dispositivo di tipo \texttt{tap} per
    mappare l'interfaccia di rete della macchina virtuale su una interfaccia
    di rete nella macchina ospite ed usare il bridging 
  \end{itemize}
}


\section{Proxmox}
\label{sec:Proxmox}

\frame
{
  \frametitle{Proxmox}

  Proxmox è una distribuzione Debian-based che integra OpenVZ e KVM con una
  interfaccia di gestione via web:
  \begin{itemize}
  \item interfaccia di gestione via web, compresa console e grafica accessibile
    in remoto via VNC nel browser o via SPICE
  \item supporto per configurazioni cluster, storage su iSCSI, LVM, directory
    locali e NFS
  \item supporto per il backup ed il ripristino delle macchine virtuali
  \item supporto per lo spostamento a caldo delle macchine virtuali da un nodo
    all'altro del cluster.
  \end{itemize}
}

\frame
{
  \frametitle{Installazione}

  Per l'installazione di Proxmox si possono seguire due approcci:
  \begin{itemize}
  \item si può installare la piattaforma direttamente su una macchina usando
    il CD di installazione fornito dal progetto
    (\url{http://www.proxmox.com/downloads/proxmox-ve})
  \item si può installare Debian Stable ed installare la piattaforma in un
    secondo tempo dai pacchetti, ad esempio seguendo la procedura illustrata
    su \url{https://labs.truelite.it/projects/truedoc/wiki/ProxmoxOnWheezy}
  \end{itemize}
}


\frame
{
  \frametitle{Interfaccia di gestione}

  Una volta installata la piattaforma l'interfaccia di gestione è disponibile
  in HTTPs sulla porta 8006, da questa si possono:
  \begin{itemize}
  \item creare macchine virtuali con KVM e VE con OpenVZ
  \item gestire i supporti per lo spazio disco
  \item gestire i nodi di un eventuale cluster
  \item avviare, fermare, accedere in console alle macchine virtuali
  \end{itemize}
}

\frame
{
  \frametitle{Architettura}

  Proxmox utilizza direttamente KVM ed OpenVZ, mantenendo una organizzazione
  coerente delle macchine virtuali:
  \begin{itemize}
  \item tutte le configurazioni delle macchine virtuali sono riportate sotto
    \texttt{/etc/pve}, montata su un filesystem in cluster
  \item tutte le macchine virtuali (KVM o OpenVZ) sono identificate con un
    numero univoco (il \textit{VMID})
  \item per OpenVZ \texttt{/etc/vz/conf} diventa semplicemente un link
    simbolico a \texttt{/etc/pve/openvz}
  \item per KVM le definizioni delle macchine virtuali vengono mantenute sotto
    \texttt{/etc/pve/qemu-server/} e viene fornito il comando \texttt{qm} come
    analogo di \texttt{vzctl}
  \end{itemize}
}


\frame
{
  \frametitle{Gestione dello storage}

  Proxmox consente di gestire lo storage su cui vengono mantenuti i dati delle
  macchine virtuali:
  \begin{itemize}
  \item ogni storage viene identificato con un nome
  \item si può indicare se lo storage è condiviso (iSCSI, FC, NFS)
  \item si possono selezionare i tipi di dati stoccabili: immagini, template,
    dump, immagini ISO
  \end{itemize}
}


\frame
{
  \frametitle{Gestione dello storage}

  Proxmox di usare diversi supporti come storage:
  \begin{itemize}
  \item dispositivi remoti iSCSI
  \item Volume Group di LVM (anche in versione cluster)
  \item directory locali
  \item dischi di rete con NFS
  \item dischi in cluster con ceph (RBD)
  \end{itemize}
}



\frame
{
  \frametitle{Gestione semplificata di KVM}

  Proxmox consente una gestione semplificata delle macchine virtuali con KVM:
  \begin{itemize}
  \item macchine virtuali e relative caratteriste sono mantenute in
    altrettanti file \texttt{\textsl{VMID}.conf} sotto
    \texttt{/etc/pve/qemu-server/}
  \item il comando \texttt{qm} consente di gestire avvio, creazione, modifica
    e migrazione delle macchine virtuali
  \item il comando consente anche di gestire lo storage, ridimensionare i
    dischi e la creazione di snapshot
  \end{itemize}
}


\frame
{
  \frametitle{Sintassi di base di \texttt{qm}}

  Il comando \texttt{qm} prevede sempre almeno due argomenti, una operazione
  ed il VMID cui questa si applica nella forma \texttt{qm \textsl{oper VMID}},
  le principali operazioni sono:
  \begin{itemize}
  \item \texttt{start} avvia la macchina virtuale
  \item \texttt{stop} spegne la macchina virtuale (spegnimento fisico) 
  \item \texttt{shutdown} ferma la macchina (esegue un \texttt{halt})
  \item \texttt{reboot} riavvia la macchina virtuale (esegue \texttt{reboot})
  \end{itemize}
}

\frame
{
  \frametitle{Sintassi di base di \texttt{qm}}

  Ulteriori operazioni effettuabili con \texttt{qm} sono:
  \begin{itemize}
  \item \texttt{create} crea una macchina virtuale (le proprietà devono essere
    impostate con ulteriori opzioni) 
  \item \texttt{destroy} elimina una macchina virtuale (attenzione, operazione
    non recuperabile)
  \item \texttt{migrate} migra la macchina virtuale verso un altro nodo
  \item \texttt{resize} ridimensiona i dischi della macchina virtuale
  \end{itemize}
}

\frame
{
  \frametitle{Sintassi di base di \texttt{qm}}

  Ulteriori operazioni effettuabili con \texttt{qm} sono:
  \begin{itemize}
  \item \texttt{snapshot} crea uno snapshot della macchina virtuale
  \item \texttt{delsnapshot} cancella uno snapshot della macchina virtuale
  \item \texttt{rollback} riporta la macchina virtuale allo stato salvato su
    uno snapshot
  \end{itemize}
}


\frame
{
  \frametitle{La gestione dei dump}

  Una delle funzionalità più importanti di Proxmox è fornita dal comando
  \texttt{vzdump} che consente di effettuare dei dump delle macchine virtuali:
  \begin{itemize}
  \item il comando funziona sia con OpenVZ che con KVM, e salva sia i dati che
    le configurazioni
  \item il comando crea dei file contenenti l'intero albero dei file per
    OpenVZ e le immagini dei dischi per KVM
  \item i comandi \texttt{vzrestore} e \texttt{qmrestore} consentono di
    ripristinare un dump indicando semplicemente il file ed il \textsl{VMID}
    sui cui creare il ripristino
  \end{itemize}
}


\frame
{
  \frametitle{Il comando \texttt{vzdump}}

  Il comando richiede si indichi il VMID di cui operare il dump, e crea i file
  sotto \texttt{/var/lib/vz/dump}:
  \begin{itemize}
  \item con \texttt{-destdir} si indica una directory alternativa per il
    salvataggio dei dump
  \item con \texttt{-ionice} si imposta un priorità di I/O
  \item con \texttt{-maxfiles} si imposta il numero massimo di copie
    conservate 
  \end{itemize}
}





\frame
{
  \frametitle{Il comando \texttt{vzdump}}

  L'opzione principale di \texttt{vzdump} è però \texttt{-mode} che controlla
  la modalità di esecuzione del dump, da indicare con uno fra:
  \begin{itemize}
  \item \texttt{stop} ferma la macchina virtuale ed effettua la copia dei
    file, con un downtime molto lungo
  \item \texttt{suspend} per OpenVZ esegue un primo \texttt{rsync}, poi
    sospende il VE, riesegue un \texttt{rsync} finale e riattiva il VE, con un
    downtime minimo, per KVM è analogo a \texttt{stop}
  \item \texttt{snapshot} crea uno snapshot con LVM, ed esegue la copia su di
    esso senza downtime, ma richiede che i dati siano su LVM e che ci sia
    spazio sufficiente per lo snapshot
  \end{itemize}
}


\frame
{
  \frametitle{Il comando \texttt{vzrestore}}

  Il comando richiede si indichi file del dump e VMID su cui ripristinarlo
  nella forma \texttt{vzrestore \textsl{/path/name} \textit{NNN}}:
  \begin{itemize}
  \item con \texttt{-storage} si indica lo storage su cui ripristinare i dati
    della macchina virtuale
  \item con \texttt{-force} si sovrascrive una macchina virtuale preesistente
  \item con \texttt{-} al posto di \textsl{/path/name} legge dallo standard
    input
  \item con \texttt{-unique} assegna alla macchina virtuale ripristinata un
    altro MAC-address univoco
  \end{itemize}
}


\frame
{
  \frametitle{Riferimenti Generali}
  \begin{itemize}
  \item \url{http://labs.truelite.it}
  \item \url{http://www.openvz.org}
  \item \url{http://www.linux-kvm.org}
  \item \url{http://pve.proxmox.com}
  \end{itemize}
}

\frame
{
  \frametitle{Riferimenti Specifici}
  \begin{itemize}
  \item Documentazione OpenVZ:  \url{http://openvz.org/Main_Page}
  \item Documentazione qemu/KVM: \url{http://wiki.qemu.org/Manual}
  \item Documentazione KVM: \url{http://www.linux-kvm.org/page/Documents}
  \item Documentazione Proxmox: \url{http://pve.proxmox.com/wiki/Main_Page}
  \end{itemize}
}






\end{document}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 

% LocalWords:  cache kernel virtualization LXC linux vserver OpenVZ namespace
% LocalWords:  live migration qemu kqemu Virtualbox FreeBSD Solaris MacOS PPC
% LocalWords:  Windows ARM SPARC MIPS VirtualBox MacOSX Xen paravirtualization
% LocalWords:  KVM hypervisor dom domU BSD LVM squeeze template Proxmox based
% LocalWords:  VNC storage iSCSI NFS virtual environment IPC snapshot downtime
% LocalWords:  porting memory ballooning KSM hotplug USB CTID conf  FC dump
% LocalWords:  init filesystem bind mount routing venet bridging veth userspace
% LocalWords:  openvz pve vzctl vzlist beancounters DEF OSTEMPLATE ostemplate
% LocalWords:  tar gz CONFIGFILE vz config sample destroy disabled yes wait DNS
% LocalWords:  force onboot halt shutdown system call reboot restart shell root
% LocalWords:  exec ethernet ipadd aliasing l'hostname hostname nameserver add
% LocalWords:  searchdomain ipdel netif eth MAC address mac host filter LIM svm
% LocalWords:  nomerisorsa unlimited guard bytes swap diskspace vmx stoccabili
% LocalWords:  soft limit quotatime ioprio ionice kvm intel amd bios IDE SCSI
% LocalWords:  VIRTIO daemonize name order CDROM vga cirrus vnc ip spice qm
% LocalWords:  client iso cdrom cpu megabytes smp socket cores sockets netdev
% LocalWords:  device virtio blk pci ide bootindex NNN path dev controller type
% LocalWords:  ifname Stable HTTPs VMID Group oper resize delsnapshot rollback
% LocalWords:  vzdump vzrestore qmrestore destdir maxfiles suspend rsync unique
