Progetto

Generale

Profilo

Actions

LinuxOpenVZHowto » Cronologia » Versione 27

« Precedente | Versione 27/41 (diff) | Successivo »
Simone Piccardi, 20-12-2010 18:09


Come creare un ambiente "virtualizzato" con OpenVZ su Lenny

Il supporto per OpenVZ è presente in Debian a partire da Etch. Come per Vserver la tecnologia dei container usata da OpenVZ, pur non fornendo una macchina virtuale vera e propria, consente un uso estremamente efficiente delle risorse, permettendo creare una serie di sistemi indipendenti, chiamati virtual-environment (da qui in breve VE), che girano sotto lo stesso kernel, utilizzando lo stesso filesystem ed un unico stack di rete, che pur non essendo macchine virtuali in senso stretto, nella gestione ordinaria possono essere tranquillamente considerate come tali.

Ovviamente non trattandosi di una tecnologia di virtualizzazione, non consente di installare un virtual-server con un sistema operativo diverso, come Windows. Qualora si abbiano di queste esigenze si dovrà ricorrere a tecnologie alternative come Xen o KVM.

Installazione sistema ospite (HN)

Come accennato OpenVZ è supportato a partire da Debian Etch, una volta installato il sistema base (queste note fanno riferimento alla versione distribuita con Lenny), si dovrà installare il kernel modificato per l'uso dello stesso sulla macchina ospite (il cosiddetto Hardware Node, o HN) con il comando:

aptitude install linux-image-openvz-686


<pre>
<pre>
ln -s /var/lib/vz /vz
</pre>

Una volta installato il tutto occorrerà riavviare la macchina per utilizzare il nuovo server, eseguito il riavvio si potrà verificare il funzionamento del sistema verificando che in processo di controllo sia attivo:
<pre>
# ps aux| grep vz
root      2488  0.0  0.0      0     0 ?        S    15:20   0:00 [vzmond]
</pre>
e controllando lo stato con:
<pre>
# vzlist -a
      VEID      NPROC STATUS  IP_ADDR         HOSTNAME                        
</pre>
che sarà vuoto non essendo stato creato alcun VE.

h2. Creazione di un Virtual Environment da un template

<pre>
<pre>
<pre>
cd /vz/template/cache
wget http://download.openvz.org/template/precreated/debian-5.0-x86.tar.gz
</pre>
(nel caso si è scaricata è la versione per 686, si usi quella a 64 bit per macchine a 64 bit). 

<pre>
<pre>
ln -s debian-5.0-x86.tar.gz debian.tar.gz
</pre>

A questo punto si potrà creare un nuovo VE indicando semplicemente un numero intero (quello che in gergo viene chiamato *VEID*) che serve ad identificare univocamente ciascuna macchina; nel nostro caso questo può essere creato semplicemente con il comando:
<pre>
# vzctl create 100 
Creating VE private area (debian)
Performing postcreate actions
VE private area was created
</pre>
che usa il VEID 100; una volta creato lo potrà far partire con il comando:
<pre>
# vzctl start 100 
Starting VE ...
VE is mounted
Setting CPU units: 1000
Configure meminfo: 65536
VE start in progress...
</pre>
verificarne l'attività con:
<pre>
# vzlist -a
      VEID      NPROC STATUS  IP_ADDR         HOSTNAME                        
       100          8 running -               -                               
</pre>
entrarci con:
<pre>
# vzctl enter 100
entered into VE 100
vzserver:/#
</pre>
fermarlo con:
<pre>
# vzctl stop 100
Stopping VE ...
VE was stopped
VE is unmounted
</pre>

<pre>
<pre>
vzctl create 100  --hostname testlenny
</pre>
oppure una volta creato senza nome lo si può impostare con:
<pre>
vzctl set 100 --hostname testlenny --save
</pre>
<pre>
<pre>
# vzlist -a
      VEID      NPROC STATUS  IP_ADDR         HOSTNAME                        
       100          5 running -               testlenny
</pre>

Se infine si vuole che il nuovo VE sia lanciato automaticamente all'avvio della macchina, si dovrà attivarne la partenza in maniera esplicita con:
<pre>
vzctl set 103 --onboot yes --save
</pre>

h2. Configurazione della rete

<pre>

h3. Configurazione di rete con venet

<pre>

<pre>
<pre>
vzctl set 100 --ipadd 192.168.0.100  --save
</pre>
da ripetere quante volte si vuole per assegnare ulteriori indirizzi che saranno aggiunti alla lista, questi potranno essere rimossi completamente con il comando: 
<pre>
vzctl set 100 --ipdel all --save
</pre>
<pre>

<pre>

<pre>
<pre>
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.0.2.1       0.0.0.0         255.255.255.255 UH    0      0        0 venet0
0.0.0.0         192.0.2.1       0.0.0.0         UG    0      0        0 venet0
</pre>
<pre>

Questo meccanismo piuttosto complesso ha però il risultato di rendere ogni VE del tutto indipendente dagli altri, e consente di impostare delle regole di firewall all'interno dei singoli VE senza dover essere costretti, come avveniva con VServer, a gestire le regole esclusivamente a livello di sistema ospite. 

Una volta assegnato l'IP al nostro container il resto della configurazione deve essere effettuato sulla macchine ospite, che deve occuparsi di instradarlo correttamente verso internet, per questo una delle configurazioni essenziali è l'abilitazione del reinoltro dei pacchetti, da farsi manualmente con il comando:
<pre>
echo 1 > /proc/sys/net/ipv4/ip_forward
</pre>
<pre>
<pre>
net.ipv4.ip_forward=1
</pre>

Viene inoltre consigliato, quando si effettua la configurazione di VE con IP pubblico proprio, di abilitare il proxy arp per l'interfaccia della macchina ospite dietro la quale operano, questo si fa manualmente con il comando:
<pre>
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
</pre>
<pre>
<pre>
net.ipv4.conf.eth0.proxy_arp=1
</pre>

Il primo caso è quello in cui per i VE si utilizzano degli IP privati, in questo caso perché internet sia raggiungibile occorrerà effettuare un opportuno NAT degli stessi, per cui si dovrà impostare anche:
<pre>
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
</pre>

A parte la configurazione degli indirizzi e dell'instradamento, un'altra configurazione necessaria a consentire l'uso della rete ai singoli VE è quella del DNS, che può essere effettuata con il comando:
<pre>
vzctl set 100 --nameserver IP.PUB.DEL.DNS --save
</pre>

h3. Configurazione di rete con veth

Come accennato questa modalità di gestione della rete è leggermente meno efficiente e più complessa rispetto alla precedente, ma consente di delegare al VE la gestione di una vera e propria interfaccia ethernet virtuale, sulla quale compiere tutte le operazioni volute. Inoltre in caso di macchine dotate di più interfacce di rete consente anche di associare un VE ad una interfaccia o all'altra, ottenendo una separazione delle rispettive reti.

Questa modalità è alternativa alla precedente, e non si deve pertanto assegnare un IP dall'HN, ma farlo direttamente all'interno del VE, come una macchina reale; per questo, qualora esso fosse presente, occorre rimuoverlo preventivamente con il comando: 
<pre>
vzctl set 100 --ipdel all --save
</pre>
<pre>
<pre>
vzctl set VEID --netif_add ethN --save
</pre>

<pre>
<pre>
vzctl set VEID --netif_add <ifname>[,<mac>,<host_ifname>,<host_mac>,<bridge>] --save
</pre>
che consente di impostare sia MAC address che nome sia per l'interfaccia nel VE che nell'HN (cosa che in genere non si fa mai, utilizzando i default del comando) ed infine un eventuale bridge (che invece è la configurazione consigliata) attraverso il quale usare l'interfaccia. 

<pre>

<pre>
<pre>
auto br0
iface br0 inet static
      address 192.168.1.1
      netmask 255.255.255.0
      bridge_ports eth0
      bridge_maxwait 5
</pre>

<pre>
<pre>
vzctl set 100 --netif_add eth0~~br0 --save
</pre>

<pre>
<pre>
#!/bin/bash
EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr" 
</pre>
<pre>

<pre>

h2. Configurazione delle proprietà di un VE

<pre>

Ad esempio se la RAM disponibile in un VE è insufficiente, e se ne vuole aumentare la disponibilità con un limite fra 512M e 1G si potrà utilizzare il comando:
<pre>
vzctl set 100 --privvmpages 512M:1G --save
</pre>
<pre>

Oltre alle risorse associate ai  _bean counters_ si possono impostare limiti anche su altre risorse generiche come lo spazio disco operando allo stesso modo con ulteriori parametri; se ad esempio si vuole impostare un limite sullo spazio disco totale si potrà usare il comando: 
<pre>
vzctl set 100 --save --diskspace 10G
</pre>
<pre>

h2. Creazione manuale di un template

<pre>
<pre>
aptitude install deboostrap
</pre>
poi si potrà creare un ambiente iniziale con:
<pre>
debootstrap --arch amd64 lenny /var/lib/vz/private/100 http://ftp.it.debian.org/debian
</pre>
(si usi il valore di architettura adeguato alla propria macchina). Questo preparerà i file per un VE con id 100; una volta completato il comando occorrerà generare una opportuna configurazione per lo stesso con:
<pre>
vzctl set 100 --applyconfig vps.basic --save
</pre>
<pre>
<pre>
echo 'OSTEMPLATE="debian"' >> /etc/vz/conf/100.conf
</pre>
infine si potrà configurare la rete come visto in precedenza per poter operare all'interno dello stesso.

<pre>
<pre>
sed -i -e '/getty/d' /var/lib/vz/private/100/etc/inittab
sed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /var/lib/vz/private/100/etc/*syslog.conf
rm -f /var/lib/vz/private/100/etc/mtab
ln -s /proc/mounts /var/lib/vz/private/100/etc/mtab
</pre>

A questo punto si potrà far partire il nostro VE e completare le operazioni di aggiornamento e  pulizia dal suo interno, per questo si eseguano i comandi:
<pre>
apt-get update
apt-get upgrade
apt-get clean
dpkg --purge module-init-tools
apt-get remove --purge XXX (lista di altra roba da completare)
update-rc.d -f klogd remove
</pre>
e si rimuova tutto quello ritenuto non necessario. 

Una volta completata la pulizia all'interno si potrà uscire e passare alla creazione del _template_, per questo però occorre prima rimuovere i dati di indirizzo e DNS inseriti per consentire al nostro VE di accedere ad internet, per questo si faccia:
<pre>
vzctl stop 100
vzctl set 100 --ipdel all --save
echo > /vz/private/100/etc/resolv.conf
rm /vz/private/100/etc/hostname
</pre>
e poi si potrò creare l'immagine del _template_ con:
<pre>
cd /vz/private/100/
tar --numeric-owner -zcf /vz/template/cache/debian-5.0-x86_64-minimal.tar.gz .
</pre>
ed a questo punto una volta creato il link simbolico:
<pre>
ln -sf debian-5.0-x86_64-minimal.tar.gz debian.tar.gz
</pre>
si potrà creare un nuovo VE con:
<pre>
vzctl create 101
</pre>
e verificare che funziona con:
<pre>
vzctl start 101 
vzctl enter 101 
</pre>

h2. Dump e backup

<pre>

<pre>

Per eseguire un dump basta indicare il VEID del VE che si vuole salvare, non indicando nulla saranno salvati tutti quelli presenti. Ad esempio si potrà salvare la precedente macchina virtuale con:
<pre>
vzdump --snapshot 101
</pre>
<pre>
<pre>
vzdump-openvz-VEID-YYYY_MM_DD-HH_MM_SS
</pre>

Aggiornato da Simone Piccardi circa 14 anni fa · 27 revisions