doc:appunti:linux:sa:qemu_kvm
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
doc:appunti:linux:sa:qemu_kvm [2018/03/01 18:47] – niccolo | doc:appunti:linux:sa:qemu_kvm [2022/11/09 10:14] (current) – [Virutalizzazione QEMU-KVM su Debian Stretch] niccolo | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
Verificare con '' | Verificare con '' | ||
Line 17: | Line 17: | ||
È la configurazione necessaria per mettere la macchina **host e guest sulla stessa rete locale**. In pratica si configura una interfaccia **br0** che avrà l' | È la configurazione necessaria per mettere la macchina **host e guest sulla stessa rete locale**. In pratica si configura una interfaccia **br0** che avrà l' | ||
+ | |||
+ | Vediamo come si configura il file **/ | ||
< | < | ||
Line 31: | Line 33: | ||
bridge_fd 0 | bridge_fd 0 | ||
</ | </ | ||
+ | |||
+ | In questo secondo esempio la scheda di rete **eth2** della macchina host non è configurata (non ha indirizzo IP). Il device **br2** viene quindi usato come bridge virtuale dalle macchine guest, che potranno raggiungere gli altri host fisicamente connessi a eth2: | ||
+ | |||
+ | < | ||
+ | auto eth2 | ||
+ | iface eth2 inet manual | ||
+ | up / | ||
+ | down / | ||
+ | |||
+ | auto br2 | ||
+ | iface br2 inet manual | ||
+ | bridge_ports eth2 | ||
+ | bridge_stp off | ||
+ | bridge_maxwait 10 | ||
+ | up / | ||
+ | down / | ||
+ | </ | ||
+ | |||
+ | Potrebbe tornare utile un **bridge senza alcuna scheda Ethernet connessa**, ad esempio per attivare una interfaccia di rete in una macchina virtuale, ma senza dover occupare per forza una porta Ethernet. Ecco come attivare **br10** senza impegnare porte fisiche: | ||
+ | |||
+ | < | ||
+ | auto br10 | ||
+ | iface br10 inet manual | ||
+ | bridge_ports none | ||
+ | bridge_stp off | ||
+ | bridge_waitport 0 | ||
+ | bridge_maxwait 10 | ||
+ | up / | ||
+ | down / | ||
+ | </ | ||
+ | |||
+ | Ecco la sintassi **da riga di comando** per fare configurazioni analoghe: | ||
+ | |||
+ | < | ||
+ | brctl addbr br2 | ||
+ | brctl addif br2 eth2 | ||
+ | ifconfig br2 up | ||
+ | |||
+ | ifconfig br2 down | ||
+ | brctl delif br2 eth2 | ||
+ | brctl delbr br2 | ||
+ | </ | ||
+ | ===== Creazione di una macchina virtuale ===== | ||
+ | |||
+ | Si può procedere in **modalità manuale** oppure preparando dei **file di configurazione XML** e lasciare il lavoro di basso livello al framework **libvirt**. | ||
+ | |||
+ | ==== Modo manuale con network in modo bridge ==== | ||
+ | |||
+ | La configurazione con **rete in modalità bridge** è la più complessa, perché richiede che la macchina ospitante sia predisposta opportunamente. In breve la macchina ospitante dovrà avere l' | ||
+ | |||
+ | < | ||
+ | auto br0 | ||
+ | iface br0 inet static | ||
+ | address 10.0.1.2 | ||
+ | netmask 255.255.255.0 | ||
+ | gateway 10.0.1.252 | ||
+ | bridge_ports eth0 | ||
+ | bridge_stp off | ||
+ | bridge_maxwait 10 | ||
+ | </ | ||
+ | |||
+ | quindi l' | ||
+ | |||
+ | < | ||
+ | tunctl -t tap0 -u root | ||
+ | ifconfig tap0 up | ||
+ | brctl addif br0 tap0 | ||
+ | </ | ||
+ | |||
+ | A questo punto è possibile **avviare la macchina ospite** con qualcosa del tipo: | ||
+ | |||
+ | < | ||
+ | qemu-system-x86_64 -m 1024 -machine accel=kvm \ | ||
+ | -netdev tap, | ||
+ | -device e1000, | ||
+ | -cdrom ../ | ||
+ | -hda rootfs.img -boot c | ||
+ | </ | ||
+ | |||
+ | ==== Con libvirt ==== | ||
+ | |||
+ | Una macchina virtuale è definita da due file: il **file di configurazione** e il file **immagine del disco**. Ad esempio una macchina di nome **stretch-amd64** è definita da: | ||
+ | |||
+ | * **/ | ||
+ | * **/ | ||
+ | |||
+ | È possibile creare in maniera assistita tali file eseguento il tool **virt-install**. Ad esempio: | ||
+ | |||
+ | < | ||
+ | virt-install \ | ||
+ | --virt-type kvm --name stretch-amd64 \ | ||
+ | --network bridge=br0 \ | ||
+ | --cdrom / | ||
+ | --graphics vnc, | ||
+ | -v --os-variant debian9 \ | ||
+ | --disk size=40 --memory 512 | ||
+ | </ | ||
+ | |||
+ | dove i parametri sono il **nome** del guest (es. stretch-amd64), | ||
+ | |||
+ | **virt-install** crea i file necessari e avvia la macchina virtuale, la **console** è raggiungibile tramite **VNC sulla porta 5900** della macchina host. Nel file di configurazione il boot da CD-ROM e l' | ||
+ | |||
+ | <code xml> | ||
+ | <!-- <boot dev=' | ||
+ | <boot dev=' | ||
+ | </ | ||
+ | |||
+ | <code xml> | ||
+ | <!-- <driver name=' | ||
+ | <source file='/ | ||
+ | </ | ||
+ | |||
+ | In alternativa a **virt-install** è possibile creare manualmente il **file .xml di configurazione** e creare l' | ||
+ | |||
+ | < | ||
+ | qemu-img create -f qcow2 stretch-amd64.qcow2 40G | ||
+ | </ | ||
+ | |||
+ | Quando si cambiano i file di configurazione delle macchine guest è necessario riavviare il servizio (le macchine virtuali in esecuzione non sono toccate): | ||
+ | |||
+ | < | ||
+ | systemctl restart libvirtd.service | ||
+ | </ | ||
+ | |||
+ | quindi da virsh è possibile distruggere e far ripartire una macchina virtuale, nonché abilitiare l' | ||
+ | |||
+ | < | ||
+ | destroy stretch-amd64 | ||
+ | start stretch-amd64 | ||
+ | autostart stretch-amd64 | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | / | ||
+ | </ | ||
+ | ===== Immagine disco raw o qcow2 ===== | ||
+ | |||
+ | L' | ||
+ | |||
+ | Per scoprire il formato di un file immagine dovrebbe essere sufficiente il comando **file**, a prescindere dall' | ||
+ | |||
+ | < | ||
+ | file disk_hda.img | ||
+ | disk_hda.img: | ||
+ | |||
+ | file disk_hdb.img | ||
+ | disk_hdb.img: | ||
+ | </ | ||
+ | |||
+ | Il file XML di configurazione differisce nei due casi: | ||
+ | |||
+ | <code xml> | ||
+ | <disk type=' | ||
+ | <driver name=' | ||
+ | <source file='/ | ||
+ | <target dev=' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <code xml> | ||
+ | <disk type=' | ||
+ | <source file='/ | ||
+ | <target dev=' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Scheda di rete Virtio o RTL-8029(AS) ===== | ||
+ | |||
+ | La scelta predefinita per l' | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | <model type=' | ||
+ | <mac address=' | ||
+ | <source bridge=' | ||
+ | <target dev=' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Il tipo **virtio** offre alla macchina guest un device Ethernet PCI con ID **1af4: | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | <model type=' | ||
+ | <mac address=' | ||
+ | <source bridge=' | ||
+ | <target dev=' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Il tipo **ne2k_pci** offre alla macchina guest una Ethernet PCI compatibile NE2000, per la precisione una **Realtek RTL-8029(AS)**. L'ID PCI in realtà è **1af4: | ||
+ | |||
+ | Per avere **due o più schede** Ethernet è sufficiente aggiungere altre sezioni **%%< | ||
+ | |||
+ | ===== Console VNC ===== | ||
+ | |||
+ | Nella sezione **%%< | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | <listen type=' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Nella configurazione si imposta la porta TCP in ascolto, la password e la mappatura della tastiera. Con address uguale a **0.0.0.0** si fa il bind su tutte le interfacce, non è possibile specificare due o più indirizzi di bind. Ovviamente se si imposta la password in chiaro, è opportuno proteggere il file almeno con **mode 0640**. | ||
===== Troubleshooting ===== | ===== Troubleshooting ===== | ||
Line 47: | Line 256: | ||
Errore durante il tentativo di avviare una macchina virtuale in modalità network NAT (modalità predefinita). Non era stata avviata la configurazione di rete //default// di libvirt. Dalla shell **virsh** si deve eseguire **net-start default**. | Errore durante il tentativo di avviare una macchina virtuale in modalità network NAT (modalità predefinita). Non era stata avviata la configurazione di rete //default// di libvirt. Dalla shell **virsh** si deve eseguire **net-start default**. | ||
+ | ===== Web References ===== | ||
+ | |||
+ | * **[[https:// | ||
+ | * **[[https:// |
doc/appunti/linux/sa/qemu_kvm.1519926459.txt.gz · Last modified: 2018/03/01 18:47 by niccolo