Newsgroup: it.comp.os.linux.sys
Titolo: Virtaulbox/Qemu

Ciao a tutti,
sto provando Virtualbox e Qemu su una Debian Squeeze (sul mio portatile, con 
networkmanager attivato per la eth0 in uso): il primo sembra funzionare 
bene, il secondo sembra avere molta più flessibilità nel gestire hd virtuali 
(converte o legge praticamente ogni cosa e si possono ricomprimere ogni 
tanto le immagini in formato qcow), ma...
... con Virtualbox configurare le VM in bridging è una cavolata, con Qemu 
(Aqemu) non ci sono riuscito (ho provato con qualche howto, ma senza 
successo... tra l'altro è possibile farlo senza modificare 
/etc/network/interfaces, ovvero direttamente da qemu/aqemu come in vbox?).
Ciao e grazie,
  Void :-?

 /etc/network/interfaces, ovvero direttamente da qemu/aqemu come in vbox?).
Non conosco aqemu, ma con qemu classico puoi connettere la nic virtuale ad
un'interfaccia tap, quindi questa può essere messa in bridge con i soliti
strumenti di Linux.
P.es.
qemu ... -net nic -net tap,ifname=tap0
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 tap0
-- 
Flavio Visentin
Ubuntu in Zulu significa "Non so usare Debian". (cit. CtRiX)

 (Aqemu) non ci sono riuscito (ho provato con qualche howto, ma senza
]zac[
Con qemu potresti usare la soluzione qemu + vde switch (č uno switch 
virtuale), č una cosa molto particolare, ma consente di evitare l'uso del 
bridge.

 brctl addif br0 tap0
Oddio... e tap0? ... che non ho:
# brctl addif br0 tap0
interface tap0 does not exist!
Devo definirla in /etc/network/interfaces?
Ciao e grazie per la pazienza,
  Void

 Devo definirla in /etc/network/interfaces?
Devi crearla.
modprobe tun
mknod /dev/net/tun c 10 200
Poi ti serve qualcosa per creare l'interfaccia di interesse; c'è tunctl
nel pacchetto uml-utilities oppure anche openvpn con l'opzione --mktun
fa lo stesso mestiere.

 bridge.
Ho provato a seguire queste istruzioni:
http://wiki.debian.org/QEMU#QEMUnetworkingwithVDE
Però ho ancora qualche dubbio: cos'è questa tap interface e che indirizzo 
deve avere se io ho sul mio portatile per esempio indirizzo 192.168.1.10 e 
voglio che la macchina virtuale (che risiede sul mio portatile) abbia 
indirizzo 192.168.1.11 e che sia possibile accedervi via ssh?
Ciao e grazie,
  Void


#* This file is part of start-guest.
#*
#* start-guest is free software; you can redistribute it and/or modify
#* it under the terms of the GNU General Public License as published by
#* the Free Software Foundation; either version 2 of the License, or
#* (at your option) any later version.
#*
#* start-guest is distributed in the hope that it will be useful,
#* but WITHOUT ANY WARRANTY; without even the implied warranty of
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#* GNU General Public License for more details.
#*
#* You should have received a copy of the GNU General Public License
#* along with start-guest; if not, write to the Free Software
#* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
USA
#**************************************************************************/
# Avvia l'immagine del sistema guest
# Opzionale:
# ' 192.168.0 254 linuxhost ' in ' \windows\lmhosts '
# Qemu can use SDL sound instead of the default OSS
#export QEMU_AUDIO_DRV=sdl
# Whereas SDL can play through alsa:
#export SDL_AUDIODRIVER=alsa
function GetImgPath(){
    local ImgFileIn=$1
    ImgFileOut=""
    if [ ${ImgFileIn: 0: 1} == "/" ] || [ ${ImgFileIn: 0: 1} == "." ]; then
	ImgFileOut=$ImgFileIn
    else
	ImgFileOut=$GuestImgPath"/"$ImgFileIn
    fi
}
PATH=$PATH":/sbin"
ProgFile=$0
ProgPath=`dirname $ProgFile`
ProgName=`basename $ProgFile`
if [ $ProgPath == "." ]; then
    ProgPath=`pwd`;
fi
GuestImgPath=$ProgPath"/../os-img/qemu"
GuestSO=""
GuestImgNum=""
GuestImgHda=""
GuestImgHdb=""
GuestImgHdc=""
GuestImgHdd=""
GuestMAC=""
GuestRAM="512"
QemuMediaDisk=""
QemuBoot=""
QemuIfUp==$ProgPath"/qemu-simple"
ProgSock="/tmp/vde_qemu.ctl"
StartVde="false"
ImgFileOut=""
# Visualizza le opzioni della linea di comando
if [ $# -eq "0" ]; then
    echo -e "Selezione Guest S.O.:\n  'Tipo S.O.' 'Numero S.O.' (es. -w 1)"\
            "\nTipo S.O:\n  -o = Precedente installazione di windows 98"\
            "\n  -w = Windows 98, -W = Windows Vista"\
            "\n  -f = Fedora"\
            "\nNumero S.O:\n  0 = Originale, 1 = Uso normale, 2 = test"\
            "\nAttivazione VDE: -v"\
            "\nLista immagini virtuali: -l"\
            "\nImpostazione RAM: -m 'dimensione' (predefinita $GuestRAM 
MB)"\
            "\nBoot da dvd/dvd-rw/cdrom: -i"\
	    "\nAttivazione di dvd/dvd-rw/cdrom:"\
            "\n  -r dvd, dvd-rw, cdrom, 'file/device'"\
	    "\nAssegnazione ad hda (boot)/b/c/d di immagine/harddisk:"\
            "\n  -a, -b, -c, -d, 'file/device'"
fi  
# Elabora le opzioni della linea di comando
while getopts "vw:W:f:ir:lm:a:b:c:d:" Option; do
    case $Option in
    w ) GuestSO="Windows 98"
	GuestImgNum=$OPTARG ;;
    W ) GuestSO="Windows Vista"
	GuestImgNum=$OPTARG ;;
    f ) GuestSO="Fedora"
	GuestImgNum=$OPTARG ;;
    v ) StartVde="true" ;;
    a ) GuestImgHda=$OPTARG ;;
    b ) GuestImgHdb=$OPTARG ;;
    c ) GuestImgHdc=$OPTARG ;;
    d ) GuestImgHdd=$OPTARG ;;
    i ) QemuBoot="-boot d" ;;
    r ) QemuMediaDisk=$OPTARG ;;
    l ) ls $GuestImgPath;;
    m ) GuestRAM=$OPTARG ;;
    * ) echo "Opzione non valida" ;;
    esac
done
# Imposta l'unità hda di avvio
if ! [ "$GuestImgHda" ]; then
    case $GuestSO in
    "Windows 98" ) 
	case $GuestImgNum in
	    "0" ) GuestImgHda="win98.qcow"      ;;
	    "1" ) GuestImgHda="win98_1.qcow"    ;;
	    "2" ) GuestImgHda="win98_2.qcow"    ;;
	esac ;;
    "Windows Vista" )
	case $GuestImgNum in
	    "0" ) GuestImgHda="wintest.qcow2"   ;;
	    "1" ) GuestImgHda="wintest_1.qcow2" ;;
	    "2" ) GuestImgHda="wintest_2.qcow2" ;;
	esac ;;
    "Fedora" )
	case $GuestImgNum in
	    "0" ) GuestImgHda="fedora.qcow"     ;;
	    "1" ) GuestImgHda="fedora_1.qcow"   ;;
	    "2" ) GuestImgHda="fedora_2.qcow"   ;;
	esac ;;
    esac
fi
# Imposta il MAC address della scheda di rete
NumGuest=$((`pidof -x start-guest | wc -w` - 1))
case $GuestSO in
    "Windows 98" ) 
    case $NumGuest in
	"1" ) GuestMAC="52:54:00:00:EE:12" ;;
	"2" ) GuestMAC="52:54:00:00:EE:13" ;;
	"3" ) GuestMAC="52:54:00:00:EE:14" ;;
    esac ;;
    "Windows Vista" )
    case $NumGuest in
	"1" ) GuestMAC="52:54:00:00:EE:22" ;;
	"2" ) GuestMAC="52:54:00:00:EE:23" ;;
	"3" ) GuestMAC="52:54:00:00:EE:24" ;;
    esac ;;
    "Fedora" )
    case $NumGuest in
	"1" ) GuestMAC="52:54:00:00:EE:32" ;;
	"2" ) GuestMAC="52:54:00:00:EE:33" ;;
	"3" ) GuestMAC="52:54:00:00:EE:34" ;;
    esac ;;
    * )
    case $NumGuest in
	"1" ) GuestMAC="52:54:00:00:EE:02" ;;
	"2" ) GuestMAC="52:54:00:00:EE:03" ;;
	"3" ) GuestMAC="52:54:00:00:EE:04" ;;
    esac ;;
esac
#
#  Decrements the argument pointer so it points to next argument.
#  $1 now references the first non option item supplied on the command line
#+ if one exists.   
shift $(($OPTIND - 1))
#
if ! [ "$GuestImgHda" ]; then
    exit 0 
fi
# Imposta le unità hda/b/c/d
if [ "$GuestImgHda" ]; then
    GetImgPath $GuestImgHda
    GuestImgHda="-hda "$ImgFileOut
fi
if [ "$GuestImgHdb" ]; then
    GetImgPath $GuestImgHdb
    GuestImgHdb="-hdb "$ImgFileOut
fi
if [ "$GuestImgHdc" ]; then
    GetImgPath $GuestImgHdc
    GuestImgHdc="-hdc "$ImgFileOut
fi
if [ "$GuestImgHdd" ]; then
    GetImgPath $GuestImgHdd
    GuestImgHdd="-hdd "$ImgFileOut
fi
# Imposta il lettore dvd/dv-rw/cdrom
if [ "$QemuMediaDisk" ]; then
    case $QemuMediaDisk in
	"dvd" ) QemuMediaDisk="/dev/scd0" ;;
	"dvd-rw" ) QemuMediaDisk="/dev/scd1" ;;
	"cdrom" ) QemuMediaDisk="/dev/scd0" ;;
    esac
    QemuMediaDisk="-cdrom "$QemuMediaDisk
fi
#
# Avvia l'immagine del sistema guest
#/usr/bin/qemu-kvm-Mpc-m500-smp1-monitorpty
if [ "$StartVde" == "true" ]; then
    if [ "$GuestSO" == "Windows Vista" ]; then
	vdeq qemu-kvm -net vde,vlan=0,sock=$ProgSock -net 
nic,vlan=0,macaddr=$GuestMAC,model=ne2k_pci \
	    $GuestImgHda $GuestImgHdb $GuestImgHdc $GuestImgHdd 
$QemuMediaDisk $QemuBoot \
	    -m $GuestRAM -usb -soundhw sb16 -localtime
    else
	vdeq qemu-system-x86_64 -net vde,vlan=0,sock=$ProgSock -net 
nic,vlan=0,macaddr=$GuestMAC \
	    $GuestImgHda $GuestImgHdb $GuestImgHdc $GuestImgHdd 
$QemuMediaDisk $QemuBoot \
	    -m $GuestRAM -usb -soundhw sb16 -localtime
    fi
else
# Non aggiornato da molto tempo, quasi sicuramente non funzionante
    qemu -hda $GuestImgFile $QemuMediaDisk -n $QemuIfUp -m $GuestRAM -
soundhw sb16 -localtime
fi

 Poi ti serve qualcosa per creare l'interfaccia di interesse; c'è tunctl
Siete troppo sintetici, aiuto! :-) Ricapitoliamo:
0. ho un portatile con una scheda eth0 con indirizzo 192.168.1.50 che sarà 
l'host su cui voglio creare una macchina virtuale con indirizzo 192.168.1.51 
che possa collegarsi alla rete 
192.168.1.0/24
 e alla quale le altre macchine 
fisiche della stessa rete possano collegarsi via ssh, web, ftp...
1. creo una nuova istanza del bridge ethernet:
   # brctl addbr br0
2. aggiungo l'interfaccia eth0 al bridge:
   # brctl addif br0 eth0
   # brctl show br0
   bridge name     bridge id               STP enabled     interfaces
   br0             8000.00235a0c420d       no              eth0
   pan0            8000.000000000000       no
NB: ora non riesco più ad effettuare alcuna connessione verso l'esterno 
dall'host: sto sbagliando qualcosa?
3. carico il modulo tun (il device viene creato automaticamente):
   # modprobe tun
   # ls -l /dev/net/tun 
   crw-rw-rw- 1 root root 10, 200 19 ago 09.29 /dev/net/tun
4. creo un'interfaccia TUN/TAP:
   # tunctl 
   Set 'tap0' persistent and owned by uid 0
5. l'aggiungo al bridge:
   # brctl addif br0 tap0
   # brctl show br0
   bridge name     bridge id               STP enabled     interfaces
   br0             8000.00235a0c420d       no              eth0
                                                           tap0
   pan0            8000.000000000000       no
... e poi?
Ciao,
  Void :-?

 promiscua)) per fare le sue cose (il bridge automatico).
Ecco, e come fa Virtualbox a fare il bridge automatico in maniera 
apparentemente così semplice, al confronto? Mi pare che basti impostare la 
scheda di rete virtuale a "Scheda con bridge" e dalla macchina guest posso 
collegarmi ed essere raggiunto come una qualunque macchina fisica sulla 
stessa rete. È possibile fare questo anche con qemu?
Ciao e grazie,
  Void

 
lanci la vm e assegni un indirizzo da dentro
Ciao

 dall'host: sto sbagliando qualcosa?
Nel momento in cui il bridge è up, il layer 3 non deve più essere associato
alla scheda fisica ma deve essere associato al bridge.
Quindi:
# ifconfig eth0 0 up
# ifconfig br0 192.168.1.50 netmask 255.255.255.0 up
# route add default gw 192.168.1.1
Visto che usi Debian sarebbe *più meglio* mettere il tutto in interfaces
auto tap0
iface tap0 inet manual
	up tunctl
auto br0
iface br0 inet static
	address 192.168.1.50
	netmask 255.255.255.0
	gateway 192.168.1.1
	bridge_ports eth0 tap0
	bridge_maxwait 0
	bridge_stp off
man bridge-utils-interfaces


 stessa rete. È possibile fare questo anche con qemu?
Non ha una risposta testata, ma da quello che ho letto sia il bridge sia lo 
switch virtuale consento di avere una rete totalmente trasparente (gli 
strumenti sono diversi ma il problema e il metodo per risolverli è lo 
stesso).
P.S. Solo per esempio, da me (è tutto fatto in automatico dai vati 
virtualbox e start di vde switch):
route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use 
Iface
151.6.140.88    *               255.255.255.255 UH    0      0        0 ppp0
192.168.0.0     *               255.255.255.0   U     0      0        0 tap0
192.168.122.0   *               255.255.255.0   U     0      0        0 
virbr0
default         *               0.0.0.0         U     0      0        0 ppp0

 ifconfig br0 up
Non cambia nulla... però funziona se in /etc/network/interfaces metto:
iface br0 inet dhcp
   pre-up /usr/sbin/tunctl -u miouser -t tap0
   pre-up ifconfig tap0 up
   bridge_ports all tap0
   post-down ifconfig tap0 down
   post-down tunctl -d tap0
e poi la tiro su con un "ifup br0" (forse semplicemente non tiravo su anche 
tap0).
La cosa... buffa è che ero partito da questo, ma probabilmente sbagliavo a 
mettere "-u root" e a voler fare girare la macchina virtuale come "miouser".
Ciao e grazie,
  Void :-)

 man bridge-utils-interfaces
Illuminante! Interessante anche questo che mi ha fatto capire 'ste tun/tap 
che proprio non mi andavano giù :-) :
http://en.wikipedia.org/wiki/TUN/TAP


 Sicuramente non è necessario il port forward.
Quindi alla fine è una soluzione equivalente a quella dell'altro "ramo" del 
thread, che alla fine però mi pare più semplice in quanto pare non sia 
necessario neppure fare il masquerade. O sbaglio?


 iface eth0 inet dhcp
Ops, queste non ci volevano...
Ciao,
  Void :-)

 Ah, che in inglese maccheronico sta per SYnthetic Systemists... :-)
+ o - :-)
Comunque dimenticavo che non è strettamente necessario fare un bridge per
far funzionare le cose come vuoi tu.
Puoi anche semplicemente usare proxyarp. Lato host configuri come sempre un
device di tipo tap per la VM, poi abiliti il packet forwarding tra le
interfacce e metti il proxyarp sulla eth0.
Configuri nella scheda di rete della VM un indirizzo IP "pubblico" e sei a
posto.


 interfacce e metti il proxyarp sulla eth0.
La soluzione che finalmente funziona mi piace, per cui se non ci sono 
particolari vantaggi ad usarne un'altra... :-)
Piuttosto, una cosa banale: ma come si fa con qemu a nascondere la finestra 
in cui parte la VM (conto di lavorarci in ssh), ovvero a farla apparire se 
avviata con l'opzione "-nographic"?
Ciao,
  Void :-)

 avviata con l'opzione "-nographic"?
Associ il display ad una sessione vnc.
man qemu
/-vnc


   Void :-)
Di niente, poi quello che ho scritto non č che ti sia stato poi utile.

 Associ il display ad una sessione vnc.
Ecco l'avevo letto nel man, ma non l'avevo associato a quello che volevo 
fare, grazie!
Intanto mi è venuta in mente un'altra cosa: se anziché sul mio 
portatile volessi utilizzare qemu/kvm su un server su cui fare girare 
diverse macchine virtuali, cosa mi consigliereste per una gestione via web? 
Ho letto di Quemudo, ma non l'ho ancora provato. L'idea è che in certi casi 
un responasabile di una vm possa avviarla senza necessariamente conoscere 
nulla del sistema sottostante, ma ad es. da una semplice interfaccia web. 
Secondo passo sarebbe interessante permettere anche la creazione, copia, 
modifica... di vm da una persona specifica che anche in questo caso potrebbe 
non conoscere nulla del sistema sottostante.
Ciao,
  Void :-)

 Di niente, poi quello che ho scritto non è che ti sia stato poi utile.
Ma no, non dire così! È comunque stato un gradino importante lungo la scala 
della conoscenza... ;-) E poi non è detto che non mi torni utile in futuro 
(mi sono salvato testo e script).
Ciao,
  Void :-)

 diverse macchine virtuali, cosa mi consigliereste per una gestione via web? 
Indubitamente proxmox-ve.
http://pve.proxmox.com/wiki/Main_Page
Ti da tutto già fatto.


 
http://pve.proxmox.com/wiki/Main_Page
Lo proverò, grazie mille!
Ciao,
  Void :-)

Void ha scritto:

Grazie del Link interessante.