Questa guida passo passo spiega cos'è KVM e come installare e configurare KVM nel sistema operativo Linux CentOS 8.
Questa guida è stata ufficialmente testata nell'edizione minima del server CentOS 8. Tuttavia, dovrebbe funzionare anche in RHEL 8 e nei suoi cloni come AlmaLinux 8 e Rocky Linux 8.
Cos'è KVM?
KVM , abbreviazione di K V basato su ernel irtuale M achine, è un modulo del kernel di FreeBSD e Linux che consente al kernel di agire come hypervisor.
A partire dalla versione del kernel 2.6.20, KVM viene unito alla linea principale del kernel Linux.
Utilizzando KVM, puoi configurare facilmente un ambiente di virtualizzazione in una macchina Linux e distribuire un'ampia gamma di sistemi operativi guest tra cui Linux, Windows, BSD, Mac OS e molti altri.
Ora vediamo come installare e configurare KVM in CentOS 8 Linux.
Prerequisiti
Prima di installare KVM, assicurati innanzitutto che il tuo sistema supporti la virtualizzazione hardware. Abbiamo documentato diversi modi per identificare se un sistema Linux supporta la virtualizzazione nella seguente guida.
- Come scoprire se una CPU supporta la tecnologia di virtualizzazione (VT)
Se il tuo sistema supporta la virtualizzazione hardware, continua i seguenti passaggi.
1. Installa e configura KVM nel server CentOS 8
Ai fini di questa guida, utilizzerò il seguente sistema:
Server di virtualizzazione KVM:
- OS – Server minimo CentOS 8 (nessuna GUI)
- Indirizzo IP :192.168.225.53/24
Anche se è stata testata su CentOS 8, questa guida dovrebbe andare bene anche su RHEL 8.
1.1. Installa KVM in CentOS 8
Nota: Tutti i comandi forniti in questo tutorial devono essere eseguiti come root
utente. Se hai effettuato l'accesso come utente normale, aggiungi sudo
davanti a tutti i comandi dai di seguito.
Installa Kvm e tutte le dipendenze necessarie per configurare un ambiente di virtualizzazione sul tuo server CentOS 8 usando il comando come root
utente:
# dnf install qemu-kvm libvirt virt-install
Ecco,
- emu-kvm - Metapacchetto QEMU per supporto KVM (ovvero QEMU Full virtualization su hardware x86),
- libvirt - programmi per la libreria libvirt,
- installazione virtuale - programmi per creare e clonare macchine virtuali.
Una volta installato KVM, abilita e avvia libvertd
servizio (se non è già stato avviato):
# systemctl enable libvirtd
# systemctl start libvirtd
Puoi anche combinare entrambi i comandi ed eseguirli come una riga come di seguito:
# systemctl enable --now libvirtd
Controlla lo stato del servizio libvirtd con il comando:
# systemctl status libvirtd
Risultato di esempio:
● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enable> Active: active (running) since Wed 2020-07-15 14:27:32 IST; 5s ago Docs: man:libvirtd(8) https://libvirt.org Main PID: 1097 (libvirtd) Tasks: 17 (limit: 32768) Memory: 57.0M CGroup: /system.slice/libvirtd.service └─1097 /usr/sbin/libvirtd Jul 15 14:27:28 centos8.ostechnix.lan systemd[1]: Starting Virtualization daemon... Jul 15 14:27:32 centos8.ostechnix.lan systemd[1]: Started Virtualization daemon.
Il servizio libvertd è attivo e funzionante!
Verifica se i moduli KVM sono caricati:
# lsmod | grep kvm
Risultato di esempio:
kvm_intel 294912 0 kvm 786432 1 kvm_intel irqbypass 16384 1 kvm
Grande! I moduli KVM vengono caricati. Creiamo ora un bridge di rete.
1.2. Imposta la rete bridge con KVM in CentOS
Una rete collegata condivide l'interfaccia di rete reale del computer host con altre VM per connettersi alla rete esterna. Pertanto ogni VM può collegarsi direttamente a qualsiasi IPv4
disponibile o IPv6
indirizzi, proprio come un computer fisico.
Per impostazione predefinita, KVM configura un bridge virtuale privato, in modo che tutte le VM possano comunicare tra loro, all'interno del computer host.
Fornisce la propria sottorete e DHCP per configurare la rete dell'ospite e utilizza NAT per accedere alla rete host.
Dai un'occhiata all'indirizzo IP delle interfacce virtuali predefinite di KVM usando ip
comando:
# ip a
Risultato di esempio:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff inet 192.168.225.52/24 brd 192.168.225.255 scope global dynamic noprefixroute enp0s3 valid_lft 42217sec preferred_lft 42217sec inet6 2409:4072:918:98cf:ad3b:b969:8ec8:f9c7/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::b404:4d52:8bee:18bf/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
Come puoi vedere, la rete predefinita KVM virbr0
utilizza 192.168.122.1/24
Indirizzo IP. Tutte le macchine virtuali utilizzeranno un indirizzo IP nel 192.168.122.0/24
L'intervallo IP e il sistema operativo host saranno raggiungibili a 192.168.122.1
.
Dovresti essere in grado di accedere al sistema operativo host (in 192.168.122.1
) dall'interno del SO guest e usa scp
per copiare i file avanti e indietro.
Va bene se accedi alle VM all'interno solo dall'host stesso. Tuttavia non è possibile accedere alle VM da altri sistemi remoti nella rete.
Perché utilizzano intervalli IP diversi, ad esempio 192.168.225.0/24
nel mio caso. Per accedere alle VM da altri host remoti, dobbiamo configurare un bridge pubblico che gira sulla rete host e utilizza qualsiasi server DHCP esterno sulla rete host.
Per dirla in parole povere, faremo in modo che tutte le macchine virtuali utilizzino la stessa serie IP utilizzata dal sistema host.
Prima di configurare una rete pubblica con bridge, dobbiamo disabilitare Netfilter per motivi di prestazioni e sicurezza . Netfilter è attualmente abilitato sui bridge per impostazione predefinita.
Per disabilitare netfilter, crea un file chiamato /etc/sysctl.d/bridge.conf
:
# vi /etc/sysctl.d/bridge.conf
Aggiungi le seguenti righe:
net.bridge.bridge-nf-call-ip6tables=0 net.bridge.bridge-nf-call-iptables=0 net.bridge.bridge-nf-call-arptables=0
Salva e chiudi il file.
Quindi crea un altro file chiamato /etc/udev/rules.d/99-bridge.rules
:
# vi /etc/udev/rules.d/99-bridge.rules
Aggiungi la seguente riga:
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/bridge.conf"
Questo imposterà i flag necessari per disabilitare netfilter sui bridge nel punto appropriato all'avvio del sistema. Salva e chiudi il file. Riavvia il sistema per rendere effettive queste modifiche.
Successivamente, dovremmo disabilitare la rete predefinita che KVM ha installato per se stessa.
Trova il nome delle interfacce di rete predefinite di KVM usando il comando "ip link":
# ip link
Risultato di esempio:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff 6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
Come puoi vedere nell'output sopra, le voci virbr0
e virbr0-nic
sono le reti KVM.
Rimuoviamo la rete KVM predefinita con il comando:
# virsh net-destroy default
Risultato di esempio:
Network default destroyed
Annulla la definizione della rete predefinita con il comando:
# virsh net-undefine default
Risultato di esempio:
Network default has been undefined
Se i comandi precedenti non funzionano per qualsiasi motivo, puoi utilizzare questi comandi per disabilitare e annullare la definizione della rete predefinita KVM:
# ip link delete virbr0 type bridge
# ip link delete virbr0-nic
Ora esegui ip link
di nuovo per verificare se il virbr0
e virbr0-nic
le interfacce vengono effettivamente eliminate:
# ip link
Risultato di esempio:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
Bene, le reti predefinite di KVM sono sparite.
Ora, impostiamo il bridge pubblico KVM da utilizzare durante la creazione di una nuova VM.
Crea una nuova interfaccia con bridge denominata br0
usando nmcli
comando:
# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
Imposta l'indirizzo IP per l'interfaccia bridge:
# nmcli connection modify br0 ipv4.addresses 192.168.225.53/24 ipv4.method manual
Imposta Gateway per l'interfaccia bridge:
# nmcli connection modify br0 ipv4.gateway 192.168.225.1
Imposta DNS per l'interfaccia bridge:
# nmcli connection modify br0 ipv4.dns 192.168.225.1
Quindi dobbiamo rimuovere una delle tue schede di interfaccia di rete e aggiungerla come slave al bridge.
Tieni presente che se il tuo server ha solo una NIC e stai accedendo al server tramite SSH, la tua connessione verrà interrotta dopo aver rimosso la NIC. Ti suggerisco di eseguire i seguenti passaggi nella console del tuo server.
Ad esempio, aggiungerò enp0s8
interfaccia come slave dell'interfaccia bridge br0
.
Per rimuovere l'interfaccia di rete enp0s8
, esegui:
# nmcli connection del enp0s8
Sostituisci enp0s8
con la tua scheda di rete.
Nota: Non utilizzare schede di interfaccia di rete wireless per i bridge. La maggior parte degli interlacciati wireless non supporta il bridging. Usa sempre le interfacce di rete cablate per una connettività senza interruzioni!
Quindi, aggiungi enp0s8
al ponte usando il comando:
# nmcli connection add type bridge-slave autoconnect yes con-name enp0s8 ifname enp0s8 master br0
Qui, l'interfaccia di rete del bridge br0
è collegato all'interfaccia di rete dell'host enp0s8
. Sostituisci i nomi delle interfacce di rete sopra che corrispondono alla tua rete.
Riavvia il gestore di rete per rendere effettive le modifiche:
# systemctl restart NetworkManager
Se possibile, è meglio riavviare il sistema:
# reboot
Accedi al tuo server e controlla se l'indirizzo IP è stato assegnato all'interfaccia bridge:
$ ip a
Risultato di esempio:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff inet 192.168.225.53/24 brd 192.168.225.255 scope global noprefixroute br0 valid_lft forever preferred_lft forever inet6 2409:4072:6084:198:df03:d9ed:62eb:df34/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::e8c8:e98b:7fef:5874/64 scope link noprefixroute valid_lft forever preferred_lft forever
Come puoi vedere nell'output sopra, l'interfaccia di rete con bridge br0
viene assegnato l'indirizzo IP 192.168.225.53
e il enp0s8
la voce ora ha master br0
iscrizione. Significa che enp0s8
appartiene al ponte.
Puoi anche utilizzare bridge
comando per mostrare lo stato del bridge:
# bridge link show br0 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
Abbiamo creato con successo un'interfaccia bridge ed è attiva. Dobbiamo fare un'ultima cosa.
Dovremmo configurare KVM per utilizzare questa interfaccia bridge come interfaccia predefinita. Per farlo, crea un XML
file chiamato host-bridge.xml
:
# vi host-bridge.xml
Aggiungi le seguenti righe:
<network> <name>host-bridge</name> <forward mode="bridge"/> <bridge name="br0"/> </network>
Esegui i seguenti comandi per avviare il bridge appena creato e impostarlo come bridge predefinito per le VM:
# virsh net-define host-bridge.xml
# virsh net-start host-bridge
# virsh net-autostart host-bridge
Verifica se il bridge è attivo e avviato utilizzando il comando:
# virsh net-list --all
Risultato di esempio:
Name State Autostart Persistent ------------------------------------------------ host-bridge active yes yes
Congratulazioni! Abbiamo installato e configurato correttamente KVM nel server senza testa CentOS 8.
2. Crea e gestisci macchine guest KVM
Possiamo creare e gestire VM sia dalla riga di comando che utilizzando qualsiasi strumento di gestione KVM come Cockpit e Virt-manager. Fare riferimento alle seguenti guide per maggiori dettagli.
- Come gestire le macchine virtuali KVM con il programma Virsh
- Gestisci macchine virtuali KVM utilizzando Cockpit Web Console
- Come gestire macchine virtuali KVM con Virt-Manager
3. Abilita l'accesso alla console Virsh per le macchine virtuali
Dopo aver creato i guest KVM, posso accedervi tramite SSH, client VNC, Virt-viewer, Virt-manager e console web Cockpit ecc. Ma non ho potuto accedervi usando virsh console
comando. Per accedere ai guest KVM utilizzando la "console virsh", fare riferimento alla seguente guida:
- Come abilitare l'accesso alla console Virsh per gli ospiti KVM
Altre guide relative a KVM su questo blog
- Installa e configura KVM in Ubuntu 20.04 Headless Server
- Installa e configura KVM in OpenSUSE Tumbleweed
- Crea una macchina virtuale KVM utilizzando l'immagine Qcow2 in Linux
- Come migrare le VM Virtualbox in VM KVM in Linux
- Abilita il supporto UEFI per macchine virtuali KVM in Linux
- Come abilitare la virtualizzazione annidata in KVM in Linux
- Visualizza le statistiche dei sistemi di virtualizzazione con Virt-top in Linux
- Come trovare l'indirizzo IP di una macchina virtuale KVM
- Come rinominare la macchina virtuale guest KVM
- Accedi e modifica le immagini del disco della macchina virtuale con Libguestfs
- Crea rapidamente immagini di macchine virtuali con Virt-builder
- Come salvare macchine virtuali con Virt-rescue
- Come estendere la dimensione del disco della macchina virtuale KVM in Linux
- Imposta una cartella condivisa tra host KVM e guest
- Come modificare la posizione dello storage pool predefinito di KVM Libvirt
- [Risolto] Impossibile accedere al file di archiviazione, autorizzazione negata Errore in KVM Libvirt
- Come esportare e importare macchine virtuali KVM in Linux
Conclusione
In questa guida, abbiamo discusso su come installare e configurare KVM nell'edizione server CentOS 8.
Abbiamo anche esaminato come creare e gestire macchine virtuali KVM dalla riga di comando utilizzando virsh
strumento e utilizzando strumenti GUI denominati Cockpit e Virt-manager.
Infine, abbiamo visto come abilitare l'accesso alla console virsh per le macchine virtuali KVM.
A questo punto, dovresti avere un ambiente di virtualizzazione completamente funzionante nel tuo server CentOS 8.