Rackone ⚠ Traduzione non ufficiale

Traduzione della documentazione Proxmox VE realizzata con l'ausilio dell'intelligenza artificiale: può contenere errori o non essere aggiornata. Fa fede la documentazione ufficiale: https://pve.proxmox.com/pve-docs/pve-admin-guide.html

Traduzione a cura di Rackone, Proxmox Gold Partner

Originale del 28/10/2026 · Traduzione aggiornata al 30/10/2026

↑

1. Introduzione

Proxmox VE è una piattaforma per l'esecuzione di macchine virtuali e container. È basata su Debian GNU/Linux ed è completamente open source. Per la massima flessibilità, Proxmox VE fornisce due tecnologie di virtualizzazione—Kernel-based Virtual Machine (KVM) e Linux Containers (LXC).

Un obiettivo di progettazione fondamentale è rendere l'amministrazione il più semplice possibile. È possibile utilizzare Proxmox VE su un singolo nodo, oppure assemblare un cluster composto da molti nodi. Tutte le attività di gestione possono essere svolte tramite l'interfaccia di gestione basata sul web, e anche un utente alle prime armi può configurare e installare Proxmox VE in pochi minuti.

Proxmox Software Stack

1.1. Gestione centralizzata

Sebbene molti utenti inizino con un singolo nodo, Proxmox VE può scalare orizzontalmente fino a un ampio insieme di nodi in cluster. Lo stack del cluster è pienamente integrato ed è incluso nell'installazione predefinita.

Design Multi-Master Unico

Ogni nodo in un cluster Proxmox VE può eseguire tutte le attività di gestione. Non esiste un server di gestione centrale con singolo punto di guasto: qualsiasi nodo può gestire l'intero cluster. Questa architettura multi-master mantiene il cluster gestibile anche se singoli nodi sono temporaneamente non disponibili.

Proxmox Cluster File System (pmxcfs)

Proxmox VE utilizza il Proxmox Cluster File System (pmxcfs), un file system basato su database per l'archiviazione dei file di configurazione. È in grado di memorizzare la configurazione di migliaia di macchine virtuali. Corosync replica questi file in tempo reale su tutti i nodi del cluster. Il file system archivia tutti i dati all'interno di un database persistente su disco, mentre una copia risiede in RAM, fornendo una dimensione massima di archiviazione di 128 MiB, più che sufficiente per migliaia di VM.

Proxmox VE è l'unica piattaforma di virtualizzazione che utilizza questo file system a cluster.

Interfaccia di gestione basata sul Web

Proxmox VE è semplice da utilizzare. L'interfaccia web inclusa, basata sul framework JavaScript ExtJS, offre una panoramica chiara di tutti i guest KVM e i container Linux, oltre al pieno controllo su tutte le risorse del cluster. È possibile gestire VM, container, storage e rete dalla GUI, inclusa la visualizzazione della cronologia e del syslog per ogni nodo, l'esecuzione di job di backup o ripristino, la live migration e le attività attivate dall'HA. Non è necessario installare uno strumento di gestione separato o un nodo di gestione aggiuntivo.

Riga di comando

Per gli utenti avanzati che preferiscono la comodità di una shell Unix o di Windows PowerShell, Proxmox VE fornisce un'interfaccia a riga di comando per gestire tutti i componenti dell'ambiente virtuale. Questa interfaccia a riga di comando dispone di completamento automatico intelligente e documentazione completa sotto forma di man page.

API REST

Proxmox VE utilizza un'API RESTful con JSON come formato dati principale. L'intera API è formalmente definita utilizzando JSON Schema, consentendo un'integrazione rapida e semplice per strumenti di gestione di terze parti, come ambienti di hosting personalizzati.

Amministrazione basata sui ruoli

È possibile definire un accesso granulare per tutti gli oggetti (come VM, storage e nodi) utilizzando la gestione degli utenti e dei permessi basata sui ruoli. Ogni permesso specifica un soggetto (un utente o un gruppo) e un ruolo (insieme di privilegi) su un percorso specifico, seguendo il modello di lista di controllo degli accessi.

Realm di autenticazione

Proxmox VE supporta molteplici sorgenti di autenticazione, tra cui Microsoft Active Directory, LDAP, l'autenticazione standard Linux PAM e il server di autenticazione integrato di Proxmox VE.

1.2. Storage flessibile

Il modello di storage di Proxmox VE è molto flessibile. Le immagini delle macchine virtuali possono essere memorizzate su uno o più storage locali, oppure su storage condiviso come NFS o SAN. È possibile configurare tutte le definizioni di storage desiderate, utilizzando tutte le tecnologie di storage disponibili per Debian GNU/Linux.

Uno dei principali vantaggi dell'archiviazione delle VM su storage condiviso è la possibilità di eseguire la migrazione live delle macchine in esecuzione senza alcun downtime, poiché tutti i nodi nel cluster hanno accesso diretto alle immagini disco delle VM.

Sono supportati i seguenti tipi di storage di rete:

  • Gruppo LVM (backing di rete con target iSCSI)

  • Target iSCSI

  • LUN iSCSI (uso diretto)

  • Condivisione NFS

  • Condivisione CIFS

  • Ceph RBD

  • CephFS

  • Proxmox Backup Server

Sono supportati i seguenti tipi di storage locale:

  • Gruppo LVM (dispositivi di backing locali come dispositivi a blocchi, dispositivi Fibre Channel e DRBD)

  • Directory (storage su file system esistente)

  • ZFS

1.3. Backup e ripristino integrati

Lo strumento di backup integrato (vzdump) crea snapshot coerenti di container e guest KVM in esecuzione. Crea un archivio dei dati della VM o del container, inclusi i file di configurazione.

Inoltre, l'integrazione con Proxmox Backup Server offre funzionalità avanzate, tra cui la possibilità di combinare backup completi e deduplicazione dei dati, eseguire la cifratura lato client, effettuare backup su nastro o su storage a oggetti S3 e sincronizzarsi con altre installazioni remote di Proxmox Backup Server.

Il backup live KVM funziona con tutti i tipi di storage, incluse immagini VM su NFS, CIFS, LUN iSCSI e Ceph RBD. Il formato di backup è ottimizzato per memorizzare i backup delle VM in modo efficiente, utilizzando file sparsi, dati fuori ordine e I/O ridotto al minimo.

1.4. Cluster ad Alta Disponibilità

Un cluster Proxmox VE HA multi-nodo consente di rendere altamente disponibili macchine virtuali e container. Il gestore High Availability (HA) integrato rileva automaticamente i guasti dei nodi tramite fencing basato su watchdog e riavvia i servizi interessati sui nodi funzionanti. Non sono necessari strumenti esterni come Pacemaker: lo stack HA è incluso in Proxmox VE ed è configurato interamente tramite l'interfaccia web o la riga di comando.

1.5. Networking flessibile

Proxmox VE utilizza un modello di rete basato su bridge. Tutte le VM possono condividere un bridge come se i cavi di rete virtuali di ciascun guest fossero collegati allo stesso switch. Per connettere le VM al mondo esterno, i bridge vengono collegati a schede di rete fisiche e configurati con un'impostazione TCP/IP.

Per maggiore flessibilità, sono disponibili le Virtual LAN (VLAN, IEEE 802.1q) e il bonding/aggregazione di rete, che consentono di costruire reti virtuali complesse e flessibili per gli host Proxmox VE e di sfruttare tutta la potenza dello stack di rete Linux.

Per ambienti più estesi o multi-tenant, lo stack Software Defined Network (SDN) fornisce l'isolamento di rete basato su zone e supporta protocolli come VXLAN ed EVPN. SDN è completamente integrato nell'interfaccia web ed è installato per impostazione predefinita.

1.6. Firewall integrato

Il firewall integrato consente di filtrare i pacchetti di rete su qualsiasi interfaccia di VM o container. Gli insiemi comuni di regole firewall possono essere raggruppati in "gruppi di sicurezza".

1.7. Infrastruttura Iperconvergente

Proxmox VE è una piattaforma di virtualizzazione che integra strettamente risorse di calcolo, storage e rete, gestisce cluster ad alta disponibilità, backup/ripristino e disaster recovery. Tutti i componenti sono definiti via software e compatibili tra loro.

Pertanto è possibile amministrarli come un unico sistema tramite l'interfaccia di gestione web centralizzata. Queste capacità rendono Proxmox VE una scelta ideale per implementare e gestire un'infrastruttura iperconvergente open source.

1.7.1. Vantaggi di un'infrastruttura iperconvergente (HCI) con Proxmox VE

Un'infrastruttura iperconvergente (HCI) è particolarmente utile per implementazioni in cui un'elevata esigenza infrastrutturale si combina con un budget di amministrazione limitato, per configurazioni distribuite come ambienti di uffici remoti e filiali oppure per cloud privati e pubblici virtuali.

HCI offre i seguenti vantaggi:

  • Scalabilità: espansione senza soluzione di continuità dei dispositivi di elaborazione, rete e storage (ovvero possibilità di aumentare rapidamente server e storage in modo indipendente l'uno dall'altro).

  • Costo contenuto: Proxmox VE è open source e integra tutti i componenti necessari, quali calcolo, storage, rete, backup e centro di gestione. Può sostituire un'infrastruttura di calcolo/storage costosa.

  • Protezione dei dati ed efficienza: sono integrati servizi come backup e disaster recovery.

  • Semplicità: configurazione semplice e amministrazione centralizzata.

  • Open Source: nessun vendor lock-in.

1.7.2. Infrastruttura Iperconvergente: Storage

Proxmox VE offre un supporto strettamente integrato per la distribuzione di un'infrastruttura di storage iperconvergente. È possibile, ad esempio, distribuire e gestire le seguenti due tecnologie di storage utilizzando esclusivamente l'interfaccia web:

Oltre a quanto sopra, Proxmox VE supporta l'integrazione di un'ampia gamma di tecnologie di storage aggiuntive. È possibile trovare informazioni al riguardo nel capitolo Storage Manager.

1.8. Perché Open Source

Proxmox VE utilizza un kernel Linux ed è basato sulla distribuzione Debian GNU/Linux. Il codice sorgente di Proxmox VE è rilasciato sotto la GNU Affero General Public License, versione 3. Ciò significa che è possibile ispezionare il codice sorgente in qualsiasi momento o contribuire personalmente al progetto.

Proxmox si impegna a utilizzare software open source ogniqualvolta possibile. Il software open source garantisce il pieno accesso a tutte le funzionalità, oltre a un elevato livello di sicurezza e affidabilità. Chiunque dovrebbe avere il diritto di accedere al codice sorgente del software per eseguirlo, svilupparlo ulteriormente o inviare modifiche al progetto. Tutti sono incoraggiati a contribuire, mentre Proxmox garantisce che il prodotto soddisfi sempre criteri di qualità professionale.

Il software open source contribuisce inoltre a mantenere bassi i costi e rende l'infrastruttura principale indipendente da un singolo fornitore.

1.9. I tuoi vantaggi con Proxmox VE

  • Software open source

  • Nessun vendor lock-in

  • Kernel Linux

  • Installazione rapida e facilità d'uso

  • Interfaccia di gestione basata sul web

  • API REST

  • Vasta comunità attiva

  • Bassi costi di amministrazione e implementazione semplice

1.10. Come ottenere assistenza

1.10.1. Wiki di Proxmox VE

La fonte principale di informazioni è il Proxmox VE Wiki. Esso combina la documentazione di riferimento con i contenuti forniti dagli utenti.

1.10.2. Forum di supporto della community

Proxmox VE è a sua volta completamente open source, quindi incoraggiamo sempre i nostri utenti a discutere e condividere le proprie conoscenze utilizzando il Proxmox VE Community Forum. Il forum è moderato dal team di supporto Proxmox e conta una vasta base di utenti provenienti da tutto il mondo. Inutile dire che un forum così ampio è un ottimo posto per reperire informazioni.

1.10.3. Liste di distribuzione

Questo è un modo rapido per comunicare con la community di Proxmox VE tramite email.

Proxmox VE è completamente open source e i contributi sono benvenuti! Il canale di comunicazione principale per gli sviluppatori è:

1.10.4. Supporto commerciale

Proxmox Server Solutions GmbH offre anche supporto enterprise disponibile come Proxmox VE Subscription Service Plans. Tutti gli utenti con un abbonamento hanno accesso al Repository Enterprise di Proxmox VE e—con un abbonamento Basic, Standard o Premium—anche al Proxmox Customer Portal. Il customer portal fornisce assistenza e supporto con tempi di risposta garantiti da parte degli sviluppatori Proxmox VE.

Per sconti sui volumi, o per maggiori informazioni in generale, contattare sales@proxmox.com.

1.10.5. Bug Tracker

Proxmox gestisce un bug tracker pubblico all'indirizzo https://bugzilla.proxmox.com. Se si riscontra un problema, segnalarlo lì. Un problema può essere sia un bug sia una richiesta per una nuova funzionalità o un miglioramento. Il bug tracker aiuta a tenere traccia del problema e invierà una notifica una volta risolto.

1.11. Storia del progetto

Il progetto è iniziato nel 2007, seguito da una prima versione stabile nel 2008. All'epoca, utilizzava OpenVZ per i container e KVM per le macchine virtuali. Le funzionalità di clustering erano limitate e l'interfaccia utente era semplice (una pagina web generata dal server).

Il progetto ha rapidamente sviluppato nuove funzionalità utilizzando lo stack cluster Corosync, e l'introduzione del Proxmox Cluster File System (pmxcfs) è stata un grande passo avanti, poiché nasconde completamente la complessità del cluster all'utente. Gestire un cluster di 16 nodi è semplice quanto gestire un singolo nodo.

L'introduzione della REST API, con una specifica dichiarativa completa scritta in JSON Schema, ha permesso ad altre persone di integrare Proxmox VE nella propria infrastruttura e ha reso semplice fornire servizi aggiuntivi.

La REST API ha inoltre reso possibile la sostituzione dell'interfaccia utente originale con una moderna applicazione client-side single-page basata su JavaScript. Il vecchio codice della console VNC basato su Java è stato sostituito con noVNC, per cui è sufficiente un browser web per gestire le VM.

Il supporto per vari tipi di storage è un altro importante traguardo. In particolare, Proxmox VE è stata la prima distribuzione a includere ZFS on Linux per impostazione predefinita nel 2014. Un altro traguardo importante è stata la possibilità di eseguire e gestire lo storage Ceph sui nodi hypervisor. Tali configurazioni sono estremamente convenienti dal punto di vista dei costi.

Quando il progetto è iniziato, Proxmox è stata tra le prime aziende a fornire supporto commerciale per KVM. Il progetto KVM stesso si è evoluto continuamente ed è ora un hypervisor ampiamente utilizzato. Nuove funzionalità vengono introdotte a ogni release. La funzionalità di backup live di KVM, sviluppata da Proxmox, rende possibile creare backup con snapshot su qualsiasi tipo di storage.

Il cambiamento più significativo della versione 4.0 è stato il passaggio da OpenVZ a LXC. I container sono ora profondamente integrati e possono utilizzare le stesse funzionalità di storage e rete delle macchine virtuali. Allo stesso tempo, è stato introdotto il facile da utilizzare gestore di High Availability (HA), semplificando la configurazione e la gestione delle installazioni ad alta disponibilità.

Durante lo sviluppo di Proxmox VE 5, sono state introdotte, tra le molte altre funzionalità, la replica dello storage asincrona e la gestione automatizzata dei certificati tramite ACME/Let's Encrypt.

Lo stack Software Defined Network (SDN) è stato sviluppato in collaborazione con la community. È stato integrato nell'interfaccia web come funzionalità sperimentale nella versione 6.2, semplificando la gestione di configurazioni di rete sofisticate. A partire dalla versione 8.1, l'integrazione SDN è completamente supportata e installata di default.

Il 2020 ha segnato il rilascio di un nuovo progetto, il Proxmox Backup Server, scritto nel linguaggio di programmazione Rust. Proxmox Backup Server è profondamente integrato con Proxmox VE e migliora significativamente le funzionalità di backup implementando backup incrementali, deduplicazione e molto altro.

Un altro nuovo strumento, il Proxmox Offline Mirror, è stato rilasciato nel 2022, consentendo abbonamenti per sistemi che non hanno connessione a Internet pubblica.

Il tanto richiesto tema scuro per l'interfaccia web è stato introdotto nel 2023. Più avanti nello stesso anno, la versione 8.0 ha integrato l'accesso al repository enterprise di Ceph. L'accesso al repository Ceph più stabile è incluso con qualsiasi sottoscrizione Proxmox VE.

L'installazione automatizzata e non presidiata per il programma di installazione ISO ufficiale è stata introdotta nella versione 8.2, semplificando notevolmente le implementazioni su larga scala di Proxmox VE.

Con la procedura guidata di importazione, anch'essa introdotta nella versione 8.2, gli utenti possono migrare facilmente ed efficientemente i guest direttamente da altri hypervisor come VMware ESXi
[Migrate to Proxmox VE https://pve.proxmox.com/wiki/Migrate_to_Proxmox_VE]
. Inoltre, gli archivi in Open Virtualization Format (OVF/OVA) possono ora essere importati direttamente dagli storage basati su file nell'interfaccia web.

1.12. Migliorare la documentazione di Proxmox VE

Contributi e miglioramenti alla documentazione di Proxmox VE sono sempre benvenuti. Esistono diversi modi per contribuire.

Se si riscontrano errori o altri margini di miglioramento in questa documentazione, si prega di segnalare un bug sul Proxmox bug tracker per proporre una correzione.

Se desideri proporre nuovi contenuti, scegli una delle seguenti opzioni:

  • Il wiki: per configurazioni specifiche, guide pratiche o tutorial, il wiki è l'opzione giusta per contribuire.

  • La documentazione di riferimento: Per contenuti generici che risulteranno utili a tutti gli utenti, si prega di proporre il proprio contributo per la documentazione di riferimento. Questa include tutte le informazioni su come installare, configurare, utilizzare e risolvere i problemi relativi alle funzionalità di Proxmox VE. La documentazione di riferimento è scritta nel formato asciidoc. Per modificare la documentazione è necessario clonare il repository git all'indirizzo git://git.proxmox.com/git/pve-docs.git; quindi seguire il documento README.adoc.

Note Per chi è interessato a lavorare sul codice sorgente di Proxmox VE, l'articolo del wiki Documentazione per sviluppatori indica da dove iniziare.

1.13. Tradurre Proxmox VE

L'interfaccia utente di Proxmox VE è in inglese per impostazione predefinita. Tuttavia, grazie ai contributi della comunità, sono disponibili anche traduzioni in altre lingue. È benvenuto qualsiasi supporto nell'aggiunta di nuove lingue, nella traduzione delle funzionalità più recenti e nel miglioramento di traduzioni incomplete o incoerenti.

Per la gestione dei file di traduzione si utilizza gettext. Strumenti come Poedit offrono una comoda interfaccia utente per modificare i file di traduzione, ma è possibile utilizzare qualsiasi editor con cui si preferisce lavorare. Non è richiesta alcuna conoscenza di programmazione per tradurre.

1.13.1. Tradurre con git

I file delle lingue sono disponibili come repository git. Chi ha familiarità con git è invitato a contribuire secondo la documentazione per sviluppatori.

È possibile creare una nuova traduzione procedendo come segue (sostituire <LANG> con l'ID della lingua):

# git clone git://git.proxmox.com/git/proxmox-i18n.git
# cd proxmox-i18n
# make init-<LANG>.po

Oppure è possibile modificare una traduzione esistente, utilizzando l'editor preferito:

# poedit <LANG>.po

1.13.2. Tradurre senza git

Anche senza familiarità con git, è possibile contribuire alla traduzione di Proxmox VE. Per iniziare, è possibile scaricare i file delle lingue qui. Individuare la lingua da migliorare, quindi fare clic con il tasto destro sul link "raw" di tale file di lingua e selezionare Salva link come…. Apportare le modifiche al file e inviare la traduzione finale direttamente a office(at)proxmox.com, insieme a un contributor license agreement firmato.

1.13.3. Verifica della traduzione

Perché la traduzione possa essere utilizzata in Proxmox VE, è necessario prima tradurre il file .po in un file .js. È possibile farlo eseguendo il seguente script, presente nello stesso repository:

# ./po2js.pl -t pve xx.po >pve-lang-xx.js

Il file risultante pve-lang-xx.js può quindi essere copiato nella directory /usr/share/pve-i18n, sul server proxmox, per effettuare la verifica.

In alternativa, è possibile creare un pacchetto deb eseguendo il seguente comando dalla radice del repository:

# make deb
Important Perché entrambi questi metodi funzionino, è necessario avere installati sul sistema i seguenti pacchetti perl. Per Debian/Ubuntu:
# apt-get install perl liblocale-po-perl libjson-perl

1.13.4. Invio della traduzione

È possibile inviare la traduzione completata (file .po) al team Proxmox all'indirizzo office(at)proxmox.com, insieme a un contributor license agreement firmato. In alternativa, con una certa esperienza di sviluppo, è possibile inviarla come patch alla mailing list di sviluppo di Proxmox VE. Vedere la documentazione per sviluppatori.

2. Installazione di Proxmox VE

Proxmox VE è basato su Debian GNU/Linux. Le immagini del disco di installazione (file ISO) fornite da Proxmox includono un sistema Debian completo, oltre a tutti i pacchetti Proxmox VE necessari.

Tip Vedere la tabella di supporto nelle FAQ per la relazione tra le release di Proxmox VE e le release di Debian.

Il programma di installazione guida l'utente durante la configurazione, consentendo di partizionare i dischi locali, applicare configurazioni di sistema di base (ad esempio fuso orario, lingua, rete) e installare tutti i package richiesti. Questo processo non dovrebbe richiedere più di qualche minuto. L'installazione tramite l'ISO fornita è il metodo consigliato sia per i nuovi utenti che per quelli già esistenti.

In alternativa, Proxmox VE può essere installato sopra un sistema Debian esistente. Questa opzione è consigliata solo per utenti avanzati, poiché è richiesta una conoscenza approfondita di Proxmox VE.

2.1. Requisiti di sistema

Si consiglia di utilizzare hardware server di alta qualità quando si esegue Proxmox VE in produzione. Per ridurre ulteriormente l'impatto di un host guasto, è possibile eseguire Proxmox VE in un cluster con macchine virtuali e container ad alta disponibilità (HA).

Proxmox VE può utilizzare storage locale (DAS), SAN, NAS e storage distribuito come Ceph RBD. Per i dettagli, vedere capitolo storage.

2.1.1. Requisiti minimi, per la valutazione

Questi requisiti minimi sono solo per scopi di valutazione e non dovrebbero essere utilizzati in produzione.

  • CPU: x86 a 64 bit (Intel 64 o AMD64). In alternativa, ARM a 64 bit (arm64, aarch64) con una CPU ARMv8-A o più recente, vedere supporto ARM a 64 bit (arm64).

  • Per gli host x86, una CPU e una scheda madre compatibili con Intel VT o AMD-V per il supporto alla virtualizzazione completa KVM. Sulle piattaforme arm64 supportate, la virtualizzazione hardware-assisted KVM non richiede un flag CPU equivalente.

  • RAM: 1 GB di RAM, più la RAM aggiuntiva necessaria per i guest

  • Disco rigido

  • Una scheda di rete (NIC)

  • Intel 64 o AMD64 con un flag CPU Intel VT o AMD-V. In alternativa, un host ARM a 64 bit con una CPU ARMv9-A o più recente, vedere supporto ARM a 64 bit (arm64).

  • Memoria: minimo 2 GB per il sistema operativo e i servizi Proxmox VE, più la memoria dedicata per i guest. Per Ceph e ZFS è richiesta memoria aggiuntiva; circa 1 GB di memoria per ogni TB di storage utilizzato.

  • Storage veloce e ridondante; i migliori risultati si ottengono con SSD.

  • Storage per il sistema operativo: utilizzare un RAID hardware con cache di scrittura protetta da batteria ("BBU") oppure non-RAID con ZFS (SSD opzionale per ZIL).

  • Storage per le VM:

    • Per lo storage locale, utilizzare un RAID hardware con cache di scrittura protetta da batteria (BBU) oppure non-RAID per ZFS e Ceph. Né ZFS né Ceph sono compatibili con un controller RAID hardware.

    • È possibile utilizzare storage condiviso e distribuito.

    • Per ottenere buone prestazioni si consigliano SSD con Power-Loss-Protection (PLP). È sconsigliato l'uso di SSD consumer.

  • NIC (multi-)Gbit ridondanti, con NIC aggiuntive in base alla tecnologia di storage preferita e alla configurazione del cluster.

  • Per il passthrough PCI(e), la CPU e la scheda madre devono supportare un'unità di gestione della memoria di input/output (IOMMU): Intel VT-d o AMD-Vi su x86, oppure un'unità di gestione della memoria di sistema (SMMU) su arm64.

Tip IOMMU di solito deve essere abilitata anche nel BIOS/UEFI. Per i dettagli, vedere il capitolo passthrough PCI(e).

2.1.3. Supporto ARM a 64 bit (arm64)

Proxmox VE supporta in modo nativo ARM a 64 bit (arm64, aarch64) sulle piattaforme NVIDIA Grace Hopper e NVIDIA Vera. Su altro hardware ARMv9-A o più recente basato su UEFI, il supporto è best-effort. I single-board computer basati solo su device-tree, come il Raspberry Pi, non sono supportati.

Un host arm64 deve avviarsi tramite UEFI e descrivere il proprio hardware tramite ACPI (Advanced Configuration and Power Interface). Proxmox VE non supporta l'avvio basato solo su device-tree o il BIOS legacy su arm64.

Diverse funzionalità specifiche di x86 non sono disponibili su arm64:

  • Le macchine virtuali non possono utilizzare SeaBIOS. Su arm64, i guest si avviano sempre tramite UEFI, fornito dalla build ARM di OVMF, nota anche come AAVMF.

  • La crittografia della memoria AMD SEV (Secure Encrypted Virtualization) e le vGPU mediate GVT-g di Intel sono disponibili solo su x86.

  • Non esiste un package di microcodice CPU a livello di sistema operativo, a differenza di intel-microcode e amd64-microcode su x86.

Un cluster può contenere sia nodi x86 che arm64, ma i guest non possono spostarsi tra nodi di architetture diverse mentre sono in esecuzione:

  • La migrazione live è possibile solo tra nodi della stessa architettura, poiché lo stato della CPU di un guest in esecuzione non può essere trasferito tra architetture diverse.

  • Un guest, sia esso una macchina virtuale o un container, viene eseguito solo su un nodo la cui architettura corrisponde a quella del guest. La migrazione offline, il backup e il ripristino, oppure uno storage condiviso possono spostare i dati di un guest su un nodo di un'architettura diversa, ma il guest dovrà comunque essere reinstallato o riconfigurato per quella architettura prima di poter essere avviato.

2.1.4. Panoramica semplice delle prestazioni

Per ottenere una panoramica delle prestazioni della CPU e del disco rigido su un sistema Proxmox VE installato, eseguire lo strumento incluso pveperf.

Note Questo è solo un benchmark molto rapido e generico. Si consigliano test più dettagliati, soprattutto per quanto riguarda le prestazioni I/O del sistema.

2.1.5. Browser web supportati per l'accesso all'interfaccia web

Per accedere all'interfaccia utente basata sul web, si consiglia di utilizzare uno dei browser seguenti:

  • Firefox, una versione dell'anno in corso, oppure l'ultima Extended Support Release

  • Chrome, una versione dell'anno in corso

  • La versione di Edge attualmente supportata da Microsoft

  • Safari, una versione dell'anno in corso

Quando si accede da un dispositivo mobile, Proxmox VE mostrerà un'interfaccia leggera e touch.

2.2. Preparazione del supporto di installazione

Scaricare l'immagine ISO del programma di installazione da: https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso

Il supporto di installazione di Proxmox VE è un'immagine ISO ibrida. Funziona in due modi:

  • Un file immagine ISO pronto per essere masterizzato su CD o DVD.

  • Un file immagine a settori raw (IMG) pronto per essere copiato su una chiavetta USB (USB stick).

Utilizzare una chiavetta USB per installare Proxmox VE è il metodo consigliato perché rappresenta l'opzione più rapida.

2.2.1. Preparazione di una chiavetta USB come supporto di installazione

La chiavetta deve avere una capacità maggiore rispetto all'immagine ISO.

Note Non utilizzare UNetbootin. Non funziona con l'immagine di installazione di Proxmox VE.
Important Assicurarsi che la chiavetta USB non sia montata e non contenga dati importanti.

2.2.2. Istruzioni per GNU/Linux

Sui sistemi operativi Unix-like utilizzare il comando dd per copiare l'immagine ISO sulla chiavetta USB. Individuare prima il nome del dispositivo corretto della chiavetta USB (vedere sotto). Eseguire poi il comando dd.

# dd bs=1M conv=fdatasync if=./proxmox-ve_*.iso of=/dev/XYZ
Note Assicurarsi di sostituire /dev/XYZ con il nome del dispositivo corretto e di adattare il percorso del file di input (if).
Caution Prestare molta attenzione e non sovrascrivere il disco sbagliato!
Individuazione del nome corretto del dispositivo USB

Esistono due modi per scoprire il nome della chiavetta USB. Il primo consiste nel confrontare le ultime righe dell'output del comando dmesg prima e dopo aver collegato la chiavetta. Il secondo modo consiste nel confrontare l'output del comando lsblk. Aprire un terminale ed eseguire:

# lsblk

Collegare quindi la chiavetta USB ed eseguire nuovamente il comando:

# lsblk

Apparirà un nuovo dispositivo. È quello da utilizzare. Per maggiore sicurezza, verificare che la dimensione indicata corrisponda a quella della chiavetta USB.

2.2.3. Istruzioni per macOS

Aprire il terminale (cercare Terminal in Spotlight).

Convertire il file .iso in formato .dmg utilizzando l'opzione convert di hdiutil, ad esempio:

# hdiutil convert proxmox-ve_*.iso -format UDRW -o proxmox-ve_*.dmg
Tip macOS tende ad aggiungere automaticamente .dmg al nome del file di output.

Per ottenere l'elenco attuale dei dispositivi eseguire il comando:

# diskutil list

Inserire quindi la chiavetta USB ed eseguire nuovamente questo comando per determinare quale nodo di dispositivo le è stato assegnato (ad es. /dev/diskX).

# diskutil list
# diskutil unmountDisk /dev/diskX
Note sostituire X con il numero del disco ottenuto dal comando precedente.
# sudo dd if=proxmox-ve_*.dmg bs=1M of=/dev/rdiskX
Note L'uso di rdiskX, anziché di diskX, nell'ultimo comando è intenzionale. Questo aumenterà la velocità di scrittura.

2.2.4. Istruzioni per Windows

Utilizzo di Etcher

Etcher funziona senza configurazioni particolari. Scaricare Etcher da https://etcher.io. Guiderà l'utente attraverso il processo di selezione dell'ISO e della chiavetta USB.

Utilizzo di Rufus

Rufus è un'alternativa più leggera, ma è necessario utilizzare la modalità DD per farlo funzionare. Scaricare Rufus da https://rufus.ie/. Installarlo oppure utilizzare la versione portable. Selezionare l'unità di destinazione e il file ISO di Proxmox VE.

Important Dopo aver fatto clic su Start, occorre fare clic su No nella finestra di dialogo che chiede di scaricare una versione diversa di GRUB. Nella finestra di dialogo successiva selezionare la modalità DD.

2.3. Utilizzo del programma di installazione di Proxmox VE

L'immagine ISO del programma di installazione include quanto segue:

  • Sistema operativo completo (Debian GNU/Linux, 64-bit)

  • Il programma di installazione di Proxmox VE, che partiziona i dischi locali con ext4, XFS, BTRFS (technology preview) o ZFS e installa il sistema operativo

  • Kernel Linux Proxmox VE con supporto KVM e LXC

  • Set completo di strumenti per l'amministrazione di macchine virtuali, container, sistema host, cluster e tutte le risorse necessarie

  • Interfaccia di gestione basata sul web

Note Tutti i dati esistenti sui drive selezionati verranno rimossi durante il processo di installazione. Il programma di installazione non aggiunge voci al menu di avvio per altri sistemi operativi.

Inserire il supporto di installazione preparato (per esempio, unità flash USB o CD-ROM) ed eseguire il boot da esso.

Tip Assicurarsi che il boot dal supporto di installazione (per esempio, USB) sia abilitato nelle impostazioni del firmware del server. Il secure boot deve essere disabilitato quando si avvia un programma di installazione precedente alla versione 8.1 di Proxmox VE.
screenshot/pve-grub-menu.png

Dopo aver scelto la voce corretta (per esempio, Boot from USB), appare il menu di Proxmox VE ed è possibile selezionare una delle seguenti opzioni:

Install Proxmox VE (Graphical)

Avvia l'installazione normale.

Tip È possibile utilizzare la procedura guidata di installazione solo con la tastiera. I pulsanti possono essere attivati premendo il tasto ALT insieme al carattere sottolineato del pulsante corrispondente. Per esempio, ALT + N per premere un pulsante Next.
Install Proxmox VE (Terminal UI)

Avvia la procedura guidata di installazione in modalità terminale. Offre la stessa esperienza di installazione complessiva del programma di installazione grafico, ma generalmente presenta una migliore compatibilità con hardware molto vecchio e molto recente.

Install Proxmox VE (Terminal UI, Serial Console)

Avvia la procedura guidata di installazione in modalità terminale, configurando inoltre il kernel Linux per utilizzare la (prima) porta seriale della macchina per l'input e l'output. Questo può essere utilizzato se la macchina è completamente headless e dispone solo di una console seriale disponibile.

screenshot/pve-tui-installer.png

Entrambe le modalità utilizzano la stessa base di codice per il processo di installazione effettivo, per beneficiare di più di un decennio di correzioni di bug e garantire la parità delle funzionalità.

Tip L'opzione Terminal UI può essere utilizzata nel caso in cui il programma di installazione grafico non funzioni correttamente, per esempio a causa di problemi con i driver. Vedere anche l'aggiunta del parametro del kernel nomodeset.
Advanced Options: Install Proxmox VE (Graphical, Debug Mode)

Avvia l'installazione in modalità debug. Verrà aperta una console in diversi passaggi dell'installazione. Questo aiuta a fare il debug della situazione se qualcosa va storto. Per uscire da una console di debug, premere CTRL-D. Questa opzione può essere utilizzata per avviare un sistema live con tutti gli strumenti di base disponibili. È possibile utilizzarla, per esempio, per riparare un rpool ZFS degradato o correggere il bootloader per una configurazione Proxmox VE esistente.

Advanced Options: Install Proxmox VE (Terminal UI, Debug Mode)

Come la modalità debug grafica, ma prepara il sistema per eseguire invece il programma di installazione basato su terminale.

Advanced Options: Install Proxmox VE (Serial Console Debug Mode)

Come la modalità debug basata su terminale, ma configura inoltre il kernel Linux per utilizzare la (prima) porta seriale della macchina per l'input e l'output.

Advanced Options: Install Proxmox VE (Automated)

Avvia il programma di installazione in modalità non presidiata, anche se l'ISO non è stata preparata adeguatamente per un'installazione automatizzata. Questa opzione può essere utilizzata per raccogliere informazioni sull'hardware o può essere utile per fare il debug di una configurazione di installazione automatizzata. Vedere Installazione non presidiata per maggiori informazioni.

Advanced Options: Rescue Boot

Con questa opzione è possibile avviare un'installazione esistente. La ricerca viene eseguita su tutti i dischi fissi collegati. Se viene trovata un'installazione esistente, il sistema viene avviato direttamente da quel disco utilizzando il kernel Linux presente nell'immagine ISO. Questo può essere utile se ci sono problemi con il bootloader (GRUB/systemd-boot) o se il BIOS/UEFI non è in grado di leggere il blocco di avvio dal disco.

Advanced Options: Test Memory (memtest86+)

Esegue memtest86+. Questo è utile per verificare se la memoria è funzionante e priva di errori. Il Secure Boot deve essere disattivato nell'utilità di configurazione del firmware UEFI per eseguire questa opzione.

Note Questa voce è disponibile solo sui supporti di installazione x86, poiché memtest86+ non supporta arm64.

Normalmente si seleziona Install Proxmox VE (Graphical) per avviare l'installazione.

screenshot/pve-select-target-disk.png

Il primo passaggio consiste nel leggere l'EULA (End User License Agreement). Successivamente, è possibile selezionare uno o più dischi fissi di destinazione per l'installazione.

Caution Per impostazione predefinita, viene utilizzato l'intero server e tutti i dati esistenti vengono rimossi. Assicurarsi che non vi siano dati importanti sul server prima di procedere con l'installazione.

Il pulsante Options consente di selezionare il file system di destinazione, che per impostazione predefinita è ext4. Il programma di installazione utilizza LVM se viene selezionato ext4 o xfs come file system, e offre opzioni aggiuntive per limitare lo spazio LVM (vedere di seguito).

Proxmox VE può anche essere installato su ZFS. Poiché ZFS offre diversi livelli RAID software, questa è un'opzione per i sistemi che non dispongono di un controller RAID hardware. I dischi di destinazione devono essere selezionati nella finestra di dialogo Opzioni. Ulteriori impostazioni specifiche di ZFS possono essere modificate in Opzioni avanzate.

Warning ZFS sopra un qualsiasi RAID hardware non è supportato e può causare la perdita di dati.
screenshot/pve-select-location.png

La pagina successiva richiede opzioni di configurazione di base come posizione, fuso orario e layout di tastiera. La posizione viene utilizzata per selezionare un server di download vicino, al fine di aumentare la velocità degli aggiornamenti. L'installer è generalmente in grado di rilevare automaticamente queste impostazioni, pertanto è necessario modificarle solo in rare situazioni, quando il rilevamento automatico non riesce o quando si desidera utilizzare un layout di tastiera non comunemente usato nel proprio paese.

screenshot/pve-set-password.png

È inoltre necessario specificare la password del superutente (root) e un indirizzo email. La password deve essere composta da almeno 8 caratteri. Si consiglia vivamente di utilizzare una password più robusta. Alcune linee guida sono:

  • Utilizzare una lunghezza minima della password di almeno 12 caratteri.

  • Includere caratteri alfabetici minuscoli e maiuscoli, numeri e simboli.

  • Evitare la ripetizione di caratteri, pattern della tastiera, parole comuni del dizionario, sequenze di lettere o numeri, nomi utente, nomi di parenti o animali domestici, legami romantici (attuali o passati) e informazioni biografiche (ad esempio numeri di identificazione, nomi o date di antenati).

L'indirizzo email viene utilizzato per inviare notifiche all'amministratore di sistema. Ad esempio:

  • Informazioni sugli aggiornamenti dei package disponibili.

  • Messaggi di errore provenienti dai job periodici cron.

screenshot/pve-setup-network.png

Il sistema invia tutte le email di notifica all'indirizzo specificato.

L'ultimo passaggio è la configurazione di rete. Le interfacce di rete attive (UP) mostrano un cerchio pieno davanti al loro nome nel menu a discesa. Si noti che durante l'installazione è possibile specificare un indirizzo IPv4 oppure IPv6, ma non entrambi. Per configurare un nodo dual-stack, aggiungere indirizzi IP aggiuntivi dopo l'installazione.

screenshot/pve-install-summary.png

Il passaggio successivo mostra un riepilogo delle opzioni selezionate precedentemente. Si raccomanda di verificare ogni impostazione e di utilizzare il pulsante Precedente se è necessario modificare un'impostazione.

Dopo aver fatto clic su Install, il programma di installazione inizia a formattare i dischi e a copiare i pacchetti sui dischi di destinazione. Attendere il completamento di questo passaggio; quindi rimuovere il supporto di installazione e riavviare il sistema.

screenshot/pve-installation.png

La copia dei package richiede generalmente diversi minuti, a seconda principalmente della velocità del supporto di installazione e delle prestazioni del disco di destinazione.

Al termine della copia e della configurazione dei package, è possibile riavviare il server. Per impostazione predefinita, questa operazione viene eseguita automaticamente dopo pochi secondi.

Installation Failure

Se l'installazione non è riuscita, controllare gli errori specifici sul secondo TTY (CTRL + ALT + F2) e verificare che il sistema soddisfi i requisiti minimi.

Se l'installazione continua a non funzionare, consultare il capitolo su come ottenere assistenza.

2.3.1. Accesso all'interfaccia di gestione dopo l'installazione

screenshot/gui-login-window.png

Dopo un'installazione riuscita e il riavvio del sistema, è possibile utilizzare l'interfaccia web di Proxmox VE per ulteriori configurazioni.

  1. Puntare il browser all'indirizzo IP indicato durante l'installazione e alla porta 8006, ad esempio: https://youripaddress:8006

  2. Accedere utilizzando il nome utente root (realm PAM) e la password scelta durante l'installazione.

  3. Caricare la propria chiave di sottoscrizione per ottenere l'accesso al repository Enterprise. In caso contrario, sarà necessario configurare uno dei repository pubblici di pacchetti meno testati per ricevere aggiornamenti relativi a correzioni di sicurezza, correzioni di bug e nuove funzionalità.

  4. Verificare la configurazione IP e il nome host.

  5. Verificare il fuso orario.

  6. Verificare le impostazioni del firewall.

2.3.2. Opzioni avanzate di configurazione LVM

L'installer crea un Volume Group (VG) denominato pve, e Logical Volume (LV) aggiuntivi denominati root, data e swap, se viene utilizzato ext4 o xfs. Per controllare la dimensione di questi volumi, utilizzare:

hdsize

Definisce la dimensione totale del disco rigido da utilizzare. In questo modo è possibile riservare spazio libero sul disco rigido per un ulteriore partizionamento (ad esempio per un PV e un VG aggiuntivi sullo stesso disco rigido, utilizzabili per lo storage LVM).

swapsize

Definisce la dimensione del volume swap. Il valore predefinito corrisponde alla dimensione della memoria installata, con un minimo di 4 GB e un massimo di 8 GB. Il valore risultante non può essere superiore a un ottavo della dimensione del disco rigido (hdsize / 8).

Note Se impostato su 0, non verrà creato alcun volume swap.
maxroot

Definisce la dimensione massima del volume root, che memorizza il sistema operativo. Con più di 48 GiB di storage disponibile, il valore predefinito è un quarto della dimensione del disco fisso (hdsize / 4) con un massimo di 96 GiB. Con meno di 48 GiB di storage disponibile, la dimensione del volume root è almeno la metà della dimensione del disco fisso (hdsize / 2).

maxvz

Definisce la dimensione massima del volume data. La dimensione effettiva del volume data è:

datasize = hdsize - rootsize - swapsize - minfree

Dove datasize non può essere superiore a maxvz.

Note In caso di LVM thin, il pool data verrà creato solo se datasize è superiore a 4GB.
Note Se impostato a 0, non verrà creato alcun volume data e la configurazione dello storage sarà adattata di conseguenza.
minfree

Definisce la quantità di spazio libero che deve essere lasciata nel volume group LVM pve. Con più di 128GB di storage disponibile, il valore predefinito è 16GB, altrimenti verrà utilizzato hdsize/8.

Note LVM richiede spazio libero nel VG per la creazione di snapshot (non necessario per gli snapshot lvmthin).

2.3.3. Opzioni di configurazione avanzate ZFS

Il programma di installazione crea il pool ZFS rpool, se viene utilizzato ZFS. Non viene creato alcuno spazio di swap, ma è possibile riservare dello spazio non partizionato sui dischi di installazione per lo swap. È anche possibile creare uno zvol di swap dopo l'installazione, anche se questo può portare a problemi (vedere le note sullo swap ZFS).

ashift

Definisce il valore ashift per il pool creato. ashift deve essere impostato almeno al valore corrispondente alla dimensione del settore dei dischi sottostanti (2 elevato ad ashift è la dimensione del settore), o di qualsiasi disco che potrebbe essere inserito nel pool (ad esempio in caso di sostituzione di un disco difettoso).

compress

Definisce se la compressione è abilitata per rpool.

checksum

Definisce quale algoritmo di checksum deve essere utilizzato per rpool.

copies

Definisce il parametro copies per rpool. Consultare la pagina man zfs(8) per la semantica e per capire perché questo non sostituisce la ridondanza a livello di disco.

ARC max size

Definisce la dimensione massima a cui l'ARC può crescere e quindi limita la quantità di memoria che ZFS utilizzerà. Vedere anche la sezione su come limitare l'utilizzo di memoria di ZFS per maggiori dettagli.

hdsize

Definisce la dimensione totale del disco fisso da utilizzare. Questo è utile per lasciare spazio libero sul disco fisso (o sui dischi fissi) per ulteriori partizionamenti (ad esempio per creare una partizione di swap). hdsize viene considerato solo per i dischi avviabili, ossia solo il primo disco o mirror per RAID0, RAID1 o RAID10, e tutti i dischi in RAID-Z[123].

2.3.4. Opzioni di configurazione avanzate BTRFS

Quando si utilizza BTRFS non viene creato alcuno spazio di swap, ma è possibile riservare dello spazio non partizionato sui dischi di installazione per lo swap. È possibile creare una partizione separata, un subvolume BTRFS o un file di swap utilizzando il comando btrfs filesystem mkswapfile.

compress

Definisce se la compressione è abilitata per il subvolume BTRFS. Sono supportati diversi algoritmi di compressione: on (equivalente a zlib), zlib, lzo e zstd. Il valore predefinito è off.

hdsize

Definisce la dimensione totale del disco fisso da utilizzare. Questo è utile per lasciare spazio libero sul disco fisso (o sui dischi fissi) per ulteriori partizionamenti (ad esempio, per creare una partizione di swap).

2.3.5. Suggerimenti sulle prestazioni ZFS

ZFS funziona meglio con molta memoria. Se si intende utilizzare ZFS, assicurarsi di disporre di RAM sufficiente. Un buon calcolo è 4GB più 1GB di RAM per ogni TB di spazio disco RAW.

ZFS può utilizzare un drive dedicato come cache di scrittura, chiamato ZFS Intent Log (ZIL). Utilizzare un drive veloce (SSD) per questo scopo. Può essere aggiunto dopo l'installazione con il comando seguente:

# zpool add <pool-name> log </dev/path_to_fast_ssd>

2.3.6. Aggiunta del parametro kernel nomodeset

Su hardware molto vecchio o molto recente possono verificarsi problemi a causa dei driver grafici. Se l'installazione si blocca durante l'avvio, è possibile provare ad aggiungere il parametro nomodeset. Questo impedisce al kernel Linux di caricare qualsiasi driver grafico e lo costringe a continuare a utilizzare il framebuffer fornito dal BIOS/UEFI.

Nel menu del bootloader di Proxmox VE, navigare su Install Proxmox VE (Terminal UI) e premere e per modificare la voce. Utilizzando i tasti freccia, posizionarsi sulla riga che inizia con linux, spostare il cursore alla fine di tale riga e aggiungere il parametro nomodeset, separato da uno spazio dall'ultimo parametro preesistente.

Premere quindi Ctrl-X o F10 per avviare la configurazione.

2.4. Installazione non presidiata

Il metodo di installazione automatizzata consente di installare Proxmox VE in modo non presidiato. Ciò consente di automatizzare completamente il processo di configurazione su bare-metal. Una volta completata l'installazione e avviato l'host, è possibile utilizzare strumenti di automazione come Ansible per configurare ulteriormente l'installazione.

Le opzioni necessarie per il programma di installazione devono essere fornite in un file di risposta. Questo file consente di utilizzare regole di filtro per determinare quali dischi e quali schede di rete devono essere utilizzati.

Per utilizzare l'installazione automatizzata, è necessario innanzitutto scegliere una fonte da cui recuperare il file di risposta e quindi preparare un'ISO di installazione con tale scelta.

Una volta preparata l'ISO, il suo menu di avvio iniziale mostrerà una nuova voce di avvio denominata Automated Installation, che viene selezionata automaticamente dopo un timeout di 10 secondi.

Visitare il wiki per ulteriori dettagli e informazioni sull'installazione non presidiata.

2.5. Installare Proxmox VE su Debian

Proxmox VE viene distribuito come un insieme di package Debian e può essere installato sopra una normale installazione Debian. Dopo aver configurato i repository è necessario eseguire i seguenti comandi:

# apt-get update
# apt-get install proxmox-ve

L'installazione su un'installazione Debian esistente sembra semplice, ma presuppone che il sistema di base sia stato installato correttamente e che si sappia come si intende configurare e utilizzare lo storage locale. È inoltre necessario configurare la rete manualmente.

In generale, questa operazione non è banale, specialmente quando si utilizzano LVM o ZFS.

Una guida dettagliata passo per passo è disponibile sul wiki.

3. Amministrazione del sistema host

Le sezioni seguenti si concentreranno sulle attività comuni di virtualizzazione e spiegheranno le specificità di Proxmox VE relative all'amministrazione e alla gestione della macchina host.

Proxmox VE è basato su Debian GNU/Linux con repository aggiuntivi per fornire i package relativi a Proxmox VE. Ciò significa che è disponibile l'intera gamma di package Debian, inclusi aggiornamenti di sicurezza e correzioni di bug. Proxmox VE fornisce un proprio kernel Linux basato sul kernel Ubuntu. Dispone di tutte le funzionalità di virtualizzazione e container necessarie abilitate e include ZFS e diversi driver hardware aggiuntivi.

Per altri argomenti non trattati nelle sezioni seguenti, si rimanda alla documentazione Debian. Il Debian Administrator's Handbook è disponibile online e fornisce un'introduzione completa al sistema operativo Debian (vedere [Hertzog13]).

3.1. Repository dei package

Proxmox VE utilizza APT come strumento di gestione dei package, come qualsiasi altro sistema basato su Debian.

Proxmox VE verifica automaticamente ogni giorno la disponibilità di aggiornamenti dei pacchetti. L'utente root@pam riceve una notifica via email sugli aggiornamenti disponibili. Dalla GUI, è possibile utilizzare il pulsante Changelog per visualizzare ulteriori dettagli su un aggiornamento selezionato.

3.1.1. Repository in Proxmox VE

I repository sono un insieme di package software; possono essere utilizzati per installare nuovo software, ma sono anche importanti per ottenere nuovi aggiornamenti.

Note Sono necessari repository Debian e Proxmox validi per ottenere gli ultimi aggiornamenti di sicurezza, correzioni di bug e nuove funzionalità.

I repository APT sono definiti nel file /etc/apt/sources.list nel formato legacy a riga singola e nei file .sources posti in /etc/apt/sources.list.d/ per il moderno formato deb822 multi-riga; vedere Formati dei repository per i dettagli.

Gestione dei repository
screenshot/gui-node-repositories.png

A partire da Proxmox VE 7, è possibile verificare lo stato dei repository nell'interfaccia web. Il pannello di riepilogo del nodo mostra una panoramica generale dello stato, mentre il pannello separato Repository mostra informazioni dettagliate sullo stato e l'elenco di tutti i repository configurati.

È supportata anche la gestione di base dei repository, ad esempio l'attivazione o la disattivazione di un repository.

I package disponibili da un repository vengono acquisiti eseguendo apt update. Gli aggiornamenti possono essere installati direttamente tramite apt, oppure tramite la GUI (Nodo → Aggiornamenti).

Formati dei repository

I repository dei package possono essere configurati nel file di elenco sorgenti /etc/apt/sources.list e nei file contenuti in /etc/apt/sources.list.d/.

Sono supportati due formati:

riga singola

In un file sources.list a riga singola, ogni riga definisce un repository di package. Le righe vuote vengono ignorate. Un carattere # in qualsiasi punto della riga contrassegna il resto della riga come commento. Questo è il formato legacy. A partire da Debian 13 Trixie, apt segnalerà un avviso relativo all'uso di questo formato. È possibile migrare automaticamente la maggior parte dei repository utilizzando il comando apt modernize-sources.

deb822

Nel formato multi-riga del file repo.sources, ogni voce è costituita da più righe di coppie chiave-valore. Un file può includere più voci separando ogni gruppo con una riga vuota. Questo è il formato moderno.

Repository disponibili

Proxmox VE fornisce tre diversi repository di package, oltre a richiedere i repository di base di Debian.

3.1.2. Repository di base Debian

File /etc/apt/sources.list.d/debian.sources
Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: trixie trixie-updates
Components: main non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb deb-src
URIs: http://security.debian.org/debian-security/
Suites: trixie-security
Components: main non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

3.1.3. Repository Enterprise di Proxmox VE

Questo è il repository consigliato e disponibile per tutti gli utenti con abbonamento Proxmox VE. Contiene i package più stabili ed è adatto all'uso in produzione. Il repository pve-enterprise è abilitato per impostazione predefinita:

File /etc/apt/sources.list.d/pve-enterprise.sources
Types: deb
URIs: https://enterprise.proxmox.com/debian/pve
Suites: trixie
Components: pve-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg

Si noti che è necessaria una chiave di abbonamento valida per accedere al repository pve-enterprise. Sono disponibili diversi livelli di supporto, di cui si possono trovare ulteriori dettagli su https://proxmox.com/en/proxmox-virtual-environment/pricing.

Note Le chiavi di abbonamento sono associate all'architettura dell'host. Un host arm64 necessita di una chiave di abbonamento arm64 dedicata; una chiave x86 non è valida su di esso, e viceversa.
Note È possibile disabilitare questo repository aggiungendo una riga Enabled: no alla voce corrispondente nel file. Questo evita i messaggi di errore se l'host non dispone di una chiave di abbonamento. In tal caso, configurare il repository pve-no-subscription.

3.1.4. Repository No-Subscription di Proxmox VE

Come suggerisce il nome, non è necessaria una chiave di abbonamento per accedere a questo repository. Può essere utilizzato per test e per uso non in produzione. Non è consigliato utilizzarlo su server di produzione, poiché questi package non sono sempre testati e validati in modo altrettanto rigoroso.

Si consiglia di configurare questo repository in /etc/apt/sources.list.d/proxmox.sources.

File /etc/apt/sources.list.d/proxmox.sources
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Note Ricordare che sono sempre necessari i repository di base di Debian in aggiunta a un repository Proxmox VE Proxmox.

3.1.5. Repository di test di Proxmox VE

Questo repository contiene i package più recenti ed è utilizzato principalmente dagli sviluppatori per testare nuove funzionalità. Per configurarlo, aggiungere la seguente sezione al file /etc/apt/sources.list.d/proxmox.sources:

File /etc/apt/sources.list.d/proxmox.sources
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-test
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Warning Il repository pve-test dovrebbe (come suggerisce il nome) essere utilizzato solo per testare nuove funzionalità o correzioni di bug.

3.1.6. Repository dei simboli di debug di Proxmox VE

I package dei simboli di debug, denominati <package>-dbgsym, contengono le informazioni di debug separate corrispondenti al package binario. Non sono necessari per il normale funzionamento, ma consentono a strumenti come gdb, systemd-coredump o crash di produrre backtrace utili durante l'analisi di un crash o di un blocco. Sono forniti in un repository dedicato, separato da quelli normali, per le release di Proxmox VE basate su Debian Bookworm e Trixie (e successive).

File /etc/apt/sources.list.d/pve-dbgsym.sources
Types: deb
URIs: https://dbgsym.proxmox.com/debian/pve
Suites: trixie
Components: pve-dbgsym
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg

Dopo aver abilitato il repository, installare il package -dbgsym corrispondente al binario da sottoporre a debug.

3.1.7. Repository Ceph

I package relativi a Ceph vengono mantenuti aggiornati tramite un repository enterprise Ceph preconfigurato. I package preinstallati consentono di connettersi a un cluster Ceph esterno e di aggiungere i suoi pool RBD o CephFS come storage. È inoltre possibile realizzare un'infrastruttura hyper-converged (HCI) eseguendo Ceph sopra il cluster Proxmox VE.

Le informazioni di questo capitolo sono utili nei seguenti casi:

Installazione di Ceph per realizzare un'infrastruttura HCI

Scegliere uno dei repository descritti di seguito e una release recente di Ceph, che si potrà poi selezionare nella procedura guidata basata sul web o nello strumento CLI.

Si utilizza già l'HCI e si desidera eseguire l'aggiornamento alla successiva versione principale di Ceph

Seguire la relativa guida all'aggiornamento di Ceph.

L'HCI è già in esecuzione e si desidera eseguire l'aggiornamento alla successiva versione principale di Proxmox VE

In un'HCI ogni release principale di Proxmox VE richiede una corrispondente release principale minima di Ceph; seguire la relativa guida all'aggiornamento di Proxmox VE.

Utilizzo di un cluster Ceph esterno anziché di un'infrastruttura HCI

Per installare i package più recenti utilizzati per la connessione a Ceph, applicare gli aggiornamenti di sistema disponibili, scegliere un repository e una release di Ceph tra quelli elencati di seguito, aggiungerlo al nodo tramite il pannello Repository, applicare i nuovi aggiornamenti di sistema disponibili, verificare il risultato eseguendo ceph --version e disabilitare il vecchio repository Ceph.

Ceph releases available in Proxmox VE 9

Per leggere la versione più recente della guida per amministratori relativa alla propria release di Proxmox VE, verificare che tutti gli aggiornamenti di sistema siano installati e che questa pagina sia stata ricaricata.

Fine vita stimata

enterprise

no-subscription

test

ceph-tentacle

2027-11 (v20.2)

consigliato

disponibile

disponibile

ceph-squid

2026-09 (v19.2)

disponibile

disponibile

disponibile

Ceph repositories for Proxmox VE 9

Il contenuto del file ceph.sources riportato di seguito è da intendersi come riferimento (prima di Proxmox VE 9 veniva utilizzato il file ceph.list). Per apportare modifiche, seguire il caso applicabile alla propria situazione come descritto all'inizio di questo sottocapitolo. Se è stato disabilitato un repository nell'interfaccia web e si desidera anche rimuoverlo dall'elenco, è possibile eliminare manualmente la voce corrispondente dal file.

enterprise

Questo repository è consigliato per l'uso in produzione e contiene le versioni dei package più stabili. È accessibile se il nodo Proxmox VE dispone di un abbonamento valido di qualsiasi livello. Per i dettagli e i livelli di supporto clienti inclusi, visitare:

File /etc/apt/sources.list.d/ceph.sources
Types: deb
URIs: https://enterprise.proxmox.com/debian/ceph-tentacle
Suites: trixie
Components: enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg

no-subscription

Questo repository è adatto per il testing e per l'uso non in produzione. È liberamente accessibile e non richiede un abbonamento valido. Dopo un certo periodo, le versioni dei package vengono rese disponibili anche nel repository enterprise.

File /etc/apt/sources.list.d/ceph.sources
Types: deb
URIs: http://download.proxmox.com/debian/ceph-tentacle
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg

test

Questo repository contiene le versioni più recenti dei package ed è utilizzato principalmente dagli sviluppatori per testare nuove funzionalità e correzioni di bug.

File /etc/apt/sources.list.d/ceph.sources
Types: deb
URIs: http://download.proxmox.com/debian/ceph-tentacle
Suites: trixie
Components: test
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Warning Il repository Ceph test dovrebbe (come suggerisce il nome) essere utilizzato solo per testare nuove funzionalità o correzioni di bug.

3.1.8. Repository firmware Debian

A partire da Debian Bookworm (Proxmox VE 8) il firmware non libero (come definito dalle DFSG) è stato spostato nel componente del repository Debian di nuova creazione non-free-firmware.

A partire da Proxmox VE 9 questo repository è abilitato per impostazione predefinita per le nuove installazioni, al fine di garantire la possibilità di ricevere gli aggiornamenti anticipati del microcodice del sistema operativo.

È inoltre possibile acquisire ulteriori file firmware di runtime non già inclusi nel package preinstallato pve-firmware.

Per poter installare i package da questo componente, eseguire editor /etc/apt/sources.list, aggiungere non-free-firmware alla fine di ogni riga di repository .debian.org ed eseguire apt update.

Se l'installazione di Proxmox VE 9 è stata aggiornata da una versione precedente di Proxmox VE e i repository dei package sono stati modernizzati al nuovo stile deb822, sarà necessario adattare invece /etc/apt/sources.list.d/debian.sources. Eseguire editor /etc/apt/sources.list.d/debian.sources e aggiungere non-free-firmware alle righe che iniziano con Components: di ciascuna sezione.

Note Si consiglia di modernizzare i repository dei package. In caso contrario, apt su Debian Trixie segnalerà un avviso. È possibile eseguire apt modernize-sources per farlo.

3.1.9. SecureApt

I file Release nei repository sono firmati con GnuPG. APT utilizza queste firme per verificare che tutti i package provengano da una fonte attendibile.

Se Proxmox VE viene installato da un'immagine ISO ufficiale, la chiave per la verifica è già installata.

Se Proxmox VE viene installato sopra Debian, scaricare e installare la chiave con i seguenti comandi:

 # wget https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg -O /usr/share/keyrings/proxmox-archive-keyring.gpg
Note Il comando wget sopra aggiunge il portachiavi per le release Proxmox basate su Debian Trixie. Una volta installato il package proxmox-archive-keyring, sarà questo a gestire il file. A quel punto, gli hash riportati sotto potrebbero non corrispondere più agli hash di questo file, poiché le chiavi per le nuove release Proxmox vengono aggiunte o rimosse. Si tratta di un comportamento previsto: apt garantirà che vengano utilizzate solo chiavi attendibili. Si consiglia di evitare la modifica di questo file una volta installato proxmox-archive-keyring.

Verificare quindi il checksum con lo strumento CLI sha512sum:

# sha256sum /usr/share/keyrings/proxmox-archive-keyring.gpg
 136673be77aba35dcce385b28737689ad64fd785a797e57897589aed08db6e45 /usr/share/keyrings/proxmox-archive-keyring.gpg

oppure con lo strumento CLI md5sum:

# md5sum /usr/share/keyrings/proxmox-archive-keyring.gpg
77c8b1166d15ce8350102ab1bca2fcbf /usr/share/keyrings/proxmox-archive-keyring.gpg
Note Assicurarsi che il percorso in cui viene installata la chiave corrisponda alle righe Signed-By: presenti nelle sezioni del repository.

3.2. Aggiornamenti software di sistema

Proxmox fornisce aggiornamenti periodici per tutti i repository. Per installare gli aggiornamenti è possibile utilizzare la GUI basata su web oppure i seguenti comandi CLI:

# apt update
# apt full-upgrade
Warning Poiché Proxmox VE utilizza un modello di rilascio continuo basato su Debian, l'esecuzione di apt upgrade potrebbe lasciare i pacchetti in uno stato parzialmente aggiornato o non funzionante. Questo avviene perché apt full-upgrade può anche rimuovere i pacchetti esistenti per soddisfare le dipendenze, se necessario, mentre apt upgrade non può farlo.

Per l'aggiornamento occasionale di Ceph alla release principale successiva, vedere Repository Ceph.

Note Il sistema di gestione dei package APT è molto flessibile e offre numerose funzionalità; vedere man apt, oppure [Hertzog13] per ulteriori informazioni.
Tip Gli aggiornamenti periodici sono essenziali per ottenere le patch più recenti e le correzioni relative alla sicurezza. Gli aggiornamenti principali del sistema vengono annunciati nel forum della community Proxmox VE.

3.3. Aggiornamenti firmware

Gli aggiornamenti firmware descritti in questo capitolo devono essere applicati quando Proxmox VE viene eseguito su un server bare-metal. La valutazione sull'opportunità di configurare gli aggiornamenti firmware all'interno dei guest, ad esempio quando si utilizza il pass-through dei dispositivi, dipende fortemente dalla configurazione in uso ed è pertanto esclusa dall'ambito di questa trattazione.

Oltre agli aggiornamenti software periodici, gli aggiornamenti firmware sono altrettanto importanti per un funzionamento affidabile e sicuro.

Per ottenere e applicare gli aggiornamenti firmware, si consiglia di combinare le opzioni disponibili per riceverli il prima possibile o per riuscire a riceverli del tutto.

Il termine firmware viene solitamente suddiviso dal punto di vista linguistico in microcodice (per le CPU) e firmware (per gli altri dispositivi).

3.3.1. Firmware persistente

Questa sezione è adatta a tutti i dispositivi. Il microcodice aggiornato, solitamente incluso in un aggiornamento BIOS/UEFI, viene memorizzato sulla scheda madre, mentre il resto del firmware viene memorizzato sul rispettivo dispositivo. Questo metodo persistente è particolarmente importante per la CPU, poiché consente il caricamento regolare più precoce possibile del microcodice aggiornato al momento del boot.

Caution Con alcuni aggiornamenti, ad esempio per BIOS/UEFI o controller di storage, la configurazione del dispositivo potrebbe essere ripristinata ai valori predefiniti. Si consiglia di seguire attentamente le istruzioni del fornitore e di eseguire un backup della configurazione attuale.

Si consiglia di verificare con il proprio fornitore quali metodi di aggiornamento sono disponibili.

  • Tra i metodi di aggiornamento comodi per i server figurano il Lifecycle Manager di Dell o i Service Pack di HPE.

  • In alcuni casi sono disponibili anche utility Linux dedicate. Alcuni esempi sono mlxup per le schede NVIDIA ConnectX oppure bnxtnvm/niccli per le schede di rete Broadcom.

  • Anche LVFS rappresenta un'opzione valida, qualora esista una collaborazione con il produttore hardware e l'hardware in uso sia supportato. Il requisito tecnico in tal caso è che il sistema sia stato prodotto dopo il 2014 e che venga avviato tramite UEFI.

Proxmox VE distribuisce una propria versione del package fwupd per abilitare il supporto Secure Boot con la chiave di firma Proxmox. In questo package è stata deliberatamente eliminata la dipendenza consigliata dal package udisks2, a causa di problemi riscontrati nel suo utilizzo sugli hypervisor.

Tip Se le istruzioni di aggiornamento richiedono il riavvio dell'host, assicurarsi che possa essere eseguito in sicurezza. Vedere anche Manutenzione dei nodi.

3.3.2. File firmware di runtime

Questo metodo memorizza il firmware nel sistema operativo Proxmox VE e lo trasferisce a un dispositivo se il relativo firmware persistente è meno recente. È supportato da dispositivi come le schede di rete e grafiche, ma non da quelli che si basano sul firmware persistente, come la scheda madre e i dischi fissi.

In Proxmox VE il package pve-firmware è già installato di default. Pertanto, con i normali aggiornamenti di sistema (APT), il firmware incluso dell'hardware comune viene automaticamente mantenuto aggiornato.

Esiste un ulteriore repository firmware di Debian, ma non è configurato per impostazione predefinita.

Se si tenta di installare un package firmware aggiuntivo ma questo è in conflitto, APT interromperà l'installazione. È possibile che il firmware specifico possa essere ottenuto in un altro modo.

3.3.3. Aggiornamenti del microcodice CPU

Note Gli aggiornamenti del microcodice CPU descritti in questa sezione sono specifici per host x86. Non esiste un package di microcodice equivalente a livello di sistema operativo per arm64.

Gli aggiornamenti del microcodice sono destinati a correggere vulnerabilità di sicurezza riscontrate e altri bug CPU gravi. Sebbene le prestazioni della CPU possano essere influenzate, un microcodice con patch è generalmente comunque più performante di un microcodice senza patch in cui il kernel stesso deve applicare le mitigazioni. In base al tipo di CPU, è possibile che i risultati prestazionali dello stato di fabbrica difettoso non possano più essere raggiunti senza eseguire consapevolmente la CPU in uno stato non sicuro.

Per ottenere una panoramica delle vulnerabilità CPU presenti e delle relative mitigazioni, eseguire lscpu. Le vulnerabilità reali attualmente note possono comparire solo se l'host Proxmox VE è aggiornato, la sua versione non è a fine vita ed è stato riavviato almeno una volta dall'ultimo aggiornamento del kernel.

Oltre all'aggiornamento del microcodice consigliato tramite aggiornamenti BIOS/UEFI persistenti, esiste anche un metodo indipendente tramite gli Early OS Microcode Updates. È comodo da utilizzare e anche molto utile quando il produttore della scheda madre non fornisce più aggiornamenti BIOS/UEFI. Indipendentemente dal metodo utilizzato, è sempre necessario un riavvio per applicare un aggiornamento del microcodice.

Configurare gli aggiornamenti del microcodice nelle prime fasi di avvio del sistema operativo

Per configurare gli aggiornamenti del microcodice applicati nelle prime fasi dell'avvio dal kernel Linux, è necessario:

  1. Abilitare il Debian Firmware Repository

  2. Ottenere i package più recenti disponibili con apt update (oppure utilizzare l'interfaccia web, in Nodo → Aggiornamenti)

  3. Installare il package di microcodice specifico per il produttore della CPU:

    • Per le CPU Intel: apt install intel-microcode

    • Per le CPU AMD: apt install amd64-microcode

  4. Riavviare l'host Proxmox VE

Qualsiasi futuro aggiornamento del microcodice richiederà anch'esso un riavvio per essere caricato.

Versione del microcodice

Per ottenere la revisione del microcodice attualmente in esecuzione, a scopo di confronto o debug:

# grep microcode /proc/cpuinfo | uniq
microcode       : 0xf0

Un package di microcodice contiene aggiornamenti per molte CPU diverse. Tuttavia, gli aggiornamenti specifici per la propria CPU potrebbero non essere frequenti. Pertanto, la semplice osservazione della data sul package non indica quando l'azienda ha effettivamente rilasciato un aggiornamento per la CPU specifica.

Se è stato installato un nuovo package di microcodice e l'host Proxmox VE è stato riavviato, e questo nuovo microcodice è più recente sia della versione incorporata nella CPU che di quella proveniente dal firmware della scheda madre, nel log di sistema comparirà un messaggio che indica "microcode updated early".

# dmesg | grep microcode
[    0.000000] microcode: microcode updated early to revision 0xf0, date = 2021-11-12
[    0.896580] microcode: Microcode Update Driver: v2.2.
Risoluzione dei problemi

A scopo di debug, l'Early OS Microcode Update configurato e applicato regolarmente all'avvio del sistema può essere temporaneamente disabilitato come segue:

  1. assicurarsi che l'host possa essere riavviato in sicurezza

  2. riavviare l'host per accedere al menu GRUB (tenere premuto SHIFT se è nascosto)

  3. sulla voce di avvio Proxmox VE desiderata premere E

  4. andare alla riga che inizia con linux e aggiungere, separato da uno spazio, dis_ucode_ldr

  5. premere CTRL-X per avviare questa volta senza un Early OS Microcode Update

Se si sospetta un problema legato a un recente aggiornamento del microcodice, è opportuno considerare un downgrade del pacchetto piuttosto che la sua rimozione (apt purge <intel-microcode|amd64-microcode>). In caso contrario, potrebbe essere caricato un microcodice memorizzato in modo persistente troppo vecchio, anche se uno più recente funzionerebbe senza problemi.

Un downgrade è possibile se nel repository Debian è disponibile una versione precedente del package di microcodice, come mostrato in questo esempio:

# apt list -a intel-microcode
Listing... Done
intel-microcode/stable-security,now 3.20230808.1~deb12u1 amd64 [installed]
intel-microcode/stable 3.20230512.1 amd64
# apt install intel-microcode=3.202305*
...
Selected version '3.20230512.1' (Debian:12.1/stable [amd64]) for 'intel-microcode'
...
dpkg: warning: downgrading intel-microcode from 3.20230808.1~deb12u1 to 3.20230512.1
...
intel-microcode: microcode will be updated at next boot
...

Assicurarsi (nuovamente) che l'host possa essere riavviato in sicurezza. Per applicare un microcodice meno recente potenzialmente incluso nel package di microcodice per il proprio tipo di CPU, riavviare ora.

Tip

È opportuno bloccare per un certo periodo gli aggiornamenti del pacchetto riportato a una versione precedente e riprovare versioni più recenti in un secondo momento. Anche se in futuro la versione del pacchetto fosse la stessa, nel frattempo gli aggiornamenti di sistema potrebbero aver risolto il problema riscontrato.

# apt-mark hold intel-microcode
intel-microcode set on hold.
# apt-mark unhold intel-microcode
# apt update
# apt full-upgrade

3.4. Configurazione di rete

Proxmox VE utilizza lo stack di rete Linux. Questo fornisce molta flessibilità su come configurare la rete sui nodi Proxmox VE. La configurazione può essere effettuata tramite la GUI, oppure modificando manualmente il file /etc/network/interfaces, che contiene l'intera configurazione di rete. La pagina di manuale interfaces(5) contiene la descrizione completa del formato. Tutti gli strumenti di Proxmox VE si impegnano per mantenere le modifiche manuali dell'utente, ma è comunque preferibile usare la GUI, poiché protegge da errori.

Un'interfaccia bridge Linux (comunemente chiamata vmbrX) è necessaria per collegare i guest alla rete fisica sottostante. Può essere pensata come uno switch virtuale al quale sono collegati i guest e le interfacce fisiche. Questa sezione fornisce alcuni esempi su come configurare la rete per soddisfare diversi casi d'uso come la ridondanza con un bond, vlan oppure configurazioni routed e NAT.

La Software Defined Network è un'opzione per reti virtuali più complesse nei cluster Proxmox VE.

Warning Si sconsiglia l'uso dei tradizionali strumenti Debian ifup e ifdown in caso di dubbio, poiché presentano alcune insidie, come l'interruzione di tutto il traffico dei guest con ifdown vmbrX senza però riconnetterli quando successivamente si esegue ifup sullo stesso bridge.

3.4.1. Applicare le modifiche di rete

Proxmox VE non scrive le modifiche direttamente in /etc/network/interfaces. Invece, vengono scritte in un file temporaneo chiamato /etc/network/interfaces.new, in modo da poter effettuare molte modifiche correlate in una sola volta. Questo permette anche di verificare che le modifiche siano corrette prima di applicarle, poiché una configurazione di rete errata potrebbe rendere un nodo inaccessibile.

Ricarica a caldo della rete con ifupdown2

Con il pacchetto ifupdown2 consigliato (predefinito per le nuove installazioni a partire da Proxmox VE 7.0), è possibile applicare le modifiche alla configurazione di rete senza riavviare. Se la configurazione di rete viene modificata tramite la GUI, è possibile fare clic sul pulsante Apply Configuration. Questo sposterà le modifiche dal file di staging interfaces.new a /etc/network/interfaces e le applicherà a caldo.

Se sono state effettuate modifiche manuali direttamente nel file /etc/network/interfaces, è possibile applicarle eseguendo ifreload -a

Note Se Proxmox VE è stato installato sopra Debian, oppure è stato effettuato l'aggiornamento a Proxmox VE 7.0 da una versione precedente di Proxmox VE, verificare che ifupdown2 sia installato: apt install ifupdown2
Riavviare il nodo per applicare

Un altro modo per applicare una nuova configurazione di rete è riavviare il nodo. In questo caso il servizio systemd pvenetcommit attiverà il file di staging interfaces.new prima che il servizio networking applichi tale configurazione.

3.4.2. Convenzioni di denominazione

Attualmente vengono utilizzate le seguenti convenzioni di denominazione per i nomi dei dispositivi:

  • Dispositivi Ethernet: en*, nomi di interfaccia di rete systemd. Questo schema di denominazione viene utilizzato per le nuove installazioni di Proxmox VE a partire dalla versione 5.0.

  • Dispositivi Ethernet: eth[N], dove 0 ≤ N (eth0, eth1, …) Questo schema di denominazione viene utilizzato per gli host Proxmox VE installati prima della release 5.0. Durante l'aggiornamento alla versione 5.0, i nomi vengono mantenuti inalterati.

  • Nomi dei bridge: generalmente vmbr[N], dove 0 ≤ N ≤ 4094 (vmbr0 - vmbr4094), ma è possibile utilizzare qualsiasi stringa alfanumerica che inizi con un carattere e sia lunga al massimo 10 caratteri.

  • Bond: bond[N], dove 0 ≤ N (bond0, bond1, …)

  • VLAN: basta aggiungere il numero di VLAN al nome del dispositivo, separato da un punto (eno1.50, bond1.30)

Questo semplifica il debug dei problemi di rete, perché il nome del dispositivo indica il tipo di dispositivo.

Nomi delle interfacce di rete systemd

Systemd definisce uno schema di denominazione versionato per i nomi dei dispositivi di rete. Lo schema utilizza il prefisso di due caratteri en per i dispositivi di rete Ethernet. I caratteri successivi dipendono dal driver del dispositivo, dalla posizione del dispositivo e da altri attributi. Alcuni possibili pattern sono:

  • o<index>[n<phys_port_name>|d<dev_port>] — dispositivi onboard

  • s<slot>[f<function>][n<phys_port_name>|d<dev_port>] — dispositivi tramite id hotplug

  • [P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>] — dispositivi per ID del bus

  • x<MAC> — dispositivi per indirizzo MAC

Di seguito alcuni esempi per gli schemi più comuni:

  • eno1 — è la prima NIC on-board

  • enp3s0f1 — è la funzione 1 della NIC sul bus PCI 3, slot 0

Per un elenco completo dei possibili schemi di denominazione dei dispositivi, vedere la pagina man systemd.net-naming-scheme(7).

Una nuova versione di systemd può definire una nuova versione dello schema di denominazione dei dispositivi di rete, che viene poi utilizzata per impostazione predefinita. Di conseguenza, l'aggiornamento a una versione più recente di systemd, ad esempio durante un aggiornamento a una nuova versione principale di Proxmox VE, può cambiare i nomi dei dispositivi di rete e richiedere la modifica della configurazione di rete. Per evitare cambiamenti di nome dovuti a una nuova versione dello schema di denominazione, è possibile fissare manualmente una particolare versione dello schema (vedere di seguito).

Tuttavia, anche con una versione dello schema di denominazione fissata, i nomi dei dispositivi di rete possono comunque cambiare a causa di aggiornamenti del kernel o dei driver. Per evitare completamente i cambiamenti di nome per un particolare dispositivo di rete, è possibile sovrascrivere manualmente il suo nome utilizzando un file link (vedere di seguito).

Per maggiori informazioni sui nomi delle interfacce di rete, vedere Predictable Network Interface Names.

Fissare una versione specifica dello schema di denominazione

È possibile fissare una versione specifica dello schema di denominazione per i dispositivi di rete aggiungendo il parametro net.naming-scheme=<version> alla riga di comando del kernel. Per un elenco delle versioni dello schema di denominazione, vedere la pagina man systemd.net-naming-scheme(7).

Ad esempio, per fissare la versione v252, che è l'ultima versione dello schema di denominazione per una nuova installazione di Proxmox VE 8.0, aggiungere il seguente parametro alla riga di comando del kernel:

net.naming-scheme=v252

Vedere anche questa sezione sulla modifica della riga di comando del kernel. È necessario riavviare per applicare le modifiche.

Sovrascrivere i nomi dei dispositivi di rete
Utilizzare lo strumento pve-network-interface-pinning

Proxmox VE fornisce uno strumento per generare automaticamente file .link per sovrascrivere il nome dei dispositivi di rete. Sostituisce inoltre automaticamente le occorrenze del vecchio nome dell'interfaccia nei seguenti file:

  • /etc/network/interfaces

  • /etc/pve/nodes/<nodename>/host.fw

  • /etc/pve/sdn/controllers.cfg

  • /etc/pve/sdn/fabrics.cfg

Note Poiché la mappatura generata è locale al nodo su cui viene generata, i nomi delle interfacce contenuti nella configurazione del firewall del Datacenter (/etc/pve/firewall/cluster.fw) non vengono aggiornati automaticamente.

I file link generati vengono memorizzati in /usr/local/lib/systemd/network. Per i file di configurazione verrà generato un nuovo file nella stessa posizione con suffisso .new. In questo modo è possibile ispezionare le modifiche apportate alla configurazione utilizzando diff (o un altro visualizzatore di diff a scelta):

diff -y /etc/network/interfaces /etc/network/interfaces.new

Se si notano modifiche problematiche o si desidera annullare le modifiche apportate dallo strumento di pinning prima del riavvio, è sufficiente eliminare tutti i file .new e i rispettivi file link da /usr/local/lib/systemd/network.

Il seguente comando genererà un file .link per tutte le interfacce di rete fisiche che non dispongono ancora di un file .link e aggiornerà i file di configurazione Proxmox VE selezionati (vedere sopra). I nomi generati utilizzeranno il prefisso predefinito nic, quindi i nomi delle interfacce risultanti saranno nic1, nic2, …

pve-network-interface-pinning generate

È possibile sovrascrivere il prefisso predefinito con il flag --prefix:

pve-network-interface-pinning generate --prefix myprefix

È anche possibile fissare solo un'interfaccia specifica:

pve-network-interface-pinning generate --interface enp1s0

Quando si fissa un'interfaccia specifica, è possibile specificare il nome esatto a cui l'interfaccia deve essere fissata:

pve-network-interface-pinning generate --interface enp1s0 --target-name if42

Per applicare le modifiche effettuate da pve-network-interface-pinning alla configurazione di rete, è necessario riavviare il nodo.

È possibile assegnare manualmente un nome a un particolare dispositivo di rete utilizzando un file systemd.link personalizzato. Questo sovrascrive il nome che verrebbe assegnato secondo l'ultimo schema di denominazione dei dispositivi di rete. In questo modo, è possibile evitare cambiamenti di nome dovuti ad aggiornamenti del kernel, aggiornamenti dei driver o nuove versioni dello schema di denominazione.

I file link personalizzati devono essere posizionati in /etc/systemd/network/ e denominati <n>-<id>.link, dove n è una priorità inferiore a 99 e id è un identificativo. Un file link ha due sezioni: [Match] determina a quali interfacce il file verrà applicato; [Link] determina come queste interfacce devono essere configurate, incluso il loro nome.

Per assegnare un nome a un particolare dispositivo di rete, è necessario un modo per identificare in modo univoco e permanente quel dispositivo nella sezione [Match]. Una possibilità è far corrispondere l'indirizzo MAC del dispositivo utilizzando l'opzione MACAddress, poiché è improbabile che cambi.

La sezione [Match] dovrebbe contenere anche un'opzione Type per assicurarsi che corrisponda solo all'interfaccia fisica prevista, e non a interfacce bridge/bond/VLAN con lo stesso indirizzo MAC. Nella maggior parte delle configurazioni, Type dovrebbe essere impostato su ether per far corrispondere solo dispositivi Ethernet, ma alcune configurazioni potrebbero richiedere altre scelte. Vedere la pagina man di systemd.link(5) per maggiori dettagli.

Successivamente, è possibile assegnare un nome utilizzando l'opzione Name nella sezione [Link].

I file link vengono copiati nell'initramfs, quindi si consiglia di aggiornare l'initramfs dopo aver aggiunto, modificato o rimosso un file link:

# update-initramfs -u -k all

Ad esempio, per assegnare il nome enwan0 al dispositivo Ethernet con indirizzo MAC aa:bb:cc:dd:ee:ff, creare un file /etc/systemd/network/10-enwan0.link con il seguente contenuto:

[Match]
MACAddress=aa:bb:cc:dd:ee:ff
Type=ether

[Link]
Name=enwan0

Ricordarsi di modificare /etc/network/interfaces per utilizzare il nuovo nome e di aggiornare l'initramfs come descritto sopra. È necessario riavviare il nodo perché la modifica abbia effetto.

Note Si consiglia di assegnare un nome che inizi con en o eth in modo che Proxmox VE riconosca l'interfaccia come un dispositivo di rete fisico che può quindi essere configurato tramite la GUI. Inoltre, è opportuno assicurarsi che il nome non entri in conflitto con altri nomi di interfaccia in futuro. Una possibilità è assegnare un nome che non corrisponda a nessuno schema di denominazione utilizzato da systemd per le interfacce di rete (vedere sopra), come enwan0 nell'esempio sopra.

Per maggiori informazioni sui file link, vedere la pagina man di systemd.link(5).

3.4.3. Scelta di una configurazione di rete

In base all'attuale organizzazione di rete e alle risorse disponibili è possibile scegliere una configurazione di rete con bridge, instradata (routed) o con mascheramento (masquerading).

Server Proxmox VE in una LAN privata, con un gateway esterno per accedere a Internet

In questo caso il modello Bridged è il più sensato, ed è anche la modalità predefinita nelle nuove installazioni di Proxmox VE. Ciascun sistema guest avrà un'interfaccia virtuale collegata al bridge di Proxmox VE. Questo ha un effetto simile ad avere la scheda di rete del guest collegata direttamente a un nuovo switch nella LAN, con l'host Proxmox VE che svolge il ruolo dello switch.

Server Proxmox VE presso un hosting provider, con intervalli di IP pubblici per i guest

Per questa configurazione, è possibile utilizzare un modello Bridged o Routed, in base a quanto consentito dal provider.

Server Proxmox VE presso un hosting provider, con un singolo indirizzo IP pubblico

In questo caso l'unico modo per ottenere accessi di rete in uscita per i sistemi guest è utilizzare il mascheramento (Masquerading). Per l'accesso di rete in entrata ai guest, sarà necessario configurare il port forwarding.

Per una maggiore flessibilità, è possibile configurare le VLAN (IEEE 802.1q) e il bonding di rete, noto anche come "link aggregation". In questo modo è possibile creare reti virtuali complesse e flessibili.

3.4.4. Configurazione predefinita con un bridge

default-network-setup-bridge.svg

I bridge sono come switch di rete fisici implementati in software. Tutti i guest virtuali possono condividere un singolo bridge, oppure è possibile creare più bridge per separare i domini di rete. Ciascun host può avere fino a 4094 bridge.

Il programma di installazione crea un singolo bridge denominato vmbr0, che è collegato alla prima scheda Ethernet. La configurazione corrispondente in /etc/network/interfaces potrebbe essere simile alla seguente:

auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.10.2/24
        gateway 192.168.10.1
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0

Le macchine virtuali si comportano come se fossero collegate direttamente alla rete fisica. La rete, a sua volta, vede ogni macchina virtuale come se avesse un proprio MAC, anche se vi è un solo cavo di rete che collega tutte queste VM alla rete.

3.4.5. Configurazione instradata

La maggior parte dei provider di hosting non supporta la configurazione sopra descritta. Per motivi di sicurezza, disabilitano la rete non appena rilevano più indirizzi MAC su una singola interfaccia.

Tip Alcuni provider consentono di registrare MAC aggiuntivi tramite la loro interfaccia di gestione. Questo evita il problema, ma può risultare complicato da configurare perché è necessario registrare un MAC per ciascuna delle VM.

È possibile evitare il problema instradando («routing») tutto il traffico tramite una singola interfaccia. Ciò garantisce che tutti i pacchetti di rete utilizzino lo stesso indirizzo MAC.

default-network-setup-routed.svg

Uno scenario comune è quello in cui si dispone di un IP pubblico (si supponga 198.51.100.5 per questo esempio) e di un blocco di IP aggiuntivo per le VM (203.0.113.16/28). Per queste situazioni si consiglia la seguente configurazione:

auto lo
iface lo inet loopback

auto eno0
iface eno0 inet static
        address  198.51.100.5/29
        gateway  198.51.100.1
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up echo 1 > /proc/sys/net/ipv4/conf/eno0/proxy_arp


auto vmbr0
iface vmbr0 inet static
        address  203.0.113.17/28
        bridge-ports none
        bridge-stp off
        bridge-fd 0

L’indirizzo di vmbr0, 203.0.113.17, è il primo indirizzo host utilizzabile del blocco 203.0.113.16/28; l’indirizzo di rete del blocco 203.0.113.16 non può essere assegnato a un’interfaccia.

3.4.6. Masquerading (NAT) con iptables

Il masquerading consente ai guest che dispongono solo di un indirizzo IP privato di accedere alla rete utilizzando l’indirizzo IP dell’host per il traffico in uscita. Ogni pacchetto in uscita viene riscritto da iptables in modo da apparire proveniente dall’host, e le risposte vengono riscritte di conseguenza per essere instradate al mittente originale.

auto lo
iface lo inet loopback

auto eno1
#real IP address
iface eno1 inet static
        address  198.51.100.5/24
        gateway  198.51.100.1

auto vmbr0
#private sub network
iface vmbr0 inet static
        address  10.10.10.1/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

        post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
Note In alcune configurazioni di masquerading con firewall abilitato, potrebbero essere necessarie zone conntrack per le connessioni in uscita. In caso contrario, il firewall potrebbe bloccare le connessioni in uscita poiché queste preferiranno il POSTROUTING del bridge della VM (e non MASQUERADE).

L’aggiunta di queste righe in /etc/network/interfaces può risolvere questo problema:

post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

Per maggiori informazioni in merito, fare riferimento ai seguenti link:

3.4.7. Bond Linux

Il bonding (chiamato anche NIC teaming o Link Aggregation) è una tecnica per associare più NIC a un singolo dispositivo di rete. È possibile raggiungere obiettivi diversi, come rendere la rete tollerante ai guasti, aumentare le prestazioni o entrambe le cose insieme.

L’hardware ad alta velocità come Fibre Channel e il relativo hardware di switching possono risultare piuttosto costosi. Mediante la link aggregation, due NIC possono presentarsi come un’unica interfaccia logica, ottenendo una velocità doppia. Si tratta di una funzionalità nativa del kernel Linux supportata dalla maggior parte degli switch. Se i nodi dispongono di più porte Ethernet, è possibile distribuire i punti di guasto collegando i cavi di rete a switch diversi; la connessione in bond effettuerà il failover su un cavo o sull’altro in caso di problemi di rete.

I link aggregati possono migliorare i tempi di live-migration e la velocità di replica dei dati tra i nodi del cluster Proxmox VE.

Sono disponibili 7 modalità di bonding:

  • Round-robin (balance-rr): trasmette i pacchetti di rete in ordine sequenziale dalla prima interfaccia di rete (NIC) slave disponibile fino all’ultima. Questa modalità fornisce bilanciamento del carico e tolleranza ai guasti.

  • Active-backup (active-backup): solo una NIC slave nel bond è attiva. Un’altra slave diventa attiva se, e solo se, la slave attiva si guasta. L’indirizzo MAC dell’unica interfaccia logica in bond è visibile esternamente solo su una NIC (porta) per evitare distorsioni nello switch di rete. Questa modalità fornisce tolleranza ai guasti.

  • XOR (balance-xor): trasmette i pacchetti di rete in base a [(indirizzo MAC di origine sottoposto a XOR con l’indirizzo MAC di destinazione) modulo numero di NIC slave]. Questo seleziona la stessa NIC slave per ogni indirizzo MAC di destinazione. Questa modalità fornisce bilanciamento del carico e tolleranza ai guasti.

  • Broadcast (broadcast): trasmette i pacchetti di rete su tutte le interfacce di rete slave. Questa modalità fornisce tolleranza ai guasti.

  • Aggregazione dinamica dei collegamenti IEEE 802.3ad (802.3ad)(LACP): crea gruppi di aggregazione che condividono le stesse impostazioni di velocità e duplex. Utilizza tutte le interfacce di rete slave nel gruppo aggregatore attivo secondo la specifica 802.3ad.

  • Adaptive transmit load balancing (balance-tlb): modalità del driver di bonding di Linux che non richiede alcun supporto speciale da parte dello switch di rete. Il traffico dei pacchetti di rete in uscita viene distribuito in base al carico corrente (calcolato in relazione alla velocità) su ciascuna interfaccia di rete slave. Il traffico in entrata viene ricevuto da un’unica interfaccia di rete slave attualmente designata. Se questa slave di ricezione si guasta, un’altra slave assume l’indirizzo MAC della slave di ricezione guasta.

  • Bilanciamento del carico adattivo (balance-alb): include balance-tlb oltre al bilanciamento del carico in ricezione (rlb) per il traffico IPV4, e non richiede alcun supporto particolare da parte dello switch di rete. Il bilanciamento del carico in ricezione viene ottenuto tramite negoziazione ARP. Il driver di bonding intercetta le risposte ARP inviate dal sistema locale in uscita e sovrascrive l'indirizzo hardware di origine con l'indirizzo hardware univoco di una delle schede di rete slave all'interno della singola interfaccia bonded logica, in modo che i diversi peer di rete utilizzino indirizzi MAC diversi per il traffico dei pacchetti di rete.

Se lo switch supporta il protocollo LACP (IEEE 802.3ad), si consiglia di utilizzare la modalità di bonding corrispondente (802.3ad). In caso contrario, si dovrebbe generalmente utilizzare la modalità active-backup.

Warning Le modalità di bonding balance-alb e balance-tlb non sono adatte quando gli indirizzi locali non sono noti all'host. Queste modalità di bonding non dovrebbero essere utilizzate quando un bridge Linux con guest viene usato in combinazione con il bond.

Per la rete del cluster (Corosync) si consiglia una configurazione con più reti. Corosync non necessita di un bond per la ridondanza di rete, poiché può passare da una rete all'altra autonomamente qualora una diventi inutilizzabile. Alcune modalità di bonding sono note per essere problematiche per Corosync, vedere Corosync su bond.

La seguente configurazione di bonding può essere utilizzata come rete di storage distribuito/condiviso. Il vantaggio è quello di ottenere maggiore velocità e una rete tollerante ai guasti.

Example: Use bond with fixed IP address
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

iface eno3 inet manual

auto bond0
iface bond0 inet static
      bond-slaves eno1 eno2
      address  192.168.1.2/24
      bond-miimon 100
      bond-mode 802.3ad
      bond-xmit-hash-policy layer2+3

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports eno3
        bridge-stp off
        bridge-fd 0
default-network-setup-bond.svg

Un'altra possibilità è utilizzare il bond direttamente come porta del bridge. Questo può essere utilizzato per rendere la rete guest tollerante ai guasti.

Example: Use a bond as the bridge port
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto bond0
iface bond0 inet manual
      bond-slaves eno1 eno2
      bond-miimon 100
      bond-mode 802.3ad
      bond-xmit-hash-policy layer2+3

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0

3.4.8. VLAN 802.1Q

Una LAN virtuale (VLAN) è un dominio di broadcast partizionato e isolato nella rete a livello due. È quindi possibile avere più reti (4096) in una rete fisica, ciascuna indipendente dalle altre.

Ogni rete VLAN è identificata da un numero spesso chiamato tag. I pacchetti di rete vengono quindi contrassegnati per identificare a quale rete virtuale appartengono.

VLAN per reti guest

Proxmox VE supporta questa configurazione nativamente. È possibile specificare il tag VLAN durante la creazione di una VM. Il tag VLAN fa parte della configurazione di rete del guest. Il livello di rete supporta diverse modalità per implementare le VLAN, in base alla configurazione del bridge:

  • Supporto VLAN sul bridge Linux: In questo caso, la scheda di rete virtuale di ogni guest viene assegnata a un tag VLAN, supportato in modo trasparente dal bridge Linux. È possibile anche la modalità trunk, ma ciò rende necessaria la configurazione all'interno del guest.

  • VLAN "tradizionale" sul bridge Linux: A differenza del metodo con supporto VLAN, questo metodo non è trasparente e crea un dispositivo VLAN con il bridge associato per ciascuna VLAN. Ciò significa che, creando ad esempio un guest sulla VLAN 5, verrebbero create due interfacce eno1.5 e vmbr0v5, che rimarrebbero fino a un riavvio.

  • VLAN Open vSwitch: Questa modalità utilizza la funzionalità VLAN di OVS.

  • VLAN configurata nel guest: Le VLAN vengono assegnate all'interno del guest. In questo caso, la configurazione viene eseguita completamente all'interno del guest e non può essere influenzata dall'esterno. Il vantaggio è la possibilità di utilizzare più di una VLAN su una singola NIC virtuale.

VLAN sull'host

Per consentire la comunicazione dell'host con una rete isolata, è possibile applicare tag VLAN a qualsiasi dispositivo di rete (NIC, bond, bridge). In generale, si consiglia di configurare la VLAN sull'interfaccia con il minor numero di livelli di astrazione tra essa e la NIC fisica.

Ad esempio, in una configurazione predefinita in cui si desidera collocare l'indirizzo di gestione dell'host su una VLAN separata.

Example: Use VLAN 5 for the Proxmox VE management IP with traditional Linux bridge
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno1.5 inet manual

auto vmbr0v5
iface vmbr0v5 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports eno1.5
        bridge-stp off
        bridge-fd 0

auto vmbr0
iface vmbr0 inet manual
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
Example: Use VLAN 5 for the Proxmox VE management IP with VLAN aware Linux bridge
auto lo
iface lo inet loopback

iface eno1 inet manual


auto vmbr0.5
iface vmbr0.5 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1

auto vmbr0
iface vmbr0 inet manual
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

Il prossimo esempio mostra la stessa configurazione, ma utilizzando un bond per rendere questa rete sicura in caso di guasti.

Example: Use VLAN 5 with bond0 for the Proxmox VE management IP with traditional Linux bridge
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto bond0
iface bond0 inet manual
      bond-slaves eno1 eno2
      bond-miimon 100
      bond-mode 802.3ad
      bond-xmit-hash-policy layer2+3

iface bond0.5 inet manual

auto vmbr0v5
iface vmbr0v5 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports bond0.5
        bridge-stp off
        bridge-fd 0

auto vmbr0
iface vmbr0 inet manual
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0

3.4.9. Disabilitare IPv6 sul nodo

Proxmox VE funziona correttamente in tutti gli ambienti, indipendentemente dal fatto che IPv6 sia distribuito o meno. Si consiglia di lasciare tutte le impostazioni ai valori predefiniti forniti.

Qualora fosse comunque necessario disabilitare il supporto per IPv6 sul nodo, è possibile farlo creando un apposito file snippet sysctl.conf (5) e impostando i relativi sysctl, ad esempio aggiungendo /etc/sysctl.d/disable-ipv6.conf con il seguente contenuto:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Questo metodo è preferibile rispetto alla disabilitazione del caricamento del modulo IPv6 tramite la riga di comando del kernel.

3.4.10. Disabilitare l'apprendimento MAC su un bridge

Per impostazione predefinita, l'apprendimento MAC è abilitato su un bridge per garantire un'esperienza fluida con i guest virtuali e le relative reti.

Tuttavia, in alcuni ambienti questo comportamento può non essere desiderato. A partire da Proxmox VE 7.3 è possibile disabilitare l'apprendimento MAC sul bridge impostando la configurazione ‘bridge-disable-mac-learning 1` su un bridge in `/etc/network/interfaces’, ad esempio:

# ...

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports ens18
        bridge-stp off
        bridge-fd 0
        bridge-disable-mac-learning 1

Una volta abilitata questa opzione, Proxmox VE aggiungerà manualmente l'indirizzo MAC configurato delle VM e dei container al forwarding database del bridge, per garantire che il guest possa continuare a utilizzare la rete, ma solo quando utilizza il proprio indirizzo MAC effettivo.

3.5. Sincronizzazione dell'orario

Lo stack del cluster di Proxmox VE si basa fortemente sul fatto che tutti i nodi abbiano l'orario sincronizzato con precisione. Anche alcuni altri componenti, come Ceph, non funzionano correttamente se l'orario locale su tutti i nodi non è sincronizzato.

La sincronizzazione dell'orario tra i nodi può essere ottenuta utilizzando il "Network Time Protocol" (NTP). A partire da Proxmox VE 7, chrony viene utilizzato come demone NTP predefinito, mentre Proxmox VE 6 utilizza systemd-timesyncd. Entrambi sono preconfigurati per utilizzare un insieme di server pubblici.

Important Se si aggiorna il sistema a Proxmox VE 7, si consiglia di installare manualmente chrony, ntp oppure openntpd.

3.5.1. Utilizzo di server NTP personalizzati

In alcuni casi, può essere desiderabile utilizzare server NTP diversi da quelli predefiniti. Ad esempio, se i nodi Proxmox VE non hanno accesso a internet pubblico a causa di regole firewall restrittive, è necessario configurare server NTP locali e indicare al demone NTP di utilizzarli.

Per i sistemi che utilizzano chrony:

Specificare quali server chrony deve utilizzare in /etc/chrony/chrony.conf:

server ntp1.example.com iburst
server ntp2.example.com iburst
server ntp3.example.com iburst

Riavviare chrony:

# systemctl restart chronyd

Controllare il journal per confermare che i server NTP appena configurati siano effettivamente in uso:

# journalctl --since -1h -u chrony
...
Aug 26 13:00:09 node1 systemd[1]: Started chrony, an NTP client/server.
Aug 26 13:00:15 node1 chronyd[4873]: Selected source 10.0.0.1 (ntp1.example.com)
Aug 26 13:00:15 node1 chronyd[4873]: System clock TAI offset set to 37 seconds
...
Per i sistemi che utilizzano systemd-timesyncd:

Specificare quali server systemd-timesyncd deve utilizzare in /etc/systemd/timesyncd.conf:

[Time]
NTP=ntp1.example.com ntp2.example.com ntp3.example.com ntp4.example.com

Quindi, riavviare il servizio di sincronizzazione (systemctl restart systemd-timesyncd) e verificare che i server NTP appena configurati siano in uso controllando il journal (journalctl --since -1h -u systemd-timesyncd):

...
Oct 07 14:58:36 node1 systemd[1]: Stopping Network Time Synchronization...
Oct 07 14:58:36 node1 systemd[1]: Starting Network Time Synchronization...
Oct 07 14:58:36 node1 systemd[1]: Started Network Time Synchronization.
Oct 07 14:58:36 node1 systemd-timesyncd[13514]: Using NTP server 10.0.0.1:123 (ntp1.example.com).
Oct 07 14:58:36 node1 systemd-timesyncd[13514]: interval/delta/delay/jitter/drift 64s/-0.002s/0.020s/0.000s/-31ppm
...

3.6. Server di metriche esterno

screenshot/gui-datacenter-metric-server-list.png

In Proxmox VE, è possibile definire server di metriche esterni, che riceveranno periodicamente varie statistiche sugli host, sui guest virtuali e sugli storage.

Attualmente sono supportati:

Le definizioni dei server di metriche esterni sono salvate in /etc/pve/status.cfg e possono essere modificate tramite l'interfaccia web.

3.6.1. Configurazione del server Graphite

screenshot/gui-datacenter-metric-server-graphite.png

La porta predefinita è impostata su 2003 e il percorso graphite predefinito è proxmox.

Per impostazione predefinita, Proxmox VE invia i dati tramite UDP, quindi il server graphite deve essere configurato per accettarli. In questo caso è possibile configurare la maximum transmission unit (MTU) per gli ambienti che non utilizzano l'MTU standard di 1500.

È anche possibile configurare il plugin per utilizzare TCP. Per non bloccare l'importante demone di raccolta statistiche pvestatd, è richiesto un timeout per gestire eventuali problemi di rete.

3.6.2. Configurazione del plugin Influxdb

screenshot/gui-datacenter-metric-server-influxdb.png

Proxmox VE invia i dati tramite UDP, quindi il server influxdb deve essere configurato di conseguenza. Se necessario, è possibile configurare anche l'MTU.

Di seguito un esempio di configurazione per influxdb (sul server influxdb):

[[udp]]
   enabled = true
   bind-address = "0.0.0.0:8089"
   database = "proxmox"
   batch-size = 1000
   batch-timeout = "1s"

Con questa configurazione, il server resta in ascolto su tutti gli indirizzi IP sulla porta 8089 e scrive i dati nel database proxmox

In alternativa, il plugin può essere configurato per utilizzare l'API http(s) di InfluxDB 2.x. InfluxDB 1.8.x contiene un endpoint API compatibile con questa API v2 di versione successiva.

Per utilizzarla, impostare influxdbproto su http oppure https (in base alla configurazione). Per impostazione predefinita, Proxmox VE utilizza l'organizzazione proxmox e il bucket/db proxmox (possono essere impostati rispettivamente tramite le configurazioni organization e bucket).

Poiché l'API v2 di InfluxDB è disponibile solo con autenticazione, è necessario generare un token in grado di scrivere nel bucket corretto e impostarlo.

Nell'API compatibile v2 della versione 1.8.x, è possibile utilizzare user:password come token (se richiesto) e si può omettere organization, poiché non ha alcun significato in InfluxDB 1.x.

È anche possibile impostare il timeout HTTP (il valore predefinito è 1s) tramite l'impostazione timeout, così come la dimensione massima del batch (predefinita 25000000 byte) tramite l'impostazione max-body-size (corrispondente all'impostazione di InfluxDB con lo stesso nome).

3.7. Monitoraggio dello stato di salute dei dischi

Sebbene si consigli uno storage robusto e ridondante, può essere molto utile monitorare lo stato di salute dei dischi locali.

A partire da Proxmox VE 4.3, il pacchetto smartmontools
[pagina iniziale di smartmontools https://www.smartmontools.org]
è installato e richiesto. Si tratta di un insieme di strumenti per monitorare e controllare il sistema S.M.A.R.T. dei dischi rigidi locali.

È possibile ottenere lo stato di un disco eseguendo il comando seguente:

# smartctl -a /dev/sdX

dove /dev/sdX è il percorso di uno dei dischi locali.

Se l'output indica:

SMART support is: Disabled

è possibile abilitarlo con il comando:

# smartctl -s on /dev/sdX

Per maggiori informazioni su come utilizzare smartctl, consultare man smartctl.

Per impostazione predefinita, il daemon smartmontools smartd è attivo e abilitato, ed esegue la scansione di tutti i dispositivi corrispondenti a

  • /dev/sd[a-z]

  • /dev/sd[a-z][a-z]

  • /dev/hd[a-t]

  • o /dev/nvme[0-99]

ogni 30 minuti, alla ricerca di errori e avvisi, e invia un'e-mail a root se rileva un problema.

Per maggiori informazioni su come configurare smartd, consultare man smartd e man smartd.conf.

Se i dischi rigidi vengono utilizzati con un controller RAID hardware, molto probabilmente sono disponibili strumenti per monitorare i dischi nell'array RAID e l'array stesso. Per maggiori informazioni al riguardo, consultare il fornitore del controller RAID.

3.8. Logical Volume Manager (LVM)

La maggior parte degli utenti installa Proxmox VE direttamente su un disco locale. Il CD di installazione di Proxmox VE offre diverse opzioni per la gestione del disco locale, e l'impostazione predefinita attuale utilizza LVM. Il programma di installazione consente di selezionare un singolo disco per tale configurazione e utilizza tale disco come volume fisico per il Volume Group (VG) pve. L'output seguente proviene da un'installazione di prova che utilizza un piccolo disco da 8GB:

# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sda3  pve  lvm2 a--  7.87g 876.00m

# vgs
  VG   #PV #LV #SN Attr   VSize VFree
  pve    1   3   0 wz--n- 7.87g 876.00m

Il programma di installazione alloca tre volumi logici (LV) all'interno di questo VG:

# lvs
  LV   VG   Attr       LSize   Pool Origin Data%  Meta%
  data pve  twi-a-tz--   4.38g             0.00   0.63
  root pve  -wi-ao----   1.75g
  swap pve  -wi-ao---- 896.00m
root

Formattato come ext4, e contiene il sistema operativo.

swap

Partizione swap

data

Questo volume utilizza LVM-thin ed è utilizzato per memorizzare le immagini delle VM. LVM-thin è preferibile per questo compito, poiché offre un supporto efficiente per snapshot e cloni.

Per le versioni di Proxmox VE fino alla 4.1, il programma di installazione crea un volume logico standard denominato “data”, montato in /var/lib/vz.

A partire dalla versione 4.2, il volume logico “data” è un pool LVM-thin, utilizzato per memorizzare le immagini guest basate su blocchi, e /var/lib/vz è semplicemente una directory sul file system radice.

3.8.1. Hardware

Si consiglia vivamente di utilizzare un controller RAID hardware (con BBU) per tali configurazioni. Ciò aumenta le prestazioni, fornisce ridondanza e rende più semplice la sostituzione dei dischi (sostituibili a caldo).

LVM di per sé non richiede alcun hardware particolare, e i requisiti di memoria sono molto bassi.

3.8.2. Bootloader

Per impostazione predefinita vengono installati due boot loader. La prima partizione contiene il boot loader GRUB standard. La seconda partizione è una EFI System Partition (ESP), che consente di avviare sistemi EFI e di applicare aggiornamenti firmware persistenti dallo spazio utente.

3.8.3. Creazione di un gruppo di volumi

Si supponga di avere un disco vuoto /dev/sdb, sul quale si desidera creare un gruppo di volumi denominato “vmdata”.

Caution Si noti che i comandi seguenti distruggeranno tutti i dati esistenti su /dev/sdb.

Innanzitutto, creare una partizione.

# sgdisk -N 1 /dev/sdb

Creare un Physical Volume (PV) senza conferma e con una dimensione dei metadati di 250K.

# pvcreate --metadatasize 250k -y -ff /dev/sdb1

Creare un gruppo di volumi denominato “vmdata” su /dev/sdb1

# vgcreate vmdata /dev/sdb1

3.8.4. Creazione di un LV aggiuntivo per /var/lib/vz

Questo può essere fatto facilmente creando un nuovo LV thin.

# lvcreate -n <Name> -V <Size[M,G,T]> <VG>/<LVThin_pool>

Un esempio concreto:

# lvcreate -n vz -V 10G pve/data

Ora è necessario creare un filesystem sul LV.

# mkfs.ext4 /dev/pve/vz

Infine deve essere montato.

Warning assicurarsi che /var/lib/vz sia vuota. In un'installazione predefinita non lo è.

Per renderla sempre accessibile, aggiungere la seguente riga in /etc/fstab.

# echo '/dev/pve/vz /var/lib/vz ext4 defaults 0 2' >> /etc/fstab

3.8.5. Ridimensionamento del thin pool

Ridimensionare il LV e il pool di metadati con il seguente comando:

# lvresize --size +<size[\M,G,T]> --poolmetadatasize +<size[\M,G]> <VG>/<LVThin_pool>
Note Quando si estende il pool di dati, è necessario estendere anche il pool di metadati.

3.8.6. Creazione di un pool LVM-thin

Un thin pool deve essere creato su un gruppo di volumi. Per sapere come creare un gruppo di volumi, vedere la sezione LVM.

# lvcreate -L 80G -T -n vmstore vmdata

3.9. ZFS su Linux

ZFS è un file system integrato con un gestore di volumi logici, progettato da Sun Microsystems. A partire da Proxmox VE 3.4, il port nativo per il kernel Linux del file system ZFS è disponibile come file system opzionale e anche come opzione aggiuntiva per il file system root. Non è necessario compilare manualmente i moduli ZFS: tutti i pacchetti sono inclusi.

Utilizzando ZFS è possibile ottenere funzionalità enterprise di alto livello anche con hardware a basso budget, oltre a sistemi ad alte prestazioni sfruttando il caching su SSD o configurazioni interamente su SSD. ZFS può sostituire costose schede hardware RAID grazie a un carico moderato di CPU e memoria, combinato con una gestione semplice.

General ZFS advantages
  • Configurazione e gestione semplici con la GUI e la CLI di Proxmox VE.

  • Affidabile

  • Protezione contro la corruzione dei dati

  • Compressione dei dati a livello di file system

  • Snapshot

  • Clonazione copy-on-write

  • Vari livelli raid: RAID0, RAID1, RAID10, RAIDZ-1, RAIDZ-2, RAIDZ-3, dRAID, dRAID2, dRAID3

  • Può utilizzare SSD come cache

  • Auto-riparazione

  • Controllo continuo dell'integrità

  • Progettato per elevate capacità di storage

  • Replica asincrona su rete

  • Open Source

  • Crittografia

  • …

3.9.1. Hardware

ZFS dipende fortemente dalla memoria, quindi sono necessari almeno 8 GB per iniziare. In pratica, utilizzare quanta più memoria possibile in base all'hardware/budget disponibile. Per prevenire la corruzione dei dati, si consiglia l'uso di RAM ECC di alta qualità.

Se si utilizza un disco dedicato per cache e/o log, è consigliabile utilizzare un SSD di classe enterprise. Questo può aumentare significativamente le prestazioni complessive.

Important Non utilizzare ZFS sopra un controller RAID hardware che dispone di una propria gestione della cache. ZFS deve comunicare direttamente con i dischi. Un adattatore HBA o un controller tipo LSI flashato in modalità “IT” è più appropriato.

Se si sta sperimentando un'installazione di Proxmox VE all'interno di una VM (virtualizzazione annidata), non utilizzare virtio per i dischi di quella VM, poiché non sono supportati da ZFS. Utilizzare invece IDE o SCSI (funziona anche con il tipo di controller SCSI virtio).

3.9.2. Installazione come file system root

Quando si installa utilizzando il programma di installazione di Proxmox VE, è possibile scegliere ZFS come file system root. È necessario selezionare il tipo di RAID al momento dell'installazione:

RAID0

Chiamato anche “striping”. La capacità di tale volume è la somma delle capacità di tutti i dischi. Tuttavia RAID0 non aggiunge alcuna ridondanza, quindi il guasto di un singolo disco rende il volume inutilizzabile.

RAID1

Chiamato anche “mirroring”. I dati vengono scritti in modo identico su tutti i dischi. Questa modalità richiede almeno 2 dischi delle stesse dimensioni. La capacità risultante è quella di un singolo disco.

RAID10

Una combinazione di RAID0 e RAID1. Richiede almeno 4 dischi.

RAIDZ-1

Una variante del RAID-5, a parità singola. Richiede almeno 3 dischi.

RAIDZ-2

Una variante di RAID-5, a doppia parità. Richiede almeno 4 dischi.

RAIDZ-3

Una variante di RAID-5, a tripla parità. Richiede almeno 5 dischi.

Il programma di installazione partiziona automaticamente i dischi, crea un pool ZFS denominato rpool e installa il file system root sul subvolume ZFS rpool/ROOT/pve-1.

Viene creato un altro subvolume denominato rpool/data per archiviare le immagini delle VM. Per poterlo utilizzare con gli strumenti di Proxmox VE, il programma di installazione crea la seguente voce di configurazione in /etc/pve/storage.cfg:

zfspool: local-zfs
        pool rpool/data
        sparse
        content images,rootdir

Dopo l'installazione, è possibile visualizzare lo stato del pool ZFS utilizzando il comando zpool:

# zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sda2    ONLINE       0     0     0
            sdb2    ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0

errors: No known data errors

Il comando zfs viene utilizzato per configurare e gestire i file system ZFS. Il seguente comando elenca tutti i file system dopo l'installazione:

# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
rpool             4.94G  7.68T    96K  /rpool
rpool/ROOT         702M  7.68T    96K  /rpool/ROOT
rpool/ROOT/pve-1   702M  7.68T   702M  /
rpool/data          96K  7.68T    96K  /rpool/data
rpool/swap        4.25G  7.69T    64K  -

3.9.3. Considerazioni sul livello RAID ZFS

Ci sono alcuni fattori da tenere in considerazione quando si sceglie il layout di un pool ZFS. L'elemento costitutivo di base di un pool ZFS è il dispositivo virtuale, o vdev. Tutti i vdev in un pool vengono utilizzati in egual modo e i dati vengono distribuiti tra di essi mediante striping (RAID0). Per maggiori dettagli sui vdev, consultare la pagina di manuale zpoolconcepts(7).

Prestazioni

Ogni tipo di vdev presenta comportamenti prestazionali diversi. I due parametri di interesse sono le IOPS (Input/Output Operations per Second, operazioni di input/output per secondo) e la larghezza di banda con cui i dati possono essere scritti o letti.

Un vdev mirror (RAID1) si comporta approssimativamente come un singolo disco rispetto a entrambi i parametri durante la scrittura dei dati. Durante la lettura dei dati, le prestazioni scalano linearmente con il numero di dischi nel mirror.

Una situazione comune è avere 4 dischi. Configurandoli come 2 vdev mirror (RAID10), il pool avrà, in scrittura, le stesse caratteristiche di due singoli dischi rispetto a IOPS e larghezza di banda. Per le operazioni di lettura, si comporterà come 4 singoli dischi.

Un RAIDZ, a qualsiasi livello di ridondanza, si comporta approssimativamente come un singolo disco rispetto alle IOPS, con una larghezza di banda elevata. La larghezza di banda disponibile dipende dalle dimensioni del vdev RAIDZ e dal livello di ridondanza.

Un pool dRAID dovrebbe eguagliare le prestazioni di un pool RAIDZ equivalente.

Per l'esecuzione delle VM, nella maggior parte dei casi le IOPS sono la metrica più importante.

Dimensioni, utilizzo dello spazio e ridondanza

Sebbene un pool composto da vdev mirror offra le migliori caratteristiche prestazionali, lo spazio utilizzabile corrisponde al 50% dei dischi disponibili. Meno, se un vdev mirror è composto da più di 2 dischi, ad esempio in un mirror a 3 vie. È necessario almeno un disco funzionante per mirror affinché il pool rimanga operativo.

Lo spazio utilizzabile di un vdev di tipo RAIDZ con N dischi è approssimativamente N-P, dove P è il livello RAIDZ. Il livello RAIDZ indica quanti dischi arbitrari possono guastarsi senza che si verifichi una perdita di dati. Un caso particolare è un pool a 4 dischi con RAIDZ2. In questa situazione è generalmente preferibile utilizzare 2 vdev mirror per ottenere prestazioni migliori, poiché lo spazio utilizzabile sarebbe lo stesso.

Un altro fattore importante, quando si utilizza un qualsiasi livello RAIDZ, è il comportamento dei dataset ZVOL, che vengono utilizzati per i dischi delle VM. Per ogni blocco di dati, il pool necessita di dati di parità che corrispondono almeno alle dimensioni minime del blocco definite dal valore ashift del pool. Con un ashift di 12, le dimensioni del blocco del pool sono 4k. Le dimensioni predefinite del blocco per uno ZVOL sono 8k. Pertanto, in un RAIDZ2 ogni blocco da 8k scritto comporterà la scrittura di altri due blocchi di parità da 4k, 8k + 4k + 4k = 16k. Si tratta ovviamente di un approccio semplificato e la situazione reale sarà leggermente diversa, poiché in questo esempio non si considerano i metadati, la compressione e altri fattori simili.

Questo comportamento può essere osservato controllando le seguenti proprietà dello ZVOL:

  • volsize

  • refreservation (se il pool non è thin provisioned)

  • used (se il pool è thin provisioned e non sono presenti snapshot)

# zfs get volsize,refreservation,used <pool>/vm-<vmid>-disk-X

volsize è la dimensione del disco come viene presentata alla VM, mentre refreservation indica lo spazio riservato sul pool, che comprende lo spazio previsto necessario per i dati di parità. Se il pool è thin provisioned, refreservation verrà impostato a 0. Un altro modo per osservare il comportamento consiste nel confrontare lo spazio disco utilizzato all'interno della VM con la proprietà used. È opportuno considerare che gli snapshot alterano il valore.

Esistono alcune opzioni per contrastare l'aumento dell'utilizzo dello spazio:

  • Aumentare il volblocksize per migliorare il rapporto tra dati e parità

  • Utilizzare vdev mirror invece di RAIDZ

  • Utilizzare ashift=9 (dimensione del blocco di 512 byte)

La proprietà volblocksize può essere impostata solo al momento della creazione di uno ZVOL. Il valore predefinito può essere modificato nella configurazione dello storage. In questo caso, il guest deve essere ottimizzato di conseguenza e, a seconda del caso d'uso, il problema dell'amplificazione della scrittura viene semplicemente spostato dal livello ZFS al guest.

L'impostazione ashift=9 durante la creazione del pool può causare prestazioni scarse, a seconda dei dischi sottostanti, e non può essere modificata in seguito.

I vdev mirror (RAID1, RAID10) presentano un comportamento favorevole per i carichi di lavoro delle VM. È consigliabile utilizzarli, a meno che l'ambiente non presenti esigenze e caratteristiche specifiche per cui le caratteristiche prestazionali di RAIDZ risultino accettabili.

3.9.4. ZFS dRAID

In un ZFS dRAID (RAID declusterizzato) le unità hot spare partecipano al RAID. La loro capacità di riserva viene riservata e utilizzata per la ricostruzione in caso di guasto di un'unità. Ciò consente, in base alla configurazione, una ricostruzione più rapida rispetto a un RAIDZ in caso di guasto di un'unità. Ulteriori informazioni sono disponibili nella documentazione ufficiale di OpenZFS.
[OpenZFS dRAID https://openzfs.github.io/openzfs-docs/Basic%20Concepts/dRAID%20Howto.html]

Note dRAID è pensato per più di 10-15 dischi in un dRAID. Una configurazione RAIDZ dovrebbe essere preferibile per un numero inferiore di dischi nella maggior parte dei casi d'uso.
Note La GUI richiede un disco in più rispetto al minimo (ovvero dRAID1 necessita di 3). Prevede che venga aggiunto anche un disco di riserva.
  • dRAID1 o dRAID: richiede almeno 2 dischi, uno può guastarsi prima che i dati vengano persi

  • dRAID2: richiede almeno 3 dischi, due possono guastarsi prima che i dati vengano persi

  • dRAID3: richiede almeno 4 dischi, tre possono guastarsi prima che i dati vengano persi

Ulteriori informazioni sono disponibili nella pagina del manuale:

# man zpoolconcepts
Spare e dati

Il numero di spares indica al sistema quanti dischi tenere pronti in caso di guasto di un disco. Il valore predefinito è 0 spares. Senza dischi di riserva, la ricostruzione non beneficia di alcun vantaggio in termini di velocità.

data definisce il numero di dispositivi in un gruppo di ridondanza. Il valore predefinito è 8. Salvo nei casi in cui disks - parity - spares sia inferiore a 8, nel qual caso viene utilizzato il numero inferiore. In generale, un numero minore di dispositivi data comporta IOPS più elevati, rapporti di compressione migliori e un resilvering più rapido, ma definire un numero inferiore di dispositivi dati riduce la capacità di storage disponibile del pool.

3.9.5. Bootloader

Proxmox VE utilizza proxmox-boot-tool per gestire la configurazione del bootloader. Per i dettagli, consultare il capitolo sui bootloader host di Proxmox VE.

3.9.6. Amministrazione di ZFS

Questa sezione fornisce alcuni esempi di utilizzo per le attività più comuni. ZFS di per sé è estremamente potente e offre numerose opzioni. I comandi principali per gestire ZFS sono zfs e zpool. Entrambi i comandi dispongono di ottime pagine di manuale, consultabili con:

# man zpool
# man zfs
Creazione di un nuovo zpool

Per creare un nuovo pool, è necessario almeno un disco. Il valore di ashift dovrebbe corrispondere a una dimensione del settore (2 elevato a ashift) uguale o superiore a quella del disco sottostante.

# zpool create -f -o ashift=12 <pool> <device>
Tip

I nomi dei pool devono rispettare le seguenti regole:

  • iniziare con una lettera (a-z o A-Z)

  • contenere solo caratteri alfanumerici, -, _, ., : o ` ` (spazio)

  • non devono iniziare con uno tra mirror, raidz, draid o spare

  • non devono essere log

Per attivare la compressione (vedere la sezione Compressione in ZFS):

# zfs set compression=lz4 <pool>
Creazione di un nuovo pool con RAID-0

Almeno 1 disco

# zpool create -f -o ashift=12 <pool> <device1> <device2>
Creazione di un nuovo pool con RAID-1

Minimo 2 dischi

# zpool create -f -o ashift=12 <pool> mirror <device1> <device2>
Creazione di un nuovo pool con RAID-10

Minimo 4 dischi

# zpool create -f -o ashift=12 <pool> mirror <device1> <device2> mirror <device3> <device4>
Creazione di un nuovo pool con RAIDZ-1

Minimo 3 dischi

# zpool create -f -o ashift=12 <pool> raidz1 <device1> <device2> <device3>
Creazione di un nuovo pool con RAIDZ-2

Minimo 4 dischi

# zpool create -f -o ashift=12 <pool> raidz2 <device1> <device2> <device3> <device4>

Si consiglia di leggere la sezione Considerazioni sui livelli RAID di ZFS per ottenere una stima approssimativa delle aspettative in termini di IOPS e di banda prima di configurare un pool, in particolare quando si desidera utilizzare una modalità RAID-Z.

Estensione di RAIDZ-N
Note Questa funzionalità è disponibile solo a partire da Proxmox VE 9 (ZFS 2.3.3).

Supponendo di avere un <pool> esistente con un vdev RAIDZ-N <raidzN-M>, è possibile aggiungere un nuovo disco fisico <device> utilizzando la seguente sintassi:

zpool attach <pool> <raidzN-M> <device>

È possibile verificare il successo generale dell'operazione eseguendo zpool status <pool> e ottenere un output verboso per tutti i dischi collegati eseguendo zpool list <pool> -v. Per controllare la nuova capacità del pool eseguire zfs list <pool>.

Creare un nuovo pool con cache (L2ARC)

È possibile utilizzare un dispositivo dedicato o una partizione come cache di secondo livello per aumentare le prestazioni. Un dispositivo di cache di questo tipo è particolarmente utile con carichi di lavoro con letture casuali di dati per lo più statici. Poiché agisce come un ulteriore livello di cache tra lo storage effettivo e l'ARC in memoria, può essere utile anche se l'ARC deve essere ridotto a causa di vincoli di memoria.

Create ZFS pool with a on-disk cache
# zpool create -f -o ashift=12 <pool> <device> cache <cache-device>

In questo caso sono stati utilizzati un solo <device> e un solo <cache-device>, ma è possibile utilizzare più dispositivi, come mostrato in Creare un nuovo pool con RAID.

Si noti che per i dispositivi di cache non esistono modalità mirror o RAID: vengono semplicemente tutti accumulati.

Se un dispositivo di cache produce errori in lettura, ZFS reindirizzerà in modo trasparente la richiesta al livello di storage sottostante.

Creare un nuovo pool con log (ZIL)

È possibile utilizzare un disco dedicato, o una partizione, per lo ZFS Intent Log (ZIL); viene utilizzato principalmente per fornire transazioni sincrone sicure, quindi spesso in percorsi critici per le prestazioni come i database, o altri programmi che eseguono operazioni di fsync con maggiore frequenza.

Il pool viene utilizzato come posizione predefinita per lo ZIL; reindirizzare il carico I/O dello ZIL verso un dispositivo separato può contribuire a ridurre le latenze delle transazioni, alleggerendo al contempo il carico sul pool principale e migliorando le prestazioni complessive.

Per i dischi da utilizzare come dispositivi di log, direttamente o tramite una partizione, si raccomanda di:

  • utilizzare SSD veloci con protezione da perdita di alimentazione (power-loss protection), poiché hanno latenze di commit molto inferiori.

  • Utilizzare almeno alcuni GB per la partizione (o per l'intero dispositivo), ma utilizzare più della metà della memoria installata non offre alcun vantaggio reale.

Create ZFS pool with separate log device
# zpool create -f -o ashift=12 <pool> <device> log <log-device>

Nell'esempio precedente vengono utilizzati un singolo <device> e un singolo <log-device>, ma è anche possibile combinarlo con altre varianti RAID, come descritto nella sezione Creare un nuovo pool con RAID.

È anche possibile eseguire il mirroring del log device su più device; questo è utile soprattutto per garantire che le prestazioni non degradino immediatamente in caso di guasto di un singolo log device.

Se tutti i log device si guastano, verrà nuovamente utilizzato il pool ZFS principale, finché i log device non vengono sostituiti.

Aggiungere cache e log a un pool esistente

Se si dispone di un pool senza cache e log, è comunque possibile aggiungerli entrambi, o solo uno di essi, in qualsiasi momento.

Ad esempio, si supponga di disporre di un buon SSD enterprise con protezione da perdita di alimentazione che si desidera utilizzare per migliorare le prestazioni complessive del pool.

Poiché le dimensioni massime di un log device dovrebbero essere pari a circa la metà della dimensione della memoria fisica installata, ciò significa che lo ZIL occuperà molto probabilmente solo una parte relativamente piccola dell'SSD; lo spazio rimanente può essere utilizzato come cache.

Occorre prima creare due partizioni GPT sull'SSD con parted o gdisk.

A questo punto è possibile aggiungerle a un pool:

Add both, a separate log device and a second-level cache, to an existing pool
# zpool add -f <pool> log <device-part1> cache <device-part2>

È sufficiente sostituire <pool>, <device-part1> e <device-part2> con il nome del pool e i due percorsi /dev/disk/by-id/ delle partizioni.

È anche possibile aggiungere ZIL e cache separatamente.

Add a log device to an existing ZFS pool
# zpool add <pool> log <log-device>
Sostituzione di un device guasto
# zpool replace -f <pool> <old-device> <new-device>
Changing a failed bootable device

In base a come è stato installato Proxmox VE, viene utilizzato come bootloader systemd-boot oppure GRUB tramite proxmox-boot-tool
[Sistemi installati con Proxmox VE 6.4 o versioni successive, sistemi EFI installati con Proxmox VE 5.4 o versioni successive]
oppure GRUB tradizionale (vedere Bootloader dell'host). È possibile verificarlo eseguendo:

# proxmox-boot-tool status

I primi passaggi di copia della tabella delle partizioni, reimpostazione dei GUID e sostituzione della partizione ZFS sono gli stessi. Per rendere il sistema avviabile dal nuovo disco, sono necessari passaggi diversi in base al bootloader in uso.

# sgdisk <healthy bootable device> -R <new device>
# sgdisk -G <new device>
# zpool replace -f <pool> <old zfs partition> <new zfs partition>
Note Utilizzare il comando zpool status -v per monitorare l'avanzamento del processo di resilvering del nuovo disco.
With proxmox-boot-tool:
# proxmox-boot-tool format <new disk's ESP>
# proxmox-boot-tool init <new disk's ESP> [grub]
Note ESP indica EFI System Partition, che viene impostata come partizione #2 sui dischi avviabili quando si utilizza il programma di installazione di Proxmox VE a partire dalla versione 5.4. Per i dettagli, vedere Configurazione di una nuova partizione da utilizzare come ESP sincronizzata.
Note Assicurarsi di passare grub come modalità a proxmox-boot-tool init se proxmox-boot-tool status indica che i dischi attuali utilizzano GRUB, specialmente se Secure Boot è abilitato!
With plain GRUB:
# grub-install <new disk>
Note Il GRUB tradizionale è utilizzato solo su sistemi installati con Proxmox VE 6.3 o versioni precedenti, che non sono ancora stati migrati manualmente all'uso di proxmox-boot-tool.

3.9.7. Configurare la notifica e-mail

ZFS viene fornito con un daemon di eventi ZED, che monitora gli eventi generati dal modulo kernel ZFS. Il daemon può anche inviare e-mail su eventi ZFS come errori del pool. I package ZFS più recenti distribuiscono il daemon in un package separato zfs-zed, che dovrebbe già essere installato per impostazione predefinita in Proxmox VE.

È possibile configurare il daemon tramite il file /etc/zfs/zed.d/zed.rc con l'editor preferito. L'impostazione richiesta per la notifica e-mail è ZED_EMAIL_ADDR, che per impostazione predefinita è impostata su root.

ZED_EMAIL_ADDR="root"

Si noti che Proxmox VE inoltra le e-mail destinate a root all'indirizzo e-mail configurato per l'utente root.

3.9.8. Limitare l'utilizzo della memoria ZFS

ZFS utilizza per impostazione predefinita il 10% della memoria dell'host, limitato a un massimo di 16 GiB, per la Adaptive Replacement Cache (ARC). Questo valore viene scritto in /etc/modprobe.d/zfs.conf durante l'installazione. Consultare il manuale man 4 zfs per ulteriori informazioni sui parametri del modulo kernel ZFS.

Prima di Proxmox VE 8.1, il limite di utilizzo dell'ARC non veniva impostato durante l'installazione e corrispondeva al valore predefinito di ZFS, che era pari al 62,5% a partire da ZFS 2.3.0 o al 50% per le versioni precedenti. Per le installazioni esistenti precedenti a Proxmox VE 8.1, è necessario eseguire manualmente i passaggi descritti di seguito per abbassare il limite di utilizzo.

Allocare memoria sufficiente per l'ARC è fondamentale per le prestazioni di IO, quindi ridurla con cautela. Come regola generale, allocare almeno 2 GiB di base + 1 GiB/TiB di storage. Ad esempio, se si dispone di un pool con 8 TiB di spazio di storage disponibile, si consiglia di utilizzare 10 GiB di memoria per l'ARC.

ZFS impone inoltre un valore minimo di 64 MiB.

È possibile modificare il limite di utilizzo dell'ARC per l'avvio corrente (un riavvio annulla questa modifica) scrivendo direttamente nel parametro del modulo zfs_arc_max:

 echo "$[10 * 1024*1024*1024]" >/sys/module/zfs/parameters/zfs_arc_max

Per modificare permanentemente i limiti dell'ARC, aggiungere (o modificare se già presente) la riga seguente in /etc/modprobe.d/zfs.conf:

options zfs zfs_arc_max=8589934592

Questo esempio di impostazione limita l'utilizzo a 8 GiB (8 * 230).

Important Nel caso in cui il valore desiderato di zfs_arc_max sia inferiore o uguale a zfs_arc_min (che per impostazione predefinita è 1/32 della memoria di sistema), zfs_arc_max verrà ignorato a meno che non si imposti anche zfs_arc_min a un valore non superiore a zfs_arc_max - 1.
echo "$[8 * 1024*1024*1024 - 1]" >/sys/module/zfs/parameters/zfs_arc_min
echo "$[8 * 1024*1024*1024]" >/sys/module/zfs/parameters/zfs_arc_max

Questo esempio di impostazione limita (temporaneamente) l'utilizzo a 8 GiB (8 * 230) su sistemi con più di 256 GiB di memoria totale, dove semplicemente impostare zfs_arc_max da solo non funzionerebbe.

Important

Se il file system radice è ZFS, è necessario aggiornare l'initramfs ogni volta che questo valore viene modificato:

# update-initramfs -u -k all

È necessario riavviare per attivare queste modifiche.

3.9.9. SWAP su ZFS

Lo spazio di swap creato su uno zvol può generare alcuni problemi, come il blocco del server o la generazione di un elevato carico IO, spesso riscontrato quando si avvia un backup verso uno storage esterno.

Si consiglia vivamente di utilizzare memoria sufficiente, in modo da non trovarsi normalmente in situazioni di memoria insufficiente. Qualora sia necessario o si desideri aggiungere swap, è preferibile creare una partizione su un disco fisico e utilizzarla come dispositivo di swap. È possibile lasciare dello spazio libero per questo scopo nelle opzioni avanzate del programma di installazione. Inoltre, è possibile abbassare il valore di “swappiness”. Un buon valore per i server è 10:

# sysctl -w vm.swappiness=10

Per rendere persistente il valore di swappiness, creare un nuovo file /etc/sysctl.d/99-swappiness.conf con un editor a scelta e aggiungere la riga seguente:

vm.swappiness = 10
Tabella 1. Valori del parametro swappiness del kernel Linux
Valore Strategia

vm.swappiness = 0

Il kernel eseguirà lo swap solo per evitare una condizione di memoria insufficiente

vm.swappiness = 1

Quantità minima di swap senza disabilitarlo completamente.

vm.swappiness = 10

Questo valore è talvolta consigliato per migliorare le prestazioni quando è presente memoria sufficiente in un sistema.

vm.swappiness = 60

Il valore predefinito.

vm.swappiness = 100

Il kernel eseguirà lo swap in modo aggressivo.

3.9.10. Dataset ZFS cifrati

Warning La cifratura nativa ZFS in Proxmox VE è sperimentale. Le limitazioni e i problemi noti includono la replica con dataset cifrati
[https://bugzilla.proxmox.com/show_bug.cgi?id=2350]
, così come errori di checksum quando si utilizzano snapshot o ZVOL.
[https://github.com/openzfs/zfs/issues/11688]

ZFS on Linux versione 0.8.0 ha introdotto il supporto per la cifratura nativa dei dataset. Dopo un aggiornamento da versioni precedenti di ZFS on Linux, la funzionalità di cifratura può essere abilitata per pool:

# zpool get feature@encryption tank
NAME  PROPERTY            VALUE            SOURCE
tank  feature@encryption  disabled         local

# zpool set feature@encryption=enabled

# zpool get feature@encryption tank
NAME  PROPERTY            VALUE            SOURCE
tank  feature@encryption  enabled         local
Warning Attualmente non è previsto il supporto per l'avvio da pool con dataset cifrati tramite GRUB, ed è disponibile solo un supporto limitato per lo sblocco automatico dei dataset cifrati all'avvio. Le versioni precedenti di ZFS senza supporto alla cifratura non saranno in grado di decifrare i dati memorizzati.
Note Si consiglia di sbloccare manualmente i dataset di storage dopo l'avvio, oppure di scrivere una unit personalizzata per fornire il materiale della chiave necessario per lo sblocco all'avvio a zfs load-key.
Warning È necessario stabilire e verificare una procedura di backup prima di abilitare la cifratura dei dati di produzione. Se il materiale della chiave/passphrase/file di chiave associato è stato perso, non è più possibile accedere ai dati cifrati.

La cifratura deve essere configurata al momento della creazione di dataset/zvol, ed è ereditata per impostazione predefinita dai dataset figli. Ad esempio, per creare un dataset cifrato tank/encrypted_data e configurarlo come storage in Proxmox VE, eseguire i seguenti comandi:

# zfs create -o encryption=on -o keyformat=passphrase tank/encrypted_data
Enter passphrase:
Re-enter passphrase:

# pvesm add zfspool encrypted_zfs -pool tank/encrypted_data

Tutti i volumi/dischi dei guest creati su questo storage saranno cifrati con il materiale crittografico condiviso del dataset padre.

Per utilizzare effettivamente lo storage, è necessario caricare il materiale della chiave associato e montare il dataset. Ciò può essere fatto in un unico passaggio con:

# zfs mount -l tank/encrypted_data
Enter passphrase for 'tank/encrypted_data':

È anche possibile utilizzare un file di chiave (casuale) invece di richiedere una passphrase impostando le proprietà keylocation e keyformat, sia al momento della creazione sia con zfs change-key sui dataset esistenti:

# dd if=/dev/urandom of=/path/to/keyfile bs=32 count=1

# zfs change-key -o keyformat=raw -o keylocation=file:///path/to/keyfile tank/encrypted_data
Warning Quando si utilizza un file di chiave, è necessario prestare particolare attenzione per proteggerlo da accessi non autorizzati o perdite accidentali. Senza il file di chiave non è possibile accedere ai dati in chiaro!

Un volume guest creato all'interno di un dataset cifrato avrà la propria proprietà encryptionroot impostata di conseguenza. Il materiale della chiave deve essere caricato solo una volta per ciascun encryptionroot per essere disponibile per tutti i dataset cifrati sottostanti.

Per maggiori dettagli e un utilizzo avanzato, consultare le proprietà encryptionroot, encryption, keylocation, keyformat e keystatus, i comandi zfs load-key, zfs unload-key e zfs change-key e la sezione Encryption di man zfs.

3.9.11. Compressione in ZFS

Quando la compressione è abilitata su un dataset, ZFS tenta di comprimere tutti i blocchi nuovi prima di scriverli e li decomprime durante la lettura. I dati già esistenti non verranno compressi retroattivamente.

È possibile abilitare la compressione con:

# zfs set compression=<algorithm> <dataset>

Si consiglia di utilizzare l'algoritmo lz4, poiché aggiunge un overhead di CPU molto basso. Sono disponibili anche altri algoritmi come lzjb e gzip-N, dove N è un numero intero da 1 (il più veloce) a 9 (il miglior rapporto di compressione). A seconda dell'algoritmo e di quanto siano comprimibili i dati, avere la compressione abilitata può persino aumentare le prestazioni di I/O.

È possibile disabilitare la compressione in qualsiasi momento con:

# zfs set compression=off <dataset>

Anche in questo caso, solo i nuovi blocchi saranno interessati da questa modifica.

3.9.12. Dispositivo speciale ZFS

A partire dalla versione 0.8.0, ZFS supporta i dispositivi special. Un dispositivo special in un pool viene utilizzato per memorizzare metadati, tabelle di deduplicazione e, opzionalmente, piccoli blocchi di file.

Un dispositivo special può migliorare la velocità di un pool costituito da hard disk lenti a rotazione con numerose modifiche ai metadati. Ad esempio, i carichi di lavoro che comportano la creazione, l'aggiornamento o l'eliminazione di un gran numero di file beneficeranno della presenza di un dispositivo special. I dataset ZFS possono anche essere configurati per memorizzare interi file piccoli sul dispositivo special, il che può migliorare ulteriormente le prestazioni. Utilizzare SSD veloci per il dispositivo special.

Important La ridondanza del dispositivo special dovrebbe corrispondere a quella del pool, poiché il dispositivo special costituisce un punto di guasto per l'intero pool.
Warning L'aggiunta di un dispositivo special a un pool non può essere annullata!
Create a pool with special device and RAID-1:
# zpool create -f -o ashift=12 <pool> mirror <device1> <device2> special mirror <device3> <device4>
Add a special device to an existing pool with RAID-1:
# zpool add <pool> special mirror <device1> <device2>

I dataset ZFS espongono la proprietà special_small_blocks=<size>. size può essere 0 per disabilitare la memorizzazione dei blocchi di piccole dimensioni dei file sul dispositivo special, oppure una potenza di due nell'intervallo compreso tra 512B e 1M. Dopo l'impostazione della proprietà, i nuovi blocchi di file più piccoli di size verranno allocati sul dispositivo special.

Important Se il valore di special_small_blocks è maggiore o uguale a recordsize (valore predefinito 128K) del dataset, tutti i dati verranno scritti sul dispositivo special, quindi prestare attenzione!

L'impostazione della proprietà special_small_blocks su un pool modifica il valore predefinito di tale proprietà per tutti i dataset ZFS figli (ad esempio tutti i container nel pool opteranno per i blocchi di file piccoli).

Opt in for all file smaller than 4K-blocks pool-wide:
# zfs set special_small_blocks=4K <pool>
Opt in for small file blocks for a single dataset:
# zfs set special_small_blocks=4K <pool>/<filesystem>
Opt out from small file blocks for a single dataset:
# zfs set special_small_blocks=0 <pool>/<filesystem>

3.9.13. Funzionalità del pool ZFS

Le modifiche al formato su disco in ZFS vengono apportate solo tra cambi di versione principale e sono specificate tramite le feature. Tutte le feature, così come il meccanismo generale, sono ben documentate nella pagina di manuale zpool-features(5).

Poiché l'abilitazione di nuove feature può rendere un pool non importabile da una versione precedente di ZFS, questa operazione deve essere eseguita attivamente dall'amministratore, eseguendo zpool upgrade sul pool (vedere la pagina di manuale zpool-upgrade(8)).

A meno che non sia necessario utilizzare una delle nuove feature, non vi è alcun vantaggio nell'abilitarle.

Infatti, vi sono alcuni svantaggi nell'abilitare nuove feature:

  • Un sistema con root su ZFS che si avvia ancora tramite GRUB diventerà non avviabile se una nuova funzionalità è attiva sul pool rpool, a causa dell'implementazione incompatibile di ZFS in GRUB.

  • Il sistema non sarà in grado di importare alcun pool aggiornato quando avviato con un kernel più vecchio, che include ancora i vecchi moduli ZFS.

  • Allo stesso modo, avviare una ISO di Proxmox VE meno recente per riparare un sistema che non si avvia non funzionerà.

Important Non aggiornare il rpool se il sistema esegue ancora il boot con GRUB, poiché ciò renderà il sistema non avviabile. Ciò include i sistemi installati prima di Proxmox VE 5.4 e i sistemi che eseguono il boot con BIOS legacy (vedere come determinare il bootloader utilizzato).
Enable new features for a ZFS pool:
# zpool upgrade <pool>

3.10. BTRFS

Warning L'integrazione di BTRFS è attualmente in anteprima tecnologica in Proxmox VE.

BTRFS è un moderno file system copy-on-write supportato nativamente dal kernel Linux, che implementa funzionalità come snapshot, RAID integrato e autoriparazione tramite checksum per dati e metadati. A partire da Proxmox VE 7.0, BTRFS viene introdotto come selezione opzionale per il file system root.

General BTRFS advantages
  • Configurazione principale del sistema quasi identica alla configurazione tradizionale basata su ext4

  • Snapshot

  • Compressione dei dati a livello di file system

  • Clonazione copy-on-write

  • RAID0, RAID1 e RAID10

  • Protezione contro la corruzione dei dati

  • Auto-riparazione

  • Supportato nativamente dal kernel Linux

Caveats
  • I livelli RAID 5/6 sono sperimentali e pericolosi, vedere Stato di BTRFS

3.10.1. Installazione come file system root

Quando si effettua l'installazione tramite il programma di installazione di Proxmox VE, è possibile scegliere BTRFS per il file system root. È necessario selezionare il tipo di RAID al momento dell'installazione:

RAID0

Chiamato anche “striping”. La capacità di tale volume è la somma delle capacità di tutti i dischi. Tuttavia RAID0 non aggiunge alcuna ridondanza, quindi il guasto di un singolo disco rende il volume inutilizzabile.

RAID1

Chiamato anche “mirroring”. I dati vengono scritti in modo identico su tutti i dischi. Questa modalità richiede almeno 2 dischi delle stesse dimensioni. La capacità risultante è quella di un singolo disco.

RAID10

Una combinazione di RAID0 e RAID1. Richiede almeno 4 dischi.

Il programma di installazione partiziona automaticamente i dischi e crea un sottovolume aggiuntivo in /var/lib/pve/local-btrfs. Per poter utilizzare tale sottovolume con gli strumenti Proxmox VE, il programma di installazione crea la seguente voce di configurazione in /etc/pve/storage.cfg:

dir: local
        path /var/lib/vz
        content iso,vztmpl,backup
        disable

btrfs: local-btrfs
        path /var/lib/pve/local-btrfs
        content iso,vztmpl,backup,images,rootdir

Questo disabilita esplicitamente lo storage local predefinito a favore di una voce di storage specifica per BTRFS sul sottovolume aggiuntivo.

Il comando btrfs viene utilizzato per configurare e gestire il file system BTRFS. Dopo l'installazione, il seguente comando elenca tutti i sottovolumi aggiuntivi:

# btrfs subvolume list /
ID 256 gen 6 top level 5 path var/lib/pve/local-btrfs

3.10.2. Amministrazione di BTRFS

Questa sezione fornisce alcuni esempi di utilizzo per le attività comuni.

Creazione di un file system BTRFS

Per creare file system BTRFS, si utilizza mkfs.btrfs. I parametri -d e -m sono utilizzati per impostare il profilo rispettivamente per i metadati e i dati. Con il parametro opzionale -L, è possibile impostare un'etichetta.

In generale, sono supportate le seguenti modalità: single, raid0, raid1, raid10.

Creare un file system BTRFS su un singolo disco /dev/sdb con l'etichetta My-Storage:

 # mkfs.btrfs -m single -d single -L My-Storage /dev/sdb

Oppure creare un RAID1 sulle due partizioni /dev/sdb1 e /dev/sdc1:

 # mkfs.btrfs -m raid1 -d raid1 -L My-Storage /dev/sdb1 /dev/sdc1
Montaggio di un file system BTRFS

Il nuovo file system può quindi essere montato manualmente, ad esempio:

 # mkdir /my-storage
 # mount /dev/sdb /my-storage

Un BTRFS può anche essere aggiunto a /etc/fstab come qualsiasi altro mount point, montandolo automaticamente all'avvio. Si consiglia di evitare l'uso di percorsi dei block-device e di utilizzare invece il valore UUID stampato dal comando mkfs.btrfs, specialmente quando è presente più di un disco in una configurazione BTRFS.

Ad esempio:

File /etc/fstab
# ... other mount points left out for brevity

# using the UUID from the mkfs.btrfs output is highly recommended
UUID=e2c0c3ff-2114-4f54-b767-3a203e49f6f3 /my-storage btrfs defaults 0 0
Tip Se l'UUID non è più disponibile, è possibile utilizzare lo strumento blkid per elencare tutte le proprietà dei block-device.

In seguito è possibile avviare il primo montaggio eseguendo:

mount /my-storage

Dal successivo riavvio, questa operazione verrà eseguita automaticamente dal sistema all'avvio.

Aggiunta di un file system BTRFS a Proxmox VE

È possibile aggiungere un file system BTRFS esistente a Proxmox VE tramite l'interfaccia web, oppure utilizzando la CLI, ad esempio:

pvesm add btrfs my-storage --path /my-storage
Creazione di un subvolume

La creazione di un subvolume lo collega a un percorso nel file system BTRFS, dove apparirà come una normale directory.

# btrfs subvolume create /some/path

In seguito, /some/path si comporterà come una normale directory.

Eliminazione di un subvolume

A differenza delle directory rimosse tramite rmdir, i subvolumi non devono essere vuoti per essere eliminati tramite il comando btrfs.

# btrfs subvolume delete /some/path
Creazione di uno snapshot di un subvolume

BTRFS non distingue effettivamente tra snapshot e normali subvolumi, pertanto creare uno snapshot può anche essere considerato come creare una copia arbitraria di un subvolume. Per convenzione, Proxmox VE utilizza il flag di sola lettura quando crea snapshot di dischi guest o subvolumi, ma questo flag può anche essere modificato in seguito.

# btrfs subvolume snapshot -r /some/path /a/new/path

Questo creerà un "clone" di sola lettura del subvolume su /some/path in /a/new/path. Eventuali future modifiche a /some/path causeranno la copia dei dati modificati prima della modifica.

Se l'opzione di sola lettura (-r) viene omessa, entrambi i subvolumi saranno scrivibili.

Abilitazione della compressione

Per impostazione predefinita, BTRFS non comprime i dati. Per abilitare la compressione, è possibile aggiungere l'opzione di montaggio compress. Si noti che i dati già scritti non verranno compressi a posteriori.

Per impostazione predefinita, il rootfs sarà elencato in /etc/fstab come segue:

UUID=<uuid of your root file system> / btrfs defaults 0 1

È sufficiente aggiungere compress=zstd, compress=lzo o compress=zlib a defaults riportato sopra, in questo modo:

UUID=<uuid of your root file system> / btrfs defaults,compress=zstd 0 1

Questa modifica avrà effetto dopo il riavvio.

Verifica dell'utilizzo dello spazio

Il classico strumento df può restituire valori poco chiari per alcune configurazioni BTRFS. Per una stima migliore, utilizzare il comando btrfs filesystem usage /PATH, ad esempio:

# btrfs fi usage /my-storage

3.11. Gestione del nodo Proxmox

Lo strumento di gestione del nodo di Proxmox VE (pvenode) consente di controllare le impostazioni e le risorse specifiche del nodo.

Attualmente pvenode consente di impostare la descrizione di un nodo, eseguire varie operazioni in blocco sui guest del nodo, visualizzare la cronologia delle attività del nodo e gestire i certificati SSL del nodo, che vengono utilizzati per l'API e per l'interfaccia web GUI tramite pveproxy.

3.11.1. Wake-on-LAN

Wake-on-LAN (WoL) consente di accendere un computer in modalità sospensione sulla rete, inviando un magic packet. Almeno una NIC deve supportare questa funzionalità e la relativa opzione deve essere abilitata nella configurazione del firmware del computer (BIOS/UEFI). Il nome dell’opzione può variare da Enable Wake-on-Lan a Power On By PCIE Device; in caso di dubbio, consultare il manuale del produttore della scheda madre. ethtool può essere utilizzato per verificare la configurazione WoL di <interface> eseguendo:

ethtool <interface> | grep Wake-on

pvenode consente di risvegliare i membri sospesi di un cluster tramite WoL, utilizzando il comando:

pvenode wakeonlan <node>

Questo invia in broadcast il magic packet WoL sulla porta UDP 9, contenente l’indirizzo MAC di <node> ottenuto dalla proprietà wakeonlan. La proprietà wakeonlan specifica del nodo può essere impostata utilizzando il seguente comando:

pvenode config set -wakeonlan XX:XX:XX:XX:XX:XX

L’interfaccia tramite cui viene inviato il pacchetto WoL è determinata in base alla route predefinita. Può essere sovrascritta impostando bind-interface tramite il seguente comando:

pvenode config set -wakeonlan XX:XX:XX:XX:XX:XX,bind-interface=<iface-name>

L’indirizzo di broadcast (predefinito 255.255.255.255) utilizzato durante l’invio del pacchetto WoL può inoltre essere modificato impostando esplicitamente broadcast-address utilizzando il seguente comando:

pvenode config set -wakeonlan XX:XX:XX:XX:XX:XX,broadcast-address=<broadcast-address>

3.11.2. Cronologia delle attività

Durante la risoluzione dei problemi del server, ad esempio i job di backup non riusciti, può spesso essere utile avere un log delle attività eseguite in precedenza. Con Proxmox VE, è possibile accedere alla cronologia delle attività del nodo tramite il comando pvenode task.

È possibile ottenere un elenco filtrato delle attività completate di un nodo con il sottocomando list. Ad esempio, per ottenere un elenco delle attività relative alla VM 100 terminate con un errore, il comando sarebbe:

pvenode task list --errors --vmid 100

Il log di un’attività può quindi essere stampato utilizzando il suo UPID:

pvenode task log UPID:pve1:00010D94:001CA6EA:6124E1B9:vzdump:100:root@pam:

3.11.3. Gestione dell’alimentazione dei guest in blocco

Nel caso in cui siano presenti numerose VM/container, l’avvio e l’arresto dei guest possono essere eseguiti tramite operazioni in blocco con i sottocomandi startall e stopall di pvenode. Per impostazione predefinita, pvenode startall avvierà solo le VM/container che sono state impostate per l’avvio automatico al boot (vedere Avvio e arresto automatico delle macchine virtuali); tuttavia, è possibile sovrascrivere questo comportamento con il flag --force. Entrambi i comandi dispongono anche di un’opzione --vms, che limita i guest arrestati/avviati ai VMID specificati.

Ad esempio, per avviare le VM 100, 101 e 102, indipendentemente dal fatto che abbiano onboot impostato, è possibile utilizzare:

pvenode startall --vms 100,101,102 --force

Per arrestare questi guest (e qualsiasi altro guest eventualmente in esecuzione), utilizzare il comando:

pvenode stopall
Note Il comando stopall tenta prima di eseguire un arresto regolare e poi attende fino a quando tutti i guest non si sono arrestati correttamente oppure è scaduto un timeout sovrascrivibile (3 minuti per impostazione predefinita). Una volta verificata questa condizione, se il parametro force-stop non è stato impostato esplicitamente su 0 (false), tutti i guest virtuali ancora in esecuzione vengono arrestati forzatamente.

3.11.4. Ritardo di avvio del primo guest

Nel caso in cui le VM/container dipendano da risorse esterne lente da avviare, ad esempio un server NFS, è anche possibile impostare un ritardo per singolo nodo tra il momento in cui Proxmox VE si avvia e il momento in cui la prima VM/container configurata per l’avvio automatico si avvia (vedere Avvio e arresto automatico delle macchine virtuali).

Ciò può essere ottenuto impostando quanto segue (dove 10 rappresenta il ritardo in secondi):

pvenode config set --startall-onboot-delay 10

3.11.5. Migrazione dei guest in blocco

Nel caso in cui una situazione di aggiornamento richieda la migrazione di tutti i guest da un nodo a un altro, pvenode offre anche il sottocomando migrateall per la migrazione in blocco. Per impostazione predefinita, questo comando migrerà ogni guest del sistema verso il nodo di destinazione. È tuttavia possibile configurarlo per migrare solo un insieme di guest.

Ad esempio, per migrare le VM 100, 101 e 102 verso il nodo pve2, con la migrazione live per i dischi locali abilitata, è possibile eseguire:

pvenode migrateall pve2 --vms 100,101,102 --with-local-disks

3.11.6. Obiettivo di utilizzo della RAM per il ballooning

La percentuale obiettivo per l’allocazione automatica della memoria è impostata per impostazione predefinita sull’80%. È possibile personalizzare questo obiettivo per nodo impostando la proprietà ballooning-target. Ad esempio, per impostare come obiettivo il 90% di utilizzo della memoria dell’host:

pvenode config set --ballooning-target 90

3.12. Gestione dei certificati

3.12.1. Certificati per la comunicazione intra-cluster

Per impostazione predefinita, ogni cluster Proxmox VE crea una propria Certificate Authority (CA) autofirmata e genera un certificato per ciascun nodo, firmato dalla suddetta CA. Questi certificati sono utilizzati per la comunicazione cifrata con il servizio pveproxy del cluster e con la funzionalità Shell/Console se viene utilizzato SPICE.

Il certificato della CA e la chiave sono memorizzati nel Proxmox Cluster File System (pmxcfs).

Per distribuire la CA del cluster alle workstation degli amministratori ed evitare avvisi del browser, copiare /etc/pve/pve-root-ca.pem da un nodo qualsiasi del cluster fuori banda (ad esempio tramite scp o leggendolo attraverso una sessione SSH esistente) e importarlo nell'archivio dei certificati attendibili del sistema operativo o del browser. Non esiste un endpoint API o dell'interfaccia web per scaricare il file.

3.12.2. Certificati per API e GUI web

L'API REST e la GUI web sono fornite dal servizio pveproxy, che viene eseguito su ciascun nodo.

Sono disponibili le seguenti opzioni per il certificato utilizzato da pveproxy:

  1. Per impostazione predefinita viene utilizzato il certificato specifico del nodo in /etc/pve/nodes/NODENAME/pve-ssl.pem. Questo certificato è firmato dalla CA del cluster e pertanto non è automaticamente considerato attendibile da browser e sistemi operativi.

  2. utilizzare un certificato fornito esternamente (ad esempio firmato da una CA commerciale).

  3. utilizzare ACME (Let's Encrypt) per ottenere un certificato attendibile con rinnovo automatico; questa funzionalità è integrata anche nell'API e nell'interfaccia web di Proxmox VE.

Per le opzioni 2 e 3 viene utilizzato il file /etc/pve/local/pveproxy-ssl.pem (e /etc/pve/local/pveproxy-ssl.key, che deve essere privo di password).

Note Tenere presente che /etc/pve/local è un collegamento simbolico specifico del nodo a /etc/pve/nodes/NODENAME.

I certificati vengono gestiti con il comando di gestione dei nodi di Proxmox VE (vedere la pagina man pvenode(1)).

Warning Non sostituire né modificare manualmente i file del certificato del nodo generati automaticamente in /etc/pve/local/pve-ssl.pem e /etc/pve/local/pve-ssl.key né i file della CA del cluster in /etc/pve/pve-root-ca.pem e /etc/pve/priv/pve-root-ca.key.

3.12.3. Caricamento di un certificato personalizzato

Se è già disponibile un certificato da utilizzare per un nodo Proxmox VE, è possibile caricare tale certificato semplicemente tramite l'interfaccia web.

screenshot/gui-node-certs-upload-custom.png

Da notare che il file della chiave del certificato, se fornito, non deve essere protetto da password.

3.12.4. Certificati attendibili tramite Let's Encrypt (ACME)

Proxmox VE include un'implementazione del protocollo Automatic Certificate Management Environment (ACME), che consente agli amministratori di Proxmox VE di utilizzare un provider ACME come Let's Encrypt per configurare facilmente certificati TLS accettati e considerati attendibili nativamente dai moderni sistemi operativi e browser web.

Attualmente, i due endpoint ACME implementati sono l'ambiente di produzione Let's Encrypt (LE) e il relativo ambiente di staging. Il client ACME supporta la validazione delle verifiche http-01 tramite un web server integrato e la validazione delle verifiche dns-01 tramite un plugin DNS che supporta tutti gli endpoint API DNS supportati da acme.sh.

Account ACME
screenshot/gui-datacenter-acme-register-account.png

È necessario registrare un account ACME per cluster con l'endpoint che si desidera utilizzare. L'indirizzo email utilizzato per tale account servirà come punto di contatto per notifiche relative a scadenze di rinnovo o simili da parte dell'endpoint ACME.

È possibile registrare e disattivare account ACME tramite l'interfaccia web Datacenter -> ACME oppure utilizzando lo strumento a riga di comando pvenode.

 pvenode acme account register account-name mail@example.com
Tip A causa dei limiti di frequenza, si consiglia di utilizzare l'ambiente staging di LE per esperimenti o se si utilizza ACME per la prima volta.
Plugin ACME

Il compito dei plugin ACME è fornire la verifica automatica che l'operatore, e quindi il cluster Proxmox VE da esso gestito, sia il reale proprietario di un dominio. Questo è il blocco costitutivo di base per la gestione automatica dei certificati.

Il protocollo ACME specifica diversi tipi di verifica, ad esempio la verifica http-01, in cui un web server fornisce un file con un determinato contenuto per dimostrare di controllare un dominio. A volte ciò non è possibile, sia per limitazioni tecniche sia se l'indirizzo di un record non è raggiungibile dalla rete internet pubblica. In questi casi è possibile utilizzare la verifica dns-01. Questa verifica viene soddisfatta creando un determinato record DNS nella zona del dominio.

screenshot/gui-datacenter-acme-overview.png

Proxmox VE supporta nativamente entrambi questi tipi di verifica; è possibile configurare i plugin tramite l'interfaccia web in Datacenter -> ACME oppure utilizzando il comando pvenode acme plugin add.

Le configurazioni dei plugin ACME sono memorizzate in /etc/pve/priv/acme/plugins.cfg. Un plugin è disponibile per tutti i nodi del cluster.

Domini dei nodi

Ogni dominio è specifico per nodo. È possibile aggiungere nuove voci di dominio o gestire quelle esistenti in Node -> Certificates, oppure usando il comando pvenode config.

screenshot/gui-node-certs-add-domain.png

Dopo aver configurato i domini desiderati per un nodo e verificato che sia selezionato l'account ACME desiderato, è possibile richiedere il nuovo certificato tramite l'interfaccia web. In caso di successo, l'interfaccia si ricaricherà dopo 10 secondi.

Il rinnovo avverrà automaticamente.

3.12.5. Plugin di verifica HTTP ACME

È sempre configurato implicitamente un plugin standalone per la validazione delle verifiche http-01 tramite il webserver integrato avviato sulla porta 80.

Note Il nome standalone indica che può fornire la validazione autonomamente, senza alcun servizio di terze parti. Pertanto, questo plugin funziona anche per i nodi del cluster.

Ci sono alcuni prerequisiti per utilizzarlo per la gestione dei certificati con l'ACME di Let's Encrypt.

  • È necessario accettare i Termini di servizio di Let's Encrypt per registrare un account.

  • La porta 80 del nodo deve essere raggiungibile da internet.

  • Non deve esserci alcun altro listener sulla porta 80.

  • Il (sotto)dominio richiesto deve essere risolto in un indirizzo IP pubblico del nodo.

3.12.6. Plugin per la verifica ACME tramite API DNS

Nei sistemi in cui l'accesso esterno per la validazione tramite il metodo http-01 non è possibile o desiderato, è possibile utilizzare il metodo di validazione dns-01. Questo metodo di validazione richiede un server DNS che consenta il provisioning di record TXT tramite un'API.

Configurazione delle API DNS ACME per la validazione

Proxmox VE riutilizza i plugin DNS sviluppati per il progetto acme.sh
[acme.sh https://github.com/acmesh-official/acme.sh]
, si rimanda alla relativa documentazione per i dettagli sulla configurazione delle singole API.

Il modo più semplice per configurare un nuovo plugin con l'API DNS è tramite l'interfaccia web (Datacenter -> ACME).

screenshot/gui-datacenter-acme-add-dns-plugin.png

Scegliere DNS come tipo di verifica. È quindi possibile selezionare il proprio provider API e inserire i dati delle credenziali per accedere al proprio account tramite la sua API. Il ritardo di validazione determina il tempo in secondi tra l'impostazione del record DNS e la richiesta al provider ACME di validarlo, poiché i provider spesso necessitano di tempo per propagare il record nella loro infrastruttura.

Tip Per maggiori informazioni su come ottenere le credenziali API per il proprio provider, consultare la pagina wiki di acme.sh How to use DNS API.

Poiché esistono molti provider DNS ed endpoint API, Proxmox VE genera automaticamente il modulo per le credenziali per alcuni provider. Per gli altri verrà mostrata un'area di testo più grande, dove è sufficiente copiare tutte le coppie KEY=VALUE delle credenziali.

Validazione DNS tramite alias CNAME

Una modalità speciale alias può essere utilizzata per gestire la validazione su un dominio/server DNS diverso, nel caso in cui il DNS primario/reale non supporti il provisioning tramite un'API. Impostare manualmente un record CNAME permanente per _acme-challenge.domain1.example che punti a _acme-challenge.domain2.example e impostare la proprietà alias sulla chiave acmedomainX corrispondente nel file di configurazione del nodo Proxmox VE a domain2.example per consentire al server DNS di domain2.example di validare tutte le verifiche per domain1.example.

Combinazione di plugin

È possibile combinare la validazione http-01 e dns-01 nel caso in cui il nodo sia raggiungibile tramite più domini con requisiti/capacità di provisioning DNS differenti. È inoltre possibile combinare API DNS di più provider o istanze specificando istanze di plugin diverse per dominio.

Tip Accedere allo stesso servizio tramite più domini aumenta la complessità e dovrebbe essere evitato, se possibile.

3.12.7. Rinnovo automatico dei certificati ACME

Se un nodo è stato configurato correttamente con un certificato fornito da ACME (sia tramite pvenode che tramite la GUI), il certificato verrà rinnovato automaticamente dal pve-daily-update.service. Attualmente, il rinnovo viene tentato se il certificato è già scaduto o scadrà nei prossimi 30 giorni.

Note Se viene utilizzata una directory personalizzata che emette certificati a breve durata, può essere consigliabile disabilitare il ritardo casuale per l'unità pve-daily-update.timer per evitare di perdere un rinnovo del certificato dopo un riavvio.

3.12.8. Esempi ACME con pvenode

Esempio: invocazione di esempio di pvenode per l'utilizzo dei certificati Let's Encrypt
root@proxmox:~# pvenode acme account register default mail@example.invalid
Directory endpoints:
0) Let's Encrypt V2 (https://acme-v02.api.letsencrypt.org/directory)
1) Let's Encrypt V2 Staging (https://acme-staging-v02.api.letsencrypt.org/directory)
2) Custom
Enter selection: 1

Terms of Service: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
Do you agree to the above terms? [y|N]y
...
Task OK
root@proxmox:~# pvenode config set --acme domains=example.invalid
root@proxmox:~# pvenode acme cert order
Loading ACME account details
Placing ACME order
...
Status is 'valid'!

All domains validated!
...
Downloading certificate
Setting pveproxy certificate and key
Restarting pveproxy
Task OK
Esempio: configurazione dell'API OVH per la convalida di un dominio
Note i passaggi di registrazione dell'account sono gli stessi indipendentemente dal plugin utilizzato e non vengono ripetuti qui.
Note OVH_AK e OVH_AS devono essere ottenuti da OVH secondo la documentazione dell'API OVH

Prima di tutto è necessario ottenere tutte le informazioni per consentire l'accesso all'API sia all'utente che a Proxmox VE.

root@proxmox:~# cat /path/to/api-token
OVH_AK=XXXXXXXXXXXXXXXX
OVH_AS=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
root@proxmox:~# source /path/to/api-token
root@proxmox:~# curl -XPOST -H"X-Ovh-Application: $OVH_AK" -H "Content-type: application/json" \
https://eu.api.ovh.com/1.0/auth/credential  -d '{
  "accessRules": [
    {"method": "GET","path": "/auth/time"},
    {"method": "GET","path": "/domain"},
    {"method": "GET","path": "/domain/zone/*"},
    {"method": "GET","path": "/domain/zone/*/record"},
    {"method": "POST","path": "/domain/zone/*/record"},
    {"method": "POST","path": "/domain/zone/*/refresh"},
    {"method": "PUT","path": "/domain/zone/*/record/"},
    {"method": "DELETE","path": "/domain/zone/*/record/*"}
]
}'
{"consumerKey":"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ","state":"pendingValidation","validationUrl":"https://eu.api.ovh.com/auth/?credentialToken=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}

(open validation URL and follow instructions to link Application Key with account/Consumer Key)

root@proxmox:~# echo "OVH_CK=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" >> /path/to/api-token

Ora è possibile configurare il plugin ACME:

root@proxmox:~# pvenode acme plugin add dns example_plugin --api ovh --data /path/to/api_token
root@proxmox:~# pvenode acme plugin config example_plugin
┌────────┬──────────────────────────────────────────┐
│ key    │ value                                    │
╞════════╪══════════════════════════════════════════╡
│ api    │ ovh                                      │
├────────┼──────────────────────────────────────────┤
│ data   │ OVH_AK=XXXXXXXXXXXXXXXX                  │
│        │ OVH_AS=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  │
│        │ OVH_CK=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  │
├────────┼──────────────────────────────────────────┤
│ digest │ 867fcf556363ca1bea866863093fcab83edf47a1 │
├────────┼──────────────────────────────────────────┤
│ plugin │ example_plugin                           │
├────────┼──────────────────────────────────────────┤
│ type   │ dns                                      │
└────────┴──────────────────────────────────────────┘

Infine è possibile configurare il dominio per cui si desidera ottenere i certificati e inviare la richiesta del certificato per esso:

root@proxmox:~# pvenode config set -acmedomain0 example.proxmox.com,plugin=example_plugin
root@proxmox:~# pvenode acme cert order
Loading ACME account details
Placing ACME order
Order URL: https://acme-staging-v02.api.letsencrypt.org/acme/order/11111111/22222222

Getting authorization details from 'https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333'
The validation for example.proxmox.com is pending!
[Wed Apr 22 09:25:30 CEST 2020] Using OVH endpoint: ovh-eu
[Wed Apr 22 09:25:30 CEST 2020] Checking authentication
[Wed Apr 22 09:25:30 CEST 2020] Consumer key is ok.
[Wed Apr 22 09:25:31 CEST 2020] Adding record
[Wed Apr 22 09:25:32 CEST 2020] Added, sleep 10 seconds.
Add TXT record: _acme-challenge.example.proxmox.com
Triggering validation
Sleeping for 5 seconds
Status is 'valid'!
[Wed Apr 22 09:25:48 CEST 2020] Using OVH endpoint: ovh-eu
[Wed Apr 22 09:25:48 CEST 2020] Checking authentication
[Wed Apr 22 09:25:48 CEST 2020] Consumer key is ok.
Remove TXT record: _acme-challenge.example.proxmox.com

All domains validated!

Creating CSR
Checking order status
Order is ready, finalizing order
valid!

Downloading certificate
Setting pveproxy certificate and key
Restarting pveproxy
Task OK
Esempio: passaggio dalla directory ACME staging a quella standard

La modifica della directory ACME per un account non è supportata, ma poiché Proxmox VE supporta più di un account è possibile semplicemente creare un nuovo account con la directory ACME di produzione (affidabile) come endpoint. È anche possibile disattivare l'account di staging e ricrearlo.

Example: Changing the default ACME account from staging to directory using pvenode
root@proxmox:~# pvenode acme account deactivate default
Renaming account file from '/etc/pve/priv/acme/default' to '/etc/pve/priv/acme/_deactivated_default_4'
Task OK

root@proxmox:~# pvenode acme account register default example@proxmox.com
Directory endpoints:
0) Let's Encrypt V2 (https://acme-v02.api.letsencrypt.org/directory)
1) Let's Encrypt V2 Staging (https://acme-staging-v02.api.letsencrypt.org/directory)
2) Custom
Enter selection: 0

Terms of Service: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
Do you agree to the above terms? [y|N]y
...
Task OK

3.13. Bootloader dell'host

Proxmox VE attualmente utilizza uno dei due bootloader in base alla configurazione del disco selezionata nell'installer.

Per i sistemi EFI installati con ZFS come filesystem di root viene utilizzato systemd-boot, a meno che il Secure Boot non sia abilitato. Tutti gli altri deployment utilizzano il bootloader GRUB standard (questo di solito si applica anche ai sistemi installati sopra Debian).

3.13.1. Schema di partizionamento utilizzato dall'installer

L'installer di Proxmox VE crea 3 partizioni su tutti i dischi selezionati per l'installazione.

Le partizioni create sono:

  • una BIOS Boot Partition di 1 MB (tipo gdisk EF02)

  • una EFI System Partition (ESP, tipo gdisk EF00) di 512 MB

  • una terza partizione che occupa lo spazio definito dal parametro hdsize impostato o lo spazio rimanente e viene utilizzata per il tipo di storage scelto

I sistemi che utilizzano ZFS come filesystem di root vengono avviati con un kernel e un'immagine initrd memorizzati sulla EFI System Partition di 512 MB. Per i sistemi BIOS legacy e i sistemi EFI con Secure Boot abilitato, viene utilizzato GRUB, mentre per i sistemi EFI senza Secure Boot viene utilizzato systemd-boot. Entrambi vengono installati e configurati per puntare alle ESP.

GRUB in modalità BIOS (--target i386-pc) viene installato sulla BIOS Boot Partition di tutti i dischi selezionati su tutti i sistemi avviati con GRUB
[Si tratta di tutte le installazioni con root su ext4 o xfs e delle installazioni con root su ZFS su sistemi non EFI]
.

Note Questo si applica agli host x86. Su arm64, Proxmox VE si avvia solo tramite UEFI, quindi non esiste alcuna BIOS Boot Partition né alcun target GRUB i386-pc; GRUB viene invece installato in modalità EFI utilizzando il target arm64-efi.

3.13.2. Sincronizzazione del contenuto della ESP con proxmox-boot-tool

proxmox-boot-tool è un'utility usata per mantenere il contenuto delle EFI System Partition correttamente configurato e sincronizzato. Copia determinate versioni del kernel su tutte le ESP e configura il relativo bootloader per l'avvio dalle ESP formattate in vfat. Nel contesto di ZFS come filesystem di root, questo significa che è possibile utilizzare tutte le funzionalità opzionali sul pool di root invece del sottoinsieme presente anche nell'implementazione ZFS in GRUB, evitando di dover creare un boot-pool separato di piccole dimensioni
[Avvio di ZFS su root con GRUB https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/Debian%20Bookworm%20Root%20on%20ZFS.html]
.

Nelle configurazioni con ridondanza, tutti i dischi vengono partizionati con una ESP dal programma di installazione. Questo garantisce che il sistema si avvii anche se il primo dispositivo di avvio si guasta o se il BIOS può eseguire l'avvio solo da un disco specifico.

Le ESP non vengono mantenute montate durante il normale funzionamento. Questo contribuisce a prevenire la corruzione del filesystem sulle ESP formattate in vfat in caso di crash del sistema, ed elimina la necessità di adattare manualmente /etc/fstab nel caso in cui il dispositivo di boot primario presenti un guasto.

proxmox-boot-tool gestisce le seguenti attività:

  • formattazione e configurazione di una nuova partizione

  • copia e configurazione delle nuove immagini del kernel e delle immagini initrd su tutte le ESP elencate

  • sincronizzazione della configurazione durante gli aggiornamenti del kernel e altre attività di manutenzione

  • gestione dell'elenco delle versioni del kernel che vengono sincronizzate

  • configurazione del boot-loader per avviare una particolare versione del kernel (pinning)

È possibile visualizzare le ESP attualmente configurate e il relativo stato eseguendo:

# proxmox-boot-tool status
Setting up a new partition for use as synced ESP

Per formattare e inizializzare una partizione come ESP sincronizzata, ad esempio dopo aver sostituito un vdev guasto in un rpool, oppure quando si converte un sistema esistente che precede il meccanismo di sincronizzazione, è possibile utilizzare proxmox-boot-tool da proxmox-kernel-helper.

Warning il comando format formatterà la <partition>, assicurarsi di indicare il dispositivo/partizione corretto!

Ad esempio, per formattare una partizione vuota /dev/sda2 come ESP, eseguire quanto segue:

# proxmox-boot-tool format /dev/sda2

Per configurare una ESP esistente e non montata situata su /dev/sda2 per l'inclusione nel meccanismo di sincronizzazione degli aggiornamenti del kernel di Proxmox VE, utilizzare quanto segue:

# proxmox-boot-tool init /dev/sda2

oppure

# proxmox-boot-tool init /dev/sda2 grub

per forzare l'inizializzazione con GRUB invece di systemd-boot, ad esempio per il supporto Secure Boot.

Successivamente /etc/kernel/proxmox-boot-uuids dovrebbe contenere una nuova riga con l'UUID della partizione appena aggiunta. Il comando init attiverà anche automaticamente un aggiornamento di tutte le ESP configurate.

Updating the configuration on all ESPs

Per copiare e configurare tutti i kernel avviabili e mantenere sincronizzate tutte le ESP elencate in /etc/kernel/proxmox-boot-uuids, è sufficiente eseguire:

# proxmox-boot-tool refresh

(L'equivalente dell'esecuzione di update-grub su sistemi con ext4 o xfs su root).

Ciò è necessario nel caso in cui si apportino modifiche alla riga di comando del kernel, o si desideri sincronizzare tutti i kernel e gli initrd.

Note Sia update-initramfs che apt (quando necessario) attiveranno automaticamente un aggiornamento.
Kernel Versions considered by proxmox-boot-tool

Per impostazione predefinita sono configurate le seguenti versioni del kernel:

  • il kernel attualmente in esecuzione

  • la nuova versione installata durante gli aggiornamenti dei pacchetti

  • gli ultimi due kernel già installati

  • l'ultima versione della penultima serie di kernel (ad es. 5.0, 5.3), se applicabile

  • qualsiasi kernel selezionato manualmente

Manually keeping a kernel bootable

Per aggiungere un determinato kernel e la relativa immagine initrd all'elenco dei kernel avviabili, utilizzare proxmox-boot-tool kernel add.

Ad esempio, eseguire quanto segue per aggiungere il kernel con versione ABI 5.0.15-1-pve all'elenco dei kernel da mantenere installati e sincronizzati su tutte le ESP:

# proxmox-boot-tool kernel add 5.0.15-1-pve

proxmox-boot-tool kernel list elencherà tutte le versioni del kernel attualmente selezionate per l'avvio:

# proxmox-boot-tool kernel list
Manually selected kernels:
5.0.15-1-pve

Automatically selected kernels:
5.0.12-1-pve
4.15.18-18-pve

Eseguire proxmox-boot-tool kernel remove per rimuovere un kernel dall'elenco dei kernel selezionati manualmente, ad esempio:

# proxmox-boot-tool kernel remove 5.0.15-1-pve
Note È necessario eseguire proxmox-boot-tool refresh per aggiornare tutte le EFI System Partition (ESP) dopo un'aggiunta o una rimozione manuale del kernel descritta sopra.

3.13.3. Determinare quale bootloader viene utilizzato

screenshot/boot-grub.png

Il modo più semplice e affidabile per determinare quale bootloader viene utilizzato è osservare il processo di avvio del nodo Proxmox VE.

Verrà visualizzato il riquadro blu di GRUB oppure il semplice schermo nero su bianco di systemd-boot.

screenshot/boot-systemdboot.png

Determinare il bootloader da un sistema in esecuzione potrebbe non essere accurato al 100%. Il modo più sicuro è eseguire il seguente comando:

# efibootmgr -v

Se restituisce un messaggio che indica che le variabili EFI non sono supportate, GRUB viene utilizzato in modalità BIOS/Legacy.

Se l'output contiene una riga simile alla seguente, GRUB viene utilizzato in modalità UEFI.

Boot0005* proxmox       [...] File(\EFI\proxmox\grubx64.efi)

Se la voce di avvio attiva punta a \EFI\proxmox\shimx64.efi come nel seguente esempio, GRUB viene utilizzato in modalità UEFI con Secure Boot abilitato.

Boot0005* proxmox       [...] File(\EFI\proxmox\shimx64.efi)

Se l'output contiene una riga simile alla seguente, viene utilizzato systemd-boot.

Boot0006* Linux Boot Manager    [...] File(\EFI\systemd\systemd-bootx64.efi)
Note I nomi dei file sopra indicati sono per host x86. Su arm64, i binari equivalenti sono denominati grubaa64.efi, shimaa64.efi e systemd-bootaa64.efi.

Eseguendo:

# proxmox-boot-tool status

è possibile verificare se proxmox-boot-tool è configurato, il che è una buona indicazione di come viene avviato il sistema.

3.13.4. GRUB

GRUB è lo standard de facto per l'avvio dei sistemi Linux da molti anni ed è documentato in modo piuttosto approfondito
[GRUB Manual https://www.gnu.org/software/grub/manual/grub/grub.html]
.

Configurazione

Le modifiche alla configurazione di GRUB vengono effettuate tramite il file dei valori predefiniti /etc/default/grub o tramite snippet di configurazione in /etc/default/grub.d. Per rigenerare il file di configurazione dopo una modifica alla configurazione, eseguire:
[I sistemi che utilizzano proxmox-boot-tool richiamano proxmox-boot-tool refresh dopo update-grub.]

# update-grub

3.13.5. Systemd-boot

systemd-boot è un bootloader EFI leggero. Legge le immagini del kernel e dell'initrd direttamente dalla EFI Service Partition (ESP) in cui è installato. Il principale vantaggio del caricamento diretto del kernel dalla ESP è che non è necessario reimplementare i driver per l'accesso allo storage. In Proxmox VE proxmox-boot-tool viene utilizzato per mantenere la configurazione sincronizzata tra le ESP.

Configurazione

systemd-boot viene configurato tramite il file loader/loader.conf nella directory principale di una EFI System Partition (ESP). Per i dettagli, consultare la pagina man loader.conf(5).

Ogni voce del bootloader è collocata in un proprio file, nella directory loader/entries/

Un esempio di entry.conf è il seguente (/ si riferisce alla radice della ESP):

title    Proxmox
version  5.0.15-1-pve
options   root=ZFS=rpool/ROOT/pve-1 boot=zfs
linux    /EFI/proxmox/5.0.15-1-pve/vmlinuz-5.0.15-1-pve
initrd   /EFI/proxmox/5.0.15-1-pve/initrd.img-5.0.15-1-pve

3.13.6. Modifica della riga di comando del kernel

È possibile modificare la riga di comando del kernel nei punti seguenti, in base al bootloader utilizzato:

GRUB

La riga di comando del kernel deve essere inserita nella variabile GRUB_CMDLINE_LINUX_DEFAULT nel file /etc/default/grub. L'esecuzione di update-grub ne aggiunge il contenuto a tutte le voci linux in /boot/grub/grub.cfg.

Systemd-boot

La riga di comando del kernel deve essere inserita su un'unica riga in /etc/kernel/cmdline. Per applicare le modifiche, eseguire proxmox-boot-tool refresh, che la imposta come riga option per tutti i file di configurazione in loader/entries/proxmox-*.conf.

Un elenco completo dei parametri del kernel è disponibile all'indirizzo https://www.kernel.org/doc/html/v<YOUR-KERNEL-VERSION>/admin-guide/kernel-parameters.html. Sostituire <YOUR-KERNEL-VERSION> con la versione major.minor; ad esempio, per i kernel basati sulla versione 6.5, l'URL sarebbe: https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html

È possibile individuare la versione del kernel controllando l'interfaccia web (Nodo → Riepilogo), oppure eseguendo

# uname -r

Utilizzare i primi due numeri all'inizio dell'output.

3.13.7. Sostituire la versione del kernel per il prossimo avvio

Per selezionare un kernel diverso da quello attualmente predefinito, è possibile:

  • utilizzare il menu del bootloader visualizzato all'inizio del processo di avvio

  • utilizzare proxmox-boot-tool per vincolare il sistema a una versione del kernel tramite pin, una sola volta o in modo permanente (finché il vincolo non viene reimpostato).

Questo dovrebbe aiutare ad aggirare le incompatibilità tra una versione più recente del kernel e l'hardware.

Note Un blocco di questo tipo dovrebbe essere rimosso quanto prima possibile, in modo che tutte le patch di sicurezza correnti dell'ultimo kernel vengano applicate anche al sistema.

Ad esempio: per selezionare in modo permanente la versione 5.15.30-1-pve per l'avvio, si dovrebbe eseguire:

# proxmox-boot-tool kernel pin 5.15.30-1-pve
Tip La funzionalità di blocco (pinning) funziona per tutti i sistemi Proxmox VE, non solo per quelli che utilizzano proxmox-boot-tool per sincronizzare il contenuto delle ESP; se il sistema non utilizza proxmox-boot-tool per la sincronizzazione, è possibile omettere anche la chiamata finale a proxmox-boot-tool refresh.

È inoltre possibile impostare una versione del kernel da avviare solo al successivo avvio del sistema. Ciò è utile, ad esempio, per verificare se un kernel aggiornato ha risolto un problema che aveva inizialmente indotto a fissare una versione tramite pin:

# proxmox-boot-tool kernel pin 5.15.30-1-pve --next-boot

Per rimuovere qualsiasi configurazione di versione bloccata, utilizzare il sottocomando unpin:

# proxmox-boot-tool kernel unpin

Sebbene anche unpin disponga di un'opzione --next-boot, questa viene utilizzata per annullare il blocco di una versione impostato con --next-boot. Poiché ciò avviene già automaticamente all'avvio, invocarla manualmente è di scarsa utilità.

Dopo aver impostato o rimosso le versioni bloccate, è necessario sincronizzare il contenuto e la configurazione sulle ESP eseguendo il sottocomando refresh.

Tip Per i sistemi gestiti da proxmox-boot-tool, verrà richiesto di eseguire automaticamente questa operazione se lo strumento viene richiamato in modalità interattiva.
# proxmox-boot-tool refresh

3.13.8. Secure Boot

A partire da Proxmox VE 8.1, Secure Boot è supportato nativamente tramite package firmati e integrazione in proxmox-boot-tool.

I seguenti package sono necessari per il funzionamento di secure boot. È possibile installarli tutti in una sola volta utilizzando il meta-package 'proxmox-secure-boot-support'.

  • shim-signed (bootloader shim firmato da Microsoft)

  • shim-helpers-amd64-signed (bootloader di fallback e MOKManager, firmati da Proxmox)

  • grub-efi-amd64-signed (bootloader GRUB EFI, firmato da Proxmox)

  • proxmox-kernel-6.X.Y-Z-pve-signed (immagine del kernel, firmata da Proxmox)

Note I nomi dei package shim-helpers-amd64-signed e grub-efi-amd64-signed sono riferiti agli host x86. Su arm64, i package corrispondenti sono shim-helpers-arm64-signed e grub-efi-arm64-signed.

Solo GRUB è supportato nativamente come bootloader, poiché gli altri bootloader attualmente non sono idonei alla firma del codice per Secure Boot.

Qualsiasi nuova installazione di Proxmox VE includerà automaticamente tutti i package indicati sopra.

Maggiori dettagli su come funziona Secure Boot e su come personalizzare la configurazione sono disponibili nel nostro wiki.

Passaggio di un'installazione esistente a Secure Boot
Warning Se non eseguita correttamente, in alcuni casi questa operazione può rendere l'installazione non avviabile. La reinstallazione dell'host configurerà Secure Boot automaticamente se disponibile, senza alcuna interazione aggiuntiva. Assicurarsi di disporre di un backup funzionante e ben testato dell'host Proxmox VE!

Un'installazione UEFI esistente può essere convertita a Secure Boot, se desiderato, senza dover reinstallare Proxmox VE da zero.

Innanzitutto, assicurarsi che tutto il sistema sia aggiornato. Successivamente, installare proxmox-secure-boot-support. GRUB crea automaticamente la voce di avvio EFI necessaria per l'avvio tramite lo shim predefinito.

systemd-boot

Se systemd-boot viene utilizzato come bootloader (vedere Determinare quale bootloader è in uso), è necessaria qualche configurazione aggiuntiva. Ciò si verifica solo nel caso in cui Proxmox VE sia stato installato con ZFS-on-root.

Per verificare quest'ultimo aspetto, eseguire:

# findmnt /

Se l'host utilizza effettivamente ZFS come file system radice, la colonna FSTYPE dovrebbe contenere zfs:

TARGET SOURCE           FSTYPE OPTIONS
/      rpool/ROOT/pve-1 zfs    rw,relatime,xattr,noacl,casesensitive

Successivamente, è necessario individuare una potenziale ESP (EFI system partition) adatta. Ciò può essere fatto utilizzando il comando lsblk come segue:

# lsblk -o +FSTYPE

L'output dovrebbe essere simile al seguente:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS FSTYPE
sda      8:0    0   32G  0 disk
├─sda1   8:1    0 1007K  0 part
├─sda2   8:2    0  512M  0 part             vfat
└─sda3   8:3    0 31.5G  0 part             zfs_member
sdb      8:16   0   32G  0 disk
├─sdb1   8:17   0 1007K  0 part
├─sdb2   8:18   0  512M  0 part             vfat
└─sdb3   8:19   0 31.5G  0 part             zfs_member

In questo caso, le partizioni sda2 e sdb2 sono quelle di destinazione. Possono essere identificate dalla loro dimensione di 512M e dal FSTYPE pari a vfat, in questo caso su un'installazione ZFS RAID-1.

Queste partizioni devono essere configurate correttamente per l'avvio tramite GRUB utilizzando proxmox-boot-tool. Questo comando (usando sda2 come esempio) deve essere eseguito separatamente per ciascuna singola ESP:

# proxmox-boot-tool init /dev/sda2 grub

Successivamente, è possibile verificare la correttezza della configurazione eseguendo il seguente comando:

# efibootmgr -v

Questo elenco dovrebbe contenere una voce simile alla seguente:

[..]
Boot0009* proxmox       HD(2,GPT,..,0x800,0x100000)/File(\EFI\proxmox\shimx64.efi)
[..]
Note Il vecchio bootloader systemd-boot verrà mantenuto, ma GRUB verrà preferito. In questo modo, se l'avvio tramite GRUB in modalità Secure Boot non funziona per qualsiasi motivo, il sistema può comunque essere avviato tramite systemd-boot con Secure Boot disattivato.

A questo punto l'host può essere riavviato e Secure Boot abilitato nell'utility di configurazione del firmware UEFI.

Al riavvio, nel menu di avvio del firmware UEFI dovrebbe essere selezionabile una nuova voce denominata proxmox, che effettua l'avvio tramite lo shim EFI pre-firmato.

Se, per qualsiasi motivo, non è possibile trovare alcuna voce proxmox nel menu di avvio UEFI, è possibile provare ad aggiungerla manualmente (se supportato dal firmware), aggiungendo il file \EFI\proxmox\shimx64.efi come voce di avvio personalizzata.

Note Alcuni firmware UEFI sono noti per eliminare l'opzione di boot proxmox al riavvio. Questo può accadere se la voce di boot proxmox punta a un'installazione GRUB su un disco, dove il disco stesso non è un'opzione di boot. Se possibile, provare ad aggiungere il disco come opzione di boot nell'utility di setup del firmware UEFI ed eseguire nuovamente proxmox-boot-tool.
Tip Per registrare chiavi personalizzate, vedere la relativa pagina wiki sul Secure Boot.
Uso di moduli DKMS/di terze parti con Secure Boot

Sui sistemi con Secure Boot abilitato, il kernel rifiuterà di caricare moduli che non siano firmati da una chiave attendibile. L'insieme predefinito di moduli distribuito con i package del kernel è firmato con una chiave effimera incorporata nell'immagine del kernel, attendibile per quella specifica versione dell'immagine del kernel.

Per caricare altri moduli, ad esempio quelli creati con DKMS o manualmente, è necessario firmarli con una chiave considerata attendibile dallo stack Secure Boot. Il modo più semplice per ottenere questo risultato è registrarli come Machine Owner Key (MOK) con mokutil.

Lo strumento dkms genera automaticamente una coppia di chiavi e un certificato in /var/lib/dkms/mok.key e /var/lib/dkms/mok.pub e li utilizza per firmare i moduli del kernel che compila e installa.

È possibile visualizzare il contenuto del certificato con

# openssl x509 -in /var/lib/dkms/mok.pub -noout -text

e registrarlo sul sistema utilizzando il seguente comando:

# mokutil --import /var/lib/dkms/mok.pub
input password:
input password again:

Il comando mokutil richiederà due volte una password (temporanea); questa password dovrà essere inserita ancora una volta nel passaggio successivo del processo! Al riavvio del sistema, dovrebbe avviarsi automaticamente il binario EFI MOKManager, che consente di verificare la chiave/il certificato e confermare la registrazione utilizzando la password scelta all'avvio della registrazione con mokutil. In seguito, il kernel dovrebbe consentire il caricamento dei moduli compilati con DKMS (che sono firmati con la MOK registrata). La MOK può essere utilizzata anche per firmare binari EFI e immagini del kernel personalizzati, se lo si desidera.

La stessa procedura può essere utilizzata anche per moduli personalizzati/di terze parti non gestiti con DKMS, ma in tal caso i passaggi di generazione della chiave/del certificato e della firma devono essere eseguiti manualmente.

3.14. Kernel Samepage Merging (KSM)

Kernel Samepage Merging (KSM) è una funzionalità opzionale di deduplicazione della memoria offerta dal kernel Linux, abilitata per impostazione predefinita in Proxmox VE. KSM funziona analizzando un intervallo di pagine di memoria fisica per individuare contenuti identici, e identificando le pagine virtuali a esse mappate. Se vengono trovate pagine identiche, le pagine virtuali corrispondenti vengono rimappate in modo che puntino tutte alla stessa pagina fisica, e le vecchie pagine vengono liberate. Le pagine virtuali sono contrassegnate come "copy-on-write", in modo che qualsiasi scrittura su di esse venga scritta in una nuova area di memoria, lasciando intatta la pagina fisica condivisa.

3.14.1. Implicazioni di KSM

KSM può ottimizzare l'utilizzo della memoria negli ambienti di virtualizzazione, poiché più VM che eseguono sistemi operativi o workload simili potrebbero potenzialmente condividere molte pagine di memoria comuni.

Tuttavia, sebbene KSM possa ridurre l'utilizzo della memoria, comporta anche alcuni rischi per la sicurezza, poiché può esporre le VM ad attacchi side-channel. Alcune ricerche hanno dimostrato che è possibile dedurre informazioni su una VM in esecuzione tramite una seconda VM sullo stesso host, sfruttando determinate caratteristiche di KSM.

Pertanto, se Proxmox VE viene utilizzato per fornire servizi di hosting, si consiglia di valutare la possibilità di disabilitare KSM, al fine di offrire agli utenti una maggiore sicurezza. Inoltre, è opportuno verificare le normative del proprio paese, poiché la disabilitazione di KSM potrebbe essere un requisito legale.

3.14.2. Disabilitazione di KSM

KSM può essere disabilitato a livello di nodo o per singola VM.

Disable KSM on a Node

Per verificare se KSM è attivo su un nodo, è possibile controllare l'output di:

# systemctl status ksmtuned

In tal caso, può essere disabilitato immediatamente con:

# systemctl disable --now ksmtuned

Infine, per separare tutte le pagine attualmente unite, eseguire:

# echo 2 > /sys/kernel/mm/ksm/run
Disabe KSM for a Specific VM

L'opzione di configurazione della VM allow-ksm controlla se l'unione delle pagine di memoria è consentita per una determinata VM. L'opzione è impostata su true per impostazione predefinita e può essere disabilitata con:

# qm set <vmid> --allow-ksm 0

4. Interfaccia grafica utente

Proxmox VE è semplice. Non è necessario installare uno strumento di gestione separato, ed è possibile fare tutto tramite il browser web (è preferibile utilizzare l'ultima versione di Firefox o Google Chrome). Per accedere alla console del guest si utilizza una console HTML5 integrata. In alternativa, è possibile utilizzare SPICE.

Poiché viene utilizzato il file system cluster Proxmox (pmxcfs), è possibile connettersi a qualsiasi nodo per gestire l'intero cluster. Ogni nodo può gestire l'intero cluster. Non è necessario un nodo manager dedicato.

È possibile utilizzare l'interfaccia di amministrazione basata sul web con qualsiasi browser moderno. Quando Proxmox VE rileva una connessione da un dispositivo mobile, viene effettuato il reindirizzamento a un'interfaccia utente più semplice, basata su touch.

È possibile accedere all'interfaccia web tramite https://youripaddress:8006 (il login predefinito è: root, e la password viene specificata durante il processo di installazione).

4.1. Funzionalità

  • Integrazione e gestione senza interruzioni dei cluster Proxmox VE

  • Tecnologie AJAX per l'aggiornamento dinamico delle risorse

  • Accesso sicuro a tutte le macchine virtuali e a tutti i container tramite crittografia SSL (https)

  • Interfaccia rapida basata sulla ricerca, in grado di gestire centinaia e probabilmente migliaia di VM

  • Console HTML5 sicura o SPICE

  • Gestione dei permessi basata sui ruoli per tutti gli oggetti (VM, storage, nodi, ecc.)

  • Supporto per più fonti di autenticazione (ad es. locale, MS ADS, LDAP, …)

  • Autenticazione a due fattori (OATH, Yubikey)

  • Basato sul framework JavaScript ExtJS 7.x

4.2. Login

screenshot/gui-login-window.png

Quando ci si connette al server, viene mostrata innanzitutto la finestra di login. Proxmox VE supporta vari backend di autenticazione (Realm), ed è possibile selezionare la lingua in questa schermata. L'interfaccia è tradotta in più di 20 lingue.

Note È possibile salvare il nome utente sul lato client selezionando la casella in basso. Questo consente di risparmiare tempo in fase di digitazione al login successivo.

4.3. Panoramica dell'interfaccia grafica

screenshot/gui-datacenter-summary.png

L'interfaccia utente di Proxmox VE è composta da quattro aree.

Intestazione

In alto. Mostra le informazioni sullo stato e contiene i pulsanti per le azioni più importanti.

Albero delle risorse

Sul lato sinistro. Un albero di navigazione in cui è possibile selezionare oggetti specifici.

Pannello dei contenuti

Area centrale. Gli oggetti selezionati mostrano qui le opzioni di configurazione e lo stato.

Pannello di log

In basso. Mostra le voci di log delle attività recenti. È possibile fare doppio clic su tali voci di log per ottenere maggiori dettagli, oppure per interrompere un'attività in esecuzione.

Note È possibile ridurre e ampliare le dimensioni dell'albero delle risorse e del pannello di log, oppure nascondere completamente il pannello di log. Questo può essere utile quando si lavora su display di piccole dimensioni e si desidera più spazio per visualizzare altri contenuti.

4.3.1. Intestazione

Nella parte superiore sinistra, la prima cosa visibile è il logo Proxmox. Accanto si trova la versione attualmente in esecuzione di Proxmox VE. Nella barra di ricerca vicina è possibile cercare oggetti specifici (VM, container, nodi, …). Questo è talvolta più rapido rispetto alla selezione di un oggetto nell'albero delle risorse.

La parte destra dell'intestazione contiene quattro pulsanti:

Documentazione

Apre una nuova finestra del browser con la documentazione di riferimento.

Crea VM

Apre la procedura guidata per la creazione della macchina virtuale.

Crea CT

Apre la procedura guidata per la creazione del container.

Menu utente

Mostra l'identità dell'utente con cui si è attualmente connessi, e facendo clic su di essa si apre un menu con opzioni specifiche per l'utente.

Nel menu utente si trova la finestra Le mie impostazioni, che fornisce le impostazioni locali dell'interfaccia. Di seguito sono presenti le scorciatoie per TFA (Autenticazione a due fattori) e per l'auto-gestione della Password. Sono inoltre disponibili opzioni per modificare la Lingua e il Tema colore. Infine, in fondo al menu è presente l'opzione Esci.

4.3.2. Le mie impostazioni

screenshot/gui-my-settings.png

La finestra Le mie impostazioni consente di configurare impostazioni memorizzate localmente. Queste includono gli Storage della dashboard, che permettono di abilitare o disabilitare storage specifici affinché vengano conteggiati nel totale visibile nel riepilogo del datacenter. Se non viene selezionato alcuno storage, il totale è la somma di tutti gli storage, come se fossero stati abilitati singolarmente tutti.

Sotto le impostazioni della dashboard si trova il nome utente memorizzato e un pulsante per cancellarlo, così come un pulsante per ripristinare ogni layout dell'interfaccia ai valori predefiniti.

Sul lato destro sono presenti le impostazioni xterm.js. Queste contengono le seguenti opzioni:

Famiglia di caratteri

Il font da utilizzare in xterm.js (ad es. Arial).

Dimensione del carattere

La dimensione del font preferita da utilizzare.

Spaziatura tra le lettere

Aumenta o diminuisce la spaziatura tra le lettere nel testo.

Altezza della riga

Specificare l'altezza assoluta di una riga.

4.3.3. Albero delle risorse

Questo è l'albero di navigazione principale. Nella parte superiore dell'albero è possibile selezionare alcune visualizzazioni predefinite, che modificano la struttura dell'albero sottostante. La visualizzazione predefinita è la Vista server, e mostra i seguenti tipi di oggetto:

Datacenter

Contiene le impostazioni a livello di cluster (rilevanti per tutti i nodi).

Nodo

Rappresenta gli host all'interno di un cluster, su cui vengono eseguiti i guest.

Guest

VM, container e template.

Storage

Storage dei dati.

Pool

È possibile raggruppare i guest utilizzando un pool per semplificare la gestione.

Sono disponibili i seguenti tipi di visualizzazione:

Vista server

Mostra tutti i tipi di oggetto, raggruppati per nodo.

Vista cartella

Mostra tutti i tipi di oggetto, raggruppati per tipo di oggetto.

Vista pool

Mostra VM e container, raggruppati per pool.

Vista tag

Mostra VM e container, raggruppati per tag.

4.3.4. Pannello di log

Lo scopo principale del pannello di log è mostrare cosa sta attualmente accadendo nel cluster. Azioni come la creazione di una nuova VM vengono eseguite in background, e tale job in background viene chiamato task.

Qualsiasi output di un tale task viene salvato in un file di log separato. È possibile visualizzare quel log facendo semplicemente doppio clic su una voce di log del task. È inoltre possibile interrompere un task in esecuzione da lì.

Si noti che qui vengono mostrati i task più recenti di tutti i nodi del cluster. In questo modo è possibile vedere in tempo reale quando qualcun altro sta lavorando su un altro nodo del cluster.

Note I task più vecchi e completati vengono rimossi dal pannello di log per mantenere l'elenco breve. Tuttavia è ancora possibile trovare tali task all'interno del pannello del nodo, nella sezione Cronologia task.

Alcune azioni di breve durata inviano semplicemente log a tutti i membri del cluster. È possibile visualizzare questi messaggi nel pannello Log del cluster.

4.4. Pannelli di contenuto

Quando si seleziona un elemento dall'albero delle risorse, l'oggetto corrispondente visualizza informazioni di configurazione e stato nel pannello di contenuto. Le sezioni seguenti forniscono una breve panoramica di questa funzionalità. Si prega di fare riferimento ai capitoli corrispondenti nella documentazione di riferimento per informazioni più dettagliate.

4.4.1. Datacenter

screenshot/gui-datacenter-search.png

A livello di datacenter, è possibile accedere a impostazioni e informazioni a livello di cluster.

  • Ricerca: esegue una ricerca a livello di cluster per nodi, VM, container, dispositivi di storage e pool.

  • Riepilogo: fornisce una breve panoramica dello stato di salute e dell'utilizzo delle risorse del cluster.

  • Cluster: fornisce le funzionalità e le informazioni necessarie per creare o aggiungersi a un cluster.

  • Opzioni: visualizzazione e gestione delle impostazioni predefinite a livello di cluster.

  • Storage: fornisce un'interfaccia per la gestione dello storage del cluster.

  • Backup: pianificazione dei job di backup. Questa funzione opera a livello di cluster, quindi non importa dove si trovino le VM/i container nel cluster al momento della pianificazione.

  • Replica: visualizzazione e gestione dei job di replica.

  • Permessi: gestione dei permessi di utenti, gruppi e token API, e dell'autenticazione LDAP, MS-AD e a due fattori.

  • HA: gestione dell'alta disponibilità (High Availability) di Proxmox VE.

  • ACME: configurare i certificati ACME (Let’s Encrypt) per i nodi server.

  • Firewall: configurazione e creazione di template per il Firewall Proxmox a livello di cluster.

  • Metric Server: definire server di metriche esterni per Proxmox VE.

  • Notifiche: configurazione del comportamento e delle destinazioni delle notifiche per Proxmox VE.

  • Supporto: visualizzazione delle informazioni sull'abbonamento di supporto.

4.4.2. Nodi

screenshot/gui-node-summary.png

A questo livello è possibile gestire singolarmente i nodi del cluster.

L'intestazione superiore contiene pulsanti utili come Reboot, Shutdown, Shell, Bulk Actions e Help. Shell presenta le opzioni noVNC, SPICE e xterm.js. Bulk Actions presenta le opzioni Bulk Start, Bulk Shutdown e Bulk Migrate.

  • Ricerca: ricerca in un nodo di VM, container, dispositivi di storage e pool.

  • Riepilogo: visualizzazione di una breve panoramica dell'utilizzo delle risorse del nodo.

  • Note: consente di scrivere commenti personalizzati in sintassi Markdown.

  • Shell: accesso a un'interfaccia shell per il nodo.

  • Sistema: configurazione delle impostazioni di rete, DNS e orario, e accesso al syslog.

  • Aggiornamenti: aggiornare il sistema e visualizzare i nuovi pacchetti disponibili.

  • Firewall: gestione del Firewall Proxmox per un nodo specifico.

  • Dischi: panoramica dei dischi collegati e gestione del loro utilizzo.

  • Ceph: utilizzato solo se è stato installato un server Ceph sull'host. In tal caso, è possibile gestire il cluster Ceph e visualizzarne lo stato da qui.

  • Replica: visualizzazione e gestione dei job di replica.

  • Cronologia attività: visualizzazione di un elenco delle attività passate.

  • Abbonamento: caricamento di una chiave di abbonamento e generazione di un report di sistema da utilizzare per i casi di supporto.

4.4.3. Guest

screenshot/gui-qemu-summary.png

Esistono due diversi tipi di guest ed entrambi possono essere convertiti in template. Uno di essi è una macchina virtuale basata su kernel (KVM) e l'altro è un container Linux (LXC). La navigazione per entrambi è perlopiù identica; solo alcune opzioni sono diverse.

Per accedere alle varie interfacce di gestione dei guest, selezionare una VM o un container dal menu a sinistra.

L'intestazione contiene comandi per elementi come la gestione dell'alimentazione, la migrazione, l'accesso e il tipo di console, la clonazione, l'HA e la guida. Alcuni di questi pulsanti contengono menu a discesa; ad esempio, Shutdown contiene anche altre opzioni di alimentazione, e Console contiene i diversi tipi di console: SPICE, noVNC e xterm.js.

Il pannello a destra contiene un'interfaccia relativa all'elemento selezionato dal menu a sinistra.

Le interfacce disponibili sono le seguenti.

  • Riepilogo: fornisce una breve panoramica dell'attività della VM e un campo Note per commenti in sintassi Markdown.

  • Console: accesso a una console interattiva per la VM/il container.

  • (KVM) Hardware: definizione dell'hardware disponibile per la VM KVM.

  • (LXC) Risorse: definizione delle risorse di sistema disponibili per l'LXC.

  • (LXC) Rete: configurazione delle impostazioni di rete di un container.

  • (LXC)DNS: consente di configurare le impostazioni DNS di un container.

  • Opzioni: consente di gestire le opzioni del guest.

  • Cronologia delle attività: visualizzare tutte le attività precedenti relative al guest selezionato.

  • (KVM) Monitor: un'interfaccia di comunicazione interattiva verso il processo KVM.

  • Backup: consente di creare e ripristinare backup del sistema.

  • Replica: visualizzare e gestire i job di replica per il guest selezionato.

  • Snapshot: creare e ripristinare snapshot delle VM.

  • Firewall: consente di configurare il firewall a livello di VM.

  • Permessi: consente di gestire i permessi per il guest selezionato.

4.4.4. Storage

screenshot/gui-storage-summary-local.png

Come per l'interfaccia dei guest, l'interfaccia per lo storage è costituita da un menu a sinistra per determinati elementi di storage e da un'interfaccia a destra per gestire tali elementi.

In questa vista è presente una visualizzazione divisa in due parti. Sul lato sinistro sono presenti le opzioni di storage e sul lato destro viene mostrato il contenuto dell'opzione selezionata.

  • Riepilogo: mostra informazioni importanti sullo storage, come il tipo, l'utilizzo e il contenuto che memorizza.

  • Contenuto: una voce di menu per ciascun tipo di contenuto memorizzato nello storage, ad esempio backup, immagini ISO, modelli di container.

  • Permessi: gestire i permessi per lo storage.

4.4.5. Pool

screenshot/gui-pool-summary-development.png

Anche in questo caso, la vista dei pool è composta da due partizioni: un menu a sinistra e le relative interfacce per ciascuna voce di menu a destra.

  • Riepilogo: mostra una descrizione del pool.

  • Membri: consente di visualizzare e gestire i membri del pool (guest e storage).

  • Permessi: consente di gestire i permessi per il pool.

4.5. Tag

screenshot/gui-qemu-summary-tags-edit.png

Per finalità organizzative, è possibile impostare tags per i guest. Attualmente, questi forniscono solo un valore informativo per gli utenti. I tag vengono visualizzati in due punti dell'interfaccia web: nel Resource Tree e nella barra di stato quando un guest è selezionato.

I tag possono essere aggiunti, modificati e rimossi nella barra di stato del guest facendo clic sull'icona a forma di matita. È possibile aggiungere più tag premendo il pulsante + e rimuoverli premendo il pulsante -. Per salvare o annullare le modifiche, è possibile utilizzare rispettivamente i pulsanti ✓ e x.

I tag possono anche essere impostati tramite la CLI, dove più tag sono separati da punto e virgola. Ad esempio:

# qm set ID --tags 'myfirsttag;mysecondtag'

4.5.1. Configurazione dello stile

screenshot/gui-datacenter-tag-style.png

Per impostazione predefinita, i colori dei tag derivano dal relativo testo in modo deterministico. È possibile personalizzare il colore, la forma nell'albero delle risorse e la distinzione tra maiuscole e minuscole, così come l'ordinamento dei tag. Ciò può essere effettuato tramite l'interfaccia web in Datacenter → Options → Tag Style Override. In alternativa, è possibile farlo tramite la CLI. Ad esempio:

# pvesh set /cluster/options --tag-style color-map=example:000000:FFFFFF

imposta il colore di sfondo del tag example su nero (#000000) e il colore del testo su bianco (#FFFFFF).

4.5.2. Permessi

screenshot/gui-datacenter-options.png

Per impostazione predefinita, gli utenti con il privilegio VM.Config.Options su un guest (/vms/ID) possono impostare qualsiasi tag desiderino (vedere Gestione dei permessi). Per limitare questo comportamento, è possibile impostare permessi appropriati in Datacenter → Options → User Tag Access:

  • free: gli utenti non hanno restrizioni nell'impostazione dei tag (predefinito)

  • list: gli utenti possono impostare i tag in base a un elenco predefinito di tag

  • existing: come list, ma gli utenti possono anche utilizzare tag già esistenti

  • none: agli utenti è impedito l'utilizzo dei tag

Lo stesso può essere effettuato anche tramite la CLI.

Si noti che un utente con i privilegi Sys.Modify su / può sempre impostare o eliminare qualsiasi tag, indipendentemente dalle impostazioni qui descritte. Inoltre, esiste un elenco configurabile di tag registrati che possono essere aggiunti e rimossi solo da utenti con il privilegio Sys.Modify su /. L'elenco dei tag registrati può essere modificato in Datacenter → Options → Registered Tags o tramite la CLI.

Per maggiori dettagli sulle opzioni esatte e su come richiamarle nella CLI, vedere Configurazione del datacenter.

È possibile configurare un banner di consenso personalizzato che deve essere accettato prima del login in Datacenter → Options → Consent Text. Se non è presente alcun contenuto, il banner di consenso non verrà visualizzato. Il testo verrà memorizzato come stringa base64 nel file di configurazione /etc/pve/datacenter.cfg.

5. Gestione del cluster

Il gestore cluster di Proxmox VE pvecm è uno strumento per creare un gruppo di server fisici. Un gruppo di questo tipo è chiamato cluster. Viene utilizzato il Corosync Cluster Engine per una comunicazione di gruppo affidabile. Non esiste un limite esplicito per il numero di nodi in un cluster. In pratica, il numero effettivo di nodi possibile può essere limitato dalle prestazioni dell'host e della rete. Attualmente (2021), sono state segnalate configurazioni di cluster (con hardware enterprise di fascia alta) con oltre 50 nodi in produzione.

pvecm può essere utilizzato per creare un nuovo cluster, aggiungere nodi a un cluster, abbandonare il cluster, ottenere informazioni sullo stato ed eseguire varie altre attività relative al cluster. Il Proxmox Cluster File System ("pmxcfs") viene utilizzato per distribuire in modo trasparente la configurazione del cluster a tutti i nodi del cluster.

Raggruppare i nodi in un cluster presenta i seguenti vantaggi:

  • Gestione centralizzata basata sul web

  • Cluster multi-master: ogni nodo può eseguire tutte le attività di gestione

  • Utilizzo di pmxcfs, un file system basato su database, per memorizzare i file di configurazione, replicati in tempo reale su tutti i nodi tramite corosync

  • Facile migrazione di macchine virtuali e container tra host fisici

  • Distribuzione rapida

  • Servizi a livello di cluster come firewall e HA

5.1. Requisiti

  • Tutti i nodi devono essere in grado di connettersi tra loro tramite le porte UDP 5405-5412 perché corosync funzioni.

  • Data e ora devono essere sincronizzate.

  • È richiesto un tunnel SSH sulla porta TCP 22 tra i nodi.

  • Per l'alta disponibilità, sono necessari almeno tre nodi per un quorum affidabile. Tutti i nodi dovrebbero avere la stessa versione.

    Note Per cluster più piccoli a 2 nodi, è possibile utilizzare il QDevice per fornire un terzo voto.
  • Si consiglia una NIC fisica dedicata per il traffico del cluster.

    Note La comunicazione del cluster Proxmox VE utilizza il protocollo Corosync. Richiede una latenza bassa e costante, ma non molta banda. Una NIC dedicata da 1 Gbit è sufficiente nella maggior parte delle situazioni. Questo aiuta a evitare situazioni in cui altri servizi possano utilizzare tutta la banda disponibile, il che a sua volta aumenterebbe la latenza per i pacchetti Corosync.
  • I link aggiuntivi per il traffico del cluster offrono ridondanza nel caso in cui la rete dedicata non sia disponibile.

    Note Corosync supporta fino a 8 link.
    Note Per garantire una ridondanza affidabile di Corosync, è essenziale disporre di almeno un altro link su una rete fisica diversa. Questo consente a Corosync di mantenere attiva la comunicazione del cluster nel caso in cui la rete dedicata non sia disponibile.
    Note Un singolo link supportato da un bond può risultare problematico in determinati scenari di errore; vedere Corosync su bond.
  • La password di root di un nodo del cluster è necessaria per l'aggiunta di nodi.

  • La migrazione online delle macchine virtuali è supportata solo quando i nodi dispongono di CPU dello stesso produttore. Potrebbe funzionare anche in altri casi, ma non è mai garantito.

5.2. Preparazione dei nodi

Innanzitutto, installare Proxmox VE su tutti i nodi. Assicurarsi che ogni nodo sia installato con il nome host e la configurazione IP definitivi. Non è possibile modificare il nome host e l'IP dopo la creazione del cluster.

Sebbene sia comune fare riferimento a tutti i nomi dei nodi e ai relativi IP in /etc/hosts (o rendere i loro nomi risolvibili in altri modi), questo non è necessario per il funzionamento di un cluster. Può tuttavia essere utile, poiché consente di connettersi da un nodo all'altro tramite SSH, utilizzando il nome del nodo, più facile da ricordare (vedere anche Tipi di indirizzo del link). Si noti che si raccomanda sempre di fare riferimento ai nodi tramite i relativi indirizzi IP nella configurazione del cluster.

5.3. Creazione di un cluster

È possibile creare un cluster da console (accesso tramite ssh), oppure tramite l'API utilizzando l'interfaccia web di Proxmox VE (Datacenter → Cluster).

Note Utilizzare un nome univoco per il cluster. Questo nome non può essere modificato in seguito. Il nome del cluster segue le stesse regole dei nomi dei nodi.

5.3.1. Creazione tramite interfaccia web

screenshot/gui-cluster-create.png

In Datacenter → Cluster, fare clic su Crea cluster. Inserire il nome del cluster e selezionare una connessione di rete dall'elenco a discesa da utilizzare come rete principale del cluster (Link 0). Il valore predefinito è l'IP risolto tramite il nome host del nodo.

A partire da Proxmox VE 6.2, è possibile aggiungere fino a 8 link di fallback a un cluster. Per aggiungere un link ridondante, fare clic sul pulsante Aggiungi e selezionare un numero di link e un indirizzo IP nei rispettivi campi. Prima di Proxmox VE 6.2, per aggiungere un secondo link come fallback, è possibile selezionare la casella di controllo Avanzate e scegliere un'ulteriore interfaccia di rete (Link 1, vedere anche Ridondanza Corosync).

Note Assicurarsi che la rete selezionata per la comunicazione del cluster non venga utilizzata per scopi ad alto traffico, come lo storage di rete o la live-migration. Sebbene la rete del cluster in sé produca piccole quantità di dati, è molto sensibile alla latenza. Consultare i requisiti completi della rete del cluster.

5.3.2. Creazione tramite riga di comando

Accedere tramite ssh al primo nodo Proxmox VE ed eseguire il comando seguente:

 hp1# pvecm create CLUSTERNAME

Per verificare lo stato del nuovo cluster utilizzare:

 hp1# pvecm status

5.3.3. Più cluster nella stessa rete

È possibile creare più cluster nella stessa rete fisica o logica. In questo caso, ogni cluster deve avere un nome univoco per evitare possibili conflitti nello stack di comunicazione del cluster. Inoltre, questo aiuta a evitare confusione, rendendo i cluster chiaramente distinguibili.

Sebbene il requisito di banda di un cluster corosync sia relativamente basso, la latenza dei pacchetti e il tasso di pacchetti al secondo (PPS) rappresentano il fattore limitante. Cluster diversi nella stessa rete possono competere tra loro per queste risorse, quindi può comunque essere opportuno utilizzare un'infrastruttura di rete fisica separata per i cluster più grandi.

5.4. Aggiunta di nodi al cluster

Caution Tutta la configurazione esistente in /etc/pve viene sovrascritta quando si aggiunge un nodo a un cluster. In particolare, un nodo in fase di aggiunta non può contenere guest, poiché gli ID dei guest potrebbero altrimenti entrare in conflitto, e il nodo erediterà la configurazione dello storage del cluster. Per aggiungere un nodo con guest esistenti, come soluzione alternativa, è possibile creare un backup di ogni guest (utilizzando vzdump) e ripristinarlo con un ID diverso dopo l'aggiunta. Se il layout dello storage del nodo è diverso, sarà necessario aggiungere nuovamente gli storage del nodo e adattare la restrizione dei nodi di ciascuno storage in modo che rifletta su quali nodi lo storage sia effettivamente disponibile.

5.4.1. Aggiunta di un nodo al cluster tramite GUI

screenshot/gui-cluster-join-information.png

Accedere all'interfaccia web su un nodo cluster esistente. In Datacenter → Cluster, fare clic sul pulsante Join Information in alto. Quindi, fare clic sul pulsante Copy Information. In alternativa, copiare manualmente la stringa dal campo Information.

screenshot/gui-cluster-join.png

Successivamente, accedere all'interfaccia web sul nodo che si desidera aggiungere. In Datacenter → Cluster, fare clic su Join Cluster. Compilare il campo Information con il testo Join Information copiato precedentemente. La maggior parte delle impostazioni necessarie per aggiungersi al cluster verrà compilata automaticamente. Per motivi di sicurezza, la password del cluster deve essere inserita manualmente.

Note Per inserire manualmente tutti i dati richiesti, è possibile disattivare la casella Assisted Join.

Dopo aver fatto clic sul pulsante Join, il processo di adesione al cluster inizierà immediatamente. Dopo che il nodo si è unito al cluster, il suo certificato di nodo attuale verrà sostituito con uno firmato dall'autorità di certificazione (CA) del cluster. Ciò significa che la sessione corrente smetterà di funzionare dopo pochi secondi. Potrebbe quindi essere necessario forzare il ricaricamento dell'interfaccia web ed effettuare nuovamente l'accesso con le credenziali del cluster.

Ora il nodo dovrebbe essere visibile in Datacenter → Cluster.

5.4.2. Aggiunta di un nodo al cluster tramite riga di comando

Accedere tramite ssh al nodo che si desidera aggiungere a un cluster esistente.

 # pvecm add IP-ADDRESS-CLUSTER

Per IP-ADDRESS-CLUSTER, utilizzare l'IP o il nome host di un nodo cluster esistente. Si consiglia un indirizzo IP (vedere Tipi di indirizzo del collegamento).

Per impostazione predefinita, pvecm add si autentica tramite l'API del nodo esistente del cluster, richiedendo la password di root@pam di quel nodo e verificando l'impronta digitale SHA-256 del suo certificato. L'autenticazione SSH tramite password non è richiesta per questo flusso predefinito, pertanto gli amministratori possono mantenere PasswordAuthentication no impostato in sshd_config.

Passare --use_ssh per tornare all'adesione legacy basata su SSH, che utilizza ssh-copy-id per unire la chiave root del cluster esistente al nuovo nodo. Questo flusso richiede effettivamente l'accesso SSH come root (con password o chiave) sul nodo esistente.

Per verificare lo stato del cluster utilizzare:

 # pvecm status
Cluster status after adding 4 nodes
 # pvecm status
Cluster information
~~~~~~~~~~~~~~~~~~~
Name:             prod-central
Config Version:   3
Transport:        knet
Secure auth:      on

Quorum information
~~~~~~~~~~~~~~~~~~
Date:             Tue Sep 14 11:06:47 2021
Quorum provider:  corosync_votequorum
Nodes:            4
Node ID:          0x00000001
Ring ID:          1.1a8
Quorate:          Yes

Votequorum information
~~~~~~~~~~~~~~~~~~~~~~
Expected votes:   4
Highest expected: 4
Total votes:      4
Quorum:           3
Flags:            Quorate

Membership information
~~~~~~~~~~~~~~~~~~~~~~
    Nodeid      Votes Name
0x00000001          1 192.168.15.91
0x00000002          1 192.168.15.92 (local)
0x00000003          1 192.168.15.93
0x00000004          1 192.168.15.94

Se si desidera solo un elenco di tutti i nodi, utilizzare:

 # pvecm nodes
List nodes in a cluster
 # pvecm nodes

Membership information
~~~~~~~~~~~~~~~~~~~~~~
    Nodeid      Votes Name
         1          1 hp1
         2          1 hp2 (local)
         3          1 hp3
         4          1 hp4

5.4.3. Aggiunta di nodi con rete del cluster separata

Quando si aggiunge un nodo a un cluster con una rete del cluster separata, è necessario utilizzare il parametro link0 per impostare l'indirizzo del nodo su quella rete:

# pvecm add IP-ADDRESS-CLUSTER --link0 LOCAL-IP-ADDRESS-LINK0

Se si desidera utilizzare la ridondanza integrata del livello di trasporto Kronosnet, utilizzare anche il parametro link1.

Utilizzando la GUI, è possibile selezionare l'interfaccia corretta dai corrispondenti campi Link X nella finestra di dialogo Cluster Join.

5.5. Rimuovere un nodo del cluster

Caution Leggere attentamente la procedura prima di procedere, poiché potrebbe non essere ciò che si desidera o di cui si ha bisogno.

I passaggi seguenti spiegano come rimuovere un nodo da un cluster che faceva parte anche di un cluster Ceph. Se Ceph non era installato sul nodo, è possibile semplicemente ignorare i passaggi che lo menzionano.

Note Se la configurazione contiene un QDevice, sarà necessario rimuoverlo prima di rimuovere il nodo del cluster, come descritto nelle FAQ qui.

5.5.1. Prerequisiti

  • Spostare tutte le macchine virtuali e i container dal nodo.

  • Eseguire il backup di tutti i dati locali sul nodo da eliminare.

  • Assicurarsi che il nodo da eliminare non faccia più parte di alcun job di replica.

    Caution Se i job di replica non vengono rimossi da un nodo prima di rimuovere il nodo stesso, il job di replica diventerà irremovibile. Si noti che la replica cambia automaticamente direzione quando una VM replicata viene migrata. Pertanto, migrando una VM replicata da un nodo che sta per essere eliminato verranno impostati automaticamente job di replica verso quel nodo.
  • Assicurarsi che il cluster Ceph rimanente disponga di spazio di storage sufficiente e che gli OSD siano in esecuzione (cioè up e in). La distruzione di un OSD, specialmente l'ultimo su un nodo, attiverà un ribilanciamento dei dati in Ceph.

    Note Assicurarsi che siano ancora disponibili abbastanza nodi con OSD per soddisfare i parametri size/min_size configurati per i pool Ceph. Se sono disponibili meno di size (predefinito: 3) nodi, la ridondanza dei dati sarà degradata. Se sono disponibili meno di min_size (predefinito: 2) nodi, l'I/O dei pool verrà bloccato finché non saranno disponibili repliche sufficienti. I guest interessati potrebbero bloccarsi se il loro I/O viene bloccato.
  • Assicurarsi che rimanga disponibile nel cluster Ceph un numero sufficiente di monitor, manager e, se si utilizza CephFS, server di metadati.

5.5.2. Rimuovere il nodo del cluster

Prima che un nodo possa essere rimosso da un cluster, è necessario assicurarsi che non faccia più parte di un cluster Ceph e che nessuna risorsa o servizio Ceph risieda su di esso.

Nell'esempio seguente, il nodo del cluster node4 verrà rimosso sia da Ceph che dal cluster corosync di Proxmox VE.

node4# pvecm nodes

Membership information
~~~~~~~~~~~~~~~~~~~~~~
    Nodeid      Votes Name
         1          1 node1
         2          1 node2
         3          1 node3
         4          1 node4 (local)
  1. Iniziare rimuovendo il nodo dal cluster Ceph; ciò consiste in diversi passaggi:

    1. Iniziare distruggendo gli OSD Ceph rimanenti sul nodo da eliminare, uno dopo l'altro.

    2. Attendere finché lo stato CEPH non raggiunga nuovamente HEALTH_OK.

    3. Se esistono, distruggere i metadata server Ceph rimanenti tramite l'interfaccia web in Ceph → CephFS oppure eseguendo:

      node4# pveceph mds destroy node4
    4. Distruggere il monitor Ceph rimanente.

    5. Distruggere il manager Ceph rimanente.

    6. Infine, rimuovere dalla gerarchia CRUSH il bucket Ceph ora vuoto (il nodo Proxmox VE da rimuovere).

      node4# ceph osd crush remove node4
  2. Ora, spegnere node4 e assicurarsi che non si riaccenda su questa rete con la configurazione attuale.

    Important Come menzionato sopra, è fondamentale spegnere il nodo prima della rimozione e assicurarsi che non si riaccenda (nella rete del cluster esistente) con la configurazione attuale. Se il nodo viene riacceso così com'è, il cluster potrebbe risultare danneggiato e potrebbe essere difficile ripristinarlo a uno stato funzionante.
  3. Accedere a uno dei nodi rimanenti del cluster e rimuovere il nodo node4 dal cluster.

    node1# pvecm delnode node4
    Note È possibile che venga restituito un messaggio di errore che indica could not kill node (error = cs_err_not_exist). Ciò non indica un effettivo fallimento nell'eliminazione del nodo, ma piuttosto un fallimento di Corosync nel tentativo di terminare un nodo offline. Pertanto, può essere tranquillamente ignorato.
  4. Verificare che il nodo sia stato rimosso correttamente dal cluster

    node1# pvecm nodes
    
    Membership information
    ~~~~~~~~~~~~~~~~~~~~~~
        Nodeid      Votes Name
             1          1 node1 (local)
             2          1 node2
             3          1 node3

5.5.3. Passaggi di pulizia dopo la rimozione del nodo

  • I file di configurazione del nodo rimosso risiederanno ancora in /etc/pve/nodes/node4 nel filesystem del cluster. Recuperare ogni configurazione ancora necessaria e rimuovere successivamente la directory.

  • L'impronta digitale SSH del nodo rimosso risiederà ancora nel file known_hosts sugli altri nodi. In caso di errore SSH dopo aver ricollegato un nodo con lo stesso IP o hostname, eseguire una volta pvecm updatecerts sul nodo ri-aggiunto per aggiornare la sua impronta digitale a livello di cluster.

  • Le regole di alta disponibilità esistenti faranno ancora riferimento al nodo eliminato; è pertanto necessario rimuovere il nodo da tutte le regole esistenti.

  • La chiave pubblica del nodo rimosso sarà ancora elencata in /etc/pve/priv/authorized_keys e dovrebbe essere eliminata se non è più necessaria.

Rejoin the same node again:

Se si desidera che lo stesso server si unisca nuovamente allo stesso cluster, è necessario:

5.6. Separare un nodo senza reinstallare

Caution Questo non è il metodo consigliato, procedere con cautela. Usare il metodo precedente in caso di dubbio.

È anche possibile separare un nodo da un cluster senza reinstallarlo da zero. Tuttavia, dopo aver rimosso il nodo dal cluster, continuerà ad avere accesso a qualsiasi storage condiviso. Questo problema deve essere risolto prima di iniziare a rimuovere il nodo dal cluster. Un cluster Proxmox VE non può condividere lo stesso storage con un altro cluster, poiché il locking dello storage non funziona oltre i confini del cluster. Inoltre, ciò può anche causare conflitti di VMID.

Si consiglia di creare un nuovo storage, al quale abbia accesso solo il nodo che si vuole separare. Può trattarsi di un nuovo export sul proprio NFS o di un nuovo pool Ceph, per citare alcuni esempi. È importante solo che allo stesso identico storage non accedano più cluster. Dopo aver configurato questo storage, spostare tutti i dati e le VM dal nodo ad esso. A questo punto si è pronti per separare il nodo dal cluster.

Note Se la configurazione contiene un QDevice, sarà necessario rimuoverlo prima di rimuovere il nodo del cluster, come descritto nelle FAQ qui.
Warning Assicurarsi che tutte le risorse condivise siano separate in modo pulito! In caso contrario si incontreranno conflitti e problemi.

Per prima cosa, fermare i servizi corosync e pve-cluster sul nodo:

systemctl stop pve-cluster
systemctl stop corosync

Avviare nuovamente il file system del cluster in modalità locale:

pmxcfs -l

Eliminare i file di configurazione di corosync:

rm /etc/pve/corosync.conf
rm -r /etc/corosync/*

È ora possibile avviare nuovamente il file system come servizio normale:

killall pmxcfs
systemctl start pve-cluster

Il nodo è ora separato dal cluster. È possibile eliminarlo da qualsiasi altro nodo rimanente del cluster con:

pvecm delnode oldnode

Se il comando fallisce a causa della perdita del quorum nel nodo rimanente, è possibile impostare i voti previsti a 1 come soluzione temporanea:

pvecm expected 1

E quindi ripetere il comando pvecm delnode.

Tornare ora al nodo separato ed eliminare tutti i file del cluster rimanenti su di esso. Questo garantisce che il nodo possa essere aggiunto a un altro cluster di nuovo senza problemi.

rm /var/lib/corosync/*

Poiché i file di configurazione degli altri nodi sono ancora presenti nel file system del cluster, potrebbe essere opportuno eliminare anche questi. Dopo aver verificato con assoluta certezza che il nome del nodo sia corretto, è possibile rimuovere semplicemente l'intera directory in modo ricorsivo da /etc/pve/nodes/NODENAME.

Caution Le chiavi SSH del nodo rimarranno nel file authorized_key. Ciò significa che i nodi possono ancora connettersi tra loro con autenticazione a chiave pubblica. Si dovrebbe risolvere questo problema rimuovendo le rispettive chiavi dal file /etc/pve/priv/authorized_keys.

5.7. Quorum

Proxmox VE utilizza una tecnica basata sul quorum per fornire uno stato coerente tra tutti i nodi del cluster.

Un quorum è il numero minimo di voti che una transazione distribuita deve ottenere per poter eseguire un'operazione in un sistema distribuito.

Quorum (distributed computing)
— from Wikipedia

In caso di partizionamento della rete, i cambiamenti di stato richiedono che la maggioranza dei nodi sia online. Il cluster passa alla modalità di sola lettura se perde il quorum.

Note Proxmox VE assegna un singolo voto a ciascun nodo per impostazione predefinita.

5.8. Rete del cluster

La rete del cluster è il cuore di un cluster. Tutti i messaggi inviati tramite essa devono essere recapitati in modo affidabile a tutti i nodi nel loro rispettivo ordine. In Proxmox VE questa parte viene gestita da corosync, un'implementazione di un toolkit di sviluppo ad alte prestazioni, a basso overhead e ad alta disponibilità. Serve il nostro file system di configurazione decentralizzato (pmxcfs).

5.8.1. Requisiti di rete

Lo stack del cluster Proxmox VE richiede una rete affidabile con latenze inferiori a 5 millisecondi (prestazioni LAN) tra tutti i nodi per operare in modo stabile. Sebbene su configurazioni con un numero limitato di nodi una rete con latenze più elevate possa funzionare, ciò non è garantito e diventa piuttosto improbabile con più di tre nodi e latenze superiori a circa 10 ms.

La rete non dovrebbe essere utilizzata intensamente da altri membri, poiché, sebbene corosync non utilizzi molta banda, è sensibile alle variazioni di latenza (jitter); idealmente corosync dovrebbe funzionare su una propria rete fisicamente separata. In particolare, non utilizzare una rete condivisa per corosync e storage (eccetto come potenziale fallback a bassa priorità in una configurazione ridondante).

Prima di configurare un cluster, è buona norma verificare se la rete è adatta a tale scopo. Per assicurarsi che i nodi possano connettersi tra loro sulla rete del cluster, è possibile testare la connettività tra essi con lo strumento ping.

Se il firewall di Proxmox VE è abilitato, le regole ACCEPT per corosync verranno generate automaticamente - non è richiesta alcuna azione manuale.

Note Corosync utilizzava il Multicast prima della versione 3.0 (introdotta in Proxmox VE 6.0). Le versioni moderne si basano su Kronosnet per la comunicazione del cluster, che, per il momento, supporta solo il normale UDP unicast.
Caution È ancora possibile abilitare Multicast o il vecchio unicast impostando il trasporto su udp o udpu nel proprio corosync.conf, tenendo presente che questo disabiliterà tutto il supporto crittografico e di ridondanza. Questo non è pertanto consigliato.

5.8.2. Corosync su bond

Raccomandazioni

Si consiglia almeno una NIC fisica dedicata per il link Corosync primario, vedere Requisiti. I bond possono essere utilizzati come link aggiuntivi per una ridondanza maggiore. Si applicano le seguenti avvertenze ogni volta che un bond viene utilizzato per il traffico Corosync:

  • La modalità bond active-backup potrebbe non fornire la ridondanza attesa in determinati scenari di guasto, vedere sotto per i dettagli.

  • Si sconsiglia l'uso delle modalità bond balance-rr, balance-xor, balance-tlb o balance-alb per il traffico Corosync. Sono note per essere problematiche in determinati scenari di guasto, vedere sotto per i dettagli.

  • IEEE 802.3ad (LACP): se vengono utilizzati bond LACP per il traffico corosync, si raccomanda vivamente di impostare bond-lacp-rate fast sul nodo Proxmox VE e sullo switch! Con l'impostazione predefinita bond-lacp-rate slow, questa modalità è nota per essere problematica in determinati scenari di guasto, vedere sotto per i dettagli.

Contesto

L'utilizzo di un bond come link Corosync può essere problematico in determinati scenari di guasto. Si consideri lo scenario di guasto in cui una delle interfacce in bond si guasta e interrompe la trasmissione di pacchetti, ma il suo stato del link rimane attivo, e non sono disponibili altri link Corosync. In questo scenario, alcune modalità bond possono causare uno stato di connettività asimmetrica in cui i nodi del cluster possono comunicare solo con sottoinsiemi diversi degli altri nodi. Sono interessate le modalità bond che forniscono il bilanciamento del carico, poiché queste modalità potrebbero comunque tentare di inviare un sottoinsieme di pacchetti attraverso l'interfaccia guasta. In caso di connettività asimmetrica, Corosync potrebbe non essere in grado di formare un quorum stabile nel cluster. Se questo stato persiste e l'HA è abilitata, anche i nodi il cui bond non presenta alcun problema potrebbero eseguire il fencing su se stessi. Nel peggiore dei casi, l'intero cluster potrebbe eseguire il fencing su se stesso.

La modalità bond active-backup non causerà connettività asimmetrica nello scenario di guasto descritto sopra. Tuttavia, il bond con il guasto dell'interfaccia potrebbe non passare al link di backup. Il nodo potrebbe perdere la connessione al cluster e, se l'HA è abilitata, eseguire il fencing su se stesso.

Le modalità bond balance-rr, balance-xor, balance_tlb o balance-alb possono causare connettività asimmetrica nello scenario di guasto sopra descritto, il che può portare a un fencing imprevisto se l'HA è abilitata.

La modalità bond IEEE 802.3ad (LACP) può causare connettività asimmetrica nello scenario di guasto sopra descritto, ma può recuperare da questo stato, poiché ciascun lato del bond (nodo Proxmox VE e switch) può interrompere l'utilizzo di un'interfaccia in bond se non ha ricevuto tre LACPDU consecutive su di essa. Tuttavia, con le impostazioni predefinite, le LACPDU vengono inviate solo ogni 30 secondi, con un tempo di failover di 90 secondi. Questo è troppo lungo, poiché i nodi con risorse HA eseguiranno il fencing su se stessi già dopo circa un minuto senza un quorum stabile. Se vengono utilizzati bond LACP per il traffico corosync, si consiglia di impostare bond-lacp-rate fast sul nodo Proxmox VE e sullo switch! Impostare questa opzione su un lato richiede all'altro lato di inviare una LACPDU ogni secondo. Impostare questa opzione su entrambi i lati può ridurre il tempo di failover nello scenario sopra descritto a 3 secondi, prevenendo così il fencing.

5.8.3. Rete cluster separata

Quando si crea un cluster senza alcun parametro, la rete cluster corosync è generalmente condivisa con l'interfaccia web e la rete delle VM. In base alla configurazione, anche il traffico storage potrebbe essere inviato sulla stessa rete. Si raccomanda di modificare questo comportamento, poiché corosync è un'applicazione in tempo reale e critica dal punto di vista temporale.

Configurazione di una nuova rete

Innanzitutto, è necessario configurare una nuova interfaccia di rete. Dovrebbe trovarsi su una rete fisicamente separata. Assicurarsi che la rete soddisfi i requisiti della rete cluster.

Separazione durante la creazione del cluster

Questo è possibile tramite i parametri linkX del comando pvecm create, utilizzato per creare un nuovo cluster.

Se è stata configurata una NIC aggiuntiva con un indirizzo statico su 10.10.10.1/25, e si desidera inviare e ricevere tutte le comunicazioni del cluster tramite questa interfaccia, è necessario eseguire:

pvecm create test --link0 10.10.10.1

Per verificare che tutto funzioni correttamente, eseguire:

systemctl status corosync

Successivamente, procedere come descritto sopra per aggiungere nodi con una rete cluster separata.

Separare dopo la creazione del cluster

È possibile eseguire questa operazione se è già stato creato un cluster e si desidera passare la sua comunicazione a un'altra rete, senza ricostruire l'intero cluster. Questa modifica può comportare brevi periodi di perdita del quorum nel cluster, poiché i nodi devono riavviare corosync e tornare attivi uno dopo l'altro sulla nuova rete.

Verificare prima come modificare il file corosync.conf. Quindi aprirlo: si dovrebbe visualizzare un file simile a:

logging {
  debug: off
  to_syslog: yes
}

nodelist {

  node {
    name: due
    nodeid: 2
    quorum_votes: 1
    ring0_addr: due
  }

  node {
    name: tre
    nodeid: 3
    quorum_votes: 1
    ring0_addr: tre
  }

  node {
    name: uno
    nodeid: 1
    quorum_votes: 1
    ring0_addr: uno
  }

}

quorum {
  provider: corosync_votequorum
}

totem {
  cluster_name: testcluster
  config_version: 3
  ip_version: ipv4-6
  secauth: on
  version: 2
  interface {
    linknumber: 0
  }

}
Note ringX_addr specifica in realtà un indirizzo link di corosync. Il nome "ring" è un residuo delle versioni precedenti di corosync, mantenuto per compatibilità con le versioni precedenti.

La prima cosa da fare è aggiungere le proprietà name nelle voci dei nodi, se non sono già presenti. Queste devono corrispondere al nome del nodo.

Sostituire quindi tutti gli indirizzi delle proprietà ring0_addr di tutti i nodi con i nuovi indirizzi. È possibile utilizzare indirizzi IP semplici o nomi host. Se si utilizzano nomi host, assicurarsi che siano risolvibili da tutti i nodi (vedere anche Tipi di indirizzo link).

In questo esempio, si desidera passare la comunicazione del cluster alla rete 10.10.10.0/25, quindi si modifica il ring0_addr di ciascun nodo di conseguenza.

Note La stessa identica procedura può essere utilizzata per modificare anche altri valori di ringX_addr. Si consiglia tuttavia di modificare un solo indirizzo link alla volta, in modo che sia più semplice ripristinare la situazione in caso di problemi.

Dopo aver incrementato la proprietà config_version, il nuovo file di configurazione dovrebbe risultare simile a:

logging {
  debug: off
  to_syslog: yes
}

nodelist {

  node {
    name: due
    nodeid: 2
    quorum_votes: 1
    ring0_addr: 10.10.10.2
  }

  node {
    name: tre
    nodeid: 3
    quorum_votes: 1
    ring0_addr: 10.10.10.3
  }

  node {
    name: uno
    nodeid: 1
    quorum_votes: 1
    ring0_addr: 10.10.10.1
  }

}

quorum {
  provider: corosync_votequorum
}

totem {
  cluster_name: testcluster
  config_version: 4
  ip_version: ipv4-6
  secauth: on
  version: 2
  interface {
    linknumber: 0
  }

}

Quindi, dopo un controllo finale per verificare che tutte le informazioni modificate siano corrette, si salva e si segue nuovamente la sezione modifica del file corosync.conf per rendere effettive le modifiche.

Le modifiche verranno applicate immediatamente, pertanto il riavvio di corosync non è strettamente necessario. Se sono state modificate anche altre impostazioni, o si nota che corosync segnala degli errori, è possibile eventualmente avviare un riavvio.

Su un singolo nodo eseguire:

systemctl restart corosync

Verificare ora che tutto sia a posto:

systemctl status corosync

Se corosync riprende a funzionare, riavviarlo anche su tutti gli altri nodi. Questi entreranno quindi a far parte del cluster uno per uno sulla nuova rete.

5.8.4. Indirizzi corosync

Un indirizzo link di corosync (indicato per compatibilità con le versioni precedenti da ringX_addr in corosync.conf) può essere specificato in due modi:

  • Gli indirizzi IPv4/v6 possono essere utilizzati direttamente. Sono raccomandati, poiché sono statici e generalmente non vengono modificati con leggerezza.

  • I nomi host verranno risolti tramite getaddrinfo, il che significa che, per impostazione predefinita, se disponibili verranno utilizzati prima gli indirizzi IPv6 (vedere anche man gai.conf). È importante tenerne conto, specialmente durante l'aggiornamento di un cluster esistente a IPv6.

Caution I nomi host devono essere utilizzati con cautela, poiché gli indirizzi a cui vengono risolti possono essere modificati senza intervenire su corosync o sul nodo su cui viene eseguito - il che può portare a una situazione in cui un indirizzo viene modificato senza considerare le implicazioni per corosync.

Se si preferisce utilizzare i nomi host, si consiglia un nome host separato e statico specifico per corosync. Assicurarsi inoltre che ogni nodo del cluster possa risolvere correttamente tutti i nomi host.

A partire da Proxmox VE 5.1, sebbene siano supportati, i nomi host verranno risolti al momento dell'inserimento. Solo l'IP risolto viene salvato nella configurazione.

I nodi che si sono uniti al cluster in versioni precedenti probabilmente utilizzano ancora il loro nome host non risolto in corosync.conf. Potrebbe essere opportuno sostituire tali nomi host con indirizzi IP o un nome host separato, come indicato sopra.

5.9. Ridondanza Corosync

Corosync supporta per impostazione predefinita la rete ridondante tramite il suo livello Kronosnet integrato (la rete ridondante non è supportata sui trasporti legacy udp/udpu). È possibile abilitarla specificando più di un indirizzo di link, tramite i parametri --linkX di pvecm, nella GUI come Link 1 (durante la creazione di un cluster o l'aggiunta di un nuovo nodo) oppure specificando più di un ringX_addr in corosync.conf.

Note Per garantire un failover utile, ogni link dovrebbe trovarsi sulla propria connessione di rete fisica.

I seguenti esempi presuppongono che ciascun nodo del cluster abbia configurato un indirizzo statico in 10.10.10.0/25 e un indirizzo statico in 10.20.20.0/25.

I link vengono utilizzati in base a un'impostazione di priorità. È possibile configurare questa priorità impostando knet_link_priority nella sezione dell'interfaccia corrispondente in corosync.conf, oppure, preferibilmente, utilizzando il parametro priority durante la creazione del cluster con pvecm:

 # pvecm create CLUSTERNAME --link0 10.10.10.1,priority=15 --link1 10.20.20.1,priority=20

Questo farebbe in modo che link1 venga utilizzato per primo, poiché ha la priorità più alta.

Se non vengono configurate manualmente delle priorità (o se due link hanno la stessa priorità), i link verranno utilizzati in base al loro numero, con il numero più basso che ha la priorità più alta.

Anche se tutti i link sono funzionanti, solo quello con la priorità più alta vedrà il traffico corosync. Le priorità dei link non possono essere mescolate, il che significa che i link con priorità diverse non potranno comunicare tra loro.

Poiché i link con priorità inferiore non vedranno traffico a meno che tutte le priorità superiori non siano andate in errore, può risultare una strategia utile specificare le reti usate per altre attività (VM, storage, etc.) come link a bassa priorità. Nel peggiore dei casi, una connessione con latenza maggiore o più congestionata potrebbe essere meglio di nessuna connessione.

Per aggiungere un nuovo link a una configurazione in esecuzione, è necessario prima verificare come modificare il file corosync.conf.

Successivamente, aggiungere un nuovo ringX_addr a ogni nodo nella sezione nodelist. Assicurarsi che la X sia la stessa per ogni nodo a cui viene aggiunta, e che sia univoca per ciascun nodo.

Infine, aggiungere una nuova interface, come mostrato di seguito, alla sezione totem, sostituendo X con il numero di link scelto sopra.

Supponendo di aver aggiunto un link con numero 1, il nuovo file di configurazione potrebbe avere questo aspetto:

logging {
  debug: off
  to_syslog: yes
}

nodelist {

  node {
    name: due
    nodeid: 2
    quorum_votes: 1
    ring0_addr: 10.10.10.2
    ring1_addr: 10.20.20.2
  }

  node {
    name: tre
    nodeid: 3
    quorum_votes: 1
    ring0_addr: 10.10.10.3
    ring1_addr: 10.20.20.3
  }

  node {
    name: uno
    nodeid: 1
    quorum_votes: 1
    ring0_addr: 10.10.10.1
    ring1_addr: 10.20.20.1
  }

}

quorum {
  provider: corosync_votequorum
}

totem {
  cluster_name: testcluster
  config_version: 4
  ip_version: ipv4-6
  secauth: on
  version: 2
  interface {
    linknumber: 0
  }
  interface {
    linknumber: 1
  }
}

Il nuovo link verrà abilitato non appena si seguono gli ultimi passaggi per modificare il file corosync.conf. Non dovrebbe essere necessario un riavvio. È possibile verificare che corosync abbia caricato il nuovo link usando:

journalctl -b -u corosync

Potrebbe essere una buona idea testare il nuovo link disconnettendo temporaneamente il vecchio link su un nodo e verificando che il suo stato rimanga online mentre è disconnesso:

pvecm status

Se si osserva uno stato del cluster integro, significa che il nuovo link è in uso.

5.10. Ruolo di SSH nei cluster Proxmox VE

Proxmox VE utilizza tunnel SSH per diverse funzionalità.

  • Proxy delle sessioni console/shell (nodo e guest)

    Quando si usa la shell per il nodo B mentre si è connessi al nodo A, ci si connette a un proxy di terminale sul nodo A, che a sua volta è connesso alla shell di login sul nodo B tramite un tunnel SSH non interattivo.

  • Migrazione della memoria e dello storage locale di VM e CT in modalità secure.

    Durante la migrazione, uno o più tunnel SSH vengono stabiliti tra i nodi di origine e di destinazione, al fine di scambiare informazioni sulla migrazione e trasferire il contenuto della memoria e dei dischi.

  • Replica dello storage

5.10.1. Configurazione SSH

Sui sistemi Proxmox VE, vengono apportate le seguenti modifiche alla configurazione/impostazione SSH:

  • la configurazione del client SSH dell'utente root viene impostata per preferire AES rispetto a ChaCha20

  • il file authorized_keys dell'utente root viene collegato a /etc/pve/priv/authorized_keys, unendo tutte le chiavi autorizzate all'interno di un cluster

  • sshd è configurato per consentire l'accesso come root con una password

Note I sistemi più vecchi potrebbero anche avere /etc/ssh/ssh_known_hosts impostato come symlink che punta a /etc/pve/priv/known_hosts, contenente una versione unificata di tutte le host key dei nodi. Questo sistema è stato sostituito con il pinning esplicito delle host key in pve-cluster <<INSERT VERSION>>; il symlink può essere rimosso, se ancora presente, eseguendo pvecm updatecerts --unmerge-known-hosts.

5.10.2. Insidie dovute all'esecuzione automatica di .bashrc e file simili

Nel caso sia presente un .bashrc personalizzato, o file simili che vengono eseguiti al login dalla shell configurata, ssh lo eseguirà automaticamente una volta che la sessione è stata stabilita con successo. Ciò può causare comportamenti inattesi, poiché tali comandi potrebbero essere eseguiti con permessi di root in una qualsiasi delle operazioni descritte sopra. Questo può causare possibili effetti collaterali problematici!

Per evitare tali complicazioni, si consiglia di aggiungere un controllo in /root/.bashrc per verificare che la sessione sia interattiva, ed eseguire i comandi di .bashrc solo in tal caso.

È possibile aggiungere questo snippet all'inizio del proprio file .bashrc:

# Early exit if not running interactively to avoid side-effects!
case $- in
    *i*) ;;
      *) return;;
esac

5.11. Supporto al voto esterno di Corosync

Questa sezione descrive un modo per distribuire un votante esterno in un cluster Proxmox VE. Una volta configurato, il cluster può sostenere più guasti ai nodi senza violare le proprietà di sicurezza della comunicazione del cluster.

Perché ciò funzioni, sono coinvolti due servizi:

  • Un daemon QDevice, eseguito su ogni nodo Proxmox VE

  • Un daemon di voto esterno, eseguito su un server indipendente

Di conseguenza, è possibile ottenere una maggiore disponibilità, anche in configurazioni più piccole (ad esempio 2+1 nodi).

5.11.1. Panoramica tecnica di QDevice

Il Corosync Quorum Device (QDevice) è un demone che viene eseguito su ogni nodo del cluster. Fornisce un numero configurato di voti al sottosistema di quorum del cluster, basandosi sulla decisione di un arbitro di terze parti in esecuzione esternamente. Il suo scopo principale è consentire a un cluster di sostenere un numero di guasti dei nodi superiore a quello consentito dalle regole standard di quorum. Ciò può essere fatto in sicurezza poiché il dispositivo esterno può vedere tutti i nodi e scegliere quindi un solo insieme di nodi a cui assegnare il proprio voto. Questo viene fatto solo se l’insieme di nodi in questione può ottenere (nuovamente) il quorum dopo aver ricevuto il voto della terza parte.

Attualmente, solo QDevice Net è supportato come arbitro di terze parti. Si tratta di un demone che fornisce un voto a una partizione del cluster, se può raggiungere i membri della partizione tramite la rete. Assegnerà i voti a una sola partizione del cluster in un determinato momento. È progettato per supportare più cluster ed è quasi completamente privo di configurazione e stato. I nuovi cluster vengono gestiti dinamicamente e non è necessario alcun file di configurazione sull’host su cui viene eseguito un QDevice.

Gli unici requisiti per l’host esterno sono l’accesso di rete al cluster e la disponibilità di un pacchetto corosync-qnetd. Viene fornito un pacchetto per gli host basati su Debian e anche altre distribuzioni Linux dovrebbero avere un pacchetto disponibile tramite il rispettivo gestore di pacchetti.

Note A differenza di corosync stesso, un QDevice si connette al cluster tramite TCP/IP. Il demone può anche essere eseguito al di fuori della LAN del cluster e non è soggetto ai requisiti di bassa latenza di corosync.

5.11.2. Configurazioni supportate

Il supporto per i QDevice è previsto per i cluster con un numero pari di nodi e ne è consigliato l’uso per i cluster a 2 nodi, qualora si voglia garantire una maggiore disponibilità. Per i cluster con un numero dispari di nodi, l’uso dei QDevice è attualmente sconsigliato. Il motivo è la differenza nel numero di voti che il QDevice fornisce per ciascun tipo di cluster. I cluster con numero pari di nodi ottengono un singolo voto aggiuntivo, che aumenta soltanto la disponibilità, poiché se il QDevice stesso si guasta, si torna nella stessa condizione di assenza del QDevice.

D’altra parte, con un numero dispari di nodi nel cluster, il QDevice fornisce (N-1) voti — dove N corrisponde al numero di nodi del cluster. Questo comportamento alternativo è sensato; se fornisse solo un voto aggiuntivo, il cluster potrebbe trovarsi in una situazione di split-brain. Questo algoritmo consente il guasto di tutti i nodi tranne uno, purché anche il QDevice stesso rimanga operativo. Tuttavia, ciò comporta due inconvenienti:

  • Se il demone QNet stesso si guasta, nessun altro nodo può guastarsi, altrimenti il cluster perde immediatamente il quorum. Ad esempio, in un cluster con 15 nodi, 7 potrebbero guastarsi prima che il cluster diventi privo di quorum. Tuttavia, se in questo caso è configurato un QDevice e questo stesso si guasta, nessun singolo nodo dei 15 può guastarsi. Il QDevice agisce in questo caso quasi come un singolo punto di guasto.

  • Il fatto che tutti i nodi tranne uno più il QDevice possano guastarsi sembra promettente a prima vista, ma ciò potrebbe comportare un ripristino massivo dei servizi HA, il che potrebbe sovraccaricare l’unico nodo rimanente. Inoltre, un server Ceph interromperà la fornitura dei servizi se rimangono online solo ((N-1)/2) nodi o meno.

Se gli inconvenienti e le implicazioni sono chiari, è possibile decidere autonomamente se utilizzare questa tecnologia in una configurazione di cluster con numero dispari di nodi.

5.11.3. Configurazione di QDevice-Net

Si consiglia di eseguire qualsiasi demone che fornisce voti a corosync-qdevice come utente non privilegiato. Proxmox VE e Debian forniscono un package già configurato in tal senso. Il traffico tra il demone e il cluster deve essere crittografato per garantire un’integrazione sicura e protetta del QDevice in Proxmox VE.

Per prima cosa, installare il package corosync-qnetd sul server esterno

external# apt install corosync-qnetd

e il package corosync-qdevice su tutti i nodi del cluster

pve# apt install corosync-qdevice

Dopo aver fatto ciò, assicurarsi che tutti i nodi del cluster siano online.

È ora possibile configurare il QDevice eseguendo il seguente comando su uno dei nodi Proxmox VE:

pve# pvecm qdevice setup <QDEVICE-IP>

La chiave SSH del cluster verrà copiata automaticamente sul QDevice.

Note Assicurarsi di configurare l’accesso basato su chiave per l’utente root sul server esterno, oppure consentire temporaneamente l’accesso root con password durante la fase di configurazione. Se in questa fase viene restituito un errore come Host key verification failed., eseguire pvecm updatecerts potrebbe risolvere il problema.

Una volta completati correttamente tutti i passaggi, verrà mostrato "Done". È possibile verificare che il QDevice sia stato configurato con:

pve# pvecm status

...

Votequorum information
~~~~~~~~~~~~~~~~~~~~~
Expected votes:   3
Highest expected: 3
Total votes:      3
Quorum:           2
Flags:            Quorate Qdevice

Membership information
~~~~~~~~~~~~~~~~~~~~~~
    Nodeid      Votes    Qdevice Name
    0x00000001      1    A,V,NMW 192.168.22.180 (local)
    0x00000002      1    A,V,NMW 192.168.22.181
    0x00000000      1            Qdevice
Flag di stato del QDevice

L’output di stato del QDevice, come mostrato sopra, contiene generalmente tre colonne:

  • A / NA: Alive o Not Alive. Indica se la comunicazione con il demone esterno corosync-qnetd funziona.

  • V / NV: Se il QDevice assegnerà un voto al nodo. In una situazione di split-brain, in cui la connessione corosync tra i nodi è interrotta, ma entrambi possono comunque comunicare con il demone esterno corosync-qnetd, solo un nodo otterrà il voto.

  • MW / NMW: Master wins (MV) o non vince (NMW). Il valore predefinito è NMW, vedere
    [pagina man di votequorum_qdevice_master_wins https://manpages.debian.org/stable/libvotequorum-dev/votequorum_qdevice_master_wins.3.en.html]
    .

  • NR: il QDevice non è registrato.

Note Se il QDevice è elencato come Not Alive (NA nell'output precedente), verificare che la porta 5403 (la porta predefinita del server qnetd) del server esterno sia raggiungibile tramite TCP/IP.

5.11.4. Domande frequenti

Risoluzione dei pareggi

In caso di pareggio, quando due partizioni del cluster di dimensioni uguali non riescono a vedersi a vicenda ma possono vedere il QDevice, il QDevice sceglie la partizione che ha l'id del nodo più basso e fornisce a essa un voto. Questo comportamento può essere regolato con l'opzione di configurazione tie_breaker (vedere man corosync-qdevice per maggiori informazioni) e richiede un riavvio di corosync-qdevice.service su tutti i nodi.

Possibili implicazioni negative

Per i cluster con un numero pari di nodi, non ci sono implicazioni negative nell'utilizzo di un QDevice. Se non funziona, equivale a non avere un QDevice affatto.

Aggiunta/eliminazione di nodi dopo la configurazione del QDevice

Per aggiungere un nuovo nodo o rimuoverne uno esistente da un cluster con una configurazione QDevice, è necessario rimuovere prima il QDevice. Dopodiché, è possibile aggiungere o rimuovere i nodi normalmente. Una volta ripristinato un cluster con un numero pari di nodi, è possibile configurare nuovamente il QDevice come descritto in precedenza.

Rimozione del QDevice

Se è stato utilizzato lo strumento ufficiale pvecm per aggiungere il QDevice, è possibile rimuoverlo eseguendo:

pve# pvecm qdevice remove

5.12. Configurazione di Corosync

Il file /etc/pve/corosync.conf svolge un ruolo centrale in un cluster Proxmox VE. Esso controlla l'appartenenza al cluster e la sua rete. Per ulteriori informazioni, consultare la pagina man di corosync.conf:

man corosync.conf

Per l'appartenenza dei nodi, si consiglia di utilizzare sempre lo strumento pvecm fornito da Proxmox VE. Per altre modifiche, potrebbe essere necessario modificare manualmente il file di configurazione. Di seguito alcuni consigli sulle best practice per farlo.

5.12.1. Modifica di corosync.conf

Modificare il file corosync.conf non è sempre molto semplice. Ne sono presenti due su ciascun nodo del cluster, uno in /etc/pve/corosync.conf e l'altro in /etc/corosync/corosync.conf. Modificando quello nel file system del cluster, le modifiche verranno propagate a quello locale, ma non viceversa.

La configurazione verrà aggiornata automaticamente, non appena il file viene modificato. Ciò significa che le modifiche che possono essere integrate in un corosync in esecuzione avranno effetto immediatamente. Pertanto, si consiglia di creare sempre una copia e modificare quella, per evitare di attivare modifiche indesiderate durante il salvataggio del file in fase di modifica.

cp /etc/pve/corosync.conf /etc/pve/corosync.conf.new

Quindi, aprire il file di configurazione con l'editor preferito, come nano o vim.tiny, che sono preinstallati su ogni nodo Proxmox VE.

Note Incrementare sempre il numero di config_version dopo le modifiche alla configurazione; omettere questo passaggio può causare problemi.

Dopo aver effettuato le modifiche necessarie, creare un'altra copia del file di configurazione attualmente funzionante. Questa serve come backup nel caso in cui la nuova configurazione non venga applicata correttamente o causi altri problemi.

cp /etc/pve/corosync.conf /etc/pve/corosync.conf.bak

Quindi sostituire il vecchio file di configurazione con quello nuovo:

mv /etc/pve/corosync.conf.new /etc/pve/corosync.conf

È possibile verificare se le modifiche sono state applicate automaticamente, utilizzando i seguenti comandi:

systemctl status corosync
journalctl -b -u corosync

Se le modifiche non sono state applicate automaticamente, potrebbe essere necessario riavviare il servizio corosync tramite:

systemctl restart corosync

In caso di errori, consultare la sezione sulla risoluzione dei problemi di seguito.

5.12.2. Modifica del coefficiente del token

Il coefficiente del token può essere configurato nella sezione totem in /etc/pve/corosync.conf. Se il coefficiente del token non è impostato esplicitamente, il valore predefinito è 650 millisecondi. A partire da Proxmox VE 9.2, i nuovi cluster vengono creati con un coefficiente del token più basso, impostato esplicitamente a 125 millisecondi in /etc/pve/corosync.conf. Questo riduce il tempo necessario per ristabilire una nuova appartenenza al cluster dopo un guasto a un nodo.

corosync utilizza il coefficiente di token per calcolare diversi timeout in relazione alla dimensione del cluster
[token_coefficient nella pagina di manuale di corosync https://manpages.debian.org/stable/corosync/corosync.conf.5.en.html#token_coefficient]
, soprattutto il timeout del token e il timeout di consenso. corosync implementa un protocollo di passaggio di token. Il timeout del token specifica per quanto tempo un nodo attende il token prima di dichiararlo perso
[token nella pagina di manuale di corosync https://manpages.debian.org/stable/corosync/corosync.conf.5.en.html#token]
. Il timeout di consenso
[consensus nella pagina di manuale di corosync https://manpages.debian.org/stable/corosync/corosync.conf.5.en.html#consensus]
specifica il tempo che i nodi attendono per raggiungere un consenso su una nuova appartenenza al cluster. La somma dei timeout di token e di consenso definisce il tempo minimo necessario per ristabilire una nuova appartenenza al cluster dopo che un nodo va offline.

Mantenere la somma dei timeout di token e di consenso sotto i 30 secondi riduce il tempo necessario per ristabilire una nuova appartenenza al cluster dopo un guasto a un nodo. Quando l'HA è abilitata, è particolarmente importante che questo tempo resti sotto i 45 secondi per garantire che una nuova appartenenza al cluster venga formata prima che il timeout del watchdog di 60 secondi scada, il che innescherebbe il fencing del nodo. È consigliabile un margine di sicurezza sotto questo limite di 45 secondi affinché variazioni temporanee di tempistica non spingano il cluster oltre la soglia del watchdog. Il meccanismo consigliato per abbassare i timeout di token e consenso è abbassare il coefficiente di token come spiegato di seguito.

È possibile controllare i timeout attuali di token e consenso (in millisecondi) con il seguente comando:

corosync-cmapctl | grep -Ew 'runtime.config.totem.token|runtime.config.totem.consensus'

Ad esempio:

runtime.config.totem.consensus (u32) = 5940
runtime.config.totem.token (u32) = 4950

La somma di questi due valori (10,89 secondi nell'esempio) definisce il tempo minimo necessario per ristabilire una nuova appartenenza al cluster dopo che un nodo va offline. Abbassare il coefficiente di token è

  • un'ottimizzazione consigliata se questo valore supera i 30 secondi,

  • raccomandata se supera i 40 secondi,

  • fortemente raccomandata se supera i 45 secondi.

Per abbassare il coefficiente di token, assicurarsi prima che la configurazione soddisfi i requisiti di rete, in particolare per quanto riguarda la latenza. Quindi:

  • Se il token_coefficient non è ancora impostato esplicitamente a 125 millisecondi in corosync.conf, modificare corosync.conf e aggiungere token_coefficient: 125 alla sezione totem. Non dimenticare di incrementare config_version.

  • In caso contrario, se 125 millisecondi non sono un valore sufficientemente basso da mantenere i timeout entro i limiti indicati sopra, selezionare un token_coefficient con cui la somma dei timeout di token e consenso sia al massimo di 45 secondi. Per impostazione predefinita, corosync calcola i timeout di token e consenso (in millisecondi) secondo la seguente formula:

    token = 3000 + (number_of_nodes - 2) * token_coefficient
    consensus = 1.2 * token

    Modificare corosync.conf e impostare un'opzione token_coefficient appropriata nella sezione totem. Non dimenticare di incrementare config_version. Testare accuratamente la configurazione per verificarne la stabilità!

Dopo aver modificato token_coefficient in corosync.conf, le versioni recenti di corosync adotteranno automaticamente il nuovo valore per il cluster. Per versioni di corosync precedenti a 3.1.10-pve1, è necessario riavviare corosync su tutti i nodi perché la modifica abbia effetto.

5.12.3. Risoluzione dei problemi

Problema: quorum.expected_votes must be configured

Quando corosync inizia a fallire e nel log di sistema viene riportato il seguente messaggio:

[...]
corosync[1647]:  [QUORUM] Quorum provider: corosync_votequorum failed to initialize.
corosync[1647]:  [SERV  ] Service engine 'corosync_quorum' failed to load for reason
    'configuration error: nodelist or quorum.expected_votes must be configured!'
[...]

Significa che non è stato possibile risolvere l'hostname impostato per un ringX_addr di corosync nella configurazione.

Scrittura della configurazione senza quorum

Se è necessario modificare /etc/pve/corosync.conf su un nodo senza quorum, e si comprende cosa si sta facendo, utilizzare:

pvecm expected 1

Questo imposta il numero di voti attesi a 1 e consente al cluster di raggiungere il quorum. È quindi possibile correggere la configurazione oppure ripristinarla dall'ultimo backup funzionante.

Questo non è sufficiente se corosync non riesce più ad avviarsi. In tal caso, è preferibile modificare la copia locale della configurazione di corosync in /etc/corosync/corosync.conf, in modo che corosync possa avviarsi nuovamente. Assicurarsi che su tutti i nodi questa configurazione abbia lo stesso contenuto per evitare situazioni di split-brain.

5.12.4. Glossario della configurazione di corosync

ringX_addr

Indica gli indirizzi dei diversi link per le connessioni Kronosnet tra i nodi.

5.13. Avvio a freddo del cluster

È evidente che un cluster non raggiunga il quorum quando tutti i nodi sono offline. Questo è un caso comune dopo un'interruzione di corrente.

Note È sempre consigliabile utilizzare un gruppo di continuità ("UPS", detto anche "batteria di backup") per evitare questa situazione, specialmente se si desidera utilizzare l'HA.

All'avvio del nodo, il servizio pve-guests viene avviato e attende il quorum. Una volta raggiunto il quorum, avvia tutti i guest che hanno il flag onboot impostato.

Quando si accendono i nodi, o quando l'alimentazione ritorna dopo un'interruzione di corrente, è probabile che alcuni nodi si avviino più velocemente di altri. Si tenga presente che l'avvio dei guest viene ritardato finché non si raggiunge il quorum.

5.14. Selezione automatica del VMID del guest

Quando si creano nuovi guest, l'interfaccia web richiede automaticamente al backend un VMID libero. L'intervallo predefinito di ricerca è compreso tra 100 e 1000000 (inferiore al VMID massimo consentito imposto dallo schema).

In alcuni casi gli amministratori desiderano allocare i nuovi VMID in un intervallo separato, ad esempio per distinguere facilmente le VM temporanee da quelle per cui si sceglie manualmente un VMID. In altri casi si desidera semplicemente fornire un VMID di lunghezza stabile, per il quale impostare il limite inferiore, ad esempio, a 100000 offre molto più margine.

Per soddisfare questo caso d'uso è possibile impostare il limite inferiore, superiore o entrambi tramite il file di configurazione datacenter.cfg, che può essere modificato nell'interfaccia web in Datacenter → Opzioni.

Note L'intervallo viene utilizzato solo per la chiamata API next-id, quindi non costituisce un limite rigido.

5.15. Migrazione dei guest

La migrazione dei guest virtuali verso altri nodi è una funzionalità utile in un cluster. Sono disponibili impostazioni per controllare il comportamento di tali migrazioni. Ciò può essere fatto tramite il file di configurazione datacenter.cfg oppure, per una migrazione specifica, tramite parametri API o della riga di comando.

Fa differenza se un guest è online oppure offline, o se dispone di risorse locali (come un disco locale).

Per i dettagli sulla migrazione delle macchine virtuali, consultare il capitolo sulla migrazione QEMU/KVM.

Per i dettagli sulla migrazione dei container, consultare il capitolo sulla migrazione dei container.

5.15.1. Tipo di migrazione

Il tipo di migrazione definisce se i dati della migrazione devono essere inviati tramite un canale crittografato (secure) o non crittografato (insecure). Impostare il tipo di migrazione su insecure significa che anche il contenuto della RAM di un guest virtuale viene trasferito senza crittografia, il che può comportare la divulgazione di dati critici provenienti dall'interno del guest (ad esempio, password o chiavi di crittografia).

Si raccomanda pertanto vivamente di utilizzare il canale sicuro se non si ha il pieno controllo della rete e non si può garantire che nessuno la stia intercettando.

Note La migrazione dello storage non segue questa impostazione. Attualmente, invia sempre il contenuto dello storage tramite un canale sicuro.

La crittografia richiede molta potenza di calcolo, pertanto questa impostazione viene spesso modificata in insecure per ottenere prestazioni migliori. L'impatto sui sistemi moderni è minore poiché implementano la crittografia AES in hardware. L'impatto sulle prestazioni è particolarmente evidente nelle reti veloci, dove è possibile trasferire 10 Gbps o più.

5.15.2. Rete di migrazione

Per impostazione predefinita, Proxmox VE utilizza la rete in cui avviene la comunicazione del cluster per inviare il traffico di migrazione. Questo non è ottimale, sia perché il traffico sensibile del cluster può essere disturbato, sia perché questa rete potrebbe non disporre della migliore larghezza di banda disponibile sul nodo.

Impostare il parametro della rete di migrazione consente di utilizzare una rete dedicata per tutto il traffico di migrazione. Oltre alla memoria, questo influisce anche sul traffico di storage per le migrazioni offline.

La rete di migrazione viene impostata come rete utilizzando la notazione CIDR. Questo ha il vantaggio di non dover impostare indirizzi IP individuali per ogni nodo. Proxmox VE può determinare l'indirizzo reale sul nodo di destinazione a partire dalla rete specificata in forma CIDR. Per abilitare questa funzionalità, la rete deve essere specificata in modo che ogni nodo abbia esattamente un IP nella rispettiva rete.

Esempio

Si supponga di avere una configurazione a tre nodi, con tre reti separate. Una per la comunicazione pubblica con Internet, una per la comunicazione del cluster e una molto veloce, che si desidera utilizzare come rete dedicata per la migrazione.

Una configurazione di rete per una tale impostazione potrebbe essere la seguente:

iface eno1 inet manual

# public network
auto vmbr0
iface vmbr0 inet static
    address 192.X.Y.57/24
    gateway 192.X.Y.1
    bridge-ports eno1
    bridge-stp off
    bridge-fd 0

# cluster network
auto eno2
iface eno2 inet static
    address  10.1.1.1/24

# fast network
auto eno3
iface eno3 inet static
    address  10.1.2.1/24

In questo caso, verrà utilizzata la rete 10.1.2.0/24 come rete di migrazione. Per una singola migrazione, è possibile farlo utilizzando il parametro migration_network dello strumento da riga di comando:

# qm migrate 106 tre --online --migration_network 10.1.2.0/24

Per configurare questa come rete predefinita per tutte le migrazioni nel cluster, impostare la proprietà migration del file /etc/pve/datacenter.cfg:

# use dedicated migration network
migration: secure,network=10.1.2.0/24
Note Il tipo di migrazione deve essere sempre impostato quando la rete di migrazione è impostata in /etc/pve/datacenter.cfg.

6. File system del cluster Proxmox (pmxcfs)

Il file system del cluster Proxmox ("pmxcfs") è un file system basato su database per l'archiviazione dei file di configurazione, replicato in tempo reale su tutti i nodi del cluster tramite corosync. Viene utilizzato per archiviare tutti i file di configurazione relativi a Proxmox VE.

Sebbene il file system archivi tutti i dati all'interno di un database persistente su disco, una copia dei dati risiede in RAM. Questo impone restrizioni sulla dimensione massima, attualmente pari a 128 MiB. È comunque sufficiente per archiviare la configurazione di diverse migliaia di macchine virtuali.

Questo sistema offre i seguenti vantaggi:

  • Replica senza interruzioni di tutte le configurazioni su tutti i nodi in tempo reale

  • Fornisce controlli di consistenza rigorosi per evitare ID VM duplicati

  • Accesso in sola lettura quando un nodo perde il quorum

  • Aggiornamenti automatici della configurazione del cluster corosync su tutti i nodi

  • Include un meccanismo di locking distribuito

6.1. Compatibilità POSIX

Il file system è basato su FUSE, quindi il comportamento è simile a POSIX. Tuttavia alcune funzionalità semplicemente non sono implementate, poiché non sono necessarie:

  • È possibile generare solo file e directory normali, ma non collegamenti simbolici, …

  • Non è possibile rinominare directory non vuote (poiché questo rende più semplice garantire che i VMID siano univoci).

  • Non è possibile modificare i permessi dei file (i permessi sono basati sui percorsi)

  • Le creazioni con O_EXCL non erano atomiche (come il vecchio NFS)

  • Le creazioni con O_TRUNC non sono atomiche (restrizione FUSE)

6.2. Diritti di accesso ai file

Tutti i file e le directory sono di proprietà dell'utente root e appartengono al gruppo www-data. Solo root dispone dei permessi di scrittura, ma il gruppo www-data può leggere la maggior parte dei file. I file situati nei seguenti percorsi sono accessibili solo da root:

/etc/pve/priv/
/etc/pve/nodes/${NAME}/priv/

6.3. Tecnologia

Viene utilizzato il Corosync Cluster Engine per la comunicazione tra i nodi del cluster, e SQlite per il file di database. Il file system è implementato in user space utilizzando FUSE.

6.4. Struttura del file system

Il file system è montato in:

/etc/pve

6.4.1. File

authkey.pub

Chiave pubblica utilizzata dal sistema dei ticket

ceph.conf

File di configurazione di Ceph (nota: /etc/ceph/ceph.conf è un collegamento simbolico a questo file)

corosync.conf

File di configurazione del cluster Corosync (prima di Proxmox VE 4.x, questo file era chiamato cluster.conf)

datacenter.cfg

Configurazione a livello di datacenter di Proxmox VE (layout tastiera, proxy, …)

domains.cfg

Domini di autenticazione di Proxmox VE

firewall/cluster.fw

Configurazione del firewall applicata a tutti i nodi

firewall/<NAME>.fw

Configurazione del firewall per singoli nodi

firewall/<VMID>.fw

Configurazione del firewall per VM e container

ha/crm_commands

Mostra le operazioni HA attualmente eseguite dal CRM

ha/manager_status

Informazioni in formato JSON relative ai servizi HA sul cluster

ha/resources.cfg

Risorse gestite dall'alta disponibilità e relativo stato attuale

ha/rules.cfg

Regole che impongono vincoli alla pianificazione delle risorse HA da parte del gestore HA

nodes/<NAME>/config

Configurazione specifica del nodo

nodes/<NAME>/lxc/<VMID>.conf

Dati di configurazione VM per i container LXC

nodes/<NAME>/openvz/

Prima di Proxmox VE 4.0, utilizzato per i dati di configurazione dei container (deprecato, verrà rimosso a breve)

nodes/<NAME>/pve-ssl.key

Chiave SSL privata per pve-ssl.pem

nodes/<NAME>/pve-ssl.pem

Certificato SSL pubblico per il server web (firmato dalla CA del cluster)

nodes/<NAME>/pveproxy-ssl.key

Chiave SSL privata per pveproxy-ssl.pem (opzionale)

nodes/<NAME>/pveproxy-ssl.pem

Certificato SSL pubblico (catena) per il server web (sovrascrittura opzionale di pve-ssl.pem)

nodes/<NAME>/qemu-server/<VMID>.conf

Dati di configurazione VM per le VM KVM

priv/authkey.key

Chiave privata utilizzata dal sistema di ticket

priv/authorized_keys

Chiavi SSH dei membri del cluster per l'autenticazione

priv/ceph*

Chiavi di autenticazione Ceph e relative capacità associate

priv/known_hosts

Chiavi SSH dei membri del cluster per la verifica

priv/lock/*

File di lock utilizzati da vari servizi per garantire operazioni sicure a livello di cluster

priv/pve-root-ca.key

Chiave privata della CA del cluster

priv/shadow.cfg

File delle password shadow per gli utenti del realm PVE

priv/storage/<STORAGE-ID>.pw

Contiene la password di uno storage in chiaro

priv/tfa.cfg

Configurazione dell'autenticazione a due fattori codificata in Base64

priv/token.cfg

Segreti dei token API di tutti i token

pve-root-ca.pem

Certificato pubblico della CA del cluster

pve-www.key

Chiave privata utilizzata per la generazione dei token CSRF

sdn/*

File di configurazione condivisi per il Software Defined Networking (SDN)

status.cfg

Configurazione del server di metriche esterno di Proxmox VE

storage.cfg

Configurazione dello storage di Proxmox VE

user.cfg

Configurazione del controllo accessi di Proxmox VE (utenti/gruppi/…)

virtual-guest/cpu-models.conf

Per la memorizzazione di modelli di CPU personalizzati

vzdump.cron

Pianificazione dei job di backup vzdump a livello di cluster

Alcune directory all'interno del file system del cluster utilizzano link simbolici, per puntare ai file di configurazione propri di un nodo. Pertanto, i file indicati nella tabella seguente si riferiscono a file diversi su ciascun nodo del cluster.

local

nodes/<LOCAL_HOST_NAME>

lxc

nodes/<LOCAL_HOST_NAME>/lxc/

openvz

nodes/<LOCAL_HOST_NAME>/openvz/ (deprecato, verrà rimosso a breve)

qemu-server

nodes/<LOCAL_HOST_NAME>/qemu-server/

6.4.3. File di stato speciali per il debug (JSON)

.version

Versioni dei file (per rilevare le modifiche ai file)

.members

Informazioni sui membri del cluster

.vmlist

Elenco di tutte le VM

.clusterlog

Log del cluster (ultime 50 voci)

.rrd

Dati RRD (voci più recenti)

6.4.4. Abilitare/disabilitare il debug

È possibile abilitare i messaggi syslog estesi con:

echo "1" >/etc/pve/.debug

Ed è possibile disabilitare i messaggi syslog estesi con:

echo "0" >/etc/pve/.debug

6.5. Ripristino

In caso di problemi gravi con l'host Proxmox VE, ad esempio problemi hardware, può essere utile copiare il file del database pmxcfs /var/lib/pve-cluster/config.db e spostarlo su un nuovo host Proxmox VE. Sul nuovo host (senza nulla in esecuzione), è necessario arrestare il servizio pve-cluster e sostituire il file config.db (permessi richiesti 0600). Successivamente, adattare /etc/hostname e /etc/hosts in base all'host Proxmox VE perduto, quindi riavviare e verificare (senza dimenticare i dati di VM/CT).

6.5.1. Rimuovere la configurazione del cluster

Il metodo consigliato è reinstallare il nodo dopo averlo rimosso dal cluster. Questo garantisce che tutte le chiavi segrete di cluster/ssh e qualsiasi dato di configurazione condiviso vengano distrutti.

In alcuni casi, può essere preferibile riportare un nodo in modalità locale senza reinstallarlo, come descritto in Separare un nodo senza reinstallare

6.5.2. Ripristinare/spostare i guest da nodi non funzionanti

Per i file di configurazione dei guest in nodes/<NAME>/qemu-server/ (VM) e nodes/<NAME>/lxc/ (container), Proxmox VE considera il nodo <NAME> che li contiene come il proprietario del rispettivo guest. Questo concetto consente l'utilizzo di lock locali invece di costosi lock a livello di cluster per prevenire modifiche concorrenti alla configurazione del guest.

Di conseguenza, se il nodo proprietario di un guest subisce un guasto (ad esempio, a causa di un'interruzione di corrente, un evento di fencing, ecc.), una migrazione normale non è possibile (anche se tutti i dischi si trovano su storage condiviso), poiché tale lock locale sul nodo proprietario (offline) non è ottenibile. Questo non è un problema per i guest gestiti da HA, poiché lo stack di alta disponibilità di Proxmox VE include le necessarie funzionalità di locking (a livello di cluster) e di watchdog per garantire un ripristino corretto e automatico dei guest dai nodi sottoposti a fencing.

Se un guest non gestito da HA dispone solo di dischi condivisi (e di nessun'altra risorsa locale disponibile unicamente sul nodo non funzionante), è possibile un ripristino manuale semplicemente spostando il file di configurazione del guest dalla directory del nodo non funzionante in /etc/pve/ alla directory di un nodo online (il che modifica il proprietario logico o la posizione del guest).

Ad esempio, per ripristinare la VM con ID 100 da un node1 offline a un altro nodo node2, è necessario eseguire il seguente comando come root su qualsiasi nodo membro del cluster:

mv /etc/pve/nodes/node1/qemu-server/100.conf /etc/pve/nodes/node2/qemu-server/
Warning Prima di ripristinare manualmente un guest in questo modo, assicurarsi assolutamente che il nodo di origine non funzionante sia realmente spento/sottoposto a fencing. In caso contrario i principi di locking di Proxmox VE vengono violati dal comando mv, che può avere conseguenze inaspettate.
Warning I guest con dischi locali (o altre risorse locali disponibili unicamente sul nodo offline) non sono ripristinabili in questo modo. Attendere che il nodo non funzionante si ricongiunga al cluster oppure ripristinare tali guest dai backup.

7. Storage di Proxmox VE

Il modello di storage di Proxmox VE è molto flessibile. Le immagini delle macchine virtuali possono essere archiviate su uno o più storage locali, oppure su storage condiviso come NFS o iSCSI (NAS, SAN). Non ci sono limiti ed è possibile configurare tutti i pool di storage desiderati. È possibile utilizzare tutte le tecnologie di storage disponibili per Debian Linux.

Uno dei principali vantaggi dell'archiviazione delle VM su storage condiviso è la possibilità di eseguire la live migration di macchine in esecuzione senza alcun downtime, poiché tutti i nodi del cluster hanno accesso diretto alle immagini disco delle VM. Non è necessario copiare i dati dell'immagine della VM, pertanto in questo caso la live migration è molto rapida.

La libreria di storage (package libpve-storage-perl) utilizza un flessibile sistema di plugin per fornire un'interfaccia comune a tutti i tipi di storage. Questo può essere facilmente adattato per includere ulteriori tipi di storage in futuro.

7.1. Tipi di storage

Esistono fondamentalmente due classi diverse di tipi di storage:

Storage a livello di file

Le tecnologie di storage basate sul livello di file consentono l'accesso a un file system (POSIX) completo. Sono generalmente più flessibili di qualsiasi storage a livello di blocco (vedere sotto) e consentono di archiviare contenuti di qualsiasi tipo. ZFS è probabilmente il sistema più avanzato e offre pieno supporto per snapshot e cloni.

Storage a livello di blocco

Consente di memorizzare immagini raw di grandi dimensioni. Solitamente non è possibile memorizzare altri file (ISO, backup, ..) su questi tipi di storage. La maggior parte delle implementazioni moderne di storage a livello di blocco supporta snapshot e cloni. Ceph RADOS è un sistema distribuito che replica i dati di storage su diversi nodi, accessibili come RBD (RADOS Block Device).

Tabella 2. Tipi di storage disponibili
Descrizione Tipo di plugin Livello Condiviso Snapshot Stabile

ZFS (locale)

zfspool

entrambi1

no

sì

sì

Directory

dir

file

no

sì2

sì

BTRFS

btrfs

file

no

sì

TP5

NFS

nfs

file

sì

sì2

sì

CIFS

cifs

file

sì

sì2

sì

Proxmox Backup

pbs

entrambi

sì

n/a

sì

CephFS

cephfs

file

sì

sì

sì

LVM

lvm

blocco

no3

sì4

sì

LVM-thin

lvmthin

block

no

sì

sì

iSCSI/kernel

iscsi

blocco

sì3

sì4

sì

iSCSI/libiscsi

iscsidirect

block

sì3

sì4

sì

FC/SAS

native6

block

sì3

sì4

sì

Ceph/RBD

rbd

block

sì

sì

sì

ZFS over iSCSI

zfs

block

sì

sì

sì

1: Le immagini disco per le VM sono memorizzate in dataset di volumi ZFS (zvol), che forniscono funzionalità di block device.

2: Sugli storage basati su file, gli snapshot sono possibili con il formato qcow2, utilizzando la funzione di snapshot interna oppure snapshot come catene di volumi4. La creazione e l'eliminazione di snapshot qcow2 interni bloccano una VM in esecuzione e non sono operazioni efficienti. Le prestazioni sono particolarmente scadenti con storage di rete come NFS. In alcune configurazioni e per dischi di grandi dimensioni (centinaia di GiB o TiB), queste operazioni possono richiedere diversi minuti o, in casi estremi, anche ore. Se la configurazione in uso è interessata da questo problema, creare e rimuovere gli snapshot con la VM spenta, prevedendo una lunga durata dell'operazione.

3: Con storage a blocchi iSCSI, FibreChannel (FC) o SAS come storage condiviso in un cluster, LVM viene utilizzato per suddividere la LUN in dischi virtuali. La Guida al Multipath spiega come configurarlo in un cluster, incluso il multipathing, che solitamente è un requisito in questi scenari.

4: A partire da Proxmox VE 9, gli snapshot come catena di volumi sono disponibili per le VM. Questi snapshot utilizzano volumi separati per i dati dello snapshot e li organizzano a livelli. Per maggiori dettagli, vedere la descrizione di snapshot-as-volume-chain nella sezione Configurazione LVM.

5 Anteprima tecnologica con supporto best-effort.

6 Lo storage a blocchi Fibre Channel (FC) e SAS è gestito direttamente dall'host senza un plugin di storage dedicato.

7.1.1. Thin provisioning

Numerosi storage, e il formato immagine QEMU qcow2, supportano il thin provisioning. Con il thin provisioning attivato, solo i blocchi effettivamente utilizzati dal sistema guest verranno scritti sullo storage.

Si supponga ad esempio di creare una VM con un disco rigido da 32 GB e che, dopo aver installato il sistema operativo guest, il file system radice della VM contenga 3 GB di dati. In questo caso solo 3 GB vengono scritti sullo storage, anche se la VM guest vede un disco rigido da 32 GB. In questo modo il thin provisioning consente di creare immagini disco più grandi dei blocchi di storage attualmente disponibili. È possibile creare immagini disco di grandi dimensioni per le proprie VM e, quando necessario, aggiungere altri dischi allo storage senza ridimensionare i file system delle VM.

Tutti i tipi di storage che dispongono della funzionalità "Snapshot" supportano anche il thin provisioning.

Caution Se uno storage si riempie completamente, tutti i guest che utilizzano volumi su tale storage riceveranno errori di I/O. Ciò può causare incongruenze del file system e potrebbe corrompere i dati. È quindi consigliabile evitare il sovra-provisioning delle risorse di storage, oppure monitorare attentamente lo spazio libero per evitare tali situazioni.

7.2. Configurazione dello storage

Tutta la configurazione dello storage relativa a Proxmox VE è memorizzata in un unico file di testo in /etc/pve/storage.cfg. Poiché questo file si trova in /etc/pve/, viene distribuito automaticamente a tutti i nodi del cluster. Pertanto tutti i nodi condividono la stessa configurazione di storage.

Condividere la configurazione dello storage ha perfettamente senso per lo storage condiviso, poiché lo stesso storage "condiviso" è accessibile da tutti i nodi. Ma è utile anche per i tipi di storage locali. In questo caso tale storage locale è disponibile su tutti i nodi, ma è fisicamente diverso e può avere un contenuto completamente differente.

7.2.1. Pool di storage

Ogni pool di storage ha un <type> ed è identificato in modo univoco dal proprio <STORAGE_ID>. Una configurazione di pool si presenta così:

<type>: <STORAGE_ID>
        <property> <value>
        <property> <value>
        <property>
        ...

La riga <type>: <STORAGE_ID> avvia la definizione del pool, seguita poi da un elenco di proprietà. La maggior parte delle proprietà richiede un valore. Alcune hanno valori predefiniti ragionevoli, nel qual caso il valore può essere omesso.

Per maggiore chiarezza, si osservi la configurazione di storage predefinita dopo l'installazione. Contiene un pool di storage locale speciale denominato local, che fa riferimento alla directory /var/lib/vz ed è sempre disponibile. Il programma di installazione di Proxmox VE crea voci di storage aggiuntive in base al tipo di storage scelto al momento dell'installazione.

Default storage configuration (/etc/pve/storage.cfg)
dir: local
        path /var/lib/vz
        content iso,vztmpl,backup

# default image store on LVM based installation
lvmthin: local-lvm
        thinpool data
        vgname pve
        content rootdir,images

# default image store on ZFS based installation
zfspool: local-zfs
        pool rpool/data
        sparse
        content images,rootdir
Caution Avere più configurazioni di storage che puntano esattamente allo stesso storage sottostante è problematico. Una configurazione di storage con alias di questo tipo può portare a due ID di volume (volid) diversi che puntano esattamente alla stessa immagine disco. Proxmox VE si aspetta che le immagini a cui puntano gli ID di volume siano univoche. Scegliere tipi di contenuto diversi per configurazioni di storage con alias può andare bene, ma non è consigliato.

7.2.2. Proprietà comuni dello storage

Alcune proprietà di storage sono comuni tra i diversi tipi di storage.

nodi

Elenco dei nomi dei nodi del cluster su cui questo storage è utilizzabile/accessibile. Questa proprietà consente di limitare l'accesso allo storage a un insieme limitato di nodi.

content

Uno storage può supportare diversi tipi di contenuto, ad esempio immagini di dischi virtuali, immagini ISO di CD-ROM, template di container o directory radice di container. Non tutti i tipi di storage supportano tutti i tipi di contenuto. È possibile impostare questa proprietà per selezionare per quali scopi viene utilizzato questo storage.

images

Immagini VM QEMU/KVM.

rootdir

Consente di memorizzare i dati dei container.

vztmpl

Template di container.

backup

File di backup (vzdump).

iso

Immagini ISO

snippets

File snippet, ad esempio script hook per guest

import

OVA e immagini di disco VM che possono essere importate da questo storage

shared

Indica che si tratta di un singolo storage con lo stesso contenuto su tutti i nodi (o su tutti quelli elencati nell'opzione nodes). Non rende automaticamente accessibile ad altri nodi il contenuto di uno storage locale, ma si limita a contrassegnare come tale uno storage già condiviso!

disable

Questo flag consente di disabilitare completamente lo storage.

prune-backups

Opzioni di conservazione per i backup. Per i dettagli, vedere Conservazione dei backup.

format

Formato immagine predefinito (raw|qcow2|vmdk)

preallocation

Modalità di preallocazione (off|metadata|falloc|full) per le immagini raw e qcow2 su storage basati su file. Il valore predefinito è metadata, che viene trattato come off per le immagini raw. Quando si utilizzano storage di rete in combinazione con immagini qcow2 di grandi dimensioni, l'uso di off può aiutare a evitare timeout.

Warning Non è consigliabile utilizzare lo stesso pool di storage su cluster Proxmox VE diversi. Alcune operazioni di storage richiedono l'accesso esclusivo allo storage, pertanto è necessario un locking adeguato. Sebbene ciò sia implementato all'interno di un cluster, non funziona tra cluster diversi.

7.3. Volumi

Per indicare i dati dello storage viene utilizzata una notazione speciale. Quando si allocano dati da un pool di storage, viene restituito un identificatore di volume di questo tipo. Un volume è identificato da <STORAGE_ID>, seguito da un nome di volume dipendente dal tipo di storage, separato da due punti. Un <VOLUME_ID> valido è simile al seguente:

local:230/example-image.raw
local:iso/debian-501-amd64-netinst.iso
local:vztmpl/debian-5.0-joomla_1.5.9-1_i386.tar.gz
iscsi-storage:0.0.2.scsi-14f504e46494c4500494b5042546d2d646744372d31616d61

Per ottenere il percorso del file system per un <VOLUME_ID> utilizzare:

pvesm path <VOLUME_ID>

7.3.1. Proprietà del volume

Esiste una relazione di proprietà per i volumi di tipo image. Ogni volume di questo tipo è di proprietà di una VM o di un container. Ad esempio il volume local:230/example-image.raw è di proprietà della VM 230. La maggior parte dei backend di storage codifica questa informazione di proprietà nel nome del volume.

Quando si rimuove una VM o un container, il sistema rimuove anche tutti i volumi associati di proprietà di quella VM o container.

7.4. Utilizzo dell'interfaccia a riga di comando

Si consiglia di familiarizzare con il concetto alla base dei pool di storage e degli identificatori di volume, ma nella pratica non è necessario eseguire alcuna di queste operazioni di basso livello dalla riga di comando. Normalmente, l'allocazione e la rimozione dei volumi vengono effettuate dagli strumenti di gestione di VM e container.

Esiste tuttavia uno strumento a riga di comando chiamato pvesm (“Proxmox VE Storage Manager”), in grado di eseguire le operazioni comuni di gestione dello storage.

7.4.1. Esempi

Aggiungere pool di storage

pvesm add <TYPE> <STORAGE_ID> <OPTIONS>
pvesm add dir <STORAGE_ID> --path <PATH>
pvesm add nfs <STORAGE_ID> --path <PATH> --server <SERVER> --export <EXPORT>
pvesm add lvm <STORAGE_ID> --vgname <VGNAME>
pvesm add iscsi <STORAGE_ID> --portal <HOST[:PORT]> --target <TARGET>

Disabilitare pool di storage

pvesm set <STORAGE_ID> --disable 1

Abilitare pool di storage

pvesm set <STORAGE_ID> --disable 0

Modificare/impostare le opzioni di storage

pvesm set <STORAGE_ID> <OPTIONS>
pvesm set <STORAGE_ID> --shared 1
pvesm set local --format qcow2
pvesm set <STORAGE_ID> --content iso

Rimuove i pool di storage. Questo non elimina alcun dato e non disconnette né smonta nulla. Rimuove semplicemente la configurazione dello storage.

pvesm remove <STORAGE_ID>

Allocare volumi

pvesm alloc <STORAGE_ID> <VMID> <name> <size> [--format <raw|qcow2>]

Allocare un volume da 4G nello storage locale. Il nome viene generato automaticamente se viene passata una stringa vuota come <name>

pvesm alloc local <VMID> '' 4G

Volumi liberi

pvesm free <VOLUME_ID>
Warning Questo distrugge effettivamente tutti i dati del volume.

Elencare lo stato dello storage

pvesm status

Elencare il contenuto dello storage

pvesm list <STORAGE_ID> [--vmid <VMID>]

Elencare i volumi allocati per VMID

pvesm list <STORAGE_ID> --vmid <VMID>

Elencare le immagini ISO

pvesm list <STORAGE_ID> --content iso

Elencare i template dei container

pvesm list <STORAGE_ID> --content vztmpl

Mostrare il percorso del file system per un volume

pvesm path <VOLUME_ID>

Esportazione del volume local:103/vm-103-disk-0.qcow2 nel file target. Questa operazione viene utilizzata principalmente internamente con pvesm import. Il formato stream qcow2+size è diverso dal formato qcow2. Di conseguenza, il file esportato non può essere semplicemente collegato a una VM. Questo vale anche per gli altri formati.

pvesm export local:103/vm-103-disk-0.qcow2 qcow2+size target --with-snapshots 1

7.5. Backend directory

Tipo di pool di storage: dir

Proxmox VE può utilizzare directory locali o condivisioni montate localmente per lo storage. Una directory è uno storage a livello di file, quindi è possibile memorizzare qualsiasi tipo di contenuto come immagini disco virtuali, container, template, immagini ISO o file di backup.

Note È possibile montare storage aggiuntivi tramite il file standard di Linux /etc/fstab, e definire quindi uno storage di tipo directory per quel punto di mount. In questo modo è possibile utilizzare qualsiasi file system supportato da Linux.

Questo backend presuppone che la directory sottostante sia compatibile con POSIX, ma nulla più. Ciò implica che non è possibile creare snapshot a livello di storage. Esiste tuttavia una soluzione alternativa per le immagini VM che utilizzano il formato file qcow2, poiché tale formato supporta gli snapshot internamente.

Tip Alcuni tipi di storage non supportano O_DIRECT, quindi non è possibile usare la modalità cache none con tali storage. In questi casi utilizzare semplicemente la modalità cache writeback.

Viene utilizzato un layout di directory predefinito per memorizzare i diversi tipi di contenuto in sottodirectory distinte. Questo layout è utilizzato da tutti i backend di storage a livello di file.

Tabella 3. Layout delle directory
Tipo di contenuto Sottodirectory

Immagini VM

images/<VMID>/

Immagini ISO

template/iso/

Template dei container

template/cache/

File di backup

dump/

Snippet

snippets/

Import

import/

7.5.1. Configurazione

Questo backend supporta tutte le proprietà comuni dello storage e ne aggiunge due ulteriori. La proprietà path viene utilizzata per specificare la directory. Deve essere un percorso assoluto del file system.

La proprietà opzionale content-dirs consente di modificare il layout predefinito. È costituita da un elenco separato da virgole di identificatori nel seguente formato:

vtype=path

Dove vtype è uno dei tipi di contenuto consentiti per lo storage, e path è un percorso relativo al punto di mount dello storage.

Configuration Example (/etc/pve/storage.cfg)
dir: backup
        path /mnt/backup
        content backup
        prune-backups keep-last=7
        max-protected-backups 3
        content-dirs backup=custom/backup/dir

La configurazione precedente definisce un pool di storage denominato backup. Tale pool può essere utilizzato per memorizzare fino a 7 backup regolari (keep-last=7) e 3 backup protetti per VM. Il percorso reale per i file di backup è /mnt/backup/custom/backup/dir/....

7.5.2. Convenzioni di denominazione dei file

Questo backend utilizza uno schema di denominazione ben definito per le immagini delle VM:

vm-<VMID>-<NAME>.<FORMAT>
<VMID>

Specifica la VM proprietaria.

<NAME>

Può essere un nome arbitrario (ascii) senza spazi. Il backend utilizza disk-[N] come valore predefinito, dove [N] viene sostituito da un numero intero per rendere il nome univoco.

<FORMAT>

Specifica il formato dell'immagine (raw|qcow2|vmdk).

Quando si crea un template di VM, tutte le immagini delle VM vengono rinominate per indicare che sono ora di sola lettura e possono essere utilizzate come immagine di base per i cloni:

base-<VMID>-<NAME>.<FORMAT>
Note Tali immagini di base vengono utilizzate per generare immagini clonate. È quindi importante che questi file siano di sola lettura e non vengano mai modificati. Il backend modifica la modalità di accesso in 0444 e imposta il flag immutabile (chattr +i) se lo storage lo supporta.

7.5.3. Funzionalità dello storage

Come indicato in precedenza, la maggior parte dei file system non supporta gli snapshot di per sé. Per risolvere questo problema, questo backend è in grado di utilizzare le funzionalità di snapshot interno di qcow2.

Lo stesso vale per i cloni. Il backend utilizza la funzionalità di immagine di base qcow2 per creare i cloni.

Tabella 4. Funzionalità dello storage per il backend dir
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images rootdir vztmpl iso backup snippets

raw qcow2 vmdk subvol

no

qcow2

qcow2

7.5.4. Esempi

Utilizzare il seguente comando per allocare un'immagine da 4 GB sullo storage local:

# pvesm alloc local 100 vm-100-disk10.raw 4G
Formatting '/var/lib/vz/images/100/vm-100-disk10.raw', fmt=raw size=4294967296
successfully created 'local:100/vm-100-disk10.raw'
Note Il nome dell'immagine deve essere conforme alle convenzioni di denominazione indicate sopra.

Il percorso reale nel file system viene mostrato con:

# pvesm path local:100/vm-100-disk10.raw
/var/lib/vz/images/100/vm-100-disk10.raw

Ed è possibile rimuovere l'immagine con:

# pvesm free local:100/vm-100-disk10.raw

7.6. Backend NFS

Tipo di pool di storage: nfs

Il backend NFS si basa sul backend directory, quindi condivide la maggior parte delle proprietà. Il layout delle directory e le convenzioni di denominazione dei file sono gli stessi. Il vantaggio principale è che è possibile configurare direttamente le proprietà del server NFS, in modo che il backend possa montare la condivisione automaticamente. Non è necessario modificare /etc/fstab. Il backend può anche verificare se il server è online e fornisce un metodo per interrogare il server sulle condivisioni esportate.

7.6.1. Configurazione

Il backend supporta tutte le proprietà di storage comuni, eccetto il flag condiviso, che è sempre impostato. Inoltre, le seguenti proprietà vengono utilizzate per configurare il server NFS:

server

IP o nome DNS del server. Per evitare ritardi nella risoluzione DNS, è generalmente preferibile utilizzare un indirizzo IP invece di un nome DNS, a meno che non si disponga di un server DNS molto affidabile, oppure si elenchi il server nel file locale /etc/hosts.

export

Percorso di esportazione NFS (come elencato da pvesm nfsscan).

È inoltre possibile impostare le opzioni di mount NFS:

path

Il punto di mount locale (il valore predefinito è /mnt/pve/<STORAGE_ID>/).

content-dirs

Sovrascrive la struttura predefinita delle directory. Opzionale.

options

Opzioni di mount NFS (vedere man nfs).

Configuration Example (/etc/pve/storage.cfg)
nfs: iso-templates
        path /mnt/pve/iso-templates
        server 10.0.0.10
        export /space/iso-templates
        options vers=3,soft
        content iso,vztmpl
Tip Dopo che una richiesta NFS va in timeout, per impostazione predefinita le richieste NFS vengono ripetute indefinitamente. Ciò può causare blocchi imprevisti sul lato client. Per contenuti di sola lettura, è opportuno considerare l'opzione NFS soft, che limita il numero di tentativi a tre.

7.6.2. Funzionalità storage

NFS non supporta gli snapshot, ma il backend utilizza le funzionalità di qcow2 per implementare snapshot e clonazione.

Tabella 5. Funzionalità storage per il backend nfs
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images rootdir vztmpl iso backup snippets

raw qcow2 vmdk

sì

qcow2

qcow2

7.6.3. Esempi

È possibile ottenere un elenco delle condivisioni NFS esportate con:

# pvesm scan nfs <server>

7.7. Backend CIFS

Tipo di storage pool: cifs

Il backend CIFS estende il backend directory, in modo che non sia necessaria alcuna configurazione manuale di un mount CIFS. Uno storage di questo tipo può essere aggiunto direttamente tramite l'API di Proxmox VE o l'interfaccia web, con tutti i vantaggi del backend, come il controllo heartbeat del server o la comoda selezione delle condivisioni esportate.

7.7.1. Configurazione

Il backend supporta tutte le proprietà storage comuni, eccetto il flag shared, che è sempre impostato. Sono inoltre disponibili le seguenti proprietà speciali CIFS:

server

IP del server o nome DNS. Obbligatorio.

Tip Per evitare ritardi nella risoluzione DNS, è generalmente preferibile utilizzare un indirizzo IP invece di un nome DNS, a meno che non si disponga di un server DNS molto affidabile, oppure si elenchi il server nel file locale /etc/hosts.
share

Condivisione CIFS da utilizzare (ottenere quelle disponibili con pvesm scan cifs <address> o l'interfaccia web). Obbligatorio.

username

Il nome utente per lo storage CIFS. Opzionale, il valore predefinito è "guest".

password

La password dell'utente. Opzionale. Verrà salvata in un file leggibile solo da root (/etc/pve/priv/storage/<STORAGE-ID>.pw).

domain

Imposta il dominio utente (gruppo di lavoro) per questo storage. Opzionale.

smbversion

Versione del protocollo SMB. Opzionale; quando impostata su default o se non impostata, viene negoziata la versione SMB2+ più elevata supportata sia dal client che dal server. SMB1 non è supportato per motivi di sicurezza.

path

Il punto di mount locale. Opzionale, il valore predefinito è /mnt/pve/<STORAGE_ID>/.

content-dirs

Sovrascrive la struttura predefinita delle directory. Opzionale.

options

Opzioni di mount CIFS aggiuntive (vedere man mount.cifs). Alcune opzioni vengono impostate automaticamente e non dovrebbero essere impostate qui. Proxmox VE imposterà sempre l'opzione soft. In base alla configurazione, queste opzioni vengono impostate automaticamente: username, credentials, guest, domain, vers.

subdir

La sottodirectory della condivisione da montare. Opzionale, il valore predefinito è la directory radice della condivisione.

Configuration Example (/etc/pve/storage.cfg)
cifs: backup
        path /mnt/pve/backup
        server 10.0.0.11
        share VMData
        content backup
        options noserverino,echo_interval=30
        username anna
        smbversion 3
        subdir /data

7.7.2. Funzionalità storage

CIFS non supporta gli snapshot a livello di storage. Tuttavia è possibile utilizzare file di backing qcow2 se si desidera comunque disporre delle funzionalità di snapshot e clonazione.

Tabella 6. Funzionalità storage per il backend cifs
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images rootdir vztmpl iso backup snippets

raw qcow2 vmdk

sì

qcow2

qcow2

7.7.3. Esempi

È possibile ottenere un elenco delle condivisioni CIFS esportate con:

# pvesm scan cifs <server> [--username <username>] [--password]

Successivamente è possibile aggiungere una di queste condivisioni come storage per l'intero cluster Proxmox VE con:

# pvesm add cifs <storagename> --server <server> --share <share> [--username <username>] [--password]

7.8. Proxmox Backup Server

Tipo di pool storage: pbs

Questo backend consente l'integrazione diretta di un Proxmox Backup Server in Proxmox VE come qualsiasi altro storage.

Uno storage Proxmox Backup può essere aggiunto direttamente tramite l'API, la CLI o l'interfaccia web di Proxmox VE.

7.8.1. Configurazione

Il backend supporta tutte le proprietà storage comuni, eccetto il flag shared, che è sempre impostato. Inoltre sono disponibili le seguenti proprietà speciali per Proxmox Backup Server:

server

IP del server o nome DNS. Obbligatorio.

port

Utilizzare questa porta invece di quella predefinita, cioè 8007. Opzionale.

username

Il nome utente per lo storage Proxmox Backup Server. Obbligatorio.

Tip È necessario ricordarsi di aggiungere il realm al nome utente. Ad esempio, root@pam o archiver@pbs.
password

La password dell'utente. Il valore verrà salvato in un file in /etc/pve/priv/storage/<STORAGE-ID>.pw con accesso limitato all'utente root. Obbligatorio.

datastore

L'ID del datastore Proxmox Backup Server da utilizzare. Obbligatorio.

fingerprint

L'impronta digitale (fingerprint) del certificato TLS API di Proxmox Backup Server. È possibile recuperarla nella Dashboard dei server o utilizzando il comando proxmox-backup-manager cert info. Obbligatoria per i certificati autofirmati o per qualsiasi altro certificato la cui CA non sia attendibile per l'host.

encryption-key

Una chiave per cifrare i dati di backup lato client. Attualmente sono supportate solo chiavi non protette da password (nessuna funzione di derivazione della chiave, kdf). Verrà salvata in un file sotto /etc/pve/priv/storage/<STORAGE-ID>.enc con accesso riservato all'utente root. Utilizzare il valore magico autogen per generarne automaticamente una nuova con proxmox-backup-client key create --kdf none <path>. Opzionale.

master-pubkey

Una chiave pubblica RSA utilizzata per cifrare la chiave di cifratura del backup come parte dell'operazione di backup. Verrà salvata in un file sotto /etc/pve/priv/storage/<STORAGE-ID>.master.pem con accesso riservato all'utente root. La copia cifrata della chiave di cifratura del backup verrà aggiunta a ogni backup e archiviata sull'istanza di Proxmox Backup Server per scopi di ripristino. Opzionale, richiede encryption-key.

Configuration Example (/etc/pve/storage.cfg)
pbs: backup
        datastore main
        server enya.proxmox.com
        content backup
        fingerprint 09:54:ef:..snip..:88:af:47:fe:4c:3b:cf:8b:26:88:0b:4e:3c:b2
        prune-backups keep-all=1
        username archiver@pbs
        encryption-key a9:ee:c8:02:13:..snip..:2d:53:2c:98
        master-pubkey 1

7.8.2. Funzionalità dello storage

Proxmox Backup Server supporta solo i backup, che possono essere a livello di blocco o a livello di file. Proxmox VE utilizza il livello di blocco per le macchine virtuali e il livello di file per i container.

Tabella 7. Funzionalità dello storage per il backend pbs
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

backup

n/a

sì

n/a

n/a

7.8.3. Cifratura

screenshot/storage-pbs-encryption-with-key.png

Facoltativamente, è possibile configurare la cifratura lato client con AES-256 in modalità GCM. La cifratura può essere configurata sia tramite l'interfaccia web, sia da riga di comando con l'opzione encryption-key (vedere sopra). La chiave verrà salvata nel file /etc/pve/priv/storage/<STORAGE-ID>.enc, accessibile solo all'utente root.

Warning Senza la relativa chiave, i backup risulteranno inaccessibili. Pertanto, si consiglia di conservare le chiavi in modo ordinato e in un luogo separato dai contenuti sottoposti a backup. Può accadere, ad esempio, di eseguire il backup di un intero sistema utilizzando una chiave presente su quel sistema. Se il sistema diventa poi inaccessibile per qualsiasi motivo e deve essere ripristinato, ciò non sarà possibile poiché la chiave di cifratura andrà perduta insieme al sistema danneggiato.

Si consiglia di conservare la chiave in modo sicuro, ma facilmente accessibile, al fine di consentire un rapido ripristino in caso di disastro. Per questo motivo, il luogo migliore in cui conservarla è il proprio gestore di password, dove risulta immediatamente recuperabile. Come ulteriore backup di questa, si consiglia inoltre di salvare la chiave su una chiavetta USB e di conservarla in un luogo sicuro. In questo modo, risulta separata da qualsiasi sistema, ma rimane comunque facilmente recuperabile in caso di emergenza. Infine, in previsione del peggiore scenario possibile, si consiglia di conservare anche una copia cartacea della chiave in un luogo sicuro e chiuso a chiave. Il sottocomando paperkey può essere utilizzato per creare una versione codificata in QR della chiave. Il comando seguente invia l'output del comando paperkey a un file di testo, per una facile stampa.

# proxmox-backup-client key paperkey /etc/pve/priv/storage/<STORAGE-ID>.enc --output-format text > qrkey.txt

È inoltre possibile utilizzare una singola coppia di chiavi master RSA a scopo di ripristino delle chiavi: configurare tutti i client che eseguono backup cifrati in modo che utilizzino un'unica chiave pubblica master, e tutti i successivi backup cifrati conterranno una copia cifrata RSA della chiave di cifratura AES utilizzata. La corrispondente chiave master privata consente di recuperare la chiave AES e decifrare il backup anche se il sistema client non è più disponibile.

Warning Alla coppia di chiavi master si applicano le stesse regole di conservazione sicura valide per le normali chiavi di cifratura. Senza una copia della chiave privata, il ripristino non è possibile! Il comando paperkey supporta la generazione di copie cartacee delle chiavi master private per la conservazione in un luogo fisico sicuro.

Poiché la cifratura è gestita lato client, è possibile utilizzare lo stesso datastore sul server sia per backup non cifrati sia per backup cifrati, anche se cifrati con chiavi diverse. Tuttavia, la deduplicazione tra backup con chiavi diverse non è possibile, quindi è spesso preferibile creare datastore separati.

Note Non utilizzare la cifratura se non ne deriva alcun vantaggio, ad esempio quando il server viene eseguito localmente in una rete attendibile. È sempre più semplice ripristinare backup non cifrati.

7.8.4. Esempio: aggiunta di uno storage da riga di comando

È possibile ottenere un elenco dei datastore di Proxmox Backup Server disponibili con:

# pvesm scan pbs <server> <username> [--password <string>] [--fingerprint <string>]

È quindi possibile aggiungere uno di questi datastore come storage all'intero cluster Proxmox VE con:

# pvesm add pbs <id> --server <server> --datastore <datastore> --username <username> --fingerprint 00:B4:... --password

7.9. Backend pool ZFS locale

Tipo di pool di storage: zfspool

Questo backend consente di accedere a pool ZFS locali (o a file system ZFS all'interno di tali pool).

7.9.1. Configurazione

Il backend supporta le proprietà comuni dello storage content, nodes, disable e le seguenti proprietà specifiche di ZFS:

pool

Selezionare il pool/filesystem ZFS. Tutte le allocazioni vengono eseguite all'interno di tale pool.

blocksize

Impostare il parametro blocksize di ZFS.

sparse

Utilizzare il thin-provisioning di ZFS. Un volume sparse è un volume la cui riserva non è uguale alla dimensione del volume.

mountpoint

Il punto di mount del pool/filesystem ZFS. La modifica di questo valore non influisce sulla proprietà mountpoint del dataset visto da zfs. Il valore predefinito è /<pool>.

Configuration Example (/etc/pve/storage.cfg)
zfspool: vmdata
        pool tank/vmdata
        content rootdir,images
        sparse

7.9.2. Convenzioni di denominazione dei file

Il backend utilizza il seguente schema di denominazione per le immagini delle VM:

vm-<VMID>-<NAME>      // normal VM images
base-<VMID>-<NAME>    // template VM image (read-only)
subvol-<VMID>-<NAME>  // subvolumes (ZFS filesystem for containers)
<VMID>

Specifica la VM proprietaria.

<NAME>

Può essere un nome arbitrario (ascii) senza spazi. Il backend utilizza disk[N] come valore predefinito, dove [N] viene sostituito da un intero per rendere il nome univoco.

7.9.3. Funzionalità di storage

ZFS è probabilmente il tipo di storage più avanzato per quanto riguarda snapshot e cloning. Il backend utilizza dataset ZFS sia per le immagini delle VM (formato raw) che per i dati dei container (formato subvol). Le proprietà ZFS vengono ereditate dal dataset padre, quindi è possibile semplicemente impostare i valori predefiniti sul dataset padre.

Tabella 8. Funzionalità di storage per il backend zfs
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images rootdir

raw subvol

no

sì

sì

7.9.4. Crittografia

ZFS supporta la crittografia delle gerarchie di dataset. Ogni dataset crittografato è un encryption_root, che memorizza le proprietà per la crittografia stessa, oppure un discendente del proprio encryption_root - vedere la pagina man zfs-load-key(8) per i dettagli.

L'invio e la ricezione di dataset crittografati sono soggetti a vincoli, poiché alcuni parametri di crittografia (i vettori di inizializzazione per i cifrari simmetrici) devono essere trasferiti insieme ai dati, interrompendo l'eredità delle proprietà di crittografia sul lato ricevente, oppure devono essere ricreati sulla destinazione, richiedendo l'invio dei dati non crittografati - vedere la pagina man zfs-recv(8) per i dettagli.

Per la migrazione e la replica dello storage di dataset crittografati in Proxmox VE, i dati vengono inviati senza le proprietà di crittografia, e lo stato della crittografia viene determinato dalla destinazione.

Per inviare e ricevere dataset ZFS crittografati, è necessario assicurarsi che tutti gli storage coinvolti su tutti i nodi siano crittografati.

7.9.5. Esempi

Si consiglia di creare un file system ZFS aggiuntivo per memorizzare le immagini delle VM:

# zfs create tank/vmdata

Per abilitare la compressione su quel file system appena allocato:

# zfs set compression=on tank/vmdata

È possibile ottenere un elenco dei filesystem ZFS disponibili con:

# pvesm scan zfs

7.10. Backend LVM

Tipo di pool di storage: lvm

LVM è un livello software leggero che si colloca sopra i dischi fissi e le partizioni. Può essere utilizzato per suddividere lo spazio disco disponibile in volumi logici più piccoli.

Un altro caso d'uso è posizionare LVM sopra un grande LUN iSCSI (Logical Unit Number) o una SAN (Storage Area Network) connessa tramite Fibre Channel. Questo consente di gestire facilmente lo spazio sul LUN iSCSI, operazione che altrimenti sarebbe impossibile poiché la specifica iSCSI non definisce un'interfaccia di gestione per l'allocazione dello spazio.

7.10.1. Configurazione

Il backend LVM supporta le proprietà comuni dello storage content, nodes, disable e le seguenti proprietà specifiche di LVM:

vgname

Nome del gruppo di volumi LVM. Deve puntare a un gruppo di volumi esistente.

base

Volume di base. Questo volume viene attivato automaticamente prima di accedere allo storage. Risulta utile principalmente quando il gruppo di volumi LVM si trova su un server iSCSI remoto.

saferemove

Chiamata "Wipe Removed Volumes" nell'interfaccia web. Azzera i dati durante la rimozione degli LV. Durante la rimozione di un volume, garantisce che tutti i dati vengano eliminati e non possano essere accessibili da altri LV creati successivamente (che potrebbero ricevere gli stessi extent fisici). Si tratta di un'operazione costosa, ma può essere richiesta come misura di sicurezza in determinati ambienti.

I dispositivi di storage che supportano l'operazione "write zeroes" utilizzano blkdiscard per azzerare i blocchi. In caso contrario, viene eseguito un fallback su cstream.

saferemove-stepsize

Dimensione del passo di wipe in MiB (valore del parametro blkdiscard -p), limitata al valore massimo supportato dallo storage sottostante. Per impostazione predefinita, fino a 32 MiB (massimo).

saferemove_throughput

Throughput di wipe (valore del parametro cstream -t), per impostazione predefinita fino a 10 MiB/s.

snapshot-as-volume-chain

Impostare questo flag per abilitare il supporto agli snapshot per le macchine virtuali su LVM con una catena di volumi di backing. Con questa impostazione, l'esecuzione di uno snapshot rende persistente lo stato corrente con il nome dello snapshot e avvia un nuovo volume basato sullo snapshot.

Un volume basato su uno snapshot fa riferimento al proprio volume snapshot genitore come volume di backing e registra solo le differenze rispetto a tale volume di backing. Attualmente i volumi snapshot sono volumi logici LVM con provisioning thick.

Questo design evita i problemi legati agli snapshot LVM nativi, come significative penalizzazioni di input/output (I/O) e comportamenti imprevisti e pericolosi quando si esaurisce lo spazio pre-allocato.

Gli snapshot come catene di volumi offrono un supporto indipendente dal fornitore per gli snapshot su qualsiasi sistema di storage che supporti lo storage a blocchi. Questo include le SAN collegate tramite iSCSI e Fibre Channel.

Si noti che, sebbene questa funzionalità si basi su qcow2, utilizza solo la capacità di qcow2 di stratificare più volumi in una catena di backing, non la funzionalità di snapshot di qcow2. La funzionalità di snapshot è gestita dal sistema di storage PVE.

L'abilitazione o la disabilitazione di questo flag influisce solo sui volumi disco virtuali creati successivamente.

Per un supporto efficiente di snapshot-as-volume-chain, lo storage sottostante deve supportare il thin-provisioning e il discard. Sul lato PVE, ogni snapshot sembrerà occupare l'intera dimensione del volume, ma lo spazio effettivamente utilizzato sullo storage sottostante sarà inferiore se tali requisiti sono soddisfatti.

Warning Gli snapshot come catene di volumi sono attualmente una technology preview in Proxmox VE.
Configuration Example (/etc/pve/storage.cfg)
lvm: myspace
        vgname myspace
        content rootdir,images

7.10.2. Convenzioni di denominazione dei file

Il backend utilizza essenzialmente le stesse convenzioni di denominazione del backend pool ZFS.

vm-<VMID>-<NAME>      // normal VM images

7.10.3. Funzionalità storage

LVM è un tipico sistema di storage a blocchi. Purtroppo, gli snapshot LVM regolari sono inefficienti perché interferiscono con tutte le operazioni di scrittura all'interno dell'intero gruppo di volumi mentre lo snapshot è attivo, causando un significativo degrado delle prestazioni I/O. Questo è il motivo per cui LVM non supporta i cloni collegati, e per cui Proxmox VE ha aggiunto il supporto per gli snapshot come catene di volumi. Questa funzionalità gestisce il volume snapshot tramite il plugin di storage e utilizza qcow2 per stratificare volumi separati come catena di backing. Questo crea un singolo stato del disco che viene esposto al guest.

Un vantaggio di LVM è che può essere utilizzato con storage condiviso. Ad esempio, un LUN iSCSI. Il backend implementa un corretto locking a livello di cluster se lo storage è contrassegnato come condiviso nella configurazione.

Tip È possibile utilizzare il backend LVM-thin per lo storage locale non condiviso. Supporta snapshot e cloni collegati.
Tabella 9. Funzionalità storage per il backend lvm
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni completi Cloni collegati

images rootdir

raw, qcow21

possibile

sì1

sì

no

1: A partire da Proxmox VE 9, gli snapshot come catena di volumi sono disponibili per le VM, per maggiori dettagli vedere la sezione Configurazione LVM.

7.10.4. Esempi

È possibile ottenere un elenco dei gruppi di volumi LVM disponibili con:

# pvesm scan lvm

7.11. Backend LVM thin

Tipo di storage pool: lvmthin

LVM normalmente alloca i blocchi al momento della creazione di un volume. I pool LVM thin invece allocano i blocchi quando vengono scritti. Questo comportamento è chiamato thin-provisioning, poiché i volumi possono essere molto più grandi dello spazio fisicamente disponibile.

È possibile utilizzare i normali strumenti da riga di comando LVM per gestire e creare pool LVM thin (vedere man lvmthin per maggiori dettagli). Supponendo di avere già un gruppo di volumi LVM chiamato pve, i seguenti comandi creano un nuovo pool LVM thin (dimensione 100G) chiamato data:

lvcreate -L 100G -n data pve
lvconvert --type thin-pool pve/data

7.11.1. Configurazione

Il backend LVM thin supporta le proprietà di storage comuni content, nodes, disable, e le seguenti proprietà specifiche di LVM:

vgname

Nome del gruppo di volumi LVM. Deve puntare a un gruppo di volumi esistente.

thinpool

Il nome del pool LVM thin.

Configuration Example (/etc/pve/storage.cfg)
lvmthin: local-lvm
        thinpool data
        vgname pve
        content rootdir,images

7.11.2. Convenzioni di denominazione dei file

Il backend utilizza essenzialmente le stesse convenzioni di denominazione del backend pool ZFS.

vm-<VMID>-<NAME>      // normal VM images

7.11.3. Funzionalità di storage

LVM thin è uno storage a blocchi, ma supporta completamente ed efficientemente snapshot e cloni. I nuovi volumi vengono inizializzati automaticamente a zero.

Va evidenziato che i pool LVM thin non possono essere condivisi tra più nodi, pertanto possono essere utilizzati solo come storage locale.

Tabella 10. Funzionalità di storage per il backend lvmthin
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images rootdir

raw

no

sì

sì

7.11.4. Esempi

È possibile ottenere un elenco dei pool LVM thin disponibili sul gruppo di volumi pve con:

# pvesm scan lvmthin pve

7.12. Initiator Open-iSCSI

Tipo di storage pool: iscsi

iSCSI è una tecnologia ampiamente utilizzata per connettersi a server di storage. Quasi tutti i fornitori di storage supportano iSCSI. Sono disponibili anche soluzioni open source per target iSCSI, ad es. OpenMediaVault, basata su Debian.

Per utilizzare questo backend, è necessario installare il package Open-iSCSI (open-iscsi). Si tratta di un package Debian standard, ma non è installato per impostazione predefinita per non consumare risorse.

# apt-get install open-iscsi

Le attività di gestione iSCSI a basso livello possono essere eseguite utilizzando lo strumento iscsiadm.

7.12.1. Configurazione

Il backend supporta le proprietà di storage comuni content, nodes, disable, e le seguenti proprietà specifiche per iSCSI:

portal

Portale iSCSI (IP o nome DNS con porta opzionale).

target

Target iSCSI.

Configuration Example (/etc/pve/storage.cfg)
iscsi: mynas
     portal 10.10.10.1
     target iqn.2006-01.openfiler.com:tsn.dcb5aaaddd
     content none
Tip Se si desidera utilizzare LVM sopra iSCSI, è opportuno impostare content none. In questo modo non è possibile creare VM utilizzando direttamente i LUN iSCSI.

7.12.2. Convenzioni di denominazione dei file

Il protocollo iSCSI non definisce un'interfaccia per allocare o eliminare dati. Questa operazione deve invece essere eseguita sul lato target ed è specifica per il vendor. Il target si limita a esportarli come LUN numerati. Quindi i nomi dei volumi iSCSI di Proxmox VE codificano semplicemente alcune informazioni sul LUN come visto dal kernel Linux.

7.12.3. Funzionalità di storage

iSCSI è uno storage di tipo a livello di blocco e non fornisce alcuna interfaccia di gestione. Pertanto è generalmente preferibile esportare un unico LUN di grandi dimensioni e configurare LVM sopra tale LUN. È quindi possibile utilizzare il plugin LVM per gestire lo storage su quel LUN iSCSI.

Tabella 11. Funzionalità di storage per il backend iscsi
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images none

raw

sì

no

no

7.12.4. Esempi

È possibile effettuare la scansione di un portale iSCSI remoto e ottenere un elenco dei possibili target con:

pvesm scan iscsi <HOST[:PORT]>

7.13. Backend iSCSI in modalità utente

Tipo di storage pool: iscsidirect

Questo backend fornisce fondamentalmente la stessa funzionalità del backend Open-iSCSI, ma utilizza una libreria a livello utente per implementarla. È necessario installare il package libiscsi-bin per poter utilizzare questo backend.

Va notato che non sono coinvolti driver del kernel, quindi questo può essere considerato come un'ottimizzazione delle prestazioni. Tuttavia ciò comporta lo svantaggio di non poter utilizzare LVM sopra tale LUN iSCSI. È quindi necessario gestire tutte le allocazioni di spazio sul lato del server di storage.

7.13.1. Configurazione

Il backend iSCSI in modalità utente utilizza le stesse opzioni di configurazione del backend Open-iSCSI.

Configuration Example (/etc/pve/storage.cfg)
iscsidirect: faststore
     portal 10.10.10.1
     target iqn.2006-01.openfiler.com:tsn.dcb5aaaddd

7.13.2. Funzionalità di storage

Note Questo backend funziona solo con le VM. I container non possono utilizzare questo driver.
Tabella 12. Funzionalità di storage per il backend iscsidirect
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images

raw

sì

no

no

7.14. Dispositivi a blocchi Ceph RADOS (RBD)

Tipo di storage pool: rbd

Ceph è un object store distribuito e un file system progettato per fornire eccellenti prestazioni, affidabilità e scalabilità. I RADOS block device implementano uno storage a livello di blocco ricco di funzionalità, offrendo i seguenti vantaggi:

  • thin provisioning

  • volumi ridimensionabili

  • distribuito e ridondante (suddiviso su più OSD)

  • funzionalità complete di snapshot e clonazione

  • auto-riparante

  • nessun singolo punto di guasto

  • scalabile fino al livello degli exabyte

  • disponibile implementazione sia a livello kernel che user space

Note Per implementazioni di dimensioni più piccole, è anche possibile eseguire i servizi Ceph direttamente sui nodi Proxmox VE. L'hardware recente dispone di notevole potenza di calcolo e RAM, rendendo possibile l'esecuzione di servizi di storage e VM sullo stesso nodo.

7.14.1. Configurazione

Questo backend supporta le proprietà di storage comuni nodes, disable, content, e le seguenti proprietà specifiche di rbd:

monhost

Elenco di IP dei demoni monitor. Opzionale, necessario solo se Ceph non è in esecuzione sul cluster Proxmox VE. Con monhost impostato, Proxmox VE considera il cluster come esterno e mantiene una copia separata della chiave per questo storage, anche se i monitor appartengono al cluster Ceph di questo cluster Proxmox VE.

pool

Nome del pool Ceph.

username

ID client Ceph. Opzionale, il valore predefinito è admin. Utilizzare solo l'ID senza il prefisso client..

krbd

Forza l'accesso ai rados block device tramite il modulo kernel krbd. Opzionale.

Note I container utilizzeranno krbd indipendentemente dal valore dell'opzione.
Configuration Example for an external Ceph cluster (/etc/pve/storage.cfg)
rbd: ceph-external
        monhost 10.1.1.20 10.1.1.21 10.1.1.22
        pool ceph-external
        content images
        username pve-rbd
Tip È possibile utilizzare l'utility rbd per eseguire attività di gestione di basso livello.

7.14.2. Autenticazione

Note Se Ceph è installato localmente sul cluster Proxmox VE, quanto segue viene eseguito automaticamente durante l'aggiunta dello storage.

Se si utilizza l'autenticazione cephx, abilitata per impostazione predefinita, fornire un keyring dal cluster Ceph esterno. Ottenere o creare un'identità dedicata con solo le capacità richieste per questo storage, come descritto in Ceph User Management.
[Ceph User Management]
L'esempio seguente utilizza client.pve-rbd; non copiare client.admin su un client di storage.

Copiare il keyring su un nodo Proxmox VE:

# scp <external-ceph-server>:/etc/ceph/ceph.client.pve-rbd.keyring /root/rbd.keyring

Passare quindi quel file e l'identità senza il prefisso client. a pvesm:

# pvesm add rbd <name> --monhost "10.1.1.20 10.1.1.21 10.1.1.22" \
    --pool ceph-external --content images --username pve-rbd \
    --keyring /root/rbd.keyring

Dopo che pvesm ha terminato l'esecuzione con successo, rimuovere /root/rbd.keyring poiché contiene la chiave in chiaro.

Durante la configurazione di uno storage RBD esterno tramite la GUI, è possibile copiare e incollare il keyring nel campo appropriato.

Il keyring verrà memorizzato in

# /etc/pve/priv/ceph/<STORAGE_ID>.keyring

Se il cluster esterno ruota questa identità, sostituire il keyring memorizzato prima di aggiornare i relativi consumer. L'helper di migrazione cephx locale non ruota mai le chiavi dei cluster esterni.

7.14.3. Configurazione del client Ceph (opzionale)

La connessione a uno storage Ceph esterno non sempre consente di impostare opzioni specifiche del client nel DB di configurazione sul cluster esterno. È possibile aggiungere un file ceph.conf accanto al keyring Ceph per modificare la configurazione del client Ceph per lo storage.

Il file ceph.conf deve avere lo stesso nome dello storage.

# /etc/pve/priv/ceph/<STORAGE_ID>.conf

Consultare il riferimento alla configurazione RBD
[RBD configuration reference https://docs.ceph.com/en/tentacle/rbd/rbd-config-ref/]
per le possibili impostazioni.

Note Non modificare queste impostazioni con leggerezza. Proxmox VE unisce <STORAGE_ID>.conf con la configurazione dello storage.

7.14.4. Funzionalità storage

Il backend rbd è uno storage a livello di blocco e implementa funzionalità complete di snapshot e clone.

Tabella 13. Funzionalità storage per il backend rbd
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images rootdir

raw

sì

sì

sì

7.15. Ceph Filesystem (CephFS)

Tipo di storage pool: cephfs

CephFS implementa un filesystem conforme a POSIX, utilizzando un cluster storage Ceph per memorizzare i propri dati. Poiché CephFS si basa su Ceph, ne condivide la maggior parte delle proprietà. Ciò include ridondanza, scalabilità, auto-riparazione e alta disponibilità.

Tip Proxmox VE può gestire configurazioni Ceph, il che semplifica la configurazione di uno storage CephFS. Poiché l'hardware moderno offre una notevole potenza di elaborazione e RAM, è possibile eseguire servizi di storage e VM sullo stesso nodo senza un impatto significativo sulle prestazioni.

Per utilizzare il plugin storage CephFS, è necessario sostituire il client Ceph standard di Debian, aggiungendo il nostro repository Ceph. Una volta aggiunto, eseguire apt update, seguito da apt dist-upgrade, per ottenere i pacchetti più recenti.

Warning Assicurarsi che non siano configurati altri repository Ceph. In caso contrario l'installazione fallirà oppure sul nodo saranno presenti versioni mischiate dei pacchetti, causando un comportamento imprevisto.

7.15.1. Configurazione

Questo backend supporta le proprietà storage comuni nodes, disable, content, oltre alle seguenti proprietà specifiche di cephfs:

fs-name

Nome del Ceph FS.

monhost

Elenco degli indirizzi dei demoni monitor. Opzionale, necessario solo se Ceph non è in esecuzione sul cluster Proxmox VE. Con monhost impostato, Proxmox VE considera il cluster come esterno e mantiene una copia separata della chiave per questo storage, anche se i monitor appartengono al cluster Ceph di questo cluster Proxmox VE.

path

Il punto di mount locale. Opzionale, il valore predefinito è /mnt/pve/<STORAGE_ID>/.

username

ID client Ceph. Opzionale, il valore predefinito è admin. Utilizzare solo l'ID senza il prefisso client..

subdir

Sottodirectory CephFS da montare. Opzionale, il valore predefinito è /.

fuse

Accedere a CephFS tramite FUSE, invece del client del kernel. Opzionale, il valore predefinito è 0.

Configuration example for an external Ceph cluster (/etc/pve/storage.cfg)
cephfs: cephfs-external
        monhost 10.1.1.20 10.1.1.21 10.1.1.22
        path /mnt/pve/cephfs-external
        content backup
        username pve-cephfs
        fs-name cephfs
Note Non dimenticare di configurare il file della chiave segreta del client, se cephx non è stato disabilitato.

7.15.2. Autenticazione

Note Se Ceph è installato localmente sul cluster Proxmox VE, quanto segue viene eseguito automaticamente durante l'aggiunta dello storage.

Se si utilizza l'autenticazione cephx, abilitata per impostazione predefinita, fornire il segreto di un'identità dedicata con solo le capacità richieste per questo storage. Ottenere o creare l'identità come descritto in Gestione utenti Ceph.
[cephusermgmt]
L'esempio seguente utilizza client.pve-cephfs; non utilizzare client.admin per un client storage.

Esportare la chiave grezza tramite SSH su un nodo Proxmox VE:

# ssh root@<external-ceph-server> \
    'ceph auth get-key client.pve-cephfs' > /root/cephfs.secret

Passare quindi quel file e l'identità senza il prefisso client. a pvesm:

# pvesm add cephfs <name> --monhost "10.1.1.20 10.1.1.21 10.1.1.22" \
    --fs-name cephfs --content backup --username pve-cephfs \
    --keyring /root/cephfs.secret

Dopo che pvesm è stato eseguito correttamente, rimuovere /root/cephfs.secret poiché contiene la chiave in chiaro.

Quando si configura uno storage CephFS esterno nell'interfaccia web, incollare il secret nel campo appropriato. CephFS utilizza la chiave nuda, non il formato keyring RBD con una sezione [client.<USER>]. Proxmox VE memorizza il secret in /etc/pve/priv/ceph/<STORAGE_ID>.secret.

Se il cluster esterno ruota questa identità, sostituire il secret memorizzato prima di rimontare lo storage. L'helper di migrazione cephx locale non ruota mai le chiavi di cluster esterni.

7.15.3. Funzionalità storage

Il backend cephfs è un filesystem conforme a POSIX, basato su un cluster Ceph.

Tabella 14. Funzionalità storage per il backend cephfs
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

vztmpl iso backup snippets

none

sì

sì[1]

no

[1] Sebbene non siano noti bug, gli snapshot non sono ancora garantiti come stabili, poiché non sono stati testati a sufficienza.

7.16. Backend BTRFS

Tipo di pool di storage: btrfs

In apparenza, questo tipo di storage è molto simile al tipo di storage directory, quindi si veda la sezione del backend directory per una panoramica generale.

La differenza principale è che con questo tipo di storage i dischi in formato raw verranno collocati in un subvolume, per consentire la creazione di snapshot e supportare la migrazione offline dello storage preservando gli snapshot.

Note BTRFS rispetterà il flag O_DIRECT durante l'apertura dei file, il che significa che le VM non devono utilizzare la modalità cache none, altrimenti si verificheranno errori di checksum.

7.16.1. Configurazione

Questo backend viene configurato in modo simile allo storage directory. È opportuno notare che quando si aggiunge una directory come storage BTRFS, che non è essa stessa anche il mount point, è vivamente consigliato specificare il mount point effettivo tramite l'opzione is_mountpoint.

Ad esempio, se un filesystem BTRFS è montato in /mnt/data2 e la relativa sottodirectory pve-storage/ (che potrebbe essere uno snapshot, operazione consigliata) deve essere aggiunta come pool di storage denominato data2, è possibile utilizzare la seguente voce:

btrfs: data2
        path /mnt/data2/pve-storage
        content rootdir,images
        is_mountpoint /mnt/data2

7.16.2. Snapshot

Quando si esegue uno snapshot di un subvolume o di un file raw, lo snapshot verrà creato come subvolume in sola lettura con lo stesso percorso seguito da una @ e dal nome dello snapshot.

7.17. Backend ZFS over iSCSI

Tipo di pool di storage: zfs

Questo backend accede a una macchina remota che dispone di un pool ZFS come storage e di un'implementazione target iSCSI tramite ssh. Per ogni disco guest crea uno ZVOL e lo esporta come LUN iSCSI. Questa LUN viene utilizzata da Proxmox VE per il disco guest.

Sono supportate le seguenti implementazioni target iSCSI:

  • LIO (Linux)

  • IET (Linux)

  • ISTGT (FreeBSD)

  • Comstar (Solaris)

Note Questo plugin richiede un'appliance di storage remota compatibile con ZFS; non è possibile utilizzarlo per creare un pool ZFS su un'appliance di storage/SAN convenzionale

7.17.1. Configurazione

Per utilizzare il plugin ZFS over iSCSI è necessario configurare la macchina remota (target) affinché accetti connessioni ssh dal nodo Proxmox VE. Proxmox VE si connette al target per creare gli ZVOL ed esportarli tramite iSCSI. L'autenticazione viene effettuata tramite una chiave ssh (senza protezione tramite password) memorizzata in /etc/pve/priv/zfs/<target_ip>_id_rsa

I seguenti passaggi creano una chiave ssh e la distribuiscono alla macchina di storage con IP 192.0.2.1:

mkdir /etc/pve/priv/zfs
ssh-keygen -f /etc/pve/priv/zfs/192.0.2.1_id_rsa
ssh-copy-id -i /etc/pve/priv/zfs/192.0.2.1_id_rsa.pub root@192.0.2.1
ssh -i /etc/pve/priv/zfs/192.0.2.1_id_rsa root@192.0.2.1

Il backend supporta le proprietà comuni dello storage content, nodes, disable e le seguenti proprietà specifiche di ZFS over iSCSI:

pool

Il pool/filesystem ZFS sul target iSCSI. Tutte le allocazioni vengono eseguite all'interno di tale pool.

portal

Portale iSCSI (IP o nome DNS con porta opzionale).

target

Target iSCSI.

iscsiprovider

L'implementazione del target iSCSI utilizzata sulla macchina remota

comstar_tg

gruppo target per le view comstar.

comstar_hg

gruppo host per le view comstar.

lio_tpg

gruppo di portali target per i target Linux LIO

nowritecache

disabilitare la cache di scrittura sulla destinazione

blocksize

Impostare il parametro blocksize di ZFS.

sparse

Utilizzare il thin-provisioning di ZFS. Un volume sparse è un volume la cui riserva non è uguale alla dimensione del volume.

Configuration Examples (/etc/pve/storage.cfg)
zfs: lio
   blocksize 4k
   iscsiprovider LIO
   pool tank
   portal 192.0.2.111
   target iqn.2003-01.org.linux-iscsi.lio.x8664:sn.xxxxxxxxxxxx
   content images
   lio_tpg tpg1
   sparse 1

zfs: solaris
   blocksize 4k
   target iqn.2010-08.org.illumos:02:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:tank1
   pool tank
   iscsiprovider comstar
   portal 192.0.2.112
   content images

zfs: freebsd
   blocksize 4k
   target iqn.2007-09.jp.ne.peach.istgt:tank1
   pool tank
   iscsiprovider istgt
   portal 192.0.2.113
   content images

zfs: iet
   blocksize 4k
   target iqn.2001-04.com.example:tank1
   pool tank
   iscsiprovider iet
   portal 192.0.2.114
   content images

7.17.2. Funzionalità storage

Il plugin ZFS over iSCSI fornisce uno storage condiviso, in grado di eseguire snapshot. È necessario assicurarsi che l'appliance ZFS non diventi un singolo punto di errore nella distribuzione.

Tabella 15. Funzionalità storage per il backend iscsi
Tipi di contenuto Formati immagine Condiviso Snapshot Cloni

images

raw

sì

sì

no

8. Distribuire un cluster Ceph hyper-converged

8.1. Introduzione

screenshot/gui-ceph-status-dashboard.png

Proxmox VE unifica i sistemi di calcolo e di storage, ovvero è possibile utilizzare gli stessi nodi fisici all'interno di un cluster sia per il calcolo (elaborazione di VM e container) sia per lo storage replicato. I tradizionali silos di risorse di calcolo e storage possono essere racchiusi in un'unica appliance hyper-converged. Le reti di storage separate (SAN) e le connessioni tramite network attached storage (NAS) scompaiono. Grazie all'integrazione di Ceph, una piattaforma di storage software-defined open source, Proxmox VE è in grado di eseguire e gestire lo storage Ceph direttamente sui nodi dell'hypervisor.

Ceph è un file system e un object store distribuito progettato per offrire eccellenti prestazioni, affidabilità e scalabilità.

Some advantages of Ceph on Proxmox VE are:
  • Configurazione e gestione semplici tramite CLI e GUI

  • Thin provisioning

  • Supporto per gli snapshot

  • Auto-riparazione

  • Scalabile fino al livello degli exabyte

  • Fornisce storage a blocchi, a livello di file system e a oggetti

  • Consente di configurare pool con caratteristiche di prestazioni e ridondanza diverse

  • I dati vengono replicati, rendendo il sistema tollerante ai guasti

  • Funziona su hardware standard

  • Non richiede controller RAID hardware

  • Open source

Per distribuzioni di piccole e medie dimensioni, è possibile installare un server Ceph per utilizzare RADOS Block Devices (RBD) o CephFS direttamente sui nodi del cluster Proxmox VE (vedere Ceph RADOS Block Devices (RBD)). L'hardware recente dispone di notevole potenza di calcolo e RAM, pertanto è possibile eseguire i servizi di storage e i guest virtuali sullo stesso nodo.

Per semplificare la gestione, Proxmox VE fornisce un'integrazione nativa per installare e gestire i servizi Ceph sui nodi Proxmox VE sia tramite l'interfaccia web integrata, sia utilizzando lo strumento a riga di comando pveceph.

8.2. Terminologia

Ceph consists of multiple Daemons, for use as an RBD storage:
  • Ceph Monitor (ceph-mon, o MON)

  • Ceph Manager (ceph-mgr, o MGR)

  • Ceph Metadata Service (ceph-mds, o MDS)

  • Ceph Object Storage Daemon (ceph-osd, o OSD)

Tip Si raccomanda vivamente di familiarizzare con Ceph
[Introduzione a Ceph https://docs.ceph.com/en/tentacle/start/]
, con la relativa architettura
[Architettura Ceph https://docs.ceph.com/en/tentacle/architecture/]
e con il relativo glossario
[Glossario Ceph https://docs.ceph.com/en/tentacle/glossary]
.

8.3. Raccomandazioni per un cluster Ceph in buono stato

Per realizzare un cluster Proxmox + Ceph iperconvergente, è necessario utilizzare per la configurazione almeno tre server (preferibilmente identici).

Si consiglia di consultare anche le raccomandazioni fornite dal sito web di Ceph.

Note Le raccomandazioni riportate di seguito vanno considerate come linee guida generali per la scelta dell'hardware. È pertanto essenziale adattarle alle proprie esigenze specifiche. Si consiglia di testare la configurazione e monitorare costantemente lo stato e le prestazioni.
CPU

I servizi Ceph possono essere classificati in due categorie:

  • Utilizzo intensivo della CPU, che beneficia di frequenze base elevate e di più core. Appartengono a questa categoria:

    • Servizi Object Storage Daemon (OSD)

    • Meta Data Service (MDS) utilizzato per CephFS

  • Utilizzo moderato della CPU, che non richiede più core. Questi sono:

    • Servizi Monitor (MON)

    • Servizi Manager (MGR)

Come semplice regola generale, è opportuno assegnare almeno un core CPU (o thread) a ciascun servizio Ceph, per fornire le risorse minime necessarie a garantire prestazioni stabili e durature.

Ad esempio, se si prevede di eseguire su un nodo un monitor Ceph, un manager Ceph e 6 servizi OSD Ceph, è opportuno riservare 8 core CPU esclusivamente a Ceph per ottenere prestazioni di base stabili.

Si noti che l'utilizzo della CPU di un OSD dipende principalmente dalle prestazioni del disco. Più alte sono le possibili IOPS (IO Operations per Second) di un disco, maggiore è la CPU che può essere utilizzata da un servizio OSD. Per i moderni dischi SSD enterprise, come gli NVMe in grado di sostenere permanentemente un carico IOPS elevato oltre le 100'000 con latenza inferiore al millisecondo, ogni OSD può utilizzare più thread CPU; ad esempio, è probabile che da quattro a sei thread CPU vengano utilizzati per OSD basati su NVMe nel caso di dischi con prestazioni molto elevate.

Memory

Soprattutto in una configurazione iperconvergente, il consumo di memoria deve essere pianificato e monitorato con attenzione. Oltre all'utilizzo di memoria previsto per le macchine virtuali e i container, è necessario considerare anche la disponibilità di memoria sufficiente per permettere a Ceph di offrire prestazioni eccellenti e stabili.

Sebbene in condizioni normali l'utilizzo possa essere inferiore, durante operazioni critiche, come il recovery, il rebalancing o il backfilling, verrà consumata una maggiore quantità di memoria. Ciò significa che è opportuno evitare di saturare la memoria disponibile già durante il normale funzionamento, lasciando invece un margine per far fronte a eventuali interruzioni.

La raccomandazione attuale è configurare gli OSD con almeno 8 GiB di memoria per garantire buone prestazioni. Il daemon OSD richiede 4 GiB per impostazione predefinita.

Note Il consumo totale di memoria è determinato principalmente dal numero di daemon OSD. Tuttavia, per le operazioni critiche, tutti i servizi Ceph potrebbero richiedere memoria aggiuntiva.
Network

Si raccomanda una larghezza di banda di rete di almeno 10 Gbps, o superiore, da riservare esclusivamente al traffico Ceph. Una configurazione di rete a mesh
[Full Mesh Network for Ceph https://pve.proxmox.com/wiki/Full_Mesh_Network_for_Ceph_Server]
è inoltre un'opzione valida per cluster da tre a cinque nodi, nel caso non siano disponibili switch a 10+ Gbps.

Important Il volume di traffico, specialmente durante il recovery, interferirà con gli altri servizi sulla stessa rete; in particolare lo stack cluster corosync di Proxmox VE, sensibile alla latenza, può essere influenzato, con la possibile conseguenza della perdita del quorum del cluster. Spostare il traffico Ceph su reti dedicate e fisicamente separate evita tale interferenza, non solo per corosync, ma anche per i servizi di rete forniti da qualsiasi guest virtuale.

Per stimare le esigenze di banda, è necessario tenere conto delle prestazioni dei dischi. Mentre un singolo HDD potrebbe non saturare un link a 1 Gb, più OSD HDD per nodo possono già saturare anche 10 Gbps. Se vengono utilizzati SSD moderni collegati tramite NVMe, un singolo disco può già saturare 10 Gbps di banda, o più. Per configurazioni così ad alte prestazioni si consiglia almeno 25 Gbps, mentre potrebbero essere necessari anche 40 Gbps o oltre 100 Gbps per utilizzare il pieno potenziale delle prestazioni dei dischi sottostanti.

In caso di dubbio, si consiglia di utilizzare tre reti (fisicamente) separate per configurazioni ad alte prestazioni:

  • una rete a larghezza di banda molto elevata (25+ Gbps) per il traffico interno del cluster Ceph.

  • una rete ad alta larghezza di banda (10+ Gbps) per il traffico Ceph (pubblico) tra il server Ceph e il client Ceph per l'accesso allo storage. In base alle esigenze, questa rete può essere utilizzata anche per il traffico dei guest virtuali e per il traffico di migrazione live delle VM.

  • una rete a larghezza di banda media (1 Gbps) riservata esclusivamente alla comunicazione del cluster corosync, sensibile alla latenza.

Se è attivo un firewall, è necessario aprire le porte utilizzate da Ceph; il modo più semplice per farlo è utilizzare una macro del firewall.

Disks

Quando si pianifica la dimensione del cluster Ceph, è importante considerare il tempo di recovery. Specialmente nei cluster piccoli, il recovery può richiedere molto tempo. Si consiglia di utilizzare SSD invece di HDD nelle configurazioni piccole, per ridurre il tempo di recovery e minimizzare la probabilità di un ulteriore guasto durante il recovery.

In generale, gli SSD forniscono più IOPS rispetto ai dischi meccanici. Tenendo presente questo aspetto, oltre al costo più elevato, può essere opportuno implementare una separazione dei pool basata su classi. Un altro modo per velocizzare gli OSD consiste nell'utilizzare un disco più veloce come journal o come dispositivo DB/Write-Ahead-Log, vedere creazione di OSD Ceph. Se un disco più veloce viene utilizzato per più OSD, è necessario scegliere un equilibrio adeguato tra gli OSD e il disco WAL / DB (o journal), altrimenti il disco più veloce diventa il collo di bottiglia per tutti gli OSD collegati.

A prescindere dal tipo di disco, Ceph offre le migliori prestazioni con dischi di dimensioni uniformi e con lo stesso numero di dischi per nodo. Ad esempio, 4 dischi da 500 GB in ogni nodo sono preferibili a una configurazione mista con un disco da 1 TB e tre dischi da 250 GB.

È inoltre necessario bilanciare il numero di OSD e la capacità del singolo OSD. Una maggiore capacità consente di aumentare la densità di storage, ma significa anche che il guasto di un singolo OSD costringe Ceph a recuperare più dati contemporaneamente.

Avoid RAID

Poiché Ceph gestisce autonomamente la ridondanza degli oggetti dati e le scritture multiple parallele sui dischi (OSD), l'utilizzo di un controller RAID normalmente non migliora le prestazioni né la disponibilità. Al contrario, Ceph è progettato per gestire autonomamente dischi interi, senza alcuna astrazione intermedia. I controller RAID non sono progettati per il carico di lavoro di Ceph e possono complicare le cose, a volte riducendo anche le prestazioni, poiché i loro algoritmi di scrittura e caching possono interferire con quelli di Ceph.

Warning Evitare i controller RAID. Utilizzare invece un host bus adapter (HBA).

8.4. Installazione e configurazione iniziale di Ceph

8.4.1. Utilizzo della procedura guidata basata sul web

screenshot/gui-node-ceph-install.png

Con Proxmox VE si ha il vantaggio di una procedura guidata di installazione facile da utilizzare per Ceph. Fare clic su uno dei nodi del cluster e navigare nella sezione Ceph dell'albero dei menu. Se Ceph non è già installato, verrà mostrato un prompt che offre di procedere con l'installazione.

La procedura guidata è divisa in più sezioni, ciascuna delle quali deve essere completata correttamente per poter utilizzare Ceph.

Innanzitutto è necessario scegliere quale versione di Ceph installare. Si consiglia di preferire quella già utilizzata sugli altri nodi, oppure la più recente se si tratta del primo nodo su cui si installa Ceph.

Dopo l'avvio dell'installazione, la procedura guidata scaricherà e installerà tutti i package richiesti dal repository Ceph di Proxmox VE.

screenshot/gui-node-ceph-install-wizard-step0.png

Dopo aver completato la fase di installazione, è necessario creare una configurazione. Questo passaggio è necessario solo una volta per cluster, poiché questa configurazione viene distribuita automaticamente a tutti gli altri membri del cluster tramite il file system di configurazione clusterizzato (pmxcfs) di Proxmox VE.

La fase di configurazione comprende le seguenti impostazioni:

  • Rete pubblica: questa rete verrà utilizzata per la comunicazione pubblica dello storage (ad esempio, per le macchine virtuali che utilizzano un disco basato su Ceph RBD o un mount CephFS) e per la comunicazione tra i diversi servizi Ceph. Questa impostazione è obbligatoria.
    Si consiglia vivamente di separare il traffico Ceph dalla comunicazione del cluster Proxmox VE (corosync) ed eventualmente dalle reti rivolte verso l'esterno (pubbliche) dei guest virtuali. In caso contrario, il traffico I/O di Ceph, che richiede un'elevata larghezza di banda, potrebbe causare interferenze con altri servizi che richiedono una bassa latenza.

  • Rete cluster: specificare per separare anche il traffico di replica e di heartbeat degli OSD. Questa impostazione è opzionale.
    Si consiglia di utilizzare una rete fisicamente separata, poiché ciò riduce il carico sulla rete pubblica di Ceph e sulla rete degli ospiti virtuali, fornendo al contempo un miglioramento significativo delle prestazioni di Ceph.
    La rete cluster di Ceph può essere configurata e spostata su un’altra rete fisicamente separata in un momento successivo.

screenshot/gui-node-ceph-install-wizard-step2.png

Sono disponibili altre due opzioni considerate avanzate e che pertanto dovrebbero essere modificate solo se si è consapevoli di ciò che si sta facendo.

  • Numero di repliche: definisce quante volte un oggetto viene replicato.

  • Repliche minime: definisce il numero minimo di repliche richieste perché l’I/O venga contrassegnato come completato.

È inoltre necessario scegliere il primo nodo monitor. Questo passaggio è obbligatorio.

Tutto qui. Come ultimo passaggio dovrebbe apparire una pagina di successo, con ulteriori istruzioni su come procedere. Il sistema è ora pronto per iniziare a utilizzare Ceph. Per iniziare, sarà necessario creare alcuni monitor, OSD aggiuntivi e almeno un pool.

Il resto di questo capitolo illustrerà come ottenere il massimo dalla propria configurazione Ceph basata su Proxmox VE. Ciò include i suggerimenti già citati e altro ancora, come CephFS, un’utile aggiunta al nuovo cluster Ceph.

8.4.2. Installazione dei pacchetti Ceph tramite CLI

In alternativa alla procedura guidata di installazione di Ceph di Proxmox VE, consigliata e disponibile nell’interfaccia web, è possibile utilizzare il seguente comando CLI su ciascun nodo:

pveceph install

Questo configura un repository di pacchetti apt in /etc/apt/sources.list.d/ceph.sources e installa il software richiesto.

8.4.3. Configurazione iniziale di Ceph tramite CLI

Utilizzare la procedura guidata di installazione di Ceph di Proxmox VE (consigliata) oppure eseguire il seguente comando su un nodo:

pveceph init --network 10.10.10.0/24

Questo crea una configurazione iniziale in /etc/pve/ceph.conf con una rete dedicata per Ceph. Questo file viene distribuito automaticamente a tutti i nodi Proxmox VE, tramite pmxcfs. Il comando crea inoltre un collegamento simbolico in /etc/ceph/ceph.conf, che punta a tale file. In questo modo è possibile eseguire semplicemente i comandi Ceph senza la necessità di specificare un file di configurazione.

8.5. Monitor Ceph

screenshot/gui-ceph-monitor.png

Il Ceph Monitor (MON)
[Ceph Monitor https://docs.ceph.com/en/tentacle/rados/configuration/mon-config-ref/]
mantiene una copia principale della mappa del cluster. Per l’alta disponibilità, sono necessari almeno 3 monitor. Un monitor sarà già installato se è stata utilizzata la procedura guidata di installazione. Non sono necessari più di 3 monitor, a condizione che il cluster sia di dimensioni piccole o medie. Solo cluster davvero di grandi dimensioni richiederanno un numero superiore.

8.5.1. Creazione dei monitor

Su ciascun nodo in cui si desidera posizionare un monitor (si consigliano tre monitor), crearne uno utilizzando la scheda Ceph → Monitor nella GUI oppure eseguire:

pveceph mon create

8.5.2. Eliminazione dei monitor

Per rimuovere un Ceph Monitor tramite la GUI, selezionare innanzitutto un nodo nella vista ad albero e accedere al pannello Ceph → Monitor. Selezionare il MON e fare clic sul pulsante Elimina.

Per rimuovere un Ceph Monitor tramite la CLI, connettersi innanzitutto al nodo su cui è in esecuzione il MON. Eseguire quindi il seguente comando:

pveceph mon destroy
Note Sono necessari almeno tre monitor per il quorum.

8.6. Ceph Manager

Il demone Manager viene eseguito insieme ai monitor. Fornisce un’interfaccia per monitorare il cluster. A partire dal rilascio di Ceph luminous, è richiesto almeno un demone ceph-mgr
[Ceph Manager https://docs.ceph.com/en/tentacle/mgr/]
.

8.6.1. Creazione del manager

È possibile installare più manager, ma solo un manager risulta attivo in un dato momento.

pveceph mgr create
Note Si consiglia di installare il Ceph Manager sui nodi monitor. Per l’alta disponibilità, installarne più di uno.

8.6.2. Eliminazione del manager

Per rimuovere un Ceph Manager tramite la GUI, selezionare innanzitutto un nodo nella vista ad albero e accedere al pannello Ceph → Monitor. Selezionare il Manager e fare clic sul pulsante Elimina.

Per rimuovere un Ceph Monitor tramite la CLI, connettersi innanzitutto al nodo su cui è in esecuzione il Manager. Eseguire quindi il seguente comando:

pveceph mgr destroy
Note Sebbene un manager non sia una dipendenza rigida, è fondamentale per un cluster Ceph, poiché gestisce funzionalità importanti come l’autoscaling dei PG, il monitoraggio dello stato dei dispositivi, la telemetria e altro ancora.

8.7. OSD Ceph

screenshot/gui-ceph-osd-status.png

I Ceph Object Storage Daemon memorizzano gli oggetti per Ceph sulla rete. Si consiglia di utilizzare un OSD per disco fisico.

8.7.1. Creazione degli OSD

È possibile creare un OSD tramite l'interfaccia web di Proxmox VE oppure tramite la CLI usando pveceph. Ad esempio:

pveceph osd create /dev/sd[X]
Tip Si consiglia un cluster Ceph con almeno tre nodi e almeno 12 OSD, distribuiti uniformemente tra i nodi.

Se il disco era già stato utilizzato in precedenza (ad esempio per ZFS o come OSD), è necessario prima eliminare (zap) ogni traccia di tale utilizzo. Per rimuovere la tabella delle partizioni, il settore di avvio e ogni altro residuo di OSD, è possibile utilizzare il seguente comando:

ceph-volume lvm zap /dev/sd[X] --destroy
Warning Il comando precedente distruggerà tutti i dati presenti sul disco!
Ceph Bluestore

A partire dalla release Kraken di Ceph, è stato introdotto un nuovo tipo di storage OSD per Ceph chiamato Bluestore
[Ceph Bluestore https://ceph.com/community/new-luminous-bluestore/]
. Questo è il tipo predefinito per la creazione degli OSD a partire da Ceph Luminous.

pveceph osd create /dev/sd[X]
Block.db and block.wal

Se si desidera utilizzare un dispositivo DB/WAL separato per i propri OSD, è possibile specificarlo tramite le opzioni -db_dev e -wal_dev. Il WAL viene collocato insieme al DB, se non specificato separatamente.

pveceph osd create /dev/sd[X] -db_dev /dev/sd[Y] -wal_dev /dev/sd[Z]

È possibile scegliere direttamente la dimensione di questi ultimi con i parametri -db_size e -wal_size rispettivamente. Se non vengono specificati, verranno utilizzati i seguenti valori (in ordine):

  • bluestore_block_{db,wal}_size dalla configurazione Ceph…

    • … database, sezione osd

    • … database, sezione global

    • … file, sezione osd

    • … file, sezione global

  • 10% (DB)/1% (WAL) della dimensione dell'OSD

Note Il DB memorizza i metadati interni di BlueStore, mentre il WAL è il journal interno di BlueStore, ovvero il write-ahead log. Si consiglia di utilizzare un SSD veloce o NVRAM per ottenere prestazioni migliori.
Ceph Filestore

Prima di Ceph Luminous, Filestore era utilizzato come tipo di storage predefinito per gli OSD Ceph. A partire da Ceph Nautilus, Proxmox VE non supporta più la creazione di tali OSD con pveceph. Se si desidera ancora creare OSD filestore, utilizzare direttamente ceph-volume.

ceph-volume lvm create --filestore --data /dev/sd[X] --journal /dev/sd[Y]

8.7.2. Distruzione degli OSD

In caso di problemi con un OSD o con il relativo disco, è consigliabile prima provare a risolvere il problema per decidere se è necessaria una sostituzione.

Per distruggere un OSD, accedere al pannello <Nodo> → Ceph → OSD oppure utilizzare i comandi CLI indicati sul nodo in cui si trova l'OSD.

  1. Assicurarsi che il cluster disponga di spazio sufficiente per gestire la rimozione dell'OSD. Nel pannello Ceph → OSD, se l'OSD da distruggere è ancora up e in (valore diverso da zero in AVAIL), assicurarsi che tutti gli OSD abbiano il proprio valore Used (%) ben al di sotto del nearfull_ratio predefinito dell'85%.

    In questo modo è possibile ridurre il rischio legato al successivo ribilanciamento, che potrebbe causare il riempimento degli OSD, bloccando così l'I/O sui pool Ceph.

    Utilizzare il seguente comando per ottenere le stesse informazioni dalla CLI:

    ceph osd df tree
  2. Se l'OSD da distruggere non è ancora out, selezionare l'OSD e fare clic su Out. Questo lo escluderà dalla distribuzione dei dati e avvierà un ribilanciamento.

    Il seguente comando esegue la stessa operazione:

    ceph osd out <id>
  3. Se possibile, attendere che Ceph abbia terminato il ribilanciamento, in modo da avere sempre un numero sufficiente di repliche. L'OSD risulterà vuoto; una volta che lo sarà, mostrerà 0 PG.

  4. Fare clic su Stop. Se l'arresto non è ancora sicuro, verrà mostrato un avviso e si consiglia di fare clic su Cancel. Riprovare dopo qualche istante.

    I seguenti comandi possono essere utilizzati per verificare se è sicuro arrestare l'OSD e per arrestarlo:

    ceph osd ok-to-stop <id>
    pveceph stop --service osd.<id>
  5. Infine:

    Per rimuovere l'OSD da Ceph ed eliminare tutti i dati sul disco, fare prima clic su More → Destroy. Abilitare l'opzione di pulizia per eliminare la tabella delle partizioni e le altre strutture. Questo consente di riutilizzare immediatamente il disco in Proxmox VE. Successivamente, fare clic su Remove.

    Il comando CLI per distruggere l'OSD è:

    pveceph osd destroy <id> [--cleanup]

8.8. Configurazione di Ceph

Il daemon Ceph e i client ottengono la propria configurazione da una o più fonti
[Fonti di configurazione Ceph https://docs.ceph.com/en/latest/rados/configuration/ceph-conf/#config-sources]
. In Proxmox VE viene utilizzato un file ceph.conf minimo per contenere le impostazioni di bootstrap. La maggior parte della configurazione è contenuta nel database di configurazione centrale gestito dai servizi MON.

Per modificare in modo permanente i valori di configurazione, utilizzare i seguenti comandi
[Comandi del database MON Ceph https://docs.ceph.com/en/latest/rados/configuration/ceph-conf/#commands]
:

ceph config dump

Mostra tutte le opzioni di configurazione

ceph config get <who> <name>

Mostra le opzioni di configurazione per un'entità

ceph config set <who> <name> <value>

Imposta un'opzione di configurazione per una o più entità

ceph config rm <who> <name>

Rimuove un'opzione di configurazione per una o più entità

Example for increasing the osd_memory_target for all OSD daemons
ceph config set osd osd_memory_target 8G
Note Se un'opzione esiste in un file di configurazione locale, la configurazione nel MON DB verrà ignorata poiché ha una priorità inferiore.

8.9. Pool Ceph

screenshot/gui-ceph-pools.png

Un pool è un gruppo logico per l'archiviazione di oggetti. Contiene una raccolta di oggetti, noti come Placement Groups (PG, pg_num).

8.9.1. Creazione e modifica dei pool

È possibile creare e modificare i pool dalla riga di comando o dall'interfaccia web di qualsiasi host Proxmox VE in Ceph → Pools.

Quando non viene specificata alcuna opzione, viene impostato un valore predefinito di 128 PG, una dimensione di 3 repliche e una min_size di 2 repliche, per garantire che non si verifichi alcuna perdita di dati se un OSD si guasta.

Warning Non impostare min_size a 1. Un pool replicato con min_size pari a 1 consente l'I/O su un oggetto quando ha solo 1 replica, il che potrebbe causare la perdita di dati, PG incompleti o oggetti non trovati.

Si consiglia di abilitare il PG-Autoscaler oppure di calcolare il numero di PG in base alla propria configurazione. La formula e il calcolatore di PG sono disponibili
[PG calculator https://web.archive.org/web/20210301111112/http://ceph.com/pgcalc/]
online. A partire da Ceph Nautilus, è possibile modificare il numero di PG
[Placement Groups https://docs.ceph.com/en/tentacle/rados/operations/placement-groups/]
anche dopo la configurazione.

Il PG autoscaler
[Automated Scaling https://docs.ceph.com/en/tentacle/rados/operations/placement-groups/#automated-scaling]
può scalare automaticamente il numero di PG per un pool in background. Impostare i parametri avanzati Target Size o Target Ratio aiuta il PG-Autoscaler a prendere decisioni migliori.

Example for creating a pool over the CLI
pveceph pool create <pool-name> --add_storages
Tip Per definire automaticamente anche uno storage per il pool, lasciare selezionata la casella "Add as Storage" nell'interfaccia web, oppure utilizzare l'opzione da riga di comando --add_storages durante la creazione del pool.
Opzioni del pool
screenshot/gui-ceph-pool-create.png

Le seguenti opzioni sono disponibili alla creazione del pool e, parzialmente, anche durante la modifica di un pool.

Nome

Il nome del pool. Deve essere univoco e non può essere modificato in seguito.

Dimensione

Il numero di repliche per oggetto. Ceph cerca sempre di mantenere questo numero di copie di un oggetto. Predefinito: 3.

Modalità di ridimensionamento automatico dei PG

La modalità di scalabilità automatica dei PG
[autoscaler]
del pool. Se impostata su warn, produce un messaggio di avviso quando un pool ha un numero di PG non ottimale. Predefinito: warn.

Aggiungere come storage

Configura uno storage per VM o container utilizzando il nuovo pool. Predefinito: true (visibile solo alla creazione).

Advanced Options
Dimensione minima

Il numero minimo di repliche per oggetto. Ceph rifiuterà l'I/O sul pool se un PG ha un numero di repliche inferiore a questo valore. Predefinito: 2.

Regola CRUSH

La regola da utilizzare per il mapping del posizionamento degli oggetti nel cluster. Queste regole definiscono come i dati vengono posizionati all'interno del cluster. Vedere Ceph CRUSH e classi di device per informazioni sulle regole basate sui device.

Numero di PG

Il numero di placement group
[placement_groups]
che il pool dovrebbe avere all'inizio. Predefinito: 128.

Rapporto obiettivo

La proporzione di dati prevista nel pool. L'autoscaler dei PG utilizza questa proporzione in relazione alle altre proporzioni impostate. Ha la precedenza su target size se entrambi i parametri sono impostati.

Dimensione di destinazione

La quantità stimata di dati prevista nel pool. Il PG autoscaler utilizza questa dimensione per stimare il numero ottimale di PG.

Numero minimo di PG

Il numero minimo di placement group. Questa impostazione viene utilizzata per ottimizzare il limite inferiore del numero di PG per quel pool. Il PG autoscaler non unirà i PG sotto questa soglia.

Ulteriori informazioni sulla gestione dei pool Ceph sono disponibili nel manuale di Ceph pool operation
[Ceph pool operation https://docs.ceph.com/en/tentacle/rados/operations/pools/]
.

8.9.2. Pool con erasure coding

L'erasure coding (EC) è una forma di codici di "correzione d'errore in avanti" che consente di recuperare da una certa quantità di perdita di dati. I pool con erasure coding possono offrire più spazio utilizzabile rispetto ai pool replicati, ma lo fanno al prezzo delle prestazioni.

Per confronto: nei pool classici replicati, vengono memorizzate più repliche dei dati (size), mentre in un pool con erasure coding i dati vengono suddivisi in k chunk di dati con m chunk aggiuntivi di codifica (verifica). Questi chunk di codifica possono essere utilizzati per ricreare i dati nel caso in cui i chunk di dati risultino mancanti.

Il numero di chunk di codifica, m, definisce quanti OSD possono essere persi senza perdere alcun dato. La quantità totale di oggetti memorizzati è k + m.

Creazione di pool EC

I pool con erasure coding (EC) possono essere creati con lo strumento CLI pveceph. La pianificazione di un pool EC deve tenere conto del fatto che questi pool funzionano in modo diverso rispetto ai pool replicati.

Il min_size predefinito di un pool EC dipende dal parametro m. Se m = 1, il min_size del pool EC sarà k. Il min_size sarà k + 1 se m > 1. La documentazione di Ceph consiglia un min_size conservativo di k + 2
[Ceph Erasure Coded Pool Recovery https://docs.ceph.com/en/tentacle/rados/operations/erasure-code/#erasure-coded-pool-recovery]
.

Se sono disponibili meno OSD di min_size, qualsiasi I/O verso il pool verrà bloccato finché non saranno di nuovo disponibili OSD sufficienti.

Note Quando si pianifica un pool con erasure coding, tenere d'occhio il min_size, poiché definisce quanti OSD devono essere disponibili. In caso contrario, l'I/O verrà bloccato.

Ad esempio, un pool EC con k = 2 e m = 1 avrà size = 3, min_size = 2 e resterà operativo se un OSD si guasta. Se il pool è configurato con k = 2, m = 2, avrà size = 4 e min_size = 3 e resterà operativo se un OSD viene perso.

Per creare un nuovo pool EC, eseguire il seguente comando:

pveceph pool create <pool-name> --erasure-coding k=2,m=1

I parametri opzionali sono failure-domain e device-class. Se è necessario modificare le impostazioni del profilo EC utilizzate dal pool, sarà necessario creare un nuovo pool con un nuovo profilo.

Questo creerà un nuovo pool EC e il pool replicato necessario per memorizzare l'omap RBD e altri metadati. Al termine, saranno presenti un pool <pool name>-data e un pool <pool name>-metadata. Il comportamento predefinito prevede anche la creazione di una corrispondente configurazione di storage. Se tale comportamento non è desiderato, è possibile disabilitarlo fornendo il parametro --add_storages 0. Quando si configura lo storage manualmente, tenere presente che è necessario impostare il parametro data-pool. Solo in questo modo il pool EC verrà utilizzato per memorizzare gli oggetti dati. Ad esempio:

Note I parametri opzionali --size, --min_size e --crush_rule verranno utilizzati per il pool di metadati replicato, ma non per il pool di dati con erasure coding. Se è necessario modificare il min_size sul pool di dati, è possibile farlo successivamente. I parametri size e crush_rule non possono essere modificati sui pool con erasure coding.

Se è necessario personalizzare ulteriormente il profilo EC, è possibile farlo creandolo direttamente con gli strumenti Ceph
[Ceph Erasure Code Profile https://docs.ceph.com/en/tentacle/rados/operations/erasure-code/#erasure-code-profiles]
, e specificare il profilo da utilizzare con il parametro profile.

Ad esempio:

pveceph pool create <pool-name> --erasure-coding profile=<profile-name>
FastEC (allow_ec_optimizations)

Ceph Tentacle introduce un nuovo percorso I/O per erasure coding chiamato FastEC, abilitato per singolo pool tramite il flag allow_ec_optimizations. FastEC aggiunge letture parziali e scritture parziali sui pool EC, migliorando sensibilmente le prestazioni I/O casuali di piccole dimensioni, lo schema di accesso predominante dell'I/O su disco delle macchine virtuali. Il progetto upstream lo consiglia per lo storage basato su RBD e CephFS
[Ceph Erasure Code https://docs.ceph.com/en/tentacle/rados/operations/erasure-code/]
.

FastEC ha quattro requisiti che il monitor Ceph impone:

  • il pool deve utilizzare l'erasure coding;

  • il cluster deve avere require_osd_release impostato su tentacle o una versione successiva;

  • il profilo erasure code deve utilizzare una combinazione di plugin e tecnica che supporti il percorso EC ottimizzato:

    Plugin Tecnica FastEC

    isa

    reed_sol_van

    sì

    isa

    cauchy

    no

    jerasure

    reed_sol_van

    sì

    jerasure

    tutti gli altri

    no

    lrc

    (qualsiasi)

    no

    shec

    (qualsiasi)

    no

    clay

    (qualsiasi)

    no

  • la stripe unit del pool deve essere un multiplo di 4096 byte. La stripe unit predefinita soddisfa questo requisito, pertanto è rilevante solo per i pool creati con una stripe_unit personalizzata nel proprio profilo erasure code.

Se una precondizione non è soddisfatta, ceph osd pool set <pool>-data allow_ec_optimizations 1 restituisce un errore descrittivo — nessun degrado silenzioso.

pveceph non imposta esplicitamente il plugin o la tecnica durante la creazione di un profilo EC — entrambi vengono derivati dall'opzione del monitor osd_pool_default_erasure_code_profile (reed_sol_van per impostazione predefinita sia su Squid che su Tentacle). Il requisito relativo alla tecnica è quindi soddisfatto già nella configurazione predefinita, a meno che l'operatore non abbia modificato questa impostazione. Verificare con:

ceph config get mon osd_pool_default_erasure_code_profile

Se l'output mostra una tecnica diversa da reed_sol_van, aggiornare l'impostazione predefinita a livello di cluster oppure creare esplicitamente un profilo compatibile e passarlo tramite la proprietà profile durante la creazione del pool (vedere sopra).

Verificare la release del cluster con:

ceph osd dump | grep require_osd_release

Se viene segnalata una release precedente a tentacle, eseguire ceph osd require-osd-release tentacle dopo che tutti gli OSD sono stati aggiornati.

Important allow_ec_optimizations è un interruttore a senso unico. Una volta abilitato su un pool, il monitor Ceph si rifiuta di disattivare nuovamente il flag, pertanto il ripristino richiede lo svuotamento e la ricreazione del pool. Abilitarlo solo dopo aver verificato che FastEC funzioni per il proprio carico di lavoro su un pool di test.
Abilitazione di FastEC su un pool

FastEC viene abilitato per singolo pool tramite la CLI di ceph. Può essere impostato sia su pool nuovi che su pool esistenti (popolati). Non avviene alcuna migrazione dei dati o ri-codifica; vengono modificati solo i metadati del pool.

Per abilitare FastEC su un pool, eseguire il seguente comando sul pool dati (solitamente denominato <pool-name>-data):

ceph osd pool set <pool-name>-data allow_ec_optimizations 1

Verificare il risultato con:

ceph osd pool get <pool-name>-data allow_ec_optimizations

Lo stesso comando segnala lo stato attuale per qualsiasi pool EC, il che è utile durante l'audit di un cluster.

Quando il flag viene impostato su un pool popolato, è necessario tenere presente quanto segue:

  • Nuova elezione del primario. FastEC contrassegna gli shard dati da 1 a k-1 come non primari, pertanto i PG il cui primario si trovava su uno di quegli shard eseguiranno nuovamente il peering. Si tratta di un normale evento di peering che causa una breve pausa di I/O per ogni PG interessato.

  • Interazione con lo scrub. Il nuovo peering annulla qualsiasi scrub in corso sui PG interessati. Tali PG dovranno essere sottoposti nuovamente a scrub dopo il completamento del peering.

Aggiunta di pool EC come storage

È possibile aggiungere un pool EC già esistente come storage a Proxmox VE. Funziona allo stesso modo dell'aggiunta di un pool RBD, ma richiede l'opzione aggiuntiva data-pool.

pvesm add rbd <storage-name> --pool <replicated-pool> --data-pool <ec-pool>
Tip Non dimenticare di aggiungere le opzioni keyring e monhost per eventuali cluster Ceph esterni, non gestiti dal cluster Proxmox VE locale.

8.9.3. Distruzione dei pool

Per distruggere un pool tramite la GUI, selezionare un nodo nella visualizzazione ad albero e accedere al pannello Ceph → Pools. Selezionare il pool da distruggere e fare clic sul pulsante Destroy. Per confermare la distruzione del pool, è necessario digitare il nome del pool.

Eseguire il comando seguente per distruggere un pool. Specificare -remove_storages per rimuovere anche lo storage associato.

pveceph pool destroy <name>
Note L'eliminazione del pool viene eseguita in background e può richiedere del tempo. Si noterà una diminuzione dell'utilizzo dei dati nel cluster durante questo processo.

8.9.4. PG autoscaler

Il PG autoscaler permette al cluster di considerare la quantità di dati (previsti) memorizzati in ciascun pool e di scegliere automaticamente i valori pg_num appropriati. È disponibile a partire da Ceph Nautilus.

Potrebbe essere necessario attivare il modulo PG autoscaler prima che le modifiche possano avere effetto.

ceph mgr module enable pg_autoscaler

L'autoscaler è configurato per singolo pool e dispone delle seguenti modalità:

warn

Viene emesso un avviso sullo stato di integrità se il valore pg_num suggerito differisce eccessivamente dal valore attuale.

on

Il valore pg_num viene regolato automaticamente senza necessità di alcun intervento manuale.

off

Non viene effettuata alcuna regolazione automatica di pg_num e non viene emesso alcun avviso se il numero di PG non è ottimale.

Il fattore di scala può essere regolato per facilitare la futura memorizzazione dei dati con le opzioni target_size, target_size_ratio e pg_num_min.

Warning Per impostazione predefinita, l'autoscaler valuta se regolare il numero di PG di un pool se questo si discosta dal valore previsto di un fattore 3. Ciò comporta una variazione considerevole nella distribuzione dei dati e potrebbe generare un carico elevato sul cluster.

È possibile trovare un'introduzione più approfondita al PG autoscaler sul blog di Ceph - New in Nautilus: PG merging and autotuning.

8.10. Ceph CRUSH e classi di dispositivo

screenshot/gui-ceph-config.png

L'algoritmo
[https://ceph.com/assets/pdfs/weil-crush-sc06.pdf]
(Controlled Replication Under Scalable Hashing) è alla base di Ceph.

CRUSH calcola dove memorizzare e recuperare i dati. Questo presenta il vantaggio che non è necessario alcun servizio di indicizzazione centrale. CRUSH funziona utilizzando una mappa di OSD, bucket (posizioni dei dispositivi) e ruleset (replicazione dei dati) per i pool.

Note Ulteriori informazioni sono disponibili nella documentazione Ceph, nella sezione CRUSH map
[CRUSH map https://docs.ceph.com/en/tentacle/rados/operations/crush-map/]
.

Questa mappa può essere modificata per riflettere differenti gerarchie di replicazione. Le repliche degli oggetti possono essere separate (ad esempio, domini di guasto), mantenendo al contempo la distribuzione desiderata.

Una configurazione comune consiste nell'utilizzare diverse classi di disco per diversi pool Ceph. Per questo motivo, Ceph ha introdotto le classi di dispositivo con luminous, per soddisfare l'esigenza di una generazione semplificata dei ruleset.

Le classi di dispositivo sono visibili nell'output di ceph osd tree. Queste classi rappresentano un proprio root bucket, visibile con il comando seguente.

ceph osd crush tree --show-shadow

Output di esempio del comando precedente:

ID  CLASS WEIGHT  TYPE NAME
-16  nvme 2.18307 root default~nvme
-13  nvme 0.72769     host sumi1~nvme
 12  nvme 0.72769         osd.12
-14  nvme 0.72769     host sumi2~nvme
 13  nvme 0.72769         osd.13
-15  nvme 0.72769     host sumi3~nvme
 14  nvme 0.72769         osd.14
 -1       7.70544 root default
 -3       2.56848     host sumi1
 12  nvme 0.72769         osd.12
 -5       2.56848     host sumi2
 13  nvme 0.72769         osd.13
 -7       2.56848     host sumi3
 14  nvme 0.72769         osd.14

Per indicare a un pool di distribuire gli oggetti solo su una specifica classe di dispositivo, è necessario prima creare un ruleset per quella classe di dispositivo:

ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class>

<rule-name>

nome della regola, da collegare a un pool (visibile in GUI e CLI)

<root>

a quale root CRUSH deve appartenere (root Ceph predefinita "default")

<failure-domain>

a quale livello del dominio di guasto devono essere distribuiti gli oggetti (solitamente host)

<class>

quale tipo di storage backend OSD utilizzare (ad esempio, nvme, ssd, hdd)

Una volta che la regola è presente nella CRUSH map, è possibile indicare a un pool di utilizzare il ruleset.

ceph osd pool set <pool-name> crush_rule <rule-name>
Tip Se il pool contiene già oggetti, questi devono essere spostati di conseguenza. A seconda della configurazione, ciò potrebbe avere un forte impatto sulle prestazioni del cluster. In alternativa, è possibile creare un nuovo pool e spostare i dischi separatamente.
Warning Quando si utilizza l'autoscaler PG, tutti i pool nel cluster devono utilizzare regole CRUSH dello stesso tipo, specificando tutte una device class o nessuna. In caso contrario, l'autoscaler ignorerà i pool interessati e il relativo pg_num non verrà modificato.

8.11. Autenticazione Cephx

Cephx
[Protocollo di autorizzazione e autenticazione Cephx https://docs.ceph.com/en/tentacle/dev/cephx_protocol/]
protegge l'accesso a un cluster Ceph.

Ogni servizio e client Ceph, inclusi i consumer di storage e gli strumenti, si autentica su un monitor come utente Ceph, ad esempio client.admin o osd.3, utilizzando la chiave segreta a lungo termine di tale utente. Il monitor emette quindi credenziali temporanee chiamate ticket:

Termine Scopo

Chiave utente

Segreto a lungo termine utilizzato da un client o da un servizio Ceph per autenticarsi su un monitor.

Ticket del monitor

Consente a un utente Ceph autenticato di richiedere ticket per i servizi Ceph.

Ticket di servizio

Concede accesso temporaneo a un OSD, manager o metadata server.

Chiave di servizio rotante

Consente ai servizi Ceph di validare i ticket di servizio. I monitor sostituiscono automaticamente queste chiavi.

Un client in esecuzione legge solitamente la propria chiave utente solo all'avvio. L'aggiornamento di una chiave salvata o di un file keyring non aggiorna tale processo. I ticket e le connessioni esistenti possono inoltre rimanere utilizzabili per un certo periodo. Una rotazione delle chiavi deve pertanto tenere conto dei client in esecuzione e temporaneamente disconnessi.

8.11.1. Posizioni dei keyring

Il keyring client.admin autoritativo in un cluster Ceph Proxmox VE è /etc/pve/priv/ceph.client.admin.keyring, non la copia in /etc/ceph. Il file system cluster di Proxmox (pmxcfs) lo sincronizza su ogni nodo. Le credenziali per gli storage Ceph gestiti si trovano in /etc/pve/priv/ceph/.

I keyring in /var/lib/ceph appartengono a un singolo servizio Ceph e sono locali al relativo nodo. /etc/pve/priv/ceph.mon.keyring contiene sia la chiave condivisa mon. che client.admin. Gli aggiornamenti vanno sempre uniti a questo file invece di sovrascriverlo. pveceph mon create utilizza la relativa voce mon. quando inizializza un monitor.

8.11.2. Chiavi lockbox degli OSD cifrati

Ogni OSD cifrato utilizza un utente Ceph dedicato denominato client.osd-lockbox.<UUID>. La sua chiave di autenticazione è chiamata chiave lockbox. Non è la chiave di cifratura del disco stessa: consente all'OSD di recuperare tale chiave da Ceph e di sbloccare il proprio storage all'avvio. Ceph e il block device dell'OSD devono contenere copie corrispondenti della chiave lockbox.

Warning Non ruotare mai una chiave lockbox utilizzando solo ceph auth. Utilizzare lo strumento di migrazione, che verifica l'identità dell'OSD e aggiorna entrambe le copie insieme.

8.12. Client Ceph

screenshot/gui-ceph-log.png

Aggiungere uno storage RBD nell'interfaccia web per utilizzare un pool Ceph per i dischi di macchine virtuali e container. Per un cluster esterno, seguire le istruzioni di autenticazione per configurare un utente Ceph dedicato e il relativo keyring.

8.13. CephFS

Ceph fornisce anche un filesystem, che viene eseguito sullo stesso storage a oggetti utilizzato dai RADOS block device. Un Metadata Server (MDS) viene utilizzato per mappare gli oggetti basati su RADOS su file e directory, consentendo a Ceph di fornire un filesystem replicato conforme a POSIX. Ciò consente di configurare facilmente un filesystem condiviso, in cluster e ad alta disponibilità. I Metadata Server di Ceph garantiscono che i file siano distribuiti uniformemente sull'intero cluster Ceph. Di conseguenza, anche in caso di carico elevato non si sovraccarica un singolo host, cosa che può costituire un problema con gli approcci tradizionali ai filesystem condivisi, ad esempio NFS.

screenshot/gui-node-ceph-cephfs-panel.png

Proxmox VE supporta sia la creazione di un CephFS hyper-converged sia l'utilizzo di un CephFS esistente come storage per salvare backup, file ISO e template di container.

8.13.1. Server di metadati (MDS)

Per funzionare, CephFS richiede che sia configurato e in esecuzione almeno un Metadata Server. È possibile creare un MDS tramite il pannello Nodo -> CephFS della GUI web di Proxmox VE oppure da riga di comando con:

pveceph mds create

È possibile creare più metadata server in un cluster, ma con le impostazioni predefinite ne può essere attivo solo uno alla volta. Se un MDS o il suo nodo diventa non responsivo (o va in crash), un altro MDS in standby verrà promosso a active. È possibile velocizzare il passaggio tra l'MDS attivo e quello in standby utilizzando l'opzione del parametro hotstandby alla creazione, oppure, se è già stato creato, è possibile impostare/aggiungere:

mds standby replay = true

nella relativa sezione MDS di /etc/pve/ceph.conf. Con questa opzione abilitata, l'MDS specificato rimarrà in uno stato warm, interrogando quello attivo, in modo che possa subentrare più rapidamente in caso di problemi.

Note Questo polling attivo avrà un ulteriore impatto sulle prestazioni del sistema e dell'MDS attivo.
Multiple Active MDS

A partire da Luminous (12.2.x) è possibile avere più metadata server attivi contemporaneamente, ma questo è normalmente utile solo in presenza di un numero elevato di client in esecuzione in parallelo. Altrimenti l'MDS raramente rappresenta il collo di bottiglia in un sistema. Per configurare questa opzione, consultare la documentazione di Ceph.
[Configurazione di più demoni MDS attivi https://docs.ceph.com/en/tentacle/cephfs/multimds/]

8.13.2. Creazione di CephFS

Grazie all'integrazione di CephFS in Proxmox VE, è possibile creare facilmente un CephFS tramite l'interfaccia web, la CLI o un'interfaccia API esterna. Sono richiesti alcuni prerequisiti affinché questo funzioni:

Prerequisites for a successful CephFS setup:

Una volta completata questa operazione, è possibile creare un CephFS semplicemente tramite il pannello Nodo -> CephFS della GUI web oppure tramite lo strumento da riga di comando pveceph, ad esempio:

pveceph fs create --pg_num 128 --add-storage

Questo crea un CephFS denominato cephfs, utilizzando un pool per i dati denominato cephfs_data con 128 placement group e un pool per i metadati denominato cephfs_metadata con un quarto dei placement group del pool dati (32). Consultare il capitolo sui pool Ceph gestiti da Proxmox VE oppure visitare la documentazione di Ceph per maggiori informazioni sul numero di placement group (pg_num) appropriato per la propria configurazione
[placement_groups]
. Inoltre, il parametro --add-storage aggiungerà il CephFS alla configurazione dello storage di Proxmox VE dopo che è stato creato con successo.

8.13.3. Eliminazione di CephFS

Warning L'eliminazione di un CephFS renderà inutilizzabili tutti i suoi dati. Questa operazione non può essere annullata!

Per rimuovere completamente e correttamente un CephFS, sono necessari i seguenti passaggi:

  • Disconnettere ogni client non-Proxmox VE (ad esempio, smontare il CephFS nei guest).

  • Disabilitare tutte le voci di storage Proxmox VE relative a CephFS (per evitare che venga montato automaticamente).

  • Rimuovere dai guest tutte le risorse utilizzate (ad esempio, le ISO) presenti sul CephFS che si desidera eliminare.

  • Smontare manualmente gli storage CephFS su tutti i nodi del cluster con

    umount /mnt/pve/<STORAGE-NAME>

    Dove <STORAGE-NAME> è il nome dello storage CephFS nel proprio Proxmox VE.

  • A questo punto, assicurarsi che nessun metadata server (MDS) sia in esecuzione per quel CephFS, arrestandoli o eliminandoli. Questo può essere fatto tramite l'interfaccia web oppure tramite l'interfaccia a riga di comando; per quest'ultima occorre eseguire il seguente comando:

    pveceph stop --service mds.NAME

    per arrestarli, oppure

    pveceph mds destroy NAME

    per eliminarli.

    Si noti che i server in standby verranno automaticamente promossi ad attivi quando un MDS attivo viene arrestato o rimosso, pertanto è opportuno arrestare prima tutti i server in standby.

  • A questo punto è possibile eliminare il CephFS con

    pveceph fs destroy NAME --remove-storages --remove-pools

    Questo eliminerà automaticamente anche i pool Ceph sottostanti e rimuoverà gli storage dalla configurazione di pve.

Dopo questi passaggi, il CephFS dovrebbe essere completamente rimosso e, se sono presenti altre istanze di CephFS, i metadata server arrestati possono essere riavviati per fungere da standby.

8.14. Manutenzione di Ceph

8.14.1. Sostituzione degli OSD

Con i seguenti passaggi è possibile sostituire il disco di un OSD, che è una delle attività di manutenzione più comuni in Ceph. Se c'è un problema con un OSD mentre il suo disco sembra ancora essere sano, leggere prima la sezione sulla risoluzione dei problemi.

  1. Se il disco è guasto, procurarsi un disco di ricambio consigliato dello stesso tipo e dimensione.

  2. Eliminare l'OSD in questione.

  3. Scollegare il vecchio disco dal server e collegare quello nuovo.

  4. Creare nuovamente l'OSD.

  5. Dopo il ribilanciamento automatico, lo stato del cluster dovrebbe tornare a HEALTH_OK. Eventuali crash ancora elencati possono essere confermati eseguendo il seguente comando:

ceph crash archive-all

8.14.2. Trim/Discard

È buona norma eseguire regolarmente fstrim (discard) su VM e container. Questa operazione rilascia i blocchi di dati non più utilizzati dal filesystem. Riduce lo spazio occupato dai dati e il carico sulle risorse. La maggior parte dei sistemi operativi moderni invia regolarmente tali comandi discard ai propri dischi. È sufficiente assicurarsi che nelle macchine virtuali sia abilitata l'opzione discard del disco.

8.14.3. Scrub e deep scrub

Ceph garantisce l'integrità dei dati tramite lo scrubbing dei placement group. Ceph controlla ogni oggetto in un PG per verificarne lo stato. Esistono due forme di scrubbing: controlli giornalieri dei metadati a basso consumo di risorse e controlli settimanali approfonditi dei dati. Il deep scrub settimanale legge gli oggetti e utilizza i checksum per garantire l'integrità dei dati. Se uno scrub in esecuzione interferisce con le esigenze aziendali (in termini di prestazioni), è possibile modificare il momento in cui gli scrub
[Ceph scrubbing https://docs.ceph.com/en/tentacle/rados/configuration/osd-config-ref/#scrubbing]
vengono eseguiti.

8.14.4. Silenziare un controllo di stato

Silenziare un controllo di stato lo mantiene visibile ma lo esclude dallo stato complessivo di salute, rendendo più facile notare nuovi problemi. Ceph continua a valutare il controllo. Specificare una durata affinché un avviso rinviato ricompaia automaticamente, ad esempio dopo due settimane:

ceph health mute <CHECK> 2w

Nell'interfaccia web, espandere il controllo in Datacenter → Ceph, fare clic su Mute e impostare una durata. Il controllo rimane nell'elenco, contrassegnato come mute; utilizzare Unmute nello stesso punto per ripristinarlo prima della scadenza.

Per impostazione predefinita, il silenziamento viene annullato quando aumenta il numero di elementi interessati. Attivare Keep Mute, oppure aggiungere --sticky al comando, solo se il controllo deve rimanere silenziato in tal caso. Questo non modifica la durata: un silenziamento con l'opzione sticky e una durata prestabilita scade comunque.

Note Il mute non risolve la condizione. Il rischio viene accettato per tutta la durata del mute.

8.14.5. Migrazione delle chiavi Cephx da aes a aes256k

Questa sezione illustra come migrare le chiavi di proprietà del cluster e le chiavi degli utenti Ceph compatibili da aes a aes256k. Per una spiegazione sugli utenti Ceph, i ticket e l'archiviazione delle chiavi, vedere Autenticazione Cephx.

Perché compaiono i controlli di stato

Ceph Squid 19.2.6 e Ceph Tentacle 20.2.4 aggiungono controlli di stato per le chiavi e le credenziali di accesso temporanee che utilizzano il metodo di crittografia aes più vecchio. I controlli possono quindi apparire direttamente dopo un upgrade anche se il cluster funzionava senza avvisi in precedenza. Il metodo più vecchio è interessato da CVE-2025-30156. Per informazioni di contesto, consultare l'annuncio di rilascio upstream
[Ceph: Squid v19.2.6 e Tentacle v20.2.4 rilasciate https://ceph.io/en/news/blog/2026/v20-2-4-v19-2-6-combo-released/]
.

Due controlli impostano lo stato del cluster su HEALTH_ERR. Questo non significa che l'accesso allo storage sia fallito o che un servizio Ceph abbia smesso di funzionare. Seguire i passaggi riportati di seguito per migrare a aes256k e, quando tutti i client lo supportano, disabilitare il metodo vulnerabile.

Passaggi di migrazione

Lo strumento di assistenza per la migrazione controlla il cluster, ruota le chiavi e riprende il lavoro interrotto. Esaminare ogni dry run prima di applicarne il piano; aggiungere --verbose per ottenere inventari completi di nodi, keyring e dispositivi, oltre alle informazioni diagnostiche di ispezione.

Le riesecuzioni non ruotano nuovamente le chiavi già completate. Dopo ogni esecuzione, richiamare lo strumento senza opzioni per verificare lo stato attuale e seguire i passaggi successivi che vengono stampati.

Before You Begin
  • Aggiornare pve-manager alla versione 9.2.19 o successiva e installare i package Ceph più recenti su ogni nodo. La rotazione graduale delle chiavi client richiede Ceph 19.2.6-pve3, 20.2.4-pve3 o versioni successive su ogni monitor.

  • Completare quindi il riavvio graduale (rolling restart) di tutti i servizi Ceph.

  • Risolvere gli avvisi e gli errori di stato non elencati nel Riferimento ai controlli di stato. Assicurarsi che ogni nodo sia raggiungibile via SSH.

  • Eseguire lo strumento di assistenza come root su un solo nodo. Non avviare un'altra migrazione, un rolling restart, né modificare le chiavi Ceph con altri strumenti mentre è in esecuzione. Il blocco (lock) dello strumento non impedisce i comandi di autenticazione Ceph diretti.

  • Se Cephx è disabilitato su questo cluster, seguire invece Cluster con Cephx disabilitato.

1. Migrazione delle chiavi di proprietà del cluster

Esaminare la migrazione delle chiavi di proprietà del cluster nella modalità dry-run predefinita:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys --rotate-cluster-keys

Se il piano non segnala alcun blocco, applicare la stessa selezione:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys --rotate-cluster-keys --apply

Lo strumento di supporto ruota le chiavi del manager, del server di metadati, dell'OSD, del monitor, del bootstrap, del crash e le chiavi del lockbox degli OSD cifrati. Riavvia i servizi uno alla volta quando necessario, inclusi i monitor. Le chiavi degli utenti di storage e client.admin rimangono invariate, i ticket esistenti restano validi e il vecchio cifrario resta abilitato.

Dopo che Ceph aggiorna lo stato di salute, i due controlli di gravità errore si risolvono. L'avviso relativo alla rotazione delle chiavi di servizio può rimanere per alcune ore mentre le vecchie chiavi in rotazione scadono. Non è necessario attendere la risoluzione di questo avviso prima di continuare con la migrazione.

2. Migrazione delle chiavi degli utenti Ceph compatibili
Check compatibility

Diversi carichi di lavoro possono condividere un unico utente Ceph. Migrare la relativa chiave solo quando tutti i client supportano aes256k, inclusi i client disconnessi ed esterni. I programmi Ceph dei package Proxmox VE aggiornati lo supportano; i client kernel richiedono una versione del kernel in esecuzione 7.0 o successiva.

Macchina virtuale con dischi RBD

Spazio utente, salvo quando krbd è abilitato.

Container su RBD

Sempre il client kernel.

Mount CephFS

Kernel, salvo quando fuse è abilitato.

Verificare anche i sistemi esterni. Se un client interessato è incompatibile o sconosciuto, lasciare invariata la chiave del suo utente e rinviare questo passaggio.

Stage the keys

Utilizzare --rotate-all-storage-keys per gli utenti dedicati degli storage RBD locali e CephFS gestiti, insieme a --rotate-admin-key per client.admin, che la riga di comando e gli storage senza un proprio utente condividono. Ogni client di questi utenti è interessato; gli storage di cluster esterni sono esclusi.

Lo strumento di supporto prepara ciascuna nuova chiave e la scrive nel keyring gestito e nei file dei segreti. Entrambe le chiavi rimangono valide fino alla conferma, consentendo ai client di aggiornarsi prima che la vecchia chiave venga ritirata. Se un monitor non può mantenere valide entrambe le chiavi, lo strumento di supporto rifiuta la preparazione e indica il monitor da aggiornare o riavviare.

Rivedere il piano combinato:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys \
    --rotate-all-storage-keys --rotate-admin-key

Se il piano non segnala alcun blocco, applicarlo:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys \
    --rotate-all-storage-keys --rotate-admin-key --apply

Finché una chiave è in attesa di conferma, non aggiungere monitor né eseguirne il downgrade o modificare le chiavi di quell'utente con altri strumenti. Il relativo avviso AUTH_INSECURE_CLIENT_KEY_TYPE persiste finché la conferma non rende corrente la nuova chiave e invalida quella precedente.

Refresh Clients
  • Eseguire la migrazione a caldo delle macchine virtuali interessate nell'interfaccia web, oppure arrestarle e avviarle. Un riavvio del guest non è sufficiente.

  • Arrestare e avviare i container interessati e gli altri client RBD.

  • Lasciare terminare backup, ripristini, importazioni di dischi e clonazioni sullo storage Ceph prima della conferma; queste operazioni possono mantenere la chiave con cui sono iniziate.

  • Lo strumento di supporto aggiorna i mount CephFS inattivi e lascia invariati i mount occupati o che non rispondono. Una volta che non vengono più utilizzati, rieseguire lo strumento di supporto con --apply per riprovare i mount in sospeso. Se le macchine virtuali hanno ISO collegate da un mount CephFS, potrebbe essere necessario scollegare le ISO o migrare le macchine virtuali interessate su un nodo diverso per poter aggiornare il mount CephFS su quel nodo.

  • Per i client esterni a Proxmox VE, distribuire la credenziale preparata dai file delle chiavi gestiti, quindi riavviare o rimontare tali client.

Lo strumento di supporto segnala le sessioni che potrebbero ancora contenere una vecchia chiave. I suggerimenti relativi ai client sono a livello di host, non un'attribuzione di sessione o un inventario completo dei workload. I socket senza un processo proprietario sono elencati separatamente. Verificare personalmente i client disconnessi e le copie esterne delle chiavi.

3. Completare o sospendere la migrazione

Eseguire una simulazione finale per verificare eventuali sessioni con la vecchia chiave ancora presenti. Viene proposto un comando di conferma quando i controlli effettuati hanno esito positivo, ma non è possibile verificare client disconnessi o copie esterne della chiave.

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys
Warning I client che necessitano ancora di una vecchia chiave o di un vecchio cifrario non possono autenticarsi dopo questo passaggio. Le operazioni di I/O in corso possono sembrare funzionanti fino a una riconnessione e poi fallire. Non utilizzare --force per aggirare una condizione bloccante.

Dopo aver verificato i client disconnessi e le copie esterne, eseguire esattamente il comando stampato dalla simulazione. Quando ogni rotazione è pronta e nessuna chiave richiede il vecchio cifrario, verranno stampate le opzioni --apply --confirm-all-clients-refreshed --restrict-ciphers.

Se un client rimane incompatibile, mantenere invariata la sua chiave e il vecchio cifrario abilitato piuttosto che limitarlo. È possibile disattivare gli avvisi residui nell'attesa che tali client vengano aggiornati.

Utilizzare pveceph auth status per i cifrari delle chiavi correnti e in sospeso, poiché ceph auth ls non elenca le chiavi in sospeso.

Note /etc/pve/priv/cephx-key-migration.json registra l'avanzamento e contiene vecchie chiavi segrete. Proteggerlo e conservarlo finché la migrazione non è completa e ogni client non è stato aggiornato. Eliminarlo prima comporta la perdita delle informazioni necessarie per riprendere la migrazione.
Dettagli aggiuntivi sulla migrazione
Riferimento ai controlli di salute
Controllo di integrità Significato Azione

AUTH_INSECURE_SERVICE_KEY_TYPE

Una chiave di servizio Ceph utilizza il vecchio cifrario.

Eseguire la migrazione a carico del cluster. Questo controllo ha gravità di errore.

AUTH_INSECURE_SERVICE_TICKETS

I monitor emettono ticket di servizio con il vecchio cifrario.

Eseguire la migrazione a carico del cluster. Questo controllo ha gravità di errore.

AUTH_INSECURE_CLIENT_KEY_TYPE

La chiave attiva di un utente Ceph utilizza il vecchio cifrario. Un utente in fase di staging resta elencato finché la sua rotazione non viene confermata.

Ruotare le chiavi degli utenti compatibili e confermarle, oppure disattivare l'avviso.

AUTH_INSECURE_ROTATING_SERVICE_KEY_TYPE

Una chiave di servizio in rotazione utilizza il vecchio cifrario.

Continuare la migrazione; le vecchie chiavi in rotazione scadono automaticamente e non impediscono la restrizione finale del cifrario.

AUTH_INSECURE_KEYS_ALLOWED

I monitor accettano il vecchio cifrario.

Completare la migrazione, oppure disattivare l'avviso finché rimangono client precedenti.

AUTH_INSECURE_KEYS_CREATABLE

I monitor possono creare chiavi con il vecchio cifrario.

Completare la migrazione, oppure disattivare l'avviso finché rimangono client precedenti.

Cluster con Cephx disabilitato

Ceph valuta questi controlli di integrità in base alle chiavi memorizzate e alle impostazioni del cifrario, anche quando Cephx è disabilitato, cioè quando auth_cluster_required, auth_service_required e auth_client_required sono impostati su none. Disabilitare Cephx quindi non li elimina, e modificare il metodo di autenticazione interrompe i client esistenti, che necessitano di un riavvio o di un nuovo mount in seguito.

Su un cluster con Cephx disabilitato:

  1. Eseguire lo strumento ausiliario senza opzioni e applicare il piano proposto. Esegue la migrazione delle chiavi di manager, metadata server e OSD, riavviando i servizi uno alla volta quando necessario, e passa i ticket di servizio al nuovo cifrario. Questo risolve entrambi i controlli con gravità di errore. Se una vecchia chiave mon. è memorizzata nel database di autenticazione, lo strumento ausiliario si rifiuta e richiede di eseguire prima la migrazione di quella chiave.

  2. Opzionalmente, eseguire la migrazione delle chiavi di bootstrap e crash con --rotate-client-keys.

  3. Disattivare gli avvisi rimanenti senza una durata. Mentre Cephx è disabilitato, lo strumento ausiliario non esegue la migrazione delle chiavi di altri utenti Ceph, poiché i loro client non si autenticano con Cephx:

    ceph health mute AUTH_INSECURE_CLIENT_KEY_TYPE --sticky
    ceph health mute AUTH_INSECURE_KEYS_ALLOWED --sticky
    ceph health mute AUTH_INSECURE_KEYS_CREATABLE --sticky

Non limitare manualmente i cifrari consentiti né impedire la creazione di chiavi con il vecchio cifrario mentre il cifrario preferito è ancora aes, poiché la creazione di chiavi fallirebbe.

Prima di riabilitare Cephx, riattivare le segnalazioni di questi controlli e assicurarsi che ogni monitor, servizio Ceph e client disponga ancora di un file di chiave corrispondente al database di autenticazione. Riavviare prima i monitor, poi tutti gli altri servizi Ceph e riavviare o rimontare i client. Quindi eseguire la migrazione come descritto in Passaggi di migrazione.

Chiavi in fase di staging e conferma

Lo strumento ausiliario disabilita la promozione automatica delle chiavi client in attesa, in modo che i monitor mantengano valide entrambe le credenziali. Un monitor più vecchio promuoverebbe una chiave in fase di staging al suo primo utilizzo, terminando il periodo di tolleranza per l'intero cluster. Lo strumento ausiliario quindi esegue lo staging solo quando ogni monitor supporta la funzionalità e verifica nuovamente questa condizione a ogni esecuzione.

Con --apply, --confirm-all-clients-refreshed rende corrente ogni chiave in fase di staging e invalida la chiave precedente. Il controllo iniziale rifiuta l'intero batch se una rotazione aperta non è pronta. Lo strumento ausiliario verifica quindi nuovamente ogni chiave prima di ritirare la credenziale precedente. Se un client ritorna durante il batch, le rotazioni completate restano confermate e la chiave bloccata resta in fase di staging. Per confermare separatamente gli utenti pronti, utilizzare --confirm-clients-refreshed <USER> con --apply.

I monitor Ceph 19.2.6-pve4 e 20.2.4-pve4 o più recenti possono identificare la chiave di ogni sessione, consentendo ai client aggiornati di rimanere connessi durante la conferma di avanzamento o di rollback. Aggiornare e riavviare i monitor più vecchi per utilizzare questa funzionalità. Senza l'identificazione della chiave, ogni client visibile di quell'utente deve disconnettersi prima della conferma; l'aggiornamento è preferibile per un utente condiviso come client.admin.

Copie delle chiavi per client esterni

Per un client esterno al cluster locale, copiare la credenziale in fase di staging dal file gestito per il suo utente Ceph:

  • Keyring RBD: /etc/pve/priv/ceph/<STORAGE_ID>.keyring

  • Segreto CephFS in formato grezzo: /etc/pve/priv/ceph/<STORAGE_ID>.secret

  • Keyring amministrativo: /etc/pve/priv/ceph.client.admin.keyring

Utilizzare la credenziale di tale utente, non client.admin come sostituto. Trasferirla in modo sicuro e aggiornare ogni copia salvata prima di aggiornare il client. Lo storage supportato da un cluster esterno è diverso: l'helper non ruota mai le chiavi di tale cluster. Seguire la procedura di rotazione delle chiavi del relativo amministratore.

Uno storage con monhost impostato viene considerato esterno anche se i relativi monitor appartengono al cluster locale, pertanto l'helper non aggiorna la copia della chiave corrispondente. Se tale copia contiene la chiave di un utente Ceph soggetto a migrazione, aggiornarla con la chiave in staging dello stesso utente prima di confermare, oppure con la chiave ripristinata prima di confermare un rollback. L'helper rifiuta di ritirare una chiave che trova in una copia della chiave di uno storage; verificare manualmente le copie che non è in grado di controllare.

L'helper elenca separatamente gli utenti locali non gestiti da Proxmox VE. Seguire la procedura di rotazione supportata dal relativo client, oppure lasciare invariate le relative chiavi e mantenere abilitato il cifrario precedente.

Ripristinare una chiave client in staging

Per ripristinare un utente in staging alla relativa chiave corrente:

  1. Eseguire l'helper con --abort-staged-key <USER> --apply. Viene ripristinata la chiave corrente in tutte le copie gestite, mentre entrambe le credenziali rimangono valide.

  2. Aggiornare tutti i client riportandoli a tale chiave, inclusi i client disconnessi e le copie delle chiavi esterne. L'helper ripete i tentativi sui mount CephFS gestiti, come durante la migrazione in avanti.

  3. Eseguire l'helper con --confirm-abort-clients-refreshed <USER> --apply per ritirare la chiave in staging. L'helper rifiuta l'operazione se la raccolta delle sessioni dei monitor è incompleta, se una sessione visibile utilizza la chiave in staging, se la relativa chiave è sconosciuta oppure se una copia della chiave di uno storage contiene ancora la chiave in staging.

Override di emergenza del cifrario

Normalmente i monitor utilizzano l'elenco auth_allowed_ciphers memorizzato nella MonMap per decidere quali cifrari delle chiavi possono autenticarsi. L'opzione di avvio locale mon_auth_emergency_allowed_ciphers sostituisce tale elenco per un monitor. Può consentire temporaneamente il cifrario di una chiave amministrativa esistente dopo che una restrizione errata ha escluso gli amministratori
[Ceph: Emergency Allowed Ciphers https://docs.ceph.com/en/tentacle/rados/configuration/auth-config-ref/#emergency-allowed-ciphers]
.

Ceph genera AUTH_EMERGENCY_CIPHERS_SET mentre questo override è configurato. L'helper rifiuta la restrizione finale perché la modifica della MonMap non avrebbe effetto. Utilizzare l'override solo per ripristinare l'accesso, quindi correggere la configurazione normale, rimuoverlo da /etc/pve/ceph.conf, e riavviare tutti i monitor prima del dry run finale.

Esecuzioni interrotte e fallback manuale

Dopo un'interruzione, eseguire l'helper senza opzioni non appena i nodi interessati sono raggiungibili. Gli aggiornamenti delle chiavi non completati possono riprendere mentre i rispettivi daemon sono fermi. Mantenere inalterato il journal e seguire i passaggi successivi indicati, invece di avviare una rotazione manuale. Verificare i nodi interessati e i log dei servizi, invece di presumere che la chiave di un daemon non attivo necessiti di una correzione.

Se l'helper continua a non riuscire a procedere, installare l'ultima versione di pve-manager e riprovare. Contattare il supporto Proxmox prima di modificare il journal o i keyring, oppure prima di utilizzare la procedura upstream di migrazione delle chiavi Cephx
[Documentazione di Ceph: https://docs.ceph.com/en/tentacle/rados/configuration/auth-config-ref/#cephx-upgrade]
. Tale procedura modifica il database di autenticazione di Ceph, ma non tiene conto di questi dettagli specifici di Proxmox VE:

  • Assicurarsi che ogni copia della chiave gestita in /etc/pve/priv e /var/lib/ceph contenga la chiave accettata da Ceph. Unire le modifiche in /etc/pve/priv/ceph.mon.keyring; non sovrascriverlo mai.

  • Aggiornare la chiave lockbox di un OSD crittografato sia nel database di autenticazione che nel relativo tag LVM del block device. Il keyring temporaneo non è la copia persistente.

  • Aggiornare ogni client prima di invalidare la relativa chiave utente Ceph precedente.

  • Ruotare client.admin per ultimo e preparare un utente di ripristino testato in modo indipendente prima di modificarlo.

Utilizzare i comandi manuali di rotazione delle chiavi o di restrizione del cifrario solo con un piano di ripristino completo e testato che copra tutti i punti precedenti.

8.14.6. Arresto del cluster Proxmox VE + Ceph HCI

Per arrestare l'intero cluster Proxmox VE + Ceph, arrestare prima tutti i client Ceph. Questi saranno principalmente VM e container. Se sono presenti client aggiuntivi che potrebbero accedere a un Ceph FS o a un RADOS GW installato, arrestare anche questi. I guest ad alta disponibilità passano allo stato stopped quando vengono arrestati tramite gli strumenti di Proxmox VE.

Una volta che tutti i client, le VM e i container sono spenti o non accedono più al cluster Ceph, verificare che il cluster Ceph sia in uno stato integro, tramite l'interfaccia Web o la CLI:

ceph -s

Per evitare qualsiasi recovery durante le fasi di spegnimento e successiva accensione, abilitare il flag OSD noout. È possibile farlo nel pannello Ceph → OSD, tramite il pulsante Manage Global Flags, oppure da CLI:

ceph osd set noout

Iniziare a spegnere i nodi senza monitor (MON). Dopo che questi nodi sono spenti, continuare spegnendo i nodi con i monitor.

Quando si accende il cluster, avviare prima i nodi con i monitor (MON). Una volta che tutti i nodi sono attivi e funzionanti, verificare che tutti i servizi Ceph siano attivi e funzionanti. Alla fine, il solo avviso che dovrebbe essere visibile per Ceph è che il flag noout è ancora impostato. È possibile disabilitarlo tramite l'interfaccia web o tramite CLI:

ceph osd unset noout

È ora possibile avviare i guest. I guest ad alta disponibilità cambieranno il proprio stato in started quando si accendono.

8.14.7. Modifiche di rete

È possibile modificare le reti utilizzate da Ceph in un setup HCI senza alcun downtime se sia la rete vecchia che quella nuova possono essere configurate contemporaneamente.

La procedura differisce in base a quale rete si desidera modificare.

Note Attenzione! È fondamentale che la modifica delle reti utilizzate da Ceph venga eseguita con attenzione. In caso contrario potrebbe causare un cluster Ceph non funzionante, con conseguente downtime per ripristinarlo in uno stato operativo! Si consiglia di eseguire una prova della procedura in un cluster di test (virtuale) prima di modificare l'infrastruttura di produzione.

Dopo che la nuova rete è stata configurata su tutti gli host, assicurarsi di testarla prima di procedere con le modifiche. Un modo è eseguire il ping di tutti gli host sulla nuova rete. Se si utilizza un MTU elevato, assicurarsi di testare anche che funzioni. Ad esempio inviando pacchetti ping che risultino in un pacchetto finale della dimensione massima dell'MTU.

Per testare un MTU di 9000, sono necessarie le seguenti dimensioni dei pacchetti:

Note Si presuppone una configurazione di rete semplice. In setup più complessi, potrebbe essere necessario configurare un MTU inferiore per tenere conto di eventuali header che potrebbero essere aggiunti una volta che un pacchetto lascia l'host.
IPv4

L'overhead di IP e ICMP è di 28 byte; la dimensione del pacchetto risultante per il ping è quindi di 8972 byte.

IPv6

L'overhead è di 48 byte e la dimensione del pacchetto risultante è di 8952 byte.

Il comando ping risultante avrà questo aspetto per un IPv4:

ping -M do -s 8972 {target IP}

Quando si passa da reti IPv4 a reti IPv6, è necessario assicurarsi che le seguenti opzioni nel file ceph.conf siano impostate correttamente su true o false. Queste opzioni di configurazione determinano se i servizi Ceph devono eseguire il bind su indirizzi IPv4 o IPv6.

ms_bind_ipv4 = true
ms_bind_ipv6 = false
Modificare la rete pubblica Ceph

La rete pubblica Ceph è il canale di comunicazione principale in un cluster Ceph tra i vari servizi e i client (ad esempio, una VM). Passare a una rete diversa non è così semplice come modificare la rete cluster di Ceph. Il motivo principale è che, oltre alla configurazione nel file ceph.conf, i MON (monitor) di Ceph dispongono di una configurazione interna in cui tengono traccia di tutti gli altri MON che fanno parte del cluster, la monmap.

Pertanto, la procedura per modificare la rete pubblica Ceph è un po' più complessa:

  1. Modificare public_network nel file /etc/pve/ceph.conf (non modificare nessun altro valore)

  2. Riavviare i servizi non MON: OSD, MGR e MDS su un host

  3. Attendere che Ceph torni a HEALTH_OK

  4. Verificare che i servizi stiano utilizzando la nuova rete

  5. Continuare a riavviare i servizi sull'host successivo

  6. Distruggere un MON

  7. Ricreare il MON

  8. Attendere che Ceph torni a HEALTH_OK

  9. Continuare a distruggere e ricreare i MON

Occorre prima modificare il file /etc/pve/ceph.conf. Modificare la riga public_network in modo che corrisponda alla nuova subnet.

public_network = 10.9.9.30/24
Warning Non modificare la riga mon_host né alcuna sezione [mon.HOSTNAME]. Queste verranno aggiornate automaticamente quando i MON vengono distrutti e ricreati.
Note Non preoccuparsi se i bit dell'host (ad esempio, l'ultimo ottetto) sono impostati per impostazione predefinita: la netmask in notazione CIDR definisce la parte di rete.

Dopo aver modificato la rete, è necessario riavviare i servizi non MON nel cluster perché le modifiche abbiano effetto. Farlo un nodo alla volta! Per riavviare tutti i servizi non MON su un nodo, è possibile utilizzare i seguenti comandi su quel nodo. Ceph dispone di target systemd per ogni tipo di servizio.

systemctl restart ceph-osd.target
systemctl restart ceph-mgr.target
systemctl restart ceph-mds.target
Note I daemon MDS (Metadata Server) sono presenti solo se si utilizza CephFS.
Note Dopo il riavvio del primo servizio OSD, la GUI segnalerà che l'OSD non è più raggiungibile. Non si tratta di un problema; le VM possono comunque raggiungerlo. Il motivo del messaggio è che il servizio MGR non riesce più a raggiungere l'OSD. L'errore scomparirà dopo il riavvio dei servizi MGR.
Warning Non riavviare gli OSD su più host contemporaneamente. È probabile che per alcuni PG (placement group), 2 delle (predefinite) 3 repliche risultino non disponibili. Ciò comporterà l'arresto delle operazioni di I/O fino a quando il numero minimo richiesto (min_size) di repliche non sarà di nuovo disponibile.

Per verificare che i servizi siano in ascolto sulla nuova rete, è possibile eseguire il seguente comando su ciascun nodo:

ss -tulpn | grep ceph
Note Poiché gli OSD saranno in ascolto anche sulla rete del cluster Ceph, è normale che anche quella rete appaia nell'output di ss -tulpn.

Una volta che il cluster Ceph è tornato in uno stato di salute completo (HEALTH_OK) e i servizi sono in ascolto sulla nuova rete, continuare a riavviare i servizi sull'host.

Gli ultimi servizi che devono essere spostati sulla nuova rete sono i MON di Ceph stessi. Il modo più semplice è distruggere e ricreare ogni monitor uno alla volta. In questo modo, ogni riferimento ad esso nel ceph.conf e nella monmap interna del monitor viene gestito automaticamente.

Distruggere il primo MON e crearlo di nuovo. Attendere alcuni istanti prima di continuare con il MON successivo nel cluster, e assicurarsi che il cluster segnali HEALTH_OK prima di procedere.

Una volta ricreati tutti i MON, è possibile verificare che ogni riferimento ai MON nel file ceph.conf indichi la nuova rete. Ciò riguarda principalmente la riga mon_host e le sezioni [mon.HOSTNAME].

Un ultimo ss -tulpn | grep ceph dovrebbe mostrare che la vecchia rete non è più utilizzata da alcun servizio Ceph.

Modificare la rete del cluster Ceph

La rete del cluster Ceph viene utilizzata per il traffico di replica tra gli OSD. Pertanto, può essere vantaggioso collocarla su una rete fisica veloce dedicata.

La procedura complessiva è la seguente:

  1. Modificare cluster_network nel file /etc/pve/ceph.conf

  2. Riavviare gli OSD su un host

  3. Attendere che Ceph torni a HEALTH_OK

  4. Verificare che gli OSD utilizzino la nuova rete

  5. Continuare a riavviare gli OSD sull'host successivo

Occorre prima modificare il file /etc/pve/ceph.conf. Modificare la riga cluster_network in modo che corrisponda alla nuova subnet.

cluster_network = 10.9.9.30/24
Note Non preoccuparsi se i bit dell'host (ad esempio, l'ultimo ottetto) sono impostati per impostazione predefinita; la netmask in notazione CIDR definisce la parte di rete.

Dopo aver modificato la rete, è necessario riavviare gli OSD nel cluster affinché le modifiche abbiano effetto. Procedere con un nodo alla volta! Per riavviare tutti gli OSD su un nodo, è possibile utilizzare il seguente comando dalla CLI su quel nodo:

systemctl restart ceph-osd.target
Warning Non riavviare gli OSD su più host contemporaneamente. È probabile che per alcuni PG (placement group), 2 delle (predefinite) 3 repliche risultino non disponibili. Ciò comporterà l'arresto delle operazioni di I/O fino a quando il numero minimo richiesto (min_size) di repliche non sarà di nuovo disponibile.

Per verificare che i servizi OSD siano in ascolto sulla nuova rete, è possibile sia controllare la scheda Dettagli OSD → Rete nel pannello Ceph → OSD, sia eseguire il seguente comando sull'host:

ss -tulpn | grep ceph-osd
Note Poiché gli OSD saranno in ascolto anche sulla rete pubblica Ceph, è normale che anche quella rete appaia nell'output di ss -tulpn.

Una volta che il cluster Ceph è tornato in uno stato di salute completo (HEALTH_OK) e gli OSD sono in ascolto sulla nuova rete, continuare a riavviare gli OSD sull'host successivo.

8.15. Monitoraggio e risoluzione dei problemi di Ceph

È importante monitorare costantemente lo stato di salute di un'installazione Ceph dall'inizio, sia utilizzando gli strumenti Ceph sia accedendo allo stato tramite l'API di Proxmox VE.

I seguenti comandi Ceph possono essere utilizzati per verificare se il cluster è in buono stato (HEALTH_OK), se sono presenti avvisi (HEALTH_WARN), o anche errori (HEALTH_ERR). Se il cluster si trova in uno stato non integro, i comandi di stato riportati di seguito forniranno anche una panoramica degli eventi correnti e delle azioni da adottare. Per interrompere la loro esecuzione, premere CTRL-C.

Osservare costantemente lo stato del cluster:

watch ceph --status

Visualizzare lo stato del cluster una sola volta (senza aggiornamento) e aggiungere continuamente righe di eventi di stato:

ceph --watch

8.15.1. Risoluzione dei problemi

Questa sezione include informazioni di risoluzione dei problemi frequentemente utilizzate. Ulteriori informazioni sono disponibili sul sito ufficiale di Ceph alla sezione Troubleshooting
[Ceph troubleshooting https://docs.ceph.com/en/tentacle/rados/troubleshooting/]
.

Relevant Logs on Affected Node

I crash dei servizi Ceph possono essere elencati e visualizzati in dettaglio eseguendo i seguenti comandi:

ceph crash ls
ceph crash info <crash_id>

I crash contrassegnati come nuovi possono essere confermati eseguendo:

ceph crash archive-all

Per ottenere una visualizzazione più dettagliata, ogni servizio Ceph dispone di un file di log in /var/log/ceph/. Se è richiesto un maggiore livello di dettaglio, il livello di log può essere modificato
[Ceph log and debugging https://docs.ceph.com/en/tentacle/rados/troubleshooting/log-and-debug/]
.

Common Causes of Ceph Problems
  • Problemi di rete come congestione, uno switch guasto, un'interfaccia disattivata o un firewall che blocca il traffico. Verificare che tutti i nodi Proxmox VE siano raggiungibili in modo affidabile sulla rete cluster corosync e sulla rete pubblica e cluster Ceph.

  • Componenti del disco o della connessione che sono:

    • difettosi

    • non montato saldamente

    • prestazioni I/O insufficienti in caso di carico elevato (ad esempio in caso di utilizzo di HDD, hardware consumer o controller RAID non consigliati)

  • Mancato rispetto delle raccomandazioni per un cluster Ceph in buono stato.

Common Ceph Problems
OSD down/in crash

Un OSD difettoso viene segnalato come down e, nella maggior parte dei casi, (automaticamente) out 10 minuti più tardi. A seconda della causa, può anche tornare automaticamente up e in. Per provare un’attivazione manuale tramite l’interfaccia web, andare su Qualsiasi nodo → Ceph → OSD, selezionare l’OSD e fare clic su Start, In e Reload. Quando si utilizza la shell, eseguire il seguente comando sul nodo interessato:

ceph-volume lvm activate --all

Per attivare un OSD guasto, può essere necessario riavviare in modo sicuro il nodo in questione oppure, come ultima risorsa, ricreare o sostituire l’OSD.

9. Replica dello storage

Lo strumento da riga di comando pvesr gestisce il framework di replica dello storage di Proxmox VE. La replica dello storage garantisce ridondanza per i guest che utilizzano storage locale e riduce i tempi di migrazione.

Replica i volumi guest su un altro nodo in modo che tutti i dati siano disponibili senza l’utilizzo di storage condiviso. La replica utilizza gli snapshot per minimizzare il traffico inviato sulla rete. Pertanto, i nuovi dati vengono inviati solo in modo incrementale dopo la sincronizzazione completa iniziale. In caso di guasto di un nodo, i dati del guest sono comunque disponibili sul nodo replicato.

La replica viene eseguita automaticamente a intervalli configurabili. L’intervallo minimo di replica è di un minuto, mentre l’intervallo massimo è di una volta a settimana. Il formato utilizzato per specificare tali intervalli è un sottoinsieme degli eventi calendario di systemd, vedere la sezione Formato di pianificazione:

È possibile replicare un guest su più nodi di destinazione, ma non due volte sullo stesso nodo di destinazione.

La larghezza di banda di ciascuna replica può essere limitata, per evitare di sovraccaricare uno storage o un server.

È necessario trasferire solo le modifiche avvenute dopo l’ultima replica (i cosiddetti delta) se il guest viene migrato su un nodo verso cui è già replicato. Ciò riduce significativamente il tempo necessario. La direzione della replica si inverte automaticamente se si migra un guest verso il nodo di destinazione della replica.

Ad esempio: VM100 si trova attualmente su nodeA e viene replicata su nodeB. Migrandola su nodeB, viene ora automaticamente replicata all’indietro da nodeB a nodeA.

Se si effettua la migrazione verso un nodo su cui il guest non è replicato, è necessario trasferire tutti i dati del disco. Dopo la migrazione, il job di replica continua a replicare questo guest sui nodi configurati.

Important

L’alta disponibilità è consentita in combinazione con la replica dello storage, ma può verificarsi una certa perdita di dati tra l’ultimo momento di sincronizzazione e il momento del guasto di un nodo.

9.1. Tipi di storage supportati

Tabella 16. Tipi di storage
Descrizione Tipo di plugin Snapshot Stabile

ZFS (locale)

zfspool

sì

sì

9.2. Formato di pianificazione

La replica utilizza gli eventi calendario per configurare la pianificazione.

9.3. Gestione degli errori

Se un job di replica riscontra problemi, viene posto in uno stato di errore. In questo stato, gli intervalli di replica configurati vengono sospesi temporaneamente. La replica non riuscita viene ritentata ripetutamente a un intervallo di 30 minuti. Una volta riuscita, la pianificazione originale viene riattivata.

9.3.1. Possibili problemi

Di seguito sono elencati alcuni dei problemi più comuni. In base alla configurazione, può esserci un’altra causa.

  • La rete non funziona.

  • Non è rimasto spazio libero sullo storage di destinazione della replica.

  • Lo storage con lo stesso ID di storage non è disponibile sul nodo di destinazione.

Note È sempre possibile utilizzare il log di replica per individuare la causa del problema.

9.3.2. Migrazione di un guest in caso di errore

In caso di errore grave, un guest virtuale potrebbe rimanere bloccato su un nodo guasto. È quindi necessario spostarlo manualmente su un nodo funzionante.

9.3.3. Esempio

Si supponga di avere due guest (VM 100 e CT 200) in esecuzione sul nodo A e replicati sul nodo B. Il nodo A si guasta e non può tornare online. A questo punto è necessario migrare il guest sul nodo B manualmente.

  • connettersi al nodo B via ssh oppure aprire la sua shell tramite l'interfaccia web

  • verificare che il cluster abbia il quorum

    # pvecm status
  • Se non è presente il quorum, si consiglia vivamente di risolvere prima questo problema e rendere nuovamente operativo il nodo. Solo se ciò non è possibile al momento, è possibile utilizzare il comando seguente per forzare il quorum sul nodo corrente:

    # pvecm expected 1
Warning Evitare a ogni costo modifiche che influiscono sul cluster quando sono impostati i voti previsti (ad esempio l'aggiunta/rimozione di nodi, storage, guest virtuali). Utilizzarlo solo per rimettere in funzione i guest essenziali o per risolvere il problema di quorum stesso.
  • spostare entrambi i file di configurazione dei guest dal nodo di origine A al nodo B:

    # mv /etc/pve/nodes/A/qemu-server/100.conf /etc/pve/nodes/B/qemu-server/100.conf
    # mv /etc/pve/nodes/A/lxc/200.conf /etc/pve/nodes/B/lxc/200.conf
  • Ora è possibile avviare nuovamente i guest:

    # qm start 100
    # pct start 200

Ricordarsi di sostituire i VMID e i nomi dei nodi con i rispettivi valori.

9.4. Gestione dei job

screenshot/gui-qemu-add-replication-job.png

È possibile utilizzare l'interfaccia web per creare, modificare ed eliminare facilmente i job di replica. In alternativa, è possibile utilizzare lo strumento da riga di comando (CLI) pvesr.

Il pannello di replica è disponibile a tutti i livelli (datacenter, nodo, guest virtuale) nell'interfaccia web. Essi differiscono per i job mostrati: tutti, specifici per nodo o specifici per guest.

Quando si aggiunge un nuovo job, è necessario specificare il guest, se non già selezionato, e il nodo di destinazione. La pianificazione della replica può essere impostata se non si desidera il valore predefinito di ogni 15 minuti. È possibile imporre un limite di velocità su un job di replica. Il limite di velocità può aiutare a mantenere accettabile il carico sullo storage.

Un job di replica è identificato da un ID univoco a livello di cluster. Questo ID è composto dal VMID più un numero di job. Questo ID deve essere specificato manualmente solo se si utilizza lo strumento CLI.

9.5. Rete

Per impostazione predefinita, il traffico di replica passa attraverso la stessa rete del traffico di migrazione dei guest. Se la rete di migrazione non è impostata, verrà a sua volta utilizzata di default la rete di gestione.

Per utilizzare una rete diversa per il traffico di replica, configurare la Rete di replica nell'interfaccia web in Datacenter -> Opzioni -> Impostazioni di replica oppure impostare la proprietà replication nel file datacenter.cfg:

# use dedicated replication network
replication: secure,network=10.1.2.0/24

9.6. Esempi di interfaccia a riga di comando

Creare un job di replica che viene eseguito ogni 5 minuti con una larghezza di banda limitata a 10 Mbps (megabyte al secondo) per il guest con ID 100.

# pvesr create-local-job 100-0 pve1 --schedule "*/5" --rate 10

Disabilitare un job attivo con ID 100-0.

# pvesr disable 100-0

Abilitare un job disattivato con ID 100-0.

# pvesr enable 100-0

Modificare l'intervallo di pianificazione del job con ID 100-0 a una volta all'ora.

# pvesr update 100-0 --schedule '*/00'

10. Macchine virtuali QEMU/KVM

QEMU (forma abbreviata di Quick Emulator) è un hypervisor open source che emula un computer fisico. Dal punto di vista del sistema host su cui è in esecuzione QEMU, QEMU è un programma utente che ha accesso a diverse risorse locali come partizioni, file, schede di rete, che vengono poi passate a un computer emulato che le vede come se fossero dispositivi reali.

Un sistema operativo guest in esecuzione nel computer emulato accede a questi dispositivi e funziona come se fosse in esecuzione su hardware reale. Ad esempio, è possibile passare un'immagine ISO come parametro a QEMU e il sistema operativo in esecuzione nel computer emulato vedrà un vero CD-ROM inserito in un'unità CD.

QEMU può emulare una grande varietà di hardware, da ARM a Sparc. Sugli host x86, Proxmox VE si occupa dell'emulazione di cloni PC a 32 bit e 64 bit, poiché rappresentano la stragrande maggioranza dell'hardware server. Sugli host arm64, Proxmox VE emula invece macchine ARM a 64 bit (aarch64). Emulare la stessa architettura dell'host è anche una delle opzioni più veloci, grazie alla disponibilità di estensioni del processore che accelerano notevolmente QEMU quando l'architettura emulata corrisponde all'architettura dell'host.

Note A volte si può incontrare il termine KVM (Kernel-based Virtual Machine). Significa che QEMU è in esecuzione con il supporto delle estensioni del processore per la virtualizzazione, tramite il modulo Linux KVM. Nel contesto di Proxmox VE, QEMU e KVM possono essere usati in modo interscambiabile, poiché QEMU in Proxmox VE tenterà sempre di caricare il modulo KVM.

QEMU all'interno di Proxmox VE viene eseguito come processo root, poiché ciò è richiesto per accedere ai dispositivi a blocchi e PCI.

10.1. Dispositivi emulati e dispositivi paravirtualizzati

L'hardware PC emulato da QEMU include una scheda madre, controller di rete, controller SCSI, IDE e SATA, porte seriali (l'elenco completo è disponibile nella pagina man kvm(1)), tutti emulati via software. Tutti questi dispositivi sono l'esatto equivalente software dei dispositivi hardware esistenti e, se il sistema operativo in esecuzione nel guest dispone dei driver appropriati, utilizzerà i dispositivi come se fosse in esecuzione su hardware reale. Ciò consente a QEMU di eseguire sistemi operativi non modificati.

Questo tuttavia comporta un costo in termini di prestazioni, poiché eseguire in software ciò che era destinato a essere eseguito in hardware implica un notevole lavoro aggiuntivo per la CPU host. Per mitigare questo aspetto, QEMU può presentare al sistema operativo guest dei dispositivi paravirtualizzati, in cui il sistema operativo guest riconosce di essere in esecuzione all'interno di QEMU e collabora con l'hypervisor.

QEMU si basa sullo standard di virtualizzazione virtio, ed è quindi in grado di presentare dispositivi virtio paravirtualizzati, che includono un controller disco generico paravirtualizzato, una scheda di rete paravirtualizzata, una porta seriale paravirtualizzata, un controller SCSI paravirtualizzato, ecc. …

Tip È fortemente consigliato utilizzare i dispositivi virtio ogniqualvolta possibile, poiché offrono un notevole miglioramento delle prestazioni e sono generalmente meglio mantenuti. L'uso del controller disco generico virtio rispetto a un controller IDE emulato raddoppia il throughput di scrittura sequenziale, come misurato con bonnie++(8). L'uso dell'interfaccia di rete virtio può offrire un throughput fino a tre volte superiore rispetto a una scheda di rete Intel E1000 emulata, come misurato con iperf(1).
[Vedere questo benchmark sul wiki KVM https://www.linux-kvm.org/page/Using_VirtIO_NIC]

10.2. Impostazioni delle macchine virtuali

In generale Proxmox VE cerca di scegliere valori predefiniti sensati per le macchine virtuali (VM). Assicurarsi di comprendere il significato delle impostazioni che si modificano, poiché la loro modifica potrebbe ridurre le prestazioni o mettere a rischio i dati.

10.2.1. Impostazioni generali

screenshot/gui-create-vm-general.png

Le impostazioni generali di una VM includono

  • il Nodo: il server fisico su cui la VM verrà eseguita

  • il VM ID: un numero univoco in questa installazione di Proxmox VE utilizzato per identificare la VM

  • Nome: una stringa di testo libero che può essere utilizzata per descrivere la VM

  • Pool di risorse: un gruppo logico di VM

10.2.2. Impostazioni del sistema operativo

screenshot/gui-create-vm-os.png

Durante la creazione di una macchina virtuale (VM), impostare il sistema operativo (OS) corretto consente a Proxmox VE di ottimizzare alcuni parametri di basso livello. Ad esempio, i sistemi operativi Windows si aspettano che l'orologio del BIOS utilizzi l'ora locale, mentre i sistemi operativi basati su Unix si aspettano che l'orologio del BIOS abbia l'ora UTC.

10.2.3. Impostazioni di sistema

Alla creazione della VM è possibile modificare alcuni componenti di sistema di base della nuova VM. È possibile specificare quale tipo di display si desidera utilizzare.

screenshot/gui-create-vm-system.png

Inoltre, è possibile modificare il controller SCSI. Se si prevede di installare il QEMU Guest Agent, oppure se l'immagine ISO selezionata lo fornisce già e lo installa automaticamente, può essere utile selezionare la casella QEMU Agent, che consente a Proxmox VE di sapere che può utilizzare le sue funzionalità per mostrare maggiori informazioni e completare alcune azioni (ad esempio, arresto o snapshot) in modo più intelligente.

Proxmox VE consente di avviare le VM con diversi firmware e tipi di macchina, ovvero SeaBIOS e OVMF. Nella maggior parte dei casi conviene passare dal SeaBIOS predefinito a OVMF solo se si prevede di utilizzare il passthrough PCIe. Sugli host arm64 OVMF è l'opzione predefinita e unica, poiché SeaBIOS è disponibile solo per x86.

Tipo di macchina

Il Tipo di macchina di una VM definisce la struttura hardware della scheda madre virtuale della VM. È possibile scegliere tra il chipset predefinito Intel 440FX e il chipset Q35, che fornisce anche un bus PCIe virtuale e può quindi essere preferibile se si desidera eseguire il passthrough di hardware PCIe. Inoltre, è possibile selezionare un'implementazione vIOMMU.

Note I chipset Intel 440FX e Q35 sono specifici per i guest x86. Sugli host arm64, le macchine virtuali utilizzano il tipo di macchina virt, che modella una macchina ARM generica basata su UEFI.
Versione della macchina

Ogni tipo di macchina è versionato in QEMU e un determinato binario QEMU supporta molte versioni di macchina. Le nuove versioni possono introdurre il supporto per nuove funzionalità, correzioni o miglioramenti generali. Tuttavia, modificano anche le proprietà dell'hardware virtuale. Per evitare cambiamenti improvvisi dal punto di vista del guest e garantire la compatibilità dello stato della VM, la live migration e gli snapshot con RAM continueranno a utilizzare la stessa versione di macchina nella nuova istanza QEMU.

Per i guest Windows, la versione della macchina viene fissata durante la creazione, poiché Windows è sensibile ai cambiamenti dell'hardware virtuale, anche tra riavvii a freddo. Ad esempio, l'enumerazione dei dispositivi di rete potrebbe essere diversa con versioni di macchina differenti. Altri sistemi operativi come Linux riescono generalmente a gestire tali cambiamenti senza problemi. Per questi, viene utilizzata per impostazione predefinita la versione di macchina Latest. Ciò significa che, dopo un avvio pulito, viene utilizzata la versione di macchina più recente supportata dal binario QEMU (ad esempio, la versione di macchina più recente supportata da QEMU 8.1 è la versione 8.1 per ciascun tipo di macchina).

La versione della macchina viene utilizzata anche come misura di sicurezza durante l'implementazione di nuove funzionalità o correzioni che modificherebbero il layout hardware, per garantire la compatibilità con le versioni precedenti. Per le operazioni su una VM in esecuzione, come le migrazioni live, la versione della macchina in esecuzione viene salvata per garantire che la VM possa essere ripristinata esattamente com'era, non solo dal punto di vista della virtualizzazione QEMU, ma anche in termini di come Proxmox VE creerà l'istanza della macchina virtuale QEMU.

PVE Machine Revision

A volte Proxmox VE deve apportare modifiche al layout hardware o modificare opzioni senza attendere una nuova release di QEMU. Per questo, Proxmox VE ha aggiunto una revisione downstream aggiuntiva nella forma +pveX. In queste revisioni, X è 0 per ogni nuova versione macchina QEMU e viene omesso in questo caso, ad es. la versione macchina pc-q35-9.2 sarebbe la stessa della versione macchina pc-q35-9.2+pve0.

Se Proxmox VE desidera modificare il layout hardware o un'opzione predefinita, la revisione viene incrementata e utilizzata per i guest appena creati o, al riavvio, per le VM che utilizzano sempre l'ultima versione macchina.

Deprecazione della versione macchina QEMU

A partire da QEMU 10.1, le versioni macchina vengono rimosse da QEMU upstream dopo 6 anni. In Proxmox VE, le release principali avvengono approssimativamente ogni 2 anni, quindi una release principale di Proxmox VE supporterà le versioni macchina delle circa due precedenti release principali di Proxmox VE.

Prima di eseguire l'upgrade a una nuova release principale di Proxmox VE, è consigliabile aggiornare le configurazioni delle VM per evitare tutte le versioni macchina che verranno eliminate durante la successiva release principale di Proxmox VE. Questo garantisce che i guest possano ancora essere utilizzati durante tutto il ciclo di vita di quella release. Vedere la sezione Aggiornamento a una versione macchina più recente.

La politica di rimozione non è ancora in vigore per Proxmox VE 8, quindi la baseline per le versioni macchina supportate è 2.4. Si prevede che l'ultima versione binaria di QEMU rilasciata per Proxmox VE 9 sia QEMU 11.2. Questo binario QEMU rimuoverà il supporto per le versioni macchina precedenti alla 6.0, quindi 6.0 è la baseline per il ciclo di vita della release Proxmox VE 9. Si prevede che la baseline aumenti di 2 versioni principali per ogni release principale di Proxmox VE, ad esempio 8.0 per Proxmox VE 10.

Aggiornamento a una versione macchina più recente

Se viene visualizzato un avviso di deprecazione, è consigliabile modificare la versione macchina con una più recente. Assicurarsi di disporre prima di un backup funzionante ed essere preparati a modifiche al modo in cui il guest vede l'hardware. In alcuni scenari, potrebbe essere necessaria la reinstallazione di determinati driver. È inoltre consigliabile verificare la presenza di snapshot con RAM che sono stati creati con queste versioni macchina (ossia la voce di configurazione runningmachine). Purtroppo, non è possibile modificare la versione macchina di uno snapshot, quindi sarà necessario caricare lo snapshot per recuperare eventuali dati da esso.

10.2.4. Disco rigido

Bus/controller

QEMU è in grado di emulare diversi controller di storage:

Tip Si consiglia vivamente di utilizzare il controller VirtIO SCSI o VirtIO Block per motivi di performance e perché sono meglio mantenuti.
  • il controller IDE ha un design che risale al controller disco PC/AT del 1984. Anche se questo controller è stato superato da design più recenti, ogni sistema operativo immaginabile lo supporta, rendendolo un'ottima scelta per chi desidera eseguire un OS rilasciato prima del 2003. È possibile collegare fino a 4 dispositivi su questo controller.

  • il controller SATA (Serial ATA), risalente al 2003, presenta un design più moderno, che consente un throughput più elevato e un maggior numero di dispositivi collegabili. È possibile collegare fino a 6 dispositivi su questo controller.

  • il controller SCSI, progettato nel 1985, si trova comunemente su hardware di livello server e può collegare fino a 14 dispositivi di storage. Proxmox VE emula per impostazione predefinita un controller LSI 53C895A.

    Se l'obiettivo sono le prestazioni, si consiglia di utilizzare un controller SCSI di tipo VirtIO SCSI single e di abilitare l'impostazione IO Thread per i dischi collegati. Questa è l'impostazione predefinita per le VM Linux appena create a partire da Proxmox VE 7.3. Ogni disco avrà il proprio controller VirtIO SCSI e QEMU gestirà l'I/O dei dischi in un thread dedicato. Le distribuzioni Linux supportano questo controller dal 2012 e FreeBSD dal 2014. Per i sistemi operativi Windows, è necessario fornire un'immagine ISO aggiuntiva contenente i driver durante l'installazione.

  • Il controller VirtIO Block, spesso chiamato semplicemente VirtIO o virtio-blk, è un tipo più vecchio di controller paravirtualizzato. È stato superato dal controller VirtIO SCSI in termini di funzionalità.

Formato immagine

Su ciascun controller si collega un certo numero di dischi rigidi emulati, il cui contenuto è memorizzato in un file o in un dispositivo a blocchi presente nello storage configurato. La scelta di un tipo di storage determinerà il formato dell'immagine del disco rigido. Gli storage che presentano dispositivi a blocchi (LVM, ZFS, Ceph) richiederanno il formato raw per le immagini disco, mentre gli storage basati su file (come Ext4, XFS, NFS o CIFS) consentiranno di scegliere tra il formato raw per le immagini disco e il formato QEMU per le immagini disco.

  • il formato immagine QEMU è un formato copy on write che consente snapshot e thin provisioning dell'immagine disco.

  • l'immagine disco raw è un'immagine bit per bit di un disco rigido, simile a ciò che si otterrebbe eseguendo il comando dd su un dispositivo a blocchi in Linux. Questo formato non supporta di per sé il thin provisioning o gli snapshot, richiedendo la collaborazione del livello di storage per queste attività. Può tuttavia essere fino al 10% più veloce del formato immagine QEMU.
    [Per i dettagli, vedere questo benchmark https://events.static.linuxfound.org/sites/events/files/slides/CloudOpen2013_Khoa_Huynh_v3.pdf]

  • il formato immagine VMware ha senso solo se si intende importare/esportare l'immagine disco verso altri hypervisor.

Modalità cache

Impostare la modalità Cache del disco rigido influirà sul modo in cui il sistema host notificherà ai sistemi guest il completamento delle scritture dei blocchi. L'impostazione predefinita No cache indica che al sistema guest verrà notificato il completamento di una scrittura quando ogni blocco raggiunge la coda di scrittura dello storage fisico, ignorando la page cache dell'host. Ciò fornisce un buon equilibrio tra sicurezza e velocità.

Se si desidera che il backup manager di Proxmox VE salti un disco durante l'esecuzione di un backup di una VM, è possibile impostare l'opzione No backup su quel disco.

Se si desidera che il meccanismo di replica dello storage di Proxmox VE salti un disco all'avvio di un job di replica, è possibile impostare l'opzione Skip replication su quel disco. A partire da Proxmox VE 5.0, la replica richiede che le immagini disco si trovino su uno storage di tipo zfspool, quindi l'aggiunta di un'immagine disco ad altri storage quando la VM ha la replica configurata richiede di saltare la replica per questa immagine disco.

Trim/Discard

Se lo storage supporta il thin provisioning (vedere il capitolo sullo storage nella guida di Proxmox VE), è possibile attivare l'opzione Discard su un'unità. Con Discard impostato e un sistema operativo guest con TRIM abilitato
[TRIM, UNMAP e discard https://en.wikipedia.org/wiki/Trim_%28computing%29]
, quando il filesystem della VM contrassegna i blocchi come inutilizzati dopo l'eliminazione dei file, il controller trasmetterà questa informazione allo storage, che ridurrà quindi l'immagine disco di conseguenza. Perché il guest sia in grado di emettere comandi TRIM, è necessario abilitare l'opzione Discard sull'unità. Alcuni sistemi operativi guest potrebbero inoltre richiedere l'impostazione del flag SSD Emulation. Si noti che Discard sulle unità VirtIO Block è supportato solo su guest che utilizzano Linux Kernel 5.0 o superiore.

Se si desidera che un'unità venga presentata al guest come unità a stato solido piuttosto che come disco rigido rotazionale, è possibile impostare l'opzione SSD emulation su quell'unità. Non è richiesto che lo storage sottostante sia effettivamente basato su SSD; questa funzionalità può essere utilizzata con supporti fisici di qualsiasi tipo. Si noti che SSD emulation non è supportata sulle unità VirtIO Block.

Thread di I/O

L'opzione IO thread può essere utilizzata solo quando si usa un disco con uno dei seguenti controller bus/dispositivo:

  • SCSI, se il tipo di controller SCSI emulato è VirtIO SCSI single, oppure

  • VirtIO Block

Con IO thread abilitato, QEMU crea un thread di I/O per ogni controller di storage invece di gestire tutto l'I/O nel loop di eventi principale o nei thread vCPU. Un vantaggio è una migliore distribuzione del lavoro e un migliore utilizzo dello storage sottostante. Un altro vantaggio è la riduzione della latenza (blocchi) nel guest per carichi di lavoro host molto intensivi in termini di I/O, poiché né il thread principale né un thread vCPU possono essere bloccati dall'I/O del disco.

10.2.5. CPU

screenshot/gui-create-vm-cpu.png

Un socket CPU è uno slot fisico sulla scheda madre di un PC in cui è possibile collegare una CPU. Questa CPU può quindi contenere uno o più core, che sono unità di elaborazione indipendenti. Avere un singolo socket CPU con 4 core o due socket CPU con due core è per lo più irrilevante dal punto di vista delle prestazioni. Tuttavia alcune licenze software dipendono dal numero di socket di una macchina, in tal caso è opportuno impostare il numero di socket a quanto consentito dalla licenza.

Aumentare il numero di CPU virtuali (core e socket) fornisce solitamente un miglioramento delle prestazioni, sebbene ciò dipenda fortemente dall'utilizzo della VM. Le applicazioni multi-thread beneficeranno naturalmente di un numero elevato di CPU virtuali, poiché per ogni CPU virtuale aggiunta, QEMU creerà un nuovo thread di esecuzione sul sistema host. Se non si è certi del carico di lavoro della VM, è generalmente prudente impostare il numero di Total cores a 2.

Note È perfettamente sicuro se il numero complessivo di core di tutte le VM è superiore al numero di core presenti sul server (ad esempio, 4 VM con 4 core ciascuna (= totale 16) su una macchina con solo 8 core). In questo caso il sistema host distribuirà i thread di esecuzione di QEMU tra i core del server, proprio come se si stesse eseguendo un'applicazione multi-thread standard. Tuttavia, Proxmox VE impedisce di avviare VM con un numero di core CPU virtuali superiore a quello fisicamente disponibile, in quanto ciò comporterebbe solo una diminuzione delle prestazioni a causa del costo dei cambi di contesto.
Limiti delle risorse

cpulimit

Oltre al numero di core virtuali, il tempo CPU totale dell'host disponibile per la VM può essere impostato con l'opzione cpulimit. Si tratta di un valore a virgola mobile che rappresenta il tempo CPU in percentuale, quindi 1.0 corrisponde a 100%, 2.5 a 250% e così via. Se un singolo processo utilizzasse completamente un unico core, avrebbe un utilizzo del tempo CPU del 100%. Se una VM con quattro core utilizzasse tutti i suoi core a piena capacità, teoricamente utilizzerebbe il 400%. In realtà l'utilizzo può essere anche un po' superiore, poiché QEMU può avere thread aggiuntivi per le periferiche della VM oltre a quelli dei core vCPU.

Questa impostazione può essere utile quando una VM deve disporre di più vCPU perché sta eseguendo alcuni processi in parallelo, ma la VM nel suo complesso non deve poter eseguire tutte le vCPU al 100% contemporaneamente.

Ad esempio, si supponga di avere una macchina virtuale che beneficerebbe di 8 CPU virtuali, ma che non deve poter saturare tutti gli 8 core a pieno carico, poiché ciò sovraccaricherebbe il server e lascerebbe ad altre macchine virtuali e container troppo poco tempo CPU. Per risolvere questo problema, è possibile impostare cpulimit a 4.0 (=400%). Ciò significa che se la VM utilizza completamente tutte le 8 CPU virtuali eseguendo 8 processi simultaneamente, ogni vCPU riceverà al massimo il 50% del tempo CPU dai core fisici. Tuttavia, se il carico di lavoro della VM utilizza completamente solo 4 CPU virtuali, potrebbe ancora ricevere fino al 100% del tempo CPU da un core fisico, per un totale del 400%.

Note Le VM possono, in base alla loro configurazione, utilizzare thread aggiuntivi, ad esempio per operazioni di rete o I/O, ma anche per la migrazione live. Pertanto una VM può risultare in uso per un tempo CPU superiore a quello che potrebbero utilizzare le sole CPU virtuali. Per garantire che una VM non utilizzi mai più tempo CPU di quanto consentito dalle vCPU assegnate, impostare cpulimit sullo stesso valore del numero totale di core.

cpuunits

Con l'opzione cpuunits, oggi spesso chiamata CPU shares o CPU weight, è possibile controllare quanto tempo CPU riceve una VM rispetto ad altre VM in esecuzione. Si tratta di un peso relativo che per impostazione predefinita è 100 (o 1024 se l'host utilizza il cgroup v1 legacy). Se questo valore viene aumentato per una VM, questa verrà considerata prioritaria dallo scheduler rispetto ad altre VM con peso inferiore.

Ad esempio, se la VM 100 ha impostato il valore predefinito 100 e la VM 200 è stata modificata a 200, quest'ultima VM 200 riceverebbe il doppio della banda CPU rispetto alla prima VM 100.

Per maggiori informazioni consultare man systemd.resource-control, dove CPUQuota corrisponde a cpulimit e CPUWeight corrisponde all'impostazione cpuunits. Consultare la sezione Notes per riferimenti e dettagli implementativi.

affinity

Con l'opzione affinity, è possibile specificare i core CPU fisici utilizzati per eseguire le vCPU della VM. I processi periferici della VM, come quelli per l'I/O, non sono influenzati da questa impostazione. Si noti che l'affinità CPU non è una funzionalità di sicurezza.

Forzare un'affinità CPU può avere senso in determinati casi, ma è accompagnato da un aumento della complessità e dello sforzo di manutenzione. Ad esempio, se in seguito si desidera aggiungere altre VM o migrare le VM su nodi con meno core CPU. Ciò può anche facilmente portare a prestazioni di sistema asincrone e quindi limitate se alcune CPU sono completamente utilizzate mentre altre sono quasi inattive.

L'affinità viene impostata tramite lo strumento CLI taskset. Accetta i numeri dei core CPU dell'host (vedere lscpu) nel List Format descritto in man cpuset. Questo elenco decimale ASCII può contenere numeri ma anche intervalli di numeri. Ad esempio, l'affinità 0-1,8-11 (espansa in 0, 1, 8, 9, 10, 11) consentirebbe alla VM di essere eseguita solo su questi sei specifici core dell'host.

Tipo di CPU

QEMU può emulare diversi tipi di CPU, dal 486 fino ai più recenti processori Xeon. Ogni nuova generazione di processori aggiunge nuove funzionalità, come il rendering 3d assistito dall'hardware, la generazione di numeri casuali, la protezione della memoria, ecc. Inoltre, una generazione attuale può essere aggiornata tramite aggiornamento del microcodice con correzioni di bug o di sicurezza.

Di norma è opportuno selezionare per la VM un tipo di processore che corrisponda strettamente alla CPU del sistema host, poiché ciò significa che le funzionalità della CPU host (chiamate anche CPU flags) saranno disponibili nelle VM. Per una corrispondenza esatta, è possibile impostare il tipo di CPU su host, nel qual caso la VM avrà esattamente i medesimi CPU flags del sistema host.

Questo presenta però uno svantaggio. Se si desidera eseguire una live migration delle VM tra host diversi, la VM potrebbe trovarsi su un nuovo sistema con un tipo di CPU diverso o una diversa versione del microcodice. Se i CPU flags passati al guest risultano mancanti, il processo QEMU si interrompe. Per porre rimedio a questo, QEMU dispone anche di propri tipi di CPU virtuali, che Proxmox VE utilizza per impostazione predefinita.

Il valore predefinito del backend è kvm64, che funziona praticamente su tutte le CPU host x86_64, mentre il valore predefinito dell'interfaccia utente durante la creazione di una nuova VM è x86-64-v2-AES, che richiede una CPU host a partire da Westmere per Intel o almeno un Opteron di quarta generazione per AMD.

Note I modelli di CPU kvm64 e x86-64-v* descritti qui sono esclusivi per x86. Su host arm64, i guest utilizzano modelli di CPU ARM: host per esporre la CPU fisica (consigliato sull'hardware supportato), oppure un modello generico come max, insieme al tipo di macchina virt.

In breve:

Se la live migration non è rilevante, oppure si dispone di un cluster omogeneo in cui tutti i nodi hanno la stessa CPU e la stessa versione di microcodice, impostare il tipo di CPU su host, poiché in teoria ciò garantisce le massime prestazioni per i guest.

Se la live migration e la sicurezza sono rilevanti, e sono presenti solo CPU Intel oppure solo CPU AMD, scegliere il modello di CPU di generazione più bassa del cluster.

Se la live migration è rilevante ma non la sicurezza, oppure il cluster è misto Intel/AMD, scegliere il tipo di CPU virtuale QEMU compatibile più basso.

Note Non è garantito che le live migration tra CPU host Intel e AMD funzionino.
Tipi di CPU QEMU

QEMU fornisce inoltre tipi di CPU virtuali, compatibili sia con le CPU host Intel che AMD.

Note Per mitigare la vulnerabilità Spectre per i tipi di CPU virtuali, è necessario aggiungere i relativi CPU flags; vedere CPU flags relativi a Meltdown / Spectre.

In passato, Proxmox VE utilizzava il modello di CPU kvm64, con flag della CPU abilitati al livello del Pentium 4, pertanto le prestazioni non erano ottimali per alcuni carichi di lavoro.

Nell'estate del 2020, AMD, Intel, Red Hat e SUSE hanno collaborato per definire tre livelli di microarchitettura x86-64 al di sopra della baseline x86-64, con flag moderni abilitati. Per i dettagli, vedere la specifica x86-64-ABI.

Note Alcune distribuzioni più recenti, come CentOS 9, sono ora compilate con i flag x86-64-v2 come requisito minimo.
  • kvm64 (x86-64-v1): compatibile con CPU Intel >= Pentium 4, CPU AMD >= Phenom.

  • x86-64-v2: compatibile con CPU Intel >= Nehalem, CPU AMD >= Opteron_G3. CPU flags aggiunti rispetto a x86-64-v1: +cx16, +lahf-lm, +popcnt, +pni, +sse4.1, +sse4.2, +ssse3.

  • x86-64-v2-AES: compatibile con CPU Intel >= Westmere, CPU AMD >= Opteron_G4. CPU flags aggiunti rispetto a x86-64-v2: +aes.

  • x86-64-v3: compatibile con CPU Intel >= Haswell, CPU AMD >= EPYC. CPU flags aggiunti rispetto a x86-64-v2-AES: +avx, +avx2, +bmi1, +bmi2, +f16c, +fma, +movbe, +xsave.

  • x86-64-v4: compatibile con CPU Intel >= Skylake, CPU AMD >= EPYC v4 Genoa. CPU flags aggiunti rispetto a x86-64-v3: +avx512f, +avx512bw, +avx512cd, +avx512dq, +avx512vl.

Tipi di CPU personalizzati

È possibile definire tipi di CPU personalizzati configurando il modello base, il produttore, i bit dell'indirizzo fisico e l'attivazione o disattivazione di ciascun flag, per poi assegnarli alle VM come un tipo integrato. I tipi personalizzati sono referenziati nella configurazione di una VM come custom-<name>.

È possibile gestirli in Datacenter -> Custom CPU Models nell'interfaccia web. La finestra di dialogo del modello include una griglia per la modifica dei flag con ricerca a testo libero nei nomi e nelle descrizioni dei flag, un selettore dell'acceleratore (kvm/tcg) e un selettore multiplo dei nodi che evidenzia i flag attualmente segnalati come supportati da ciascun nodo selezionato del cluster, utile per individuare quali flag sarebbero effettivamente disponibili sugli host di destinazione prima di confermare un modello. La stessa griglia viene riutilizzata nella finestra di dialogo di modifica Processor della singola VM, dove è limitata ai flag impostabili per singola VM; i flag configurati non riconosciuti dall'API o non supportati dall'acceleratore selezionato vengono visualizzati in cima con un avviso.

I tipi di CPU personalizzati continuano a basarsi sul file di configurazione /etc/pve/virtual-guest/cpu-models.conf e possono essere gestiti anche dalla CLI; per il formato, vedere man cpu-models.conf.

L'accesso a un modello personalizzato è controllato per ciascun modello tramite il percorso ACL /mapping/cpu/<name>. Mapping.Audit consente a un utente di vedere il modello negli elenchi, Mapping.Modify controlla le operazioni di creazione/aggiornamento/eliminazione nel pannello e Mapping.Use è necessario per assegnare il modello a una VM. Quest'ultimo requisito viene verificato durante la creazione, l'aggiornamento e la clonazione di una VM, quindi un utente che può clonare una VM che utilizza un modello personalizzato necessita comunque di Mapping.Use sul percorso ACL di quel modello.

Flag CPU relativi a Meltdown / Spectre

Esistono diversi flag CPU relativi alle vulnerabilità Meltdown e Spectre
[Meltdown Attack https://meltdownattack.com/]
che devono essere impostati manualmente a meno che il tipo di CPU selezionato per la VM non li attivi già di default.

Esistono due requisiti che devono essere soddisfatti per poter utilizzare questi flag CPU:

  • La CPU o le CPU dell'host devono supportare la funzionalità e propagarla alla CPU o alle CPU virtuali del guest

  • Il sistema operativo guest deve essere aggiornato a una versione che mitighi gli attacchi e sia in grado di utilizzare la funzionalità della CPU

In caso contrario è necessario impostare il flag CPU desiderato per la CPU virtuale, modificando le opzioni della CPU nell'interfaccia web oppure impostando la proprietà flags dell'opzione cpu nel file di configurazione della VM.

Per le correzioni di Spectre v1, v2, v4, è necessario anche che il fornitore della CPU o del sistema fornisca un cosiddetto "aggiornamento del microcodice" per la CPU, vedere il capitolo Aggiornamenti firmware. Si noti che non tutte le CPU interessate possono essere aggiornate per supportare spec-ctrl.

Per verificare se l'host Proxmox VE è vulnerabile, eseguire il seguente comando come root:

for f in /sys/devices/system/cpu/vulnerabilities/*; do echo "${f##*/} -" $(cat "$f"); done

È disponibile anche uno script della community per rilevare se l'host è ancora vulnerabile.
[spectre-meltdown-checker https://meltdown.ovh/]

Processori Intel
  • pcid

    Questo riduce l'impatto sulle prestazioni della mitigazione di Meltdown (CVE-2017-5754) denominata Kernel Page-Table Isolation (KPTI), che nasconde efficacemente la memoria del kernel dallo spazio utente. Senza PCID, KPTI è un meccanismo piuttosto costoso
    [PCID is now a critical performance/security feature on x86 https://groups.google.com/forum/m/#!topic/mechanical-sympathy/L9mHTbeQLNU]
    .

    Per verificare se l'host Proxmox VE supporta PCID, eseguire il seguente comando come root:

    # grep ' pcid ' /proc/cpuinfo

    Se il risultato non è vuoto, la CPU dell'host supporta pcid.

  • spec-ctrl

    Richiesto per attivare la correzione di Spectre v1 (CVE-2017-5753) e Spectre v2 (CVE-2017-5715), nei casi in cui le retpoline non sono sufficienti. Incluso di default nei modelli di CPU Intel con suffisso -IBRS. Deve essere attivato esplicitamente per i modelli di CPU Intel senza suffisso -IBRS. Richiede un microcodice della CPU host aggiornato (intel-microcode >= 20180425).

  • ssbd

    Richiesto per attivare la correzione di Spectre V4 (CVE-2018-3639). Non incluso di default in nessun modello di CPU Intel. Deve essere attivato esplicitamente per tutti i modelli di CPU Intel. Richiede un microcodice della CPU host aggiornato (intel-microcode >= 20180703).

Processori AMD
  • ibpb

    Richiesto per attivare la correzione di Spectre v1 (CVE-2017-5753) e Spectre v2 (CVE-2017-5715), nei casi in cui le retpoline non sono sufficienti. Incluso di default nei modelli di CPU AMD con suffisso -IBPB. Deve essere attivato esplicitamente per i modelli di CPU AMD senza suffisso -IBPB. Richiede che il microcodice della CPU host supporti questa funzionalità prima che possa essere utilizzata per le CPU dei guest.

  • virt-ssbd

    Richiesto per attivare la correzione di Spectre v4 (CVE-2018-3639). Non incluso di default in nessun modello di CPU AMD. Deve essere attivato esplicitamente per tutti i modelli di CPU AMD. Dovrebbe essere fornito ai guest, anche se viene fornito anche amd-ssbd, per la massima compatibilità con i guest. Si noti che deve essere attivato esplicitamente quando si utilizza il modello di CPU "host", poiché si tratta di una funzionalità virtuale che non esiste nelle CPU fisiche.

  • amd-ssbd

    Richiesto per attivare la correzione di Spectre v4 (CVE-2018-3639). Non incluso di default in nessun modello di CPU AMD. Deve essere attivato esplicitamente per tutti i modelli di CPU AMD. Questo offre prestazioni superiori rispetto a virt-ssbd, pertanto un host che lo supporta dovrebbe sempre esporlo ai guest se possibile. virt-ssbd dovrebbe comunque essere esposto anche per la massima compatibilità con i guest, poiché alcuni kernel conoscono solo virt-ssbd.

  • amd-no-ssb

    Consigliato per indicare che l'host non è vulnerabile a Spectre V4 (CVE-2018-3639). Non incluso di default in nessun modello di CPU AMD. Le future generazioni di hardware delle CPU non saranno vulnerabili a CVE-2018-3639, e pertanto il guest dovrebbe essere informato di non attivare le proprie mitigazioni, esponendo amd-no-ssb. Questo è mutuamente esclusivo con virt-ssbd e amd-ssbd.

Impostazioni CPU relative a Windows

Alcuni valori predefiniti e proprietà della CPU sono ottimizzati specificamente per i guest Windows su hardware Intel recente:

  • cet-ibt e cet-ss (Control-flow Enforcement Technology: indirect branch tracking e shadow stack) sono disabilitati per impostazione predefinita per i tipi di macchina Windows 11, poiché attualmente interrompono il boot per i guest Windows con virtualization-based security abilitata. I workload che dipendono esplicitamente dai flag possono riattivarli per singola VM tramite l'editor dei flag Processor.

  • La proprietà CPU QEMU level è esposta in modo che possa essere impostata per singola VM (o in un modello CPU personalizzato) senza ricorrere ad args personalizzati. Impostare level=30 è una soluzione nota per gli errori di boot Hyper-V dei guest Windows su host Intel recenti quando il tipo di CPU è host o max. La proprietà si applica solo alle vCPU x86_64; viene ignorata silenziosamente su altre architetture.

NUMA

È inoltre possibile, facoltativamente, emulare un'architettura NUMA
[https://en.wikipedia.org/wiki/Non-uniform_memory_access]
nelle VM. I principi base dell'architettura NUMA prevedono che, invece di avere un pool di memoria globale disponibile per tutti i core, la memoria sia distribuita in banchi locali vicini a ciascun socket. Questo può portare a miglioramenti di velocità poiché il bus di memoria non è più un collo di bottiglia. Se il sistema in uso ha un'architettura NUMA
[se il comando numactl --hardware | grep available restituisce più di un nodo, il sistema host ha un'architettura NUMA]
si consiglia di attivare l'opzione, poiché consentirà una corretta distribuzione delle risorse della VM sul sistema host. Questa opzione è inoltre necessaria per l'hot-plug di core o RAM in una VM.

Se si utilizza l'opzione NUMA, si consiglia di impostare il numero di socket pari al numero di nodi del sistema host.

Hot-plug delle vCPU

I moderni sistemi operativi hanno introdotto la possibilità di eseguire l'hot-plug e, in una certa misura, l'hot-unplug delle CPU in un sistema in esecuzione. La virtualizzazione permette di evitare molti dei problemi (fisici) che l'hardware reale può causare in tali scenari. Tuttavia, si tratta di una funzionalità piuttosto nuova e complessa, quindi il suo utilizzo dovrebbe essere limitato ai casi in cui sia assolutamente necessaria. Gran parte della funzionalità può essere replicata con altre funzionalità ben testate e meno complesse, vedere Limiti delle risorse.

In Proxmox VE il numero massimo di CPU collegate è sempre cores * sockets. Per avviare una VM con un numero di CPU inferiore a questo totale, è possibile utilizzare l'impostazione vcpus, che indica quante vCPU devono essere collegate all'avvio della VM.

Attualmente questa funzionalità è supportata solo su Linux; è necessario un kernel con versione successiva alla 3.10, si consiglia un kernel con versione successiva alla 4.7.

È possibile utilizzare una regola udev come la seguente per impostare automaticamente le nuove CPU come online nel guest:

SUBSYSTEM=="cpu", ACTION=="add", TEST=="online", ATTR{online}=="0", ATTR{online}="1"

Salvare questo file in /etc/udev/rules.d/ con un nome che termina in .rules.

Nota: la rimozione a caldo della CPU dipende dalla macchina e richiede la collaborazione del guest. Il comando di eliminazione non garantisce che la rimozione della CPU avvenga effettivamente; tipicamente si tratta di una richiesta inoltrata al sistema operativo guest tramite un meccanismo dipendente dal target, come ACPI su x86/amd64.

10.2.6. Memoria

Per ogni VM è possibile impostare una quantità fissa di memoria oppure chiedere a Proxmox VE di allocare dinamicamente la memoria in base all'utilizzo corrente della RAM dell'host.

screenshot/gui-create-vm-memory.png
Fixed Memory Allocation

Quando la memoria e la memoria minima sono impostate sulla stessa quantità, Proxmox VE allocherà semplicemente alla VM la quantità specificata.

Anche quando si utilizza una dimensione di memoria fissa, il dispositivo di ballooning viene aggiunto alla VM, poiché fornisce informazioni utili, come la quantità di memoria effettivamente utilizzata dal guest. In generale, si consiglia di lasciare abilitato il ballooning, ma se si desidera disabilitarlo (ad esempio per scopi di debug), è sufficiente deselezionare Ballooning Device oppure impostare

balloon: 0

nella configurazione.

Automatic Memory Allocation

Quando la memoria minima è impostata su un valore inferiore alla memoria, Proxmox VE assicura che la quantità minima specificata sia sempre disponibile per la VM e, se l'utilizzo della RAM sull'host è inferiore a una determinata percentuale target, aggiungerà dinamicamente memoria al guest fino al massimo di memoria specificato. La percentuale target è impostata per impostazione predefinita all'80% e può essere configurata nelle opzioni del nodo.

Quando l'host dispone di poca RAM, la VM rilascerà quindi parte della memoria all'host, eseguendo lo swap dei processi in esecuzione se necessario e avviando come ultima risorsa l'oom killer. Il trasferimento di memoria tra host e guest viene eseguito tramite un driver kernel balloon speciale in esecuzione all'interno del guest, che recupera o rilascia pagine di memoria dall'host.
[Una buona spiegazione del funzionamento interno del driver balloon è disponibile qui https://rwmj.wordpress.com/2010/07/17/virtio-balloon/]

Quando più VM utilizzano la funzionalità di allocazione automatica, è possibile impostare un coefficiente Shares che indica la quantità relativa di memoria libera dell'host che ciascuna VM dovrebbe ricevere. Si supponga ad esempio di avere quattro VM, tre delle quali eseguono un server HTTP mentre l'ultima è un server database. L'host è configurato per un utilizzo della RAM pari all'80% come obiettivo. Per memorizzare nella cache più blocchi del database nella RAM del server database, si desidera dare priorità alla VM del database quando è disponibile RAM libera. A tale scopo si assegna alla proprietà Shares della VM del database il valore 3000, lasciando per le altre VM l'impostazione predefinita di Shares pari a 1000. Il server host dispone di 32GB di RAM e ne utilizza attualmente 16GB, lasciando 32 * 80/100 - 16 = 9GB di RAM da allocare alle VM in aggiunta alla quantità minima di memoria configurata. La VM del database beneficerà di 9 * 3000 / (3000 + 1000 + 1000 + 1000) = 4,5 GB di RAM extra e ciascun server HTTP di 1,5 GB.

Tutte le distribuzioni Linux rilasciate dopo il 2010 includono il driver kernel balloon. Per i sistemi operativi Windows, il driver balloon deve essere aggiunto manualmente e può causare un rallentamento del guest, pertanto non si raccomanda di utilizzarlo su sistemi critici.

Quando si alloca RAM alle VM, una buona regola generale è quella di lasciare sempre 1GB di RAM disponibile per l'host.

10.2.7. Crittografia della memoria

AMD SEV

SEV (Secure Encrypted Virtualization) consente la crittografia della memoria per singola VM utilizzando la crittografia AES-128 e AMD Secure Processor.

SEV-ES (Secure Encrypted Virtualization - Encrypted State) inoltre cripta tutto il contenuto dei registri CPU, per prevenire la fuga di informazioni verso l'hypervisor.

SEV-SNP (Secure Encrypted Virtualization - Secure Nested Paging) tenta inoltre di prevenire attacchi all'integrità condotti tramite software. Per maggiori informazioni consultare il white paper AMD SEV SNP.

Requisiti dell'host:

  • CPU AMD EPYC

  • SEV-ES è supportato solo sulle CPU AMD EPYC serie 7002 e successive

  • SEV-SNP è supportato solo sulle CPU AMD EPYC serie 7003 e successive

  • SEV-SNP richiede la versione del kernel host 6.11 o superiore.

  • configurare la crittografia della memoria AMD nelle impostazioni del BIOS della macchina host

  • aggiungere "kvm_amd.sev=1" ai parametri del kernel se non abilitato per impostazione predefinita

  • aggiungere "mem_encrypt=on" ai parametri del kernel se si desidera crittografare la memoria sull'host (SME), vedere https://www.kernel.org/doc/Documentation/x86/amd-memory-encryption.txt

  • eventualmente aumentare SWIOTLB, vedere https://github.com/AMDESE/AMDSEV#faq-4

Per verificare se SEV è abilitato sull'host, cercare sev in dmesg e visualizzare il parametro del kernel SEV di kvm_amd:

# dmesg | grep -i sev
[...] ccp 0000:45:00.1: sev enabled
[...] ccp 0000:45:00.1: SEV API: <buildversion>
[...] SEV supported: <number> ASIDs
[...] SEV-ES supported: <number> ASIDs
# cat /sys/module/kvm_amd/parameters/sev
Y

Requisiti del guest:

  • edk2-OVMF

  • si consiglia di utilizzare Q35

  • Il sistema operativo guest deve contenere il supporto SEV.

Limitazioni:

  • Poiché la memoria è crittografata, l'utilizzo di memoria sull'host è sempre errato.

  • Le operazioni che comportano il salvataggio o il ripristino della memoria, come snapshot e migrazione live, non funzionano ancora o sono attaccabili.

  • Il PCI passthrough non è supportato.

  • SEV-ES e SEV-SNP sono molto sperimentali.

  • I dischi EFI non sono supportati con SEV-SNP.

  • Con SEV-SNP, il comando reboot all'interno di una VM si limita a spegnere la VM.

Esempio di configurazione (SEV):

# qm set <vmid> -amd-sev type=std,no-debug=1,no-key-sharing=1,kernel-hashes=1

Il type definisce la tecnologia di crittografia ("type=" non è necessario). Le opzioni disponibili sono std, es e snp.

Il parametro QEMU policy viene calcolato con i parametri no-debug e no-key-sharing. Questi parametri corrispondono ai bit di policy 0 e 1. Se type è es, il bit di policy 2 viene impostato su 1 in modo che SEV-ES sia abilitato. Il bit di policy 3 (nosend) è sempre impostato su 1 per prevenire attacchi di migrazione. Per maggiori informazioni su come calcolare la policy, vedere: AMD SEV API Specification, capitolo 3

L'opzione kernel-hashes è disattivata per impostazione predefinita per compatibilità con le immagini OVMF più vecchie e con i guest che non misurano il kernel/initrd. Vedere https://lists.gnu.org/archive/html/qemu-devel/2021-11/msg02598.html

Verificare se SEV funziona nella VM

Metodo 1 - dmesg:

L'output dovrebbe essere simile a questo.

# dmesg | grep -i sev
AMD Memory Encryption Features active: SEV

Metodo 2 - MSR 0xc0010131 (MSR_AMD64_SEV):

L'output dovrebbe essere 1.

# apt install msr-tools
# modprobe msr
# rdmsr -a 0xc0010131
1

Esempio di configurazione (SEV-SNP):

# qm set <vmid> -amd-sev type=snp,allow-smt=1,no-debug=1,kernel-hashes=1

Il bit di policy allow-smt è impostato per impostazione predefinita. Se viene disabilitato impostando allow-smt su 0, SMT deve essere disabilitato sull'host affinché la VM possa essere eseguita.

Verificare se SEV-SNP funziona nella VM

# dmesg | grep -i snp
Memory Encryption Features active: AMD SEV SEV-ES SEV-SNP
SEV: Using SNP CPUID table, 29 entries present.
SEV: SNP guest platform device initialized.

Collegamenti:

10.2.8. Dispositivo di rete

screenshot/gui-create-vm-network.png

Ogni VM può avere numerosi controller di interfaccia di rete (NIC), di quattro tipi diversi:

  • Intel E1000 è il tipo predefinito ed emula una scheda di rete Intel Gigabit.

  • la NIC paravirtualizzata VirtIO dovrebbe essere utilizzata per ottenere le massime prestazioni. Come tutti i dispositivi VirtIO, il sistema operativo guest deve avere il driver appropriato installato.

  • Realtek 8139 emula una scheda di rete più vecchia a 100 MB/s e dovrebbe essere utilizzata solo per emulare sistemi operativi meno recenti (rilasciati prima del 2002)

  • vmxnet3 è un altro dispositivo paravirtualizzato, che dovrebbe essere utilizzato solo quando si importa una VM da un altro hypervisor.

Proxmox VE genera per ogni NIC un indirizzo MAC casuale, in modo che la VM sia raggiungibile sulle reti Ethernet.

La NIC aggiunta alla VM può seguire uno dei due modelli seguenti:

  • nella modalità predefinita Bridged, ogni NIC virtuale è supportata sull'host da un tap device (un dispositivo di loopback software che simula una NIC Ethernet). Questo tap device viene aggiunto a un bridge, per impostazione predefinita vmbr0 in Proxmox VE. In questa modalità, le VM hanno accesso diretto alla LAN Ethernet su cui si trova l'host.

  • nella modalità alternativa NAT, ogni NIC virtuale comunicherà solo con lo stack di rete utente di QEMU, dove un router integrato e un server DHCP possono fornire l'accesso alla rete. Questo DHCP integrato assegnerà indirizzi nell'intervallo privato 10.0.2.0/24. La modalità NAT è molto più lenta della modalità bridge e dovrebbe essere utilizzata solo per test. Questa modalità è disponibile solo tramite CLI o API, ma non tramite l'interfaccia web.

È anche possibile saltare l'aggiunta di un dispositivo di rete durante la creazione di una VM selezionando Nessun dispositivo di rete.

È possibile sovrascrivere manualmente l'impostazione MTU per ogni dispositivo di rete della VM. Lasciando il campo vuoto o impostando mtu=1, l'MTU verrà ereditato dal bridge sottostante. Questa opzione è disponibile solo per i dispositivi di rete VirtIO.

Multiqueue

Se si utilizza il driver VirtIO, è possibile attivare facoltativamente l'opzione Multiqueue. Questa opzione consente al sistema operativo guest di elaborare i pacchetti di rete utilizzando più CPU virtuali, aumentando il numero totale di pacchetti trasferiti.

Quando si utilizza il driver VirtIO con Proxmox VE, ogni coda di rete della NIC viene passata al kernel dell'host, dove la coda verrà elaborata da un thread del kernel generato dal driver vhost. Con questa opzione attivata, è possibile passare più code di rete al kernel dell'host per ogni NIC.

Quando si utilizza Multiqueue, si consiglia di impostarlo su un valore pari al numero di vCPU del guest. È opportuno ricordare che il numero di vCPU è il numero di socket moltiplicato per il numero di core configurati per la VM. È inoltre necessario impostare il numero di canali multiuso su ogni NIC VirtIO nella VM con questo comando ethtool:

ethtool -L ens1 combined X

dove X è il numero di vCPU della VM.

Per configurare un guest Windows per Multiqueue, installare i driver Redhat VirtIO Ethernet Adapter, quindi adattare la configurazione della NIC come segue. Aprire la gestione dispositivi, fare clic con il tasto destro sulla NIC in "Schede di rete" e selezionare "Proprietà". Aprire quindi la scheda "Avanzate" e selezionare "Receive Side Scaling" dall'elenco a sinistra. Assicurarsi che sia impostato su "Abilitato". Quindi, accedere a "Numero massimo di code RSS" nell'elenco e impostarlo sul numero di vCPU della VM. Una volta verificato che le impostazioni siano corrette, fare clic su "OK" per confermarle.

È opportuno notare che l'impostazione del parametro Multiqueue su un valore superiore a uno aumenterà il carico della CPU sui sistemi host e guest con l'aumentare del traffico. Si consiglia di impostare questa opzione solo quando la VM deve elaborare un numero elevato di connessioni in entrata, ad esempio quando la VM viene eseguita come router, reverse proxy o un server HTTP occupato che esegue il long polling.

10.2.9. Display

QEMU può virtualizzare alcuni tipi di hardware VGA. Alcuni esempi sono:

  • std, il tipo predefinito, emula una scheda con estensioni Bochs VBE.

  • cirrus, questo era in passato il tipo predefinito, emula un modulo hardware molto vecchio con tutti i suoi problemi. Questo tipo di display dovrebbe essere utilizzato solo se davvero necessario
    [https://www.kraxel.org/blog/2014/10/qemu-using-cirrus-considered-harmful/ qemu: using cirrus considered harmful]
    , ad esempio, se si utilizza Windows XP o versioni precedenti

  • vmware, è un adattatore compatibile con VMWare SVGA-II.

  • qxl, è la scheda grafica paravirtualizzata QXL. Selezionando questa opzione si abilita anche SPICE (un protocollo di visualizzazione remota) per la VM.

  • virtio-gl, spesso chiamato VirGL, è una GPU 3D virtuale per l'uso all'interno delle VM che consente di scaricare i carichi di lavoro sulla GPU host senza richiedere modelli speciali (costosi) e relativi driver e senza vincolare completamente la GPU host, permettendo il riutilizzo tra più guest e/o l'host.

    Note Il supporto VirGL richiede alcune librerie aggiuntive che non sono installate per impostazione predefinita in quanto relativamente grandi e non disponibili come open source per tutti i modelli/produttori di GPU. Per la maggior parte delle configurazioni è sufficiente eseguire: apt install libgl1 libegl1

È possibile modificare la quantità di memoria assegnata alla GPU virtuale, impostando l'opzione memory. Questo può consentire risoluzioni più elevate all'interno della VM, specialmente con SPICE/QXL.

Poiché la memoria è riservata dal dispositivo di visualizzazione, selezionare la modalità Multi-Monitor per SPICE (come qxl2 per doppio monitor) comporta alcune implicazioni:

  • Windows richiede un dispositivo per ogni monitor, quindi se l'ostype è una versione di Windows, Proxmox VE assegna alla VM un dispositivo aggiuntivo per ogni monitor. Ogni dispositivo riceve la quantità di memoria specificata.

  • Le VM Linux possono sempre abilitare più monitor virtuali, ma selezionando una modalità Multi-Monitor la memoria assegnata al dispositivo viene moltiplicata per il numero di monitor.

Selezionando serialX come type di display si disabilita l'uscita VGA, e si reindirizza la Web Console alla porta seriale selezionata. In questo caso un'eventuale impostazione memory configurata per il display viene ignorata.

VNC clipboard

È possibile abilitare gli appunti VNC impostando clipboard su vnc.

# qm set <vmid> -vga <displaytype>,clipboard=vnc

Per utilizzare la funzione degli appunti, è necessario innanzitutto installare gli SPICE guest tools. Sulle distribuzioni basate su Debian, questo può essere ottenuto installando spice-vdagent. Per altri sistemi operativi è possibile cercarlo nei repository ufficiali oppure consultare: https://www.spice-space.org/download.html

Una volta installati gli spice guest tools, è possibile utilizzare la funzione degli appunti VNC (ad esempio nel pannello della console noVNC). Tuttavia, se si utilizzano SPICE, virtio o virgl, è necessario scegliere quali appunti utilizzare. Questo perché gli appunti predefiniti SPICE vengono sostituiti dagli appunti VNC, se clipboard è impostato su vnc.

Note Per abilitare gli appunti VNC, QEMU viene configurato per utilizzare il dispositivo qemu-vdagent. Il supporto alla migrazione live per questo dispositivo è stato aggiunto con la versione 10.1 di QEMU. Le VM in esecuzione con una versione di QEMU o della macchina inferiore alla 10.1 e con gli appunti VNC abilitati non possono essere migrate live.

10.2.10. Passthrough USB

Esistono due diversi tipi di dispositivi di passthrough USB:

  • Passthrough USB host

  • Passthrough USB SPICE

Il passthrough USB host funziona assegnando a una VM un dispositivo USB dell'host. Questo può essere fatto tramite l'id del produttore e del prodotto, oppure tramite il bus e la porta dell'host.

L'id produttore/prodotto ha questo aspetto: 0123:abcd, dove 0123 è l'id del produttore, e abcd è l'id del prodotto, ciò significa che due unità dello stesso dispositivo usb hanno lo stesso id.

Il bus/porta ha questo aspetto: 1-2.3.4, dove 1 è il bus e 2.3.4 è il percorso della porta. Questo rappresenta le porte fisiche dell'host (a seconda dell'ordine interno dei controller usb).

Se un dispositivo è presente nella configurazione di una VM all'avvio della VM, ma il dispositivo non è presente sull'host, la VM può avviarsi senza problemi. Non appena il dispositivo/porta diventa disponibile sull'host, viene effettuato il passthrough.

Warning L'utilizzo di questo tipo di passthrough USB implica che non è possibile spostare una VM a caldo su un altro host, poiché l'hardware è disponibile solo sull'host in cui risiede attualmente la VM.

Il secondo tipo di passthrough è il passthrough USB SPICE. Aggiungendo una o più porte USB SPICE alla VM, è possibile effettuare dinamicamente il passthrough di un dispositivo USB locale dal client SPICE alla VM. Questo può essere utile per reindirizzare temporaneamente un dispositivo di input o un dongle hardware.

È anche possibile mappare i dispositivi a livello di cluster, in modo che possano essere utilizzati correttamente con l'HA, che le modifiche hardware vengano rilevate e che gli utenti non root possano configurarli. Vedere Mappatura delle risorse per i dettagli in merito.

10.2.11. BIOS e UEFI

Per emulare correttamente un computer, QEMU deve utilizzare un firmware, che, sui comuni PC spesso noto come BIOS o (U)EFI, viene eseguito come uno dei primi passaggi durante l'avvio di una VM. È responsabile dell'inizializzazione hardware di base e della fornitura di un'interfaccia verso il firmware e l'hardware per il sistema operativo. Per impostazione predefinita QEMU utilizza SeaBIOS per questo scopo, che è un'implementazione BIOS x86 open source. SeaBIOS è una buona scelta per la maggior parte delle configurazioni standard.

Note SeaBIOS, e quindi bios=seabios, è disponibile solo per guest x86. Sugli host arm64, le macchine virtuali si avviano sempre tramite UEFI, utilizzando la build ARM di OVMF (AAVMF), quindi bios=ovmf è l'unica impostazione supportata in quel caso.

Alcuni sistemi operativi (come Windows 11) possono richiedere l'uso di un'implementazione compatibile con UEFI. In tali casi, è necessario utilizzare OVMF, che è un'implementazione UEFI open-source.
[Vedere il progetto OVMF https://github.com/tianocore/tianocore.github.io/wiki/OVMF]

Esistono altri scenari in cui SeaBIOS potrebbe non essere il firmware ideale da cui avviare, ad esempio se si desidera effettuare il VGA passthrough.
[Alex Williamson ha scritto un buon articolo di blog a riguardo https://vfio.blogspot.co.at/2014/08/primary-graphics-assignment-without-vga.html]

Se si desidera utilizzare OVMF, è necessario considerare diversi aspetti:

Per salvare elementi come l'ordine di avvio, è necessario un disco EFI. Questo disco sarà incluso nei backup e negli snapshot e ne può esistere solo uno.

È possibile creare tale disco con il seguente comando:

# qm set <vmid> -efidisk0 <storage>:1,format=<format>,efitype=4m,pre-enrolled-keys=1

Dove <storage> è lo storage in cui si desidera avere il disco, e <format> è un formato supportato dallo storage. In alternativa, è possibile creare tale disco tramite l'interfaccia web con Aggiungi → Disco EFI nella sezione hardware di una VM.

L'opzione efitype specifica quale versione del firmware OVMF deve essere utilizzata. Per le nuove VM, questa dovrebbe sempre essere 4m, poiché supporta il Secure Boot e dispone di maggiore spazio allocato per supportare sviluppi futuri (questo è il valore predefinito nella GUI).

pre-enroll-keys specifica se l'efidisk deve essere precaricato con chiavi Secure Boot specifiche per la distribuzione e con le chiavi Microsoft Standard Secure Boot. Abilita inoltre il Secure Boot per impostazione predefinita (anche se è comunque possibile disabilitarlo nel menu OVMF all'interno della VM). Vedere anche Scadenza dei certificati Secure Boot.

Note Se si desidera iniziare a utilizzare il Secure Boot in una VM esistente (che utilizza ancora un efidisk di tipo 2m), è necessario ricreare l'efidisk. Per farlo, eliminare quello precedente (qm set <vmid> -delete efidisk0) e aggiungerne uno nuovo come descritto in precedenza. Questo annullerà tutte le configurazioni personalizzate effettuate nel menu OVMF!

Quando si utilizza OVMF con un display virtuale (senza VGA passthrough), è necessario impostare la risoluzione del client nel menu OVMF (accessibile premendo il tasto ESC durante l'avvio), oppure è necessario scegliere SPICE come tipo di display.

Quando si utilizza OVMF con l'avvio PXE, è necessario aggiungere un dispositivo RNG alla VM. Per motivi di sicurezza, il firmware OVMF disabilita l'avvio PXE per i guest senza un generatore di numeri casuali.

Scadenza del certificato Secure Boot

Il set originale di certificati Microsoft del 2011, utilizzato da Windows e dalle comuni distribuzioni Linux per il secure boot, scade nel giugno 2026. Microsoft ha creato certificati sostitutivi nel 2023
[Articolo del supporto Microsoft sul problema https://support.microsoft.com/en-us/topic/windows-secure-boot-certificate-expiration-and-ca-updates-7ff40d33-95dc-4c3c-8725-a9b95457578e]
.

Il firmware consente solo bootloader firmati con certificati presenti sul disco EFI. In particolare, un disco EFI con solo i certificati del 2011 rifiuterà i bootloader firmati con i certificati del 2023. Il marcatore ms-cert=2023k nella configurazione della VM per un disco EFI indica che i nuovi certificati sono registrati.

Se la versione del package pve-edk2-firmware è almeno 4.2025.05-1, i dischi EFI appena creati contengono sia i certificati del 2011 che quelli del 2023 e presenteranno il marcatore ms-cert=2023k. Per i dischi EFI creati prima di tale versione, è necessario registrare i certificati:

Per Windows con BitLocker, eseguire il seguente comando all'interno di PowerShell:

manage-bde -protectors -disable <drive>

Ad esempio, <drive> potrebbe essere C:. Questo è necessario per ciascuna unità con BitLocker prima di procedere. In caso contrario, al successivo avvio verrà richiesta la chiave di recupero di BitLocker!

Selezionare il disco EFI nella vista Hardware dell'interfaccia utente e utilizzare Disk Action > Enroll Updated Certificates. In alternativa, è possibile registrare i certificati tramite l'endpoint API /nodes/{node}/qemu/{vmid}/config. La registrazione ha effetto al successivo avvio della VM. Il

qm enroll-efi-keys <vmid>

Il comando CLI ottiene lo stesso risultato, ma richiede che la VM sia spenta.

Per ulteriori passaggi sull'aggiornamento del secure boot in Windows e sulla firma del bootloader con i nuovi certificati del 2023, fare riferimento agli articoli del supporto Microsoft relativi a enterprise deployment guidance for CVE-2023-24932 e al relativo aggiornamento di sicurezza che deve essere installato prima.

Note I marcatori ms-cert=2023 e ms-cert=2023w possono indicare una registrazione parziale. Il log del task di avvio della VM segnalerà un avviso in merito. È opportuno applicare la procedura di registrazione anche a tali dischi EFI.

10.2.12. Trusted Platform Module (TPM)

Un Trusted Platform Module è un dispositivo che memorizza dati segreti - come chiavi di crittografia - in modo sicuro e fornisce funzioni di resistenza alla manomissione per la validazione del boot di sistema.

Alcuni sistemi operativi (come Windows 11) richiedono che un dispositivo di questo tipo sia collegato a una macchina (sia fisica che virtuale).

Un TPM viene aggiunto specificando un volume tpmstate. Il funzionamento è simile a quello di un efidisk, in quanto non può essere modificato (solo rimosso) una volta creato. È possibile aggiungerne uno tramite il seguente comando:

# qm set <vmid> -tpmstate0 <storage>:1,version=<version>

Dove <storage> è lo storage su cui si desidera posizionare lo stato, e <version> è v1.2 oppure v2.0. È anche possibile aggiungerne uno tramite l'interfaccia web, selezionando Add → TPM State nella sezione hardware di una VM.

La specifica TPM v2.0 è più recente e meglio supportata, quindi, salvo implementazioni specifiche che richiedano un TPM v1.2, dovrebbe essere preferita.

Note Rispetto a un TPM fisico, uno emulato non fornisce alcun reale vantaggio in termini di sicurezza. Lo scopo di un TPM è che i dati contenuti non possano essere modificati facilmente, se non tramite comandi specificati nella specifica TPM. Poiché con un dispositivo emulato l'archiviazione dei dati avviene su un volume normale, questi possono potenzialmente essere modificati da chiunque vi abbia accesso.

10.2.13. Memoria condivisa tra VM

È possibile aggiungere un dispositivo di memoria condivisa Inter-VM (ivshmem), che permette di condividere memoria tra l'host e un guest, oppure anche tra più guest.

Per aggiungere un dispositivo di questo tipo, è possibile usare qm:

# qm set <vmid> -ivshmem size=32,name=foo

Dove la dimensione è espressa in MiB. Il file si troverà in /dev/shm/pve-shm-$name (il nome predefinito è il vmid).

Note Attualmente il dispositivo verrà eliminato non appena una qualsiasi VM che lo utilizza viene arrestata o fermata. Le connessioni aperte persisteranno comunque, ma non sarà più possibile stabilire nuove connessioni verso lo stesso identico dispositivo.

Un caso d'uso per un dispositivo di questo tipo è il progetto Looking Glass
[Looking Glass: https://looking-glass.io/]
, che consente un mirroring del display tra host e guest ad alte prestazioni e bassa latenza.

10.2.14. Dispositivo audio

Per aggiungere un dispositivo audio eseguire il seguente comando:

qm set <vmid> -audio0 device=<device>

I dispositivi audio supportati sono:

  • ich9-intel-hda: controller audio Intel HD, emula ICH9

  • intel-hda: controller audio Intel HD, emula ICH6

  • AC97: Audio Codec '97, utile per sistemi operativi meno recenti come Windows XP

Sono disponibili due backend:

  • spice

  • none

Il backend spice può essere utilizzato in combinazione con SPICE, mentre il backend none può essere utile se nella VM è necessario un dispositivo audio per il funzionamento di qualche software. Per utilizzare il dispositivo audio fisico dell'host, utilizzare il passthrough del dispositivo (vedere PCI Passthrough e USB Passthrough). I protocolli remoti come l'RDP di Microsoft dispongono di opzioni per la riproduzione dell'audio.

10.2.15. VirtIO RNG

Un RNG (Random Number Generator) è un dispositivo che fornisce entropia (casualità) a un sistema. Un RNG hardware virtuale può essere utilizzato per fornire tale entropia dal sistema host a una VM guest. Ciò contribuisce a evitare problemi di carenza di entropia nel guest (una situazione in cui non è disponibile entropia sufficiente e il sistema può rallentare o incontrare problemi), specialmente durante il processo di boot del guest.

Per aggiungere un RNG emulato basato su VirtIO, eseguire il seguente comando:

qm set <vmid> -rng0 source=<source>[,max_bytes=X,period=Y]

source specifica da dove viene letta l'entropia sull'host e deve essere una tra le seguenti opzioni:

  • /dev/urandom: pool di entropia del kernel non bloccante (preferito)

  • /dev/random: pool bloccante del kernel (non consigliato, può portare a carenza di entropia sul sistema host)

  • /dev/hwrng: per effettuare il passthrough di un RNG hardware collegato all'host (se ne sono disponibili diversi, verrà utilizzato quello selezionato in /sys/devices/virtual/misc/hw_random/rng_current)

È possibile specificare un limite tramite i parametri max_bytes e period, che vengono letti come max_bytes per period in millisecondi. Tuttavia, non rappresentano una relazione lineare: 1024B/1000ms significherebbe che fino a 1 KiB di dati diventano disponibili su un timer di 1 secondo, non che 1 KiB viene trasmesso in streaming al guest nel corso di un secondo. Riducendo period è quindi possibile iniettare entropia nel guest a una velocità maggiore.

Per impostazione predefinita, il limite è fissato a 1024 byte per 1000 ms (1 KiB/s). Si consiglia di utilizzare sempre un limitatore per evitare che i guest utilizzino troppe risorse dell'host. Se desiderato, è possibile utilizzare un valore di 0 per max_bytes per disattivare tutti i limiti.

10.2.16. Virtiofs

Virtiofs è un filesystem condiviso progettato per ambienti virtuali. Consente di condividere un albero di directory disponibile sull'host montandolo all'interno delle VM. Non utilizza lo stack di rete e ha l'obiettivo di offrire prestazioni e semantica simili a quelle del filesystem di origine.

Per usare virtiofs, il demone virtiofsd deve essere in esecuzione in background. Questo avviene automaticamente in Proxmox VE quando si avvia una VM utilizzando un mount virtiofs.

Le VM Linux con kernel >=5.4 supportano virtiofs per impostazione predefinita (modulo kernel virtiofs), ma alcune funzionalità richiedono un kernel più recente.

Per usare virtiofs, verificare che virtiofsd sia installato sull'host Proxmox VE:

apt install virtiofsd

È disponibile una guida su come utilizzare virtiofs nelle VM Windows.

Limitazioni note
  • Se virtiofsd va in crash, il suo punto di mount rimarrà bloccato nella VM finché la VM non viene completamente arrestata.

  • Se virtiofsd non risponde, il mount nella VM può bloccarsi, in modo simile a un NFS non raggiungibile.

  • L'aggiunta a caldo della memoria non funziona in combinazione con virtiofs (causa anche il blocco dell'accesso).

  • Le funzionalità legate alla memoria, come la migrazione live, gli snapshot e l'ibernazione, non sono disponibili con i dispositivi virtiofs.

  • Windows non è in grado di interpretare le ACL nel contesto di virtiofs. Pertanto, non esporre le ACL per le VM Windows, altrimenti il dispositivo virtiofs non sarà visibile all'interno della VM.

Aggiungere una mappatura per le directory condivise

Per aggiungere una mappatura per una directory condivisa, è possibile usare direttamente l'API con pvesh come descritto nella sezione Mappatura delle risorse:

pvesh create /cluster/mapping/dir --id dir1 \
    --map node=node1,path=/path/to/share1 \
    --map node=node2,path=/path/to/share2 \
Aggiungere virtiofs a una VM

Per condividere una directory tramite virtiofs, aggiungere il parametro virtiofs<N> (N può essere un valore compreso tra 0 e 9) alla configurazione della VM e utilizzare un ID di directory (dirid) configurato nella mappatura delle risorse. Inoltre, è possibile impostare l'opzione cache su always, never, metadata oppure auto (predefinito: auto), in base alle proprie esigenze. Il comportamento delle diverse modalità di caching è descritto qui, nella sezione "Caching Modes".

virtiofsd supporta il passthrough di ACL e xattr (può essere abilitato con le opzioni expose-acl e expose-xattr), consentendo al guest di accedere alle ACL e agli xattr se il filesystem host sottostante li supporta, ma devono anche essere compatibili con il filesystem del guest (ad esempio la maggior parte dei filesystem Linux supporta le ACL, mentre i filesystem Windows no).

L'opzione expose-acl implica automaticamente expose-xattr, pertanto non fa alcuna differenza impostare expose-xattr su 0 se expose-acl è impostato su 1.

Se si desidera che virtiofs rispetti il flag O_DIRECT, è possibile impostare il parametro direct-io su 1 (predefinito: 0). Questo riduce le prestazioni, ma è utile se le applicazioni gestiscono autonomamente la cache.

qm set <vmid> -virtiofs0 dirid=<dirid>,cache=always,direct-io=1
qm set <vmid> -virtiofs1 <dirid>,cache=never,expose-xattr=1
qm set <vmid> -virtiofs2 <dirid>,expose-acl=1

Per montare temporaneamente virtiofs in una VM guest con il driver virtiofs del kernel Linux, eseguire il seguente comando all'interno del guest:

mount -t virtiofs <dirid> <mount point>

Per ottenere un mount virtiofs persistente, è possibile creare una voce in fstab:

<dirid> <mount point> virtiofs rw,relatime 0 0

Il dirid associato al percorso sul nodo corrente viene usato anche come tag di mount (nome usato per montare il dispositivo sul guest).

Per maggiori informazioni sui parametri disponibili per virtiofsd, consultare la pagina del progetto virtiofsd su GitLab.

10.2.17. Ordine di boot dei dispositivi

QEMU può indicare al guest da quali dispositivi deve effettuare il boot, e in quale ordine. Questo può essere specificato nella configurazione tramite la proprietà boot, ad esempio:

boot: order=scsi0;net0;hostpci0
screenshot/gui-qemu-edit-bootorder.png

In questo modo, il guest tenterebbe prima di avviarsi dal disco scsi0; se il tentativo fallisse, proverebbe ad avviarsi dalla rete tramite net0 e, se anche questo tentativo fallisse, proverebbe infine ad avviarsi da un dispositivo PCIe assegnato in passthrough (visto come disco nel caso di NVMe; altrimenti tenterebbe di eseguire una option ROM).

Nell'interfaccia grafica è possibile usare un editor drag-and-drop per specificare l'ordine di boot, e usare la casella di controllo per abilitare o disabilitare completamente determinati dispositivi per il boot.

Note Se il guest utilizza più dischi per avviare il sistema operativo o caricare il bootloader, tutti devono essere contrassegnati come avviabili (cioè devono avere la casella di controllo abilitata o comparire nell'elenco nella configurazione) perché il guest possa avviarsi. Questo perché le versioni recenti di SeaBIOS e OVMF inizializzano i dischi solo se sono contrassegnati come avviabili.

In ogni caso, anche i dispositivi che non compaiono nell'elenco o che hanno il segno di spunta disabilitato saranno comunque disponibili per il guest, una volta che il suo sistema operativo si è avviato e li ha inizializzati. Il flag avviabile influisce solo sul BIOS del guest e sul bootloader.

10.2.18. Avvio e arresto automatici delle macchine virtuali

Dopo aver creato le VM, solitamente si desidera che queste si avviino automaticamente all'avvio del sistema host. Per fare ciò è necessario selezionare l'opzione Start at boot dalla scheda Options della VM nell'interfaccia web, oppure impostarla con il seguente comando:

# qm set <vmid> -onboot 1
screenshot/gui-qemu-edit-start-order.png
Start and Shutdown Order

In alcuni casi può essere necessario regolare con precisione l'ordine di avvio delle VM, ad esempio se una delle VM fornisce il firewall o il DHCP ad altri sistemi guest. Per fare ciò è possibile utilizzare i seguenti parametri:

  • Start/Shutdown order: definisce la priorità dell'ordine di avvio. Ad esempio, impostarlo a 1 se si desidera che la VM sia la prima ad essere avviata. (Per l'arresto viene utilizzato l'ordine di avvio inverso, quindi una macchina con ordine di avvio 1 sarà l'ultima ad essere arrestata). Se più VM hanno lo stesso ordine definito su un host, verranno inoltre ordinate per VMID in ordine crescente.

  • Startup delay: definisce l'intervallo tra l'avvio di questa VM e l'avvio delle VM successive. Ad esempio, impostarlo a 240 se si desidera attendere 240 secondi prima di avviare le altre VM.

  • Shutdown timeout: definisce la durata in secondi che Proxmox VE deve attendere affinché la VM sia offline dopo l'emissione di un comando di arresto. Per impostazione predefinita questo valore è impostato a 180, il che significa che Proxmox VE emetterà una richiesta di arresto e attenderà 180 secondi affinché la macchina sia offline. Se la macchina è ancora online dopo il timeout, verrà arrestata forzatamente.

Note Le VM gestite dallo stack HA attualmente non seguono le opzioni start on boot e boot order. Tali VM verranno ignorate dall'algoritmo di avvio e arresto, poiché il gestore HA stesso garantisce l'avvio e l'arresto delle VM.

Si noti che le macchine senza il parametro Start/Shutdown order verranno sempre avviate dopo quelle in cui il parametro è impostato. Inoltre, questo parametro può essere applicato solo tra macchine virtuali in esecuzione sullo stesso host, non a livello di cluster.

Se è necessario un ritardo tra l'avvio dell'host e l'avvio della prima VM, consultare la sezione Gestione dei nodi Proxmox VE.

10.2.19. QEMU Guest Agent

Il QEMU Guest Agent è un servizio in esecuzione all'interno della VM, che fornisce un canale di comunicazione tra l'host e il guest. Viene utilizzato per scambiare informazioni e consente all'host di inviare comandi al guest.

Ad esempio, gli indirizzi IP nel pannello di riepilogo della VM vengono recuperati tramite il guest agent.

Oppure, all'avvio di un backup, al guest viene comunicato tramite il guest agent di sincronizzare le scritture in sospeso tramite i comandi guest-fsfreeze-freeze e guest-fsfreeze-thaw.

Per il corretto funzionamento del guest agent devono essere eseguiti i seguenti passaggi:

  • installare l'agent nel guest e assicurarsi che sia in esecuzione

  • abilitare la comunicazione tramite l'agent in Proxmox VE

Installazione del guest agent

Per la maggior parte delle distribuzioni Linux, il guest agent è disponibile. Il package è solitamente denominato qemu-guest-agent.

Per Windows, consultare l'articolo Windows VirtIO Drivers per maggiori informazioni su come ottenere e installare i driver.

Abilitazione della comunicazione con il guest agent

La comunicazione da Proxmox VE con il guest agent può essere abilitata nel pannello Options della VM. È necessario un nuovo avvio della VM affinché le modifiche abbiano effetto.

TRIM automatico tramite QGA

È possibile abilitare l'opzione Run guest-trim. Con questa opzione abilitata, Proxmox VE invierà un comando trim al guest dopo le seguenti operazioni che potrebbero scrivere zeri nello storage:

  • spostamento di un disco su un altro storage

  • migrazione live di una VM su un altro nodo con storage locale

Su uno storage thin provisioned, questo può aiutare a liberare spazio non utilizzato.

Note Esiste un'avvertenza relativa a ext4 su Linux, poiché utilizza un'ottimizzazione in memoria per evitare l'invio di richieste TRIM duplicate. Poiché il guest non è a conoscenza della modifica nello storage sottostante, solo il primo guest-trim verrà eseguito come previsto. I successivi, fino al riavvio successivo, considereranno solo le parti del filesystem modificate da allora.
Congelamento e scongelamento del filesystem

Per impostazione predefinita, se il QEMU Guest Agent è abilitato nella configurazione del guest e se l'agent è disponibile all'interno del guest, i filesystem della macchina virtuale vengono sincronizzati tramite il comando guest-fsfreeze-freeze del QEMU Guest Agent quando vengono eseguite determinate operazioni. Ciò viene fatto per garantire la consistenza dei dati.

Per maggiori dettagli, consultare QEMU Guest Agent Protocol Reference.

Verrà eseguito un freeze per una qualsiasi delle seguenti operazioni su una VM:

  • esecuzione di un backup in modalità snapshot

  • creazione di un clone di una VM mentre è in esecuzione

  • replica di una VM mentre è in esecuzione

  • creazione di uno snapshot senza RAM di una VM in esecuzione

  • l'importazione di un'immagine disco da un guest in esecuzione comporterà l'esecuzione di un freeze su tale guest in esecuzione

Sui guest Windows, alcune applicazioni potrebbero gestire autonomamente i backup coerenti agganciandosi al layer VSS (Volume Shadow Copy Service) di Windows; un freeze potrebbe quindi interferire con tale meccanismo. Ad esempio, è stato osservato che chiamare guest-fsfreeze-freeze con alcuni SQL Server fa sì che VSS invochi il modulo SQL Writer VSS in una modalità che interrompe la catena di backup di SQL Server per i backup differenziali.

Esistono due opzioni per gestire questa situazione.

  1. Configurare il QEMU Guest Agent per utilizzare una variante VSS diversa che non interferisca con altri utilizzatori di VSS. La wiki di Proxmox VE contiene maggiori dettagli.

  2. In alternativa, è possibile configurare Proxmox VE affinché non esegua un ciclo di freeze-and-thaw disabilitando l'opzione freeze-fs del guest agent. Questo può essere fatto anche dalla GUI: aprire il pannello Opzioni della macchina virtuale, quindi la finestra QEMU Guest Agent, e disabilitare l'opzione Freeze/thaw dei filesystem guest durante determinate operazioni per garantire la coerenza.

    Important Disabilitare questa opzione può potenzialmente portare a backup con filesystem incoerenti. Pertanto, adattare la configurazione del QEMU Guest Agent all'interno del guest è l'opzione preferibile.
Risoluzione dei problemi
VM does not shut down

Assicurarsi che il guest agent sia installato e in esecuzione.

Una volta abilitato il guest agent, Proxmox VE invierà comandi di alimentazione come shutdown tramite il guest agent. Se il guest agent non è in esecuzione, i comandi non possono essere eseguiti correttamente e il comando di shutdown andrà in timeout.

10.2.20. Miglioramenti SPICE

I miglioramenti SPICE sono funzionalità opzionali che possono migliorare l'esperienza con il remote viewer.

Per abilitarli tramite la GUI, accedere al pannello Opzioni della macchina virtuale. Eseguire il comando seguente per abilitarli tramite la CLI:

qm set <vmid> -spice_enhancements foldersharing=1,videostreaming=all
Note Per utilizzare queste funzionalità, il Display della macchina virtuale deve essere impostato su SPICE (qxl).
Condivisione di cartelle

Condivide una cartella locale con il guest. Il daemon spice-webdavd deve essere installato nel guest. Rende disponibile la cartella condivisa tramite un server WebDAV locale situato all'indirizzo http://localhost:9843.

Per i guest Windows, il programma di installazione dello Spice WebDAV daemon può essere scaricato dal sito ufficiale SPICE.

La maggior parte delle distribuzioni Linux dispone di un package chiamato spice-webdavd che può essere installato.

Per condividere una cartella in Virt-Viewer (Remote Viewer), accedere a File → Preferenze. Selezionare la cartella da condividere e quindi abilitare la casella di controllo.

Note La condivisione di cartelle funziona attualmente solo nella versione Linux di Virt-Viewer.
Caution Sperimentale! Attualmente questa funzionalità non funziona in modo affidabile.
Streaming video

Le aree con aggiornamento rapido vengono codificate in uno stream video. Esistono due opzioni:

  • all: qualsiasi area con aggiornamento rapido verrà codificata in uno stream video.

  • filter: vengono utilizzati filtri aggiuntivi per decidere se utilizzare lo streaming video (attualmente vengono escluse solo le piccole superfici delle finestre).

Non è possibile fornire una raccomandazione generale sull'opportunità di abilitare lo streaming video e su quale opzione scegliere. I risultati possono variare in base alle circostanze specifiche.

Risoluzione dei problemi
Shared folder does not show up

Assicurarsi che il servizio WebDAV sia abilitato e in esecuzione nel guest. Su Windows è chiamato Spice webdav proxy. Su Linux il nome è spice-webdavd, ma può variare in base alla distribuzione.

Se il servizio è in esecuzione, verificare il server WebDAV aprendo http://localhost:9843 in un browser all'interno del guest.

Può essere utile riavviare la sessione SPICE.

10.3. Migrazione

screenshot/gui-qemu-migrate.png

Se è presente un cluster, è possibile migrare la VM su un altro host con

# qm migrate <vmid> <target>

Sono generalmente disponibili due meccanismi per questo

  • Migrazione online (nota anche come Live Migration)

  • Migrazione offline

10.3.1. Migrazione online

Se la VM è in esecuzione e non sono configurate risorse associate localmente (come dispositivi in modalità passthrough), è possibile avviare una live migration con il flag --online nell'invocazione del comando qm migration. L'interfaccia web utilizza come impostazione predefinita la live migration quando la VM è in esecuzione.

Note La live migration è possibile solo tra host con la stessa architettura CPU. Lo stato della CPU di un guest in esecuzione non può essere trasferito tra un host x86 e un host arm64.
Come funziona

La migrazione online avvia innanzitutto un nuovo processo QEMU sull'host di destinazione con il flag incoming; il processo esegue solo l'inizializzazione di base con le vCPU del guest ancora in pausa e poi attende i flussi di dati della memoria e dello stato dei dispositivi della macchina virtuale di origine. Tutte le altre risorse, come i dischi, sono condivise oppure sono già state inviate prima dell'inizio della migrazione dello stato di runtime delle VM; quindi restano da trasferire solo il contenuto della memoria e lo stato dei dispositivi.

Una volta stabilita questa connessione, l'origine inizia a inviare in modo asincrono il contenuto della memoria alla destinazione. Se la memoria del guest sull'origine cambia, tali sezioni vengono contrassegnate come dirty e viene eseguito un altro passaggio per inviare i dati di memoria del guest. Questo ciclo si ripete finché la differenza di dati tra la VM di origine in esecuzione e la VM di destinazione in arrivo non è sufficientemente piccola da essere inviata in pochi millisecondi, poiché a quel punto la VM di origine può essere completamente sospesa, senza che un utente o un programma se ne accorga, in modo che i dati rimanenti possano essere inviati alla destinazione e che quindi la CPU della VM di destinazione possa essere riattivata per renderla la nuova VM in esecuzione in ben meno di un secondo.

Requisiti

Perché la migrazione live funzioni, sono necessarie alcune condizioni:

  • La VM non ha risorse locali che non possono essere migrate. Ad esempio, i dispositivi PCI o USB in passthrough attualmente bloccano la migrazione live. I dischi locali, invece, possono essere migrati inviandoli alla destinazione senza problemi.

  • Gli host devono trovarsi nello stesso cluster Proxmox VE.

  • Gli host devono disporre di una connessione di rete funzionante (e affidabile) tra loro.

  • L'host di destinazione deve avere versioni dei package Proxmox VE uguali o superiori. Sebbene a volte possa funzionare anche al contrario, questo non può essere garantito.

  • Gli host dispongono di CPU dello stesso produttore con capacità simili. CPU di produttori diversi potrebbero funzionare a seconda dei modelli effettivi e del tipo di CPU configurato per le VM, ma il funzionamento non è garantito: si consiglia quindi di eseguire test prima di adottare una configurazione di questo tipo in produzione.

Migrazione dello stato conntrack
Note La migrazione dello stato conntrack è considerata solo best-effort e potrebbe non funzionare, poiché dipende fortemente dalla configurazione di rete. Ad esempio, le configurazioni che utilizzano il mascheramento dell'indirizzo di origine (SNAT) sull'host molto probabilmente non funzioneranno.

Conntrack è un meccanismo del kernel Linux che consente un firewall stateful tracciando le singole connessioni. Durante la migrazione live di VM in esecuzione, le connessioni attive in entrata e/o in uscita potrebbero interrompersi non appena la VM inizia a funzionare sull'host di destinazione, poiché il nuovo nodo host non dispone delle stesse voci conntrack e quindi il firewall potrebbe scartare i pacchetti.

La migrazione dello stato conntrack copia tutte le voci conntrack presenti sull'host per la VM migrata live verso il nodo di destinazione e successivamente elimina le voci migrate dalla tabella conntrack sul nodo di origine.

10.3.2. Migrazione offline

Se si dispone di risorse locali, è comunque possibile migrare le VM offline, purché tutti i dischi si trovino su uno storage definito su entrambi gli host. La migrazione copia quindi i dischi sull'host di destinazione tramite la rete, come con la migrazione online. Si noti che qualsiasi configurazione di passthrough hardware potrebbe dover essere adattata alla posizione del dispositivo sull'host di destinazione.

10.4. Copie e cloni

screenshot/gui-qemu-full-clone.png

L'installazione di una VM viene solitamente effettuata utilizzando un supporto di installazione (CD-ROM) fornito dal produttore del sistema operativo. A seconda del sistema operativo, questa può essere un'operazione dispendiosa in termini di tempo, che si potrebbe preferire evitare.

Un modo semplice per distribuire molte VM dello stesso tipo è copiare una VM esistente. Per queste copie si usa il termine clone, distinguendo tra cloni collegati (linked) e cloni completi (full).

Clone completo

Il risultato di tale copia è una VM indipendente. La nuova VM non condivide alcuna risorsa di storage con quella originale.

È possibile selezionare uno storage di destinazione, così da poter migrare una VM verso uno storage completamente diverso. È inoltre possibile modificare il formato dell'immagine disco, se il driver dello storage supporta più formati.

Note Un clone completo richiede la lettura e la copia di tutti i dati dell'immagine della VM. Questo è solitamente molto più lento della creazione di un clone collegato.

Alcuni tipi di storage consentono di copiare uno snapshot specifico, che per impostazione predefinita corrisponde ai dati attuali della VM. Ciò significa anche che la copia finale non include mai eventuali snapshot aggiuntivi presenti sulla VM originale.

Clone collegato

I driver di storage moderni supportano un metodo per generare rapidamente cloni collegati. Un clone di questo tipo è una copia scrivibile il cui contenuto iniziale è lo stesso dei dati originali. La creazione di un clone collegato è quasi istantanea e inizialmente non consuma spazio aggiuntivo.

Sono chiamati collegati perché la nuova immagine continua a fare riferimento a quella originale. I blocchi di dati non modificati vengono letti dall'immagine originale, mentre le modifiche vengono scritte in una nuova posizione (e successivamente lette da essa). Questa tecnica è chiamata copy-on-write.

Questo richiede che il volume originale sia di sola lettura. Con Proxmox VE è possibile convertire qualsiasi VM in un template di sola lettura. Tali template possono successivamente essere utilizzati per creare cloni collegati in modo efficiente.

Note Non è possibile eliminare un template originale se esistono cloni collegati a esso.

Non è possibile modificare lo storage di destinazione per i cloni collegati, poiché si tratta di una funzionalità interna dello storage.

L'opzione Nodo di destinazione consente di creare la nuova VM su un nodo diverso. L'unica restrizione è che la VM si trovi su uno storage condiviso, e che tale storage sia disponibile anche sul nodo di destinazione.

Per evitare conflitti di risorse, tutti gli indirizzi MAC delle interfacce di rete vengono randomizzati e viene generato un nuovo UUID per l'impostazione del BIOS della VM (smbios1).

10.5. Modelli di macchina virtuale

È possibile convertire una VM in un modello. Tali modelli sono di sola lettura, e possono essere utilizzati per creare cloni collegati.

Note Non è possibile avviare i modelli, poiché ciò modificherebbe le immagini disco. Per modificare il modello, è necessario creare un clone collegato e modificare quest'ultimo.

10.6. ID generazione VM

Proxmox VE supporta il Virtual Machine Generation ID (vmgenid)
[Specifica ufficiale vmgenid https://docs.microsoft.com/en-us/windows/desktop/hyperv_v2/virtual-machine-generation-identifier]
per le macchine virtuali. Può essere utilizzato dal sistema operativo guest per rilevare qualsiasi evento che comporti uno spostamento temporale, ad esempio il ripristino di un backup o il rollback di uno snapshot.

Durante la creazione di nuove VM, un vmgenid viene generato automaticamente e salvato nel relativo file di configurazione.

Per creare e aggiungere un vmgenid a una VM già esistente, è possibile passare il valore speciale ‘1’ per lasciare che Proxmox VE lo generi automaticamente, oppure impostare manualmente l'UUID
[Generatore di GUID online http://guid.one/]
utilizzandolo come valore, ad esempio:

# qm set VMID -vmgenid 1
# qm set VMID -vmgenid 00000000-0000-0000-0000-000000000000
Note L'aggiunta iniziale di un dispositivo vmgenid a una VM esistente può comportare gli stessi effetti di una modifica in seguito al rollback di uno snapshot, al ripristino di un backup, ecc., poiché la VM può interpretarlo come un cambio di generazione.

Nel caso raro in cui il meccanismo vmgenid non sia desiderato, è possibile passare '0' come valore durante la creazione della VM, oppure eliminare retroattivamente la proprietà nella configurazione con:

# qm set VMID -delete vmgenid

Il caso d'uso più rilevante per vmgenid riguarda i sistemi operativi Microsoft Windows più recenti, che lo utilizzano per evitare problemi in servizi sensibili al tempo o replicati (come database o controller di dominio
[https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/virtual-dc/virtualized-domain-controller-architecture]
) durante il rollback di uno snapshot, il ripristino di un backup o un'operazione di clonazione completa della VM.

10.7. Importazione di macchine virtuali

L'importazione di macchine virtuali esistenti da hypervisor di terze parti o da altri cluster Proxmox VE può essere effettuata con vari metodi; i più comuni sono:

  • Utilizzando la procedura guidata di importazione nativa, che sfrutta il tipo di contenuto import, come fornito dallo storage speciale ESXi.

  • Eseguendo un backup sull'origine e quindi un ripristino sulla destinazione. Questo metodo funziona meglio quando si effettua la migrazione da un'altra istanza Proxmox VE.

  • utilizzando il comando di importazione specifico per OVF del tool da riga di comando qm.

Se si importano VM in Proxmox VE da altri hypervisor, si consiglia di familiarizzare con i concetti di Proxmox VE.

10.7.1. Procedura guidata di importazione

screenshot/gui-import-wizard-general.png

Proxmox VE fornisce un importatore di VM integrato che utilizza il sistema dei plugin di storage per un'integrazione nativa nell'API e nell'interfaccia utente basata sul web. È possibile utilizzarlo per importare la VM nel suo insieme, con la maggior parte della sua configurazione mappata nel modello di configurazione di Proxmox VE e con tempi di fermo ridotti.

Note La procedura guidata di importazione è stata aggiunta durante il ciclo di sviluppo di Proxmox VE 8.2 ed è in stato di anteprima tecnica (tech preview). Sebbene sia già promettente e stabile nel funzionamento, è ancora in fase di sviluppo attivo.

Per utilizzare la procedura guidata di importazione è necessario prima configurare un nuovo storage per un'origine di importazione; è possibile farlo dall'interfaccia web in Datacenter → Storage → Aggiungi.

È quindi possibile selezionare il nuovo storage nell'albero delle risorse e utilizzare la scheda del contenuto Guest virtuali per visualizzare tutti i guest disponibili che possono essere importati.

screenshot/gui-import-wizard-advanced.png

Selezionarne uno e utilizzare il pulsante Importa (oppure fare doppio clic) per aprire la procedura guidata di importazione. È possibile modificare qui un sottoinsieme delle opzioni disponibili e quindi avviare l'importazione. Si noti che è possibile effettuare modifiche più avanzate dopo il termine dell'importazione.

Tip La procedura guidata di importazione ESXi è stata testata con le versioni ESXi dalla 6.5 alla 8.0. Si noti che i guest che utilizzano lo storage vSAN non possono essere importati direttamente; i loro dischi devono prima essere spostati su un altro storage. Sebbene sia possibile utilizzare un vCenter come origine dell'importazione, le prestazioni risultano drasticamente degradate (da 5 a 10 volte più lente).

Per una guida passo-passo e suggerimenti su come adattare il guest virtuale al nuovo hypervisor, consultare il nostro articolo wiki sulla migrazione a Proxmox VE.

Importazione OVA/OVF

Per importare file OVA/OVF, è necessario innanzitutto uno storage basato su file con il tipo di contenuto import. Su questo storage sarà presente una cartella import in cui è possibile inserire file OVA o file OVF con le relative immagini in una struttura piatta. In alternativa, è possibile utilizzare l'interfaccia web per caricare o scaricare direttamente i file OVA. È quindi possibile utilizzare l'interfaccia web per selezionarli e utilizzare la procedura guidata di importazione per importare i guest.

Per i file OVA, è necessario spazio aggiuntivo per estrarre temporaneamente l'immagine. Questo richiede uno storage basato su file con il tipo di contenuto images configurato. Per impostazione predefinita viene selezionato a questo scopo lo storage di origine, ma è possibile specificare uno storage di lavoro per l'importazione sul quale le immagini verranno estratte prima dell'importazione nello storage di destinazione effettivo.

Note Poiché la struttura e il contenuto dei file OVA/OVF non sono sempre ben mantenuti o definiti, potrebbe essere necessario adattare manualmente alcune impostazioni del guest. Ad esempio, il tipo di controller SCSI non è quasi mai definito nei file OVA/OVF, ma quello predefinito non consente l'avvio con OVMF (UEFI), pertanto in questi casi si consiglia di selezionare Virtio SCSI o VMware PVSCSI.

10.7.2. Importazione di OVF/OVA tramite CLI

Un'esportazione di VM da un hypervisor di terze parti assume solitamente la forma di una o più immagini disco, con un file di configurazione che descrive le impostazioni della VM (RAM, numero di core).
Le immagini disco possono essere in formato vmdk, se i dischi provengono da VMware o VirtualBox, oppure in formato qcow2 se i dischi provengono da un hypervisor KVM. Il formato di configurazione più diffuso per le esportazioni di VM è lo standard OVF, ma in pratica l'interoperabilità è limitata poiché molte impostazioni non sono implementate nello standard stesso e gli hypervisor esportano le informazioni supplementari in estensioni non standard.

Oltre al problema del formato, l'importazione di immagini disco da altri hypervisor potrebbe non riuscire se l'hardware emulato cambia troppo passando da un hypervisor a un altro. Le VM Windows sono particolarmente interessate da questo problema, poiché il sistema operativo è molto esigente riguardo a eventuali modifiche dell'hardware. Questo problema può essere risolto installando l'utility MergeIDE.zip disponibile su Internet prima dell'esportazione e scegliendo un tipo di disco rigido IDE prima di avviare la VM Windows importata.

Infine si pone la questione dei driver paravirtualizzati, che migliorano la velocità del sistema emulato e sono specifici per l'hypervisor. GNU/Linux e altri sistemi operativi Unix liberi dispongono già di tutti i driver necessari installati per impostazione predefinita ed è possibile passare ai driver paravirtualizzati subito dopo l'importazione della VM. Per le VM Windows, è necessario installare autonomamente i driver paravirtualizzati per Windows.

GNU/Linux e altri sistemi Unix liberi possono generalmente essere importati senza problemi. Si noti che non è possibile garantire la riuscita dell'importazione/esportazione delle VM Windows in tutti i casi, a causa dei problemi indicati sopra.

Esempio passo passo di importazione di un OVF Windows

Microsoft fornisce download di macchine virtuali per iniziare con lo sviluppo Windows. Se ne utilizzerà una per dimostrare la funzionalità di importazione OVF.

Download dello zip della macchina virtuale

Dopo aver preso visione del contratto di licenza con l'utente, selezionare Windows 10 Enterprise (Evaluation - Build) per la piattaforma VMware e scaricare lo zip.

Estrazione dell'immagine disco dallo zip

Utilizzando l'utility unzip o un qualsiasi altro archiviatore a scelta, estrarre lo zip e copiare tramite ssh/scp i file ovf e vmdk sull'host Proxmox VE.

Importazione della macchina virtuale

Questa operazione creerà una nuova macchina virtuale, utilizzando il numero di core, la memoria e il nome della VM letti dal manifest OVF, e importerà i dischi nello storage local-lvm. È necessario configurare manualmente la rete.

# qm importovf 999 WinDev1709Eval.ovf local-lvm

La VM è pronta per essere avviata.

Aggiunta di un'immagine disco esterna a una macchina virtuale

È anche possibile aggiungere a una VM un'immagine disco esistente, proveniente da un hypervisor di terze parti oppure creata autonomamente.

Supponendo di aver creato un'immagine disco Debian/Ubuntu con lo strumento vmdebootstrap:

vmdebootstrap --verbose \
 --size 10GiB --serial-console \
 --grub --no-extlinux \
 --package openssh-server \
 --package avahi-daemon \
 --package qemu-guest-agent \
 --hostname vm600 --enable-dhcp \
 --customize=./copy_pub_ssh.sh \
 --sparse --image vm600.raw

È ora possibile creare una nuova VM di destinazione, importando l'immagine nello storage pvedir e collegandola al controller SCSI della VM:

# qm create 600 --net0 virtio,bridge=vmbr0 --name vm600 --serial0 socket \
   --boot order=scsi0 --scsihw virtio-scsi-pci --ostype l26 \
   --scsi0 pvedir:0,import-from=/path/to/dir/vm600.raw

La VM è pronta per essere avviata.

10.8. Supporto Cloud-Init

Cloud-Init è il package multi-distribuzione de facto che gestisce l'inizializzazione iniziale di un'istanza di macchina virtuale. Utilizzando Cloud-Init, è possibile configurare i dispositivi di rete e le chiavi ssh dal lato dell'hypervisor. Al primo avvio della VM, il software Cloud-Init all'interno della VM applicherà tali impostazioni.

Molte distribuzioni Linux forniscono immagini Cloud-Init pronte all'uso, progettate principalmente per OpenStack. Queste immagini funzionano anche con Proxmox VE. Sebbene possa sembrare comodo utilizzare tali immagini pronte all'uso, generalmente si consiglia di preparare le immagini autonomamente. Il vantaggio è che si saprà esattamente cosa è stato installato, facilitando in seguito la personalizzazione dell'immagine in base alle proprie esigenze.

Una volta creata un'immagine Cloud-Init di questo tipo, si consiglia di convertirla in un template di VM. Da un template di VM è possibile creare rapidamente cloni collegati, un metodo veloce per distribuire nuove istanze di VM. È necessario solo configurare la rete (ed eventualmente le chiavi SSH) prima di avviare la nuova VM.

Si consiglia di utilizzare l'autenticazione basata su chiave SSH per accedere alle VM provisionate da Cloud-Init. È anche possibile impostare una password, ma questa soluzione non è sicura come l'autenticazione basata su chiave SSH poiché Proxmox VE deve memorizzare una versione cifrata di tale password all'interno dei dati di Cloud-Init.

Proxmox VE genera un'immagine ISO per passare i dati di Cloud-Init alla VM. Per tale scopo, tutte le VM Cloud-Init devono disporre di un'unità CD-ROM assegnata. Solitamente dovrebbe essere aggiunta una console seriale e utilizzata come display. Molte immagini Cloud-Init si basano su questo, che è un requisito per OpenStack. Tuttavia, altre immagini potrebbero presentare problemi con questa configurazione. Ripristinare la configurazione predefinita del display se l'utilizzo di una console seriale non funziona.

10.8.1. Preparazione dei template Cloud-Init

Il primo passaggio consiste nel preparare la VM. In pratica si può utilizzare qualsiasi VM. Basta installare i pacchetti Cloud-Init all'interno della VM che si desidera preparare. Sui sistemi basati su Debian/Ubuntu è sufficiente eseguire:

apt-get install cloud-init
Warning Questo comando non deve essere eseguito sull'host Proxmox VE, ma solo all'interno della VM.

Molte distribuzioni forniscono già immagini Cloud-Init pronte all'uso (fornite come file .qcow2), quindi in alternativa è possibile semplicemente scaricare e importare tali immagini. Per l'esempio seguente, verrà utilizzata l'immagine cloud fornita da Ubuntu all'indirizzo https://cloud-images.ubuntu.com.

# download the image
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

# create a new VM with VirtIO SCSI controller
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci

# import the downloaded disk to the local-lvm storage, attaching it as a SCSI drive
qm set 9000 --scsi0 local-lvm:0,import-from=/path/to/bionic-server-cloudimg-amd64.img
Note Le immagini Cloud-Init di Ubuntu richiedono il tipo di controller virtio-scsi-pci per le unità SCSI.
screenshot/gui-cloudinit-hardware.png
Add Cloud-Init CD-ROM drive

Il passaggio successivo consiste nel configurare un'unità CD-ROM, che verrà utilizzata per passare i dati di Cloud-Init alla VM.

qm set 9000 --ide2 local-lvm:cloudinit

Per poter avviare direttamente dall'immagine Cloud-Init, impostare il parametro boot su order=scsi0 per limitare il BIOS all'avvio solo da questo disco. Questo velocizzerà l'avvio, poiché il BIOS della VM salta il test per un CD-ROM avviabile.

qm set 9000 --boot order=scsi0

Per molte immagini Cloud-Init, è necessario configurare una console seriale e utilizzarla come display. Se tuttavia la configurazione non funziona per una determinata immagine, ripristinare invece il display predefinito.

qm set 9000 --serial0 socket --vga serial0

Come ultimo passaggio, è utile convertire la VM in un template. Da questo template è quindi possibile creare rapidamente cloni collegati. La distribuzione da template di VM è molto più rapida rispetto alla creazione di un clone completo (copia).

qm template 9000

10.8.2. Distribuzione dei template Cloud-Init

screenshot/gui-cloudinit-config.png

È possibile distribuire facilmente un template di questo tipo tramite clonazione:

qm clone 9000 123 --name ubuntu2

Configurare quindi la chiave pubblica SSH utilizzata per l'autenticazione e configurare l'impostazione IP:

qm set 123 --sshkey ~/.ssh/id_rsa.pub
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1

È anche possibile configurare tutte le opzioni di Cloud-Init con un unico comando. L'esempio precedente è stato semplicemente suddiviso per separare i comandi e ridurre la lunghezza delle righe. Assicurarsi inoltre di adattare l'impostazione IP al proprio ambiente specifico.

10.8.3. Configurazione Cloud-Init personalizzata

L'integrazione Cloud-Init consente inoltre di utilizzare file di configurazione personalizzati invece di quelli generati automaticamente. Questo viene effettuato tramite l'opzione cicustom da riga di comando:

qm set 9000 --cicustom "user=<volume>,network=<volume>,meta=<volume>"

I file di configurazione personalizzati devono trovarsi su uno storage che supporta gli snippet e devono essere disponibili su tutti i nodi verso cui verrà migrata la VM. In caso contrario la VM non potrà essere avviata. Ad esempio:

qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"

Esistono tre tipi di configurazione per Cloud-Init. Il primo è la configurazione user come mostrato nell'esempio precedente. Il secondo è la configurazione network e il terzo la configurazione meta. Possono essere tutti specificati insieme o combinati secondo necessità. La configurazione generata automaticamente verrà utilizzata per qualsiasi configurazione per cui non sia specificato un file di configurazione personalizzato.

La configurazione generata può essere esportata per servire come base per configurazioni personalizzate:

qm cloudinit dump 9000 user

Lo stesso comando esiste per network e meta.

10.8.4. Cloud-Init su Windows

Esiste una riimplementazione di Cloud-Init disponibile per Windows chiamata cloudbase-init. Non tutte le funzionalità di Cloud-Init sono disponibili con Cloudbase-Init, e alcune funzionalità differiscono rispetto a Cloud-Init.

Cloudbase-Init richiede sia che ostype sia impostato su una qualsiasi versione Windows sia che citype sia impostato su configdrive2, valore predefinito per qualsiasi ostype Windows.

Non sono disponibili gratuitamente immagini cloud predefinite per Windows. L'utilizzo di Cloudbase-Init richiede l'installazione e la configurazione manuale di un guest Windows.

10.8.5. Preparazione dei template Cloudbase-Init

Il primo passo è installare Windows in una VM. Scaricare e installare Cloudbase-Init nel guest. Potrebbe essere necessario installare la versione Beta. Non eseguire Sysprep al termine dell'installazione. Configurare invece prima Cloudbase-Init.

Alcune opzioni comuni da impostare sono:

  • username: imposta il nome utente dell'amministratore

  • groups: consente di aggiungere l'utente al gruppo Administrators

  • inject_user_password: impostare su true per consentire l'impostazione della password nella configurazione della VM

  • first_logon_behaviour: impostare su no per non richiedere una nuova password al login

  • rename_admin_user: impostare su true per consentire di rinominare l'utente predefinito Administrator con il nome utente specificato in username

  • metadata_services: impostare su cloudbaseinit.metadata.services.configdrive.ConfigDriveService affinché Cloudbase-Init verifichi prima questo servizio. In caso contrario, Cloudbase-Init potrebbe richiedere alcuni minuti per configurare il sistema dopo l'avvio.

Alcuni plugin, ad esempio SetHostnamePlugin, richiedono riavvii e li eseguono automaticamente. Per disabilitare i riavvii automatici da parte di Cloudbase-Init, è possibile impostare allow_reboot su false.

Un elenco completo delle opzioni di configurazione è disponibile nella documentazione ufficiale di cloudbase-init.

Può essere utile creare uno snapshot dopo la configurazione nel caso in cui alcune parti della configurazione necessitino ancora di modifiche. Dopo aver configurato Cloudbase-Init è possibile iniziare a creare il template. Arrestare il guest Windows, aggiungere un disco Cloud-Init e trasformarlo in un template.

qm set 9000 --ide2 local-lvm:cloudinit
qm template 9000

Clonare il template in una nuova VM:

qm clone 9000 123 --name windows123

Impostare quindi la password, la configurazione di rete e la chiave SSH:

qm set 123 --cipassword <password>
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1
qm set 123 --sshkey ~/.ssh/id_rsa.pub

Assicurarsi che ostype sia impostato su una qualsiasi versione di Windows prima di impostare la password. In caso contrario la password verrà cifrata e Cloudbase-Init utilizzerà la password cifrata come password in chiaro.

Una volta impostato tutto, avviare il guest clonato. Al primo avvio il login non funzionerà e il sistema si riavvierà automaticamente per l'hostname modificato. Dopo il riavvio la nuova password dovrebbe essere impostata e il login dovrebbe funzionare.

10.8.6. Cloudbase-Init e Sysprep

Sysprep è una funzionalità per ripristinare la configurazione di Windows e fornire un sistema nuovo. Può essere utilizzato insieme a Cloudbase-Init per creare un template pulito.

Quando si utilizza Sysprep, è necessario adattare 2 file di configurazione. Il primo è il normale file di configurazione, il secondo è quello che termina con -unattend.conf.

Cloudbase-Init viene eseguito in 2 fasi: prima la fase Sysprep che utilizza -unattend.conf e poi la fase normale che utilizza il file di configurazione primario.

Per Windows Server, l'esecuzione di Sysprep con il file Unattend.xml fornito dovrebbe funzionare senza modifiche. Le normali versioni di Windows richiedono invece passaggi aggiuntivi:

  1. Aprire un'istanza di PowerShell

  2. Abilitare l'utente Administrator:

    net user Administrator /active:yes`
  3. Installare Cloudbase-Init utilizzando l'utente Administrator

  4. Modificare Unattend.xml per includere il comando per abilitare l'utente Administrator al primo avvio dopo l'esecuzione di sysprep:

    <RunSynchronousCommand wcm:action="add">
      <Path>net user administrator /active:yes</Path>
      <Order>1</Order>
      <Description>Enable Administrator User</Description>
    </RunSynchronousCommand>

    Assicurarsi che <Order> non vada in conflitto con altri comandi sincroni. Modificare <Order> del comando Cloudbase-Init per eseguirlo dopo questo, aumentando il numero a un valore più alto: <Order>2</Order>

  5. (solo Windows 11) Rimuovere il package Microsoft.OneDriveSync in conflitto:

    Get-AppxPackage -AllUsers Microsoft.OneDriveSync | Remove-AppxPackage -AllUsers
  6. Eseguire cd nella directory di configurazione di Cloudbase-Init:

    cd 'C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf'
  7. (opzionale) Creare uno snapshot della VM prima di Sysprep nel caso di una configurazione errata

  8. Eseguire Sysprep:

    C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml

Dopo aver seguito i passaggi precedenti, la VM dovrebbe essere in stato di arresto a causa di Sysprep. A questo punto è possibile trasformarla in un template, clonarla e configurarla secondo le necessità.

10.8.7. Opzioni specifiche di Cloud-Init

cicustom: [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

Specificare file personalizzati per sostituire quelli generati automaticamente all'avvio.

meta=<volume>

Specificare un file personalizzato contenente tutti i metadati passati alla VM tramite cloud-init. Questo è specifico per il provider, il che significa che configdrive2 e nocloud differiscono.

network=<volume>

Per passare un file personalizzato contenente tutti i dati di rete alla VM tramite cloud-init.

user=<volume>

Per passare alla VM un file personalizzato contenente tutti i dati utente tramite cloud-init.

vendor=<volume>

Per passare alla VM un file personalizzato contenente tutti i dati vendor tramite cloud-init.

cipassword: <string>

Password da assegnare all'utente. In genere, l'uso di questa opzione non è consigliato: si consiglia di utilizzare le chiavi ssh. Si noti inoltre che le versioni più vecchie di cloud-init non supportano le password con hash.

citype: <configdrive2 | nocloud | opennebula>

Specifica il formato di configurazione di cloud-init. Il valore predefinito dipende dal tipo di sistema operativo configurato (ostype). Viene utilizzato il formato nocloud per Linux e configdrive2 per Windows.

ciupgrade: <boolean> (default = 1)

Esegue un aggiornamento automatico dei pacchetti dopo il primo avvio.

ciuser: <string>

Nome utente per cui modificare le chiavi ssh e la password, al posto dell'utente predefinito configurato nell'immagine.

ipconfig[n]: [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

Specificare gli indirizzi IP e i gateway per l'interfaccia corrispondente.

Gli indirizzi IP utilizzano la notazione CIDR; i gateway sono opzionali, ma richiedono la specifica di un IP dello stesso tipo.

La stringa speciale dhcp può essere utilizzata per gli indirizzi IP per usare il DHCP, nel qual caso non deve essere specificato alcun gateway esplicito. Per IPv6, la stringa speciale auto può essere utilizzata per la configurazione automatica stateless. Questo richiede cloud-init 19.4 o versioni successive.

Se cloud-init è abilitato e non viene specificato né un indirizzo IPv4 né un indirizzo IPv6, viene utilizzato per impostazione predefinita il DHCP su IPv4.

gw=<GatewayIPv4>

Gateway predefinito per il traffico IPv4.

Note Richiede l'opzione/le opzioni: ip
gw6=<GatewayIPv6>

Gateway predefinito per il traffico IPv6.

Note Richiede l'opzione/le opzioni: ip6
ip=<IPv4Format/CIDR> (default = dhcp)

Indirizzo IPv4 in formato CIDR.

ip6=<IPv6Format/CIDR> (default = dhcp)

Indirizzo IPv6 in formato CIDR.

nameserver: <string>

Impostare l'indirizzo IP del server DNS per un container. La creazione utilizzerà automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

searchdomain: <string>

Impostare i domini di ricerca DNS per un container. La creazione utilizzerà automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

sshkeys: <string>

Configurare le chiavi SSH pubbliche (una chiave per riga, formato OpenSSH).

10.9. Passthrough PCI(e)

Il passthrough PCI(e) è un meccanismo che consente a una macchina virtuale di avere il controllo di un dispositivo PCI dell'host. Questo può offrire alcuni vantaggi rispetto all'uso di hardware virtualizzato, ad esempio una latenza inferiore, prestazioni più elevate o funzionalità aggiuntive (ad es. l'offloading).

Tuttavia, se un dispositivo viene passato in passthrough a una macchina virtuale, tale dispositivo non può più essere utilizzato sull'host né in nessun'altra VM.

Si noti che, sebbene il passthrough PCI sia disponibile per le macchine i440fx e q35, il passthrough PCIe è disponibile solo sulle macchine q35. Questo non significa che i dispositivi compatibili con PCIe, passati in passthrough come dispositivi PCI, funzioneranno solo alla velocità PCI. Passare in passthrough i dispositivi come PCIe imposta semplicemente un flag che indica al guest che il dispositivo è un dispositivo PCIe invece di un "vecchio dispositivo PCI davvero veloce". Alcune applicazioni guest beneficiano di questo.

10.9.1. Requisiti generali

Poiché il passthrough viene eseguito su hardware reale, è necessario soddisfare alcuni requisiti. Di seguito viene fornita una breve panoramica di tali requisiti; per ulteriori informazioni su dispositivi specifici, consultare PCI Passthrough Examples.

Hardware

L'hardware in uso deve supportare il rimappaggio degli interrupt IOMMU (I/O Memory Management Unit), sia a livello di CPU che di scheda madre.

Generalmente, i sistemi Intel con VT-d e i sistemi AMD con AMD-Vi supportano questa funzionalità. Su arm64, l'equivalente è la System Memory Management Unit (SMMU), fornita dalle piattaforme supportate. Non è garantito che tutto funzioni immediatamente, a causa di implementazioni hardware difettose o driver mancanti o di scarsa qualità.

Inoltre, l'hardware di livello server ha spesso un supporto migliore rispetto all'hardware consumer, ma anche in questo caso molti sistemi moderni possono supportarla.

Si consiglia di consultare il produttore dell'hardware per verificare se questa funzionalità è supportata sotto Linux per la configurazione specifica in uso.

Determinazione dell'indirizzo della scheda PCI

Il modo più semplice è utilizzare la GUI per aggiungere un dispositivo di tipo "Host PCI" nella scheda hardware della VM. In alternativa, è possibile utilizzare la riga di comando.

È possibile individuare la scheda utilizzando

 lspci
Configurazione

Dopo aver verificato che l'hardware supporti il passthrough, è necessario eseguire alcune operazioni di configurazione per attivare il passthrough PCI(e).

IOMMU

È necessario attivare il supporto IOMMU nel BIOS/UEFI. Generalmente l'impostazione corrispondente si chiama IOMMU o VT-d, ma è opportuno verificare il nome esatto dell'opzione nel manuale della scheda madre.

Con le CPU AMD, IOMMU è attivo per impostazione predefinita. Con i kernel recenti (6.8 o successivi), ciò vale anche per le CPU Intel. Sui kernel meno recenti, è necessario attivarlo sulle CPU Intel tramite la riga di comando del kernel aggiungendo:

 intel_iommu=on
Note Il parametro intel_iommu=on si applica agli host x86. Su arm64, l'SMMU viene attivata tramite firmware e ACPI, pertanto non è necessario alcun parametro di questo tipo nella riga di comando del kernel.
IOMMU Passthrough Mode

Se l'hardware supporta la modalità IOMMU passthrough, attivare questa modalità potrebbe aumentare le prestazioni. Questo perché le VM bypassano la traduzione DMA (predefinita) normalmente eseguita dall'hypervisor e inviano invece le richieste DMA direttamente all'IOMMU hardware. Per attivare queste opzioni, aggiungere:

 iommu=pt
Kernel Modules

Assicurarsi che i seguenti moduli vengano caricati aggiungendoli a un file in '/etc/modules-load.d/', ad esempio '/etc/modules-load.d/vfio.conf':

Note
Passthrough di dispositivi mediati

Se si effettua il passthrough di dispositivi mediati (ad es. vGPU), quanto segue non è necessario. In questi casi, il dispositivo sarà gestito direttamente dal driver host appropriato.

 vfio
 vfio_iommu_type1
 vfio_pci

Dopo aver modificato qualsiasi elemento relativo ai moduli, è necessario aggiornare l'initramfs. Su Proxmox VE, è possibile farlo eseguendo:

# update-initramfs -u -k all

Per verificare se i moduli vengono caricati, l'output di

# lsmod | grep vfio

dovrebbe includere i tre moduli indicati sopra.

Finish Configuration

Infine, riavviare per rendere effettive le modifiche e verificare che IOMMU sia effettivamente attivo.

# dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

dovrebbe mostrare che IOMMU, Directed I/O o Interrupt Remapping è attivo; il messaggio esatto può variare in base all'hardware e al kernel.

Per indicazioni su come risolvere i problemi o verificare se IOMMU funziona come previsto, si rimanda alla sezione Verifying IOMMU Parameters nel wiki.

È inoltre importante che il dispositivo o i dispositivi di cui si desidera effettuare il passthrough si trovino in un gruppo separato IOMMU. È possibile verificarlo con una chiamata all'API di Proxmox VE:

# pvesh get /nodes/{nodename}/hardware/pci --pci-class-blacklist ""

È accettabile che il dispositivo si trovi in un gruppo IOMMU insieme alle proprie funzioni (ad es. una GPU con il dispositivo audio HDMI) o con la propria root port o bridge PCI(e).

Note
Slot PCI(e)

Alcune piattaforme gestiscono diversamente i propri slot PCI(e) fisici. A volte può essere utile inserire la scheda in un altro slot PCI(e), se non si ottiene la separazione desiderata dei gruppi IOMMU.

Note
Interrupt non sicuri

Per alcune piattaforme, può essere necessario consentire gli interrupt non sicuri. Per farlo, aggiungere la riga seguente a un file con estensione .conf in /etc/modprobe.d/:

 options vfio_iommu_type1 allow_unsafe_interrupts=1

Si tenga presente che questa opzione può rendere instabile il sistema.

Note sul passthrough GPU

Non è possibile visualizzare il frame buffer della GPU tramite NoVNC o SPICE nell'interfaccia web di Proxmox VE.

Quando si effettua il passthrough di un'intera GPU o di una vGPU e si desidera l'output grafico, è necessario collegare fisicamente un monitor alla scheda, oppure configurare un software di desktop remoto (ad esempio VNC o RDP) all'interno del guest.

Se si desidera utilizzare la GPU solo come acceleratore hardware — ad esempio, con programmi che utilizzano OpenCL o CUDA — questo non è necessario.

10.9.2. Passthrough di dispositivi host

La variante più utilizzata del passthrough PCI(e) consiste nell'effettuare il passthrough di un'intera scheda PCI(e), ad esempio una GPU o una scheda di rete.

Configurazione dell'host

Proxmox VE tenta automaticamente di rendere non disponibile per l'host il dispositivo PCI(e). Tuttavia, se questo non funziona, è possibile eseguire due operazioni:

  • passare gli ID dei dispositivi alle opzioni dei moduli vfio-pci aggiungendo

     options vfio-pci ids=1234:5678,4321:8765

    a un file .conf in /etc/modprobe.d/, dove 1234:5678 e 4321:8765 sono gli ID del vendor e del dispositivo ottenuti tramite:

    # lspci -nn
  • inserire il driver nella blacklist dell'host per impedirne completamente il caricamento, assicurando che il dispositivo sia disponibile per l'associazione al driver per il passthrough, aggiungendo

     blacklist DRIVERNAME

    a un file .conf in /etc/modprobe.d/.

    Per trovare il nome del driver, eseguire

    # lspci -k

    ad esempio:

    # lspci -k | grep -A 3 "VGA"

    produrrà un output simile a questo

    01:00.0 VGA compatible controller: NVIDIA Corporation GP108 [GeForce GT 1030] (rev a1)
            Subsystem: Micro-Star International Co., Ltd. [MSI] GP108 [GeForce GT 1030]
            Kernel driver in use: <some-module>
            Kernel modules: <some-module>

    Ora è possibile inserire i driver nella blacklist scrivendoli in un file .conf:

    echo "blacklist <some-module>" >> /etc/modprobe.d/blacklist.conf

Per entrambi i metodi è necessario aggiornare l'initramfs e riavviare in seguito.

Se questo non funziona, potrebbe essere necessario impostare una dipendenza soft per caricare vfio-pci prima di caricare i moduli della GPU. Questo può essere fatto con il flag softdep; vedere anche le manpage di modprobe.d per maggiori informazioni.

Ad esempio, se si utilizzano driver denominati <some-module>:

# echo "softdep <some-module> pre: vfio-pci" >> /etc/modprobe.d/<some-module>.conf
Verify Configuration

Per verificare se le modifiche hanno avuto successo, è possibile utilizzare

# lspci -nnk

e controllare la voce del dispositivo. Se viene indicato

Kernel driver in use: vfio-pci

oppure se la riga in use è del tutto assente, il dispositivo è pronto per essere utilizzato per il passthrough.

Note
Dispositivi mediati

Per i dispositivi mediati questa riga sarà diversa, poiché il dispositivo sarà di proprietà diretta del driver dell'host e non di vfio-pci.

Configurazione della VM

Quando si effettua il passthrough di una GPU, la migliore compatibilità si ottiene utilizzando q35 come tipo di macchina, OVMF (UEFI per le VM) invece di SeaBIOS e PCIe invece di PCI. Notare che se si desidera utilizzare OVMF per il passthrough della GPU, la GPU deve disporre di una ROM compatibile con UEFI, altrimenti utilizzare SeaBIOS. Per verificare se la ROM è compatibile con UEFI, consultare la wiki PCI Passthrough Examples.

Inoltre, quando si utilizza OVMF, l'arbitraggio VGA può potenzialmente essere disabilitato, riducendo la quantità di codice legacy che deve essere eseguito all'avvio. Per disabilitare l'arbitraggio VGA:

 echo "options vfio-pci ids=<vendor-id>,<device-id> disable_vga=1" > /etc/modprobe.d/vfio.conf

sostituendo <vendor-id> e <device-id> con quelli ottenuti tramite:

# lspci -nn

I dispositivi PCI possono essere aggiunti nell'interfaccia web, nella sezione hardware della VM. In alternativa, è possibile utilizzare la riga di comando; impostare l'opzione hostpciX nella configurazione della VM, ad esempio eseguendo:

# qm set VMID -hostpci0 00:02.0

oppure aggiungendo una riga al file di configurazione della VM:

 hostpci0: 00:02.0

Se il dispositivo dispone di più funzioni (ad es. ‘00:02.0’ e ‘00:02.1’), è possibile effettuarne il passthrough tutte insieme con la sintassi abbreviata ``00:02`. Questo equivale a selezionare la casella di controllo ``All Functions` nell'interfaccia web.

Esistono alcune opzioni che potrebbero essere necessarie, in base al dispositivo e al sistema operativo guest:

  • x-vga=on|off contrassegna il dispositivo PCI(e) come GPU primaria della VM. Con questa opzione attivata, l'opzione di configurazione vga verrà ignorata.

  • pcie=on|off indica a Proxmox VE di utilizzare una porta PCIe o PCI. Alcune combinazioni di guest/dispositivo richiedono PCIe invece di PCI. PCIe è disponibile solo per i tipi di macchina q35.

  • rombar=on|off rende visibile al guest la ROM del firmware. Il valore predefinito è on. Alcuni dispositivi PCI(e) richiedono che questa opzione sia disabilitata.

  • romfile=<path> è un percorso opzionale a un file ROM che il dispositivo deve utilizzare. Si tratta di un percorso relativo sotto /usr/share/kvm/.

Example

Un esempio di passthrough PCIe con una GPU impostata come primaria:

# qm set VMID -hostpci0 02:00,pcie=on,x-vga=on
PCI ID overrides

È possibile sovrascrivere l'ID vendor PCI, l'ID dispositivo e gli ID di sottosistema che saranno visibili al guest. Questo è utile se il dispositivo è una variante con un ID che i driver del guest non riconoscono, ma si desidera forzare comunque il caricamento di tali driver (ad es. se si sa che il dispositivo condivide lo stesso chipset di una variante supportata).

Le opzioni disponibili sono vendor-id, device-id, sub-vendor-id e sub-device-id. È possibile impostare una o più di queste opzioni per sovrascrivere gli ID predefiniti del dispositivo.

Ad esempio:

# qm set VMID -hostpci0 02:00,device-id=0x10f6,sub-vendor-id=0x0000

10.9.3. SR-IOV

Un'altra variante per effettuare il passthrough di dispositivi PCI(e) consiste nell'utilizzare le funzionalità di virtualizzazione hardware dei dispositivi, se disponibili.

Note
Attivazione di SR-IOV

Per utilizzare SR-IOV, il supporto della piattaforma è particolarmente importante. Potrebbe essere necessario attivare prima questa funzionalità nel BIOS/UEFI, oppure utilizzare una porta PCI(e) specifica perché funzioni. In caso di dubbio, consultare il manuale della piattaforma o contattare il vendor.

SR-IOV (Single-Root Input/Output Virtualization) consente a un singolo dispositivo di fornire al sistema più VF (Virtual Function). Ciascuna di queste VF può essere utilizzata in una VM diversa, con funzionalità hardware complete e con prestazioni migliori e latenza inferiore rispetto ai dispositivi virtualizzati tramite software.

Attualmente, il caso d'uso più comune è quello delle NIC (Network Interface Card) con supporto SR-IOV, che possono fornire più VF per porta fisica. Ciò consente di utilizzare all'interno di una VM funzionalità come l'offloading del checksum, riducendo l'overhead della CPU (host).

Configurazione dell'host

In generale, esistono due metodi per abilitare le funzioni virtuali su un dispositivo.

  • a volte è disponibile un'opzione per il modulo del driver, ad esempio per alcuni driver Intel

     max_vfs=4

    che può essere inserita in un file con estensione .conf sotto /etc/modprobe.d/. (Non dimenticare di aggiornare l'initramfs dopo questa operazione)

    Fare riferimento alla documentazione del modulo del driver per i parametri e le opzioni esatti.

  • Il secondo metodo, più generico, consiste nell'utilizzare il sysfs. Se un dispositivo e il relativo driver supportano questa funzionalità, è possibile modificare il numero di VF a caldo. Ad esempio, per impostare 4 VF sul dispositivo 0000:01:00.0 eseguire:

    # echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs

    Per rendere permanente questa modifica, è possibile utilizzare il package Debian "sysfsutils". Dopo l'installazione, configurarlo tramite /etc/sysfs.conf o un "FILE.conf" in /etc/sysfs.d/.

Configurazione della VM

Dopo la creazione delle VF, queste dovrebbero apparire come dispositivi PCI(e) separati quando vengono elencati con lspci. Recuperare il loro ID e passarli come un normale dispositivo PCI(e).

10.9.4. Dispositivi mediati (vGPU, GVT-g)

I dispositivi mediati sono un altro metodo per riutilizzare funzionalità e prestazioni dell'hardware fisico per l'hardware virtualizzato. Si trovano più comunemente in configurazioni GPU virtualizzate come GVT-g di Intel e vGPU di NVIDIA, utilizzate nella loro tecnologia GRID.

Con questa tecnologia, una scheda fisica è in grado di creare schede virtuali, in modo simile a SR-IOV. La differenza è che i dispositivi mediati non appaiono come dispositivi PCI(e) sull'host e sono quindi adatti solo all'uso all'interno di macchine virtuali.

Configurazione dell'host

In generale, il driver della scheda deve supportare questa funzionalità, altrimenti non funzionerà. Si consiglia quindi di fare riferimento al produttore per i driver compatibili e per le istruzioni di configurazione.

I driver Intel per GVT-g sono integrati nel kernel e dovrebbero funzionare con i processori Intel Core di 5ª, 6ª e 7ª generazione, così come con i processori Xeon E3 v4, E3 v5 ed E3 v6.

Per abilitarlo con le Intel Graphics, è necessario assicurarsi di caricare il modulo kvmgt (ad esempio tramite /etc/modules-load.d/) e di abilitarlo nella riga di comando del kernel aggiungendo il seguente parametro:

 i915.enable_gvt=1

Successivamente, ricordarsi di aggiornare l'initramfs, e riavviare l'host.

Configurazione della VM

Per utilizzare un dispositivo mediato, è sufficiente specificare la proprietà mdev in un'opzione di configurazione della VM hostpciX.

È possibile ottenere i dispositivi supportati tramite il sysfs. Ad esempio, per elencare i tipi supportati per il dispositivo 0000:00:02.0 è sufficiente eseguire:

# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types

Ogni voce è una directory che contiene i seguenti file importanti:

  • available_instances contiene il numero di istanze ancora disponibili di questo tipo; ogni mdev utilizzato in una VM riduce questo valore.

  • description contiene una breve descrizione delle capacità del tipo

  • create è l'endpoint per creare un tale dispositivo — Proxmox VE lo fa automaticamente se è configurata un'opzione hostpciX con mdev.

Esempio di configurazione con una Intel GVT-g vGPU (Intel Skylake 6700k):

# qm set VMID -hostpci0 00:02.0,mdev=i915-GVTg_V5_4

Con questa impostazione, Proxmox VE crea automaticamente tale dispositivo all'avvio della VM, e lo elimina quando la VM si arresta.

10.9.5. Utilizzo nei cluster

È anche possibile mappare i dispositivi a livello di cluster, in modo che possano essere utilizzati correttamente con l'HA, che le modifiche hardware vengano rilevate e che gli utenti non root possano configurarli. Per i dettagli, consultare Mappatura delle risorse.

10.9.6. vIOMMU (IOMMU emulata)

vIOMMU è l'emulazione di un IOMMU hardware all'interno di una macchina virtuale, che fornisce un controllo di accesso alla memoria e una sicurezza migliorati per i dispositivi I/O virtualizzati. L'uso dell'opzione vIOMMU consente anche di effettuare il passthrough di dispositivi PCI(e) a VM di livello 2 in VM di livello 1 tramite la virtualizzazione annidata. Per effettuare il passthrough di dispositivi PCI(e) fisici dall'host a VM annidate, seguire le istruzioni per il passthrough PCI(e).

Sono attualmente disponibili due implementazioni di vIOMMU: Intel e VirtIO.

vIOMMU Intel

Requisiti della VM specifici per vIOMMU Intel:

  • Indipendentemente dal fatto che sull'host venga utilizzata una CPU Intel o AMD, è importante impostare intel_iommu=on nei parametri del kernel della VM.

  • Per utilizzare Intel vIOMMU è necessario impostare q35 come tipo di macchina.

Se tutti i requisiti sono soddisfatti, è possibile aggiungere viommu=intel al parametro machine nella configurazione della VM che deve essere in grado di effettuare il pass-through di dispositivi PCI.

# qm set VMID -machine q35,viommu=intel
VirtIO vIOMMU

Questa implementazione di vIOMMU è più recente e non presenta tante limitazioni quante quelle di Intel vIOMMU, ma è attualmente meno utilizzata in produzione e meno documentata.

Con VirtIO vIOMMU non è necessario impostare alcun parametro del kernel. Inoltre non è necessario utilizzare q35 come tipo di macchina, ma è consigliabile se si desidera utilizzare PCIe.

# qm set VMID -machine q35,viommu=virtio

10.10. Hookscript

È possibile aggiungere uno script hook alle VM con la proprietà di configurazione hookscript.

# qm set 100 --hookscript local:snippets/hookscript.pl

Verrà richiamato durante varie fasi del ciclo di vita del guest. Per un esempio e la documentazione, vedere lo script di esempio in /usr/share/pve-docs/examples/guest-example-hookscript.pl.

10.11. Ibernazione

È possibile sospendere su disco una VM con l'opzione della GUI Hibernate oppure con

# qm suspend ID --todisk

Ciò significa che il contenuto corrente della memoria verrà salvato su disco e la VM verrà arrestata. Al successivo avvio, il contenuto della memoria verrà caricato e la VM potrà continuare da dove era stata interrotta.

State storage selection

Se non viene indicato alcuno storage di destinazione per la memoria, verrà scelto automaticamente il primo tra i seguenti:

  1. Lo storage vmstatestorage dalla configurazione della VM.

  2. Il primo storage condiviso utilizzato da un qualsiasi disco di una VM.

  3. Il primo storage non condiviso utilizzato da un qualsiasi disco di una VM.

  4. Lo storage local come fallback.

10.12. Mappatura delle risorse

screenshot/gui-datacenter-resource-mappings.png

Quando si utilizzano risorse locali (ad es. l'indirizzo di un dispositivo PCI) o si fa riferimento a esse, l'utilizzo dell'indirizzo o dell'ID in forma grezza risulta a volte problematico, ad esempio:

  • quando si utilizza HA, sul nodo di destinazione potrebbe esistere un dispositivo diverso con lo stesso id o percorso e, se non si presta attenzione nell'assegnare tali guest ai gruppi HA, potrebbe essere utilizzato il dispositivo errato, compromettendo le configurazioni.

  • la modifica dell'hardware può cambiare id e percorsi, pertanto sarebbe necessario controllare tutti i dispositivi assegnati e verificare se il percorso o l'id sono ancora corretti.

Per gestire meglio questa situazione, è possibile definire mappature delle risorse a livello di cluster, in modo che una risorsa disponga di un identificatore univoco a livello di cluster, selezionato dall'utente, che può corrispondere a dispositivi diversi su host diversi. In questo modo, HA non avvierà un guest con un dispositivo errato, e le modifiche hardware potranno essere rilevate.

La creazione di tale mappatura può essere effettuata tramite l'interfaccia web di Proxmox VE, in Datacenter nella relativa scheda, nella categoria Resource Mappings, oppure da riga di comando con

# pvesh create /cluster/mapping/<type> <options>
screenshot/gui-datacenter-mapping-pci-edit.png

Dove <type> è il tipo di hardware (attualmente pci, usb oppure dir) e <options> sono le mappature dei dispositivi e gli altri parametri di configurazione.

Si noti che le opzioni devono includere una proprietà map con tutte le proprietà identificative di tale hardware, in modo che sia possibile verificare che l'hardware non sia cambiato e che venga effettuato il pass-through del dispositivo corretto.

Ad esempio, per aggiungere un dispositivo PCI come device1 con il percorso 0000:01:00.0 che ha l'id dispositivo 0001 e l'id vendor 0002 sul nodo node1, e 0000:02:00.0 su node2, è possibile aggiungerlo con:

# pvesh create /cluster/mapping/pci --id device1 \
 --map node=node1,path=0000:01:00.0,id=0002:0001 \
 --map node=node2,path=0000:02:00.0,id=0002:0001

È necessario ripetere il parametro map per ciascun nodo in cui tale dispositivo deve avere una mappatura (si noti che attualmente è possibile mappare solo un dispositivo USB per nodo per ogni mappatura).

L'utilizzo della GUI semplifica notevolmente questa operazione, poiché le proprietà corrette vengono rilevate automaticamente e inviate all'API.

screenshot/gui-datacenter-mapping-usb-edit.png

È inoltre possibile, per i dispositivi PCI, fornire più dispositivi per nodo con più proprietà map per i nodi. Se tale dispositivo viene assegnato a un guest, verrà utilizzato il primo disponibile all'avvio del guest. L'ordine dei percorsi indicati è anche l'ordine in cui vengono provati, pertanto è possibile implementare politiche di allocazione arbitrarie.

Questo è utile per i dispositivi con SR-IOV, poiché a volte non è importante quale funzione virtuale esatta venga utilizzata per il pass-through.

È possibile assegnare tale dispositivo a un guest tramite la GUI oppure con

# qm set ID -hostpci0 <name>

per i dispositivi PCI, oppure

# qm set <vmid> -usb0 <name>

per i dispositivi USB.

Dove <vmid> è l'id del guest e <name> è il nome scelto per la mappatura creata. Sono consentite tutte le opzioni consuete per il pass-through dei dispositivi, come mdev.

Per creare mapping è necessario Mapping.Modify su /mapping/<type>/<name> (dove <type> è il tipo di dispositivo e <name> è il nome del mapping).

Per utilizzare questi mapping, è necessario Mapping.Use su /mapping/<type>/<name> (in aggiunta ai normali privilegi guest per modificare la configurazione).

Additional Options

Sono disponibili opzioni aggiuntive quando si definisce un mapping delle risorse a livello di cluster. Attualmente sono disponibili le seguenti opzioni:

  • mdev (PCI): contrassegna il dispositivo PCI come capace di fornire mediated devices. Quando questa opzione è abilitata, è possibile selezionare un tipo durante la configurazione sul guest. Se per il mapping sono selezionati più dispositivi PCI, il mediated device verrà creato sul primo dispositivo in cui sono disponibili istanze del tipo selezionato.

  • live-migration-capable (PCI): contrassegna il dispositivo PCI come capace di essere migrato live tra i nodi. Ciò richiede supporto da parte del driver e dell'hardware. È noto che solo le GPU NVIDIA con kernel recente supportano questa funzionalità. Si noti che la live migration di dispositivi passthrough è una funzionalità sperimentale e potrebbe non funzionare o causare problemi.

10.13. Gestione delle macchine virtuali con qm

qm è lo strumento per gestire le macchine virtuali QEMU/KVM su Proxmox VE. È possibile creare ed eliminare macchine virtuali, e controllare l'esecuzione (avvio/arresto/sospensione/ripresa). Inoltre, è possibile utilizzare qm per impostare parametri nel file di configurazione associato. È anche possibile creare ed eliminare dischi virtuali.

10.13.1. Esempi di utilizzo da CLI

Utilizzando un file iso caricato sullo storage local, creare una VM con un disco IDE da 4 GB sullo storage local-lvm

# qm create 300 -ide0 local-lvm:4 -net0 e1000 -cdrom local:iso/proxmox-mailgateway_2.1.iso

Avviare la nuova VM

# qm start 300

Inviare una richiesta di arresto, quindi attendere finché la VM non è arrestata.

# qm shutdown 300 && qm wait 300

Come sopra, ma attendere solo per 40 secondi.

# qm shutdown 300 && qm wait 300 -timeout 40

Se la VM non si arresta, forzarne l'arresto e ignorare eventuali operazioni di arresto in corso. Poiché l'arresto delle VM può comportare la perdita di dati, utilizzare questa opzione con cautela.

# qm stop 300 -overrule-shutdown 1

L'eliminazione di una VM la rimuove sempre dalle Access Control List e rimuove sempre la configurazione del firewall della VM. È necessario attivare --purge se si desidera rimuovere anche la VM dai job di replica, dai job di backup e dalle configurazioni delle risorse HA.

Note L'attivazione di purge rimuoverà anche la risorsa HA da tutte le regole di affinità che la referenziano e rimuoverà le regole che hanno solo questa risorsa rimanente.
# qm destroy 300 --purge

Spostare un'immagine disco su uno storage diverso.

# qm move-disk 300 scsi0 other-storage

Riassegnare un'immagine disco a una VM diversa. Questo rimuoverà il disco scsi1 dalla VM di origine e lo collegherà come scsi3 alla VM di destinazione. In background l'immagine disco viene rinominata in modo che il nome corrisponda al nuovo proprietario.

# qm move-disk 300 scsi1 --target-vmid 400 --target-disk scsi3

10.14. Configurazione

I file di configurazione delle VM sono memorizzati all'interno del file system del cluster Proxmox, e sono accessibili in /etc/pve/qemu-server/<VMID>.conf. Come gli altri file memorizzati in /etc/pve/, vengono automaticamente replicati su tutti gli altri nodi del cluster.

Note I VMID < 100 sono riservati per uso interno, e i VMID devono essere univoci a livello di cluster.
Example VM Configuration
boot: order=virtio0;net0
cores: 1
sockets: 1
memory: 512
name: webmail
ostype: l26
net0: e1000=EE:D2:28:5F:B6:3E,bridge=vmbr0
virtio0: local:vm-100-disk-1,size=32G

Questi file di configurazione sono semplici file di testo, ed è possibile modificarli utilizzando un normale editor di testo (vi, nano, …). Ciò è talvolta utile per piccole correzioni, ma occorre tenere presente che è necessario riavviare la VM per applicare tali modifiche.

Per questo motivo, è generalmente preferibile utilizzare il comando qm per generare e modificare questi file, oppure eseguire l'intera operazione tramite la GUI. Il toolkit è sufficientemente intelligente da applicare istantaneamente la maggior parte delle modifiche a una VM in esecuzione. Questa funzionalità è chiamata "hot plug", e in tal caso non è necessario riavviare la VM.

10.14.1. Formato del file

I file di configurazione delle VM utilizzano un semplice formato chiave/valore separato da due punti. Ogni riga ha il seguente formato:

# this is a comment
OPTION: value

Le righe vuote in questi file vengono ignorate, e le righe che iniziano con il carattere # sono trattate come commenti e vengono anch'esse ignorate.

10.14.2. Snapshot

Quando si crea uno snapshot, qm memorizza la configurazione al momento dello snapshot in una sezione separata all'interno dello stesso file di configurazione. Ad esempio, dopo aver creato uno snapshot chiamato "testsnapshot", il file di configurazione avrà il seguente aspetto:

VM configuration with snapshot
memory: 512
swap: 512
parent: testsnaphot
...

[testsnaphot]
memory: 512
swap: 512
snaptime: 1457170803
...

Esistono alcune proprietà relative agli snapshot, come parent e snaptime. La proprietà parent viene utilizzata per memorizzare la relazione padre/figlio tra gli snapshot. snaptime è il timestamp di creazione dello snapshot (Unix epoch).

È possibile salvare facoltativamente la memoria di una VM in esecuzione con l'opzione vmstate. Per informazioni su come viene scelto lo storage di destinazione per lo stato della VM, vedere Selezione dello storage per lo stato nel capitolo Ibernazione.

10.14.3. Opzioni

acpi: <boolean> (default = 1)

Abilitare/disabilitare ACPI.

affinity: <string>

Elenco dei core host utilizzati per eseguire i processi guest, ad esempio: 0,5,8-11

agent: [enabled=]<1|0> [,freeze-fs=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

Abilitare/disabilitare la comunicazione con il QEMU Guest Agent e le relative proprietà.

enabled=<boolean> (default = 0)

Abilitare/disabilitare la comunicazione con un QEMU Guest Agent (QGA) in esecuzione nella VM.

freeze-fs=<boolean> (default = 1)

Indica se eseguire i comandi guest-fsfreeze-freeze e guest-fsfreeze-thaw del QEMU guest agent. I backup in modalità snapshot, i cloni, gli snapshot senza RAM, l'importazione di dischi da un guest in esecuzione e le replicazioni normalmente eseguono un comando guest-fsfreeze-freeze e il relativo comando thaw quando l'opzione QEMU Guest Agent è abilitata nella configurazione del guest e l'agent è in esecuzione all'interno del guest.

L'impostazione deprecata freeze-fs-on-backup viene trattata come alias di questa impostazione.

fstrim_cloned_disks=<boolean> (default = 0)

Esegue fstrim dopo lo spostamento di un disco o la migrazione della VM.

type=<isa | virtio> (default = virtio)

Selezionare il tipo di agente

allow-ksm: <boolean> (default = 1)

Consente l'unione delle pagine di memoria di questo guest tramite KSM (Kernel Samepage Merging).

amd-sev: [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

Funzionalità Secure Encrypted Virtualization (SEV) delle CPU AMD

allow-smt=<boolean> (default = 1)

Imposta il bit di policy per consentire il Simultaneous Multi Threading (SMT) (ignorato salvo che per SEV-SNP)

kernel-hashes=<boolean> (default = 0)

Aggiungere gli hash del kernel al firmware del guest per l'avvio misurato del kernel Linux

no-debug=<boolean> (default = 0)

Imposta il bit di policy per non consentire il debug del guest

no-key-sharing=<boolean> (default = 0)

Imposta il bit di policy per non consentire la condivisione delle chiavi con altri guest (ignorato per SEV-SNP)

type=<sev-type>

Abilitare SEV standard con type=std oppure abilitare SEV-ES sperimentale con l'opzione es oppure abilitare SEV-SNP sperimentale con l'opzione snp.

arch: <aarch64 | x86_64>

Architettura del processore virtuale. Il valore predefinito è l'architettura dell'host.

args: <string>

Argomenti arbitrari passati a kvm, ad esempio:

args: -no-reboot -smbios type=0,vendor=FOO

Note questa opzione è destinata solo agli utenti esperti.
audio0: device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

Configurare un dispositivo audio, utile in combinazione con QXL/Spice.

device=<AC97 | ich9-intel-hda | intel-hda>

Configurare un dispositivo audio.

driver=<none | spice> (default = spice)

Driver backend per il dispositivo audio.

autostart: <boolean> (default = 0)

Riavvio automatico dopo un crash (attualmente ignorato).

balloon: <integer> (0 - N)

Quantità di RAM di destinazione per la VM in MiB. Il driver balloon è abilitato per impostazione predefinita, a meno che non venga esplicitamente disabilitato impostando il valore a zero.

bios: <ovmf | seabios> (default = seabios)

Selezionare l'implementazione del BIOS.

boot: [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

Specificare l'ordine di avvio del guest. Utilizzare la sottoproprietà order=, poiché l'utilizzo senza chiave o con legacy= è deprecato.

legacy=<[acdn]{1,4}> (default = cdn)

Avvio da floppy (a), disco rigido (c), CD-ROM (d) o rete (n). Deprecato, utilizzare order= al suo posto.

order=<device[;device...]>

Il guest tenterà di avviarsi dai dispositivi nell'ordine in cui compaiono qui.

L'avvio verrà effettuato direttamente dai dischi, dalle unità ottiche e dai dispositivi di storage USB assegnati in passthrough, le NIC caricheranno PXE e i dispositivi PCIe si comporteranno come dischi (ad es. NVMe) oppure caricheranno una option ROM (ad es. controller RAID, NIC hardware).

Notare che solo i dispositivi presenti in questo elenco verranno contrassegnati come avviabili e quindi caricati dal firmware del guest (BIOS/UEFI). Se sono necessari più dischi per l'avvio (ad es. software-raid), è necessario specificarli tutti qui.

Se specificato, sovrascrive il valore deprecato legacy=[acdn]*.

bootdisk: (ide|sata|scsi|virtio)\d+

Abilitare l'avvio dal disco specificato. Deprecato: utilizzare boot: order=foo;bar al suo posto.

cdrom: <volume>

Questo è un alias per l'opzione -ide2

cicustom: [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init: specificare file personalizzati per sostituire quelli generati automaticamente all'avvio.

meta=<volume>

Specificare un file personalizzato contenente tutti i metadati passati alla VM tramite cloud-init. Questo è specifico per il provider, il che significa che configdrive2 e nocloud differiscono.

network=<volume>

Per passare un file personalizzato contenente tutti i dati di rete alla VM tramite cloud-init.

user=<volume>

Per passare alla VM un file personalizzato contenente tutti i dati utente tramite cloud-init.

vendor=<volume>

Per passare alla VM un file personalizzato contenente tutti i dati vendor tramite cloud-init.

cipassword: <string>

cloud-init: password da assegnare all'utente. L'utilizzo di questa opzione non è generalmente consigliato. Utilizzare invece le chiavi SSH. Notare inoltre che le versioni di cloud-init meno recenti non supportano le password sottoposte a hash.

citype: <configdrive2 | nocloud | opennebula>

Specifica il formato di configurazione di cloud-init. Il valore predefinito dipende dal tipo di sistema operativo configurato (ostype). Viene utilizzato il formato nocloud per Linux e configdrive2 per Windows.

ciupgrade: <boolean> (default = 1)

cloud-init: eseguire un aggiornamento automatico dei pacchetti dopo il primo avvio.

ciuser: <string>

cloud-init: nome utente per il quale modificare le chiavi SSH e la password, invece dell'utente predefinito configurato nell'immagine.

cores: <integer> (1 - N) (default = 1)

Numero di core per socket.

cpu: [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,guest-phys-bits=<integer>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,level=<integer>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

Tipo di CPU emulata.

cputype=<string> (default = kvm64)

Tipo di CPU emulata. Può essere il valore predefinito o un nome personalizzato (i nomi dei modelli personalizzati devono avere il prefisso custom-).

flags=<+FLAG[;-FLAG...]>

Elenco di flag CPU aggiuntivi separati da ;. Usare +FLAG per attivare, -FLAG per disattivare un flag. Esiste una speciale scorciatoia nested-virt che controlla la virtualizzazione annidata per la CPU corrente (svm per AMD e vmx per Intel). I modelli di CPU personalizzati possono specificare qualsiasi flag supportato da QEMU/KVM; i flag specifici per VM, per motivi di sicurezza, devono appartenere al seguente insieme: aes, amd-no-ssb, amd-ssbd, hv-evmcs, hv-tlbflush, ibpb, md-clear, nested-virt, pcid, pdpe1gb, spec-ctrl, ssbd, virt-ssbd

guest-phys-bits=<integer> (32 - 64)

Numero di bit di indirizzo fisico disponibili per il guest.

hidden=<boolean> (default = 0)

Non identificarsi come macchina virtuale KVM. Riguarda solo le vCPU con architettura x86-64.

hv-vendor-id=<vendor-id>

L'ID del vendor Hyper-V. Alcuni driver o programmi all'interno dei guest Windows richiedono un ID specifico.

level=<integer> (0 - 4294967295)

Valore massimo di input per i leaf CPUID di base che il guest può interrogare, cioè il vendor (leaf 0), famiglia/modello/stepping e i bit delle funzionalità (leaf 1), informazioni su cache e topologia (leaf 4 e B) e così via. I leaf con numerazione più alta vengono nascosti. Impostare 30 è una soluzione comune per i problemi di avvio di Hyper-V sui guest Windows eseguiti su host Intel recenti. Si applica solo quando l'architettura della vCPU è x86_64.

phys-bits=<8-64|host>

I bit di indirizzo di memoria fisica riportati al sistema operativo guest. Dovrebbero essere minori o uguali a quelli dell'host. Impostare su host per usare il valore della CPU host, ma notare che ciò interromperà la migrazione live verso CPU con valori diversi.

reported-model=<486 | Broadwell | Broadwell-IBRS | Broadwell-noTSX | Broadwell-noTSX-IBRS | Cascadelake-Server | Cascadelake-Server-noTSX | Cascadelake-Server-v2 | Cascadelake-Server-v4 | Cascadelake-Server-v5 | ClearwaterForest | ClearwaterForest-v2 | ClearwaterForest-v3 | Conroe | Cooperlake | Cooperlake-v2 | DiamondRapids | EPYC | EPYC-Genoa | EPYC-Genoa-v2 | EPYC-IBPB | EPYC-Milan | EPYC-Milan-v2 | EPYC-Milan-v3 | EPYC-Rome | EPYC-Rome-v2 | EPYC-Rome-v3 | EPYC-Rome-v4 | EPYC-Rome-v5 | EPYC-Turin | EPYC-v3 | EPYC-v4 | EPYC-v5 | GraniteRapids | GraniteRapids-v2 | GraniteRapids-v3 | GraniteRapids-v4 | GraniteRapids-v5 | Haswell | Haswell-IBRS | Haswell-noTSX | Haswell-noTSX-IBRS | Icelake-Client | Icelake-Client-noTSX | Icelake-Server | Icelake-Server-noTSX | Icelake-Server-v3 | Icelake-Server-v4 | Icelake-Server-v5 | Icelake-Server-v6 | Icelake-Server-v7 | IvyBridge | IvyBridge-IBRS | KnightsMill | Nehalem | Nehalem-IBRS | Opteron_G1 | Opteron_G2 | Opteron_G3 | Opteron_G4 | Opteron_G5 | Penryn | SandyBridge | SandyBridge-IBRS | SapphireRapids | SapphireRapids-v2 | SapphireRapids-v3 | SapphireRapids-v4 | SapphireRapids-v5 | SapphireRapids-v6 | SierraForest | SierraForest-v2 | SierraForest-v3 | SierraForest-v4 | SierraForest-v5 | Skylake-Client | Skylake-Client-IBRS | Skylake-Client-noTSX-IBRS | Skylake-Client-v4 | Skylake-Server | Skylake-Server-IBRS | Skylake-Server-noTSX-IBRS | Skylake-Server-v4 | Skylake-Server-v5 | Westmere | Westmere-IBRS | a64fx | athlon | core2duo | coreduo | cortex-a35 | cortex-a53 | cortex-a55 | cortex-a57 | cortex-a710 | cortex-a72 | cortex-a76 | cortex-a78ae | host | kvm32 | kvm64 | max | neoverse-n1 | neoverse-n2 | neoverse-v1 | pentium | pentium2 | pentium3 | phenom | qemu32 | qemu64> (default = kvm64)

Modello e vendor della CPU da riportare al guest. Deve essere un modello supportato da QEMU/KVM. Valido solo per le definizioni di modelli di CPU personalizzati; i modelli predefiniti riporteranno sempre loro stessi al sistema operativo guest.

cpulimit: <number> (0 - 128) (default = 0)

Limite di utilizzo della CPU.

Note Se il computer dispone di 2 CPU, il tempo CPU totale disponibile è 2. Il valore 0 indica l'assenza di limiti CPU.
cpuunits: <integer> (1 - 262144) (default = cgroup v1: 1024, cgroup v2: 100)

Peso della CPU per una VM. L'argomento viene utilizzato nello scheduler fair del kernel. Maggiore è il numero, più tempo CPU viene assegnato a questa VM. Il numero è relativo ai pesi di tutte le altre VM in esecuzione.

description: <string>

Descrizione per la VM. Visualizzata nel riepilogo della VM nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

efidisk0: [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,ms-cert=<enum>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

Configurare un disco per la memorizzazione delle variabili EFI.

efitype=<2m | 4m> (predefinito = 2m)

Dimensione e tipo delle variabili EFI OVMF. 4m è più recente e consigliato, ed è richiesto per il Secure Boot. Per compatibilità con le versioni precedenti, viene utilizzato 2m se non specificato altrimenti. Ignorato per le VM con arch=aarch64 (ARM).

file=<volume>

Il volume di backing del drive.

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

Il formato dei dati del file di backing del drive.

ms-cert=<2011 | 2023 | 2023k | 2023w> (predefinito = 2011)

Indicatore informativo che indica la versione degli ultimi certificati UEFI Microsoft registrati da Proxmox VE. Il valore 2023k indica che sono inclusi i certificati Microsoft UEFI CA 2023, Windows UEFI CA 2023 e Microsoft Corporation KEK 2K CA 2023. I valori 2023 e 2023w sono deprecati e mantenuti solo per compatibilità.

pre-enrolled-keys=<boolean> (predefinito = 0)

Utilizzare un template di variabili EFI con chiavi specifiche della distribuzione e chiavi Microsoft Standard registrate, se usato con efitype=4m. Si noti che questo attiverà Secure Boot per impostazione predefinita, anche se sarà comunque possibile disattivarlo dall'interno della VM.

size=<DiskSize>

Dimensione del disco. Ha valore puramente informativo e non ha alcun effetto.

freeze: <boolean>

Bloccare la CPU all'avvio (utilizzare il comando c del monitor per avviare l'esecuzione).

hookscript: <string>

Script che verrà eseguito durante varie fasi del ciclo di vita della VM.

hostpci[n]: [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,driver=<vfio|keep>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>]

Mappare i dispositivi PCI dell'host nel guest.

Note Questa opzione consente l'accesso diretto all'hardware host. Pertanto non è più possibile migrare tali macchine - utilizzare con particolare attenzione.
Caution Sperimentale! Sono stati segnalati problemi con questa opzione.
device-id=<hex id>

Sovrascrive l'ID del dispositivo PCI visibile al guest

driver=<keep | vfio> (predefinito = vfio)

Se impostato su keep il dispositivo non verrà né resettato né associato al driver vfio-pci. Utile per i dispositivi che hanno già il driver corretto caricato.

host=<HOSTPCIID[;HOSTPCIID2...]>

Passthrough del dispositivo PCI host. L'ID PCI di un dispositivo PCI dell'host o un elenco di funzioni virtuali PCI dell'host. La sintassi di HOSTPCIID è:

bus:dev.func (numeri esadecimali)

È possibile utilizzare il comando lspci per elencare i dispositivi PCI esistenti.

È necessario impostare questa opzione oppure la chiave mapping.

legacy-igd=<boolean> (predefinito = 0)

Passare questo dispositivo in modalità IGD legacy, rendendolo il dispositivo grafico primario ed esclusivo nella VM. Richiede il tipo di macchina pc-i440fx e la VGA impostata su none.

mapping=<mapping-id>

L'ID di un mapping a livello di cluster. È necessario impostare questa opzione oppure la chiave predefinita host.

mdev=<string>

Il tipo di dispositivo mediato da utilizzare. Un'istanza di questo tipo verrà creata all'avvio della VM e verrà rimossa quando la VM si arresta.

pcie=<boolean> (predefinito = 0)

Selezionare il bus PCI-express (richiede il modello di macchina q35).

rombar=<boolean> (predefinito = 1)

Specificare se la ROM del dispositivo sarà visibile o meno nella mappa di memoria del guest.

romfile=<string>

Nome del file ROM personalizzato per il dispositivo PCI (deve trovarsi in /usr/share/kvm/).

sub-device-id=<hex id>

Sovrascrivere l'ID del dispositivo del sottosistema PCI visibile al guest

sub-vendor-id=<hex id>

Sovrascrivere l'ID del produttore del sottosistema PCI visibile al guest

vendor-id=<hex id>

Sovrascrivere l'ID del produttore PCI visibile al guest

x-vga=<boolean> (predefinito = 0)

Abilitare il supporto al dispositivo vfio-vga.

hotplug: <string> (predefinito = network,disk,usb)

Abilitare selettivamente le funzionalità di hotplug. Si tratta di un elenco separato da virgole di funzionalità hotplug: network, disk, cpu, memory, usb e cloudinit. Utilizzare 0 per disabilitare completamente l’hotplug. L’utilizzo di 1 come valore è un alias per il valore predefinito network,disk,usb. L’hotplug USB è possibile per i guest con versione della macchina >= 7.1 e ostype l26 oppure windows > 7.

hugepages: <1024 | 2 | any>

Abilita la memoria hugepages.

Impostare la dimensione delle hugepage in MiB. Se il valore è impostato su any, verranno utilizzate hugepage da 1 GiB, se possibile, altrimenti verranno utilizzate hugepage da 2 MiB.

ide[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido IDE o CD-ROM (n va da 0 a 3).

aio=<io_uring | native | threads>

Tipo di AIO da utilizzare.

backup=<boolean>

Indica se il disco deve essere incluso nell’esecuzione dei backup.

bps=<bps>

Velocità massima di lettura/scrittura in byte al secondo.

bps_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

bps_rd=<bps>

Velocità massima di lettura in byte al secondo.

bps_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

bps_wr=<bps>

Velocità massima di scrittura in byte al secondo.

bps_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

cache=<directsync | none | unsafe | writeback | writethrough>

Modalità cache del disco

detect_zeroes=<boolean>

Controlla se rilevare e provare a ottimizzare le scritture di zeri.

discard=<ignore | on>

Controlla se inoltrare le richieste discard/trim allo storage sottostante.

file=<volume>

Il volume di backing del drive.

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

Il formato dei dati del file di backing del drive.

iops=<iops>

Numero massimo di operazioni di I/O in lettura/scrittura al secondo.

iops_max=<iops>

Dimensione massima del pool di I/O in lettura/scrittura senza limitazione, espressa in operazioni al secondo.

iops_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

iops_rd=<iops>

Numero massimo di operazioni di I/O in lettura al secondo.

iops_rd_max=<iops>

Dimensione massima del pool di I/O in lettura senza limitazione, espressa in operazioni al secondo.

iops_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

iops_wr=<iops>

Numero massimo di operazioni di I/O in scrittura al secondo.

iops_wr_max=<iops>

Dimensione massima del pool di I/O in scrittura senza limitazione, espressa in operazioni al secondo.

iops_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

mbps=<mbps>

Velocità massima in lettura/scrittura in megabyte al secondo.

mbps_max=<mbps>

Velocità massima in lettura/scrittura nel pool non limitato, in megabyte al secondo.

mbps_rd=<mbps>

Velocità massima in lettura in megabyte al secondo.

mbps_rd_max=<mbps>

Pool massimo di lettura senza limitazione, in megabyte al secondo.

mbps_wr=<mbps>

Velocità massima in scrittura in megabyte al secondo.

mbps_wr_max=<mbps>

Velocità massima di scrittura senza limitazione del pool, in megabyte al secondo.

media=<cdrom | disk> (default = disk)

Il tipo di supporto del drive.

model=<model>

Il nome del modello riportato dall'unità, codificato per URL, lungo fino a 40 byte.

replicate=<boolean> (default = 1)

Indica se il disco deve essere considerato per i job di replica.

rerror=<ignore | report | stop>

Azione in caso di errore di lettura.

serial=<serial>

Il numero di serie riportato dal disco, con codifica URL, lungo fino a 20 byte.

shared=<boolean> (default = 0)

Contrassegnare questo volume gestito localmente come disponibile su tutti i nodi.

Warning Questa opzione non condivide automaticamente il volume, presuppone che sia già condiviso!
size=<DiskSize>

Dimensione del disco. Ha valore puramente informativo e non ha alcun effetto.

snapshot=<boolean>

Controlla la modalità snapshot di qemu. Se attivata, le modifiche effettuate al disco sono temporanee e verranno scartate allo spegnimento della VM.

ssd=<boolean>

Indica se esporre questo disco come SSD, piuttosto che come disco rigido rotazionale.

werror=<enospc | ignore | report | stop>

Azione in caso di errore di scrittura.

wwn=<wwn>

Il worldwide name del disco, codificato come stringa hex di 16 byte, prefissata da 0x.

intel-tdx: [type=]<tdx-type> ,attestation=<1|0> [,vsock-cid=<integer>] [,vsock-port=<integer>]

Funzionalità Trusted Domain Extension (TDX) delle CPU Intel

attestation=<boolean> (default = 1)

Abilitare l'attestazione TDX includendo quote-generation-socket

type=<tdx-type>

Abilitare TDX

vsock-cid=<integer> (2 - N) (default = 2)

CID per il vsock del Quote Generation Service

vsock-port=<integer> (0 - N) (default = 4050)

Porta per il vsock del Quote Generation Service

ipconfig[n]: [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init: specificare gli indirizzi IP e i gateway per l'interfaccia corrispondente.

Gli indirizzi IP utilizzano la notazione CIDR; i gateway sono opzionali, ma richiedono la specifica di un IP dello stesso tipo.

La stringa speciale dhcp può essere utilizzata per gli indirizzi IP per usare il DHCP, nel qual caso non deve essere specificato alcun gateway esplicito. Per IPv6, la stringa speciale auto può essere utilizzata per la configurazione automatica stateless. Questo richiede cloud-init 19.4 o versioni successive.

Se cloud-init è abilitato e non viene specificato né un indirizzo IPv4 né un indirizzo IPv6, viene utilizzato per impostazione predefinita il DHCP su IPv4.

gw=<GatewayIPv4>

Gateway predefinito per il traffico IPv4.

Note Richiede l'opzione/le opzioni: ip
gw6=<GatewayIPv6>

Gateway predefinito per il traffico IPv6.

Note Richiede l'opzione/le opzioni: ip6
ip=<IPv4Format/CIDR> (default = dhcp)

Indirizzo IPv4 in formato CIDR.

ip6=<IPv6Format/CIDR> (default = dhcp)

Indirizzo IPv6 in formato CIDR.

ivshmem: size=<integer> [,name=<string>]

Memoria condivisa inter-VM. Utile per la comunicazione diretta tra VM, o con l'host.

name=<string>

Il nome del file. Verrà preceduto da pve-shm-. Il valore predefinito è il VMID. Verrà eliminato all'arresto della VM.

size=<integer> (1 - N)

La dimensione del file in MB.

keephugepages: <boolean> (default = 0)

Da usare insieme a hugepages. Se abilitata, le hugepages non verranno eliminate dopo lo spegnimento della VM e potranno essere utilizzate per gli avvii successivi.

keyboard: <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

Layout di tastiera per il server VNC. Questa opzione generalmente non è necessaria e spesso è gestita meglio all'interno del sistema operativo guest.

kvm: <boolean> (default = 1)

Abilitare/disabilitare la virtualizzazione hardware KVM.

localtime: <boolean>

Impostare l'orologio in tempo reale (RTC) sull'ora locale. Questa opzione è abilitata per impostazione predefinita se ostype indica un sistema operativo Microsoft Windows.

lock: <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

Bloccare/sbloccare la VM.

machine: [[type=]<machine type>] [,aw-bits=<number>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

Specificare la macchina QEMU.

aw-bits=<number> (32 - 64)

Specifica l'ampiezza in bit dello spazio di indirizzamento del vIOMMU.

Il vIOMMU Intel supporta un'ampiezza di 39 o 48 bit, mentre il vIOMMU VirtIO supporta qualsiasi ampiezza compresa tra 32 e 64 bit.

enable-s3=<boolean>

Abilita lo stato di alimentazione S3. Il valore predefinito è false a partire dai machine type 9.2+pve1, mentre era true in precedenza.

enable-s4=<boolean>

Abilita lo stato di alimentazione S4. Il valore predefinito è false a partire dai machine type 9.2+pve1, mentre era true in precedenza.

type=<machine type>

Specifica il machine type QEMU.

viommu=<intel | virtio>

Abilitare e impostare la variante vIOMMU del guest (il vIOMMU Intel richiede che q35 sia impostato come tipo di macchina).

memory: [current=]<integer>

Proprietà della memoria.

current=<integer> (16 - N) (default = 512)

Quantità attuale di RAM online per la VM, in MiB. Questa è la memoria massima disponibile quando si utilizza il balloon device.

migrate_downtime: <number> (0 - N) (default = 0.1)

Impostare il downtime massimo tollerato (in secondi) per le migrazioni. Se la migrazione non riesce a convergere nella fase finale, poiché deve essere trasferita una quantità eccessiva di RAM modificata di recente, il limite viene aumentato automaticamente passo dopo passo finché la migrazione non riesce a convergere. Il valore viene limitato a 2000 secondi (massimo consentito in QEMU).

migrate_speed: <integer> (0 - N) (default = 0)

Impostare la velocità massima (in MB/s) per le migrazioni. Il valore 0 indica nessun limite.

name: <string>

Impostare un nome per la VM. Utilizzato solo nell'interfaccia web di configurazione.

nameserver: <string>

cloud-init: imposta l'indirizzo IP del server DNS per un container. Durante la creazione verrà utilizzata automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

net[n]: [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,host-tunnel=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

Specificare i dispositivi di rete.

bridge=<bridge>

Bridge a cui collegare il dispositivo di rete. Il bridge standard di Proxmox VE si chiama vmbr0.

Se non viene specificato un bridge, viene creato un dispositivo di rete utente kvm (NATed), che fornisce servizi DHCP e DNS. Vengono utilizzati i seguenti indirizzi:

10.0.2.2   Gateway
10.0.2.3   DNS Server
10.0.2.4   SMB Server

Il server DHCP assegna gli indirizzi al guest a partire da 10.0.2.15.

firewall=<boolean>

Indica se questa interfaccia deve essere protetta dal firewall.

host-tunnel=<boolean>

Abilitare l'offload GSO dell'host tramite tunnel UDP (solo VirtIO). Richiede QEMU > 10.2 e il supporto del kernel sia del guest che dell'host. Disabilitato per impostazione predefinita a partire dalla versione della macchina 11.0+pve1 per ovviare a un problema con il driver virtio-net nei kernel guest. Con le versioni della macchina 10.2 e 11.0, questa opzione è abilitata per impostazione predefinita.

link_down=<boolean>

Indica se questa interfaccia deve essere disconnessa (come staccare la spina).

macaddr=<XX:XX:XX:XX:XX:XX>

Un indirizzo MAC comune con il bit I/G (Individual/Group) non impostato.

model=<e1000 | e1000-82540em | e1000-82544gc | e1000-82545em | e1000e | i82551 | i82557b | i82559er | ne2k_isa | ne2k_pci | pcnet | rtl8139 | virtio | vmxnet3>

Modello della scheda di rete. Il modello virtio offre le migliori prestazioni con un overhead di CPU molto basso. Se il guest non supporta questo driver, generalmente è meglio usare e1000.

mtu=<integer> (1 - 65520)

Forzare l'MTU del dispositivo di rete (solo VirtIO). Impostando il valore su 1 o lasciando il campo vuoto, verrà utilizzato l'MTU del bridge

queues=<integer> (0 - 64)

Numero di code di pacchetti da utilizzare sul dispositivo.

rate=<number> (0 - N)

Limite di velocità in mbps (megabyte al secondo) come numero in virgola mobile.

tag=<integer> (1 - 4094)

Tag VLAN da applicare ai pacchetti su questa interfaccia.

trunks=<vlanid[;vlanid...]>

Trunk VLAN da far passare attraverso questa interfaccia.

numa: <boolean> (default = 0)

Abilitare/disabilitare NUMA.

numa[n]: cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

Topologia NUMA.

cpus=<id[-id];...>

CPU che accedono a questo nodo NUMA.

hostnodes=<id[-id];...>

Nodi NUMA host da utilizzare.

memory=<number>

Quantità di memoria fornita da questo nodo NUMA.

policy=<bind | interleave | preferred>

Politica di allocazione NUMA.

onboot: <boolean> (default = 0)

Specifica se una VM verrà avviata durante l'avvio del sistema.

ostype: <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp> (default = other)

Specificare il sistema operativo guest. Questa informazione viene utilizzata per abilitare ottimizzazioni/funzionalità specifiche per determinati sistemi operativi:

other

SO non specificato

wxp

Microsoft Windows XP

w2k

Microsoft Windows 2000

w2k3

Microsoft Windows 2003

w2k8

Microsoft Windows 2008

wvista

Microsoft Windows Vista

win7

Microsoft Windows 7

win8

Microsoft Windows 8/2012/2012r2

win10

Microsoft Windows 10/2016/2019

win11

Microsoft Windows 11/2022/2025

l24

Kernel Linux 2.4

l26

Kernel Linux 2.6 - 7.X

solaris

Kernel Solaris/OpenSolaris/OpenIndiania

parallel[n]: /dev/parport\d+|/dev/usb/lp\d+

Mappare i dispositivi paralleli dell'host (n va da 0 a 2).

Note Questa opzione consente l'accesso diretto all'hardware host. Pertanto non è più possibile migrare tali macchine - utilizzare con particolare attenzione.
Caution Sperimentale! Sono stati segnalati problemi con questa opzione.
protection: <boolean> (default = 0)

Imposta il flag di protezione della VM. Questo disabilita le operazioni di rimozione della VM e rimozione del disco.

reboot: <boolean> (default = 1)

Consente il riavvio. Se impostato su 0 la VM si arresta al riavvio.

rng0: [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

Configurare un generatore di numeri casuali basato su VirtIO.

max_bytes=<integer> (default = 1024)

Numero massimo di byte di entropia che è possibile iniettare nel guest ogni period millisecondi. Usare 0 per disabilitare il limite (potenzialmente pericoloso!).

period=<integer> (default = 1000)

Ogni period millisecondi la quota di iniezione di entropia viene ripristinata, consentendo al guest di recuperare altri max_bytes di entropia.

source=</dev/hwrng | /dev/random | /dev/urandom>

Il file sull'host da cui raccogliere entropia. L'uso di urandom non riduce la sicurezza in alcun modo significativo, poiché è comunque inizializzato con entropia reale, e i byte forniti saranno molto probabilmente mescolati con entropia reale anche sul guest. /dev/hwrng può essere usato per passare un RNG hardware dall'host.

sata[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SATA o CD-ROM (n va da 0 a 5).

aio=<io_uring | native | threads>

Tipo di AIO da utilizzare.

backup=<boolean>

Indica se il disco deve essere incluso nell’esecuzione dei backup.

bps=<bps>

Velocità massima di lettura/scrittura in byte al secondo.

bps_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

bps_rd=<bps>

Velocità massima di lettura in byte al secondo.

bps_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

bps_wr=<bps>

Velocità massima di scrittura in byte al secondo.

bps_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

cache=<directsync | none | unsafe | writeback | writethrough>

Modalità cache del disco

detect_zeroes=<boolean>

Controlla se rilevare e provare a ottimizzare le scritture di zeri.

discard=<ignore | on>

Controlla se inoltrare le richieste discard/trim allo storage sottostante.

file=<volume>

Il volume di backing del drive.

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

Il formato dei dati del file di backing del drive.

iops=<iops>

Numero massimo di operazioni di I/O in lettura/scrittura al secondo.

iops_max=<iops>

Numero massimo di operazioni di I/O in lettura/scrittura al secondo nel pool non limitato.

iops_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

iops_rd=<iops>

Numero massimo di operazioni di I/O in lettura al secondo.

iops_rd_max=<iops>

Dimensione massima del pool di I/O in lettura senza limitazione, espressa in operazioni al secondo.

iops_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

iops_wr=<iops>

Numero massimo di operazioni di I/O in scrittura al secondo.

iops_wr_max=<iops>

Dimensione massima del pool di I/O in scrittura senza limitazione, espressa in operazioni al secondo.

iops_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

mbps=<mbps>

Velocità massima in lettura/scrittura in megabyte al secondo.

mbps_max=<mbps>

Pool massimo di lettura/scrittura senza limitazione, in megabyte al secondo.

mbps_rd=<mbps>

Velocità massima in lettura in megabyte al secondo.

mbps_rd_max=<mbps>

Pool massimo per la lettura senza limitazioni, in megabyte al secondo.

mbps_wr=<mbps>

Velocità massima in scrittura in megabyte al secondo.

mbps_wr_max=<mbps>

Pool massimo di scrittura senza limitazione, in megabyte al secondo.

media=<cdrom | disk> (default = disk)

Il tipo di supporto del drive.

replicate=<boolean> (default = 1)

Indica se il disco deve essere considerato per i job di replica.

rerror=<ignore | report | stop>

Azione in caso di errore di lettura.

serial=<serial>

Il numero di serie riportato dal disco, con codifica URL, lungo fino a 20 byte.

shared=<boolean> (default = 0)

Contrassegnare questo volume gestito localmente come disponibile su tutti i nodi.

Warning Questa opzione non condivide automaticamente il volume, presuppone che sia già condiviso!
size=<DiskSize>

Dimensione del disco. Ha valore puramente informativo e non ha alcun effetto.

snapshot=<boolean>

Controlla la funzione di modalità snapshot di qemu. Se attivata, le modifiche effettuate al disco sono temporanee e verranno scartate allo spegnimento della VM.

ssd=<boolean>

Indica se esporre questo disco come SSD, piuttosto che come disco rigido rotazionale.

werror=<enospc | ignore | report | stop>

Azione in caso di errore di scrittura.

wwn=<wwn>

Il worldwide name del disco, codificato come stringa hex di 16 byte, prefissata da 0x.

scsi[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SCSI o CD-ROM (n va da 0 a 30).

aio=<io_uring | native | threads>

Tipo di AIO da utilizzare.

backup=<boolean>

Indica se il disco deve essere incluso nell’esecuzione dei backup.

bps=<bps>

Velocità massima di lettura/scrittura in byte al secondo.

bps_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

bps_rd=<bps>

Velocità massima di lettura in byte al secondo.

bps_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

bps_wr=<bps>

Velocità massima di scrittura in byte al secondo.

bps_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

cache=<directsync | none | unsafe | writeback | writethrough>

Modalità cache del disco

detect_zeroes=<boolean>

Controlla se rilevare e provare a ottimizzare le scritture di zeri.

discard=<ignore | on>

Controlla se inoltrare le richieste discard/trim allo storage sottostante.

file=<volume>

Il volume di backing del drive.

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

Il formato dei dati del file di backing del drive.

iops=<iops>

Numero massimo di operazioni di I/O in lettura/scrittura al secondo.

iops_max=<iops>

Numero massimo di operazioni di I/O in lettura/scrittura al secondo nel pool non limitato.

iops_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

iops_rd=<iops>

Numero massimo di operazioni di I/O in lettura al secondo.

iops_rd_max=<iops>

Numero massimo di operazioni di I/O in lettura al secondo nel pool non limitato.

iops_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

iops_wr=<iops>

Numero massimo di operazioni di I/O in scrittura al secondo.

iops_wr_max=<iops>

Numero massimo di operazioni di I/O in scrittura al secondo nel pool non limitato.

iops_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

iothread=<boolean>

Se utilizzare iothread per questa unità

mbps=<mbps>

Velocità massima in lettura/scrittura in megabyte al secondo.

mbps_max=<mbps>

Velocità massima in lettura/scrittura nel pool non limitato, in megabyte al secondo.

mbps_rd=<mbps>

Velocità massima in lettura in megabyte al secondo.

mbps_rd_max=<mbps>

Velocità massima in lettura nel pool non limitato, in megabyte al secondo.

mbps_wr=<mbps>

Velocità massima in scrittura in megabyte al secondo.

mbps_wr_max=<mbps>

Velocità massima in scrittura nel pool non limitato, in megabyte al secondo.

media=<cdrom | disk> (default = disk)

Il tipo di supporto del drive.

product=<product>

Nome del prodotto del drive, lungo fino a 16 byte.

queues=<integer> (2 - N)

Numero di code.

replicate=<boolean> (default = 1)

Indica se il disco deve essere considerato per i job di replica.

rerror=<ignore | report | stop>

Azione in caso di errore di lettura.

ro=<boolean>

Indica se il drive è di sola lettura.

scsiblock=<boolean> (default = 0)

indica se utilizzare scsi-block per il passthrough completo del dispositivo a blocchi dell'host

Warning può causare errori di I/O in combinazione con memoria insufficiente o elevata frammentazione della memoria sull'host
serial=<serial>

Il numero di serie riportato dal disco, con codifica URL, lungo fino a 20 byte.

shared=<boolean> (default = 0)

Contrassegnare questo volume gestito localmente come disponibile su tutti i nodi.

Warning Questa opzione non condivide automaticamente il volume, presuppone che sia già condiviso!
size=<DiskSize>

Dimensione del disco. Ha valore puramente informativo e non ha alcun effetto.

snapshot=<boolean>

Controlla la funzione snapshot mode di qemu. Se attivata, le modifiche effettuate al disco sono temporanee e verranno scartate allo spegnimento della VM.

ssd=<boolean>

Indica se esporre questo disco come SSD, piuttosto che come disco rigido rotazionale.

vendor=<vendor>

Nome del vendor del drive, lungo fino a 8 byte.

werror=<enospc | ignore | report | stop>

Azione in caso di errore di scrittura.

wwn=<wwn>

Il worldwide name del disco, codificato come stringa hex di 16 byte, prefissata da 0x.

scsihw: <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (predefinito = lsi)

Modello di controller SCSI

searchdomain: <string>

cloud-init: imposta i domini di ricerca DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

serial[n]: (/dev/[^,]+|socket)

Creare un dispositivo seriale all'interno della VM (n va da 0 a 3) e collegare direttamente un dispositivo seriale dell'host (ad es. /dev/ttyS0), oppure creare un socket unix sul lato host (utilizzare qm terminal per aprire una connessione terminale).

Note Se viene collegata una porta seriale dell'host, non è più possibile migrare tali macchine - usare con particolare attenzione.
Caution Sperimentale! Sono stati segnalati problemi con questa opzione.
shares: <integer> (0 - 50000) (predefinito = 1000)

Quantità di share di memoria per l'auto-ballooning. Maggiore è il numero, maggiore è la memoria riservata a questa VM. Il numero è relativo ai pesi di tutte le altre VM in esecuzione. Utilizzare zero per disabilitare l'auto-ballooning. L'auto-ballooning viene eseguito da pvestatd.

smbios1: [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

Specificare i campi SMBIOS di tipo 1.

base64=<boolean>

Flag per indicare che i valori SMBIOS sono codificati in base64

family=<Base64 encoded string>

Impostare la stringa family di SMBIOS1.

manufacturer=<Base64 encoded string>

Impostare il produttore di SMBIOS1.

product=<Base64 encoded string>

Impostare l'ID prodotto di SMBIOS1.

serial=<Base64 encoded string>

Impostare il numero di serie di SMBIOS1.

sku=<Base64 encoded string>

Impostare la stringa SKU di SMBIOS1.

uuid=<UUID>

Impostare l'UUID di SMBIOS1.

version=<Base64 encoded string>

Impostare la versione di SMBIOS1.

smp: <integer> (1 - N) (predefinito = 1)

Il numero di CPU. Utilizzare invece l'opzione -sockets.

sockets: <integer> (1 - N) (predefinito = 1)

Il numero di socket CPU.

spice_enhancements: [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

Configurare miglioramenti aggiuntivi per SPICE.

foldersharing=<boolean> (predefinito = 0)

Abilitare la condivisione di cartelle tramite SPICE. Richiede l'installazione del demone Spice-WebDAV nella VM.

videostreaming=<all | filter | off> (predefinito = off)

Abilitare lo streaming video. Viene utilizzata la compressione per i flussi video rilevati.

sshkeys: <string>

cloud-init: configurare le chiavi SSH pubbliche (una chiave per riga, formato OpenSSH).

startdate: (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (predefinito = now)

Impostare la data iniziale dell'orologio in tempo reale. I formati di data validi sono: 'now' oppure 2006-06-17T16:01:21 oppure 2006-06-17.

startup: `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

tablet: <boolean> (default = 1)

Abilitare/disabilitare il dispositivo tablet USB. Questo dispositivo è solitamente necessario per consentire il posizionamento assoluto del mouse con VNC. In caso contrario, il mouse perde la sincronizzazione con i normali client VNC. Se si eseguono molti guest con la sola console su un unico host, è possibile valutare la disattivazione di questa opzione per ridurre il numero di cambi di contesto. Questa opzione è disattivata per impostazione predefinita se si utilizza spice (qm set <vmid> --vga qxl).

tags: <string>

Tag della VM. Si tratta solo di metadati.

tdf: <boolean> (default = 0)

Abilitare/disabilitare la correzione della deriva temporale.

template: <boolean> (default = 0)

Abilitare/disabilitare il template.

tpmstate0: [file=]<volume> [,format=<raw|qcow2|vmdk>] [,size=<DiskSize>] [,version=<v1.2|v2.0>]

Configurare un disco per memorizzare lo stato del TPM. Il formato è fissato a raw.

file=<volume>

Il volume sottostante dell’unità.

format=<qcow2 | raw | vmdk>

Formato dell'immagine.

size=<DiskSize>

Dimensione del disco. Ha valore puramente informativo e non ha alcun effetto.

version=<v1.2 | v2.0> (default = v1.2)

La versione dell'interfaccia TPM. v2.0 è più recente e dovrebbe essere preferita. Da notare che questa non può essere modificata successivamente.

unused[n]: [file=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

file=<volume>

Il volume di backing del drive.

usb[n]: [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

Configurare un dispositivo USB (n va da 0 a 4; per una versione della macchina >= 7.1 e ostype l26 o windows > 7, n può arrivare fino a 14).

host=<HOSTUSBDEVICE|spice>

Il dispositivo o la porta USB host oppure il valore spice. La sintassi di HOSTUSBDEVICE è:

'bus-port(.port)*' (decimal numbers) or
'vendor_id:product_id' (hexadecimal numbers) or
'spice'

È possibile utilizzare il comando lsusb -t per elencare i dispositivi usb esistenti.

Note Questa opzione consente l'accesso diretto all'hardware host. Pertanto non è più possibile migrare tali macchine - utilizzare con particolare attenzione.

Il valore spice può essere utilizzato per aggiungere dispositivi di redirezione usb per spice.

È necessario impostare questa opzione oppure la chiave mapping.

mapping=<mapping-id>

L'ID di un mapping a livello di cluster. È necessario impostare questa opzione oppure la chiave predefinita host.

usb3=<boolean> (default = 0)

Specifica se l'opzione host indicata è un dispositivo o una porta USB3. Per i guest moderni (versione della macchina >= 7.1 e ostype l26 e windows > 7), questo flag è irrilevante (tutti i dispositivi sono collegati a un controller xhci).

vcpus: <integer> (1 - N) (default = 0)

Numero di vcpu collegate a caldo.

vga: [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

Configurare l'hardware VGA. Se si desidera utilizzare modalità ad alta risoluzione (>= 1280x1024x16), potrebbe essere necessario aumentare il valore dell'opzione relativa alla memoria VGA. A partire da QEMU 2.9 il tipo di display VGA predefinito è std per tutti i tipi di sistema operativo, eccetto alcune versioni di Windows (XP e precedenti) che utilizzano cirrus. L'opzione qxl abilita il server di visualizzazione SPICE. Per i sistemi operativi win* è possibile selezionare il numero di display indipendenti desiderati; i guest Linux possono aggiungere display autonomamente. È anche possibile eseguire la macchina virtuale senza alcuna scheda grafica, utilizzando un dispositivo seriale come terminale.

clipboard=<vnc>

Abilitare una clipboard specifica. Se non impostata, in base al tipo di display verrà aggiunta quella SPICE. La migrazione live con una clipboard VNC non è possibile con versioni della macchina QEMU < 10.1.

memory=<integer> (4 - 512)

Imposta la memoria VGA (in MiB). Non ha effetto con il display seriale.

type=<cirrus | none | qxl | qxl2 | qxl3 | qxl4 | serial0 | serial1 | serial2 | serial3 | std | virtio | virtio-gl | vmware> (default = std)

Selezionare il tipo di VGA. L'uso del tipo cirrus non è consigliato.

virtio[n]: [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,werror=<enum>]

Utilizzare il volume come disco rigido VIRTIO (n va da 0 a 15).

aio=<io_uring | native | threads>

Tipo di AIO da utilizzare.

backup=<boolean>

Indica se il disco deve essere incluso nell’esecuzione dei backup.

bps=<bps>

Velocità massima di lettura/scrittura in byte al secondo.

bps_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

bps_rd=<bps>

Velocità massima di lettura in byte al secondo.

bps_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

bps_wr=<bps>

Velocità massima di scrittura in byte al secondo.

bps_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

cache=<directsync | none | unsafe | writeback | writethrough>

Modalità cache del disco

detect_zeroes=<boolean>

Controlla se rilevare e provare a ottimizzare le scritture di zeri.

discard=<ignore | on>

Controlla se inoltrare le richieste discard/trim allo storage sottostante.

file=<volume>

Il volume di backing del drive.

format=<cloop | qcow | qcow2 | qed | raw | vmdk>

Il formato dei dati del file di backing del drive.

iops=<iops>

Numero massimo di operazioni di I/O in lettura/scrittura al secondo.

iops_max=<iops>

Numero massimo di operazioni di I/O in lettura/scrittura al secondo nel pool non limitato.

iops_max_length=<seconds>

Durata massima delle raffiche di I/O in secondi.

iops_rd=<iops>

Numero massimo di operazioni di I/O in lettura al secondo.

iops_rd_max=<iops>

Numero massimo di operazioni di I/O in lettura al secondo nel pool non limitato.

iops_rd_max_length=<seconds>

Durata massima delle raffiche di I/O di lettura in secondi.

iops_wr=<iops>

Numero massimo di operazioni di I/O in scrittura al secondo.

iops_wr_max=<iops>

Numero massimo di operazioni di I/O in scrittura al secondo nel pool non limitato.

iops_wr_max_length=<seconds>

Durata massima delle raffiche di I/O di scrittura in secondi.

iothread=<boolean>

Se utilizzare iothread per questa unità

mbps=<mbps>

Velocità massima in lettura/scrittura in megabyte al secondo.

mbps_max=<mbps>

Velocità massima in lettura/scrittura nel pool non limitato, in megabyte al secondo.

mbps_rd=<mbps>

Velocità massima in lettura in megabyte al secondo.

mbps_rd_max=<mbps>

Velocità massima in lettura nel pool non limitato, in megabyte al secondo.

mbps_wr=<mbps>

Velocità massima in scrittura in megabyte al secondo.

mbps_wr_max=<mbps>

Valore massimo del pool di scrittura senza limitazione, in megabyte al secondo.

media=<cdrom | disk> (default = disk)

Il tipo di supporto del drive.

replicate=<boolean> (default = 1)

Indica se il disco deve essere considerato per i job di replica.

rerror=<ignore | report | stop>

Azione in caso di errore di lettura.

ro=<boolean>

Indica se il drive è di sola lettura.

serial=<serial>

Il numero di serie riportato dal disco, con codifica URL, lungo fino a 20 byte.

shared=<boolean> (default = 0)

Contrassegnare questo volume gestito localmente come disponibile su tutti i nodi.

Warning Questa opzione non condivide automaticamente il volume, presuppone che sia già condiviso!
size=<DiskSize>

Dimensione del disco. Ha valore puramente informativo e non ha alcun effetto.

snapshot=<boolean>

Controlla la funzione snapshot mode di qemu. Se attivata, le modifiche effettuate al disco sono temporanee e verranno scartate allo spegnimento della VM.

werror=<enospc | ignore | report | stop>

Azione in caso di errore di scrittura.

virtiofs[n]: [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

Configurazione per la condivisione di una directory tra host e guest tramite Virtio-fs.

cache=<always | auto | metadata | never> (predefinito = auto)

La politica di caching che il file system deve utilizzare (auto, always, metadata, never).

direct-io=<boolean> (predefinito = 0)

Rispettare il flag O_DIRECT passato dalle applicazioni guest.

dirid=<mapping-id>

Identificatore del mapping della directory da condividere con il guest. Utilizzato anche come mount tag all'interno della VM.

expose-acl=<boolean> (predefinito = 0)

Abilitare il supporto per le ACL POSIX (l'abilitazione delle ACL implica xattr) per questo mount.

expose-xattr=<boolean> (predefinito = 0)

Abilitare il supporto per gli attributi estesi per questo mount.

vmgenid: <UUID> (predefinito = 1 (generato automaticamente))

Il dispositivo VM generation ID (vmgenid) espone al sistema operativo guest un identificatore costituito da un valore intero a 128 bit. Questo consente di notificare al sistema operativo guest quando la macchina virtuale viene eseguita con una configurazione diversa (ad esempio l'esecuzione di uno snapshot o la creazione da un template). Il sistema operativo guest rileva la modifica ed è quindi in grado di reagire in modo appropriato, contrassegnando come dirty le proprie copie di database distribuiti, reinizializzando il proprio generatore di numeri casuali, ecc. Da notare che la creazione automatica funziona solo quando effettuata tramite i metodi create o update di API/CLI, ma non quando il file di configurazione viene modificato manualmente.

vmstatestorage: <storage ID>

Storage predefinito per i volumi/file di stato della VM.

watchdog: [[model=]<i6300esb|ib700>] [,action=<enum>]

Creare un dispositivo watchdog hardware virtuale. Una volta abilitato (tramite un'azione del guest), il watchdog deve essere interrogato periodicamente da un agente all'interno del guest, altrimenti il watchdog riavvierà il guest (o eseguirà la rispettiva azione specificata)

action=<debug | none | pause | poweroff | reset | shutdown>

L'azione da eseguire se, dopo l'attivazione, il guest non riesce a interrogare il watchdog in tempo.

model=<i6300esb | ib700> (predefinito = i6300esb)

Tipo di watchdog da emulare.

10.15. Blocchi

Le migrazioni online, gli snapshot e i backup (vzdump) impostano un blocco per impedire azioni concorrenti incompatibili sulle VM interessate. A volte è necessario rimuovere manualmente tale blocco (ad esempio dopo un'interruzione di corrente).

# qm unlock <vmid>
Caution Procedere solo se si è certi che l'azione che ha impostato il blocco non sia più in esecuzione.

11. Proxmox Container Toolkit

I container sono un'alternativa leggera alle macchine virtuali (VM) completamente virtualizzate. Utilizzano il kernel del sistema host su cui vengono eseguiti, invece di emulare un sistema operativo (OS) completo. Questo significa che i container possono accedere direttamente alle risorse del sistema host.

I costi di esecuzione dei container sono bassi, generalmente trascurabili. Tuttavia, ci sono alcuni svantaggi da considerare:

  • Nei container Proxmox è possibile eseguire solo distribuzioni Linux. Non è possibile eseguire altri sistemi operativi come, ad esempio, FreeBSD o Microsoft Windows all'interno di un container.

  • Per motivi di sicurezza, l'accesso alle risorse dell'host deve essere limitato. Pertanto, i container vengono eseguiti in namespace separati propri. Inoltre, alcune syscall (richieste dello spazio utente al kernel Linux) non sono consentite all'interno dei container.

Proxmox VE utilizza Linux Containers (LXC) come tecnologia container sottostante. Il "Proxmox Container Toolkit" (pct) semplifica l'utilizzo e la gestione di LXC, fornendo un'interfaccia che astrae attività complesse.

I container sono strettamente integrati con Proxmox VE. Questo significa che sono a conoscenza della configurazione del cluster e possono utilizzare le stesse risorse di rete e storage delle macchine virtuali. È inoltre possibile utilizzare il firewall di Proxmox VE o gestire i container utilizzando il framework HA.

Il nostro obiettivo principale è stato tradizionalmente quello di offrire un ambiente che fornisca i vantaggi dell'uso di una VM, ma senza l'overhead aggiuntivo. Questo significa che i Container Proxmox sono stati classificati principalmente come "System Container".

Con l'introduzione del supporto alle immagini OCI (Open Container Initiative), Proxmox VE integra ora anche gli "Application Container" come anteprima tecnologica. Quando si crea un container a partire da un'immagine OCI, l'immagine viene convertita automaticamente nello stack LXC utilizzato da Proxmox VE.

Questo approccio consente di beneficiare di un ampio ecosistema di applicazioni preconfezionate mantenendo al contempo le solide funzionalità di gestione di Proxmox VE.

Sebbene l'esecuzione diretta di "Application Container" leggeri offra vantaggi significativi rispetto a una VM completa, per i casi d'uso che richiedono il massimo isolamento e la possibilità di live migration, l'annidamento di container all'interno di una VM QEMU Proxmox rimane una pratica consigliata.

11.1. Panoramica della tecnologia

  • LXC (https://linuxcontainers.org/)

  • Integrato nell'interfaccia utente grafica (GUI) web di Proxmox VE

  • Strumento a riga di comando facile da usare pct

  • Accesso tramite API REST di Proxmox VE

  • lxcfs per fornire un file system /proc containerizzato

  • Control group (cgroups) per l'isolamento e la limitazione delle risorse

  • AppArmor e seccomp per migliorare la sicurezza

  • Kernel Linux moderni

  • Distribuzione basata su immagini (template)

  • Utilizza la libreria di storage di Proxmox VE

  • Configurazione del container dall'host (rete, DNS, storage, ecc.)

11.2. Distribuzioni supportate

Di seguito è riportato l'elenco delle distribuzioni ufficialmente supportate.

I template per le seguenti distribuzioni sono disponibili tramite i nostri repository. È possibile utilizzare lo strumento pveam o l'interfaccia utente grafica per scaricarli.

11.2.1. Alpine Linux

Alpine Linux è una distribuzione Linux leggera orientata alla sicurezza, basata su musl libc e busybox.

Per le release attualmente supportate, vedere:

11.2.2. Arch Linux

Arch Linux, una distribuzione Linux® leggera e flessibile che cerca di mantenere la semplicità (Keep It Simple).

Arch Linux utilizza un modello a rolling-release; per maggiori dettagli consultare il suo wiki:

11.2.3. CentOS, Almalinux, Rocky Linux

CentOS / CentOS Stream

La distribuzione CentOS Linux è una piattaforma stabile, prevedibile, gestibile e riproducibile, derivata dai sorgenti di Red Hat Enterprise Linux (RHEL)

Per le release attualmente supportate, vedere:

Almalinux

Una distribuzione Linux enterprise open source, di proprietà della comunità e da essa governata, gratuita per sempre, incentrata sulla stabilità a lungo termine e in grado di fornire una solida piattaforma adatta agli ambienti di produzione. AlmaLinux OS è compatibile binariamente 1:1 con RHEL® e con CentOS pre-Stream.

Per le release attualmente supportate, vedere:

Rocky Linux

Rocky Linux è un sistema operativo enterprise comunitario progettato per essere compatibile bug-for-bug al 100% con la principale distribuzione Linux enterprise americana, ora che il suo partner downstream ha cambiato direzione.

Per le release attualmente supportate, vedere:

11.2.4. Debian

Debian è un sistema operativo libero, sviluppato e mantenuto dal progetto Debian. Una distribuzione Linux libera con migliaia di applicazioni per soddisfare le esigenze degli utenti.

Per le release attualmente supportate, vedere:

11.2.5. Devuan

Devuan GNU+Linux è un fork di Debian senza systemd che consente agli utenti di riprendere il controllo del proprio sistema evitando complicazioni superflue e garantendo la libertà di init (Init Freedom).

Per le release attualmente supportate, vedere:

11.2.6. Fedora

Fedora crea una piattaforma innovativa, libera e open source per hardware, cloud e container, che consente agli sviluppatori software e ai membri della community di realizzare soluzioni su misura per i propri utenti.

Per le release attualmente supportate, vedere:

11.2.7. Gentoo

una distribuzione Linux basata sui sorgenti, estremamente flessibile.

Gentoo utilizza un modello a rilascio continuo (rolling-release).

11.2.8. OpenSUSE

La scelta dei maker per amministratori di sistema, sviluppatori e utenti desktop.

Per le release attualmente supportate, vedere:

11.2.9. Ubuntu

Ubuntu è il moderno sistema operativo open source su Linux per server aziendali, desktop, cloud e IoT.

Per le release attualmente supportate, vedere:

11.3. Immagini container

Le immagini container, a volte indicate anche come "template" o "appliance", sono archivi tar che contengono tutto il necessario per eseguire un container. Proxmox VE può utilizzare due tipi principali di immagini: Template di container di sistema per creare ambienti virtuali completi e Immagini di container applicativi basate sullo standard OCI per eseguire applicazioni specifiche.

11.3.1. Template di container di sistema

Proxmox VE stesso fornisce una serie di template di base per le distribuzioni Linux più comuni. È possibile scaricarli tramite la GUI o l'utility a riga di comando pveam (abbreviazione di Proxmox VE Appliance Manager). Sono inoltre disponibili per il download i template di container TurnKey Linux.

L'elenco dei template disponibili viene aggiornato quotidianamente tramite il timer pve-daily-update. È anche possibile avviare un aggiornamento manuale eseguendo:

# pveam update

Per visualizzare l'elenco delle immagini disponibili, eseguire:

# pveam available

È possibile limitare questo lungo elenco specificando la section di interesse, ad esempio le immagini system di base:

List available system images
# pveam available --section system
system          alpine-3.12-default_20200823_amd64.tar.xz
system          alpine-3.13-default_20210419_amd64.tar.xz
system          alpine-3.14-default_20210623_amd64.tar.xz
system          archlinux-base_20210420-1_amd64.tar.gz
system          centos-7-default_20190926_amd64.tar.xz
system          centos-8-default_20201210_amd64.tar.xz
system          debian-9.0-standard_9.7-1_amd64.tar.gz
system          debian-10-standard_10.7-1_amd64.tar.gz
system          devuan-3.0-standard_3.0_amd64.tar.gz
system          fedora-33-default_20201115_amd64.tar.xz
system          fedora-34-default_20210427_amd64.tar.xz
system          gentoo-current-default_20200310_amd64.tar.xz
system          opensuse-15.2-default_20200824_amd64.tar.xz
system          ubuntu-16.04-standard_16.04.5-1_amd64.tar.gz
system          ubuntu-18.04-standard_18.04.1-1_amd64.tar.gz
system          ubuntu-20.04-standard_20.04-1_amd64.tar.gz
system          ubuntu-20.10-standard_20.10-1_amd64.tar.gz
system          ubuntu-21.04-standard_21.04-1_amd64.tar.gz

Prima di poter utilizzare un template di questo tipo, è necessario scaricarlo in uno degli storage disponibili. In caso di dubbio su quale scegliere, è possibile semplicemente utilizzare lo storage denominato local. Per le installazioni in cluster, è preferibile utilizzare uno storage condiviso in modo che tutti i nodi possano accedere a tali immagini.

# pveam download local debian-10.0-standard_10.0-1_amd64.tar.gz

A questo punto è possibile creare container utilizzando tale immagine, e si possono elencare tutte le immagini scaricate sullo storage local con:

# pveam list local
local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz  219.95MB
Tip È anche possibile utilizzare l'interfaccia web di Proxmox VE per scaricare, elencare ed eliminare i template dei container.

pct le utilizza per creare un nuovo container, ad esempio:

# pct create 999 local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz

Il comando precedente mostra gli identificatori di volume completi di Proxmox VE. Questi includono il nome dello storage, e la maggior parte degli altri comandi di Proxmox VE può utilizzarli. Ad esempio, è possibile eliminare in seguito tale immagine con:

# pveam remove local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz

11.3.2. Immagini Open Container Initiative (OCI)

Proxmox VE può anche utilizzare immagini OCI per creare container, sia container di sistema che container applicativi. Si noti che l'esecuzione di container applicativi in Proxmox VE è attualmente considerata un'anteprima tecnologica.

Un container creato da un'immagine OCI utilizza comunque il framework LXC esistente.

11.3.3. Ottenere immagini OCI

Nell'interfaccia web, un'immagine OCI può essere caricata manualmente oppure scaricata da un registry utilizzando il pulsante Pull from OCI registry nella vista dei template di container di uno storage.

Una volta che il template è su uno storage, è possibile creare il container con pct create oppure utilizzare la procedura guidata nell'interfaccia web.

11.4. Impostazioni del container

11.4.1. Impostazioni generali

screenshot/gui-create-ct-general.png

Le impostazioni generali di un container includono

  • il nodo: il server fisico su cui verrà eseguito il container

  • il CT ID: un numero univoco in questa installazione di Proxmox VE utilizzato per identificare il container

  • Hostname: l'hostname del container

  • Resource Pool: un gruppo logico di container e VM

  • Password: la password di root del container

  • SSH Public Key: una chiave pubblica per la connessione all'account root tramite SSH

  • Unprivileged container: questa opzione consente di scegliere al momento della creazione se creare un container privilegiato o non privilegiato.

  • Nesting: espone procfs e sysfs per consentire container annidati. Da notare che anche systemd utilizza questa funzionalità per isolare i servizi.

Container non privilegiati

I container non privilegiati utilizzano una nuova funzionalità del kernel chiamata user namespaces. L'UID 0 di root all'interno del container viene mappato su un utente non privilegiato all'esterno del container. Ciò significa che la maggior parte dei problemi di sicurezza (container escape, abuso di risorse, ecc.) in questi container interesserà un utente non privilegiato casuale e costituirebbe un bug generico di sicurezza del kernel anziché un problema di LXC. Il team LXC ritiene che i container non privilegiati siano sicuri per progettazione.

Questa è l'opzione predefinita durante la creazione di un nuovo container.

Note Se il container utilizza systemd come sistema di init, è opportuno considerare che la versione di systemd in esecuzione all'interno del container deve essere pari o superiore a 220.
Container privilegiati

La sicurezza nei container si ottiene tramite restrizioni di controllo degli accessi obbligatorio di AppArmor, filtri seccomp e namespace del kernel Linux. Il team LXC considera questo tipo di container non sicuro e non considererà i nuovi exploit di container escape come problemi di sicurezza meritevoli di un CVE e di una correzione rapida. Per questo motivo i container privilegiati dovrebbero essere utilizzati solo in ambienti affidabili.

11.4.2. CPU

screenshot/gui-create-ct-cpu.png

È possibile limitare il numero di CPU visibili all'interno del container utilizzando l'opzione cores. Questo viene implementato tramite il cgroup Linux cpuset (control group). Un task speciale all'interno di pvestatd tenta periodicamente di distribuire i container in esecuzione tra le CPU disponibili. Per visualizzare le CPU assegnate eseguire il seguente comando:

# pct cpusets
 ---------------------
 102:              6 7
 105:      2 3 4 5
 108:  0 1
 ---------------------

I container utilizzano direttamente il kernel dell'host. Tutti i task all'interno di un container sono gestiti dallo scheduler della CPU dell'host. Proxmox VE utilizza per impostazione predefinita lo scheduler Linux CFS (Completely Fair Scheduler), che dispone di opzioni aggiuntive per il controllo della banda.

cpulimit:

Questa opzione consente di limitare ulteriormente il tempo di CPU assegnato. Da notare che si tratta di un numero in virgola mobile, quindi è perfettamente valido assegnare due core a un container, ma limitare il consumo complessivo di CPU a metà core.

cores: 2
cpulimit: 0.5
cpuunits:

Si tratta di un peso relativo passato allo scheduler del kernel. Quanto maggiore è il numero, tanto più tempo di CPU riceve questo container. Il numero è relativo ai pesi di tutti gli altri container in esecuzione. Il valore predefinito è 100 (oppure 1024 se l'host utilizza il cgroup v1 legacy). È possibile utilizzare questa impostazione per assegnare priorità ad alcuni container.

11.4.3. Memoria

screenshot/gui-create-ct-memory.png

La memoria del container è controllata tramite il controller di memoria del cgroup.

memory:

Limitare l'utilizzo complessivo della memoria. Questo corrisponde all'impostazione cgroup memory.limit_in_bytes.

swap:

Consente al container di utilizzare memoria swap aggiuntiva dallo spazio swap dell'host. Questo corrisponde all'impostazione cgroup memory.memsw.limit_in_bytes, che viene impostata sulla somma di entrambi i valori (memory + swap).

11.4.4. Punti di mount

screenshot/gui-create-ct-root-disk.png

Il punto di mount root è configurato con la proprietà rootfs. È possibile configurare fino a 256 punti di mount aggiuntivi. Le opzioni corrispondenti sono denominate da mp0 a mp255. Possono contenere le seguenti impostazioni:

rootfs: [volume=]<volume> [,acl=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come root del container. Di seguito una descrizione dettagliata di tutte le opzioni.

mp[n]: [volume=]<volume> ,mp=<Path> [,acl=<1|0>] [,backup=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,keepattrs=<1|0>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come punto di mount del container. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume.

acl=<boolean>

Abilitare o disabilitare esplicitamente il supporto ACL.

backup=<boolean>

Indica se includere il punto di mount nei backup (utilizzato solo per i punti di mount su volume).

idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>

Personalizzare le mappature UID/GID che sovrascrivono lxc.idmap del container per questo punto di mount. Accetta un elenco di voci type:container:disk:range-size separate da punto e virgola.

type è u per UID o g per GID.

container è il primo ID così come appare all'interno del container.

disk è il primo ID corrispondente sul filesystem sottostante.

range-size è il numero di ID consecutivi da mappare.

Per gli ID non mappati viene utilizzata la mappatura lxc.idmap del container.

Esempio 1: u:123:456:1 mappa l'UID 123 nel container all'UID 456 sul disco. I file posseduti dall'UID 456 sul disco appariranno come UID 123 all'interno del container.

Esempio 2: g:100:50:5 mappa 5 GID consecutivi, in modo che i GID 100-104 nel container siano mappati ai GID 50-54 sul disco.

Esempio 3: passthrough mappa in modo identico tutti gli UID e GID, il che significa che gli ID all'interno del container corrisponderanno agli ID sul disco.

keepattrs=<boolean> (default = 0)

Ereditare UID, GID e modalità di accesso dalla directory del punto di mount, se esiste già.

mountoptions=<opt[;opt...]>

Opzioni di mount aggiuntive per rootfs/mps.

mp=<Path>

Percorso del punto di mount come visto dall'interno del container.

Note Per motivi di sicurezza non deve contenere alcun symlink.
quota=<boolean>

Abilitare le quote utente all'interno del container (funzionalità non supportata con i subvolume zfs)

replicate=<boolean> (default = 1)

Include questo volume in un job di replica dello storage.

ro=<boolean>

Punto di mount in sola lettura

shared=<boolean> (default = 0)

Contrassegnare questo punto di mount non associato a un volume come disponibile su tutti i nodi.

Warning Questa opzione non condivide automaticamente il punto di mount, presuppone che sia già condiviso!
size=<DiskSize>

Dimensione del volume (valore di sola lettura).

volume=<volume>

Volume, dispositivo o directory da montare nel container.

Attualmente esistono tre tipi di punti di mount: punti di mount basati su storage, bind mount e mount di dispositivi.

Typical container rootfs configuration
rootfs: thin1:base-100-disk-1,size=8G
Punti di mount basati su storage

I punti di mount basati su storage sono gestiti dal sottosistema di storage di Proxmox VE e sono disponibili in tre diverse varianti:

  • Basate su immagine: si tratta di immagini raw contenenti un singolo file system formattato ext4.

  • Subvolumi ZFS: si tratta tecnicamente di bind mount, ma con storage gestito, e pertanto consentono il ridimensionamento e la creazione di snapshot.

  • Directory: specificando size=0 si attiva un caso speciale in cui, anziché un'immagine raw, viene creata una directory.

Note La sintassi speciale dell'opzione STORAGE_ID:SIZE_IN_GB per i volumi dei punti di mount basati su storage alloca automaticamente un volume delle dimensioni specificate sullo storage indicato. Ad esempio, richiamando
pct set 100 -mp0 thin1:10,mp=/path/in/container

verrà allocato un volume da 10GB sullo storage thin1 e verrà sostituito il segnaposto dell'ID volume 10 con l'ID del volume allocato, configurando il mount point nel container in /path/in/container

Bind mount point

I bind mount consentono di accedere a directory arbitrarie dell'host Proxmox VE all'interno di un container. Alcuni possibili casi d'uso sono:

  • Accesso alla home directory nel guest

  • Accesso alla directory di un dispositivo USB nel guest

  • Accesso a un mount NFS dell'host nel guest

I bind mount sono considerati non gestiti dal sottosistema di storage, pertanto non è possibile eseguire snapshot né gestire le quote dall'interno del container. Con i container non privilegiati si potrebbero verificare problemi di permessi causati dalla mappatura utente e non è possibile utilizzare le ACL.

Note Il contenuto dei bind mount point non viene incluso nel backup quando si utilizza vzdump.
Warning Per motivi di sicurezza, i bind mount dovrebbero essere stabiliti solo utilizzando directory sorgente appositamente riservate a questo scopo, ad esempio una gerarchia di directory sotto /mnt/bindmounts. Non effettuare mai il bind mount di directory di sistema come /, /var o /etc in un container: ciò rappresenta un grave rischio per la sicurezza.
Note Il percorso sorgente del bind mount non deve contenere alcun symlink.

Ad esempio, per rendere accessibile la directory /mnt/bindmounts/shared nel container con ID 100 nel percorso /shared, aggiungere una riga di configurazione come:

mp0: /mnt/bindmounts/shared,mp=/shared

in /etc/pve/lxc/100.conf.

In alternativa, utilizzare lo strumento pct:

pct set 100 -mp0 /mnt/bindmounts/shared,mp=/shared

per ottenere lo stesso risultato.

Punti di montaggio dei dispositivi

I device mount point consentono di montare direttamente i dispositivi a blocchi dell'host all'interno del container. Analogamente ai bind mount, i device mount non sono gestiti dal sottosistema di storage di Proxmox VE, ma le opzioni quota e acl verranno rispettate.

Note I device mount point dovrebbero essere utilizzati solo in circostanze particolari. Nella maggior parte dei casi un mount point basato su storage offre le stesse prestazioni e molte più funzionalità.
Note Il contenuto dei device mount point non viene incluso nel backup quando si utilizza vzdump.

11.4.5. Rete

screenshot/gui-create-ct-network.png

È possibile configurare fino a 10 interfacce di rete per un singolo container. Le opzioni corrispondenti sono denominate da net0 a net9 e possono contenere le seguenti impostazioni:

net[n]: name=<string> [,bridge=<bridge>] [,firewall=<1|0>] [,gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,host-managed=<1|0>] [,hwaddr=<XX:XX:XX:XX:XX:XX>] [,ip=<(IPv4/CIDR|dhcp|manual)>] [,ip6=<(IPv6/CIDR|auto|dhcp|manual)>] [,link_down=<1|0>] [,mtu=<integer>] [,rate=<mbps>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,type=<veth>]

Specifica le interfacce di rete per il container.

bridge=<bridge>

Bridge a cui collegare il dispositivo di rete.

firewall=<boolean>

Controlla se devono essere utilizzate le regole firewall di questa interfaccia.

gw=<GatewayIPv4>

Gateway predefinito per il traffico IPv4.

gw6=<GatewayIPv6>

Gateway predefinito per il traffico IPv6.

host-managed=<boolean>

Indica se la configurazione IP di questa interfaccia deve essere gestita dall'host. Se abilitata, l'host (anziché il container) è responsabile della configurazione IP dell'interfaccia. Il container non dovrebbe eseguire un proprio client DHCP o network manager su questa interfaccia. Ciò è utile per i container privi di uno stack interno di gestione della rete, come molti container applicativi.

hwaddr=<XX:XX:XX:XX:XX:XX>

Un indirizzo MAC comune con il bit I/G (Individual/Group) non impostato.

ip=<(IPv4/CIDR|dhcp|manual)>

Indirizzo IPv4 in formato CIDR.

ip6=<(IPv6/CIDR|auto|dhcp|manual)>

Indirizzo IPv6 in formato CIDR.

link_down=<boolean>

Indica se questa interfaccia deve essere disconnessa (come staccare la spina).

mtu=<integer> (64 - 65535)

Unità massima di trasmissione dell'interfaccia. (lxc.network.mtu)

name=<string>

Nome del dispositivo di rete visto dall'interno del container. (lxc.network.name)

rate=<mbps>

Applicare una limitazione di velocità all'interfaccia

tag=<integer> (1 - 4094)

Tag VLAN per questa interfaccia.

trunks=<vlanid[;vlanid...]>

ID VLAN da far transitare attraverso l'interfaccia

type=<veth>

Tipo di interfaccia di rete.

11.4.6. Avvio e arresto automatici dei container

Per avviare automaticamente un container all'avvio del sistema host, selezionare l'opzione Start at boot nel pannello Options del container nell'interfaccia web oppure eseguire il seguente comando:

# pct set CTID -onboot 1
screenshot/gui-qemu-edit-start-order.png
Start and Shutdown Order

Per regolare con precisione l'ordine di avvio dei container, è possibile utilizzare i seguenti parametri:

  • Start/Shutdown order: definisce la priorità dell'ordine di avvio. Ad esempio, impostarlo a 1 se si desidera che il CT sia il primo ad essere avviato. (Per l'arresto si utilizza l'ordine inverso rispetto all'avvio, quindi un container con ordine di avvio pari a 1 sarà l'ultimo ad essere arrestato)

  • Startup delay: definisce l'intervallo tra l'avvio di questo container e l'avvio dei container successivi. Ad esempio, impostarlo a 240 per attendere 240 secondi prima di avviare gli altri container.

  • Shutdown timeout: definisce la durata in secondi che Proxmox VE deve attendere affinché il container risulti offline dopo l'invio di un comando di arresto. Per impostazione predefinita questo valore è impostato a 60, il che significa che Proxmox VE invierà una richiesta di arresto, attenderà 60s affinché la macchina risulti offline e, se dopo 60s la macchina è ancora online, notificherà che l'operazione di arresto non è riuscita.

Si noti che i container privi del parametro Start/Shutdown order verranno sempre avviati dopo quelli per cui il parametro è impostato, e questo parametro ha senso solo tra le macchine in esecuzione localmente su un host, non a livello di cluster.

Se è necessario un ritardo tra l'avvio dell'host e l'avvio del primo container, vedere la sezione Gestione dei nodi di Proxmox VE.

11.4.7. Hookscript

È possibile aggiungere un hook script ai CT tramite la proprietà di configurazione hookscript.

# pct set 100 -hookscript local:snippets/hookscript.pl

Verrà richiamato durante varie fasi del ciclo di vita del guest. Per un esempio e la documentazione, vedere lo script di esempio in /usr/share/pve-docs/examples/guest-example-hookscript.pl.

11.5. Considerazioni sulla sicurezza

I container utilizzano il kernel del sistema host. Ciò espone una superficie di attacco per utenti malintenzionati. In generale, le macchine virtuali complete offrono un migliore isolamento. Questo aspetto va considerato se i container vengono forniti a persone sconosciute o non attendibili.

Per ridurre la superficie di attacco, LXC utilizza numerose funzionalità di sicurezza come AppArmor, CGroup e namespace del kernel.

11.5.1. AppArmor

I profili AppArmor vengono utilizzati per limitare l'accesso ad azioni potenzialmente pericolose. Alcune system call, ad es. mount, non possono essere eseguite.

Per tracciare l'attività di AppArmor, utilizzare:

# dmesg | grep apparmor

Sebbene non sia consigliato, AppArmor può essere disabilitato per un container. Questo comporta rischi per la sicurezza. Alcune syscall possono portare a escalation dei privilegi quando eseguite all'interno di un container se il sistema è configurato in modo errato o se esiste una vulnerabilità di LXC o del kernel Linux.

Per disabilitare AppArmor per un container, aggiungere la seguente riga al file di configurazione del container situato in /etc/pve/lxc/CTID.conf:

lxc.apparmor.profile = unconfined
Warning Si noti che questa operazione non è consigliata per l'utilizzo in produzione.

11.5.2. Gruppi di controllo (cgroup)

Il cgroup è un meccanismo del kernel utilizzato per organizzare gerarchicamente i processi e distribuire le risorse di sistema.

Le principali risorse controllate tramite i cgroup sono il tempo CPU, i limiti di memoria e swap e l'accesso ai nodi di dispositivo. I cgroup vengono utilizzati anche per "congelare" un container prima di creare snapshot.

La versione corrente dei cgroup è cgroupv2. La versione v1 del sottosistema cgroup è stata deprecata con il rilascio di Proxmox VE 7.0 ed è stata rimossa completamente con Proxmox VE 9.0. Prima di Proxmox VE 7.0, la modalità predefinita era quella "ibrida".

Compatibilità delle versioni di CGroup

La principale differenza tra cgroupv2 puro e i vecchi ambienti ibridi per quanto riguarda Proxmox VE è che con cgroupv2 memoria e swap sono ora controllati in modo indipendente. Le impostazioni di memoria e swap per i container possono essere mappate direttamente su questi valori, mentre in precedenza era possibile impostare solo il limite di memoria e il limite della somma di memoria e swap.

Un'altra differenza importante è che il controller devices è configurato in un modo completamente diverso. Per questo motivo, le quote del file system non sono attualmente supportate in un ambiente cgroupv2 puro.

Il supporto a cgroupv2 da parte del sistema operativo del container è necessario per l'esecuzione in un ambiente cgroupv2 puro. I container con systemd versione 231 o successiva supportano cgroupv2
[questo include tutte le versioni principali più recenti dei template di container forniti da Proxmox VE]
, così come i container che non utilizzano systemd come sistema di init
[ad esempio Alpine Linux]
.

Note

CentOS 7 e Ubuntu 16.10 sono due rilasci di distribuzioni Linux di rilievo, che dispongono di una versione di systemd troppo datata per l'esecuzione in un ambiente cgroupv2; è possibile

  • Aggiornare l'intera distribuzione a un rilascio più recente. Per gli esempi precedenti, potrebbe trattarsi di Ubuntu 18.04 o 20.04, e CentOS 8 (o derivate RHEL/CentOS come AlmaLinux o Rocky Linux). Questo offre il vantaggio di ottenere le correzioni di bug e sicurezza più recenti, spesso anche nuove funzionalità, e di spostare nel futuro la data di fine vita (EOL).

  • Aggiornare la versione di systemd del container. Se la distribuzione fornisce un repository di backport, questa può essere una soluzione tampone facile e rapida.

  • Spostare il container, o i suoi servizi, su una macchina virtuale. Le macchine virtuali hanno un'interazione molto minore con l'host, motivo per cui è possibile installarvi senza problemi versioni di sistemi operativi vecchie di decenni.

Modifica della versione di CGroup

Prima di Proxmox VE 9.0, era possibile tornare alla versione precedente con il seguente parametro della riga di comando del kernel:

systemd.unified_cgroup_hierarchy=0

Vedere questa sezione sulla modifica della riga di comando di avvio del kernel per sapere dove aggiungere il parametro.

11.6. Configurazione del sistema operativo guest

Proxmox VE tenta di rilevare la distribuzione Linux presente nel container e modifica alcuni file. Di seguito un breve elenco delle operazioni eseguite all'avvio del container:

impostazione di /etc/hostname

per impostare il nome del container

modifica di /etc/hosts

per consentire la risoluzione dell'hostname locale

configurazione di rete

per trasmettere al container la configurazione di rete completa

configurazione del DNS

per trasmettere le informazioni sui server DNS

adattamento del sistema di init

ad esempio, correzione del numero di processi getty generati

impostazione della password di root

durante la creazione di un nuovo container

riscrittura delle ssh_host_keys

in modo che ogni container disponga di chiavi univoche

randomizzazione del crontab

in modo che cron non si avvii alla stessa ora su tutti i container

Le modifiche apportate da Proxmox VE sono racchiuse tra marcatori di commento:

# --- BEGIN PVE ---
<data>
# --- END PVE ---

Questi marcatori verranno inseriti in una posizione ragionevole all'interno del file. Se una sezione di questo tipo esiste già, verrà aggiornata sul posto e non verrà spostata.

È possibile impedire la modifica di un file aggiungendo per esso un file .pve-ignore.. Ad esempio, se esiste il file /etc/.pve-ignore.hosts, il file /etc/hosts non verrà modificato. Può trattarsi di un semplice file vuoto creato tramite:

# touch /etc/.pve-ignore.hosts

La maggior parte delle modifiche dipende dal sistema operativo, pertanto varia tra le diverse distribuzioni e versioni. È possibile disabilitare completamente le modifiche impostando manualmente ostype su unmanaged.

Il rilevamento del tipo di sistema operativo viene effettuato verificando la presenza di determinati file all'interno del container. Proxmox VE controlla innanzitutto il file /etc/os-release
[/etc/os-release sostituisce la moltitudine di file di rilascio specifici per ogni distribuzione https://manpages.debian.org/stable/systemd/os-release.5.en.html]
. Se tale file non è presente, o non contiene un identificatore di distribuzione chiaramente riconoscibile, vengono controllati i seguenti file di rilascio specifici per distribuzione.

Ubuntu

controllo di /etc/lsb-release (DISTRIB_ID=Ubuntu)

Debian

verifica di /etc/debian_version

Fedora

verifica di /etc/fedora-release

RedHat o CentOS

verifica di /etc/redhat-release

ArchLinux

test /etc/arch-release

Alpine

test /etc/alpine-release

Gentoo

test /etc/gentoo-release

Note L'avvio del container non riesce se l'ostype configurato differisce dal tipo rilevato automaticamente.

11.7. Storage del container

Il modello di storage dei container LXC di Proxmox VE è più flessibile rispetto ai modelli di storage tradizionali per container. Un container può avere più mount point. Questo consente di utilizzare lo storage più adatto per ogni applicazione.

Ad esempio il file system radice del container può trovarsi su uno storage lento ed economico, mentre il database può trovarsi su uno storage rapido e distribuito tramite un secondo mount point. Vedere la sezione Mount point per ulteriori dettagli.

È possibile utilizzare qualsiasi tipo di storage supportato dalla libreria di storage di Proxmox VE. Ciò significa che i container possono essere memorizzati su storage locale (ad esempio lvm, zfs o directory), storage esterno condiviso (come iSCSI, NFS) o anche su sistemi di storage distribuito come Ceph. Funzionalità di storage avanzate come snapshot o clonazioni possono essere utilizzate se lo storage sottostante le supporta. Lo strumento di backup vzdump può utilizzare gli snapshot per fornire backup coerenti dei container.

Inoltre, dispositivi locali o directory locali possono essere montati direttamente utilizzando i bind mount. Questo consente di accedere a risorse locali all'interno di un container con un overhead praticamente nullo. I bind mount possono essere utilizzati come metodo semplice per condividere dati tra container.

11.7.1. Mount FUSE

Warning A causa di problemi esistenti nel sottosistema freezer del kernel Linux, si sconsiglia fortemente l'uso di mount FUSE all'interno di un container, poiché i container devono essere bloccati (freeze) per i backup in modalità suspend o snapshot.

Se i mount FUSE non possono essere sostituiti da altri meccanismi di montaggio o tecnologie di storage, è possibile stabilire il mount FUSE sull'host Proxmox e utilizzare un mount point di tipo bind per renderlo accessibile all'interno del container.

11.7.2. Utilizzo delle quote all'interno dei container

Le quote consentono di impostare limiti all'interno di un container per la quantità di spazio disco che ogni utente può utilizzare.

Note Attualmente ciò richiede l'uso dei cgroup legacy.
Note Funziona solo con tipi di storage basati su immagine ext4 e attualmente funziona solo con container privilegiati.

L'attivazione dell'opzione quota fa sì che vengano utilizzate le seguenti opzioni di mount per un mount point: usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0

Questo consente di utilizzare le quote come su qualsiasi altro sistema. È possibile inizializzare i file /aquota.user e /aquota.group eseguendo:

# quotacheck -cmug /
# quotaon /

Quindi modificare le quote utilizzando il comando edquota. Fare riferimento alla documentazione della distribuzione in esecuzione all'interno del container per i dettagli.

Note È necessario eseguire i comandi precedenti per ogni mount point, passando il percorso del mount point invece di semplicemente /.

11.7.3. Utilizzo delle ACL all'interno dei container

Le Access Control List Posix standard sono disponibili anche all'interno dei container. Le ACL consentono di impostare una proprietà dei file più dettagliata rispetto al modello tradizionale utente/gruppo/altri.

11.7.4. Backup dei mount point del container

Per includere un mount point nei backup, abilitare l'opzione backup per esso nella configurazione del container. Per un mount point esistente mp0

mp0: guests:subvol-100-disk-1,mp=/root/files,size=8G

aggiungere backup=1 per abilitarlo.

mp0: guests:subvol-100-disk-1,mp=/root/files,size=8G,backup=1
Note Quando si crea un nuovo mount point nella GUI, questa opzione è abilitata per impostazione predefinita.

Per disabilitare i backup per un mount point, aggiungere backup=0 nel modo descritto sopra, oppure deselezionare la casella Backup nella GUI.

11.7.5. Replica dei mount point dei container

Per impostazione predefinita, i mount point aggiuntivi vengono replicati quando viene replicato il Disco radice. Se si desidera che il meccanismo di replica dello storage di Proxmox VE ignori un mount point, è possibile impostare l'opzione Salta replica per quel mount point. A partire da Proxmox VE 5.0, la replica richiede uno storage di tipo zfspool. L'aggiunta di un mount point su un tipo di storage diverso, quando il container ha la replica configurata, richiede che l'opzione Salta replica sia abilitata per quel mount point.

11.8. Backup e ripristino

11.8.1. Backup del container

È possibile utilizzare lo strumento vzdump per il backup dei container. Per maggiori informazioni consultare la pagina di manuale di vzdump.

11.8.2. Ripristino dei backup dei container

Il ripristino dei backup dei container effettuati con vzdump è possibile utilizzando il comando pct restore. Per impostazione predefinita, pct restore tenterà di ripristinare quanto più possibile della configurazione del container di cui è stato effettuato il backup. È possibile sovrascrivere la configurazione salvata nel backup impostando manualmente le opzioni del container sulla riga di comando (per maggiori informazioni consultare la pagina di manuale di pct).

Note pvesm extractconfig può essere utilizzato per visualizzare la configurazione di cui è stato effettuato il backup contenuta in un archivio vzdump.

Esistono due modalità di ripristino di base, che differiscono solo per la gestione dei mount point:

Modalità di ripristino “semplice”

Se non viene impostato esplicitamente né il parametro rootfs né alcuno dei parametri opzionali mpX, la configurazione dei mount point viene ripristinata dal file di configurazione di cui è stato effettuato il backup seguendo questi passaggi:

  1. Estrazione dei mount point e delle relative opzioni dal backup

  2. Creazione dei volumi per i mount point basati su storage sullo storage specificato con il parametro storage (predefinito: local).

  3. Estrazione dei file dall’archivio di backup

  4. Aggiungere i mount point bind e device alla configurazione ripristinata (operazione riservata all’utente root)

Note Poiché i mount point bind e device non vengono mai sottoposti a backup, nell’ultimo passaggio non viene ripristinato alcun file, ma solo le opzioni di configurazione. Si presume che tali mount point siano sottoposti a backup con un altro meccanismo (ad esempio uno spazio NFS montato in modalità bind in molti container), oppure che non sia previsto alcun backup per essi.

Questa modalità semplice viene utilizzata anche dalle operazioni di ripristino dei container nell’interfaccia web.

Modalità di ripristino “avanzata”

Impostando il parametro rootfs (e, opzionalmente, una qualsiasi combinazione di parametri mpX), il comando pct restore passa automaticamente alla modalità avanzata. Questa modalità avanzata ignora completamente le opzioni di configurazione rootfs e mpX contenute nell’archivio di backup e utilizza invece solo le opzioni fornite esplicitamente come parametri.

Questa modalità consente una configurazione flessibile delle impostazioni dei mount point al momento del ripristino, ad esempio:

  • Impostazione dello storage di destinazione, delle dimensioni dei volumi e di altre opzioni per ciascun mount point singolarmente

  • Redistribuire i file di cui è stato eseguito il backup secondo il nuovo schema dei punti di montaggio

  • Ripristino su mount point device e/o bind (limitato all’utente root)

11.9. Gestione dei container con pct

Il “Proxmox Container Toolkit” (pct) è lo strumento da riga di comando per gestire i container Proxmox VE. Consente di creare o distruggere container, oltre a controllare l’esecuzione del container (avvio, arresto, riavvio, migrazione, ecc.). Può essere utilizzato per impostare parametri nel file di configurazione di un container, ad esempio la configurazione di rete o i limiti di memoria.

11.9.1. Esempi di utilizzo della CLI

Creazione di un container basato su un template Debian (a condizione che il template sia già stato scaricato tramite l’interfaccia web)

# pct create 100 /var/lib/vz/template/cache/debian-10.0-standard_10.0-1_amd64.tar.gz

Avvio del container 100

# pct start 100

Avvio di una sessione di login tramite getty

# pct console 100

Accesso al namespace LXC ed esecuzione di una shell come utente root

# pct enter 100

Visualizzazione della configurazione

# pct config 100

Aggiunta di un’interfaccia di rete denominata eth0, collegata in bridge al bridge dell’host vmbr0, impostando l’indirizzo e il gateway, mentre è in esecuzione

# pct set 100 -net0 name=eth0,bridge=vmbr0,ip=192.168.15.147/24,gw=192.168.15.1

Riduzione della memoria del container a 512MB

# pct set 100 -memory 512

La distruzione di un container lo rimuove sempre dalle Access Control List e rimuove sempre la configurazione del firewall del container. È necessario attivare --purge se si desidera rimuovere inoltre il container dai job di replica, dai job di backup e dalle configurazioni delle risorse HA.

Note L'attivazione di purge rimuoverà anche la risorsa HA da tutte le regole di affinità che la referenziano e rimuoverà le regole che hanno solo questa risorsa rimanente.
# pct destroy 100 --purge

Spostamento di un volume di un mount point su uno storage diverso.

# pct move-volume 100 mp0 other-storage

Riassegnazione di un volume a un CT diverso. Questo rimuoverà il volume mp0 dal CT di origine e lo collegherà come mp1 al CT di destinazione. In background il volume viene rinominato in modo che il nome corrisponda al nuovo proprietario.

#  pct move-volume 100 mp0 --target-vmid 200 --target-volume mp1

11.9.2. Ottenimento dei log di debug

Nel caso in cui pct start non sia in grado di avviare un determinato container, può essere utile raccogliere l’output di debug passando il flag --debug (sostituire CTID con il CTID del container):

# pct start CTID --debug

In alternativa, è possibile utilizzare il seguente comando lxc-start, che salverà il log di debug nel file specificato dall’opzione di output -o:

# lxc-start -n CTID -F -l DEBUG -o /tmp/lxc-CTID.log

Questo comando tenta di avviare il container in modalità foreground; per arrestare il container eseguire pct shutdown CTID oppure pct stop CTID in un secondo terminale.

Il log di debug raccolto viene scritto in /tmp/lxc-CTID.log.

Note Se la configurazione del container è stata modificata dopo l’ultimo tentativo di avvio con pct start, è necessario eseguire pct start almeno una volta per aggiornare anche la configurazione utilizzata da lxc-start.

11.10. Migrazione

Se è presente un cluster, è possibile migrare i Container con

# pct migrate <ctid> <target>

Questo funziona purché il Container sia offline. Se sono definiti volumi locali o mount point, la migrazione copierà il contenuto in rete verso il nodo di destinazione, se lo stesso storage è definito anche lì.

I container in esecuzione non possono essere migrati a caldo (live migration) per limitazioni tecniche. È possibile eseguire una migrazione con riavvio, che arresta, sposta e poi riavvia un container sul nodo di destinazione. Poiché i container sono molto leggeri, questo si traduce normalmente solo in un downtime di qualche centinaio di millisecondi.

Una migrazione con riavvio può essere eseguita tramite l’interfaccia web oppure utilizzando il flag --restart con il comando pct migrate.

Una migrazione con riavvio arresta il Container e lo termina forzatamente dopo il timeout specificato (il valore predefinito è 180 secondi). Successivamente migra il Container come in una migrazione offline e, al termine, avvia il Container sul nodo di destinazione.

11.11. Configurazione

Il file /etc/pve/lxc/<CTID>.conf memorizza la configurazione del container, dove <CTID> è l’ID numerico del container in questione. Come tutti gli altri file memorizzati all’interno di /etc/pve/, viene replicato automaticamente su tutti gli altri nodi del cluster.

Note I CTID < 100 sono riservati per scopi interni e i CTID devono essere univoci a livello di cluster.
Example Container Configuration
ostype: debian
arch: amd64
hostname: www
memory: 512
swap: 512
net0: bridge=vmbr0,hwaddr=66:64:66:64:64:36,ip=dhcp,name=eth0,type=veth
rootfs: local:107/vm-107-disk-1.raw,size=7G

I file di configurazione sono semplici file di testo. È possibile modificarli utilizzando un normale editor di testo, ad esempio vi o nano. Questo è talvolta utile per piccole correzioni, ma occorre tenere presente che è necessario riavviare il container per applicare tali modifiche.

Per questo motivo, è generalmente preferibile utilizzare il comando pct per generare e modificare questi file, oppure eseguire l’intera operazione tramite la GUI. Il toolkit è abbastanza intelligente da applicare istantaneamente la maggior parte delle modifiche ai container in esecuzione. Questa funzionalità è chiamata “hot plug” e in questo caso non è necessario riavviare il container.

Nei casi in cui una modifica non può essere applicata a caldo, viene registrata come modifica in sospeso (mostrata in rosso nella GUI). Verrà applicata solo dopo il riavvio del container.

11.11.1. Formato del file

Il file di configurazione del container utilizza un semplice formato chiave/valore separato da due punti. Ogni riga ha il seguente formato:

# this is a comment
OPTION: value

Le righe vuote in questi file vengono ignorate, e le righe che iniziano con il carattere # sono trattate come commenti e vengono anch'esse ignorate.

È possibile aggiungere direttamente configurazioni a basso livello, in stile LXC, ad esempio:

lxc.init_cmd: /sbin/my_own_init

oppure

lxc.init_cmd = /sbin/my_own_init

Le impostazioni vengono passate direttamente agli strumenti LXC di basso livello.

11.11.2. Snapshot

Quando si crea uno snapshot, pct memorizza la configurazione al momento dello snapshot in una sezione separata all’interno dello stesso file di configurazione. Ad esempio, dopo aver creato uno snapshot chiamato “testsnapshot”, il file di configurazione avrà questo aspetto:

Container configuration with snapshot
memory: 512
swap: 512
parent: testsnaphot
...

[testsnaphot]
memory: 512
swap: 512
snaptime: 1457170803
...

Esistono alcune proprietà relative agli snapshot, come parent e snaptime. La proprietà parent viene utilizzata per memorizzare la relazione padre/figlio tra gli snapshot. snaptime è il timestamp di creazione dello snapshot (Unix epoch).

11.11.3. Opzioni

arch: <amd64 | arm64 | armhf | i386 | riscv32 | riscv64> (predefinito = amd64)

Tipo di architettura del sistema operativo.

cmode: <console | shell | tty> (predefinito = tty)

Modalità console. Per impostazione predefinita, il comando console tenta di aprire una connessione a uno dei dispositivi tty disponibili. Impostando cmode su console, tenta invece di collegarsi a /dev/console. Se cmode viene impostato su shell, viene semplicemente avviata una shell all’interno del container (senza login).

console: <boolean> (predefinito = 1)

Collegare un dispositivo console (/dev/console) al container.

cores: <integer> (1 - 8192)

Il numero di core assegnati al container. Per impostazione predefinita, un container può utilizzare tutti i core disponibili.

cpulimit: <number> (0 - 8192) (predefinito = 0)

Limite di utilizzo della CPU.

Note Se il computer dispone di 2 CPU, il tempo CPU totale è pari a 2. Il valore 0 indica che non è impostato alcun limite di CPU.
cpuunits: <integer> (0 - 500000) (predefinito = cgroup v1: 1024, cgroup v2: 100)

Peso CPU per un container. L'argomento viene utilizzato nello scheduler fair del kernel. Maggiore è il numero, maggiore è il tempo di CPU assegnato a questo container. Il numero è relativo ai pesi di tutti gli altri guest in esecuzione.

debug: <boolean> (default = 0)

Aumentare la verbosità. Attualmente abilita solo il livello di log di debug all'avvio.

description: <string>

Descrizione del container. Viene mostrata nel riepilogo del CT nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

dev[n]: [[path=]<Path>] [,deny-write=<1|0>] [,gid=<integer>] [,mode=<Octal access mode>] [,uid=<integer>]

Dispositivo da passare al container

deny-write=<boolean> (default = 0)

Impedisce al container di scrivere sul dispositivo

gid=<integer> (0 - N)

ID del gruppo da assegnare al nodo del dispositivo

mode=<Octal access mode>

Modalità di accesso da impostare sul nodo del dispositivo

path=<Path>

Percorso del dispositivo da passare al container

uid=<integer> (0 - N)

ID utente da assegnare al nodo del dispositivo

entrypoint: (?^:[^\x00-\x08\x0a-\x1F\x7F]+) (default = /sbin/init)

Comando da eseguire come init, opzionalmente con argomenti; può iniziare con un percorso assoluto, un percorso relativo o un binario in $PATH.

env: (?^:(?:\w+=[^\x00-\x08\x0a-\x1F\x7F]*)(?:\0\w+=[^\x00-\x08\x0a-\x1F\x7F]*)*)

L'ambiente di runtime del container come elenco separato da NUL. Sostituisce eventuali voci lxc.environment.runtime nella configurazione.

features: [force_rw_sys=<1|0>] [,fuse=<1|0>] [,keyctl=<1|0>] [,mknod=<1|0>] [,mount=<fstype;fstype;...>] [,nesting=<1|0>]

Consente ai container di accedere a funzionalità avanzate.

force_rw_sys=<boolean> (default = 0)

Montare /sys nei container non privilegiati come rw invece di mixed. Questo può interrompere il funzionamento della rete quando si utilizzano versioni più recenti (>= v245) di systemd-network.

fuse=<boolean> (default = 0)

Consente l'utilizzo di file system fuse in un container. Si noti che le interazioni tra fuse e il cgroup freezer possono potenzialmente causare deadlock di I/O.

keyctl=<boolean> (default = 0)

Solo per container non privilegiati: consente l'uso della system call keyctl(). Questo è necessario per utilizzare docker all'interno di un container. Per impostazione predefinita, i container non privilegiati considereranno questa system call come inesistente. Si tratta principalmente di una soluzione alternativa per systemd-networkd, poiché tratterà come errore fatale il caso in cui alcune operazioni keyctl() vengano negate dal kernel per mancanza di permessi. In sostanza, è possibile scegliere tra l'esecuzione di systemd-networkd o di docker.

mknod=<boolean> (default = 0)

Consente ai container non privilegiati di utilizzare mknod() per aggiungere determinati nodi di dispositivo. Richiede un kernel con supporto seccomp trap verso lo spazio utente (5.3 o successivo). Funzionalità sperimentale.

mount=<fstype;fstype;...>

Consente di montare file system di tipi specifici. Deve essere un elenco di tipi di file system come utilizzati con il comando mount. Si noti che questo può avere effetti negativi sulla sicurezza del container. Con l'accesso a un loop device, montare un file può eludere il permesso mknod del cgroup dei dispositivi; montare un file system NFS può bloccare completamente l'I/O dell'host e impedirne il riavvio, ecc.

nesting=<boolean> (default = 0)

Consente il nesting. Si consiglia di utilizzarlo con container non privilegiati con mapping ID aggiuntivo. Si noti che questo esporrà al guest i contenuti di procfs e sysfs dell'host. È inoltre richiesto da systemd per isolare i servizi.

hookscript: <string>

Script che verrà eseguito durante varie fasi del ciclo di vita del container.

hostname: <string>

Impostare un nome host per il container.

lock: <backup | create | destroyed | disk | fstrim | migrate | mounted | rollback | snapshot | snapshot-delete>

Bloccare/sbloccare il container.

memory: <integer> (16 - N) (predefinito = 512)

Quantità di RAM per il container in MB.

mp[n]: [volume=]<volume> ,mp=<Path> [,acl=<1|0>] [,backup=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,keepattrs=<1|0>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come punto di mount del container. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume.

acl=<boolean>

Abilitare o disabilitare esplicitamente il supporto ACL.

backup=<boolean>

Indica se includere il punto di mount nei backup (utilizzato solo per i punti di mount su volume).

idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>

Personalizzare le mappature UID/GID che sovrascrivono lxc.idmap del container per questo punto di mount. Accetta un elenco separato da punto e virgola di voci type:container:disk:range-size.

type è u per UID o g per GID.

container è il primo ID come visto all'interno del container.

disk è il primo ID corrispondente sul filesystem sottostante.

range-size è il numero di ID consecutivi da mappare.

Per gli ID non mappati viene utilizzato come fallback lxc.idmap del container.

Esempio 1: u:123:456:1 mappa l'UID 123 nel container all'UID 456 sul disco. I file posseduti dall'UID 456 sul disco appariranno come UID 123 all'interno del container.

Esempio 2: g:100:50:5 mappa 5 GID consecutivi, in modo che i GID 100-104 nel container siano mappati ai GID 50-54 sul disco.

Esempio 3: passthrough mappa in modo identico tutti gli UID e GID, il che significa che gli ID all'interno del container corrisponderanno agli ID sul disco.

keepattrs=<boolean> (default = 0)

Ereditare UID, GID e modalità di accesso dalla directory del punto di mount, se esiste già.

mountoptions=<opt[;opt...]>

Opzioni di mount aggiuntive per rootfs/mps.

mp=<Path>

Percorso del punto di mount come visto dall'interno del container.

Note Per motivi di sicurezza non deve contenere alcun symlink.
quota=<boolean>

Abilitare le quote utente all'interno del container (non supportate con i sottovolumi zfs)

replicate=<boolean> (default = 1)

Include questo volume in un job di replica dello storage.

ro=<boolean>

Punto di mount in sola lettura

shared=<boolean> (default = 0)

Contrassegnare questo punto di mount non associato a un volume come disponibile su tutti i nodi.

Warning Questa opzione non condivide automaticamente il punto di mount, presuppone che sia già condiviso!
size=<DiskSize>

Dimensione del volume (valore di sola lettura).

volume=<volume>

Volume, dispositivo o directory da montare nel container.

nameserver: <string>

Imposta l'indirizzo IP del server DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non viene impostato né searchdomain né nameserver.

net[n]: name=<string> [,bridge=<bridge>] [,firewall=<1|0>] [,gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,host-managed=<1|0>] [,hwaddr=<XX:XX:XX:XX:XX:XX>] [,ip=<(IPv4/CIDR|dhcp|manual)>] [,ip6=<(IPv6/CIDR|auto|dhcp|manual)>] [,link_down=<1|0>] [,mtu=<integer>] [,rate=<mbps>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,type=<veth>]

Specifica le interfacce di rete per il container.

bridge=<bridge>

Bridge a cui collegare il dispositivo di rete.

firewall=<boolean>

Controlla se devono essere utilizzate le regole firewall di questa interfaccia.

gw=<GatewayIPv4>

Gateway predefinito per il traffico IPv4.

gw6=<GatewayIPv6>

Gateway predefinito per il traffico IPv6.

host-managed=<boolean>

Indica se la configurazione IP di questa interfaccia deve essere gestita dall'host. Quando questa opzione è abilitata, l'host (anziché il container) è responsabile della configurazione IP dell'interfaccia. Il container non dovrebbe eseguire un proprio client DHCP o gestore di rete su questa interfaccia. Ciò è utile per i container privi di uno stack interno di gestione della rete, come molti container applicativi.

hwaddr=<XX:XX:XX:XX:XX:XX>

Un indirizzo MAC comune con il bit I/G (Individual/Group) non impostato.

ip=<(IPv4/CIDR|dhcp|manual)>

Indirizzo IPv4 in formato CIDR.

ip6=<(IPv6/CIDR|auto|dhcp|manual)>

Indirizzo IPv6 in formato CIDR.

link_down=<boolean>

Indica se questa interfaccia deve essere disconnessa (come staccare la spina).

mtu=<integer> (64 - 65535)

Unità massima di trasmissione dell'interfaccia. (lxc.network.mtu)

name=<string>

Nome del dispositivo di rete visto dall'interno del container. (lxc.network.name)

rate=<mbps>

Applicare una limitazione di velocità all'interfaccia

tag=<integer> (1 - 4094)

Tag VLAN per questa interfaccia.

trunks=<vlanid[;vlanid...]>

ID VLAN da far transitare attraverso l'interfaccia

type=<veth>

Tipo di interfaccia di rete.

onboot: <boolean> (default = 0)

Specifica se un container deve essere avviato durante il boot del sistema.

ostype: <alpine | archlinux | centos | debian | devuan | fedora | gentoo | nixos | opensuse | ubuntu | unmanaged>

Tipo di OS. Viene utilizzato per configurare il container e corrisponde agli script di configurazione lxc in /usr/share/lxc/config/<ostype>.common.conf. Il valore unmanaged può essere utilizzato per saltare la configurazione specifica del sistema operativo.

protection: <boolean> (default = 0)

Imposta il flag di protezione del container. Questo impedisce le operazioni di rimozione/aggiornamento del CT o del disco del CT.

rootfs: [volume=]<volume> [,acl=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come root del container.

acl=<boolean>

Abilitare o disabilitare esplicitamente il supporto ACL.

idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>

Personalizzare le mappature UID/GID che sovrascrivono lxc.idmap del container per questo punto di mount. Accetta un elenco separato da punto e virgola di voci type:container:disk:range-size.

type è u per UID o g per GID.

container è il primo ID così come appare all'interno del container.

disk è il primo ID corrispondente sul filesystem sottostante.

range-size è il numero di ID consecutivi da mappare.

Per gli ID non mappati viene utilizzata la configurazione lxc.idmap del container.

Esempio 1: u:123:456:1 mappa l'UID 123 nel container all'UID 456 sul disco. I file posseduti dall'UID 456 sul disco appariranno come UID 123 all'interno del container.

Esempio 2: g:100:50:5 mappa 5 GID consecutivi, in modo che i GID 100-104 nel container siano mappati ai GID 50-54 sul disco.

Esempio 3: passthrough mappa in modo identico tutti gli UID e GID, il che significa che gli ID all'interno del container corrisponderanno agli ID sul disco.

mountoptions=<opt[;opt...]>

Opzioni di mount aggiuntive per rootfs/mps.

quota=<boolean>

Abilitare le quote utente all'interno del container (funzionalità non supportata con i subvolumi zfs)

replicate=<boolean> (default = 1)

Include questo volume in un job di replica dello storage.

ro=<boolean>

Punto di mount in sola lettura

shared=<boolean> (default = 0)

Contrassegnare questo punto di mount non associato a un volume come disponibile su tutti i nodi.

Warning Questa opzione non condivide automaticamente il punto di mount, presuppone che sia già condiviso!
size=<DiskSize>

Dimensione del volume (valore di sola lettura).

volume=<volume>

Volume, dispositivo o directory da montare nel container.

searchdomain: <string>

Imposta i domini di ricerca DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non viene impostato né searchdomain né nameserver.

startup: `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

swap: <integer> (0 - N) (default = 512)

Quantità di SWAP per il container in MB.

tags: <string>

Tag del container. Si tratta solo di metadati.

template: <boolean> (default = 0)

Abilitare/disabilitare il template.

timezone: <string>

Fuso orario da utilizzare nel container. Se l'opzione non è impostata, non verrà eseguita alcuna azione. Può essere impostato su host per corrispondere al fuso orario dell'host, oppure a un'opzione di fuso orario arbitraria da /usr/share/zoneinfo/zone.tab

tty: <integer> (0 - 6) (default = 2)

Specificare il numero di tty disponibili per il container

unprivileged: <boolean> (default = 0)

Fa eseguire il container come utente non privilegiato. Per la creazione, il valore predefinito è 1. Per il ripristino, il valore predefinito è quello proveniente dal backup. (Non dovrebbe essere modificato manualmente.)

unused[n]: [volume=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

volume=<volume>

Il volume che attualmente non è utilizzato.

11.12. Blocchi

Le migrazioni di container, gli snapshot e i backup (vzdump) impostano un blocco per prevenire azioni concorrenti incompatibili sul container interessato. A volte è necessario rimuovere manualmente tale blocco (ad esempio, dopo un'interruzione di corrente).

# pct unlock <CTID>
Caution Procedere in questo modo solo se si è certi che l'azione che ha impostato il blocco non sia più in esecuzione.

12. Rete definita dal software

La funzionalità Software-Defined Network (SDN) in Proxmox VE consente la creazione di zone virtuali e reti (VNet). Questa funzionalità semplifica le configurazioni di rete avanzate e la configurazione multi-tenant.

12.1. Introduzione

La SDN di Proxmox VE consente la separazione e il controllo granulare delle reti dei guest virtuali, utilizzando configurazioni flessibili controllate dal software.

La separazione è gestita tramite zone, reti virtuali (VNet) e subnet. Una zona è un'area di rete a sé stante, separata virtualmente. Una VNet è una rete virtuale che appartiene a una zona. Una subnet è un intervallo IP all'interno di una VNet.

In base al tipo di zona, la rete si comporta in modo diverso e offre funzionalità, vantaggi e limitazioni specifici.

I casi d'uso per SDN vanno da una rete privata isolata su ciascun singolo nodo a complesse reti overlay su più cluster PVE in sedi diverse.

Dopo aver configurato una VNet nell'interfaccia di amministrazione SDN del datacenter a livello di cluster, questa è disponibile come comune bridge Linux, localmente su ciascun nodo, per essere assegnata a VM e container.

12.2. Stato del supporto

12.2.1. Storia

Lo stack SDN di Proxmox VE è disponibile come funzionalità sperimentale dal 2019 ed è stato continuamente migliorato e testato da numerosi sviluppatori e utenti. Con la sua integrazione nell'interfaccia web in Proxmox VE 6.2, è stata raggiunta una pietra miliare significativa verso un'integrazione più ampia. Durante il ciclo di rilascio di Proxmox VE 7, sono state aggiunte numerose migliorie e funzionalità. In base ai feedback degli utenti, è emerso che le scelte di progettazione fondamentali e la loro implementazione erano piuttosto solide e stabili. Di conseguenza, definirlo "sperimentale" non rendeva giustizia allo stato dello stack SDN. Per Proxmox VE 8, è stata presa la decisione di gettare le basi per la piena integrazione della funzionalità SDN, elevando la gestione di reti e interfacce a componente centrale nello stack di controllo degli accessi di Proxmox VE. In Proxmox VE 8.1 sono stati raggiunti due traguardi importanti: in primo luogo, è stata aggiunta l'integrazione DHCP alla funzionalità di gestione degli indirizzi IP (IPAM), e in secondo luogo, l'integrazione SDN viene ora installata per impostazione predefinita.

12.2.2. Stato attuale

Lo stato di supporto attuale per i vari livelli della nostra installazione SDN è il seguente:

  • Il nucleo SDN, che include la gestione delle VNet e la sua integrazione con lo stack di Proxmox VE, è completamente supportato.

  • IPAM, inclusa la gestione DHCP per i guest virtuali, è in anteprima tecnica.

  • Il routing complesso tramite FRRouting e l'integrazione dei controller sono in anteprima tecnica.

12.3. Installazione

12.3.1. Nucleo SDN

A partire da Proxmox VE 8.1, i pacchetti principali della rete definita dal software (SDN) vengono installati per impostazione predefinita.

In caso di aggiornamento da una versione precedente, è necessario installare il pacchetto libpve-network-perl su ogni nodo:

apt update
apt install libpve-network-perl
Note Le versioni di Proxmox VE dalla 7.0 in poi includono il pacchetto ifupdown2 installato per impostazione predefinita. Se il sistema è stato originariamente installato con una versione precedente, è necessario installare esplicitamente il pacchetto ifupdown2.

Dopo l'installazione, è necessario assicurarsi che la seguente riga sia presente alla fine del file di configurazione /etc/network/interfaces su tutti i nodi, in modo che la configurazione SDN venga inclusa e attivata.

source /etc/network/interfaces.d/*

12.3.2. DHCP IPAM

L'integrazione DHCP nello stack integrato di gestione degli indirizzi IP di PVE utilizza attualmente dnsmasq per il rilascio dei lease DHCP. Al momento è opzionale (opt-in).

Per utilizzare questa funzionalità è necessario installare il package dnsmasq su ogni nodo:

apt update
apt install dnsmasq
# disable default instance
systemctl disable --now dnsmasq

12.3.3. FRRouting

Lo stack SDN di Proxmox VE utilizza il progetto FRRouting per configurazioni avanzate. Al momento è opzionale (opt-in).

Per utilizzare l'integrazione del routing SDN è necessario installare il package frr-pythontools su tutti i nodi:

apt update
apt install frr-pythontools

Quindi abilitare il servizio frr su tutti i nodi:

systemctl enable frr.service

12.4. Panoramica della configurazione

La configurazione viene eseguita nell'interfaccia web a livello di datacenter, suddivisa nelle sezioni seguenti:

  • SDN: qui è disponibile una panoramica dello stato SDN attualmente attivo ed è possibile applicare tutte le modifiche in sospeso all'intero cluster.

  • Zone: creazione e gestione delle zone di rete virtualmente separate

  • VNet: creazione di bridge di rete virtuali e gestione delle subnet

La categoria Opzioni consente di aggiungere e gestire servizi aggiuntivi da utilizzare nella configurazione SDN.

  • Controller: per il controllo del routing di livello 3 in configurazioni complesse

  • DHCP: definizione di un server DHCP per una zona che alloca automaticamente gli IP per i guest nell'IPAM e li assegna in lease ai guest tramite DHCP.

  • IPAM: abilita la gestione esterna degli indirizzi IP per i guest

  • DNS: definizione di un'integrazione con server DNS per la registrazione di hostname e indirizzi IP dei guest virtuali

12.5. Tecnologia e configurazione

L'implementazione della rete definita dal software (SDN) di Proxmox VE utilizza il più possibile le funzionalità di rete standard di Linux. Il motivo è che le moderne funzionalità di rete di Linux forniscono quasi tutto il necessario per un'implementazione SDN completa di funzionalità, evitando l'aggiunta di dipendenze esterne e riducendo il numero complessivo di componenti che possono guastarsi.

Le configurazioni SDN di Proxmox VE si trovano in /etc/pve/sdn, che è condiviso con tutti gli altri nodi del cluster tramite il file system di configurazione di Proxmox VE. Tali configurazioni vengono tradotte nei rispettivi formati di configurazione degli strumenti che gestiscono lo stack di rete sottostante (ad esempio ifupdown2 o frr).

Le nuove modifiche non vengono applicate immediatamente, ma registrate prima come in sospeso. È quindi possibile applicare un insieme di modifiche diverse tutte insieme nel pannello di panoramica SDN principale dell'interfaccia web. Questo sistema consente di distribuire varie modifiche come un'unica operazione atomica.

L'SDN tiene traccia dello stato distribuito tramite i file .running-config e .version situati in /etc/pve/sdn.

12.6. Zone

Una zona definisce una rete virtualmente separata. Le zone sono limitate a nodi specifici e dispongono di permessi assegnati, al fine di limitare gli utenti a una determinata zona e alle VNet contenute al suo interno.

Per la separazione possono essere utilizzate tecnologie diverse:

  • Simple: bridge isolato. Un semplice bridge di routing di livello 3 (NAT)

  • VLAN: le LAN virtuali sono il metodo classico per suddividere una LAN

  • QinQ: VLAN sovrapposte (formalmente conosciute come IEEE 802.1ad)

  • VXLAN: rete VXLAN di livello 2 tramite tunnel UDP

  • EVPN (BGP EVPN): VXLAN con BGP per stabilire il routing di livello 3

12.6.1. Opzioni comuni

Le opzioni seguenti sono disponibili per tutti i tipi di zona:

Nodi

I nodi su cui dovrebbero essere distribuite la zona e le VNet associate.

IPAM

Utilizzo di uno strumento di gestione degli indirizzi IP (IPAM) per gestire gli IP nella zona. Opzionale, il valore predefinito è pve.

DNS

Server API DNS. Opzionale.

ReverseDNS

Server API DNS inverso. Opzionale.

DNSZone

Nome di dominio DNS. Utilizzato per registrare gli hostname, come <hostname>.<domain>. La zona DNS deve già esistere sul server DNS. Opzionale.

12.6.2. Zone Simple

Questo è il plugin più semplice. Crea un bridge VNet isolato. Questo bridge non è collegato a un'interfaccia fisica e il traffico delle VM è solo locale su ciascun nodo. Può essere utilizzato in configurazioni NAT o instradate.

12.6.3. Zone VLAN

Il plugin VLAN utilizza un bridge Linux o OVS locale esistente per connettersi all'interfaccia fisica del nodo. Utilizza il VLAN tagging definito nella VNet per isolare i segmenti di rete. Ciò consente la connettività delle VM tra nodi diversi.

Opzioni di configurazione della zona VLAN:

Bridge

Il bridge locale o lo switch OVS, già configurato su ciascun nodo, che consente la connessione tra nodi.

12.6.4. Zone QinQ

QinQ, noto anche come VLAN stacking, utilizza più livelli di tag VLAN per l'isolamento. La zona QinQ definisce il tag VLAN esterno (il Service VLAN) mentre il tag VLAN interno è definito dalla VNet.

Note Per questa configurazione gli switch di rete fisici devono supportare le VLAN stacked.

Opzioni di configurazione della zona QinQ:

Bridge

Un bridge locale, VLAN-aware, già configurato su ciascun nodo locale

Service VLAN

Il tag VLAN principale di questa zona

Protocollo Service VLAN

Consente di scegliere tra i tipi di VLAN di servizio 802.1q (predefinito) e 802.1ad.

MTU

A causa del doppio stacking dei tag, sono necessari 4 byte aggiuntivi per le VLAN QinQ. Ad esempio, è necessario ridurre l'MTU a 1496 se l'MTU dell'interfaccia fisica è 1500.

12.6.5. Zone VXLAN

Il plugin VXLAN stabilisce un tunnel (overlay) sopra una rete esistente (underlay). Questo incapsula i frame Ethernet di livello 2 all'interno di datagram UDP di livello 4, utilizzando come porta di destinazione predefinita la 4789.

È necessario configurare autonomamente la rete underlay per abilitare la connettività UDP tra tutti i peer.

È possibile, ad esempio, creare una rete overlay VXLAN sopra l'internet pubblico, che appare alle VM come se condividessero la stessa rete locale di livello 2.

Warning VXLAN di per sé non fornisce alcuna crittografia. Quando si collegano più sedi tramite VXLAN, assicurarsi di stabilire una connessione sicura tra le sedi, ad esempio utilizzando una VPN site-to-site.

Opzioni di configurazione della zona VXLAN:

Elenco degli indirizzi dei peer

Un elenco di indirizzi IP di ciascun nodo nella zona VXLAN. Possono essere nodi esterni raggiungibili a questo indirizzo IP. Tutti i nodi del cluster devono essere indicati qui.

SDN Fabric

Invece di definire manualmente tutti i peer, utilizzare un Fabric per generare automaticamente l'elenco dei peer.

MTU

Poiché l'incapsulamento VXLAN utilizza 50 byte, l'MTU deve essere 50 byte inferiore rispetto a quello dell'interfaccia fisica in uscita.

12.6.6. Zone EVPN

La zona EVPN crea una rete instradabile di livello 3, in grado di estendersi su più cluster. Ciò si ottiene stabilendo una VPN e utilizzando BGP come protocollo di routing.

La VNet di EVPN può avere un indirizzo IP e/o MAC anycast. L'IP del bridge è lo stesso su ciascun nodo, il che significa che un guest virtuale può utilizzare questo indirizzo come gateway.

Il routing può funzionare tra VNet di zone diverse tramite un'interfaccia VRF (Virtual Routing and Forwarding).

Opzioni di configurazione della zona EVPN:

VRF VXLAN ID

Un VXLAN-ID utilizzato per l'interconnessione di routing dedicata tra VNet. Deve essere diverso dal VXLAN-ID delle VNet.

Controller primario

Il controller EVPN primario da utilizzare per questa zona. Il controller primario viene utilizzato per la derivazione automatica degli IP VTEP, in base alla definizione dei peer. Per maggiori informazioni, vedere la sezione sui controller.

Controller aggiuntivi

Controller EVPN aggiuntivi da utilizzare per questa zona. I controller elencati qui annunceranno le route L2VPN EVPN per questa zona.

Indirizzo MAC VNet

Indirizzo MAC anycast assegnato a tutte le VNet in questa zona. Verrà generato automaticamente se non definito.

Nodi di uscita

Nodi che devono essere configurati come gateway di uscita dalla rete EVPN, attraverso la rete reale. I nodi configurati annunceranno una route predefinita nella rete EVPN. Opzionale.

Nodo di uscita primario

Se si utilizzano più nodi di uscita, forzare il traffico attraverso questo nodo di uscita primario, invece di bilanciare il carico su tutti i nodi. Opzionale ma necessario se si desidera utilizzare SNAT o se il router upstream non supporta ECMP.

Instradamento locale dei nodi di uscita

Questa è un'opzione speciale da utilizzare se è necessario raggiungere un servizio di una VM/CT da un nodo di uscita. (Per impostazione predefinita, i nodi di uscita consentono solo l'inoltro del traffico tra la rete reale e la rete EVPN). Opzionale.

Annunciare sottoreti

Annunciare l'intera subnet nella rete EVPN. Da utilizzare se sono presenti VM/CT silenti (ad esempio, se si dispone di più IP e il gateway anycast non rileva traffico da questi IP, gli indirizzi IP non potranno essere raggiunti all'interno della rete EVPN). Opzionale.

Disabilitare la soppressione ARP ND

Non sopprime i pacchetti ARP o ND (Neighbor Discovery). Questo è necessario se si utilizzano IP mobili nelle VM (gli indirizzi IP e MAC vengono spostati tra i sistemi). Opzionale.

Importazione route-target

Consente di importare un elenco di route target EVPN esterni. Utilizzato per interconnessioni cross-DC o tra reti EVPN diverse. Opzionale.

MTU

Poiché l'incapsulamento VXLAN utilizza 50 byte, l'MTU deve essere inferiore di 50 byte rispetto all'MTU massimo dell'interfaccia fisica in uscita. Opzionale, il valore predefinito è 1450.

12.7. VNet

Dopo aver creato una rete virtuale (VNet) tramite la GUI SDN, un'interfaccia di rete locale con lo stesso nome è disponibile su ogni nodo. Per collegare un guest alla VNet, assegnare l'interfaccia al guest e impostare l'indirizzo IP di conseguenza.

In base alla zona, queste opzioni hanno significati diversi e sono spiegate nella rispettiva sezione della zona in questo documento.

Warning Nello stato attuale, alcune opzioni potrebbero non avere effetto o non funzionare in determinate zone.

Opzioni di configurazione VNet:

ID

Un ID di massimo 8 caratteri per identificare una VNet

Alias

Identificatore più descrittivo. Assegnato come alias sull'interfaccia. Opzionale

Zona

La zona associata a questa VNet

Tag

L'ID VLAN o VXLAN univoco

Supporto VLAN

Abilita l'opzione vlan-aware sull'interfaccia, consentendo la configurazione nel guest.

Isolare le porte

Imposta il flag isolato per tutte le porte guest di questa interfaccia, ma non per l'interfaccia stessa. Ciò significa che i guest possono inviare traffico solo alle porte bridge non isolate, ovvero il bridge stesso. Perché questa impostazione abbia effetto, è necessario riavviare il guest interessato.

Note L'isolamento delle porte è locale a ogni host. Utilizzare il firewall VNET per isolare ulteriormente il traffico nella VNET tra i nodi. Ad esempio, DROP per impostazione predefinita e consentire solo il traffico dalla subnet IP al gateway e viceversa.

12.8. Subnet

Una subnet definisce un intervallo IP specifico, descritto dall'indirizzo di rete CIDR. Ogni VNet può avere una o più subnet.

Una subnet può essere utilizzata per:

  • Limitare gli indirizzi IP che è possibile definire su una specifica VNet

  • Assegnare route/gateway su una VNet in zone di livello 3

  • Abilitare SNAT su una VNet in zone di livello 3

  • Assegnare automaticamente IP ai guest virtuali (VM o CT) tramite plugin IPAM

  • Registrazione DNS tramite plugin DNS

Se un server IPAM è associato alla zona della subnet, il prefisso della subnet verrà registrato automaticamente nell'IPAM.

Opzioni di configurazione della subnet:

ID

Un indirizzo di rete CIDR, ad esempio 10.0.0.0/8

Gateway

L'indirizzo IP del gateway predefinito della rete. Nelle zone di livello 3 (plugin Simple/EVPN), verrà distribuito sulla VNet.

SNAT

Abilita il Source NAT, che consente alle VM all'interno di una VNet di connettersi alla rete esterna inoltrando i pacchetti all'interfaccia in uscita dei nodi. Nelle zone EVPN, l'inoltro viene eseguito sui nodi gateway EVPN. Opzionale.

Prefisso zona DNS

Aggiunge un prefisso alla registrazione del dominio, come <hostname>.prefix.<domain> Opzionale.

12.9. Controller

Alcune zone implementano un control plane e un data plane separati, che richiedono un controller esterno per gestire il control plane della VNet.

Attualmente, solo la zona EVPN richiede un controller esterno.

12.9.1. Controller EVPN

La zona EVPN richiede un controller esterno per gestire il control plane. Il plugin del controller EVPN configura il router Free Range Routing (frr).

Per abilitare il controller EVPN, è necessario abilitare FRR su ogni nodo; vedere installazione di FRRouting.

Opzioni di configurazione del controller EVPN:

ASN #

Un numero ASN BGP univoco. Si consiglia vivamente di utilizzare un numero ASN privato (64512 – 65534, 4200000000 – 4294967294), poiché altrimenti si potrebbe interrompere per errore il routing globale. Ogni controller EVPN configurato su un nodo deve avere lo stesso ASN configurato.

SDN Fabric

Un Fabric che contiene tutti i nodi facenti parte della zona EVPN. Verrà utilizzato come rete underlay.

Peer

Un elenco di IP di tutti i nodi che fanno parte della zona EVPN. (potrebbero essere anche nodi esterni o server route reflector)

Nodi

Un elenco di nodi su cui questo controller deve essere attivo. Può essere utilizzato per configurare sessioni di peering EVPN solo su nodi specifici.

Nome del gruppo di peer

I controller EVPN utilizzano per impostazione predefinita il nome del peer group VTEP. Quando si definiscono più controller EVPN, ogni controller aggiuntivo deve specificare un nome di peer group personalizzato da utilizzare nella configurazione di FRR.

Modalità BGP

Consente di configurare manualmente il tipo di sessione BGP. La modalità auto mantiene il comportamento precedente dello stack SDN: i controller EVPN erano iBGP, a meno che non fosse configurato un controller BGP. In tal caso, il controller EVPN riutilizzava la sessione BGP del controller BGP. Con questa opzione, il tipo di sessione BGP può essere sovrascritto manualmente, consentendo di configurare in modo esplicito il tipo di sessione BGP da stabilire con il controller EVPN.

ebgp-multihop

Aumentare il numero di hop per raggiungere i peer, nel caso in cui non siano collegati direttamente o utilizzino il loopback. (solo per la modalità BGP external).

ASN

Ogni router può appartenere a un solo sistema autonomo, pertanto tutte le sessioni iBGP su un determinato nodo (indipendentemente dalla famiglia di indirizzi) devono avere configurato lo stesso ASN. Qualsiasi configurazione che presenti due sessioni iBGP con ASN diversi viene rifiutata e genera un errore, poiché per definizione non è possibile avere due sessioni iBGP con ASN diversi sulla stessa istanza BGP, in quanto un'istanza può avere un solo ASN locale.

L'ASN locale dell'istanza FRR viene derivato automaticamente in base alle impostazioni nei controller SDN:

Se esiste solo un controller BGP o EVPN (ma non entrambi), viene utilizzato l'ASN rispettivo del controller.

Per motivi di retrocompatibilità, lo stack SDN verifica se sono presenti controller EVPN in modalità auto. Se esiste un controller BGP, l'ASN del controller BGP verrà utilizzato in ogni caso.

Altrimenti, se è configurato un controller EVPN, viene utilizzato l'ASN del controller EVPN, in caso contrario l'ASN del controller BGP.

Lo stack SDN utilizza la direttiva local-as insieme all'opzione no-prepend replace-as nella configurazione di FRR per gestire più numeri ASN nella configurazione. Questo si verifica quando i controller BGP ed EVPN hanno ASN diversi configurati e la modalità auto è disabilitata.

Generazione automatica dell'IP VTEP

Gli IP VTEP per i dispositivi VXLAN di una zona vengono derivati automaticamente in base al controller (primario) definito nella zona EVPN:

Se viene utilizzato un controller BGP o IS-IS con un'interfaccia loopback, l'IP dell'interfaccia loopback verrà utilizzato come IP VTEP.

Se l'elenco dei peer del controller contiene un IP configurato localmente sul nodo, questo IP verrà utilizzato come IP VTEP.

In caso contrario, il controller EVPN verificherà la rotta nella tabella di routing predefinita per il primo IP peer e utilizzerà l'indirizzo IP di origine specificato nella tabella di routing come IP VTEP. Ciò può causare problemi se la rotta viene annunciata dinamicamente, ad esempio tramite una fabric. In tal caso è necessario che la tabella di routing del kernel contenga la voce richiesta al momento dell'applicazione della configurazione per il controller EVPN.

12.9.2. Controller BGP

Il controller BGP non viene utilizzato direttamente da una zona. È possibile utilizzarlo per configurare FRR per gestire i peer BGP.

Per BGP-EVPN, può essere utilizzato per definire un ASN diverso per nodo, effettuando così EBGP. Può anche essere utilizzato per esportare rotte EVPN verso un peer BGP esterno.

Note Per impostazione predefinita, per una semplice EVPN full mesh, non è necessario definire un controller BGP.

Opzioni di configurazione del controller BGP:

Nodo

Il nodo di questo controller BGP

ASN #

Un numero ASN BGP univoco. È altamente consigliato utilizzare un numero ASN privato nell'intervallo (64512 - 65534) o (4200000000 - 4294967294), poiché altrimenti si potrebbe compromettere per errore il routing globale.

Peer

Un elenco di indirizzi IP dei peer con cui si desidera comunicare utilizzando la rete BGP sottostante.

EBGP

Se l'AS remoto del peer è diverso, questo abilita EBGP.

Interfaccia loopback

Utilizzare un'interfaccia loopback o dummy come origine della rete EVPN (per il multipath).

ebgp-multihop

Aumentare il numero di hop per raggiungere i peer, nel caso in cui non siano collegati direttamente o utilizzino il loopback.

bgp-multipath-as-path-relax

Consente l'ECMP se i peer hanno ASN diversi.

12.9.3. Controller ISIS

Il controller ISIS non viene utilizzato direttamente da una zona. È possibile utilizzarlo per configurare FRR per esportare rotte EVPN verso un dominio ISIS.

Opzioni di configurazione del controller ISIS:

Nodo

Il nodo di questo controller ISIS.

Dominio

Un dominio ISIS univoco.

Titolo dell'entità di rete

Un indirizzo di rete ISIS univoco che identifica questo nodo.

Interfacce

Un elenco di interfacce fisiche utilizzate da ISIS.

Loopback

Utilizzare un'interfaccia loopback o dummy come origine della rete EVPN (per il multipath).

12.10. Fabric

screenshot/gui-datacenter-fabrics-overview.png

Le fabric in Proxmox VE SDN forniscono il routing automatizzato tra i nodi di un cluster. Esse semplificano la configurazione delle reti underlay tra i nodi per formare le basi dei deployment SDN.

Esse configurano automaticamente i protocolli di routing sulle interfacce di rete fisiche per stabilire la connettività tra i nodi del cluster. Questo crea una fabric di rete resiliente e autoconfigurante che si adatta alle modifiche della topologia di rete. Queste fabric possono essere utilizzate come rete full-mesh per Ceph oppure nel controller EVPN e nella zona VXLAN.

12.10.1. Installazione

Vengono utilizzate le implementazioni FRR di OpenFabric e OSPF, quindi assicurarsi prima che i package frr e frr-pythontools siano installati:

apt update
apt install frr frr-pythontools

12.10.2. Permessi

Per visualizzare la configurazione di una fabric SDN gli utenti necessitano dei permessi SDN.Audit o SDN.Allocate. Per creare o modificare una configurazione di fabric, gli utenti necessitano dei permessi SDN.Allocate. Per visualizzare la configurazione di un nodo, gli utenti necessitano dei permessi Sys.Audit o Sys.Modify. Quando si aggiungono o aggiornano nodi all'interno di una fabric, è richiesto il permesso Sys.Modify aggiuntivo per il nodo specifico, poiché questa operazione comporta la scrittura nel file /etc/network/interfaces del nodo.

12.10.3. Configurazione

Per creare un Fabric, andare su Datacenter→SDN→Fabrics e fare clic su "Add Fabric". Dopo aver selezionato il protocollo preferito, il fabric viene creato. Con il pulsante "+" è possibile selezionare i nodi da aggiungere al fabric, ed è inoltre necessario selezionare le interfacce utilizzate per comunicare con gli altri nodi.

Prefisso di loopback

È possibile specificare un intervallo di rete CIDR (ad es. 192.0.2.0/24) come prefisso di loopback per il fabric. Se configurato, il sistema verificherà automaticamente che tutti i router-ID siano contenuti in questo prefisso. Ciò garantisce la coerenza dello schema di indirizzamento e contribuisce a prevenire conflitti o errori di indirizzamento.

Selezione del router-ID

Ogni nodo in un fabric necessita di un router-ID univoco, che è un indirizzo IPv4 in notazione decimale puntata (ad es. 192.0.2.1). In OpenFabric questo può anche essere un indirizzo IPv6 nella tipica rappresentazione esadecimale separata da due punti (ad es. 2001:db8::1428:57ab). Verrà automaticamente creata un'interfaccia dummy con il router-ID come indirizzo, che fungerà da interfaccia di loopback per il fabric (per impostazione predefinita è anche passiva).

RouteMaps

Per ogni fabric vengono create automaticamente un'access-list e una route-map. Queste configurano il router per riscrivere l'indirizzo di origine dei pacchetti in uscita. Quando si comunica con un altro nodo (ad esempio, eseguendo un ping verso di esso), questo garantisce che il traffico abbia origine dall'indirizzo IP dell'interfaccia dummy locale anziché dall'interfaccia fisica. Ciò garantisce un comportamento di routing coerente e una corretta selezione dell'indirizzo di origine in tutto il fabric.

Note su IPv6

Attualmente IPv6 è utilizzabile solo sui fabric OpenFabric. Questi fabric IPv6 necessitano che l'inoltro (forwarding) IPv6 globale sia abilitato su tutti i nodi contenuti nel fabric. Senza l'inoltro IPv6, i fabric non a mesh completa (non-full-mesh) non funzionano perché i nodi di transito non inoltrano i pacchetti ai nodi esterni. Attualmente non esiste un modo semplice per abilitare l'inoltro IPv6 per singola interfaccia come con IPv4, quindi deve essere abilitato globalmente. Questo può essere realizzato aggiungendo questa riga:

post-up sysctl -w net.ipv6.conf.all.forwarding=1

a un'interfaccia del fabric nel file /etc/network/interfaces. Questo abiliterà l'inoltro IPv6 globalmente non appena quell'interfaccia viene attivata. Da notare che ciò influisce sul modo in cui le interfacce gestiscono la configurazione automatica IPv6 (SLAAC), i Neighbour Advertisement, i Router Solicitation e i Router Advertisement. Maggiori dettagli qui: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt alla voce net.ipv6.conf.all.forwarding.

12.10.4. OpenFabric

OpenFabric è un protocollo di routing progettato specificamente per i fabric dei data center. Si basa su IS-IS ed è ottimizzato per la topologia spine-leaf comune nei data center.

screenshot/gui-datacenter-create-fabric-openfabric.png

Opzioni di configurazione:

Sul fabric
Nome

Questo è il nome del fabric OpenFabric e può essere lungo al massimo 8 caratteri.

Prefisso IPv4

Intervallo di rete CIDR IPv4 (ad es. 192.0.2.0/24) utilizzato per verificare che tutti i router-ID nel fabric siano contenuti in questo prefisso.

Prefisso IPv6

Intervallo di rete CIDR IPv6 (ad es. 2001:db8::/64) utilizzato per verificare che tutti i router-ID nel fabric siano contenuti in questo prefisso.

Warning Perché i fabric IPv6 funzionino, è necessario abilitare l'inoltro globale su tutti i nodi. Consultare Note su IPv6 per sapere come farlo e per ulteriori informazioni.
Intervallo Hello

Controlla la frequenza (in secondi) con cui vengono inviati i pacchetti hello per scoprire e mantenere le connessioni con i nodi vicini. Valori più bassi rilevano i guasti più rapidamente ma aumentano il traffico di rete. Questa opzione è globale sul fabric, il che significa che ogni interfaccia di ogni nodo in questo fabric erediterà questa proprietà hello-interval. Il valore predefinito è 3 secondi.

Intervallo CSNP

Imposta la frequenza (in secondi) con cui il nodo sincronizza il proprio database di routing con i nodi vicini. Valori più bassi mantengono le informazioni sulla topologia di rete sincronizzate più rapidamente, ma aumentano il traffico di rete. Questa opzione è globale sul fabric, il che significa che ogni interfaccia di ogni nodo in questo fabric erediterà questa proprietà. Il valore predefinito è 10 secondi.

Sul nodo
screenshot/gui-datacenter-create-node-openfabric.png

Opzioni disponibili su ogni nodo che fa parte di un fabric:

Nodo

Selezionare il nodo che verrà aggiunto al fabric. Vengono mostrati solo i nodi che attualmente fanno parte del cluster.

IPv4

Un indirizzo IPv4 univoco utilizzato per generare il Network Entity Title (NET) di OpenFabric. Ogni nodo nello stesso fabric deve avere un Router-ID diverso, mentre un singolo nodo deve utilizzare lo stesso indirizzo NET in tutti i fabric (se non specificato, Proxmox VE ne selezionerà automaticamente uno garantendo che la configurazione sia valida).

IPv6

Un indirizzo IPv6 univoco utilizzato per generare il Network Entity Title (NET) di OpenFabric. Ogni nodo nello stesso fabric deve avere un Router-ID diverso, mentre un singolo nodo deve utilizzare lo stesso indirizzo NET su tutti i fabric. Se sono configurati sia un indirizzo IPv4 che IPv6, verrà utilizzato quello IPv4 per derivare il NET.

Warning Quando si utilizzano indirizzi IPv6, gli ultimi 3 segmenti vengono utilizzati per generare il NET. Assicurarsi che questi segmenti siano diversi tra i nodi.
Interfacce

Specificare le interfacce utilizzate per stabilire connessioni di peering con altri nodi OpenFabric. Preferibilmente selezionare interfacce senza indirizzi IP pre-assegnati, quindi configurare gli indirizzi nella colonna IPv4/IPv6 se necessario. Un'interfaccia "loopback" fittizia con il router-id viene creata automaticamente.

Sull'interfaccia

I seguenti parametri opzionali possono essere configurati per interfaccia quando si attivano le colonne aggiuntive:

IP

Un IPv4 che deve essere configurato automaticamente su questa interfaccia. Deve includere la netmask (ad es. /31)

IPv6

Un IPv6 che deve essere configurato automaticamente su questa interfaccia. Deve includere la netmask (ad es. /127).

Moltiplicatore Hello

Definisce quanti pacchetti hello non ricevuti determinano che una connessione venga considerata interrotta. Valori più alti rendono la connessione più resiliente alla perdita di pacchetti ma rallentano il rilevamento dei guasti. Il valore predefinito è 10.

Warning Quando si rimuove un'interfaccia con una voce in /etc/network/interfaces che ha impostato manual, l'IP non verrà rimosso durante l'applicazione della configurazione SDN.

12.10.5. OSPF

OSPF (Open Shortest Path First) è un protocollo di routing link-state ampiamente utilizzato che calcola in modo efficiente il percorso più breve per instradare il traffico attraverso le reti IP.

screenshot/gui-datacenter-create-fabric-ospf.png

Opzioni di configurazione:

Sul fabric
Prefisso IPv4

Intervallo di rete CIDR IPv4 (ad es. 192.0.2.0/24) utilizzato per verificare che tutti i router-ID nel fabric siano contenuti in questo prefisso.

Area

Specifica l'identificatore dell'area OSPF, che può essere un intero con segno a 32 bit o un indirizzo IP. Le aree sono un modo per organizzare e strutturare le reti OSPF in modo gerarchico, con l'Area 0 (o 0.0.0.0) che funge da area backbone.

Ridistribuire

Elenco opzionale di protocolli di origine le cui route vengono importate in OSPF. Ogni voce seleziona un'origine (bgp, connected, kernel o static) e può inoltre fare riferimento a una route map per filtrare o trasformare le route prima che vengano annunciate. Utile ad esempio per far transitare le route BGP del fabric in OSPF, o per annunciare reti connesse localmente senza configurarle per ogni interfaccia.

Sul nodo
screenshot/gui-datacenter-create-node-ospf.png

Opzioni disponibili su ogni nodo che fa parte di un fabric:

Nodo

Selezionare il nodo che verrà aggiunto al fabric. Verranno mostrati solo i nodi attualmente presenti nel cluster.

IPv4

Un Router-ID univoco utilizzato per identificare questo router all'interno della rete OSPF. Ogni nodo nello stesso fabric deve avere un Router-ID diverso.

Interfacce

Specificare le interfacce utilizzate per stabilire connessioni di peering con altri nodi OSPF. Preferibilmente selezionare interfacce senza indirizzi IP pre-assegnati, quindi configurare gli indirizzi nella colonna IPv4 se necessario. Un'interfaccia "loopback" fittizia con il router-id viene creata automaticamente.

Sull'interfaccia

Il seguente parametro opzionale può essere configurato per interfaccia:

IP

Un IPv4 che deve essere configurato automaticamente su questa interfaccia. Deve includere la netmask (ad es. /31)

Warning Quando si rimuove un'interfaccia con una voce in /etc/network/interfaces che ha impostato manual, l'IP non verrà rimosso durante l'applicazione della configurazione SDN.
Note L'interfaccia fittizia verrà configurata automaticamente come passive. Ogni interfaccia che non ha un indirizzo IP configurato verrà trattata come un collegamento point-to-point.

12.10.6. WireGuard

WireGuard può essere utilizzato per stabilire una VPN tra nodi Proxmox VE e/o nodi esterni. Non fornisce di per sé il routing dinamico, ma può essere utilizzato insieme a protocolli di routing dinamico che operano a livello 3 e superiori (OSPF, BGP) per fornire un trasporto crittografato con routing dinamico, ad esempio per veicolare traffico EVPN o VXLAN.

Note Per utilizzare WireGuard, è necessario installare il package wireguard-tools.

Opzioni di configurazione:

Sul fabric
Nome

Questo è il nome del fabric WireGuard e può essere lungo al massimo 8 caratteri.

Keepalive persistente

Se impostato, WireGuard invia un pacchetto autenticato vuoto ogni N secondi a ciascun peer configurato. Ciò può essere utile per mantenere attive le connessioni quando si utilizzano firewall stateful o NAT.

Sul nodo

Esistono due tipi di nodi: interni ed esterni. I nodi interni sono nodi Proxmox VE, i nodi esterni sono tutto il resto. Sono essenzialmente definizioni di peer riutilizzabili che possono essere utilizzate in tutto il cluster.

Internal
Endpoint

Questo è l'IP o l'hostname che gli altri nodi Proxmox VE dovrebbero utilizzare per connettersi a questo nodo Proxmox VE (ad es. 192.0.2.1 / 2001:db8::1). Viene utilizzato insieme al Listen Port configurato sulle singole interfacce per costruire l'endpoint effettivo. Ad esempio, se un nodo ha l'IP 192.0.2.1 come Endpoint e un'interfaccia wg0 con Listen Port 51820 configurato, gli altri nodi utilizzeranno 192.0.2.1:51820 come endpoint per connettersi a questo nodo.

IP consentiti

Un elenco di CIDR separati da virgola (ad esempio 198.51.100.0/24, oppure 0.0.0.0/0 per instradare tutto il traffico IPv4 in tunnel). Quando questo nodo viene selezionato come peer su altri nodi, l'elenco viene utilizzato come impostazione AllowedIPs nella configurazione del peer WireGuard, ovvero sia come filtro sorgente per il traffico in entrata sia come destinazione di routing per il traffico in uscita verso questo nodo.

External
Nome

Il nome del nodo esterno.

Chiave pubblica

La chiave pubblica utilizzata dal nodo esterno.

Endpoint

L'IP o l'hostname insieme alla porta che gli altri nodi utilizzano per connettersi a questo peer esterno (ad es. 192.0.2.1:51820). Se un endpoint utilizza un indirizzo IPv6, l'indirizzo deve essere racchiuso tra parentesi quadre (ad es. [2001:db8::1]:51820).

IP consentiti

Un elenco di CIDR separati da virgola (ad esempio 198.51.100.0/24, oppure 0.0.0.0/0 per instradare tutto il traffico IPv4 in tunnel). Quando questo nodo viene selezionato come peer su altri nodi, l'elenco viene utilizzato come impostazione AllowedIPs nella configurazione del peer WireGuard, ovvero sia come filtro sorgente per il traffico in entrata sia come destinazione di routing per il traffico in uscita verso questo nodo.

Sull'interfaccia
Nome

Il nome dell'interfaccia di rete sull'host Linux. Da uno a otto caratteri che devono iniziare con un carattere alfanumerico; i caratteri rimanenti possono essere alfanumerici o trattini.

IP

L'indirizzo IPv4 in notazione CIDR da configurare su questa interfaccia (ad esempio 198.51.100.1/24).

IPv6

L'indirizzo IPv6 in notazione CIDR da configurare su questa interfaccia (ad esempio 2001:db8::1/64).

Porta di ascolto

La porta di ascolto per questa interfaccia.

Peer

Un elenco di peer da configurare per tale interfaccia. Tutti i nodi che fanno parte del fabric possono essere selezionati come peer: la definizione del peer verrà generata automaticamente a partire dalla configurazione presente nel nodo.

Quando si definisce un'interfaccia, Proxmox VE genera automaticamente una chiave privata per essa in /etc/pve/priv/wg-keys.cfg al momento del salvataggio dell'interfaccia, e memorizza la chiave pubblica corrispondente insieme all'interfaccia nella configurazione del fabric, in modo che possa essere mostrata nella Web UI durante la modifica del nodo. La rimozione di un'interfaccia da un nodo rimuove la chiave privata corrispondente da wg-keys.cfg nell'ambito della stessa chiamata API.

Il fabric genera automaticamente le route attraverso l'interfaccia WireGuard per gli IP consentiti di ciascun peer. Ad esempio, se l'interfaccia wg0 ha due peer con 198.51.100.0/24 e 203.0.113.0/24 come IP consentiti, vengono create le route per entrambe le subnet. Se il peer fa riferimento all'interfaccia di un nodo Proxmox VE, l'indirizzo IP configurato per tale interfaccia viene inoltre aggiunto come route host agli IP consentiti (ad esempio, un nodo peer configurato con 192.0.2.10/24 ottiene l'aggiunta di 192.0.2.10/32).

Sul peer
Ignora la generazione delle rotte

Il fabric genera automaticamente le route nella tabella di routing del kernel per tutti gli IP consentiti di un peer. Impostando questa opzione, non verrà inserita alcuna route nella tabella di routing del kernel.

12.11. Elenchi di prefissi e route map

Gli elenchi di prefissi e le route map consentono di controllare quali route vengono scambiate tra i nodi Proxmox VE e i rispettivi peer BGP, EVPN, OSPF o OpenFabric, e di modificare gli attributi di tali route in entrata o in uscita. I due elementi funzionano insieme: un elenco di prefissi classifica le route in base al loro prefisso CIDR di destinazione, mentre una route map concatena condizioni di corrispondenza e azioni in una policy ordinata.

Se si sono già utilizzati ip prefix-list e route-map su FRR, Cisco IOS o Juniper, le entità di Proxmox VE si comportano nello stesso modo. Il livello Proxmox VE gestisce la configurazione come entità a livello di cluster in /etc/pve/sdn/ e le traduce in sezioni prefix-list e route-map di FRR durante l'applicazione della configurazione SDN. La configurazione FRR risultante viene salvata in /etc/frr/frr.conf su ciascun nodo; eventuali aggiunte locali al nodo in /etc/frr/frr.conf.local vengono aggiunte in coda.

Come per il resto della configurazione SDN, le modifiche passano prima a uno stato pending e diventano attive solo dopo aver applicato le modifiche nel pannello principale SDN.

12.11.1. Elenchi di prefissi

Un elenco di prefissi è un elenco ordinato e denominato di voci, ciascuna delle quali corrisponde a un singolo CIDR di destinazione (o a un intervallo di lunghezze di prefisso all'interno di tale CIDR) e lo consente (permit) o lo nega (deny). FRR valuta le voci in ordine di numero di sequenza e si arresta alla prima corrispondenza; se nessuna voce corrisponde, l'elenco di prefissi nega implicitamente, come nel normale FRR.

Gli elenchi di prefissi vengono gestiti in Datacenter -> SDN -> Prefix Lists. Ogni elenco ha un nome e contiene una o più voci con le seguenti proprietà:

Numero di sequenza

Ordine in cui la voce viene valutata all'interno dell'elenco. Deve essere univoco per elenco e almeno 1. Se lasciato vuoto alla creazione, Proxmox VE assegna automaticamente il successivo numero di sequenza libero utilizzando la convenzione max + 5, lasciando spazio per inserimenti successivi.

Azione

permit o deny. È presente un deny implicito alla fine di ogni elenco.

Prefisso

Rete di destinazione in notazione CIDR, ad esempio 192.0.2.0/24 o 2001:db8::/32. Il prefisso 0.0.0.0/0 (e ::/0) è consentito e corrisponde alla route predefinita.

Prefisso >= (ge)

Lunghezza minima del prefisso, opzionale. Se impostata, la voce corrisponde a qualsiasi subnet di prefix la cui lunghezza sia almeno ge.

Prefisso ⇐ (le)

Lunghezza massima del prefisso, opzionale. Se impostata, la voce corrisponde a qualsiasi subnet di prefix la cui lunghezza sia al massimo le.

Senza le o ge una voce corrisponde esattamente al prefisso. Con entrambi impostati, corrisponde a qualsiasi subnet all'interno dell'intervallo di lunghezza indicato. Ad esempio 10.0.0.0/8 ge 16 le 24 corrisponde a ogni subnet da /16 a /24 all'interno di 10.0.0.0/8. Questa è la semantica standard FRR/Cisco. Ulteriore validazione applicata da Proxmox VE: ge non deve superare le, nessuno dei due può essere inferiore alla lunghezza stessa del prefisso, ed entrambi devono rimanere entro il limite della famiglia di indirizzi (/32 per IPv4, /128 per IPv6).

Note I nomi only_default, only_default_v6 e loopbacks_ips sono riservati. I controller BGP ed EVPN li generano automaticamente e non possono essere utilizzati come nomi di elenchi di prefissi definiti dall'utente.

12.11.2. Route map

Una route map è un elenco ordinato di voci che confrontano le route in entrata o in uscita con determinati criteri, modificano facoltativamente attributi come la metrica o la preferenza locale e applicano l'azione permit (inoltro della route, eventualmente modificata) oppure deny (scarto della route). FRR valuta le voci in ordine; la prima corrispondenza determina l'azione. Ogni route map ha implicitamente come ultima voce una voce deny per il resto vuota, che rifiuta tutte le route che non hanno trovato una corrispondenza esplicita con una voce.

Le route map vengono gestite in Datacenter -> SDN -> Route Maps. Ogni voce ha le seguenti proprietà:

Ordine

Ordine in cui la voce viene valutata, tra 0 e 65535. Obbligatorio e deve essere univoco all'interno di una route map. Lasciare degli spazi tra gli ordini, ad esempio assegnando alle voci 10, 20, 30, lascia spazio per inserimenti successivi senza dover rinumerare.

Azione

permit o deny. permit consente il passaggio della route (dopo eventuali azioni set); deny la scarta.

Corrispondenza

Una o più condizioni di corrispondenza. Le chiavi disponibili sono: route-type, vni, ip-address-prefix-list, ip6-address-prefix-list, ip-next-hop-prefix-list, ip6-next-hop-prefix-list, ip-next-hop-address, ip6-next-hop-address, metric, local-preference, peer, e tag. Le quattro chiavi *-prefix-list fanno riferimento a una prefix list tramite nome. tag corrisponde a un attributo route tag a 32 bit, lo stesso valore che l'azione set tag assegna; questo permette a una voce di contrassegnare le route con un tag e a una voce successiva (nella stessa mappa o in un'altra) di agire su di esse. Tutte le condizioni di corrispondenza di una voce devono essere vere perché questa venga applicata.

Impostare

Uno o più attributi da impostare quando la voce corrisponde. Le chiavi disponibili sono ip-next-hop, ip-next-hop-peer-address, ip-next-hop-unchanged, ip6-next-hop, ip6-next-hop-peer-address, ip6-next-hop-prefer-global, local-preference, tag, weight, metric, e src. Il valore metric supporta N, +N, -N (regolazione), rtt, +rtt, -rtt, igp, e aigp. Il valore tag accetta un numero intero o il valore letterale untagged.

Azione all'uscita

Controlla come continua la valutazione dopo una corrispondenza. Lasciare vuoto per il comportamento predefinito (termina alla corrispondenza). on-match-next procede con la voce immediatamente successiva. on-match-goto <order> salta alla prima voce il cui ordine è maggiore o uguale al valore indicato. continue <order> salta alla voce con esattamente quell'ordine. Tutte e tre corrispondono alle direttive FRR on-match / continue.

Chiamata

Facoltativamente, richiamare un'altra route map al termine dell'elaborazione di questa voce. Questo corrisponde alla direttiva FRR call.

Note Una route map referenziata da un controller non può essere eliminata mentre è ancora in uso. Eliminare prima il riferimento dal controller. I nomi MAP_VTEP_IN, MAP_VTEP_OUT, correct_src, e qualsiasi nome che inizia con pve_ sono riservati alle route map generate internamente.

12.11.3. Dove vengono utilizzate le prefix list e le route map

I controller BGP ed EVPN accettano entrambi una route map incoming e una outgoing. Le mappe incoming vengono eseguite sulle route ricevute da un peer prima di installarle; le mappe outgoing vengono eseguite sulle route prima di annunciarle. Entrambi i campi sono opzionali e vengono selezionati tra le route map configurate nella SDN.

I fabric OSPF e OpenFabric accettano un'opzione Route Filter che fa riferimento a una prefix list. Quando impostata, nella tabella di routing del kernel vengono installate solo le route le cui destinazioni sono consentite dalla prefix list. Senza un filtro esplicito, il fabric genera un filtro predefinito a partire dai CIDR IPv4 Prefix e IPv6 Prefix del fabric stesso (una access-list FRR che consente tali reti); configurare un filtro di route quando è necessaria una policy diversa, ad esempio per consentire una route predefinita appresa da un nodo di confine.

12.11.4. Esempi

Consentire solo la route predefinita IPv4, ad esempio come filtro di route su un nodo che dovrebbe apprendere solo una route predefinita upstream:

# /etc/pve/sdn/prefix-lists.cfg

prefix-list: default-only
 entries action=permit,prefix=0.0.0.0/0,seq=10

Consentire ogni subnet tra /16 e /24 all'interno di 10.0.0.0/8, e negare qualsiasi altra cosa all'interno del blocco 10.0.0.0/8:

prefix-list: internal-subnets
 entries action=permit,prefix=10.0.0.0/8,ge=16,le=24,seq=10
 entries action=deny,prefix=10.0.0.0/8,le=32,seq=20

Policy BGP in uscita che riduce local-preference a 50 sulle route corrispondenti alla lista di prefissi internal-subnets e altrimenti lascia le route inalterate. Ogni voce della route map costituisce una sezione a sé, con l'ordine codificato come suffisso nell'ID della sezione:

# /etc/pve/sdn/route-maps.cfg

route-map-entry: bgp-out_10
 action permit
 match key=ip-address-prefix-list,value=internal-subnets
 set key=local-preference,value=50

route-map-entry: bgp-out_20
 action permit

La voce finale permit senza condizioni di corrispondenza è il pattern FRR per "consentire tutto il resto"; senza di essa, il deny implicito alla fine della route map scarterebbe tutte le rotte che non soddisfano alcuna condizione di corrispondenza.

12.11.5. BGP

BGP (Border Gateway Protocol) può essere utilizzato come fabric eBGP unnumbered. Ogni nodo ha il proprio Autonomous System Number (ASN) ed effettua il peering con i propri vicini tramite interfacce fisiche senza richiedere indirizzi IP sui link del fabric.

Opzioni di configurazione:

Sul fabric
Prefisso IPv4

Intervallo di rete CIDR IPv4 (ad es. 192.0.2.0/24) utilizzato per verificare che tutti gli indirizzi IPv4 dei nodi (BGP router-ID) siano contenuti in questo prefisso.

Prefisso IPv6

Intervallo di rete CIDR IPv6 (ad es. 2001:db8::/64) utilizzato per verificare che tutti gli indirizzi IPv6 dei nodi nel fabric siano contenuti in questo prefisso.

BFD

Abilitare Bidirectional Forwarding Detection su tutte le sessioni di peering in questo fabric. BFD fornisce un rilevamento rapido dei guasti per i collegamenti tra i nodi.

Filtro delle rotte

Una prefix list applicata alla direzione inbound del peer-group del fabric. Se impostata, questa prefix list sostituisce il filtro implicito "deve essere all'interno del prefisso del fabric". Utile per ampliare l'intervallo accettato (ad es. accettare prefissi aggiuntivi non appartenenti al fabric ridistribuiti tramite il fabric) o per utilizzare una corrispondenza più espressiva. Fa riferimento a una prefix list definita in SDN.

Mappa di routing in ingresso

Una route map concatenata dal filtro inbound implicito del peer-group del fabric tramite l'azione call di FRR. Solo i prefissi che hanno già superato il controllo implicito del prefisso (o l'override del Route Filter) raggiungono questa route map. Utile per trasformare o restringere ulteriormente le route accettate (ad es. modificare la community o la local-preference), ma non può ampliare l'insieme accettato. Utilizzare Route Filter per sostituire il filtro implicito. Fa riferimento a una route map definita in SDN.

Mappa di instradamento in uscita

Una route map applicata alla direzione outbound del peer-group del fabric. Utilizzata per trasformare o filtrare ciò che viene annunciato ai vicini del fabric. Fa riferimento a una route map definita in SDN.

Ridistribuire

Quali route di altri protocolli il router BGP su ciascun nodo deve ridistribuire nel fabric. Le sorgenti supportate sono connected, kernel, static e ospf. È possibile associare una route map opzionale per sorgente per modellare le route ridistribuite prima che vengano annunciate.

Note Deve essere configurato almeno uno tra IPv4 Prefix e IPv6 Prefix.
Sul nodo

Opzioni disponibili su ogni nodo che fa parte di un fabric:

Nodo

Selezionare il nodo che verrà aggiunto al fabric. Verranno mostrati solo i nodi attualmente presenti nel cluster.

ASN

Autonomous System Number BGP per questo nodo. Si consiglia di utilizzare numeri ASN privati (64512-65534 per il formato a 16 bit, 4200000000-4294967294 per il formato a 32 bit).

IPv4

Un indirizzo IPv4 univoco per questo nodo, utilizzato anche come BGP router-id. Richiesto quando nel fabric è configurato un prefisso IPv4; ogni nodo nello stesso fabric deve avere un indirizzo diverso.

IPv6

Indirizzo IPv6 per questo nodo. Se è configurato solo un indirizzo IPv6 (senza un indirizzo IPv4), il BGP router-id viene derivato da esso tramite un hash FNV-1a.

Interfacce

Specificare le interfacce utilizzate per stabilire le connessioni di peering con altri nodi BGP. Queste interfacce utilizzano BGP unnumbered (non è necessaria l'assegnazione di un indirizzo IP). Quando è configurato un IP del nodo, viene creata automaticamente un'interfaccia "loopback" fittizia con quell'IP.

Note A differenza di OSPF e OpenFabric, le interfacce BGP unnumbered non necessitano di indirizzi IP. Il peering viene stabilito automaticamente utilizzando indirizzi IPv6 link-local.
Note In un fabric eBGP unnumbered, i nodi in peering diretto devono avere ASN diversi affinché le sessioni BGP possano stabilirsi.
Utilizzo di fabric BGP con EVPN

Durante la configurazione di un controller EVPN, è possibile selezionare un fabric BGP come underlay invece di specificare manualmente gli indirizzi dei peer. La configurazione predefinita esegue le sessioni overlay EVPN (VTEP) come iBGP, utilizzando l'ASN del controller EVPN per il processo router. L'ASN del fabric specifico per nodo viene applicato automaticamente tramite local-as sul neighbor group dell'underlay.

Ciò significa che l'ASN del controller EVPN e gli ASN del fabric specifici per nodo dovrebbero essere diversi. Ad esempio, con tre nodi che utilizzano gli ASN 65001, 65002 e 65003 per l'underlay, il controller EVPN potrebbe utilizzare l'ASN 65000 per l'overlay.

In alternativa, impostando la modalità BGP su "external" nel controller EVPN, le sessioni VTEP vengono eseguite come eBGP. L'ASN del fabric specifico per nodo viene quindi utilizzato anche come ASN locale per il peer-group VTEP, in modo che i VTEP effettuino il peering tra loro in modo naturale con ASN diversi senza richiedere un ASN overlay separato. L'ASN del controller EVPN viene comunque utilizzato per i valori route-target derivati automaticamente, per mantenerli coerenti in tutto il fabric.

Note L'utilizzo di un fabric BGP per un underlay EVPN richiede che ogni nodo disponga di un indirizzo IPv4, poiché EVPN lo utilizza come indirizzo VTEP.

12.12. IPAM

Gli strumenti IPAM (IP Address Management) gestiscono gli indirizzi IP dei client sulla rete. In Proxmox VE, SDN utilizza IPAM, ad esempio, per trovare indirizzi IP liberi per i nuovi guest.

Una singola istanza IPAM può essere associata a una o più zone.

12.12.1. Plugin PVE IPAM

L'IPAM predefinito integrato per il cluster Proxmox VE.

È possibile controllare lo stato attuale del plugin PVE IPAM tramite il pannello IPAM nella sezione SDN della configurazione del datacenter. Questa interfaccia può essere utilizzata per creare, aggiornare ed eliminare mappature IP. Ciò risulta particolarmente utile in abbinamento alla funzionalità DHCP.

Se si utilizza il DHCP, è possibile usare il pannello IPAM per creare o modificare i lease per VM specifiche, il che consente di cambiare gli IP allocati tramite DHCP. Quando si modifica l'IP di una VM che utilizza il DHCP, occorre assicurarsi di forzare il guest ad acquisire un nuovo lease DHCP. Questo può essere solitamente fatto ricaricando lo stack di rete del guest o riavviandolo.

12.12.2. Plugin NetBox IPAM

NetBox è uno strumento open source per la gestione degli indirizzi IP (IPAM) e dell'infrastruttura del datacenter (DCIM).

Per integrare NetBox con Proxmox VE SDN, creare un token API in NetBox come descritto qui: https://docs.netbox.dev/en/stable/integrations/rest-api/#tokens

Le proprietà di configurazione di NetBox sono:

URL

L'endpoint REST API di NetBox: http://yournetbox.domain.com/api

Token

Un token di accesso API

Fingerprint

Il fingerprint SHA-256 dell'API di NetBox. Può essere ottenuto con openssl x509 -in /etc/ssl/certs/netbox.crt -noout -fingerprint -sha256 quando si utilizza il certificato predefinito.

12.12.3. Plugin phpIPAM

In phpIPAM occorre creare un'"applicazione" e aggiungere un token API con privilegi di amministratore all'applicazione.

Le proprietà di configurazione di phpIPAM sono:

URL

L'endpoint REST API: http://phpipam.domain.com/api/<appname>/

Token

Un token di accesso API

Sezione

Un ID intero. Le sezioni sono un gruppo di subnet in phpIPAM. Le installazioni predefinite utilizzano sectionid=1 per i clienti.

12.13. DNS

Il plugin DNS in Proxmox VE SDN viene utilizzato per definire un server API DNS per la registrazione dell'hostname e dell'indirizzo IP. Una configurazione DNS è associata a una o più zone, per fornire la registrazione DNS per tutti gli IP delle subnet configurate per una zona.

12.13.1. Plugin PowerDNS

Occorre abilitare il server web e l'API nella configurazione di PowerDNS:

api=yes
api-key=arandomgeneratedstring
webserver=yes
webserver-port=8081

Le opzioni di configurazione di PowerDNS sono:

url

L'endpoint REST API: http://yourpowerdnserver.domain.com:8081/api/v1/servers/localhost

key

Una chiave di accesso API

ttl

Il TTL predefinito per i record

12.14. DHCP

Il plugin DHCP in Proxmox VE SDN può essere utilizzato per distribuire automaticamente un server DHCP per una zona. Fornisce il DHCP per tutte le subnet in una zona per cui è configurato un intervallo DHCP. Attualmente l'unico plugin di backend disponibile per il DHCP è il plugin dnsmasq.

Il plugin DHCP funziona allocando un IP nel plugin IPAM configurato nella zona quando viene aggiunta una nuova interfaccia di rete a una VM/CT. È possibile trovare maggiori informazioni su come configurare un IPAM nella relativa sezione della documentazione.

Quando la VM si avvia, viene creata nel plugin DHCP della zona una mappatura per l'indirizzo MAC e l'IP. Quando l'interfaccia di rete viene rimossa o la VM/CT viene eliminata, anche la voce nell'IPAM e nel server DHCP viene eliminata.

Note Alcune funzionalità (aggiunta/modifica/rimozione delle mappature IP) sono attualmente disponibili solo quando si utilizza il plugin PVE IPAM.

12.14.1. Configurazione

È possibile abilitare il DHCP automatico per una zona nella Web UI tramite il pannello Zone, abilitando il DHCP nelle opzioni avanzate di una zona.

Note Attualmente solo le zone semplici supportano il DHCP automatico

Dopo aver abilitato il DHCP automatico per una zona, è necessario configurare gli intervalli DHCP per le subnet della zona. Per fare ciò, andare al pannello Vnet e selezionare la subnet per cui si desidera configurare gli intervalli DHCP. Nella finestra di modifica è possibile configurare gli intervalli DHCP nella rispettiva scheda. In alternativa è possibile impostare gli intervalli DHCP per una subnet tramite il seguente comando CLI:

pvesh set /cluster/sdn/vnets/<vnet>/subnets/<subnet>
 -dhcp-range start-address=10.0.1.100,end-address=10.0.1.200
 -dhcp-range start-address=10.0.2.100,end-address=10.0.2.200

È inoltre necessario avere un gateway configurato per la subnet, altrimenti il DHCP automatico non funzionerà.

Il plugin DHCP assegnerà quindi gli IP nell'IPAM solo negli intervalli configurati.

Ricordarsi di seguire anche i passaggi di installazione per il plugin DHCP dnsmasq.

12.14.2. Plugin

Plugin Dnsmasq

Attualmente questo è l'unico plugin DHCP e pertanto è il plugin che viene utilizzato quando si abilita il DHCP per una zona.

Installation

Per l'installazione, vedere la sezione DHCP IPAM.

Configuration

Il plugin crea un nuovo servizio systemd per ogni zona in cui dnsmasq viene distribuito. Il nome del servizio è dnsmasq@<zone>. Il ciclo di vita di questo servizio è gestito dal plugin DHCP.

Il plugin genera automaticamente i seguenti file di configurazione nella cartella /etc/dnsmasq.d/<zone>:

00-default.conf

Contiene la configurazione globale predefinita per un'istanza dnsmasq.

10-<zone>-<subnet_cidr>.conf

Questo file configura opzioni specifiche per una subnet, come il server DNS che deve essere configurato tramite DHCP.

10-<zone>-<subnet_cidr>.ranges.conf

Questo file configura gli intervalli DHCP per l'istanza dnsmasq.

ethers

Questo file contiene le associazioni tra indirizzo MAC e IP provenienti dal plugin IPAM. Per sovrascrivere tali associazioni, utilizzare il rispettivo plugin IPAM invece di modificare questo file, poiché verrà sovrascritto dal plugin dnsmasq.

Non si devono modificare i file sopra indicati, poiché sono gestiti dal plugin DHCP. Per personalizzare la configurazione di dnsmasq è possibile creare file aggiuntivi (ad es. 90-custom.conf) nella cartella di configurazione: non verranno modificati dal plugin DHCP dnsmasq.

I file di configurazione vengono letti in ordine, quindi è possibile controllare l'ordine delle direttive di configurazione assegnando nomi appropriati ai file di configurazione personalizzati.

I lease DHCP vengono memorizzati nel file /var/lib/misc/dnsmasq.<zone>.leases.

Quando si utilizza il plugin PVE IPAM, è possibile aggiornare, creare ed eliminare i lease DHCP. Per maggiori informazioni consultare la documentazione del plugin PVE IPAM. La modifica dei lease DHCP non è attualmente supportata per gli altri plugin IPAM.

12.15. Integrazione con il firewall

SDN si integra con il firewall di Proxmox VE generando automaticamente IPSet che possono poi essere referenziati nei campi di origine/destinazione delle regole del firewall. Questo avviene automaticamente per i VNet e le voci IPAM.

12.15.1. VNet e subnet

Il firewall genera automaticamente i seguenti IPSet nell'ambito SDN per ogni VNet:

vnet-all

Contiene i CIDR di tutte le sottoreti in una VNet

vnet-gateway

Contiene gli IP dei gateway di tutte le sottoreti in una VNet

vnet-no-gateway

Contiene i CIDR di tutte le sottoreti in una VNet, escludendo i gateway

vnet-dhcp

Contiene tutti gli intervalli DHCP configurati nelle sottoreti di una VNet

Quando si effettuano modifiche alla configurazione, gli IPSet si aggiornano automaticamente, quindi non è necessario aggiornare le regole del firewall quando si modifica la configurazione delle subnet.

Esempio di zona semplice

Supponendo la configurazione seguente per una VNet e le sottoreti in essa contenute:

# /etc/pve/sdn/vnets.cfg

vnet: vnet0
        zone simple

# /etc/pve/sdn/subnets.cfg

subnet: simple-192.0.2.0-24
        vnet vnet0
        dhcp-range start-address=192.0.2.100,end-address=192.0.2.199
        gateway 192.0.2.1

subnet: simple-2001:db8::-64
        vnet vnet0
        dhcp-range start-address=2001:db8::1000,end-address=2001:db8::1999
        gateway 2001:db8::1

In questo esempio è stata configurata una subnet IPv4 nella VNet vnet0, con 192.0.2.0/24 come intervallo IP, 192.0.2.1 come gateway e l'intervallo DHCP è 192.0.2.100 - 192.0.2.199.

Inoltre è stata configurata una subnet IPv6 con 2001:db8::/64 come intervallo IP, 2001:db8::1 come gateway e un intervallo DHCP 2001:db8::1000 - 2001:db8::1999.

I rispettivi IPset generati automaticamente per vnet0 conterrebbero quindi i seguenti elementi:

vnet0-all
  • 192.0.2.0/24

  • 2001:db8::/64

vnet0-gateway
  • 192.0.2.1

  • 2001:db8::1

vnet0-no-gateway
  • 192.0.2.0/24

  • 2001:db8::/64

  • !192.0.2.1

  • !2001:db8::1

vnet0-dhcp
  • 192.0.2.100 - 192.0.2.199

  • 2001:db8::1000 - 2001:db8::1999

12.15.2. IPAM

Se viene utilizzato l'IPAM integrato di PVE, il firewall genera automaticamente un IPset per ogni guest che ha voci nell'IPAM. Il rispettivo IPset per un guest con ID 100 sarebbe guest-ipam-100. Contiene tutti gli indirizzi IP provenienti da tutte le voci IPAM. Quindi se il guest 100 è membro di più VNet, l'IPset conterrebbe gli IP provenienti da tutte le VNet.

Quando le voci vengono aggiunte / aggiornate / eliminate, i rispettivi IPSet vengono aggiornati di conseguenza.

Warning Quando si rimuovono tutte le voci di un guest e ci sono ancora regole firewall che fanno riferimento all'IPSet generato automaticamente, il firewall non riuscirà ad aggiornare il ruleset, poiché fa riferimento a un IPSet non esistente.

12.16. Esempi

Questa sezione presenta diversi esempi di configurazione pensati per i casi d'uso SDN più comuni. Lo scopo è offrire implementazioni concrete, fornendo dettagli aggiuntivi per facilitare la comprensione delle opzioni di configurazione disponibili.

12.16.1. Esempio di zona semplice

Le reti di zona semplice creano una rete isolata affinché i guest su un singolo host possano connettersi tra loro.

Tip la connessione tra i guest è possibile se tutti i guest risiedono sullo stesso host, ma i guest non sono raggiungibili da altri nodi.
  • Creare una zona semplice denominata simple.

  • Aggiungere una VNet denominata vnet1.

  • Creare una subnet con un gateway e l'opzione SNAT abilitata.

  • Questo crea un bridge di rete vnet1 sul nodo. Assegnare questo bridge ai guest che devono unirsi alla rete e configurare un indirizzo IP.

La configurazione dell'interfaccia di rete in due VM potrebbe essere la seguente, il che consente loro di comunicare tramite la rete 10.0.1.0/24.

allow-hotplug ens19
iface ens19 inet static
        address 10.0.1.14/24
allow-hotplug ens19
iface ens19 inet static
        address 10.0.1.15/24

12.16.2. Esempio di source NAT

Se si desidera consentire le connessioni in uscita per i guest nella zona di rete semplice, la zona semplice offre un'opzione Source NAT (SNAT).

Partendo dalla configurazione precedente, aggiungere una subnet alla VNet vnet1, impostare un IP gateway e abilitare l'opzione SNAT.

Subnet: 172.16.0.0/24
Gateway: 172.16.0.1
SNAT: checked

Nei guest configurare l'indirizzo IP statico all'interno dell'intervallo IP della subnet.

Il nodo stesso si unirà a questa rete con l'IP gateway 172.16.0.1 e funzionerà come gateway NAT per i guest all'interno dell'intervallo della subnet.

12.16.3. Esempio di configurazione VLAN

Quando le VM su nodi diversi devono comunicare tramite una rete isolata, la zona VLAN consente l'isolamento a livello di rete tramite tag VLAN.

Creare una zona VLAN denominata myvlanzone:

ID: myvlanzone
Bridge: vmbr0

Creare una VNet denominata myvnet1 con tag VLAN 10 e la zona myvlanzone creata in precedenza.

ID: myvnet1
Zone: myvlanzone
Tag: 10

Applicare la configurazione tramite il pannello SDN principale, per creare le VNet localmente su ogni nodo.

Creare una macchina virtuale basata su Debian (vm1) su node1, con una vNIC su myvnet1.

Utilizzare la seguente configurazione di rete per questa VM:

auto eth0
iface eth0 inet static
        address 10.0.3.100/24

Creare una seconda macchina virtuale (vm2) sul nodo node2, con una vNIC sulla stessa VNet myvnet1 di vm1.

Utilizzare la seguente configurazione di rete per questa VM:

auto eth0
iface eth0 inet static
        address 10.0.3.101/24

Fatto ciò, dovrebbe essere possibile eseguire il ping tra le due VM utilizzando quella rete.

12.16.4. Esempio di configurazione QinQ

Questo esempio configura due zone QinQ e aggiunge due VM a ciascuna zona per dimostrare il livello aggiuntivo di tag VLAN che consente la configurazione di un maggior numero di VLAN isolate.

Un caso d'uso tipico per questa configurazione è quello di un provider di hosting che fornisce una rete isolata ai clienti per la comunicazione tra VM, isolando al contempo le VM da quelle di altri clienti.

Creare una zona QinQ denominata qinqzone1 con service VLAN 20

ID: qinqzone1
Bridge: vmbr0
Service VLAN: 20

Creare un'altra zona QinQ denominata qinqzone2 con service VLAN 30

ID: qinqzone2
Bridge: vmbr0
Service VLAN: 30

Creare una VNet denominata myvnet1 con VLAN-ID 100 sulla zona qinqzone1 creata precedentemente.

ID: qinqvnet1
Zone: qinqzone1
Tag: 100

Creare un myvnet2 con VLAN-ID 100 sulla zona qinqzone2.

ID: qinqvnet2
Zone: qinqzone2
Tag: 100

Applicare la configurazione nel pannello principale dell'interfaccia web SDN per creare i VNet localmente su ciascun nodo.

Creare quattro macchine virtuali basate su Debian (vm1, vm2, vm3, vm4) e aggiungere interfacce di rete a vm1 e vm2 con bridge qinqvnet1 e a vm3 e vm4 con bridge qinqvnet2.

All'interno della VM, configurare gli indirizzi IP delle interfacce, ad esempio tramite /etc/network/interfaces:

auto eth0
iface eth0 inet static
        address 10.0.3.101/24

Configurare tutte le quattro VM affinché abbiano indirizzi IP compresi nell'intervallo da 10.0.3.101 a 10.0.3.104.

A questo punto dovrebbe essere possibile eseguire il ping tra le VM vm1 e vm2, così come tra vm3 e vm4. Tuttavia, né vm1 né vm2 possono eseguire il ping delle VM vm3 o vm4, poiché si trovano in una zona diversa con una service-VLAN diversa.

12.16.5. Esempio di configurazione VXLAN

L'esempio presuppone un cluster con tre nodi, con indirizzi IP dei nodi 192.168.0.1, 192.168.0.2 e 192.168.0.3.

Creare una zona VXLAN denominata myvxlanzone e aggiungere tutti gli IP dei nodi all'elenco degli indirizzi dei peer. Utilizzare l'MTU predefinito di 1450 oppure configurare di conseguenza.

ID: myvxlanzone
Peers Address List: 192.168.0.1,192.168.0.2,192.168.0.3

Creare una VNet denominata vxvnet1 utilizzando la zona VXLAN myvxlanzone creata precedentemente.

ID: vxvnet1
Zone: myvxlanzone
Tag: 100000

Applicare la configurazione nel pannello principale dell'interfaccia web SDN per creare le VNet localmente su ciascun nodo.

Creare una macchina virtuale basata su Debian (vm1) sul nodo node1, con una vNIC su vxvnet1.

Utilizzare la seguente configurazione di rete per questa VM (si noti l'MTU inferiore).

auto eth0
iface eth0 inet static
        address 10.0.3.100/24
        mtu 1450

Creare una seconda macchina virtuale (vm2) su node3, con una vNIC sulla stessa VNet vxvnet1 di vm1.

Utilizzare la seguente configurazione di rete per questa VM:

auto eth0
iface eth0 inet static
        address 10.0.3.101/24
        mtu 1450

A questo punto dovrebbe essere possibile eseguire il ping tra vm1 e vm2.

12.16.6. Esempio di configurazione EVPN

L'esempio presuppone un cluster con tre nodi (node1, node2, node3) con indirizzi IP 192.168.0.1, 192.168.0.2 e 192.168.0.3.

Creare un controller EVPN, utilizzando un numero ASN privato e i precedenti indirizzi dei nodi come peer.

ID: myevpnctl
ASN#: 65000
Peers: 192.168.0.1,192.168.0.2,192.168.0.3

Creare una zona EVPN denominata myevpnzone, assegnare il controller EVPN creato precedentemente e definire node1 e node2 come nodi di uscita.

ID: myevpnzone
VRF VXLAN Tag: 10000
Controller: myevpnctl
MTU: 1450
VNet MAC Address: 32:F4:05:FE:6C:0A
Exit Nodes: node1,node2

Creare la prima VNet denominata myvnet1 utilizzando la zona EVPN myevpnzone.

ID: myvnet1
Zone: myevpnzone
Tag: 11000

Creare una subnet su myvnet1:

Subnet: 10.0.1.0/24
Gateway: 10.0.1.1

Creare il secondo VNet denominato myvnet2 utilizzando la stessa zona EVPN myevpnzone.

ID: myvnet2
Zone: myevpnzone
Tag: 12000

Creare una subnet diversa su myvnet2`:

Subnet: 10.0.2.0/24
Gateway: 10.0.2.1

Applicare la configurazione dal pannello principale dell'interfaccia web SDN per creare le VNet localmente su ciascun nodo e generare la configurazione FRR.

Creare una macchina virtuale basata su Debian (vm1) su node1, con una vNIC su myvnet1.

Utilizzare la seguente configurazione di rete per vm1:

auto eth0
iface eth0 inet static
        address 10.0.1.100/24
        gateway 10.0.1.1
        mtu 1450

Creare una seconda macchina virtuale (vm2) su node2, con una vNIC sull'altra VNet myvnet2.

Utilizzare la seguente configurazione di rete per vm2:

auto eth0
iface eth0 inet static
        address 10.0.2.100/24
        gateway 10.0.2.1
        mtu 1450

A questo punto dovrebbe essere possibile eseguire il ping di vm2 da vm1, e di vm1 da vm2.

Se si esegue il ping di un IP esterno da vm2 sul nodo node3, che non funge da gateway, il pacchetto raggiungerà il gateway configurato per myvnet2, quindi verrà instradato verso i nodi di uscita (node1 o node2) e da lì uscirà da tali nodi attraverso il gateway predefinito configurato su node1 o node2.

Note È necessario aggiungere route inverse per le reti 10.0.1.0/24 e 10.0.2.0/24 verso node1 e node2 sul gateway esterno, in modo che la rete pubblica possa rispondere.

Se è stato configurato un router BGP esterno, le route BGP-EVPN (10.0.1.0/24 e 10.0.2.0/24 in questo esempio) verranno annunciate dinamicamente.

12.16.7. Esempio di configurazione di WireGuard

L'esempio presuppone un cluster Proxmox a 3 nodi (sdn1, sdn2 e sdn3) con gli indirizzi IP 192.0.2.1, 192.0.2.2 e 192.0.2.3, nonché un peer WireGuard esterno (sdn-router) con indirizzo IP 192.0.2.10.

In questo esempio i nodi Proxmox e il peer esterno verranno connessi in full-mesh tramite WireGuard nella subnet 198.51.100.0/24 e, inoltre, la subnet 203.0.113.0/24 verrà instradata tramite il peer WireGuard esterno, 198.51.100.10.

Configurazione del fabric WireGuard
screenshot/gui-datacenter-create-fabric-wireguard.png

Fare clic su Datacenter nell'albero delle risorse a sinistra, quindi accedere a SDN > Fabrics e creare un nuovo fabric WireGuard facendo clic su Create e selezionando WireGuard.

Scegliere un nome per il fabric; in questo caso è stato scelto example.

Configurazione delle interfacce WireGuard
screenshot/gui-datacenter-create-internal-node-wireguard.png

Ogni nodo partecipante richiede un'interfaccia WireGuard. È possibile configurarla aggiungendo un nuovo nodo di tipo Internal al fabric WireGuard, selezionando il nodo corrispondente e creando quindi una nuova interfaccia WireGuard.

Sul nodo stesso è possibile configurare due proprietà: Endpoint e Allowed IPs. Endpoint indica l'IP/hostname che verrà utilizzato per connettersi a questo nodo, 192.0.2.1 nel caso di sdn1. Poiché in questo esempio non deve essere instradata alcuna subnet aggiuntiva tramite questo nodo, lasciare vuoto il campo Allowed IPs.

Creare una nuova interfaccia WireGuard, wg0, e configurare l'indirizzo IP che deve essere impostato sull'interfaccia WireGuard, 198.51.100.1/24 nel caso di sdn1. La porta di ascolto predefinita è 51820, ma può essere modificata manualmente tramite il campo Listen Port. Per ogni nuova interfaccia WireGuard verrà creata automaticamente una coppia di chiavi pubblica/privata.

Configurazione del nodo esterno
screenshot/gui-datacenter-create-external-node-wireguard.png

Per aggiungere un nodo esterno, aggiungere un altro nodo al fabric WireGuard, ma selezionare il tipo External nella finestra di creazione del nodo. Inserire la chiave pubblica dell'interfaccia del nodo esterno, nonché l'IP/hostname + porta che possono essere utilizzati per raggiungere questo peer esterno (192.0.2.10:51820 in questo esempio). Aggiungere l'IP del nodo, 198.51.100.10/32, nonché la subnet 203.0.113.0/24 al campo allowed IPs.

Configurazione dei peering WireGuard
screenshot/gui-datacenter-select-peers-wireguard.png

Ora che tutte le interfacce e i peer esterni sono stati configurati, possono essere selezionati come peer nella configurazione dell'interfaccia WireGuard. Aggiungere i nodi sdn2 e sdn3, nonché sdn-router, ai peer dell'interfaccia wg0 sul nodo sdn1:

Questo genererà il seguente file wg0.conf in /etc/wireguard/proxmox:

root@sdn1:~# cat /etc/wireguard/proxmox/wg0.conf
[Interface]
PrivateKey = EpP9R0kqNA1UjGGeDL0/y9Ok66G44dqa2ALYJ0jTWwQ=
ListenPort = 51820

[Peer]
PublicKey = xIlHE6ZA25Qnpa+HYT1un3fbjO5/0A9YUbbRmTyLWW4=
AllowedIPs = 198.51.100.10/32, 203.0.113.0/24
Endpoint = 192.0.2.10:51820

[Peer]
PublicKey = CKClJbQ42U1pQM8MqMGCa1IpZbNcqb+OJBxVWJHIrx4=
AllowedIPs = 198.51.100.2/32
Endpoint = 192.0.2.2:51820

[Peer]
PublicKey = gCXBt+n2VNBR6RiUmUxG3+15G0qnXUzsSxEQvmwGMkw=
AllowedIPs = 198.51.100.3/32
Endpoint = 192.0.2.3:51820

È presente una sezione [Peer] per ciascun peer selezionato. L'IP configurato sulle interfacce WireGuard verrà aggiunto anche agli Allowed IPs di un peer.

Verifica della configurazione

Verificare la connettività con gli altri partecipanti al fabric WireGuard eseguendo un ping:

root@sdn1:~# ping -c1 198.51.100.2
PING 198.51.100.2 (198.51.100.2) 56(84) bytes of data.
64 bytes from 198.51.100.2: icmp_seq=1 ttl=64 time=2.08 ms

--- 198.51.100.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.083/2.083/2.083/0.000 ms


root@sdn1:~# ping -c1 198.51.100.3
PING 198.51.100.3 (198.51.100.3) 56(84) bytes of data.
64 bytes from 198.51.100.3: icmp_seq=1 ttl=64 time=2.26 ms

--- 198.51.100.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.255/2.255/2.255/0.000 ms


root@sdn1:~# ping -c1 198.51.100.10
PING 198.51.100.10 (198.51.100.10) 56(84) bytes of data.
64 bytes from 198.51.100.10: icmp_seq=1 ttl=64 time=1.29 ms

--- 198.51.100.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.286/1.286/1.286/0.000 ms

12.17. Note

12.17.1. Nodi di uscita EVPN multipli

In presenza di più nodi gateway, si consiglia di disabilitare l'opzione rp_filter (Strict Reverse Path Filter), poiché i pacchetti possono arrivare a un nodo ma uscire da un nodo diverso.

Creare un file drop-in sysctl /etc/sysctl.d/99-rp-filter.conf:

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

12.17.2. Crittografia IPSEC su VXLAN

Per aggiungere la crittografia IPSEC sopra una VXLAN, questo esempio mostra come utilizzare strongswan.

È necessario ridurre l'MTU di ulteriori 60 byte per IPv4 o 80 byte per IPv6 per gestire la crittografia.

Quindi, con un MTU reale predefinito di 1500, è necessario utilizzare un MTU di 1370 (1370 + 80 (IPSEC) + 50 (VXLAN) == 1500).

Installare strongswan sull'host.

apt install strongswan

Aggiungere la configurazione a /etc/ipsec.conf. È necessario crittografare solo il traffico dalla porta UDP VXLAN 4789.

conn %default
    ike=aes256-sha1-modp1024!  # the fastest, but reasonably secure cipher on modern HW
    esp=aes256-sha1!
    leftfirewall=yes           # this is necessary when using Proxmox VE firewall rules

conn output
    rightsubnet=%dynamic[udp/4789]
    right=%any
    type=transport
    authby=psk
    auto=route

conn input
    leftsubnet=%dynamic[udp/4789]
    type=transport
    authby=psk
    auto=route

Generare una chiave precondivisa con:

openssl rand -base64 128

e aggiungere la chiave a /etc/ipsec.secrets, in modo che il contenuto del file sia simile a:

: PSK <generatedbase64key>

Copiare la PSK e la configurazione su tutti i nodi partecipanti alla rete VXLAN.

13. Firewall di Proxmox VE

Il firewall di Proxmox VE fornisce un modo semplice per proteggere l'infrastruttura IT. È possibile configurare regole firewall per tutti gli host all'interno di un cluster, oppure definire regole per macchine virtuali e container. Funzionalità come le macro firewall, i gruppi di sicurezza, gli IP set e gli alias aiutano a semplificare questo compito.

Sebbene tutta la configurazione sia memorizzata nel file system del cluster, il servizio firewall basato su iptables viene eseguito su ciascun nodo del cluster, fornendo così un isolamento completo tra le macchine virtuali. La natura distribuita di questo sistema offre inoltre una larghezza di banda molto superiore rispetto a una soluzione firewall centralizzata.

Il firewall supporta completamente IPv4 e IPv6. Il supporto IPv6 è completamente trasparente ed entrambi i protocolli vengono filtrati per impostazione predefinita. Non è quindi necessario mantenere un insieme di regole diverso per IPv6.

13.1. Direzioni e zone

Il firewall di Proxmox VE raggruppa la rete in più zone logiche. È possibile definire regole per ciascuna zona in modo indipendente. In base alla zona, è possibile definire regole per il traffico in ingresso, in uscita o in forwarding.

13.1.1. Direzioni

Sono disponibili 3 direzioni tra cui scegliere quando si definiscono regole per una zona:

In

Traffico in arrivo in una zona.

Out

Traffico in uscita da una zona.

Forward

Traffico che transita attraverso una zona. Nella zona host questo può essere traffico instradato (quando l'host agisce come gateway o esegue il NAT). A livello di VNet, questo riguarda tutto il traffico che transita attraverso una VNet, incluso il traffico da/verso interfacce di rete in bridge.

Important La creazione di regole per il traffico in forwarding è attualmente possibile solo utilizzando il nuovo proxmox-firewall basato su nftables. Eventuali regole di forwarding verranno ignorate dal pve-firewall standard e non avranno alcun effetto!

13.1.2. Zone

Sono disponibili 3 zone diverse per cui è possibile definire regole firewall:

Host

Traffico in entrata o in uscita da un host, o traffico inoltrato da un host. È possibile definire regole per questa zona sia a livello di datacenter che a livello di host. Le regole a livello di host hanno la precedenza sulle regole a livello di datacenter.

VM

Traffico da/verso una VM o un CT. Non è possibile definire regole per il traffico inoltrato, ma solo per il traffico in ingresso/in uscita.

VNet

Traffico che transita attraverso una VNet SDN, sia da guest a guest che da host a guest e viceversa. Poiché questo traffico è sempre traffico in forwarding, è possibile creare solo regole con direzione forward.

Important La creazione di regole a livello di VNet è attualmente possibile solo utilizzando il nuovo proxmox-firewall basato su nftables. Eventuali regole a livello di VNet verranno ignorate dal pve-firewall standard e non avranno alcun effetto!

13.2. File di configurazione

Tutta la configurazione relativa al firewall è memorizzata nel file system del cluster proxmox. Questi file vengono quindi distribuiti automaticamente a tutti i nodi del cluster, e il servizio pve-firewall aggiorna automaticamente le regole iptables sottostanti in caso di modifiche.

È possibile configurare qualsiasi aspetto tramite l'interfaccia grafica (ossia Datacenter → Firewall, oppure su un Nodo → Firewall), oppure è possibile modificare i file di configurazione direttamente con l'editor preferito.

I file di configurazione del firewall contengono sezioni di coppie chiave-valore. Le righe che iniziano con # e le righe vuote sono considerate commenti. Le sezioni iniziano con una riga di intestazione contenente il nome della sezione racchiuso tra [ e ].

13.2.1. Configurazione a livello di cluster

La configurazione del firewall a livello di cluster è memorizzata in:

/etc/pve/firewall/cluster.fw

La configurazione può contenere le seguenti sezioni:

[OPTIONS]

Utilizzata per impostare le opzioni del firewall a livello di cluster.

ebtables: <boolean> (default = 1)

Abilitare le regole ebtables a livello di cluster.

enable: <integer> (0 - N) (default = 0)

Abilitare o disabilitare il firewall a livello di cluster.

log_ratelimit: [enable=]<1|0> [,burst=<integer>] [,rate=<rate>]

Impostazioni di limitazione della frequenza dei log.

burst=<integer> (0 - N) (default = 5)

Burst iniziale di pacchetti che verrà sempre registrato prima che il limite venga applicato

enable=<boolean> (default = 1)

Abilitare o disabilitare la limitazione della frequenza di log

rate=<rate> (default = 1/second)

Frequenza con cui il bucket di burst viene ricaricato

policy_forward: <ACCEPT | DROP>

Policy di forward.

policy_in: <ACCEPT | DROP | REJECT>

Policy di input.

policy_out: <ACCEPT | DROP | REJECT>

Policy di output.

[RULES]

Questa sezione contiene le regole del firewall a livello di cluster per tutti i nodi.

[IPSET <name>]

Definizioni di IP set a livello di cluster.

[GROUP <name>]

Definizioni di gruppi di sicurezza a livello di cluster.

[ALIASES]

Definizioni di alias a livello di cluster.

Abilitazione del firewall

Il firewall è completamente disabilitato per impostazione predefinita, quindi è necessario impostare qui l'opzione enable:

[OPTIONS]
# enable firewall (cluster-wide setting, default is disabled)
enable: 1
Important Se il firewall viene abilitato, il traffico verso tutti gli host sarà bloccato per impostazione predefinita, con alcune eccezioni per il traffico proveniente dalla rete locale verso la WebUI, SSH e altri servizi importanti. L'elenco completo delle regole predefinite del firewall è disponibile all'indirizzo xref:pve_firewall_default_rules.

Qualora siano in esecuzione altri servizi che comunicano tramite la rete, sarà necessario consentirli separatamente. Per alcuni servizi comuni sono disponibili delle macro.

Per amministrare gli host Proxmox VE da remoto, è necessario creare regole che consentano il traffico da tali IP remoti verso la GUI web (porta 8006). Si consiglia inoltre di consentire ssh (porta 22) ed eventualmente SPICE (porta 3128).

Tip Aprire una connessione SSH verso uno degli host Proxmox VE prima di abilitare il firewall. In questo modo è comunque possibile accedere all'host se qualcosa va storto.

Per semplificare questa operazione, è possibile creare un IPSet chiamato “management” e aggiungervi tutti gli IP remoti. Questo crea tutte le regole del firewall necessarie per accedere alla GUI da remoto.

13.2.2. Configurazione specifica dell'host

La configurazione relativa all'host viene letta da:

/etc/pve/nodes/<nodename>/host.fw

Questo è utile per sovrascrivere le regole della configurazione cluster.fw. È anche possibile aumentare il livello di verbosità dei log e impostare opzioni relative a netfilter. La configurazione può contenere le seguenti sezioni:

[OPTIONS]

Viene utilizzato per impostare le opzioni del firewall relative all'host.

enable: <boolean> (default = 1)

Abilitare le regole del firewall dell'host.

log_level_forward: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il traffico inoltrato.

log_level_in: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il traffico in entrata.

log_level_out: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il traffico in uscita.

log_nf_conntrack: <boolean> (default = 0)

Abilitare la registrazione delle informazioni conntrack.

ndp: <boolean> (default = 1)

Abilitare NDP (Neighbor Discovery Protocol).

nf_conntrack_allow_invalid: <boolean> (default = 0)

Consentire i pacchetti non validi nel tracciamento delle connessioni.

nf_conntrack_helpers: <string> (default = ``)

Abilitare gli helper conntrack per protocolli specifici. Protocolli supportati: amanda, ftp, irc, netbios-ns, pptp, sane, sip, snmp, tftp

nf_conntrack_max: <integer> (32768 - N) (default = 262144)

Numero massimo di connessioni tracciate.

nf_conntrack_tcp_timeout_established: <integer> (7875 - N) (default = 432000)

Timeout di conntrack per le connessioni stabilite.

nf_conntrack_tcp_timeout_syn_recv: <integer> (30 - 60) (default = 60)

Timeout conntrack syn recv.

nftables: <boolean> (default = 0)

Abilitare il firewall basato su nftables (anteprima tecnologica)

nosmurfs: <boolean>

Abilitare il filtro SMURFS.

protection_synflood: <boolean> (default = 0)

Abilitare la protezione synflood

protection_synflood_burst: <integer> (default = 1000)

Burst del limite di frequenza della protezione contro i SYN flood per indirizzo IP sorgente.

protection_synflood_rate: <integer> (default = 200)

Limite di frequenza per la protezione da SYN flood, in SYN/sec per indirizzo IP sorgente.

smurf_log_level: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il filtro SMURFS.

tcp_flags_log_level: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il filtro dei flag TCP non validi.

tcpflags: <boolean> (default = 0)

Filtrare le combinazioni non valide di flag TCP.

[RULES]

Questa sezione contiene le regole firewall specifiche dell'host.

13.2.3. Configurazione VM/container

La configurazione del firewall della VM viene letta da:

/etc/pve/firewall/<VMID>.fw

e contiene i seguenti dati:

[OPTIONS]

Questo viene utilizzato per impostare le opzioni firewall relative a VM/Container.

dhcp: <boolean> (default = 0)

Abilitare DHCP.

enable: <boolean> (default = 0)

Abilitare/disabilitare le regole firewall.

ipfilter: <boolean>

Abilitare i filtri IP predefiniti. Equivale ad aggiungere un ipset ipfilter-net<id> vuoto per ogni interfaccia. Tali ipset contengono implicitamente restrizioni predefinite ragionevoli, come la limitazione degli indirizzi IPv6 link local a quello derivato dall'indirizzo MAC dell'interfaccia. Per i container, gli indirizzi IP configurati verranno aggiunti implicitamente.

log_level_in: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il traffico in entrata.

log_level_out: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il traffico in uscita.

macfilter: <boolean> (default = 1)

Abilitare/disabilitare il filtro degli indirizzi MAC.

ndp: <boolean> (default = 1)

Abilitare NDP (Neighbor Discovery Protocol).

policy_in: <ACCEPT | DROP | REJECT>

Policy di input.

policy_out: <ACCEPT | DROP | REJECT>

Policy di output.

radv: <boolean>

Consente l'invio di Router Advertisement.

[RULES]

Questa sezione contiene le regole del firewall per VM/container.

[IPSET <name>]

Definizioni degli IP set.

[ALIASES]

Definizioni degli alias IP.

Abilitazione del firewall per VM e container

Ogni dispositivo di rete virtuale dispone di un proprio flag di abilitazione del firewall, quindi è possibile abilitare selettivamente il firewall per ciascuna interfaccia. Ciò è richiesto in aggiunta all'opzione generale enable del firewall.

13.2.4. Configurazione VNet

La configurazione relativa alle VNet viene letta da:

/etc/pve/sdn/firewall/<vnet_name>.fw

Questo può essere utilizzato per impostare la configurazione del firewall a livello globale su una VNet, senza dover impostare regole firewall per ogni VM all'interno della VNet separatamente. Può contenere solo regole per la direzione FORWARD, poiché non esiste una nozione di traffico entrante o uscente. Ciò influisce su tutto il traffico che passa da una porta bridge a un'altra, inclusa l'interfaccia dell'host.

Warning Questa funzionalità è attualmente disponibile solo per il nuovo proxmox-firewall basato su nftables

Poiché il traffico che passa attraverso la catena FORWARD è bidirezionale, è necessario creare regole per entrambe le direzioni se si desidera che il traffico passi in entrambi i sensi. Ad esempio, se il traffico HTTP per un host specifico deve essere consentito, sarebbe necessario creare le seguenti regole:

FORWARD ACCEPT -dest 10.0.0.1 -dport 80
FORWARD ACCEPT -source 10.0.0.1 -sport 80
[OPTIONS]

Questo viene utilizzato per impostare le opzioni del firewall relative alle VNet.

enable: <boolean> (default = 0)

Abilitare/disabilitare le regole firewall.

log_level_forward: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per il traffico inoltrato.

policy_forward: <ACCEPT | DROP>

Policy di forward.

[RULES]

Questa sezione contiene le regole del firewall specifiche per le VNet.

13.3. Regole del firewall

Le regole del firewall consistono in una direzione (IN, OUT o FORWARD) e in un'azione (ACCEPT, DENY, REJECT). È inoltre possibile specificare il nome di una macro. Le macro contengono insiemi predefiniti di regole e opzioni. Le regole possono essere disabilitate anteponendo loro il carattere |.

Firewall rules syntax
[RULES]

DIRECTION ACTION [OPTIONS]
|DIRECTION ACTION [OPTIONS] # disabled rule

DIRECTION MACRO(ACTION) [OPTIONS] # use predefined macro

Le seguenti opzioni possono essere utilizzate per perfezionare la corrispondenza delle regole.

--dest <string>

Limitare l'indirizzo di destinazione del pacchetto. Può fare riferimento a un singolo indirizzo IP, a un IP set (+ipsetname) o a una definizione di alias IP. È inoltre possibile specificare un intervallo di indirizzi come 20.34.101.207-201.3.9.99, oppure un elenco di indirizzi IP e reti (le voci sono separate da virgola). Non mescolare indirizzi IPv4 e IPv6 all'interno di tali elenchi.

--dport <string>

Limitare la porta di destinazione TCP/UDP. È possibile utilizzare nomi di servizio o numeri semplici (0-65535), come definiti in /etc/services. Gli intervalli di porte possono essere specificati con \d+:\d+, ad esempio 80:85, ed è possibile utilizzare un elenco separato da virgole per far corrispondere più porte o intervalli.

--icmp-type <string>

Specificare icmp-type. Valido solo se proto è uguale a icmp o icmpv6/ipv6-icmp.

--iface <string>

Nome dell'interfaccia di rete. È necessario utilizzare i nomi delle chiavi di configurazione di rete per VM e container (net\d+). Le regole relative all'host possono utilizzare stringhe arbitrarie.

--log <alert | crit | debug | emerg | err | info | nolog | notice | warning>

Livello di log per la regola del firewall.

--proto <string>

Protocollo IP. È possibile utilizzare nomi di protocollo (tcp/udp) o numeri semplici, come definiti in /etc/protocols.

--source <string>

Limitare l'indirizzo di origine del pacchetto. Può fare riferimento a un singolo indirizzo IP, a un IP set (+ipsetname) o a una definizione di alias IP. È inoltre possibile specificare un intervallo di indirizzi come 20.34.101.207-201.3.9.99, oppure un elenco di indirizzi IP e reti (le voci sono separate da virgola). Non mescolare indirizzi IPv4 e IPv6 all'interno di tali elenchi.

--sport <string>

Limitare la porta di origine TCP/UDP. È possibile utilizzare nomi di servizio o numeri semplici (0-65535), come definiti in /etc/services. Gli intervalli di porte possono essere specificati con \d+:\d+, ad esempio 80:85, ed è possibile utilizzare un elenco separato da virgole per far corrispondere più porte o intervalli.

Di seguito alcuni esempi:

[RULES]
IN SSH(ACCEPT) -i net0
IN SSH(ACCEPT) -i net0 # a comment
IN SSH(ACCEPT) -i net0 -source 192.168.2.192 # only allow SSH from 192.168.2.192
IN SSH(ACCEPT) -i net0 -source 10.0.0.1-10.0.0.10 # accept SSH for IP range
IN SSH(ACCEPT) -i net0 -source 10.0.0.1,10.0.0.2,10.0.0.3 #accept ssh for IP list
IN SSH(ACCEPT) -i net0 -source +mynetgroup # accept ssh for ipset mynetgroup
IN SSH(ACCEPT) -i net0 -source myserveralias #accept ssh for alias myserveralias

|IN SSH(ACCEPT) -i net0 # disabled rule

IN  DROP # drop all incoming packages
OUT ACCEPT # accept all outgoing packages

13.4. Gruppi di sicurezza

Un gruppo di sicurezza è una raccolta di regole, definite a livello di cluster, che possono essere utilizzate in tutte le regole delle VM. Ad esempio è possibile definire un gruppo denominato “webserver” con regole per aprire le porte http e https.

# /etc/pve/firewall/cluster.fw

[group webserver]
IN  ACCEPT -p tcp -dport 80
IN  ACCEPT -p tcp -dport 443

È quindi possibile aggiungere questo gruppo al firewall di una VM

# /etc/pve/firewall/<VMID>.fw

[RULES]
GROUP webserver

13.5. Alias IP

Gli alias IP consentono di associare indirizzi IP di reti a un nome. È quindi possibile fare riferimento a tali nomi:

  • all'interno delle definizioni di IP set

  • nelle proprietà source e dest delle regole del firewall

13.5.1. Alias IP standard local_network

Questo alias viene definito automaticamente. Utilizzare il seguente comando per visualizzare i valori assegnati:

# pve-firewall localnet
local hostname: example
local IP address: 192.168.2.100
network auto detect: 192.168.0.0/20
using detected local_network: 192.168.0.0/20

Il firewall configura automaticamente le regole per consentire tutto ciò che è necessario per la comunicazione del cluster (corosync, API, SSH) utilizzando questo alias.

L'utente può sovrascrivere questi valori nella sezione alias di cluster.fw. Se si utilizza un singolo host su una rete pubblica, è preferibile assegnare esplicitamente l'indirizzo IP locale

#  /etc/pve/firewall/cluster.fw
[ALIASES]
local_network 1.2.3.4 # use the single IP address

13.6. IP set

Gli IP set possono essere utilizzati per definire gruppi di reti e host. È possibile fare riferimento ad essi con ‘+name` nelle proprietà source e dest delle regole del firewall.

Il seguente esempio consente il traffico HTTP dall'IP set management.

IN HTTP(ACCEPT) -source +management

13.6.1. IP set standard management

Questo IP set si applica solo ai firewall degli host (non ai firewall delle VM). Questi IP sono autorizzati a eseguire le normali attività di gestione (GUI di Proxmox VE, VNC, SPICE, SSH).

La rete del cluster locale viene aggiunta automaticamente a questo IP set (alias cluster_network), per consentire la comunicazione inter-host del cluster. (multicast, ssh, …)

# /etc/pve/firewall/cluster.fw

[IPSET management]
192.168.2.10
192.168.2.10/24

13.6.2. IP set standard blacklist

Il traffico proveniente da questi IP viene scartato dal firewall di ogni host e VM.

# /etc/pve/firewall/cluster.fw

[IPSET blacklist]
77.240.159.182
213.87.123.0/24

13.6.3. IP set standard ipfilter-net*

Questi filtri appartengono all'interfaccia di rete di una VM e sono utilizzati principalmente per prevenire l'IP spoofing. Se un set di questo tipo esiste per un'interfaccia, qualsiasi traffico in uscita con un IP di origine non corrispondente al set ipfilter dell'interfaccia corrispondente verrà scartato.

Per i container con indirizzi IP configurati, questi set, se esistono (o sono attivati tramite l'opzione generale IP Filter nella scheda options del firewall della VM), contengono implicitamente gli indirizzi IP associati.

Sia per le macchine virtuali che per i container, questi set contengono inoltre implicitamente l'indirizzo IPv6 link-local standard derivato dal MAC, per consentire il funzionamento del protocollo di neighbor discovery.

/etc/pve/firewall/<VMID>.fw

[IPSET ipfilter-net0] # only allow specified IPs on net0
192.168.2.10

13.7. Servizi e comandi

Il firewall esegue due demoni di servizio su ogni nodo:

  • pvefw-logger: demone NFLOG (sostituto di ulogd).

  • pve-firewall: aggiorna le regole iptables

È disponibile anche un comando CLI denominato pve-firewall, che può essere utilizzato per avviare e interrompere il servizio firewall:

# pve-firewall start
# pve-firewall stop

Per visualizzare lo stato, usare:

# pve-firewall status

Il comando precedente legge e compila tutte le regole del firewall, quindi verranno mostrati avvisi se la configurazione del firewall contiene errori.

Per visualizzare le regole iptables generate, usare:

# iptables-save

13.8. Regole firewall predefinite

Il seguente traffico viene filtrato dalla configurazione firewall predefinita:

13.8.1. DROP/REJECT in entrata/uscita a livello di datacenter

Se la policy di input o output del firewall è impostata su DROP o REJECT, il seguente traffico è comunque consentito per tutti gli host Proxmox VE nel cluster:

  • traffico sull'interfaccia di loopback

  • connessioni già stabilite

  • traffico che utilizza il protocollo IGMP

  • traffico TCP dagli host di gestione alla porta 8006, per consentire l'accesso all'interfaccia web

  • traffico TCP dagli host di gestione all'intervallo di porte da 5900 a 5999, consentendo il traffico per la console web VNC

  • traffico TCP dagli host di gestione alla porta 3128, per le connessioni al proxy SPICE

  • traffico TCP dagli host di gestione alla porta 22, per consentire l'accesso ssh

  • traffico TCP dagli host di gestione all'intervallo di porte da 60000 a 60050, consentendo il traffico per le migrazioni

  • traffico UDP nella rete del cluster verso le porte 5405-5412 per corosync

  • traffico UDP multicast nella rete del cluster

  • traffico ICMP di tipo 3 (Destination Unreachable), 4 (controllo della congestione) o 11 (Time Exceeded)

Il seguente traffico viene scartato, ma non registrato nel log anche con il logging abilitato:

  • connessioni TCP con stato di connessione non valido

  • Traffico broadcast, multicast e anycast non correlato a corosync, ossia non transitante attraverso le porte 5405-5412

  • traffico TCP verso la porta 43

  • traffico UDP verso le porte 135 e 445

  • traffico UDP verso l'intervallo di porte da 137 a 139

  • traffico UDP dalla porta di origine 137 verso l'intervallo di porte da 1024 a 65535

  • traffico UDP verso la porta 1900

  • traffico TCP verso le porte 135, 139 e 445

  • traffico UDP proveniente dalla porta di origine 53

Il resto del traffico viene rispettivamente scartato o rifiutato e viene anche registrato nel log. Questo comportamento può variare in base alle opzioni aggiuntive abilitate in Firewall → Options, come NDP, SMURFS e il filtraggio dei flag TCP.

Controllare l'output di

 # iptables-save

comando di sistema per visualizzare le chain e le regole del firewall attive sul sistema. Questo output è incluso anche in un System Report, accessibile tramite la scheda degli abbonamenti di un nodo nella GUI web, oppure tramite lo strumento da riga di comando pvereport.

13.8.2. VM/CT DROP/REJECT in entrata/uscita

Questo scarta o rifiuta tutto il traffico verso le VM, con alcune eccezioni per DHCP, NDP, Router Advertisement, filtraggio MAC e IP in base alla configurazione impostata. Le stesse regole per lo scarto/rifiuto dei pacchetti sono ereditate dal datacenter, mentre le eccezioni per il traffico in entrata/uscita accettato dell'host non si applicano.

Anche in questo caso, è possibile usare iptables-save (vedere sopra) per esaminare tutte le regole e le chain applicate.

13.9. Logging delle regole firewall

Per impostazione predefinita, il logging di tutto il traffico filtrato dalle regole firewall è disabilitato. Per abilitare il logging, è necessario impostare il loglevel per il traffico in entrata e/o in uscita in Firewall → Options. Questo può essere fatto sia per l'host che per il firewall VM/CT singolarmente. In questo modo si abilita il logging delle regole firewall standard di Proxmox VE e l'output può essere osservato in Firewall → Log. Inoltre, per le regole standard vengono registrati solo alcuni pacchetti scartati o rifiutati (vedere regole firewall predefinite).

loglevel non influisce sulla quantità di traffico filtrato che viene registrata. Modifica un LOGID aggiunto come prefisso all'output di log per facilitare il filtraggio e l'elaborazione successiva.

loglevel corrisponde a uno dei seguenti flag:

loglevel LOGID

nolog

 — 

emerg

0

alert

1

crit

2

err

3

warning

4

notice

5

info

6

debug

7

Un tipico output di log del firewall si presenta così:

VMID LOGID CHAIN TIMESTAMP POLICY: PACKET_DETAILS

Nel caso del firewall dell'host, VMID è uguale a 0.

13.9.1. Logging delle regole firewall definite dall'utente

Per registrare i pacchetti filtrati dalle regole firewall definite dall'utente, è possibile impostare un parametro log-level per ciascuna regola singolarmente. Questo consente di effettuare il logging in modo granulare e indipendente dal log-level definito per le regole standard in Firewall → Options.

Sebbene il loglevel di ogni singola regola possa essere definito o modificato facilmente nell'interfaccia web durante la creazione o la modifica della regola, è possibile impostarlo anche tramite le corrispondenti chiamate API pvesh.

Inoltre, il log-level può essere impostato anche tramite il file di configurazione del firewall aggiungendo -log <loglevel> alla regola selezionata (vedere i possibili log-level).

Ad esempio, i due casi seguenti sono identici:

IN REJECT -p icmp -log nolog
IN REJECT -p icmp

mentre

IN REJECT -p icmp -log debug

produce un output di log contrassegnato con il livello debug.

13.10. Suggerimenti e trucchi

13.10.1. Come consentire FTP

FTP è un protocollo di vecchio stile che utilizza la porta 21 e diverse altre porte dinamiche. È quindi necessaria una regola per accettare la porta 21. Inoltre, è necessario caricare il modulo ip_conntrack_ftp. Eseguire quindi:

modprobe ip_conntrack_ftp

e aggiungere ip_conntrack_ftp a /etc/modules (in modo che funzioni dopo un riavvio).

13.10.2. Integrazione IPS Suricata

È possibile utilizzare Suricata IPS (Intrusion Prevention System).

I pacchetti verranno inoltrati all'IPS solo dopo che il firewall li ha accettati (ACCEPT).

I pacchetti rifiutati/scartati dal firewall non vengono inoltrati all'IPS.

Installare suricata sull'host Proxmox:

# apt-get install suricata
# modprobe nfnetlink_queue

Non dimenticare di aggiungere nfnetlink_queue a /etc/modules per il prossimo riavvio.

Quindi, abilitare l'IPS per una VM specifica con:

# /etc/pve/firewall/<VMID>.fw

[OPTIONS]
ips: 1
ips_queues: 0

ips_queues assocerà una coda cpu specifica a questa VM.

Le code disponibili sono definite in

# /etc/default/suricata
NFQUEUE=0

13.11. Note su IPv6

Il firewall contiene alcune opzioni specifiche per IPv6. È opportuno notare che IPv6 non utilizza più il protocollo ARP, ma utilizza invece NDP (Neighbor Discovery Protocol), che opera a livello IP e quindi necessita di indirizzi IP per funzionare correttamente. Per questo scopo vengono utilizzati indirizzi link-local derivati dall'indirizzo MAC dell'interfaccia. Per impostazione predefinita l'opzione NDP è abilitata sia a livello host che VM per consentire l'invio e la ricezione dei pacchetti di neighbor discovery (NDP).

Oltre al neighbor discovery, NDP viene utilizzato anche per altre funzioni, come l'auto-configurazione e l'advertising dei router.

Per impostazione predefinita le VM possono inviare messaggi di router solicitation (per individuare un router) e ricevere pacchetti di router advertisement. Ciò consente loro di utilizzare l'autoconfigurazione stateless. D'altra parte le VM non possono annunciarsi come router a meno che non sia impostata l'opzione “Allow Router Advertisement” (radv: 1).

Per quanto riguarda gli indirizzi link-local richiesti per NDP, è disponibile anche l'opzione "IP Filter" (ipfilter: 1), che se abilitata ha lo stesso effetto di aggiungere un ipset ipfilter-net* per ciascuna interfaccia di rete della VM contenente i corrispondenti indirizzi link-local. (Per i dettagli, vedere la sezione IP set standard ipfilter-net*.)

13.12. Porte utilizzate da Proxmox VE

  • Interfaccia web: 8006 (TCP, HTTP/1.1 su TLS)

  • Console web VNC: 5900-5999 (TCP, WebSocket)

  • Proxy SPICE: 3128 (TCP)

  • sshd (utilizzato per le azioni del cluster): 22 (TCP)

  • rpcbind: 111 (UDP)

  • sendmail: 25 (TCP, in uscita)

  • traffico cluster corosync: 5405-5412 UDP

  • live migration (memoria della VM e dati su disco locale): 60000-60050 (TCP)

13.13. nftables

Come alternativa a pve-firewall viene offerto proxmox-firewall, che è un'implementazione del firewall di Proxmox VE basata sul più recente nftables piuttosto che su iptables.

Warning proxmox-firewall è attualmente in anteprima tecnica. Potrebbero essere presenti bug o incompatibilità con il firewall originale. Al momento non è adatto all'uso in produzione.

Questa implementazione utilizza gli stessi file e lo stesso formato di configurazione, pertanto è possibile utilizzare la vecchia configurazione durante il passaggio. Fornisce esattamente la stessa funzionalità, con alcune eccezioni:

  • Quando si utilizzano bridge Linux, non viene creato alcun bridge firewall aggiuntivo (fwbrX). Le interfacce guest che utilizzano bridge OVS avranno comunque bridge firewall.

  • Attualmente REJECT non è possibile per il traffico guest (il traffico verrà invece scartato).

  • L'utilizzo delle opzioni NDP, Router Advertisement o DHCP creerà sempre regole firewall, indipendentemente dalla policy predefinita.

  • le regole firewall per i guest vengono valutate anche per le connessioni che dispongono di voci nella tabella conntrack.

13.13.1. Installazione e utilizzo

Installare il package proxmox-firewall:

apt install proxmox-firewall

Abilitare il backend nftables tramite l'interfaccia web sui nodi (Host > Firewall > Options > nftables), oppure abilitandolo nel file di configurazione dei nodi (/etc/pve/nodes/<node_name>/host.fw):

[OPTIONS]

nftables: 1
Note Dopo aver abilitato/disabilitato proxmox-firewall, tutte le VM e i container in esecuzione devono essere riavviati affinché il vecchio/nuovo firewall funzioni correttamente.

Dopo aver impostato la chiave di configurazione nftables, il nuovo servizio proxmox-firewall subentrerà. È possibile verificare se il nuovo servizio funziona controllando con systemctl lo stato di proxmox-firewall:

systemctl status proxmox-firewall

È anche possibile esaminare il ruleset generato. Ulteriori informazioni su questo argomento sono disponibili nella sezione Comandi utili. È inoltre opportuno verificare che pve-firewall non generi più regole iptables; i relativi comandi sono disponibili nella sezione Servizi e comandi.

È possibile tornare al vecchio firewall semplicemente impostando nuovamente il valore di configurazione a 0 / No.

13.13.2. Utilizzo

proxmox-firewall creerà due tabelle gestite dal servizio proxmox-firewall: proxmox-firewall e proxmox-firewall-guests. Se si desidera creare regole personalizzate che risiedono fuori dalla configurazione del firewall di Proxmox VE, è possibile creare tabelle proprie per gestire le regole firewall personalizzate. proxmox-firewall interverrà solo sulle tabelle che genera, quindi è possibile estendere e modificare facilmente il comportamento di proxmox-firewall aggiungendo tabelle proprie.

Invece di utilizzare il comando pve-firewall, il firewall basato su nftables utilizza proxmox-firewall. Si tratta di un servizio systemd, quindi è possibile avviarlo e fermarlo tramite systemctl:

systemctl start proxmox-firewall
systemctl stop proxmox-firewall

L'arresto del servizio firewall rimuoverà tutte le regole generate.

Per interrogare lo stato del firewall, è possibile verificare lo stato del servizio systemctl:

systemctl status proxmox-firewall

13.13.3. Comandi utili

È possibile verificare il ruleset generato tramite il seguente comando:

nft list ruleset

Per eseguire il debug di proxmox-firewall è possibile generare un dump dei comandi prodotti dal firewall tramite il sottocomando compile. Inoltre, impostando la variabile d'ambiente PVE_LOG verrà stampato l'output di log su STDERR, il che può essere utile per eseguire il debug di problemi durante la generazione del ruleset nftables:

PVE_LOG=trace /usr/libexec/proxmox/proxmox-firewall compile > firewall.json

Il ruleset nftables è composto dal ruleset di base (skeleton), incluso nel binario proxmox-firewall, nonché dalle regole generate a partire dalla configurazione del firewall. È possibile ottenere il ruleset di base tramite il sottocomando skeleton:

/usr/libexec/proxmox/proxmox-firewall skeleton

L'output di entrambi i comandi può essere inviato direttamente tramite pipe all'eseguibile nft. I seguenti comandi ricreeranno l'intero ruleset nftables da zero:

/usr/libexec/proxmox/proxmox-firewall skeleton | nft -f -
/usr/libexec/proxmox/proxmox-firewall compile | nft -j -f -

È inoltre possibile modificare il servizio systemctl se si desidera ottenere un output più dettagliato per il demone del firewall durante la sua esecuzione:

systemctl edit proxmox-firewall

È quindi necessario aggiungere l'override per la variabile d'ambiente PVE_LOG:

[Service]
Environment="PVE_LOG=trace"

Questo genererà una grande quantità di log molto rapidamente, quindi è consigliabile utilizzare questa opzione solo a scopo di debug. Altri livelli di log, meno verbosi, sono info e debug.

Può essere utile tracciare il flusso dei pacchetti attraverso le diverse catene per eseguire il debug delle regole firewall. È possibile farlo impostando nftrace a 1 per i pacchetti che si desidera tracciare. Si consiglia di non impostare questo flag per tutti i pacchetti; nell'esempio seguente vengono esaminati solo i pacchetti ICMP.

#!/usr/sbin/nft -f
table bridge tracebridge
delete table bridge tracebridge

table bridge tracebridge {
    chain trace {
        meta l4proto icmp meta nftrace set 1
    }

    chain prerouting {
        type filter hook prerouting priority -350; policy accept;
        jump trace
    }

    chain postrouting {
        type filter hook postrouting priority -350; policy accept;
        jump trace
    }
}

Salvando questo file, rendendolo eseguibile e poi eseguendolo una volta, verranno create le rispettive chain di tracing. È quindi possibile ispezionare l'output del tracing tramite l'interfaccia web di Proxmox VE (Firewall > Log) oppure tramite nft monitor trace.

L'esempio precedente traccia il traffico su tutti i bridge, attraverso i quali transita solitamente il traffico dei guest. Per esaminare il traffico dell'host, creare tali catene nella tabella inet anziché nella tabella bridge.

Note È opportuno tenere presente che questo può generare molto spam nei log e rallentare in modo significativo le prestazioni dello stack di rete.

È possibile rimuovere le regole di tracing eseguendo il seguente comando:

nft delete table bridge tracebridge

14. Gestione degli utenti

Proxmox VE supporta più sorgenti di autenticazione, ad esempio Linux PAM, un server di autenticazione integrato di Proxmox VE, LDAP, Microsoft Active Directory e OpenID Connect.

Utilizzando una gestione degli utenti e dei permessi basata sui ruoli per tutti gli oggetti (VM, storage, nodi, ecc.), è possibile definire un accesso granulare.

14.1. Utenti

Proxmox VE memorizza gli attributi degli utenti in /etc/pve/user.cfg. Le password non vengono memorizzate qui; gli utenti sono invece associati ai realm di autenticazione descritti di seguito. Pertanto, un utente viene spesso identificato internamente tramite il proprio nome utente e realm nella forma <userid>@<realm>.

Ogni voce utente in questo file contiene le seguenti informazioni:

  • Nome

  • Cognome

  • Indirizzo e-mail

  • Appartenenza a gruppi

  • Una data di scadenza opzionale

  • Un commento o una nota relativa a questo utente

  • Se questo utente è abilitato o disabilitato

  • Chiavi opzionali di autenticazione a due fattori

Caution Quando un utente viene disabilitato o eliminato, oppure se la data di scadenza impostata è nel passato, questo utente non potrà accedere a nuove sessioni né avviare nuove attività. Tutte le attività già avviate da questo utente (ad esempio, sessioni terminale) non verranno terminate automaticamente da nessuno di questi eventi.

14.1.1. Amministratore di sistema

L'utente root del sistema può sempre accedere tramite il realm Linux PAM ed è un amministratore senza restrizioni. Questo utente non può essere eliminato, ma i suoi attributi possono comunque essere modificati. Le e-mail di sistema verranno inviate all'indirizzo e-mail assegnato a questo utente.

14.2. Gruppi

Ogni utente può essere membro di diversi gruppi. I gruppi sono il metodo preferito per organizzare i permessi di accesso. È sempre consigliabile assegnare i permessi ai gruppi anziché ai singoli utenti. In questo modo si ottiene un elenco di controllo degli accessi molto più gestibile.

14.3. Token API

I token API consentono l'accesso stateless alla maggior parte delle funzionalità dell'API REST da un altro sistema, software o client API. Fanno eccezione gli endpoint che forniscono accesso alla console della macchina virtuale o del sistema. Questi endpoint richiedono i privilegi dell'utente e non sono accessibili tramite un token API.

I token possono essere generati per singoli utenti e possono ricevere permessi e date di scadenza separate per limitare l'ambito e la durata dell'accesso. Se un token API viene compromesso, può essere revocato senza disabilitare l'utente stesso.

I token API sono disponibili in due tipi di base:

  • Privilegi separati: al token deve essere concesso esplicitamente l'accesso tramite ACL. I suoi permessi effettivi vengono calcolati intersecando i permessi dell'utente e quelli del token. Questa è l'impostazione predefinita per i token di nuova creazione.

  • Privilegi completi: i permessi del token sono identici a quelli dell'utente associato. Disabilitare la separazione dei privilegi solo quando l'integrazione richiede effettivamente i permessi completi dell'utente.

Impostare un timestamp expire (secondi epoch Unix) durante la creazione di un token in modo che un'automazione abbandonata non continui a funzionare silenziosamente. Il codice di autenticazione rifiuta le richieste una volta superata la scadenza.

Caution Il valore del token viene visualizzato/restituito una sola volta al momento della generazione. Non può essere recuperato nuovamente tramite l'API in un secondo momento!

Per utilizzare un token API, impostare l'header HTTP Authorization con il valore visualizzato nella forma PVEAPIToken=USER@REALM!TOKENID=UUID durante l'esecuzione delle richieste API, oppure fare riferimento alla documentazione del proprio client API.

14.4. Pool di risorse

screenshot/gui-datacenter-pool-window.png

Un pool di risorse è un insieme di macchine virtuali, container e dispositivi di storage. È utile per la gestione dei permessi nei casi in cui determinati utenti debbano avere un accesso controllato a uno specifico insieme di risorse, in quanto consente di applicare un unico permesso a un insieme di elementi, anziché doverlo gestire per ogni singola risorsa. I pool di risorse sono spesso utilizzati insieme ai gruppi, in modo che i membri di un gruppo abbiano i permessi su un insieme di macchine e storage.

14.5. Realm di autenticazione

Poiché gli utenti di Proxmox VE sono semplicemente controparti di utenti esistenti in qualche realm esterno, i realm devono essere configurati in /etc/pve/domains.cfg. Sono disponibili i seguenti realm (metodi di autenticazione):

Autenticazione standard Linux PAM

Linux PAM è un framework per l'autenticazione degli utenti a livello di sistema. Questi utenti vengono creati sul sistema host con comandi come adduser. Se sul sistema host Proxmox VE esistono utenti PAM, è possibile aggiungere le relative voci a Proxmox VE, per consentire a questi utenti di accedere tramite il proprio nome utente e password di sistema.

Server di autenticazione Proxmox VE

Si tratta di un archivio password in stile Unix, che memorizza le password con hash in /etc/pve/priv/shadow.cfg. Le password vengono sottoposte a hash utilizzando l'algoritmo SHA-256. Questo è il realm più comodo per installazioni di piccola (o anche media) scala, in cui gli utenti non necessitano di accesso a nulla al di fuori di Proxmox VE. In questo caso, gli utenti sono gestiti interamente da Proxmox VE e possono modificare la propria password tramite l'interfaccia grafica.

LDAP

LDAP (Lightweight Directory Access Protocol) è un protocollo aperto e multipiattaforma per l'autenticazione tramite servizi di directory. OpenLDAP è un'implementazione open source diffusa del protocollo LDAP.

Microsoft Active Directory (AD)

Microsoft Active Directory (AD) è un servizio di directory per reti a dominio Windows ed è supportato come realm di autenticazione per Proxmox VE. Supporta LDAP come protocollo di autenticazione.

OpenID Connect

OpenID Connect è implementato come livello di identità sopra al protocollo OAuth 2.0. Consente ai client di verificare l'identità dell'utente, in base all'autenticazione eseguita da un server di autorizzazione esterno.

14.5.1. Autenticazione standard Linux PAM

Poiché Linux PAM corrisponde agli utenti del sistema host, su ogni nodo in cui l'utente ha il permesso di accedere deve esistere un utente di sistema. L'utente si autentica con la propria password di sistema abituale. Questo realm viene aggiunto per impostazione predefinita e non può essere rimosso.

Le modifiche della password tramite l'interfaccia grafica o, in modo equivalente, tramite l'endpoint API /access/password si applicano solo al nodo locale e non a livello di cluster. Sebbene Proxmox VE abbia un design multi-master, l'uso di password diverse per nodi diversi può comunque offrire un vantaggio in termini di sicurezza.

In termini di configurabilità, un amministratore può scegliere di richiedere l'autenticazione a due fattori per gli accessi dal realm e di impostare il realm come realm di autenticazione predefinito.

14.5.2. Server di autenticazione Proxmox VE

Il realm del server di autenticazione di Proxmox VE è un semplice archivio di password di tipo Unix. Il realm viene creato per impostazione predefinita e, come per Linux PAM, le uniche voci di configurazione disponibili sono la possibilità di richiedere l'autenticazione a due fattori per gli utenti del realm e di impostarlo come realm predefinito per il login.

A differenza degli altri tipi di realm di Proxmox VE, gli utenti vengono creati e autenticati interamente tramite Proxmox VE, anziché essere autenticati da un altro sistema. Pertanto, è necessario impostare una password per questo tipo di utente al momento della creazione.

14.5.3. LDAP

È anche possibile utilizzare un server LDAP esterno per l'autenticazione degli utenti (ad esempio, OpenLDAP). In questo tipo di realm, gli utenti vengono ricercati sotto un Base Domain Name (base_dn), utilizzando l'attributo username specificato nel campo User Attribute Name (user_attr).

È possibile configurare un server e un server di fallback opzionale, e la connessione può essere cifrata tramite SSL. Inoltre, è possibile configurare filtri per directory e gruppi. I filtri consentono di limitare ulteriormente l'ambito del realm.

Ad esempio, se un utente è rappresentato tramite il seguente dataset LDIF:

# user1 of People at ldap-test.com
dn: uid=user1,ou=People,dc=ldap-test,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: user1
cn: Test User 1
sn: Testers
description: This is the first test user.

Il Base Domain Name sarebbe ou=People,dc=ldap-test,dc=com e l'attributo utente sarebbe uid.

Se Proxmox VE deve autenticarsi (bind) al server LDAP prima di poter interrogare e autenticare gli utenti, è possibile configurare un bind domain name tramite la proprietà bind_dn in /etc/pve/domains.cfg. La relativa password deve quindi essere memorizzata in /etc/pve/priv/realm/<realmname>.pw (ad esempio, /etc/pve/priv/realm/my-ldap.pw). Questo file deve contenere una singola riga con la password in chiaro.

Per verificare i certificati, è necessario impostare capath. È possibile impostarlo direttamente sul certificato CA del server LDAP, oppure sul percorso di sistema che contiene tutti i certificati CA attendibili (/etc/ssl/certs). Inoltre, è necessario impostare l'opzione verify, operazione che può essere eseguita anche tramite l'interfaccia web.

Le principali opzioni di configurazione per un realm di un server LDAP sono le seguenti:

  • Realm (realm): l'identificativo del realm per gli utenti Proxmox VE

  • Base Domain Name (base_dn): la directory sotto cui vengono ricercati gli utenti

  • User Attribute Name (user_attr): l'attributo LDAP contenente il nome utente con cui gli utenti effettueranno il login

  • Server (server1): il server che ospita la directory LDAP

  • Fallback Server (server2): un indirizzo di server di fallback opzionale, nel caso in cui il server primario non sia raggiungibile

  • Port (port): la porta su cui il server LDAP è in ascolto

Note Per consentire a un determinato utente di autenticarsi tramite il server LDAP, è necessario aggiungerlo anche come utente di quel realm dal server Proxmox VE. Questa operazione può essere eseguita automaticamente con la sincronizzazione.

14.5.4. Microsoft Active Directory (AD)

Per configurare Microsoft AD come realm, è necessario specificare un indirizzo del server e un dominio di autenticazione. Active Directory supporta la maggior parte delle stesse proprietà di LDAP, come un server di fallback opzionale, la porta e la cifratura SSL. Inoltre, dopo la configurazione, gli utenti possono essere aggiunti automaticamente a Proxmox VE tramite operazioni di sincronizzazione.

Come per LDAP, se Proxmox VE deve autenticarsi prima di effettuare il bind al server AD, è necessario configurare la proprietà Bind User (bind_dn). Questa proprietà è tipicamente richiesta per impostazione predefinita da Microsoft AD.

Le principali impostazioni di configurazione per Microsoft Active Directory sono:

  • Realm (realm): l'identificativo del realm per gli utenti Proxmox VE

  • Domain (domain): il dominio AD del server

  • Server (server1): il FQDN o l'indirizzo IP del server

  • Fallback Server (server2): un indirizzo di server di fallback opzionale, nel caso in cui il server primario non sia raggiungibile

  • Port (port): la porta su cui il server Microsoft AD è in ascolto

Note Microsoft AD normalmente verifica valori come i nomi utente senza distinzione tra maiuscole e minuscole. Per fare in modo che Proxmox VE si comporti nello stesso modo, è possibile disabilitare l'opzione predefinita case-sensitive modificando il realm nell'interfaccia web, oppure tramite la CLI (sostituire ID con l'ID del realm): pveum realm modify ID --case-sensitive 0

14.5.5. Sincronizzazione dei realm basati su LDAP

screenshot/gui-datacenter-realm-add-ldap.png

È possibile sincronizzare automaticamente utenti e gruppi per i realm basati su LDAP (LDAP e Microsoft Active Directory), evitando di doverli aggiungere manualmente a Proxmox VE. È possibile accedere alle opzioni di sincronizzazione dalla finestra Aggiungi/Modifica dell'interfaccia web, nel pannello Authentication, oppure tramite i comandi pveum realm add/modify. È quindi possibile eseguire l'operazione di sincronizzazione dal pannello Authentication della GUI oppure utilizzando il seguente comando:

pveum realm sync <realm>

Utenti e gruppi vengono sincronizzati nel file di configurazione a livello di cluster, /etc/pve/user.cfg.

Da attributi a proprietà

Se la risposta di sincronizzazione include attributi utente, questi verranno sincronizzati nella proprietà utente corrispondente in user.cfg. Ad esempio: firstname o lastname.

Se i nomi degli attributi non corrispondono alle proprietà di Proxmox VE, è possibile impostare una mappa personalizzata campo-campo nella configurazione utilizzando l'opzione sync_attributes.

La gestione di tali proprietà in caso di eventuali elementi mancanti può essere controllata tramite le opzioni di sincronizzazione, vedere di seguito.

Configurazione della sincronizzazione

Le opzioni di configurazione per la sincronizzazione dei realm basati su LDAP si trovano nella scheda Sync Options della finestra Aggiungi/Modifica.

Le opzioni di configurazione sono le seguenti:

  • Bind User (bind_dn): fa riferimento all'account LDAP utilizzato per interrogare utenti e gruppi. Questo account necessita dell'accesso a tutte le voci desiderate. Se impostato, la ricerca verrà eseguita tramite binding; in caso contrario, la ricerca verrà eseguita in modo anonimo. L'utente deve essere un nome distinto (DN) LDAP completo, ad esempio cn=admin,dc=example,dc=com.

  • Attr. nome gruppo (group_name_attr): rappresenta i gruppi degli utenti. Vengono sincronizzate solo le voci che rispettano le normali limitazioni di caratteri di user.cfg. I gruppi vengono sincronizzati con -$realm aggiunto al nome, per evitare conflitti di denominazione. Assicurarsi che una sincronizzazione non sovrascriva gruppi creati manualmente.

  • User classes (user_classes): classi di oggetti associate agli utenti.

  • Group classes (group_classes): classi di oggetti associate ai gruppi.

  • E-Mail attribute: se il server basato su LDAP specifica gli indirizzi email degli utenti, questi possono essere inclusi nella sincronizzazione impostando l'attributo associato qui. Dalla riga di comando, ciò è possibile tramite il parametro --sync_attributes.

  • User Filter (filter): per ulteriori opzioni di filtro per individuare utenti specifici.

  • Group Filter (group_filter): per ulteriori opzioni di filtro per individuare gruppi specifici.

Note I filtri consentono di creare un insieme di criteri di corrispondenza aggiuntivi, per restringere l'ambito di una sincronizzazione. Informazioni sui tipi di filtro LDAP disponibili e sul relativo utilizzo sono disponibili su ldap.com.
Opzioni di sincronizzazione
screenshot/gui-datacenter-realm-add-ldap-sync-options.png

Oltre alle opzioni specificate nella sezione precedente, è possibile configurare ulteriori opzioni che descrivono il comportamento dell'operazione di sincronizzazione.

Queste opzioni vengono impostate come parametri prima della sincronizzazione, oppure come valori predefiniti tramite l'opzione del realm sync-defaults-options.

Le opzioni principali per la sincronizzazione sono:

  • Scope (scope): l'ambito di ciò che si desidera sincronizzare. Può essere users, groups oppure both.

  • Enable new (enable-new): se impostato, i nuovi utenti sincronizzati vengono abilitati e possono effettuare l'accesso. Il valore predefinito è true.

  • Remove Vanished (remove-vanished): si tratta di un elenco di opzioni che, quando attivate, determinano se rimuovere determinati elementi quando non vengono restituiti dalla risposta di sincronizzazione. Le opzioni sono:

    • ACL (acl): rimuovere le ACL degli utenti e dei gruppi che non sono stati restituiti nella risposta di sincronizzazione. Questa opzione ha senso soprattutto insieme a Entry.

    • Entry (entry): rimuove le voci (ossia utenti e gruppi) quando non vengono restituite nella risposta di sincronizzazione.

    • Properties (properties): rimuove le proprietà delle voci per le quali l'utente nella risposta di sincronizzazione non conteneva tali attributi. Questo include tutte le proprietà, anche quelle non impostate da una sincronizzazione. Fanno eccezione i token e il flag di abilitazione, che verranno mantenuti anche con questa opzione abilitata.

  • Preview (dry-run): nessun dato viene scritto nella configurazione. Utile se si desidera vedere quali utenti e gruppi verrebbero sincronizzati con user.cfg.

Caratteri riservati

Alcuni caratteri sono riservati (vedere RFC2253) e non possono essere utilizzati facilmente nei valori degli attributi nei DN senza essere correttamente preceduti da escape.

I seguenti caratteri richiedono l'escape:

  • Spazio ( ) all'inizio o alla fine

  • Cancelletto (#) all'inizio

  • Virgola (,)

  • Segno più (+)

  • Virgolette doppie (")

  • Barre (/)

  • Parentesi angolari (<>)

  • Punto e virgola (;)

  • Segno di uguale (=)

Per utilizzare tali caratteri nei DN, racchiudere il valore dell'attributo tra virgolette doppie. Ad esempio, per effettuare il bind con un utente con CN (Common Name) Example, User, utilizzare CN="Example, User",OU=people,DC=example,DC=com come valore per bind_dn.

Questo si applica agli attributi base_dn, bind_dn e group_dn.

Note Gli utenti con due punti e barre non possono essere sincronizzati poiché questi sono caratteri riservati nei nomi utente.

14.5.6. OpenID Connect

Le principali opzioni di configurazione OpenID Connect sono:

  • Issuer URL (issuer-url): questo è l'URL del server di autorizzazione. Proxmox VE utilizza il protocollo OpenID Connect Discovery per configurare automaticamente ulteriori dettagli.

    Sebbene sia possibile utilizzare URL http:// non crittografati, si consiglia vivamente di utilizzare connessioni crittografate https://.

  • Realm (realm): l'identificativo del realm per gli utenti Proxmox VE

  • Client ID (client-id): ID client OpenID.

  • Client Key (client-key): Chiave client OpenID opzionale.

  • Autocreate Users (autocreate): crea automaticamente gli utenti se non esistono. Sebbene l'autenticazione avvenga sul server OpenID, tutti gli utenti necessitano comunque di una voce nella configurazione utenti di Proxmox VE. È possibile aggiungerli manualmente, oppure utilizzare l'opzione autocreate per aggiungere automaticamente i nuovi utenti.

  • Username Claim (username-claim): claim OpenID utilizzato per generare il nome utente univoco (subject, username o email).

  • Autocreate Groups (groups-autocreate): crea tutti i gruppi presenti nel claim invece di utilizzare i gruppi PVE esistenti (comportamento predefinito).

  • Groups Claim (groups-claim): claim OpenID utilizzato per recuperare i gruppi dal token ID o dall'endpoint userinfo.

  • Overwrite Groups (groups-overwrite): sovrascrive tutti i gruppi assegnati all'utente invece di aggiungerli ai gruppi esistenti (comportamento predefinito).

Mapping del nome utente

La specifica OpenID Connect definisce un singolo attributo univoco (claim in termini OpenID) denominato subject. Per impostazione predefinita, si utilizza il valore di questo attributo per generare i nomi utente di Proxmox VE, semplicemente aggiungendo @ e il nome del realm: ${subject}@${realm}.

Purtroppo, la maggior parte dei server OpenID utilizza stringhe casuali per subject, come DGH76OKH34BNG3245SB, quindi un tipico nome utente avrebbe l'aspetto di DGH76OKH34BNG3245SB@yourrealm. Sebbene univoche, tali stringhe casuali sono difficili da ricordare per gli esseri umani, rendendo praticamente impossibile associarle a utenti reali.

L'impostazione username-claim consente di utilizzare altri attributi per il mapping del nome utente. È preferibile impostarla su username se il server OpenID Connect fornisce tale attributo e ne garantisce l'univocità.

Un'altra opzione è utilizzare email, che produce anch'essa nomi utente leggibili dall'uomo. Anche in questo caso, utilizzare questa impostazione solo se il server garantisce l'univocità di questo attributo.

Mapping dei gruppi

Specificare l'impostazione groups-claim nella configurazione OpenID abilita la funzionalità di mapping dei gruppi. I dati forniti in groups-claim devono essere un elenco di stringhe che corrispondono ai gruppi di cui un utente deve essere membro in Proxmox VE. Per evitare collisioni, i nomi dei gruppi provenienti dal claim OpenID vengono fatti seguire dal suffisso -<nome realm> (ad es. per il nome del gruppo OpenID my-openid-group nel realm oidc, il nome del gruppo in Proxmox VE sarebbe my-openid-group-oidc).

Qualsiasi gruppo riportato dal provider OpenID che non esiste in Proxmox VE viene ignorato per impostazione predefinita. Se tutti i gruppi riportati dal provider OpenID devono esistere in Proxmox VE, è possibile utilizzare l'opzione groups-autocreate per creare automaticamente tali gruppi al momento del login degli utenti.

Per impostazione predefinita, i gruppi vengono aggiunti ai gruppi esistenti dell'utente. Può essere desiderabile sovrascrivere eventuali gruppi di cui l'utente è già membro in Proxmox VE con quelli provenienti dal provider OpenID. Abilitando l'impostazione groups-overwrite si rimuovono tutti i gruppi dell'utente in Proxmox VE prima di aggiungere i gruppi riportati dal provider OpenID.

In alcuni casi, i server OpenID possono inviare claim di gruppi che includono caratteri non validi per gli ID dei gruppi di Proxmox VE. Eventuali gruppi che contengono caratteri non consentiti in un nome di gruppo Proxmox VE non vengono inclusi e un avviso verrà inviato ai log.

Impostazioni avanzate
  • Query userinfo endpoint (query-userinfo): abilitare questa opzione richiede che l'autenticatore OpenID Connect interroghi l'endpoint "userinfo" per i valori dei claim. Disabilitare questa opzione è utile per alcuni identity provider che non supportano l'endpoint "userinfo" (ad es. ADFS).

Esempi

Di seguito è riportato un esempio di creazione di un realm OpenID utilizzando Google. È necessario sostituire --client-id e --client-key con i valori presenti nelle impostazioni OpenID di Google.

pveum realm add myrealm1 --type openid --issuer-url  https://accounts.google.com --client-id XXXX --client-key YYYY --username-claim email

Il comando precedente utilizza --username-claim email, in modo che i nomi utente sul lato Proxmox VE assumano la forma example.user@google.com@myrealm1.

Keycloak (https://www.keycloak.org/) è un noto strumento open source di gestione delle identità e degli accessi, che supporta OpenID Connect. Nell'esempio seguente, è necessario sostituire --issuer-url e --client-id con le proprie informazioni:

pveum realm add myrealm2 --type openid --issuer-url  https://your.server:8080/realms/your-realm --client-id XXX --username-claim username

L'utilizzo di --username-claim username consente di avere nomi utente semplici sul lato Proxmox VE, come example.user@myrealm2.

Warning È necessario assicurarsi che all'utente non sia consentito modificare autonomamente l'impostazione del nome utente (sul server Keycloak).

14.6. Autenticazione a due fattori

Esistono due modi per utilizzare l'autenticazione a due fattori:

Può essere richiesta dal realm di autenticazione, tramite TOTP (Time-based One-Time Password) o YubiKey OTP. In questo caso, un utente appena creato deve avere le proprie chiavi aggiunte immediatamente, poiché non è possibile effettuare il login senza il secondo fattore. Nel caso di TOTP, gli utenti possono anche modificare il TOTP in seguito, a condizione che possano prima effettuare il login.

In alternativa, gli utenti possono scegliere di attivare volontariamente l'autenticazione a due fattori in un secondo momento, anche se il realm non la impone.

14.6.1. Secondi fattori disponibili

È possibile configurare più secondi fattori, in modo da evitare una situazione in cui la perdita dello smartphone o della chiave di sicurezza blocchi permanentemente l'accesso al proprio account.

I seguenti metodi di autenticazione a due fattori sono disponibili in aggiunta a TOTP e YubiKey OTP imposti dal realm:

  • TOTP configurato dall'utente (Time-based One-Time Password). Un codice breve derivato da un segreto condiviso e dall'ora corrente, che cambia ogni 30 secondi.

  • WebAuthn (Web Authentication). Uno standard generale per l'autenticazione. È implementato da vari dispositivi di sicurezza, come chiavi hardware o trusted platform module (TPM) di un computer o di uno smartphone.

  • Chiavi di recupero a uso singolo. Un elenco di chiavi che dovrebbero essere stampate e conservate in un luogo sicuro oppure salvate digitalmente in un archivio elettronico protetto. Ogni chiave può essere utilizzata una sola volta. Sono perfette per garantire che non si venga bloccati fuori dal proprio account, anche se tutti gli altri secondi fattori vengono persi o risultano corrotti.

Prima che WebAuthn fosse supportato, l'utente poteva configurare U2F. I fattori U2F esistenti possono ancora essere utilizzati, ma si consiglia di passare a WebAuthn, una volta configurato sul server.

14.6.2. Autenticazione a due fattori imposta dal realm

Questo può essere fatto selezionando uno dei metodi disponibili tramite il menu a discesa TFA durante l'aggiunta o la modifica di un realm di autenticazione. Quando un realm ha il TFA abilitato, questo diventa un requisito, e solo gli utenti con il TFA configurato potranno effettuare il login.

Attualmente sono disponibili due metodi:

OATH basato sul tempo (TOTP)

Questo metodo utilizza l’algoritmo standard HMAC-SHA1, in cui l’orario corrente viene sottoposto a hash insieme alla chiave configurata dall’utente. I parametri relativi all’intervallo di tempo e alla lunghezza della password sono configurabili.

Un utente può avere più chiavi configurate (separate da spazi) e le chiavi possono essere specificate in notazione Base32 (RFC3548) o esadecimale.

Proxmox VE fornisce uno strumento di generazione delle chiavi (oathkeygen) che restituisce una chiave casuale in notazione Base32, che può essere utilizzata direttamente con vari strumenti OTP, come lo strumento da riga di comando oathtool, oppure, su Android, con Google Authenticator, FreeOTP, andOTP o applicazioni simili.

YubiKey OTP

Per l’autenticazione tramite YubiKey è necessario configurare un ID API Yubico, una API KEY e un URL del server di validazione, e gli utenti devono disporre di una YubiKey. Per ottenere l’ID della chiave da una YubiKey, è possibile attivare la YubiKey una volta dopo averla collegata tramite USB e copiare i primi 12 caratteri della password digitata nel campo Key IDs dell’utente.

Consultare la documentazione di YubiKey OTP per informazioni su come utilizzare YubiCloud o ospitare un proprio server di verifica.

14.6.3. Limiti e blocco dell'autenticazione a due fattori

Il secondo fattore ha lo scopo di proteggere gli utenti nel caso in cui la password venga in qualche modo compromessa o indovinata. Tuttavia, alcuni fattori potrebbero comunque essere violati tramite forza bruta. Per questo motivo, gli utenti vengono bloccati dopo un numero eccessivo di tentativi di accesso con il secondo fattore non riusciti.

Per TOTP, 8 tentativi non riusciti disabilitano i fattori TOTP dell’utente. Vengono sbloccati effettuando l’accesso con una chiave di recupero. Se TOTP era l’unico fattore disponibile, è necessario l’intervento di un amministratore, e si consiglia vivamente di richiedere all’utente di cambiare immediatamente la password.

Poiché FIDO2/Webauthn e le chiavi di recupero sono meno soggetti ad attacchi di forza bruta, il relativo limite è più alto (100 tentativi), ma al superamento di tale soglia tutti i secondi fattori vengono bloccati per un’ora.

Un amministratore può sbloccare in qualsiasi momento l’autenticazione a due fattori di un utente tramite l’elenco utenti nell’interfaccia utente o la riga di comando:

 pveum user tfa unlock joe@pve

14.6.4. Autenticazione TOTP configurata dall'utente

Gli utenti possono scegliere di abilitare TOTP o WebAuthn come secondo fattore in fase di accesso, tramite il pulsante TFA nell’elenco utenti (a meno che il realm non imponga YubiKey OTP).

Gli utenti possono sempre aggiungere e utilizzare chiavi di recupero monouso.

screenshot/gui-datacenter-two-factor.png

Dopo l’apertura della finestra TFA, all’utente viene presentata una finestra di dialogo per configurare l’autenticazione TOTP. Il campo Secret contiene la chiave, che può essere generata casualmente tramite il pulsante Randomize. È possibile aggiungere un nome dell’emittente facoltativo (Issuer Name) per fornire all’app TOTP informazioni su ciò a cui appartiene la chiave. La maggior parte delle app TOTP mostra il nome dell’emittente insieme ai relativi valori OTP. Il nome utente è incluso anche nel codice QR per l’app TOTP.

Dopo la generazione di una chiave, viene visualizzato un codice QR, che può essere utilizzato con la maggior parte delle app OTP come FreeOTP. L’utente deve quindi verificare la password utente corrente (a meno che non sia connesso come root), oltre alla capacità di utilizzare correttamente la chiave TOTP, digitando il valore OTP corrente nel campo Verification Code e facendo clic sul pulsante Apply.

14.6.5. TOTP

screenshot/pve-gui-tfa-add-totp.png

Non è richiesta alcuna configurazione lato server. È sufficiente installare un’app TOTP sul proprio smartphone (ad esempio, FreeOTP) e utilizzare l’interfaccia web di Proxmox VE per aggiungere un fattore TOTP.

14.6.6. WebAuthn

Per il corretto funzionamento di WebAuthn, sono necessarie due cose:

  • Un certificato HTTPS attendibile (ad esempio, utilizzando Let’s Encrypt). Sebbene probabilmente funzioni anche con un certificato non attendibile, alcuni browser potrebbero mostrare un avviso o rifiutare le operazioni WebAuthn se il certificato non è attendibile.

  • Impostare la configurazione di WebAuthn (vedere Datacenter → Options → WebAuthn Settings nell’interfaccia web di Proxmox VE). Nella maggior parte delle configurazioni, i campi possono essere compilati automaticamente.

Una volta soddisfatti entrambi questi requisiti, è possibile aggiungere una configurazione WebAuthn nel pannello Two Factor in Datacenter → Permissions → Two Factor.

14.6.7. Chiavi di recupero

screenshot/pve-gui-tfa-add-recovery-keys.png

I codici delle chiavi di recupero non richiedono alcuna preparazione; è possibile semplicemente creare un set di chiavi di recupero nel pannello Two Factor in Datacenter → Permissions → Two Factor.

Note Può esistere un solo set di chiavi di recupero monouso per utente in qualsiasi momento.

14.6.8. Configurazione di Webauthn lato server

screenshot/gui-datacenter-webauthn-edit.png

Per consentire agli utenti di utilizzare l’autenticazione WebAuthn, è necessario utilizzare un dominio valido con un certificato SSL valido, altrimenti alcuni browser potrebbero mostrare un avviso o rifiutare del tutto l’autenticazione.

Note Modificare la configurazione WebAuthn potrebbe rendere inutilizzabili tutte le registrazioni WebAuthn esistenti!

Questo si effettua tramite /etc/pve/datacenter.cfg. Ad esempio:

webauthn: rp=mypve.example.com,origin=https://mypve.example.com:8006,id=mypve.example.com

14.6.9. Configurazione U2F lato server

Note Si consiglia di utilizzare invece WebAuthn.

Per consentire agli utenti di utilizzare l'autenticazione U2F, può essere necessario utilizzare un dominio valido con un certificato SSL valido, altrimenti alcuni browser potrebbero mostrare un avviso o rifiutare completamente l'uso di U2F. Inizialmente, è necessario configurare un AppId
[AppId https://developers.yubico.com/U2F/App_ID.html]
.

Note Modificare l'AppId renderà inutilizzabili tutte le registrazioni U2F esistenti!

Questo si effettua tramite /etc/pve/datacenter.cfg. Ad esempio:

u2f: appid=https://mypve.example.com:8006

Per un singolo nodo, l'AppId può semplicemente essere l'indirizzo dell'interfaccia web, esattamente come viene utilizzato nel browser, inclusi https:// e la porta, come mostrato sopra. Si noti che alcuni browser possono essere più rigidi di altri nel verificare la corrispondenza degli AppId.

Quando si utilizzano più nodi, è preferibile disporre di un server https separato che fornisca un file appid.json
[Multi-facet apps: https://developers.yubico.com/U2F/App_ID.html]
, poiché questa soluzione sembra essere compatibile con la maggior parte dei browser. Se tutti i nodi utilizzano sottodomini dello stesso dominio di primo livello, può essere sufficiente utilizzare il TLD come AppId. Si noti tuttavia che alcuni browser potrebbero non accettarlo.

Note Un AppId non valido di solito genera un errore, ma si sono verificate situazioni in cui ciò non accade, in particolare quando si utilizza un AppId di tipo top level domain per un nodo che viene raggiunto tramite un sottodominio in Chromium. Per questo motivo si consiglia di testare la configurazione con più browser, poiché modificare l'AppId in seguito renderà inutilizzabili le registrazioni U2F esistenti.

14.6.10. Attivazione di U2F come utente

Per abilitare l'autenticazione U2F, aprire la scheda U2F della finestra TFA, digitare la password corrente (a meno che non si sia collegati come root) e premere il pulsante Registra. Se il server è configurato correttamente e il browser accetta l'AppId fornito dal server, verrà visualizzato un messaggio che invita l'utente a premere il pulsante sul dispositivo U2F (se si tratta di una YubiKey, la luce del pulsante dovrebbe lampeggiare costantemente, circa due volte al secondo).

Gli utenti di Firefox potrebbero dover abilitare security.webauth.u2f tramite about:config prima di poter utilizzare un token U2F.

14.7. Gestione dei permessi

Perché un utente possa eseguire un'azione (come elencare, modificare o eliminare parti della configurazione di una VM), è necessario che disponga dei permessi appropriati.

Proxmox VE utilizza un sistema di gestione dei permessi basato su ruoli e percorsi. Una voce nella tabella dei permessi consente a un utente, gruppo o token di assumere un ruolo specifico quando si accede a un oggetto o percorso. Ciò significa che una tale regola di accesso può essere rappresentata come una tripla (percorso, utente, ruolo), (percorso, gruppo, ruolo) o (percorso, token, ruolo), dove il ruolo contiene un insieme di azioni consentite e il percorso rappresenta l'obiettivo di tali azioni.

14.7.1. Ruoli

Un ruolo è semplicemente un elenco di privilegi. Proxmox VE include diversi ruoli predefiniti, che soddisfano la maggior parte delle esigenze.

  • Administrator: dispone di privilegi completi

  • NoAccess: non dispone di alcun privilegio (usato per vietare l'accesso)

  • PVEAdmin: può eseguire la maggior parte delle attività, ma non dispone del diritto di modificare le impostazioni di sistema (Sys.PowerMgmt, Sys.Modify, Realm.Allocate) o i permessi (Permissions.Modify)

  • PVEAuditor: dispone di accesso in sola lettura

  • PVEDatastoreAdmin: crea e alloca spazio di backup e template

  • PVEDatastoreUser: alloca spazio di backup e visualizza lo storage

  • PVEMappingAdmin: gestisce le mappature delle risorse

  • PVEMappingUser: visualizza e utilizza le mappature delle risorse

  • PVEPoolAdmin: alloca i pool

  • PVEPoolUser: visualizza i pool

  • PVESDNAdmin: gestisce la configurazione SDN

  • PVESDNUser: accesso a bridge/vnet

  • PVESysAdmin: audit, console di sistema e log di sistema

  • PVETemplateUser: visualizza e clona i template

  • PVEUserAdmin: gestisce gli utenti

  • PVEVMAdmin: amministra completamente le VM

  • PVEVMUser: visualizzazione, backup, configurazione CD-ROM, console VM, gestione dell'alimentazione VM

È possibile visualizzare l'intero insieme di ruoli predefiniti nella GUI.

È possibile aggiungere nuovi ruoli tramite l'interfaccia grafica o la riga di comando.

screenshot/gui-datacenter-role-add.png

Dall'interfaccia grafica, navigare alla scheda Permissions → Roles da Datacenter e fare clic sul pulsante Create. Da qui è possibile impostare un nome per il ruolo e selezionare i privilegi desiderati dal menu a discesa Privileges.

Per aggiungere un ruolo tramite la riga di comando, è possibile utilizzare lo strumento CLI pveum, ad esempio:

pveum role add VM_Power-only --privs "VM.PowerMgmt VM.Console"
pveum role add Sys_Power-only --privs "Sys.PowerMgmt Sys.Console"
Note I ruoli che iniziano con PVE sono sempre predefiniti; ai ruoli personalizzati non è consentito utilizzare questo prefisso riservato.

14.7.2. Privilegi

Un privilegio è il diritto di eseguire un'azione specifica. Per semplificare la gestione, gli elenchi di privilegi sono raggruppati in ruoli, che possono quindi essere utilizzati nella tabella dei permessi. Si noti che i privilegi non possono essere assegnati direttamente a utenti e percorsi senza far parte di un ruolo.

Attualmente sono supportati i seguenti privilegi:

Privilegi relativi a nodo / sistema
  • Group.Allocate: crea/modifica/rimuove gruppi

  • Mapping.Audit: visualizza le mappature delle risorse

  • Mapping.Modify: gestisce le mappature delle risorse

  • Mapping.Use: utilizza le mappature delle risorse

  • Permissions.Modify: modifica i permessi di accesso

  • Pool.Allocate: crea/modifica/rimuove un pool

  • Pool.Audit: visualizza un pool

  • Realm.AllocateUser: assegna un utente a un realm

  • Realm.Allocate: crea/modifica/rimuove realm di autenticazione

  • SDN.Allocate: gestire la configurazione SDN

  • SDN.Audit: visualizzare la configurazione SDN

  • Sys.Audit: visualizzare lo stato/la configurazione del nodo, la configurazione del cluster Corosync e la configurazione HA

  • Sys.Console: accesso alla console del nodo

  • Sys.Incoming: consente flussi di dati in ingresso da altri cluster (sperimentale)

  • Sys.Modify: creare/modificare/rimuovere i parametri di rete del nodo

  • Sys.PowerMgmt: gestione dell'alimentazione del nodo (avvio, arresto, reset, spegnimento, …)

  • Sys.Syslog: visualizzare il syslog

  • User.Modify: creare/modificare/rimuovere l'accesso e i dettagli degli utenti.

Privilegi relativi alle macchine virtuali
  • SDN.Use: accedere alle vnet SDN e ai bridge di rete locali

  • VM.Allocate: creare/rimuovere una VM su un server

  • VM.Audit: visualizzare la configurazione della VM

  • VM.Backup: backup/ripristino delle VM

  • VM.Clone: clonare/copiare una VM

  • VM.Config.CDROM: espellere/cambiare il CD-ROM

  • VM.Config.CPU: modificare le impostazioni della CPU

  • VM.Config.Cloudinit: modificare i parametri di Cloud-init

  • VM.Config.Disk: aggiungere/modificare/rimuovere dischi

  • VM.Config.HWType: modificare i tipi di hardware emulato

  • VM.Config.Memory: modificare le impostazioni della memoria

  • VM.Config.Network: aggiungere/modificare/rimuovere dispositivi di rete

  • VM.Config.Options: modificare qualsiasi altra configurazione della VM

  • VM.Console: accesso alla console della VM

  • VM.GuestAgent.Audit: esecuzione di comandi informativi tramite guest agent QEMU

  • VM.GuestAgent.FileRead: lettura di file dal guest tramite guest agent QEMU

  • VM.GuestAgent.FileSystemMgmt: blocco/sblocco e trim dei file system tramite guest agent QEMU

  • VM.GuestAgent.FileWrite: scrittura di file nel guest tramite guest agent QEMU

  • VM.GuestAgent.Unrestricted: esecuzione di comandi arbitrari tramite guest agent QEMU

  • VM.Migrate: migrazione della VM verso un altro server del cluster

  • VM.PowerMgmt: gestione dell'alimentazione (avvio, arresto, reset, spegnimento, …)

  • VM.Replicate: configurazione ed esecuzione della replica del guest

  • VM.Snapshot.Rollback: rollback della VM a uno dei suoi snapshot

  • VM.Snapshot: creazione/eliminazione di snapshot della VM

Privilegi relativi allo storage
  • Datastore.Allocate: creazione/modifica/rimozione di un datastore ed eliminazione di volumi

  • Datastore.AllocateSpace: allocazione di spazio su un datastore

  • Datastore.AllocateTemplate: allocazione/caricamento di template e immagini ISO

  • Datastore.Audit: visualizzazione/esplorazione di un datastore

Warning Sia Permissions.Modify che Sys.Modify devono essere gestiti con attenzione, poiché consentono di modificare aspetti del sistema e della sua configurazione pericolosi o sensibili.
Warning Leggere attentamente la sezione seguente sull'ereditarietà per comprendere come i ruoli assegnati (e i relativi privilegi) vengano propagati lungo l'albero ACL.

14.7.3. Oggetti e percorsi

I permessi di accesso sono assegnati a oggetti, come macchine virtuali, storage o pool di risorse. Vengono utilizzati percorsi simili a quelli dei file system per indirizzare questi oggetti. Questi percorsi formano un albero naturale e i permessi dei livelli superiori (percorsi più brevi) possono opzionalmente essere propagati verso il basso all'interno di questa gerarchia.

I percorsi possono essere basati su template. Quando una chiamata API richiede permessi su un percorso con template, il percorso può contenere riferimenti ai parametri della chiamata API. Questi riferimenti sono specificati tra parentesi graffe. Alcuni parametri vengono implicitamente ricavati dall'URI della chiamata API. Ad esempio, il percorso di permesso /nodes/{node} quando si richiama /nodes/mynode/status richiede permessi su /nodes/mynode, mentre il percorso {path} in una richiesta PUT a /access/acl si riferisce al parametro path del metodo.

Alcuni esempi sono:

  • /nodes/{node}: accesso alle macchine server Proxmox VE

  • /vms: copre tutte le VM

  • /vms/{vmid}: accesso a VM specifiche

  • /storage/{storeid}: accesso a uno storage specifico

  • /pool/{poolname}: accesso alle risorse contenute in un pool specifico

  • /access/groups: amministrazione dei gruppi

  • /access/realms/{realmid}: accesso amministrativo ai realm

Ereditarietà

Come accennato in precedenza, i percorsi degli oggetti formano un albero simile a un file system e i permessi possono essere ereditati dagli oggetti posizionati più in basso in tale albero (il flag propagate è impostato per impostazione predefinita). Si applicano le seguenti regole di ereditarietà:

  • I permessi per singoli utenti sostituiscono sempre i permessi di gruppo.

  • I permessi per i gruppi si applicano quando l'utente è membro di quel gruppo.

  • I permessi ai livelli più profondi sostituiscono quelli ereditati da un livello superiore.

  • NoAccess annulla tutti gli altri ruoli su un dato percorso.

Inoltre, i token con privilegi separati non possono mai disporre, su un determinato percorso, di permessi che l'utente associato non possiede.

14.7.4. Pool

I pool possono essere utilizzati per raggruppare un insieme di macchine virtuali e datastore. È quindi possibile impostare semplicemente i permessi sui pool (/pool/{poolid}), che vengono ereditati da tutti i membri del pool. Questo è un ottimo modo per semplificare il controllo degli accessi.

14.7.5. Quali permessi sono necessari?

I permessi API richiesti sono documentati per ciascun singolo metodo e sono disponibili all'indirizzo https://pve.proxmox.com/pve-docs/api-viewer/.

I permessi sono specificati come un elenco, che può essere interpretato come un albero di funzioni logiche e di verifica degli accessi:

["and", <subtests>...] e ["or", <subtests>...]

Ogni (and) o uno qualsiasi (or) degli ulteriori elementi nell'elenco corrente deve essere vero.

["perm", <path>, [ <privileges>... ], <options>...]

path è un parametro basato su template (vedere Oggetti e percorsi). Tutti i privilegi elencati (o almeno uno, se viene utilizzata l'opzione any) devono essere consentiti sul percorso specificato. Se viene specificata un'opzione require-param, il parametro da essa indicato è obbligatorio anche se lo schema della chiamata API lo elenca altrimenti come opzionale.

["userid-group", [ <privileges>... ], <options>...]

Il chiamante deve disporre di uno qualsiasi dei privilegi elencati su /access/groups. Esistono inoltre due possibili verifiche, in base al fatto che l'opzione groups_param sia impostata o meno:

  • groups_param impostato: la chiamata API ha un parametro groups non opzionale e il chiamante deve disporre di uno qualsiasi dei privilegi elencati su tutti i gruppi indicati.

  • groups_param non impostato: l'utente indicato tramite il parametro userid deve esistere e far parte di un gruppo su cui il chiamante dispone di uno qualsiasi dei privilegi elencati (tramite il percorso /access/groups/<group>).

["userid-param", "self"]

Il valore fornito per il parametro userid della chiamata API deve riferirsi all'utente che esegue l'azione (di solito in combinazione con or, per consentire agli utenti di eseguire un'azione su se stessi, anche se non dispongono di privilegi elevati).

["userid-param", "Realm.AllocateUser"]

L'utente necessita dell'accesso Realm.AllocateUser a /access/realm/<realm>, dove <realm> si riferisce al realm dell'utente indicato tramite il parametro userid. Da notare che l'utente non deve necessariamente esistere per essere associato a un realm, poiché gli ID utente vengono passati nella forma <username>@<realm>.

["perm-modify", <path>]

path è un parametro basato su template (vedere Oggetti e percorsi). L'utente necessita del privilegio Permissions.Modify oppure, in base al percorso, dei seguenti privilegi come possibile sostituto:

  • /storage/...: richiede 'Datastore.Allocate`

  • /vms/...: richiede 'VM.Allocate`

  • /pool/...: richiede 'Pool.Allocate`

    Se il percorso è vuoto, è richiesto Permissions.Modify su /access.

    Se l'utente non dispone del privilegio Permissions.Modify, può delegare solo sottoinsiemi dei propri privilegi sul percorso indicato (ad es., un utente con PVEVMAdmin potrebbe assegnare PVEVMUser, ma non PVEAdmin).

14.8. Strumento da riga di comando

La maggior parte degli utenti utilizzerà semplicemente la GUI per gestire gli utenti. Esiste tuttavia anche uno strumento da riga di comando completo chiamato pveum (abbreviazione di "Proxmox VE User Manager"). Da notare che tutti gli strumenti da riga di comando di Proxmox VE sono wrapper attorno all'API, pertanto è possibile accedere a tali funzioni anche tramite l'API REST.

Di seguito alcuni semplici esempi di utilizzo. Per visualizzare l'help, digitare:

 pveum

oppure (per visualizzare l'help dettagliato su un comando specifico)

 pveum help user add

Creare un nuovo utente:

 pveum user add testuser@pve -comment "Just a test"

Impostare o modificare la password (non tutti i realm lo supportano):

 pveum passwd testuser@pve

Disabilitare un utente:

 pveum user modify testuser@pve -enable 0

Creare un nuovo gruppo:

 pveum group add testgroup

Creare un nuovo ruolo:

 pveum role add PVE_Power-only -privs "VM.PowerMgmt VM.Console"

14.9. Esempi dal mondo reale

14.9.1. Gruppo amministratori

È possibile che un amministratore voglia creare un gruppo di utenti con diritti di amministratore completi (senza utilizzare l'account root).

Per fare ciò, definire innanzitutto il gruppo:

 pveum group add admin -comment "System Administrators"

Quindi assegnare il ruolo:

 pveum acl modify / -group admin -role Administrator

Infine, è possibile aggiungere utenti al nuovo gruppo admin:

 pveum user modify testuser@pve -group admin

14.9.2. Revisori

È possibile concedere agli utenti l'accesso in sola lettura assegnando il ruolo PVEAuditor a utenti o gruppi.

Esempio 1: consentire all'utente joe@pve di vedere tutto

 pveum acl modify / -user joe@pve -role PVEAuditor

Esempio 2: consentire all'utente joe@pve di vedere tutte le macchine virtuali

 pveum acl modify /vms -user joe@pve -role PVEAuditor

14.9.3. Delega della gestione utenti

Per delegare la gestione degli utenti all'utente joe@pve, è possibile farlo con:

 pveum acl modify /access -user joe@pve -role PVEUserAdmin

L'utente joe@pve può ora aggiungere e rimuovere utenti e modificare altri attributi utente, come le password. Si tratta di un ruolo molto potente, che si consiglia di limitare a realm e gruppi selezionati. L'esempio seguente consente a joe@pve di modificare gli utenti all'interno del realm pve, se questi sono membri del gruppo customers:

 pveum acl modify /access/realm/pve -user joe@pve -role PVEUserAdmin
 pveum acl modify /access/groups/customers -user joe@pve -role PVEUserAdmin
Note L'utente è in grado di aggiungere altri utenti, ma solo se sono membri del gruppo customers e all'interno del realm pve.

14.9.4. Token API limitato per il monitoraggio

I permessi sui token API sono sempre un sottoinsieme di quelli dell'utente corrispondente, il che significa che un token API non può essere utilizzato per eseguire un'operazione che l'utente sottostante non è autorizzato a eseguire. Questa sezione mostrerà come utilizzare un token API con permessi separati, per limitare ulteriormente i permessi del proprietario del token.

Assegnare all'utente joe@pve il ruolo PVEVMAdmin su tutte le VM:

 pveum acl modify /vms -user joe@pve -role PVEVMAdmin

Aggiungere un nuovo token API con permessi separati, autorizzato solo a visualizzare le informazioni sulle VM (ad esempio, per scopi di monitoraggio):

 pveum user token add joe@pve monitoring -privsep 1
 pveum acl modify /vms -token 'joe@pve!monitoring' -role PVEAuditor

Verificare i permessi dell'utente e del token:

 pveum user permissions joe@pve
 pveum user token permissions joe@pve monitoring

14.9.5. Pool di risorse

Un'azienda è generalmente strutturata in diversi reparti più piccoli ed è comune voler assegnare risorse e delegare attività di gestione a ciascuno di essi. Si supponga di voler configurare un pool per un reparto di sviluppo software. Per prima cosa, creare un gruppo:

 pveum group add developers -comment "Our software developers"

Si crea quindi un nuovo utente membro di quel gruppo:

 pveum user add developer1@pve -group developers -password
Note Il parametro "-password" richiederà l'inserimento di una password

Si crea quindi un pool di risorse da utilizzare per il reparto di sviluppo:

 pveum pool add dev-pool --comment "IT development pool"

Infine, è possibile assegnare i permessi a tale pool:

 pveum acl modify /pool/dev-pool/ -group developers -role PVEAdmin

Gli sviluppatori software possono ora amministrare le risorse assegnate a quel pool.

15. Alta disponibilità

La società moderna dipende fortemente dalle informazioni fornite dai computer tramite la rete. I dispositivi mobili hanno amplificato questa dipendenza, poiché le persone possono accedere alla rete in qualsiasi momento e da qualsiasi luogo. Se si forniscono tali servizi, è molto importante che siano disponibili la maggior parte del tempo.

È possibile definire matematicamente la disponibilità come il rapporto tra (A), il tempo totale in cui un servizio è utilizzabile durante un determinato intervallo, e (B), la durata dell'intervallo. Viene normalmente espressa come percentuale di uptime in un dato anno.

Tabella 17. Disponibilità - Tempo di inattività per anno
Disponibilità % Downtime per anno

99

3,65 giorni

99.9

8,76 ore

99.99

52,56 minuti

99.999

5,26 minuti

99.9999

31,5 secondi

99.99999

3,15 secondi

Esistono diversi modi per aumentare la disponibilità. La soluzione più elegante è riscrivere il software, in modo da poterlo eseguire su più host contemporaneamente. Il software stesso deve disporre di un modo per rilevare gli errori ed eseguire il failover. Se si desidera servire solo pagine web di sola lettura, allora questo è relativamente semplice. Tuttavia, in genere è complesso e talvolta impossibile, poiché non è possibile modificare personalmente il software. Le soluzioni seguenti funzionano senza modificare il software:

  • Utilizzare componenti "server" affidabili

    Note Componenti informatici con la stessa funzionalità possono avere livelli di affidabilità variabili, a seconda della qualità del componente. La maggior parte dei fornitori vende componenti con maggiore affidabilità come componenti "server" - generalmente a un prezzo più elevato.
  • Eliminare il singolo punto di guasto (componenti ridondanti)

    • utilizzare un gruppo di continuità (UPS)

    • utilizzare alimentatori ridondanti nei server

    • utilizzare RAM ECC

    • utilizzare hardware di rete ridondante

    • utilizzare RAID per lo storage locale

    • utilizzare storage distribuito e ridondante per i dati delle VM

  • Ridurre il downtime

    • amministratori rapidamente raggiungibili (24/7)

    • disponibilità di parti di ricambio (altri nodi in un cluster Proxmox VE)

    • rilevamento automatico degli errori (fornito da ha-manager)

    • failover automatico (fornito da ha-manager)

Gli ambienti di virtualizzazione come Proxmox VE rendono molto più semplice raggiungere l'alta disponibilità poiché eliminano la dipendenza dall'"hardware". Supportano inoltre la configurazione e l'uso di dispositivi di storage e di rete ridondanti, così, se un host si guasta, è possibile semplicemente avviare quei servizi su un altro host all'interno del cluster.

Ancora meglio, Proxmox VE fornisce uno stack software chiamato ha-manager, che può farlo automaticamente. È in grado di rilevare automaticamente gli errori ed eseguire il failover automatico.

L'ha-manager di Proxmox VE funziona come un amministratore "automatizzato". Innanzitutto, si configura quali risorse (VM, container, …) deve gestire. Poi, ha-manager osserva il corretto funzionamento e gestisce il failover del servizio verso un altro nodo in caso di errori. ha-manager può anche gestire le normali richieste dell'utente, che possono avviare, arrestare, spostare e migrare un servizio.

Ma l'alta disponibilità ha un costo. I componenti di alta qualità sono più costosi e renderli ridondanti raddoppia almeno i costi. Le parti di ricambio aggiuntive aumentano ulteriormente i costi. Pertanto è necessario valutare attentamente i benefici e confrontarli con questi costi aggiuntivi.

Tip Aumentare la disponibilità dal 99% al 99,9% è relativamente semplice. Ma aumentare la disponibilità dal 99,9999% al 99,99999% è molto difficile e costoso. ha-manager ha tempi tipici di rilevamento degli errori e di failover di circa 2 minuti, quindi non è possibile ottenere più del 99,999% di disponibilità.

15.1. Requisiti

Prima di iniziare con l'HA è necessario soddisfare i seguenti requisiti:

  • almeno tre nodi del cluster (per ottenere un quorum affidabile)

  • storage condiviso per VM e container

  • ridondanza hardware (ovunque)

  • utilizzare componenti "server" affidabili

Opzionalmente, è possibile utilizzare un watchdog hardware - se non disponibile, viene utilizzato come fallback il watchdog software del kernel Linux (softdog).

15.2. Risorse

L'unità di gestione primaria dell'HA Manager è chiamata risorsa HA (o "servizio HA"). Attualmente, una risorsa HA può essere una macchina virtuale (VM) o un container Linux (CT).

Ogni risorsa HA è identificata in modo univoco da un ID di servizio (sid), che è costituito dal tipo di risorsa e da un ID specifico per il tipo, che è il VMID per VM e container. Ad esempio, per la VM con VMID 100, l'ID di servizio è vm:100.

Una risorsa HA può essere eseguita solo su nodi in cui tutte le sue dipendenze sono disponibili. Per impostazione predefinita, l'HA Manager considera idoneo ogni nodo del cluster. Per mantenere questa impostazione predefinita, una VM o un container dovrebbe:

  • utilizzare opzioni compatibili con tutti i nodi del cluster

  • utilizzare solo storage condiviso accessibile da tutti i nodi del cluster

  • utilizzare solo interfacce di rete presenti su tutti i nodi del cluster

  • utilizzare solo passthrough di dispositivi presenti su tutti i nodi del cluster

Se una di queste dipendenze è disponibile solo su un sottoinsieme di nodi, limitare la risorsa HA a tale sottoinsieme con una regola di affinità del nodo rigorosa. L'HA Manager limita quindi il posizionamento, il ripristino e la migrazione ai nodi della regola.

15.3. Attività di gestione

Questa sezione fornisce una breve panoramica delle attività di gestione comuni. Il primo passaggio consiste nell'abilitare l'HA per una risorsa. Questo si effettua aggiungendo la risorsa alla configurazione delle risorse HA. È possibile farlo tramite la GUI, oppure semplicemente utilizzando lo strumento a riga di comando, ad esempio:

# ha-manager add vm:100

Lo stack HA ora tenta di avviare le risorse e di mantenerle in esecuzione. Si noti che è possibile configurare lo stato "richiesto" delle risorse. Ad esempio, si potrebbe voler far arrestare la risorsa allo stack HA:

# ha-manager set vm:100 --state stopped

e riavviarla in seguito:

# ha-manager set vm:100 --state started

È anche possibile utilizzare i normali comandi di gestione di VM e container. Questi inoltrano automaticamente i comandi allo stack HA, quindi

# qm start 100

imposta semplicemente lo stato richiesto su started. Lo stesso vale per qm stop, che imposta lo stato richiesto su stopped.

Note Lo stack HA funziona in modo completamente asincrono e deve comunicare con gli altri membri del cluster. Pertanto, occorrono alcuni secondi prima di vedere il risultato di tali azioni.

Per visualizzare la configurazione attuale delle risorse HA utilizzare:

# ha-manager config
vm:100
        state stopped

Ed è possibile visualizzare lo stato effettivo dell'HA manager e delle risorse con:

# ha-manager status
quorum OK
master node1 (active, Wed Nov 23 11:07:23 2016)
lrm elsa (active, Wed Nov 23 11:07:19 2016)
service vm:100 (node1, started)

È anche possibile avviare la migrazione delle risorse verso altri nodi:

# ha-manager migrate vm:100 node2

Questo utilizza la migrazione online e tenta di mantenere la VM in esecuzione. La migrazione online richiede il trasferimento di tutta la memoria utilizzata sulla rete, quindi a volte è più rapido arrestare la VM e poi riavviarla sul nuovo nodo. Questo può essere effettuato utilizzando il comando relocate:

# ha-manager relocate vm:100 node2

Infine, è possibile rimuovere la risorsa dalla configurazione HA utilizzando il seguente comando:

# ha-manager remove vm:100

Per impostazione predefinita, questa operazione rimuoverà anche la risorsa da qualsiasi regola che vi fa riferimento ed eliminerà le regole che fanno riferimento esclusivamente a questa risorsa. È possibile modificare questo comportamento utilizzando --purge 0.

Note Questo non avvia né arresta la risorsa.

Ma tutte le attività relative all'HA possono essere eseguite nella GUI, quindi non è necessario utilizzare affatto la riga di comando.

15.4. Come funziona

Questa sezione fornisce una descrizione dettagliata degli aspetti interni del gestore HA di Proxmox VE. Descrive tutti i daemon coinvolti e come lavorano insieme. Per fornire l'HA, su ogni nodo vengono eseguiti due daemon:

pve-ha-lrm

Il local resource manager (LRM), che controlla i servizi in esecuzione sul nodo locale. Legge gli stati richiesti per i suoi servizi dal file di stato corrente del manager ed esegue i relativi comandi.

pve-ha-crm

Il cluster resource manager (CRM), che prende le decisioni a livello di cluster. Invia comandi all'LRM, elabora i risultati e sposta le risorse su altri nodi in caso di errore. Il CRM gestisce anche il fencing dei nodi.

Note
Lock nell'LRM e nel CRM
I lock sono forniti dal nostro file system di configurazione distribuito (pmxcfs). Vengono utilizzati per garantire che ciascun LRM sia attivo in una sola istanza e funzionante. Poiché un LRM esegue azioni solo quando detiene il proprio lock, è possibile contrassegnare un nodo guasto come sottoposto a fencing se è possibile acquisirne il lock. Ciò consente quindi di ripristinare in modo sicuro eventuali servizi HA guasti, senza alcuna interferenza da parte del nodo guasto, il cui stato è ora sconosciuto. Tutto ciò viene supervisionato dal CRM che attualmente detiene il lock master del manager.

15.4.1. Stati del servizio

Il CRM utilizza un'enumerazione degli stati del servizio per registrare lo stato corrente del servizio. Questo stato viene visualizzato nella GUI e può essere interrogato utilizzando lo strumento a riga di comando ha-manager:

# ha-manager status
quorum OK
master elsa (active, Mon Nov 21 07:23:29 2016)
lrm elsa (active, Mon Nov 21 07:23:22 2016)
service ct:100 (elsa, stopped)
service ct:102 (elsa, started)
service vm:501 (elsa, started)

Di seguito l'elenco degli stati possibili:

stopped

Il servizio è fermato (confermato dall'LRM). Se l'LRM rileva che un servizio fermato è ancora in esecuzione, lo fermerà di nuovo.

request_stop

Il servizio deve essere fermato. Il CRM attende la conferma dall'LRM.

stopping

Richiesta di arresto in sospeso. Ma il CRM non ha ancora ricevuto la richiesta.

started

Il servizio è attivo e l'LRM dovrebbe avviarlo al più presto se non è già in esecuzione. Se il servizio si guasta e viene rilevato come non in esecuzione, l'LRM lo riavvia (vedere Policy di errore di avvio).

starting

Richiesta di avvio in sospeso. Ma il CRM non ha ancora ricevuto alcuna conferma dall'LRM che il servizio sia in esecuzione.

fence

In attesa del fencing del nodo poiché il nodo del servizio non si trova all'interno della partizione quorata del cluster (vedere Fencing). Non appena il nodo viene sottoposto a fencing con successo, il servizio verrà posto nello stato di recovery.

recovery

In attesa del recovery del servizio. Il gestore HA cerca di trovare un nuovo nodo su cui il servizio possa essere eseguito. Questa ricerca dipende dall'elenco dei nodi online e quorati, così come dalle regole di affinità di cui il servizio fa parte, se presenti. Non appena viene trovato un nuovo nodo disponibile, il servizio verrà spostato lì e posto inizialmente nello stato stopped. Se è configurato per essere eseguito, il nuovo nodo lo farà.

freeze

Non modificare lo stato del servizio. Questo stato viene utilizzato durante il riavvio di un nodo, o quando si riavvia il daemon LRM (vedere Aggiornamenti dei package).

ignored

Si comporta come se il servizio non fosse affatto gestito dall'HA. Utile quando si desidera temporaneamente il pieno controllo sul servizio, senza rimuoverlo dalla configurazione HA.

migrate

Migrazione del servizio (live) verso un altro nodo.

error

Il servizio è disabilitato a causa di errori dell'LRM. È necessario un intervento manuale (vedere Ripristino dagli errori).

queued

Il servizio è stato appena aggiunto e il CRM non l'ha ancora rilevato.

disabled

Il servizio è fermato e contrassegnato come disabled

15.4.2. Local resource manager

Il local resource manager (pve-ha-lrm) viene avviato come daemon all'avvio del sistema e attende finché il cluster HA non è quorato e quindi i lock a livello di cluster non sono funzionanti.

Può trovarsi in tre stati:

in attesa del lock dell'agent

L'LRM attende il nostro lock esclusivo. Questo viene utilizzato anche come stato di inattività se non è configurato alcun servizio.

attivo

L'LRM mantiene il proprio lock esclusivo e ha servizi configurati.

lock dell'agente perso

L'LRM ha perso il proprio lock, il che significa che si è verificato un errore e il quorum è stato perso.

Dopo che l'LRM passa allo stato attivo, legge il file di stato del manager in /etc/pve/ha/manager_status e determina i comandi che deve eseguire per i servizi di cui è responsabile. Per ogni comando viene avviato un worker; questi worker vengono eseguiti in parallelo e sono limitati a un massimo di 4 per impostazione predefinita. Questa impostazione predefinita può essere modificata tramite la chiave di configurazione del datacenter max_worker. Al termine, il processo worker viene raccolto e il suo risultato salvato per il CRM.

Note
Suggerimenti per la regolazione del numero massimo di worker concorrenti
Il valore predefinito di massimo 4 worker concorrenti potrebbe non essere adatto a una configurazione specifica. Ad esempio, possono verificarsi 4 live migration contemporaneamente, il che può causare congestioni di rete con reti più lente e/o servizi di grandi dimensioni (in termini di memoria). È inoltre opportuno garantire che, nel caso peggiore, la congestione sia minima, anche se ciò comporta l'abbassamento del valore di max_worker. Al contrario, in presenza di una configurazione particolarmente potente e di fascia alta, è possibile anche aumentarlo.

Ogni comando richiesto dal CRM è identificabile in modo univoco tramite un UID. Quando il worker termina, il suo risultato viene elaborato e scritto nel file di stato dell'LRM /etc/pve/nodes/<nodename>/lrm_status. Da lì il CRM può raccoglierlo e far agire la propria macchina a stati in base all'output dei comandi.

Le azioni su ciascun servizio tra CRM e LRM sono normalmente sempre sincronizzate. Ciò significa che il CRM richiede uno stato identificato in modo univoco da un UID, e l'LRM esegue quindi questa azione una sola volta scrivendo il risultato, identificabile a sua volta dallo stesso UID. Questo è necessario affinché l'LRM non esegua un comando non più aggiornato. Le uniche eccezioni a questo comportamento sono i comandi stop ed error; questi due non dipendono dal risultato prodotto e vengono eseguiti sempre nel caso dello stato stopped e una volta nel caso dello stato error.

Note
Leggere i log
Lo stack HA registra ogni azione che compie. Questo aiuta a capire cosa succede nel cluster e anche perché. In questo caso è importante osservare cosa hanno fatto entrambi i demoni, l'LRM e il CRM. È possibile utilizzare journalctl -u pve-ha-lrm sul nodo (o sui nodi) in cui si trova il servizio e lo stesso comando per pve-ha-crm sul nodo che è l'attuale master.

15.4.3. Gestore delle risorse del cluster

Il cluster resource manager (pve-ha-crm) si avvia su ogni nodo e attende lì il lock del manager, che può essere mantenuto da un solo nodo alla volta. Il nodo che riesce ad acquisire il lock del manager viene promosso a CRM master.

Può trovarsi in tre stati:

in attesa del lock dell'agent

Il CRM attende il nostro lock esclusivo. Questo viene utilizzato anche come stato di inattività se non è configurato alcun servizio

attivo

Il CRM mantiene il proprio lock esclusivo e ha servizi configurati

Lock dell'agente perso

Il CRM ha perso il proprio lock, il che significa che si è verificato un errore e il quorum è stato perso.

Il suo compito principale è gestire i servizi configurati per essere ad alta disponibilità e cercare di imporre sempre lo stato richiesto. Ad esempio, un servizio con stato richiesto started verrà avviato se non è già in esecuzione. Se si blocca, verrà riavviato automaticamente. Il CRM determina quindi le azioni che l'LRM deve eseguire.

Quando un nodo lascia il quorum del cluster, il suo stato passa a sconosciuto. Se il CRM attuale riesce quindi ad acquisire il lock del nodo guasto, i servizi verranno sottratti e riavviati su un altro nodo.

Quando un membro del cluster determina di non essere più nel quorum del cluster, l'LRM attende che si formi un nuovo quorum. Fino a quando non c'è un quorum del cluster, il nodo non può resettare il watchdog. Se sul nodo sono presenti servizi attivi, oppure se il processo LRM o CRM non viene pianificato o viene terminato, questo provocherà un riavvio dopo lo scadere del timeout del watchdog (ciò avviene dopo 60 secondi).

Da notare che se un nodo ha un CRM attivo ma l'LRM è inattivo, una perdita del quorum non provocherà un reset di self-fence. Il motivo è che tutti i file di stato e le configurazioni a cui accede il CRM sono gestiti dal file system di configurazione in cluster, che diventa di sola lettura in caso di perdita del quorum. Ciò significa che il CRM deve solo proteggersi dal fatto che il proprio processo venga pianificato per troppo tempo, nel qual caso un altro CRM potrebbe subentrare senza essere consapevole della situazione, causando la corruzione dello stato HA. Il watchdog aperto garantisce che ciò non possa accadere.

Se non è configurato alcun servizio per più di 15 minuti, il CRM ritorna automaticamente allo stato di inattività e chiude completamente il watchdog.

15.5. Simulatore HA

screenshot/gui-ha-manager-status.png

Utilizzando il simulatore HA è possibile testare e apprendere tutte le funzionalità delle soluzioni HA di Proxmox VE.

Per impostazione predefinita, il simulatore consente di osservare e testare il comportamento di un cluster reale a 3 nodi con 6 VM. È inoltre possibile aggiungere o rimuovere ulteriori VM o Container.

Non è necessario impostare o configurare un cluster reale, il simulatore HA funziona immediatamente, senza configurazioni aggiuntive.

Installazione con apt:

apt install pve-ha-simulator

È possibile installare il package su qualsiasi sistema basato su Debian anche senza altri package di Proxmox VE. Per farlo è necessario scaricare il package e copiarlo sul sistema su cui si desidera installarlo. Quando si installa il package con apt dal file system locale, verranno risolte automaticamente le dipendenze richieste.

Per avviare il simulatore su una macchina remota è necessario disporre di un reindirizzamento X11 verso il sistema corrente.

Su una macchina Linux è possibile utilizzare:

ssh root@<IPofPVE> -Y

Su Windows funziona con mobaxterm.

Dopo essersi connessi a un Proxmox VE esistente con il simulatore installato, oppure dopo averlo installato manualmente sul proprio sistema locale basato su Debian, è possibile provarlo come segue.

Prima è necessario creare una directory di lavoro in cui il simulatore salva il suo stato corrente e scrive la configurazione predefinita:

mkdir working

Quindi, è sufficiente passare la directory creata come parametro a pve-ha-simulator:

pve-ha-simulator working/

È quindi possibile avviare, interrompere, migrare i servizi HA simulati, o anche verificare cosa accade in caso di guasto di un nodo.

15.6. Configurazione

Lo stack HA è ben integrato nell'API di Proxmox VE. Quindi, ad esempio, l'HA può essere configurata tramite l'interfaccia a riga di comando ha-manager, o tramite l'interfaccia web di Proxmox VE - entrambe le interfacce forniscono un modo semplice per gestire l'HA. Gli strumenti di automazione possono utilizzare direttamente l'API.

Tutti i file di configurazione HA si trovano in /etc/pve/ha/, quindi vengono distribuiti automaticamente ai nodi del cluster, e tutti i nodi condividono la stessa configurazione HA.

15.6.1. Risorse

screenshot/gui-ha-manager-status.png

Il file di configurazione delle risorse /etc/pve/ha/resources.cfg memorizza l'elenco delle risorse gestite da ha-manager. Una configurazione di risorsa all'interno di tale elenco ha il seguente aspetto:

<type>: <name>
        <property> <value>
        ...

Inizia con un tipo di risorsa seguito da un nome specifico della risorsa, separati da due punti. Insieme formano l'ID risorsa HA, che viene utilizzato da tutti i comandi di ha-manager per identificare univocamente una risorsa (esempio: vm:100 o ct:101). Le righe successive contengono proprietà aggiuntive:

auto-rebalance: <boolean> (default = 1)

La risorsa HA può essere migrata durante il ribilanciamento automatico

comment: <string>

Descrizione.

failback: <boolean> (default = 1)

Migrare automaticamente la risorsa HA verso il nodo con la priorità più alta secondo le relative regole di affinità dei nodi, se un nodo con priorità più alta rispetto al nodo corrente diventa online.

group: <string>

L'identificatore del gruppo HA.

max_relocate: <integer> (0 - N) (default = 1)

Numero massimo di tentativi di rilocazione della risorsa quando l'avvio di una risorsa non riesce.

max_restart: <integer> (0 - N) (default = 1)

Numero massimo di tentativi di riavvio della risorsa su un nodo dopo che il suo avvio non è riuscito. Una volta raggiunto, l'HA manager tenterà di rilocare la risorsa su un nodo idoneo.

state: <disabled | enabled | ignored | started | stopped> (default = started)

Stato della risorsa richiesto. Il CRM legge questo stato e agisce di conseguenza. Si noti che enabled è semplicemente un alias di started.

started

Il CRM tenta di avviare la risorsa. Lo stato del servizio viene impostato su started dopo un avvio riuscito. In caso di guasti del nodo, o quando l'avvio non riesce, tenta di ripristinare la risorsa. Se tutto fallisce, lo stato del servizio viene impostato su error.

stopped

Il CRM tenta di mantenere la risorsa nello stato stopped, ma tenta comunque di rilocare le risorse in caso di guasti del nodo.

disabled

Il CRM tenta di impostare la risorsa nello stato stopped, ma non tenta di rilocare le risorse in caso di guasti del nodo. Lo scopo principale di questo stato è il ripristino da errori, poiché è l'unico modo per spostare una risorsa fuori dallo stato error.

ignored

La risorsa viene rimossa dallo stato del manager e quindi il CRM e l'LRM non toccano più la risorsa. Tutte le chiamate API di {pve} che interessano questa risorsa verranno eseguite, bypassando direttamente lo stack HA. I comandi CRM verranno scartati mentre la risorsa è in questo stato. La risorsa non verrà rilocata in caso di guasti del nodo.

Ecco un esempio reale con una VM e un container. Come si può vedere, la sintassi di questi file è davvero semplice, quindi è anche possibile leggere o modificare questi file utilizzando il proprio editor preferito:

Configuration Example (/etc/pve/ha/resources.cfg)
vm: 501
    state started
    max_relocate 2

ct: 102
    # Note: use default settings for everything
screenshot/gui-ha-manager-add-resource.png

La configurazione precedente è stata generata utilizzando lo strumento a riga di comando ha-manager:

# ha-manager add vm:501 --state started --max_relocate 2
# ha-manager add ct:102

15.6.2. Gruppi

Note I gruppi HA sono deprecati e migrati verso le regole di affinità dei nodi HA a partire da Proxmox VE 9.0.
screenshot/gui-ha-manager-groups-view.png

Il file di configurazione dei gruppi HA /etc/pve/ha/groups.cfg viene utilizzato per definire gruppi di nodi del cluster. Una risorsa può essere limitata a essere eseguita solo sui membri di tale gruppo. Una configurazione di gruppo è simile a questa:

group: <group>
       nodes <node_list>
       <property> <value>
       ...
comment: <string>

Descrizione.

nodes: <node>[:<pri>]{,<node>[:<pri>]}*

Elenco dei nodi membri del cluster, a ciascuno dei quali può essere assegnata una priorità. Una risorsa verrà eseguita sui nodi disponibili con la priorità più alta. Se sono presenti più nodi nella classe di priorità più alta, le risorse verranno distribuite tra tali nodi. Le priorità hanno un significato solo relativo. Più alto è il numero, più alta è la priorità.

nofailback: <boolean> (predefinito = 0)

Il CRM tenta di eseguire i servizi sul nodo con la priorità più alta. Se un nodo con priorità più alta torna online, il CRM migra il servizio su quel nodo. Abilitare nofailback impedisce questo comportamento.

restricted: <boolean> (predefinito = 0)

Le risorse associate a gruppi con restrizioni possono essere eseguite solo sui nodi definiti dal gruppo. La risorsa verrà posta nello stato di arresto se nessun nodo membro del gruppo è online. Le risorse associate a gruppi senza restrizioni possono essere eseguite su qualsiasi nodo del cluster se tutti i membri del gruppo sono offline, ma verranno migrate nuovamente su un nodo del gruppo non appena un membro del gruppo torna online. È possibile implementare un comportamento di nodo preferito utilizzando un gruppo senza restrizioni con un solo membro.

screenshot/gui-ha-manager-add-group.png

Un requisito comune è che una risorsa debba essere eseguita su un nodo specifico. Solitamente la risorsa può essere eseguita su altri nodi, quindi è possibile definire un gruppo senza restrizioni con un singolo membro:

# ha-manager groupadd prefer_node1 --nodes node1

Per cluster più grandi, ha senso definire un comportamento di failover più dettagliato. Ad esempio, può essere utile eseguire un insieme di servizi su node1 se possibile. Se node1 non è disponibile, tali servizi devono essere eseguiti in modo equamente distribuito su node2 e node3. Se anche questi nodi non sono disponibili, i servizi devono essere eseguiti su node4. Per ottenere questo risultato è possibile impostare l'elenco dei nodi come segue:

# ha-manager groupadd mygroup1 -nodes "node1:2,node2:1,node3:1,node4"

Un altro caso d'uso si verifica quando una risorsa utilizza altre risorse disponibili solo su nodi specifici, ad esempio node1 e node2. È necessario assicurarsi che il gestore HA non utilizzi altri nodi, quindi è necessario creare un gruppo con restrizioni contenente tali nodi:

# ha-manager groupadd mygroup2 -nodes "node1,node2" -restricted

I comandi precedenti hanno creato il seguente file di configurazione del gruppo:

Configuration Example (/etc/pve/ha/groups.cfg)
group: prefer_node1
       nodes node1

group: mygroup1
       nodes node2:1,node4,node1:2,node3:1

group: mygroup2
       nodes node2,node1
       restricted 1

L'opzione nofailback è utile principalmente per evitare spostamenti indesiderati delle risorse durante le attività di amministrazione. Ad esempio, se è necessario migrare un servizio su un nodo che non ha la priorità più alta nel gruppo, è necessario indicare al gestore HA di non riportare immediatamente questo servizio sul nodo precedente impostando l'opzione nofailback.

Un altro scenario si verifica quando un servizio è stato isolato (fenced) ed è stato recuperato su un altro nodo. L'amministratore tenta di riparare il nodo isolato e lo riporta online per analizzare la causa del guasto e verificare se funziona di nuovo in modo stabile. Impostare il flag nofailback impedisce ai servizi recuperati di tornare immediatamente al nodo isolato.

15.6.3. Regole

Le regole HA vengono utilizzate per applicare determinati vincoli alle risorse gestite da HA, che sono definite nel file di configurazione delle regole HA /etc/pve/ha/rules.cfg.

<type>: <rule>
        resources <resources_list>
        <property> <value>
        ...
comment: <string>

Descrizione della regola HA.

disable: <boolean>

Indica se la regola HA è disabilitata.

resources: <type>:<name>{,<type>:<name>}*

Elenco di ID delle risorse HA. Consiste in un elenco di tipi di risorsa seguiti da un nome specifico della risorsa separato da due punti (esempio: vm:100,ct:101).

Tabella 18. Tipi di regola HA disponibili
Tipo di regola HA Descrizione

node-affinity

Stabilisce un'affinità tra una o più risorse HA e uno o più nodi.

L'affinità positive specifica che le risorse HA dovrebbero o devono essere mantenute su uno dei nodi specificati, mentre l'affinità negative specifica che le risorse HA dovrebbero o devono evitare i nodi specificati.

L'attributo di rigidità strict specifica se si tratta di un vincolo debole ("dovrebbe") oppure di un vincolo rigido ("deve").

resource-affinity

Definisce l'affinità tra due o più risorse HA.

L'affinità positive specifica che le risorse HA devono essere mantenute sullo stesso nodo, mentre l'affinità negative specifica che le risorse HA devono essere mantenute su nodi separati.

Regole di affinità dei nodi

Per impostazione predefinita, una risorsa HA può essere eseguita su qualsiasi nodo del cluster, ma un requisito comune è che una risorsa HA debba essere eseguita su un nodo specifico. Ciò può essere implementato definendo una regola di affinità dei nodi HA per far preferire alla risorsa HA vm:100 il nodo node1:

# ha-manager rules add node-affinity ha-rule-vm100 --resources vm:100 --nodes node1

Per impostazione predefinita, le regole di affinità dei nodi non sono rigide (strict), ossia, se nessuno dei nodi specificati è disponibile, la risorsa HA può comunque essere spostata su altri nodi. Se, invece, una risorsa HA deve essere limitata ai nodi specificati, la regola di affinità dei nodi deve essere impostata come rigida.

Nell'esempio precedente, la regola di affinità dei nodi può essere modificata per limitare la risorsa vm:100 esclusivamente a node1:

# ha-manager rules set node-affinity ha-rule-vm100 --strict 1

Inoltre, le regole di affinità dei nodi utilizzano per impostazione predefinita l'affinità positiva, il che significa che i nodi del cluster preferiti devono essere specificati esplicitamente. Tuttavia, nei cluster più grandi, è spesso più pratico definire l'affinità dei nodi utilizzando un approccio di esclusione (opt-out) per evitare elenchi lunghi e prolissi di nodi del cluster. Ad esempio, il comando seguente definisce una regola di affinità dei nodi HA che fa evitare alle risorse HA ct:200 e vm:300 il nodo node3:

# ha-manager rules add node-affinity ha-rule-negative \
        --affinity negative --resources ct:200,vm:300 --nodes node3

Inoltre, casi d'uso specifici potrebbero richiedere la definizione di un comportamento di failover più dettagliato. Ad esempio, le risorse vm:400 e ct:500 dovrebbero essere eseguite su node1. Se node1 diventa non disponibile, le risorse dovrebbero essere distribuite su node2 e node3. Se anche node2 e node3 non sono disponibili, le risorse dovrebbero essere eseguite su node4.

Per implementare questo comportamento in una regola di affinità dei nodi, è possibile associare ai nodi delle priorità per stabilire l'ordine di preferenza dei nodi. Se due o più nodi hanno la stessa priorità, le risorse possono essere eseguite su uno qualsiasi di essi. Nell'esempio precedente, node1 riceve la priorità più alta, node2 e node3 ricevono la stessa priorità e infine node4 riceve la priorità più bassa, che può essere omessa per utilizzare il valore predefinito 0:

# ha-manager rules add node-affinity priority-cascade \
        --resources vm:400,ct:500 --nodes "node1:2,node2:1,node3:1,node4"

I comandi precedenti creano le seguenti regole nel file di configurazione delle regole:

Node Affinity Rules Configuration Example (/etc/pve/ha/rules.cfg)
node-affinity: ha-rule-vm100
        nodes node1
        resources vm:100
        strict 1

node-affinity: ha-rule-negative
        nodes node3
        resources ct:200,vm:300
        affinity negative

node-affinity: priority-cascade
        nodes node1:2,node2:1,node3:1,node4
        resources vm:400,ct:500
Proprietà delle regole di affinità dei nodi
affinity: <negative | positive> (predefinito = positive)

Descrive se le risorse HA devono essere posizionate sui nodi indicati (positive), oppure devono essere posizionate su qualsiasi nodo eccetto quelli indicati (negative).

nodes: <node>[:<pri>]{,<node>[:<pri>]}*

Elenco dei nodi membri del cluster, a ciascuno dei quali può essere assegnata una priorità. Una risorsa verrà eseguita sui nodi disponibili con la priorità più alta. Se sono presenti più nodi nella classe di priorità più alta, le risorse verranno distribuite tra tali nodi. Le priorità hanno un significato solo relativo. Più alto è il numero, più alta è la priorità.

resources: <type>:<name>{,<type>:<name>}*

Elenco di ID delle risorse HA. Consiste in un elenco di tipi di risorsa seguiti da un nome specifico della risorsa separato da due punti (esempio: vm:100,ct:101).

strict: <boolean> (predefinito = 0)

Descrive se la regola di affinità dei nodi è rigida (strict) o non rigida.

Una regola di affinità dei nodi non rigida fa sì che le risorse preferiscano trovarsi sui nodi definiti. Se nessuno dei nodi definiti è disponibile, la risorsa può essere eseguita su qualsiasi altro nodo.

Una regola di affinità dei nodi rigida fa sì che le risorse siano limitate ai nodi definiti. Se nessuno dei nodi definiti è disponibile, la risorsa verrà arrestata.

Regole di affinità delle risorse

Un altro requisito comune è che due o più risorse HA debbano essere eseguite sullo stesso nodo, oppure debbano essere distribuite su nodi separati. Questi vincoli sono comunemente chiamati anche "vincoli di affinità/anti-affinità".

Ad esempio, si supponga che vi sia molto traffico di comunicazione tra le risorse HA vm:100 e vm:200, ad esempio, un server web che comunica con un server database. Se tali risorse HA si trovano su nodi separati, ciò potrebbe comportare una latenza più elevata e un carico di rete non necessario. Le regole di affinità delle risorse con affinità positive implementano il vincolo per mantenere le risorse HA sullo stesso nodo:

# ha-manager rules add resource-affinity keep-together \
    --affinity positive --resources vm:100,vm:200
Note Se sono presenti due o più regole di affinità positiva tra risorse che hanno risorse HA in comune, queste vengono trattate come un'unica regola di affinità positiva tra risorse. Ad esempio, se le risorse HA vm:100 e vm:101 e le risorse HA vm:101 e vm:102 sono ciascuna in una regola di affinità positiva tra risorse, è come se vm:100, vm:101 e vm:102 fossero in un'unica regola di affinità positiva tra risorse.
Note Se le risorse HA di una regola di affinità positiva tra risorse sono attualmente in esecuzione su nodi diversi, il CRS sposterà le risorse HA sul nodo in cui la maggior parte di esse è già in esecuzione. In caso di parità nel conteggio delle risorse HA, viene selezionato il nodo il cui nome appare primo in ordine alfabetico.

Tuttavia, si supponga che vi siano programmi computazionalmente onerosi e/o distribuiti in esecuzione sulle risorse HA vm:200 e ct:300, ad esempio, istanze di database partizionati (sharded). In tal caso, eseguirli sullo stesso nodo potrebbe causare pressione sulle risorse hardware del nodo e rallenterà le operazioni di queste risorse HA. Le regole di affinità tra risorse con affinità negative implementano il vincolo per distribuire le risorse HA su nodi separati:

# ha-manager rules add resource-affinity keep-separate \
    --affinity negative --resources vm:200,ct:300

A differenza delle regole di affinità ai nodi, le regole di affinità tra risorse sono rigide per impostazione predefinita, ossia, se i vincoli imposti dalle regole di affinità tra risorse non possono essere soddisfatti per una risorsa HA, l'HA Manager porterà la risorsa HA in stato di ripristino in caso di failover, oppure in stato di errore negli altri casi.

I comandi sopra hanno creato le seguenti regole nel file di configurazione delle regole:

Resource Affinity Rules Configuration Example (/etc/pve/ha/rules.cfg)
resource-affinity: keep-together
        affinity positive
        resources vm:100,vm:200

resource-affinity: keep-separate
        affinity negative
        resources vm:200,ct:300
Interazioni tra regole di affinità positiva e negativa tra risorse

Se sono presenti risorse HA in una regola di affinità positiva tra risorse, che sono anche parte di una regola di affinità negativa tra risorse, allora tutte le altre risorse HA nella regola di affinità positiva tra risorse sono in affinità negativa con le risorse HA di queste regole di affinità negativa tra risorse.

Ad esempio, se le risorse HA vm:100, vm:101 e vm:102 sono in una regola di affinità positiva tra risorse, e vm:100 è in una regola di affinità negativa tra risorse con la risorsa HA ct:200, allora anche vm:101 e vm:102 sono ciascuna in affinità negativa tra risorse con ct:200.

Si noti che se due o più risorse HA sono presenti sia in una regola di affinità positiva tra risorse sia in una regola di affinità negativa tra risorse, tali regole verranno disabilitate poiché causano un conflitto: due o più risorse HA non possono essere mantenute sullo stesso nodo e separate su nodi diversi contemporaneamente. Per ulteriori informazioni su questi casi, consultare la sezione relativa ai conflitti e agli errori delle regole più avanti.

Interazioni tra regole di affinità ai nodi e di affinità positiva tra risorse

Se una regola di affinità ai nodi contiene risorse HA che fanno anche parte di una regola di affinità positiva tra risorse, allora tutte le altre risorse HA nella regola di affinità positiva tra risorse ereditano anch'esse la regola di affinità ai nodi.

Ad esempio, se le risorse HA vm:100, vm:101 e vm:102 sono incluse in una regola di affinità positiva tra risorse e vm:102 è inclusa in una regola di affinità con i nodi che vincola vm:102 esclusivamente a node3, allora anche vm:100 e vm:101 sono vincolate esclusivamente a node3.

Si noti che se vi sono due o più risorse HA in una regola di affinità positiva tra risorse e in diverse regole di affinità ai nodi, tali regole causeranno un errore e verranno disabilitate poiché ciò non è attualmente supportato. Per ulteriori informazioni su questi casi, consultare la sezione relativa a conflitti ed errori delle regole più avanti.

Proprietà delle regole di affinità tra risorse
affinity: <negative | positive>

Descrive se le risorse HA devono essere mantenute sullo stesso nodo (positive), oppure devono essere mantenute su nodi separati (negative).

resources: <type>:<name>{,<type>:<name>}*

Elenco di ID delle risorse HA. Consiste in un elenco di tipi di risorsa seguiti da un nome specifico della risorsa separato da due punti (esempio: vm:100,ct:101).

15.6.4. Conflitti e errori delle regole

Le regole HA possono imporre vincoli piuttosto complessi alle risorse HA. Per garantire che una regola HA nuova o modificata non introduca incertezza nello scheduler CRS dello stack HA, le regole HA vengono testate per verificarne la fattibilità prima di essere applicate. Per le regole che non superano questi test, tali regole vengono disabilitate finché i conflitti e gli errori non sono stati risolti.

Attualmente, le regole HA vengono verificate con i seguenti test di fattibilità:

  • Una risorsa HA può far parte solo di una singola regola di affinità del nodo HA.

  • Le regole di affinità negativa del nodo HA non possono specificare priorità dei nodi.

  • Le regole di affinità negativa del nodo HA non possono specificare tutti i nodi del cluster.

  • Una regola di affinità delle risorse HA deve avere almeno due risorse HA.

  • Una regola di affinità negativa delle risorse HA non può specificare più risorse HA di quanti siano i nodi nel cluster. In caso contrario, le risorse HA non dispongono di nodi sufficienti per essere separate.

  • Una regola di affinità positiva delle risorse HA non può specificare le stesse due o più risorse HA specificate da una regola di affinità negativa delle risorse HA. Ovvero, due o più risorse HA non possono essere tenute insieme e separate allo stesso tempo.

  • Una risorsa HA può far parte contemporaneamente di una regola di affinità del nodo HA e di una regola di affinità delle risorse HA solo se la regola di affinità del nodo HA ha una singola classe di priorità.

  • Le risorse HA di una regola di affinità positiva delle risorse HA possono far parte al massimo di una singola regola di affinità del nodo HA.

  • Le risorse HA di una regola di affinità negativa delle risorse HA non possono essere limitate dalle rispettive regole di affinità del nodo a un numero di nodi inferiore al numero di risorse HA. In caso contrario, le risorse HA non dispongono di nodi sufficienti per essere separate.

15.7. Fencing

In caso di guasto di un nodo, il fencing garantisce che il nodo con errori sia sicuramente offline. Questo è necessario per assicurarsi che nessuna risorsa venga eseguita due volte quando viene recuperata su un altro nodo. Si tratta di un compito davvero importante, perché senza di esso non sarebbe possibile recuperare una risorsa su un altro nodo.

Se un nodo non venisse sottoposto a fencing, si troverebbe in uno stato sconosciuto in cui potrebbe ancora avere accesso a risorse condivise. Questo è davvero pericoloso! Si immagini che tutte le reti, eccetto quella dello storage, si guastino. Ora, sebbene non raggiungibile dalla rete pubblica, la VM continua a funzionare e a scrivere sullo storage condiviso.

Se a questo punto si avviasse semplicemente questa VM su un altro nodo, si otterrebbe una pericolosa race condition, perché si scrive da entrambi i nodi. Tali condizioni possono distruggere tutti i dati della VM e rendere l'intera VM inutilizzabile. Il recupero potrebbe inoltre non riuscire se lo storage protegge contro mount multipli.

15.7.1. Come Proxmox VE esegue il fencing

Esistono diversi metodi per eseguire il fencing di un nodo, ad esempio dispositivi di fencing che interrompono l'alimentazione del nodo o ne disabilitano completamente la comunicazione. Questi dispositivi sono spesso piuttosto costosi e introducono componenti critici aggiuntivi in un sistema, perché se si guastano non è possibile ripristinare alcun servizio.

Si è quindi voluto integrare un metodo di fencing più semplice, che non richieda hardware esterno aggiuntivo. Questo può essere fatto utilizzando i timer watchdog.

Possible Fencing Methods
  • interruttori di alimentazione esterni

  • isolamento dei nodi disabilitando completamente il traffico di rete sullo switch

  • self-fencing tramite timer watchdog

I timer watchdog sono stati ampiamente utilizzati in sistemi critici e affidabili fin dagli albori dei microcontrollori. Sono spesso circuiti integrati semplici e indipendenti, utilizzati per individuare e correggere i malfunzionamenti del computer.

Durante il normale funzionamento, ha-manager azzera regolarmente il timer watchdog per impedirne lo scadere. Se, a causa di un guasto hardware o di un errore del programma, il computer non riesce ad azzerare il watchdog, il timer scadrà e attiverà il reset dell'intero server (riavvio).

Le motherboard dei server più recenti includono spesso watchdog hardware di questo tipo, che tuttavia devono essere configurati. Se non è disponibile o configurato alcun watchdog, si ricorre al softdog del kernel Linux. Sebbene ancora affidabile, non è indipendente dall'hardware del server e ha quindi un'affidabilità inferiore rispetto a un watchdog hardware.

15.7.2. Configurazione del watchdog hardware

Per impostazione predefinita, tutti i moduli watchdog hardware sono bloccati per motivi di sicurezza. Sono come un'arma carica se non inizializzati correttamente. Per abilitare un watchdog hardware, è necessario specificare il modulo da caricare in /etc/default/pve-ha-manager, ad esempio:

# select watchdog module (default is softdog)
WATCHDOG_MODULE=iTCO_wdt

Questa configurazione viene letta dal servizio watchdog-mux, che carica il modulo specificato all'avvio.

15.7.3. Ripristino dei servizi sottoposti a fencing

Dopo che un nodo è andato in errore e il relativo fencing è riuscito, il CRM tenta di spostare i servizi dal nodo guasto ai nodi ancora online.

La selezione dei nodi di recupero è influenzata dall'elenco dei nodi attualmente attivi, dal relativo carico in base allo scheduler utilizzato e dalle eventuali regole di affinità di cui il servizio fa parte.

Prima di tutto, il CRM costruisce un insieme di nodi disponibili per il servizio. Se il servizio fa parte di una regola di affinità dei nodi, l'insieme viene ridotto ai nodi con priorità più alta nella regola di affinità dei nodi. Se il servizio fa parte di una regola di affinità delle risorse, l'insieme viene ulteriormente ridotto per soddisfare i relativi vincoli, che consistono nel mantenere il servizio sullo stesso nodo di alcuni altri servizi oppure nel mantenere il servizio su un nodo diverso rispetto ad altri servizi. Infine, il CRM seleziona il nodo con il carico più basso in base allo scheduler utilizzato, per minimizzare la possibilità di un nodo sovraccarico.

Caution In caso di guasto di un nodo, il CRM distribuisce i servizi sui nodi rimanenti. Ciò aumenta il numero di servizi su tali nodi e può portare a un carico elevato, specialmente su cluster di piccole dimensioni. Si consiglia di progettare il cluster in modo che possa gestire tali scenari nel caso peggiore.

15.7.4. Stato di fencing e watchdog

L'output di ha-manager status include una voce di fencing che mostra lo stato del watchdog del CRM. Ogni voce LRM mostra inoltre il proprio stato del watchdog.

armed

Il CRM gestisce attivamente i servizi e ha il proprio watchdog aperto. Anche l'LRM di ogni nodo mantiene un watchdog mentre detiene il lock dell'agente. In caso di perdita del quorum o di guasto del demone, il relativo watchdog attiva un reset del nodo per garantire un failover sicuro.

standby

Lo stack HA è pronto ma nessun CRM è attivamente in esecuzione come master, ad esempio quando non è ancora stata configurata alcuna risorsa HA oppure il cluster è appena stato avviato. Il watchdog del CRM non è aperto. Il fencing passa automaticamente ad armed non appena un CRM assume il ruolo di master.

disarming

È stato emesso un comando disarm-ha. Il CRM sta congelando i servizi o sospendendone il tracciamento e attende che tutti gli LRM rilascino i propri watchdog. Il watchdog del CRM è ancora attivo durante questa fase. Lo stato del watchdog di ogni voce LRM passa a released quando il rispettivo LRM conferma il disarmo.

disarmed

Tutti i watchdog sono stati rilasciati a livello di cluster. Non vengono eseguiti fencing, failover o recupero automatici. Vedere Disattivazione dell'HA per la manutenzione del cluster.

Note Il servizio watchdog-mux mantiene aperto il dispositivo /dev/watchdog sottostante per tutta la propria durata, anche quando non è connesso alcun client HA. Ciò impedisce ad altri processi di acquisire il dispositivo e garantisce che lo stack HA possa sempre riacquisirlo. Non tutti i driver dei watchdog hardware supportano il meccanismo di magic close, quindi la chiusura del dispositivo potrebbe causare un reset non intenzionale.

15.8. Politica in caso di mancato avvio

La politica di gestione degli errori di avvio si applica se un servizio non è riuscito ad avviarsi su un nodo una o più volte. Può essere utilizzata per configurare quante volte tentare un riavvio sullo stesso nodo e quante volte trasferire un servizio, in modo da tentarne l'avvio su un altro nodo. L'obiettivo di questa politica è aggirare la temporanea indisponibilità di risorse condivise su un nodo specifico. Ad esempio, se uno storage condiviso non è più disponibile su un nodo con quorum, per esempio a causa di problemi di rete, ma è ancora disponibile su altri nodi, la politica di trasferimento consente comunque l'avvio del servizio.

Esistono due impostazioni della politica di recupero all'avvio del servizio che possono essere configurate in modo specifico per ciascuna risorsa.

max_restart

Numero massimo di tentativi di riavvio di un servizio in errore sul nodo attuale. Il valore predefinito è impostato a uno.

max_relocate

Numero massimo di tentativi di trasferimento del servizio su un nodo diverso. Un trasferimento avviene solo dopo che il valore di max_restart è stato superato sul nodo attuale. Il valore predefinito è impostato a uno.

Note Il conteggio dei trasferimenti verrà azzerato solo quando il servizio avrà avuto almeno un avvio riuscito. Ciò significa che se un servizio viene riavviato senza risolvere l'errore, viene ripetuta solo la politica di riavvio.

15.9. Recupero dagli errori

Se, dopo tutti i tentativi, lo stato del servizio non può essere ripristinato, questo viene posto in uno stato di errore. In questo stato, il servizio non verrà più toccato dallo stack HA. L'unico modo per uscirne è disabilitare il servizio:

# ha-manager set vm:100 --state disabled

Questa operazione può essere eseguita anche dall'interfaccia web.

Per uscire dallo stato di errore si consiglia di eseguire le seguenti operazioni:

  • riportare la risorsa in uno stato sicuro e coerente (ad esempio: terminare il processo se il servizio non poteva essere arrestato)

  • disabilitare la risorsa per rimuovere il flag di errore

  • risolvere l'errore che ha causato questi guasti

  • dopo aver risolto tutti gli errori, è possibile richiedere che il servizio venga riavviato

15.10. Aggiornamenti dei pacchetti

Quando si aggiorna ha-manager, è necessario procedere nodo per nodo, mai tutti insieme, per diversi motivi. Innanzitutto, sebbene il software venga testato in modo approfondito, non si può escludere del tutto un bug che riguardi la configurazione specifica. Aggiornare un nodo dopo l'altro e verificare il funzionamento di ciascun nodo al termine dell'aggiornamento aiuta a risolvere eventuali problemi, mentre aggiornare tutto in una sola volta potrebbe causare un cluster danneggiato e in generale non è una buona prassi.

Inoltre, lo stack HA di Proxmox VE utilizza un protocollo di richiesta e conferma per eseguire azioni tra il cluster e il gestore locale delle risorse. Per il riavvio, l'LRM invia una richiesta al CRM per congelare tutti i propri servizi. Questo impedisce che il cluster intervenga su di essi durante il breve periodo in cui l'LRM si sta riavviando. Successivamente, l'LRM può chiudere in sicurezza il watchdog durante un riavvio. Un riavvio di questo tipo avviene normalmente durante un aggiornamento dei pacchetti e, come già indicato, è necessario un CRM master attivo per confermare le richieste dell'LRM. Se questa condizione non è soddisfatta, il processo di aggiornamento può richiedere troppo tempo e, nel caso peggiore, causare un reset attivato dal watchdog.

15.11. Manutenzione del nodo

A volte è necessario eseguire interventi di manutenzione su un nodo, come la sostituzione dell'hardware o semplicemente l'installazione di una nuova immagine del kernel. Questo vale anche mentre lo stack HA è in uso.

Lo stack HA può fornire supporto principalmente per due tipi di manutenzione:

  • per gli spegnimenti o i riavvii generali, il comportamento può essere configurato, vedere Politica di spegnimento.

  • per gli interventi di manutenzione che non richiedono uno spegnimento o un riavvio, o che non dovrebbero essere disattivati automaticamente dopo un solo riavvio, è possibile attivare la modalità di manutenzione manuale.

15.11.1. Modalità di manutenzione

È possibile utilizzare la modalità di manutenzione manuale per contrassegnare il nodo come non disponibile per il funzionamento HA, inducendo tutti i servizi gestiti da HA a migrare verso altri nodi.

I nodi di destinazione per queste migrazioni vengono selezionati tra gli altri nodi attualmente disponibili e determinati dalla configurazione delle regole HA e dalla modalità configurata del cluster resource scheduler (CRS). Durante ogni migrazione, il nodo originale viene registrato nello stato dei manager HA, in modo che il servizio possa essere riportato automaticamente al nodo originale una volta che la modalità di manutenzione viene disattivata e il nodo torna online.

Attualmente è possibile attivare o disattivare la modalità di manutenzione utilizzando lo strumento CLI ha-manager.

Enabling maintenance mode for a node
# ha-manager crm-command node-maintenance enable NODENAME

Questo accoderà un comando CRM; quando il manager elabora questo comando, registrerà la richiesta di modalità di manutenzione nello stato del manager. Questo consente di inviare il comando da qualsiasi nodo, non solo dal nodo per il quale si desidera attivare o disattivare la modalità di manutenzione.

Una volta che l'LRM sul nodo relativo recepisce il comando, si contrassegnerà come non disponibile, ma continuerà a elaborare tutti i comandi di migrazione. Ciò significa che il watchdog di self-fencing dell'LRM resterà attivo finché tutti i servizi attivi non saranno stati spostati, e tutti i worker in esecuzione non saranno terminati.

Si noti che lo stato dell'LRM indicherà la modalità maintenance non appena l'LRM avrà recepito lo stato richiesto, e non solo quando tutti i servizi saranno stati spostati; si prevede di migliorare questa esperienza utente in futuro. Per il momento, è possibile verificare la presenza di eventuali servizi HA ancora attivi sul nodo, oppure monitorare la presenza di una riga di log come: pve-ha-lrm[PID]: watchdog closed (disabled) per sapere quando il nodo ha completato la transizione verso la modalità di manutenzione.

Note La modalità di manutenzione manuale non viene eliminata automaticamente al riavvio del nodo, ma solo se viene disattivata manualmente utilizzando la CLI di ha-manager oppure se manager-status viene cancellato manualmente.
Disabling maintenance mode for a node
# ha-manager crm-command node-maintenance disable NODENAME

Il processo di disattivazione della modalità di manutenzione manuale è simile a quello di attivazione. L'utilizzo del comando CLI ha-manager mostrato in precedenza accoderà un comando CRM che, una volta elaborato, contrassegnerà nuovamente il relativo nodo LRM come disponibile.

Se si disattiva la modalità di manutenzione, tutti i servizi che si trovavano sul nodo nel momento in cui la modalità di manutenzione è stata attivata verranno riportati su quel nodo.

15.11.2. Politica di spegnimento

Di seguito è riportata una descrizione delle diverse politiche HA per lo spegnimento di un nodo. Attualmente Conditional è l'impostazione predefinita per motivi di retrocompatibilità. Alcuni utenti potrebbero trovare che Migrate si comporti in modo più conforme alle aspettative.

La politica di spegnimento può essere configurata nella Web UI (Datacenter → Options → HA Settings), oppure direttamente in datacenter.cfg:

ha: shutdown_policy=<value>
Migrate

Non appena il Local Resource Manager (LRM) riceve una richiesta di spegnimento e questa politica è attivata, si contrassegnerà come non disponibile per l'attuale gestore HA. Questo attiva una migrazione di tutti i servizi HA attualmente collocati su questo nodo. L'LRM tenterà di ritardare il processo di spegnimento finché tutti i servizi in esecuzione non saranno stati spostati su altri nodi. Tuttavia, questo presuppone che i servizi in esecuzione possano essere migrati verso un altro nodo. In altre parole, il servizio non deve essere vincolato al nodo locale, ad esempio tramite l'uso del passthrough hardware. Ad esempio, regole rigide di affinità ai nodi indicano al gestore HA che il servizio non può essere eseguito al di fuori dell'insieme di nodi scelto. Se tutti questi nodi non sono disponibili, lo spegnimento resterà in sospeso finché non si interviene manualmente. Una volta che il nodo spento torna nuovamente online, i servizi precedentemente spostati verranno riportati sul nodo originale, se non sono già stati migrati manualmente nel frattempo.

Note Il watchdog resta attivo durante il processo di migrazione in fase di spegnimento. Se il nodo perde il quorum verrà sottoposto a fencing e i servizi verranno ripristinati.

Se si avvia un servizio (precedentemente fermato) su un nodo attualmente sottoposto a manutenzione, il nodo deve essere sottoposto a fencing per garantire che il servizio possa essere spostato e avviato su un altro nodo disponibile.

Failover

Questa modalità garantisce che tutti i servizi vengano arrestati, ma verranno comunque recuperati, se il nodo corrente non torna online a breve. Può essere utile durante operazioni di manutenzione su scala cluster, in cui la migrazione live delle VM potrebbe non essere possibile se troppi nodi sono spenti contemporaneamente, ma si desidera comunque garantire che i servizi HA vengano recuperati e avviati nuovamente il prima possibile.

Freeze

Questa modalità garantisce che tutti i servizi vengano arrestati e congelati, in modo che non vengano recuperati finché il nodo corrente non torna online.

Conditional

La politica di arresto Conditional rileva automaticamente se è richiesto un arresto o un riavvio, e modifica il comportamento di conseguenza.

Shutdown

Un arresto (poweroff) viene generalmente eseguito se è previsto che il nodo rimanga spento per un certo periodo. In questo caso l'LRM arresta tutti i servizi gestiti. Ciò significa che gli altri nodi prenderanno in carico tali servizi in seguito.

Note L'hardware recente dispone di grandi quantità di memoria (RAM). Per questo motivo vengono arrestate tutte le risorse, per poi riavviarle, evitando così la migrazione online di tutta quella RAM. Se si desidera utilizzare la migrazione online, è necessario eseguirla manualmente prima di arrestare il nodo.
Reboot

I riavvii del nodo vengono avviati con il comando reboot. Questo viene generalmente eseguito dopo l'installazione di un nuovo kernel. Si noti che questa operazione è diversa dallo "shutdown", poiché il nodo si riavvia immediatamente.

L'LRM comunica al CRM che desidera riavviarsi e attende che il CRM porti tutte le risorse nello stato freeze (viene utilizzato lo stesso meccanismo per gli aggiornamenti dei pacchetti). Questo impedisce che tali risorse vengano spostate su altri nodi. Il CRM avvia invece le risorse dopo il riavvio sullo stesso nodo.

Spostamento manuale delle risorse

Infine, è anche possibile spostare manualmente le risorse su altri nodi, prima di arrestare o riavviare un nodo. Il vantaggio è un controllo completo sull'operazione, con la possibilità di decidere se utilizzare o meno la migrazione online.

Note Non terminare (kill) servizi come pve-ha-crm, pve-ha-lrm o watchdog-mux. Questi gestiscono e utilizzano il watchdog, pertanto tale operazione può causare un riavvio immediato del nodo o persino un reset.

15.12. Disattivazione dell'HA per la manutenzione del cluster

Alcune attività di manutenzione del cluster, come la riconfigurazione della rete o dello stack di comunicazione del cluster (corosync), possono causare una perdita temporanea del quorum o partizioni di rete. Normalmente, l'HA interpreterebbe questa situazione come un guasto del nodo e attiverebbe l'auto-fencing, interrompendo i servizi senza necessità.

Il meccanismo di disattivazione rilascia tutti i watchdog CRM e LRM a livello di cluster, consentendo di eseguire tale manutenzione in modo sicuro senza il rischio che i nodi vengano sottoposti a fencing.

Important Durante la disattivazione, l'HA non protegge i servizi. I guasti verificatisi in questo periodo non vengono recuperati automaticamente. Si consiglia di mantenere la finestra di disattivazione quanto più breve possibile.
Resource Modes

Quando si disattiva l'HA, è necessario scegliere una modalità delle risorse che controlla come vengono gestite le risorse gestite dall'HA durante la disattivazione. Lo stato attuale delle risorse non viene modificato.

freeze

Nuovi comandi e modifiche di stato non vengono applicati. I servizi rimangono nel loro stato attuale, ma lo stack HA non reagisce ai guasti né elabora nuove richieste. Questa è la scelta più sicura quando ci si aspetta che tutti i nodi restino in funzione.

ignore

Le risorse vengono sospese dal monitoraggio HA e possono essere gestite come se non fossero gestite dall'HA. Questo consente di avviare, arrestare o migrare manualmente i servizi mentre l'HA è disattivato. Si consiglia di utilizzare questa modalità quando è necessario rilocare manualmente i servizi durante la manutenzione. Al momento della riattivazione, il CRM verifica nuovamente la posizione dei servizi rispetto alla configurazione per rilevare eventuali migrazioni manuali.

Disarming and Re-Arming

Per disattivare l'HA con la modalità delle risorse desiderata:

# ha-manager crm-command disarm-ha freeze

oppure:

# ha-manager crm-command disarm-ha ignore

Per riattivare l'HA una volta completata la manutenzione:

# ha-manager crm-command arm-ha

È possibile monitorare lo stato attuale con:

# ha-manager status

La riga di stato del fencing mostra lo stato attuale del meccanismo di fencing (vedere Stato del fencing), inclusi gli stati dei watchdog CRM e LRM.

The Disarm Process

Dopo la richiesta di disattivazione, si verifica la seguente sequenza:

  1. Il CRM congela tutti i servizi oppure li sospende dal monitoraggio, in base alla modalità delle risorse scelta.

  2. Ciascun LRM completa i propri worker attivi, quindi rilascia il proprio lock dell'agente e il watchdog.

  3. Una volta che tutti gli LRM online sono inattivi, anche il CRM rilascia il proprio watchdog.

Il CRM mantiene il lock di gestione durante tutto il processo, in modo da poter accettare ed elaborare il comando arm-ha per annullare l'operazione.

Se sono attualmente in corso operazioni di fencing, recupero o migrazione di alcuni servizi, la disattivazione viene rinviata finché tali operazioni non sono completate. Questo garantisce che i servizi in fase di transizione non si trovino in uno stato incoerente.

Nodes Offline During Disarm

Se un nodo è offline al momento della disattivazione dell'HA, il suo LRM non può elaborare la richiesta di disattivazione. Il CRM procede verso lo stato disattivato una volta che tutti gli LRM online hanno completato la propria parte. Il nodo offline non blocca questo processo.

Quando il nodo offline torna online mentre l'HA è ancora disattivato, il suo LRM rileva lo stato di disattivazione e rilascia il proprio watchdog senza tentare alcun recupero dei servizi.

Al momento del re-arm dell'HA, i servizi che si trovavano sul nodo offline vengono gestiti secondo le normali regole di ripristino HA: vengono isolati (fencing) e ripristinati se il nodo è ancora irraggiungibile, oppure riavviati sul nodo se è tornato online.

Interaction with Maintenance Mode

Se un nodo è già in modalità di manutenzione quando viene richiesto il disarm, la migrazione di manutenzione continua finché tutti i servizi non sono stati spostati altrove. Una volta che non rimangono servizi e worker attivi, l'LRM rilascia il proprio lock e il watchdog come parte del processo di disarm.

Quando l'HA viene riarmato, lo stato della modalità di manutenzione viene preservato. Il nodo rimane in manutenzione e i servizi non vengono riportati sul nodo finché la modalità di manutenzione non viene disabilitata esplicitamente.

Caution Mentre lo stack HA è disarmato, non avviene alcun ripristino automatico, failover o fencing. Un guasto al nodo durante questa finestra non viene rilevato né gestito dall'HA. Mantenere la finestra di disarm quanto più breve possibile e assicurarsi che il cluster sia in uno stato integro prima di eseguire il re-arm.

15.13. Pianificazione delle risorse del cluster

Il Cluster Resource Scheduler (CRS) è responsabile della selezione di nuovi nodi su cui collocare le risorse HA e del mantenimento delle risorse HA sui nodi consentiti.

In ogni ciclo dell'HA Manager, lo scheduler esamina ogni risorsa HA e verifica se la risorsa HA necessita di una nuova assegnazione a un nodo. Questa nuova assegnazione può essere determinata da diverse azioni, come il ripristino di risorse HA da un nodo isolato tramite fencing o una nuova regola di affinità HA. Vedere la sezione Punti di pianificazione del CRS per una descrizione più approfondita delle azioni che il CRS esegue in risposta a specifiche modifiche nel cluster.

15.13.1. Modalità di pianificazione del CRS

screenshot/gui-datacenter-options-crs.png

La modalità di pianificazione del CRS controlla il modo in cui il CRS calcolerà le informazioni di utilizzo per il cluster. Queste informazioni di utilizzo vengono usate come base per le decisioni di pianificazione. La modalità del CRS può essere modificata nell'interfaccia web (Datacenter → Opzioni → Pianificazione delle risorse del cluster). La modalità predefinita è basic. La modifica avrà effetto a partire dal ciclo successivo dell'HA Manager, che non dovrebbe richiedere più di 10 secondi.

Scheduler di base

Il numero di guest attivi su ciascun nodo viene usato per scegliere il nodo più adatto per una risorsa HA.

Scheduler a carico statico

Le informazioni di utilizzo statico dei guest attivi su ciascun nodo vengono usate per scegliere il nodo più adatto per una risorsa HA. Ciò include le quote di CPU e memoria configurate per i guest attivi.

Scheduler a carico dinamico

Le informazioni di utilizzo dinamico dei guest attivi su ciascun nodo vengono usate per scegliere il nodo più adatto per una risorsa HA. Ciò include l'utilizzo medio di CPU e memoria, oltre alle quote di CPU e memoria configurate per i guest attivi.

15.13.2. Punti di pianificazione del CRS

In ogni ciclo dell'HA Manager, il CRS verifica se vi siano risorse HA che necessitano di una nuova assegnazione a un nodo, che può essere resa necessaria da uno qualsiasi dei seguenti punti di pianificazione:

Ripristino delle risorse HA (sempre attivo)

Quando un nodo con risorse HA attive si guasta, tutte le sue risorse HA devono essere ripristinate su altri nodi. L'algoritmo del CRS viene utilizzato qui per distribuire tale ripristino sui nodi rimanenti.

Modifiche alla configurazione delle regole HA (sempre attive)

Se una regola impone vincoli diversi alle risorse HA, lo stack HA utilizzerà l'algoritmo del CRS per trovare un nuovo nodo di destinazione per le risorse HA interessate da queste regole, in base al tipo delle nuove regole:

  • Regole di affinità dei nodi: se viene creata una regola di affinità dei nodi oppure vengono aggiunte risorse HA/nodi a una regola di affinità dei nodi esistente, lo stack HA utilizzerà l'algoritmo del CRS per garantire che queste risorse HA vengano assegnate in base ai vincoli di nodo e priorità.

  • Regole di affinità positiva delle risorse: se viene creata una regola di affinità positiva delle risorse oppure vengono aggiunte risorse HA a una regola di affinità positiva delle risorse esistente, lo stack HA utilizzerà l'algoritmo del CRS per garantire che queste risorse HA vengano spostate su un nodo comune.

  • Regole di affinità negativa delle risorse: se viene creata una regola di affinità negativa delle risorse oppure vengono aggiunte risorse HA a una regola di affinità negativa delle risorse esistente, lo stack HA utilizzerà l'algoritmo del CRS per garantire che queste risorse HA vengano spostate su nodi separati.

Ribilanciamento delle risorse HA all'avvio (opt-in)

Quando si avvia una risorsa HA con il ribilanciamento all'avvio abilitato, il CRS selezionerà il nodo più adatto per la risorsa HA. Se il nodo selezionato non è il nodo corrente, la risorsa HA verrà migrata sul nodo selezionato.

Per la modalità di pianificazione di base, il nodo con il minor numero di guest attivi è considerato il nodo più adatto.

Per le modalità di pianificazione static-load e dynamic-load, ogni nodo viene considerato a turno come se la risorsa HA fosse già in esecuzione su di esso, utilizzando i valori di utilizzo di CPU e memoria ricavati dalla configurazione del guest associato. Quindi, per ciascuna di queste alternative, si considera l'utilizzo di CPU e memoria di tutti i nodi, attribuendo alla memoria un peso molto maggiore, poiché si tratta di una risorsa effettivamente limitata. Sia per la CPU sia per la memoria, si considerano l'utilizzo massimo tra i nodi (a cui viene attribuito un peso maggiore, poiché idealmente a nessun nodo dovrebbero essere assegnate più risorse di quelle disponibili) e l'utilizzo medio di tutti i nodi (per poter comunque distinguere tra le alternative nel caso in cui esista già un nodo con un livello di allocazione delle risorse più elevato).

Questa impostazione può essere abilitata con l'opzione CRS ha-rebalance-on-start nell'interfaccia web in Datacenter → Options → Cluster Resource Scheduling.

Important Per le modalità di pianificazione static-load e dynamic-load, questa funzionalità è ancora in anteprima tecnologica. Maggiore è il numero di risorse HA, maggiore è il numero di combinazioni possibili, pertanto attualmente non è consigliato utilizzarla se sono presenti migliaia di risorse HA.

15.13.3. Bilanciatore di carico CRS

L'utilizzo dei singoli nodi del cluster può variare notevolmente in base a dove sono attualmente in esecuzione i guest e a quanto carico generano in un determinato momento. Questo può causare uno squilibrio dell'utilizzo dei nodi nel tempo, in cui le risorse HA su un nodo subiscono limitazioni delle prestazioni a causa della contesa di risorse, mentre un altro nodo è scarsamente utilizzato.

Il bilanciamento automatico del carico dell'HA Manager può ridurre lo squilibrio complessivo del cluster emettendo automaticamente migrazioni di riequilibrio. Attualmente, queste migrazioni vengono emesse solo per le risorse HA ed eseguite in modo sequenziale. Inoltre, queste migrazioni rispettano sempre le regole di affinità HA correnti.

Disabilitando auto-rebalance per una risorsa HA si impedisce che la risorsa venga inclusa nelle migrazioni di riequilibrio emesse automaticamente.

Note Qualsiasi risorsa HA con affinità positiva verso una risorsa HA con auto-rebalance disabilitato non verrà nemmeno inclusa nelle migrazioni di riequilibrio.

Il sistema di bilanciamento automatico del carico può essere abilitato e configurato nell'interfaccia web in Datacenter → Options → Cluster Resource Scheduling. Questo consente di ottimizzare i vari parametri descritti nel paragrafo successivo per diverse configurazioni e requisiti del cluster. Il load balancer richiede che sia in uso la modalità di pianificazione static-load o dynamic-load.

In ogni ciclo dell'HA Manager, ciascuno dei quali dura circa 10 secondi, il load balancer automatico verifica se lo squilibrio del cluster supera la soglia di squilibrio. Se lo squilibrio del cluster rimane sopra la soglia per almeno un numero di cicli consecutivi dell'HA Manager pari alla durata di mantenimento, il load balancer selezionerà la migrazione di riequilibrio per una risorsa HA che riduce maggiormente lo squilibrio complessivo del cluster. Il metodo utilizzato per selezionare la migliore migrazione di riequilibrio può essere impostato con l'opzione metodo di riequilibrio. Infine, se la migrazione selezionata riduce lo squilibrio attuale del cluster di almeno la percentuale indicata dall'opzione miglioramento dello squilibrio, il load balancer emette la migrazione selezionata.

Lo squilibrio del cluster è derivato dalla deviazione standard e dalla media dei carichi dei singoli nodi ed è normalizzato in un intervallo 0-100%. Sia la soglia di squilibrio che il miglioramento dello squilibrio sono configurati in percentuale. La soglia di squilibrio ha un valore predefinito del 30% e controlla la sensibilità del load balancer; con un valore di 0 cercherà di selezionare una migrazione di riequilibrio ogni volta che viene superata la durata di mantenimento. Il miglioramento dello squilibrio ha un valore predefinito del 10% e filtra ciò che costituisce una migrazione di riequilibrio accettabile; con un valore di 0 si procederà sempre con una migrazione anche se lo squilibrio previsto non cambia affatto. Il valore non può mai essere negativo, quindi il balancer non effettuerà mai una migrazione con uno squilibrio previsto peggiore di quello attuale.

Note È previsto che in futuro il bilanciamento del carico includa anche le risorse non HA.

16. Backup e ripristino

I backup sono un requisito per qualsiasi implementazione IT sensata e Proxmox VE fornisce una soluzione completamente integrata, utilizzando le funzionalità di ogni storage e di ogni tipo di sistema guest. Questo consente all'amministratore di sistema di ottimizzare, tramite l'opzione mode, il compromesso tra la coerenza dei backup e il tempo di inattività del sistema guest.

I backup di Proxmox VE sono sempre backup completi, contenenti la configurazione della VM/CT e tutti i dati. I backup possono essere avviati tramite la GUI o tramite lo strumento da riga di comando vzdump.

Backup Storage

Prima che un backup possa essere eseguito, è necessario definire uno storage di backup. Fare riferimento alla documentazione sullo storage per informazioni su come aggiungere uno storage. Può trattarsi di uno storage Proxmox Backup Server, dove i backup vengono memorizzati come chunk deduplicati e metadati, oppure di uno storage a livello di file, dove i backup vengono memorizzati come file regolari. Si consiglia l'uso di Proxmox Backup Server su un host dedicato, per le sue funzionalità avanzate. L'uso di un server NFS rappresenta una buona alternativa. In entrambi i casi, potrebbe essere opportuno salvare successivamente tali backup su un'unità a nastro, per l'archiviazione fuori sede.

Scheduled Backup

I job di backup possono essere pianificati in modo da essere eseguiti automaticamente in giorni e orari specifici, per nodi e sistemi guest selezionabili. Per maggiori informazioni, consultare la sezione Job di backup.

16.1. Modalità di backup

Esistono diversi modi per garantire la coerenza (opzione mode), a seconda del tipo di guest.

Backup modes for VMs:
modalità stop

Questa modalità garantisce la massima coerenza del backup, a costo di un breve periodo di inattività nel funzionamento della VM. Funziona eseguendo un arresto ordinato della VM, dopo il quale viene avviato un processo QEMU in background per eseguire il backup dei dati della VM. Dopo l'avvio del backup, la VM ritorna al funzionamento normale se era precedentemente in esecuzione. La coerenza è garantita tramite l'uso della funzionalità di backup live.

modalità suspend

Questa modalità è fornita per motivi di compatibilità e sospende la VM prima di richiamare la modalità snapshot. Poiché la sospensione della VM comporta un periodo di inattività più lungo e non migliora necessariamente la coerenza dei dati, si consiglia di utilizzare la modalità snapshot.

modalità snapshot

Questa modalità garantisce il minor tempo di inattività operativo, a costo di un piccolo rischio di incoerenza. Funziona eseguendo un backup live di Proxmox VE, in cui i blocchi di dati vengono copiati mentre la VM è in esecuzione. Se il guest agent è abilitato (agent: 1) ed è in esecuzione, vengono richiamati guest-fsfreeze-freeze e guest-fsfreeze-thaw per migliorare la coerenza.

Note Sui guest Windows è necessario configurare il guest agent se all'interno del guest viene utilizzato un altro software di backup. Per maggiori dettagli, consultare Freeze & Thaw nella sezione relativa al guest agent.

Una panoramica tecnica del backup live di Proxmox VE per QemuServer è disponibile online qui.

Note Il backup live di Proxmox VE fornisce una semantica simile a quella degli snapshot su qualsiasi tipo di storage. Non richiede che lo storage sottostante supporti gli snapshot. Si noti inoltre che, poiché i backup vengono eseguiti tramite un processo QEMU in background, una VM arrestata apparirà come in esecuzione per un breve periodo di tempo mentre i dischi della VM vengono letti da QEMU. Tuttavia la VM stessa non viene avviata, vengono letti solo i suoi dischi.
Backup modes for Containers:
modalità stop

Arrestare il container per la durata del backup. Ciò può comportare un tempo di inattività molto lungo.

modalità suspend

Questa modalità utilizza rsync per copiare i dati del container in una posizione temporanea (vedere l'opzione --tmpdir). Il container viene poi sospeso e un secondo rsync copia i file modificati. Successivamente, il container viene avviato (ripreso) nuovamente. Ciò comporta un'inattività minima, ma richiede spazio aggiuntivo per contenere la copia del container.

Quando il container si trova su un file system locale e lo storage di destinazione del backup è un server NFS/CIFS, è opportuno impostare --tmpdir affinché risieda anch'esso su un file system locale, poiché ciò comporterà un notevole miglioramento delle prestazioni. L'uso di una tmpdir locale è inoltre necessario per eseguire il backup di un container locale che utilizza ACL in modalità suspend, se lo storage di backup è un server NFS.

modalità snapshot

Questa modalità utilizza le funzionalità di snapshot dello storage sottostante. Innanzitutto, il container viene sospeso per garantire la coerenza dei dati. Viene creato uno snapshot temporaneo dei volumi del container e il contenuto dello snapshot viene archiviato in un file tar. Infine, lo snapshot temporaneo viene nuovamente eliminato.

Note La modalità snapshot richiede che tutti i volumi oggetto di backup si trovino su uno storage che supporti gli snapshot. Utilizzando l'opzione del mount point backup=no è possibile escludere singoli volumi dal backup (e quindi da questo requisito).
Note Per impostazione predefinita, i mount point aggiuntivi oltre al mount point del disco radice non vengono inclusi nei backup. Per i mount point di volume è possibile impostare l'opzione Backup per includere il mount point nel backup. I mount point di tipo device e bind non vengono mai sottoposti a backup, poiché il loro contenuto è gestito al di fuori della libreria di storage di Proxmox VE.

16.1.1. Fleecing del backup delle VM

Quando viene avviato un backup per una VM, QEMU installa un filtro "copy-before-write" nel suo livello a blocchi. Questo filtro garantisce che, in caso di nuove scritture da parte del guest, i vecchi dati ancora necessari per il backup vengano inviati prima alla destinazione di backup. La scrittura del guest si blocca finché questa operazione non è terminata, pertanto l'I/O del guest verso i settori non ancora sottoposti a backup sarà limitato dalla velocità della destinazione di backup.

Con il fleecing dei backup, tali dati precedenti vengono memorizzati nella cache in un'immagine di fleecing invece di essere inviati direttamente alla destinazione del backup. Ciò può migliorare le prestazioni I/O del guest e persino evitare blocchi in determinati scenari, al costo di richiedere più spazio di storage.

Per avviare manualmente un backup della VM 123 con immagini di fleecing create sullo storage local-lvm, eseguire

vzdump 123 --fleecing enabled=1,storage=local-lvm

Come sempre, è possibile impostare l'opzione per specifici job di backup, oppure come fallback a livello di nodo tramite le opzioni di configurazione. Nell'interfaccia utente, il fleecing può essere configurato nella scheda Avanzate durante la modifica di un job di backup.

Lo storage di fleecing dovrebbe essere uno storage locale veloce, con thin provisioning e supporto discard. Alcuni esempi sono LVM-thin, RBD, ZFS con sparse 1 nella configurazione dello storage, molti storage basati su file. Idealmente, lo storage di fleecing è uno storage dedicato, in modo che, se si riempie completamente, non influisca su altri guest e faccia semplicemente fallire il backup. Le parti dell'immagine di fleecing di cui è già stato eseguito il backup verranno scartate per tentare di mantenere basso l'utilizzo dello spazio.

Per gli storage basati su file che non supportano il discard (ad esempio, NFS prima della versione 4.2), si dovrebbe impostare preallocation off nella configurazione dello storage. In combinazione con qcow2 (usato automaticamente come formato per l'immagine di fleecing quando lo storage lo supporta), questo ha il vantaggio che le parti già allocate dell'immagine possono essere riutilizzate in seguito, il che può comunque contribuire a risparmiare una quantità notevole di spazio.

Warning Su uno storage che non è thinly provisioned, ad esempio, LVM o ZFS senza l'opzione sparse, è necessario riservare in anticipo l'intera dimensione del disco originale per l'immagine di fleecing. Su uno storage thinly provisioned, l'immagine di fleecing può crescere fino alla stessa dimensione dell'immagine originale solo se il guest riscrive un intero disco mentre il backup è occupato con un altro disco.

16.1.2. Modalità di rilevamento delle modifiche CT

L'impostazione della modalità di rilevamento delle modifiche definisce il formato di codifica per gli archivi pxar e il modo in cui i file modificati e non modificati vengono gestiti per i backup dei container con Proxmox Backup Server come destinazione.

L'opzione della modalità di rilevamento delle modifiche può essere configurata per singoli job di backup nella scheda Avanzate durante la modifica di un job. Inoltre, questa opzione può essere impostata come fallback a livello di nodo tramite le opzioni di configurazione.

Sono disponibili 3 modalità di rilevamento delle modifiche:

Modalità Descrizione

Default

Leggere e codificare tutti i file in un unico archivio, usando la versione 1 del formato pxar.

Data

Leggere e codificare tutti i file, ma separare i dati e i metadati in stream distinti, usando la versione 2 del formato pxar.

Metadata

Dividere gli stream e usare la versione 2 del formato di archivio come Data, ma usare l'archivio dei metadati dello snapshot precedente (se ne esiste uno) per rilevare i file non modificati e riutilizzare i relativi chunk di dati senza leggere il contenuto dei file dal disco, quando possibile.

Per eseguire un backup usando la modalità di rilevamento delle modifiche metadata è possibile eseguire

vzdump 123 --storage pbs-storage --pbs-change-detection-mode metadata
Note I backup delle VM o verso backend di storage diversi da Proxmox Backup Server non sono interessati da questa impostazione.

16.2. Nomi dei file di backup

Le versioni più recenti di vzdump codificano il tipo di guest e l'ora del backup nel nome del file, ad esempio

vzdump-lxc-105-2009_10_09-11_04_43.tar

In questo modo è possibile memorizzare diversi backup nella stessa directory. È possibile limitare il numero di backup conservati con varie opzioni di retention; vedere la sezione Retention dei backup di seguito.

16.3. Compressione dei file di backup

Il file di backup può essere compresso con uno dei seguenti algoritmi: lzo
[Lempel–Ziv–Oberhumer, un algoritmo di compressione dati senza perdita https://en.wikipedia.org/wiki/Lempel-Ziv-Oberhumer]
, gzip
[gzip - basato sull'algoritmo DEFLATE https://en.wikipedia.org/wiki/Gzip]
o zstd
[Zstandard, un algoritmo di compressione dati senza perdita https://en.wikipedia.org/wiki/Zstandard]
.

Attualmente, Zstandard (zstd) è il più veloce di questi tre algoritmi. Il multi-threading è un altro vantaggio di zstd rispetto a lzo e gzip. Lzo e gzip sono più diffusi e spesso installati per impostazione predefinita.

È possibile installare pigz
[pigz - implementazione parallela di gzip https://zlib.net/pigz/]
come sostituto diretto di gzip per ottenere migliori prestazioni grazie al multi-threading. Per pigz e zstd, la quantità di thread/core può essere regolata. Vedere le opzioni di configurazione di seguito.

L'estensione del nome del file di backup può solitamente essere usata per determinare quale algoritmo di compressione è stato usato per creare il backup.

.zst

Compressione Zstandard (zstd)

.gz o .tgz

compressione gzip

.lzo

compressione lzo

Se il nome del file di backup non termina con una delle estensioni di file sopra indicate, non è stato compresso da vzdump.

16.4. Crittografia del backup

Per gli storage Proxmox Backup Server, è possibile opzionalmente configurare la crittografia lato client dei backup; vedere la sezione corrispondente.

16.5. Job di backup

screenshot/gui-cluster-backup-overview.png

Oltre ad avviare un backup manualmente, è possibile anche configurare job periodici che eseguono il backup di tutti i guest virtuali, o di una selezione di essi, su uno storage. È possibile gestire i job nell'interfaccia web in Datacenter → Backup oppure tramite l'endpoint API /cluster/backup. Entrambi generano voci di job in /etc/pve/jobs.cfg, che vengono analizzate ed eseguite dal demone pvescheduler.

screenshot/gui-cluster-backup-edit-01-general.png

Un job viene configurato per tutti i nodi del cluster oppure per un nodo specifico, e viene eseguito secondo una pianificazione indicata. Il formato della pianificazione è molto simile agli eventi calendario di systemd; vedere la sezione eventi calendario per i dettagli. Il campo Pianificazione nell'interfaccia web può essere modificato liberamente e contiene diversi esempi utilizzabili come punto di partenza nell'elenco a discesa.

È possibile configurare opzioni di retention specifiche per il job, che sovrascrivono quelle della configurazione dello storage o del nodo, nonché un modello per le note per informazioni aggiuntive da salvare insieme al backup.

Poiché i backup pianificati non vengono eseguiti se l'host era offline o il pvescheduler era disabilitato nell'orario previsto, è possibile configurare il comportamento di recupero. Attivando l'opzione Repeat missed (nella scheda Avanzate nell'interfaccia web, repeat-missed nella configurazione), è possibile indicare allo scheduler di eseguire i job mancati non appena possibile.

screenshot/gui-cluster-backup-edit-04-advanced.png

Sono disponibili alcune impostazioni per regolare le prestazioni del backup (alcune delle quali sono esposte nella scheda Avanzate dell'interfaccia web). La più rilevante è bwlimit, per limitare la banda IO. Il numero di thread utilizzati dal compressore può essere controllato con l'impostazione pigz (che sostituisce gzip) o, rispettivamente, zstd. Sono inoltre disponibili ionice (quando viene utilizzato lo scheduler BFQ) e, nell'ambito dell'impostazione performance, max-workers (riguarda solo i backup delle VM) e pbs-entries-max (riguarda solo i backup dei container). Vedere le opzioni di configurazione per i dettagli.

16.6. Retention dei backup

Con l'opzione prune-backups è possibile specificare in modo flessibile quali backup mantenere.

screenshot/gui-cluster-backup-edit-02-retention.png

Sono disponibili le seguenti opzioni di retention:

keep-all <boolean>

Mantiene tutti i backup. Se impostato su true, non è possibile impostare altre opzioni.

keep-last <N>

Mantiene gli ultimi <N> backup.

keep-hourly <N>

Mantiene i backup delle ultime <N> ore. Se per una singola ora è presente più di un backup, viene mantenuto solo il più recente.

keep-daily <N>

Mantiene i backup degli ultimi <N> giorni. Se per un singolo giorno è presente più di un backup, viene mantenuto solo il più recente.

keep-weekly <N>

Mantiene i backup delle ultime <N> settimane. Se per una singola settimana è presente più di un backup, viene mantenuto solo il più recente.

Note Le settimane iniziano di lunedì e terminano di domenica. Il software utilizza il sistema ISO week date e gestisce correttamente le settimane a fine anno.
keep-monthly <N>

Mantiene i backup degli ultimi <N> mesi. Se per un singolo mese è presente più di un backup, viene mantenuto solo il più recente.

keep-yearly <N>

Mantiene i backup degli ultimi <N> anni. Se per un singolo anno è presente più di un backup, viene mantenuto solo il più recente.

Le opzioni di retention vengono elaborate nell'ordine indicato sopra. Ogni opzione copre solo i backup compresi nel proprio periodo di tempo. L'opzione successiva non si occupa dei backup già coperti. Verranno considerati solo i backup più vecchi.

Specificare le opzioni di retention da utilizzare come elenco separato da virgole, ad esempio:

# vzdump 777 --prune-backups keep-last=3,keep-daily=13,keep-yearly=9

Sebbene sia possibile passare prune-backups direttamente a vzdump, è spesso più sensato configurare l'impostazione a livello di storage, cosa che può essere fatta tramite l'interfaccia web.

16.6.1. Simulatore di prune

È possibile utilizzare il simulatore di prune della documentazione di Proxmox Backup Server per esplorare l'effetto di diverse opzioni di conservazione con varie pianificazioni di backup.

16.6.2. Esempio di impostazioni di conservazione

La frequenza dei backup e la conservazione dei backup precedenti possono dipendere da quanto spesso i dati cambiano e da quanto può essere importante uno stato precedente, in un determinato carico di lavoro. Quando i backup fungono da archivio documentale di un'azienda, possono esserci anche requisiti legali sulla durata di conservazione dei backup.

Per questo esempio, si assume che vengano eseguiti backup giornalieri, con un periodo di conservazione di 10 anni, e che il periodo tra i backup conservati cresca gradualmente.

keep-last=3 - anche se vengono eseguiti solo backup giornalieri, un amministratore potrebbe voler creare un backup extra appena prima o dopo un grande aggiornamento. Impostare keep-last garantisce questa possibilità.

keep-hourly non è impostato - per i backup giornalieri questo non è rilevante. I backup manuali extra sono già coperti da keep-last.

keep-daily=13 - insieme a keep-last, che copre almeno un giorno, questo garantisce almeno due settimane di backup.

keep-weekly=8 - garantisce almeno due mesi completi di backup settimanali.

keep-monthly=11 - insieme alle impostazioni keep precedenti, questo garantisce almeno un anno di backup mensili.

keep-yearly=9 - questo è per l'archivio a lungo termine. Poiché l'anno corrente è già coperto dalle opzioni precedenti, questo valore andrebbe impostato a nove per gli anni rimanenti, ottenendo un totale di almeno 10 anni di copertura.

Si consiglia di utilizzare un periodo di conservazione superiore al minimo richiesto dal proprio ambiente; è sempre possibile ridurlo in seguito se risulta eccessivo, ma non è possibile ricreare i backup una volta rimossi.

16.7. Protezione dei backup

È possibile contrassegnare un backup come protected per evitarne la rimozione. Il tentativo di rimuovere un backup protetto tramite l'interfaccia web, la CLI o l'API di Proxmox VE non riuscirà. Tuttavia, questo vincolo è applicato da Proxmox VE e non dal file system, il che significa che la rimozione manuale di un file di backup rimane possibile per chiunque disponga dell'accesso in scrittura allo storage di backup sottostante.

Note I backup protetti vengono ignorati dal prune e non vengono conteggiati nelle impostazioni di conservazione.

Per gli storage basati su file system, la protezione viene implementata tramite un file sentinella <backup-name>.protected. Per Proxmox Backup Server, viene gestita lato server (disponibile a partire dalla versione 2.1 di Proxmox Backup Server).

Utilizzare l'opzione di storage max-protected-backups per controllare quanti backup protetti per guest sono consentiti sullo storage. Utilizzare -1 per un numero illimitato. Il valore predefinito è illimitato per gli utenti con il privilegio Datastore.Allocate e 5 per gli altri utenti.

16.8. Note sui backup

È possibile aggiungere note ai backup utilizzando il pulsante Edit Notes nell'interfaccia o tramite l'API dei contenuti dello storage.

screenshot/gui-cluster-backup-edit-03-template.png

È inoltre possibile specificare un modello per generare note dinamicamente per un job di backup e per i backup manuali. La stringa del modello può contenere variabili, racchiuse tra doppie parentesi graffe, che verranno sostituite con il valore corrispondente al momento dell'esecuzione del backup.

Attualmente sono supportati:

  • {{cluster}} il nome del cluster, se presente

  • {{guestname}} il nome assegnato al guest virtuale

  • {{node}} il nome host del nodo su cui viene creato il backup

  • {{vmid}} il VMID numerico del guest

Quando specificato tramite API o CLI, deve essere su un'unica riga, in cui il carattere di nuova riga e la barra inversa devono essere rappresentati mediante le sequenze di escape letterali \n e \\ rispettivamente.

16.9. Ripristino

Un archivio di backup può essere ripristinato tramite l'interfaccia web di Proxmox VE o tramite i seguenti strumenti CLI:

pct restore

Strumento di ripristino dei container

qmrestore

Strumento di ripristino delle macchine virtuali

Per i dettagli, consultare le rispettive pagine di manuale.

16.9.1. Limite di banda

Il ripristino di uno o più backup di grandi dimensioni può richiedere molte risorse, in particolare banda di storage sia per la lettura dallo storage di backup che per la scrittura sullo storage di destinazione. Ciò può influire negativamente su altri guest virtuali, poiché l'accesso allo storage può risultare congestionato.

Per evitare questo, è possibile impostare limiti di banda per un job di backup. Proxmox VE implementa due tipi di limiti per il ripristino e l'archivio:

  • limite per ripristino: indica la quantità massima di banda per la lettura da un archivio di backup

  • limite di scrittura per storage: indica la quantità massima di banda utilizzata per la scrittura su un determinato storage

Il limite di lettura influisce indirettamente sul limite di scrittura, poiché non è possibile scrivere più di quanto si legga. Un limite per singolo job più piccolo sovrascriverà un limite per storage più grande. Un limite per singolo job più grande sovrascriverà il limite per storage solo se si dispone dei permessi "Data.Allocate" sullo storage interessato.

È possibile usare l'opzione ‘--bwlimit <integer>` dei comandi CLI di ripristino per impostare un limite di banda specifico per il job di ripristino. Il limite è espresso in KiB/s, il che significa che passando `10240’ si limiterà la velocità di lettura del backup a 10 MiB/s, garantendo che il resto della banda dello storage sia disponibile per i guest virtuali già in esecuzione, evitando così che il backup influisca sulle loro operazioni.

Note È possibile usare ‘0` per il parametro bwlimit per disabilitare tutti i limiti per uno specifico job di ripristino. Questo può essere utile se è necessario ripristinare un guest virtuale molto importante il più rapidamente possibile. (Richiede i permessi `Data.Allocate’ sullo storage)

Nella maggior parte dei casi la banda generalmente disponibile dello storage rimane invariata nel tempo, pertanto è stata implementata la possibilità di impostare un limite di banda predefinito per ogni storage configurato; ciò può essere fatto con:

# pvesm set STORAGEID --bwlimit restore=KIBs

16.9.2. Live-Restore

Il ripristino di un backup di grandi dimensioni può richiedere molto tempo, durante il quale un guest rimane non disponibile. Per i backup di VM memorizzati su un Proxmox Backup Server, questo tempo di attesa può essere ridotto utilizzando l'opzione live-restore.

Attivando il live-restore tramite la casella di controllo nella GUI o tramite l'argomento --live-restore di qmrestore, la VM viene avviata non appena inizia il ripristino. I dati vengono copiati in background, dando priorità ai chunk a cui la VM accede attivamente.

Da notare che questo comporta due avvertenze:

  • Durante il live-restore, la VM opererà con velocità di lettura del disco limitate, poiché i dati devono essere caricati dal backup server (una volta caricati, tuttavia, sono immediatamente disponibili sullo storage di destinazione, quindi accedere ai dati due volte comporta la penalità solo la prima volta). Le velocità di scrittura non sono praticamente influenzate.

  • Se il live-restore fallisce per qualsiasi motivo, la VM rimarrà in uno stato indefinito, ovvero non tutti i dati potrebbero essere stati copiati dal backup, e con molta probabilità non è possibile conservare i dati scritti durante l'operazione di ripristino fallita.

Questa modalità operativa è particolarmente utile per VM di grandi dimensioni, dove è richiesta solo una piccola quantità di dati per il funzionamento iniziale, ad esempio i server web: una volta avviati il sistema operativo e i servizi necessari, la VM è operativa, mentre l'attività in background continua a copiare i dati utilizzati raramente.

16.9.3. Ripristino di singoli file

Il pulsante File Restore nella scheda Backup della GUI dello storage può essere usato per aprire un file browser direttamente sui dati contenuti in un backup. Questa funzionalità è disponibile solo per i backup su un Proxmox Backup Server.

Per i container, il primo livello dell'albero dei file mostra tutti gli archivi pxar inclusi, che possono essere aperti ed esplorati liberamente. Per le VM, il primo livello mostra le immagini dei dischi contenute, che possono essere aperte per visualizzare un elenco delle tecnologie di storage supportate rilevate sul disco. Nel caso più semplice, si tratterà di una voce chiamata part, che rappresenta una tabella delle partizioni, contenente voci per ogni partizione rilevata sul disco. Si noti che, per le VM, non tutti i dati potrebbero essere accessibili (file system guest non supportati, tecnologie di storage, ecc…).

I file e le directory possono essere scaricati utilizzando il pulsante Download; nel caso delle directory, queste vengono compresse al volo in un archivio zip.

Per consentire l'accesso sicuro alle immagini VM, che potrebbero contenere dati non attendibili, viene avviata una VM temporanea (non visibile come guest). Questo non significa che i dati scaricati da tale archivio siano intrinsecamente sicuri, ma evita di esporre l'hypervisor a rischi. La VM si arresterà automaticamente dopo un timeout. Questo intero processo avviene in modo trasparente dal punto di vista dell'utente.

Note Per scopi di risoluzione dei problemi, ogni istanza di VM temporanea genera un file di log in /var/log/proxmox-backup/file-restore/. Il file di log potrebbe contenere informazioni aggiuntive nel caso in cui un tentativo di ripristinare singoli file o di accedere ai file system contenuti in un archivio di backup fallisca.

16.10. Configurazione

La configurazione globale è memorizzata in /etc/vzdump.conf. Il file utilizza un semplice formato chiave/valore separato da due punti. Ogni riga ha il seguente formato:

OPTION: value

Le righe vuote nel file vengono ignorate, e le righe che iniziano con il carattere # sono considerate commenti e vengono anch'esse ignorate. I valori di questo file vengono utilizzati come predefiniti e possono essere sovrascritti dalla riga di comando.

Attualmente sono supportate le seguenti opzioni:

bwlimit: <integer> (0 - N) (predefinito = 0)

Limitare la banda I/O (in KiB/s).

compress: <0 | 1 | gzip | lzo | zstd> (predefinito = 0)

Comprimere il file di dump.

dumpdir: <string>

Memorizzare i file risultanti nella directory specificata.

exclude-path: <array>

Escludere determinati file/directory (shell globs). I percorsi che iniziano con / sono ancorati alla radice del container, gli altri percorsi corrispondono relativamente a ciascuna sottodirectory.

fleecing: [[enabled=]<1|0>] [,storage=<storage ID>]

Opzioni per il fleecing del backup (solo VM).

enabled=<boolean> (default = 0)

Abilitare il fleecing del backup. Memorizzare nella cache sullo storage specificato i dati di backup provenienti dai blocchi interessati da nuove scritture del guest, invece di copiarli direttamente nella destinazione del backup. Questo può migliorare le prestazioni I/O del guest e persino evitare blocchi, ma richiede più spazio di storage.

storage=<storage ID>

Utilizzare questo storage per memorizzare le immagini di fleecing. Per un utilizzo efficiente dello spazio, è preferibile utilizzare uno storage locale che supporti il discard e, in alternativa, il thin provisioning o i file sparse.

ionice: <integer> (0 - 8) (default = 7)

Impostare la priorità IO quando si utilizza lo scheduler BFQ. Per i backup delle VM in modalità snapshot e suspend, questo influisce solo sul compressore. Un valore di 8 significa che viene utilizzata la priorità idle, altrimenti viene utilizzata la priorità best-effort con il valore specificato.

lockwait: <integer> (0 - N) (default = 180)

Tempo massimo di attesa per il lock globale (minuti).

mailnotification: <always | failure> (default = always)

Deprecato: utilizzare invece le destinazioni/i matcher di notifica. Specificare quando inviare un'email di notifica

mailto: <string>

Deprecato: utilizzare invece le destinazioni/i matcher di notifica. Elenco separato da virgole di indirizzi email o utenti che devono ricevere notifiche via email.

mode: <snapshot | stop | suspend> (default = snapshot)

Modalità di backup.

notes-template: <string>

Stringa modello per generare le note per uno o più backup. Può contenere variabili che verranno sostituite dai rispettivi valori. Attualmente sono supportate {\{\cluster}}, {\{\guestname}}, {\{\node}} e {\{\vmid}}, ma in futuro potrebbero esserne aggiunte altre. Deve essere composta da una singola riga; il carattere di nuova riga e la barra rovesciata devono essere rappresentati mediante le sequenze di escape \n e \\ rispettivamente.

Note Richiede l'opzione/le opzioni: storage
notification-mode: <auto | legacy-sendmail | notification-system> (default = auto)

Determinare quale sistema di notifica utilizzare. Se impostato su legacy-sendmail, vzdump considererà i parametri mailto/mailnotification e invierà email agli indirizzi specificati tramite il comando sendmail. Se impostato su notification-system, una notifica verrà inviata tramite il sistema di notifica di PVE e i parametri mailto e mailnotification verranno ignorati. Se impostato su auto (impostazione predefinita), verrà inviata un'email se mailto è impostato e verrà utilizzato il sistema di notifica in caso contrario.

pbs-change-detection-mode: <data | legacy | metadata>

Modalità PBS utilizzata per rilevare le modifiche ai file e cambiare il formato di codifica per i backup dei container.

performance: [max-workers=<integer>] [,pbs-entries-max=<integer>]

Altre impostazioni relative alle prestazioni.

max-workers=<integer> (1 - 256) (default = 16)

Si applica alle VM. Consente di utilizzare contemporaneamente fino a questo numero di worker IO.

pbs-entries-max=<integer> (1 - N) (default = 1048576)

Si applica ai backup dei container inviati a PBS. Limita il numero di voci consentite in memoria in un dato momento per evitare situazioni di OOM indesiderate. Aumentarlo per consentire il backup di container con un numero elevato di file.

pigz: <integer> (default = 0)

Utilizzare pigz invece di gzip quando N>0. N=1 utilizza metà dei core, N>1 utilizza N come numero di thread.

pool: <string>

Eseguire il backup di tutti i sistemi guest noti inclusi nel pool specificato.

protected: <boolean>

Se true, contrassegnare i backup come protetti.

Note Richiede l'opzione/le opzioni: storage
prune-backups: [keep-all=<1|0>] [,keep-daily=<N>] [,keep-hourly=<N>] [,keep-last=<N>] [,keep-monthly=<N>] [,keep-weekly=<N>] [,keep-yearly=<N>] (default = keep-all=1)

Utilizzare queste opzioni di conservazione invece di quelle della configurazione dello storage.

keep-all=<boolean>

Conservare tutti i backup. Se impostata su true, questa opzione è in conflitto con le altre opzioni.

keep-daily=<N>

Conservare i backup degli ultimi <N> giorni distinti. Se per un singolo giorno è presente più di un backup, viene conservato solo il più recente.

keep-hourly=<N>

Conservare i backup delle ultime <N> ore distinte. Se per una singola ora è presente più di un backup, viene conservato solo il più recente.

keep-last=<N>

Conservare gli ultimi <N> backup.

keep-monthly=<N>

Conservare i backup degli ultimi <N> mesi distinti. Se per un singolo mese è presente più di un backup, viene conservato solo il più recente.

keep-weekly=<N>

Conservare i backup delle ultime <N> settimane differenti. Se per una singola settimana è presente più di un backup, viene conservato solo il più recente.

keep-yearly=<N>

Conservare i backup degli ultimi <N> anni distinti. Se per un singolo anno è presente più di un backup, viene conservato solo il più recente.

remove: <boolean> (default = 1)

Eliminare i backup meno recenti secondo prune-backups.

script: <string>

Utilizzare lo script hook specificato.

stdexcludes: <boolean> (default = 1)

Esclude i file temporanei e i log.

stopwait: <integer> (0 - N) (default = 10)

Tempo massimo di attesa per l'arresto di un sistema guest (minuti).

storage: <storage ID>

Memorizzare il file risultante in questo storage.

tmpdir: <string>

Memorizzare i file temporanei nella directory specificata.

zstd: <integer> (default = 1)

Thread zstd. Con N=0 viene utilizzata metà dei core disponibili; se N è impostato su un valore maggiore di 0, N viene utilizzato come numero di thread.

Example vzdump.conf Configuration
tmpdir: /mnt/fast_local_disk
storage: my_backup_storage
mode: snapshot
bwlimit: 10000

16.11. Script hook

È possibile specificare uno script hook con l'opzione --script. Questo script viene richiamato in varie fasi del processo di backup, con i parametri impostati di conseguenza. È possibile trovare un esempio nella directory della documentazione (vzdump-hook-script.pl).

16.12. Esclusioni di file

Note questa opzione è disponibile solo per i backup dei container.

vzdump esclude per impostazione predefinita i seguenti file (disabilitare con l'opzione --stdexcludes 0)

/tmp/?*
/var/tmp/?*
/var/run/?*pid

È inoltre possibile specificare manualmente percorsi di esclusione (aggiuntivi), ad esempio:

# vzdump 777 --exclude-path /tmp/ --exclude-path '/var/foo*'

esclude la directory /tmp/ e qualsiasi file o directory denominato /var/foo, /var/foobar, e così via.

Warning Per i backup su Proxmox Backup Server (PBS) e per i backup in modalità suspend, i pattern con una barra finale corrispondono alle directory, ma non ai file. D'altra parte, per i backup non-PBS in modalità snapshot e in modalità stop, i pattern con una barra finale al momento non corrispondono a nulla, poiché il comando tar non supporta questa funzionalità.

I percorsi che non iniziano con / non sono ancorati alla radice del container, ma corrispondono relativamente a qualsiasi sottodirectory. Ad esempio:

# vzdump 777 --exclude-path bar

esclude qualsiasi file o directory denominato /bar, /var/bar, /var/foo/bar, e così via, ma non /bar2.

I file di configurazione vengono memorizzati anche all'interno dell'archivio di backup (in ./etc/vzdump/) e verranno ripristinati correttamente.

16.13. Esempi

Eseguire semplicemente il dump del guest 777 - senza snapshot, archiviando solo l'area privata e i file di configurazione del guest nella directory di dump predefinita (solitamente /var/lib/vz/dump/).

# vzdump 777

Utilizzo di rsync e suspend/resume per creare uno snapshot (downtime minimo).

# vzdump 777 --mode suspend

Backup di tutti i sistemi guest e invio di e-mail di notifica a root e admin. Poiché mailto è impostato e notification-mode è impostato su auto per impostazione predefinita, le e-mail di notifica vengono inviate tramite il comando sendmail del sistema invece che tramite il sistema di notifica.

# vzdump --all --mode suspend --mailto root --mailto admin

Utilizzo della modalità snapshot (nessun downtime) e di una directory di dump non predefinita.

# vzdump 777 --dumpdir /mnt/backup --mode snapshot

Backup di più di un guest (selettivo)

# vzdump 101 102 103 --mailto root

Backup di tutti i guest escludendo 101 e 102

# vzdump --mode suspend --exclude 101,102

Ripristino di un container in un nuovo CT 600

# pct restore 600 /mnt/backup/vzdump-lxc-777.tar

Ripristino di una VM QemuServer nella VM 601

# qmrestore /mnt/backup/vzdump-qemu-888.vma 601

Clonazione di un container esistente 101 in un nuovo container 300 con un file system root di 4GB, utilizzando le pipe

# vzdump 101 --stdout | pct restore --rootfs 4 300 -

17. Notifiche

17.1. Panoramica

  • Proxmox VE emette eventi di notifica in caso di errori di replicazione dello storage, fencing dei nodi, backup completati/non riusciti e altri eventi. Questi eventi vengono elaborati in base alle impostazioni di notifica globali. Ogni evento di notifica include metadati, come un timestamp, un livello di gravità, un tipo e campi aggiuntivi specifici dell'evento.

  • I matcher di notifica instradano un evento di notifica verso una o più destinazioni di notifica. Un matcher può avere regole di corrispondenza per instradare in modo selettivo in base ai metadati di un evento di notifica.

  • Le destinazioni di notifica sono destinazioni verso cui un evento di notifica viene instradato da un matcher. Esistono più tipi di destinazione: basati su e-mail (Sendmail e SMTP) e Gotify.

Le impostazioni di notifica globali possono essere configurate nella GUI in Datacenter → Notifications. La configurazione è memorizzata in /etc/pve/notifications.cfg e /etc/pve/priv/notifications.cfg - quest'ultimo contiene opzioni di configurazione sensibili come password o token di autenticazione per le destinazioni di notifica e può essere letto solo da root.

17.2. Destinazioni di notifica

Proxmox VE offre più tipi di destinazioni di notifica.

17.2.1. Sendmail

screenshot/gui-datacenter-notification-sendmail.png

Il binario sendmail è un programma comunemente presente nei sistemi operativi simili a Unix che gestisce l'invio di messaggi e-mail. È un'utility a riga di comando che consente a utenti e applicazioni di inviare e-mail direttamente dalla riga di comando o dall'interno di script.

La destinazione di notifica sendmail utilizza il binario sendmail per inviare e-mail a un elenco di utenti configurati o indirizzi e-mail. Se un utente viene selezionato come destinatario, verrà utilizzato l'indirizzo e-mail configurato nelle impostazioni dell'utente. Per l'utente root@pam, si tratta dell'indirizzo e-mail inserito durante l'installazione. L'indirizzo e-mail di un utente può essere configurato in Datacenter → Permissions → Users. Se un utente non ha un indirizzo e-mail associato, non verrà inviata alcuna e-mail.

Note Nelle installazioni standard di Proxmox VE, il binario sendmail è fornito da Postfix. Potrebbe essere necessario configurare Postfix in modo che possa consegnare le e-mail correttamente - ad esempio impostando un relay di posta esterno (smart host). In caso di consegna non riuscita, verificare i log di sistema per i messaggi registrati dal demone Postfix.

La configurazione per i plugin di destinazione Sendmail prevede le seguenti opzioni:

  • mailto: indirizzo e-mail a cui deve essere inviata la notifica. Può essere impostato più volte per includere più destinatari.

  • mailto-user: utenti a cui devono essere inviate le e-mail. L'indirizzo e-mail dell'utente verrà ricercato in users.cfg. Può essere impostato più volte per includere più destinatari.

  • author: imposta l'autore dell'e-mail. Il valore predefinito è Proxmox VE.

  • from-address: imposta l'indirizzo del mittente dell'e-mail. Se il parametro non è impostato, il plugin utilizzerà l'impostazione email_from di datacenter.cfg. Se anche questa non è impostata, il plugin utilizzerà come valore predefinito root@$hostname, dove $hostname è il nome host del nodo. L'intestazione From nell'e-mail verrà impostata su $author <$from-address>.

  • comment: commento per questa destinazione

Esempio di configurazione (/etc/pve/notifications.cfg):

sendmail: example
        mailto-user root@pam
        mailto-user admin@pve
        mailto max@example.com
        from-address pve1@example.com
        comment Send to multiple users/addresses

17.2.2. SMTP

screenshot/gui-datacenter-notification-smtp.png

Le destinazioni di notifica SMTP possono inviare e-mail direttamente a un relay di posta SMTP. Questa destinazione non utilizza l'MTA del sistema per consegnare le e-mail. In modo analogo alle destinazioni sendmail, se un utente viene selezionato come destinatario, verrà utilizzato l'indirizzo e-mail configurato dell'utente.

Note A differenza delle destinazioni sendmail, le destinazioni SMTP non dispongono di alcun meccanismo di accodamento/ripetizione in caso di mancato recapito della mail.

La configurazione per i plugin di destinazione SMTP prevede le seguenti opzioni:

  • mailto: indirizzo e-mail a cui deve essere inviata la notifica. Può essere impostato più volte per includere più destinatari.

  • mailto-user: utenti a cui devono essere inviate le e-mail. L'indirizzo e-mail dell'utente verrà ricercato in users.cfg. Può essere impostato più volte per includere più destinatari.

  • author: imposta l'autore dell'e-mail. Il valore predefinito è Proxmox VE.

  • from-address: imposta l'indirizzo From dell'email. I relay SMTP potrebbero richiedere che questo indirizzo sia di proprietà dell'utente per evitare lo spoofing. L'header From dell'email verrà impostato su $author <$from-address>.

  • username: nome utente da usare durante l'autenticazione. Se non viene impostato alcun nome utente, non verrà eseguita alcuna autenticazione. Sono supportati i metodi di autenticazione PLAIN e LOGIN.

  • password: password da usare per l'autenticazione.

  • mode: imposta la modalità di crittografia (insecure, starttls o tls). Il valore predefinito è tls.

  • server: indirizzo/IP del relay SMTP.

  • port: la porta a cui connettersi. Se non impostata, la porta utilizzata per impostazione predefinita è 25 (insecure), 465 (tls) o 587 (starttls), a seconda del valore di mode.

  • comment: commento per questa destinazione

Esempio di configurazione (/etc/pve/notifications.cfg):

smtp: example
        mailto-user root@pam
        mailto-user admin@pve
        mailto max@example.com
        from-address pve1@example.com
        username pve1
        server mail.example.com
        mode starttls

La voce corrispondente in /etc/pve/priv/notifications.cfg, contenente la password:

smtp: example
        password somepassword

17.2.3. Gotify

screenshot/gui-datacenter-notification-gotify.png

Gotify è un server di notifiche open source self-hosted che consente di inviare e ricevere notifiche push su vari dispositivi e applicazioni. Fornisce una semplice API e un'interfaccia web, rendendo semplice l'integrazione con diverse piattaforme e servizi.

La configurazione per i plugin di destinazione Gotify prevede le seguenti opzioni:

  • server: l'URL di base del server Gotify, ad es. http://<ip>:8888

  • token: il token di autenticazione. I token possono essere generati tramite l'interfaccia web di Gotify.

  • comment: commento per questa destinazione

Note Il plugin di destinazione Gotify rispetta le impostazioni del proxy HTTP definite nella configurazione del datacenter

Esempio di configurazione (/etc/pve/notifications.cfg):

gotify: example
        server http://gotify.example.com:8888
        comment Send to multiple users/addresses

La voce corrispondente in /etc/pve/priv/notifications.cfg, contenente il token segreto:

gotify: example
        token somesecrettoken

17.2.4. Webhook

Le destinazioni di notifica Webhook eseguono richieste HTTP verso un URL configurabile.

Sono disponibili le seguenti opzioni di configurazione:

  • url: l'URL verso cui eseguire le richieste HTTP. Supporta il templating per inserire contenuti del messaggio, metadati e segreti.

  • method: metodo HTTP da utilizzare (POST/PUT/GET)

  • header: array di header HTTP da impostare per la richiesta. Supporta il templating per inserire contenuti del messaggio, metadati e segreti.

  • body: corpo HTTP da inviare. Supporta il templating per inserire contenuti del messaggio, metadati e segreti.

  • secret: array di coppie chiave-valore segrete. Verranno memorizzate in un file di configurazione protetto, leggibile solo da root. I segreti sono accessibili nei template di body/header/URL tramite lo spazio dei nomi secrets.

  • comment: commento per questa destinazione.

Per le opzioni di configurazione che supportano il templating, è possibile utilizzare la sintassi Handlebars per accedere alle seguenti proprietà:

  • {{ title }}: il titolo renderizzato della notifica

  • {{ message }}: il corpo renderizzato della notifica

  • {{ severity }}: la gravità della notifica (info, notice, warning, error, unknown)

  • {{ timestamp }}: il timestamp della notifica come UNIX epoch (in secondi).

  • {{ fields.<name> }}: sotto-spazio dei nomi per eventuali campi di metadati della notifica. Ad esempio, fields.type contiene il tipo di notifica - per tutti i campi disponibili fare riferimento a Eventi di notifica.

  • {{ secrets.<name> }}: Sotto-namespace per i secret. Ad esempio, un secret denominato token è accessibile tramite secrets.token.

Per comodità, sono disponibili i seguenti helper:

  • {{ url-encode <value/property> }}: Codifica in URL una proprietà/un valore letterale.

  • {{ escape <value/property> }}: Esegue l'escape di qualsiasi carattere di controllo che non può essere rappresentato in modo sicuro come stringa JSON.

  • {{ json <value/property> }}: Esegue il rendering di un valore come JSON. Può essere utile per passare un intero sotto-namespace (ad es. fields) come parte di un payload JSON (ad es. {{ json fields }}).

Esempi
ntfy.sh
  • Metodo: POST

  • URL: https://ntfy.sh/{{ secrets.channel }}

  • Header:

    • Markdown: Sì

  • Corpo:

```
{{ message }}
```
  • Secret:

    • channel: <proprio canale ntfy.sh>

Discord
  • Metodo: POST

  • URL: https://discord.com/api/webhooks/{{ secrets.token }}

  • Header:

    • Content-Type: application/json

  • Corpo:

{
  "content": "``` {{ escape message }}```"
}
  • Secret:

    • token: <token>

Slack
  • Metodo: POST

  • URL: https://hooks.slack.com/services/{{ secrets.token }}

  • Header:

    • Content-Type: application/json

  • Corpo:

{
  "text": "``` {{escape message}}```",
  "type": "mrkdwn"
}
  • Secret:

    • token: <token>

17.3. Matcher di notifica

screenshot/gui-datacenter-notification-matcher.png

I matcher di notifica instradano le notifiche verso le destinazioni di notifica in base alle loro regole di corrispondenza. Queste regole possono far corrispondere determinate proprietà di una notifica, come il timestamp (match-calendar), la gravità della notifica (match-severity) o campi di metadati (match-field). Se una notifica viene fatta corrispondere da un matcher, tutte le destinazioni configurate per il matcher riceveranno la notifica.

È possibile creare un numero arbitrario di matcher, ciascuno con proprie regole di corrispondenza e destinazioni da notificare. Ogni destinazione viene notificata al massimo una volta per ogni notifica, anche se la destinazione viene utilizzata in più matcher.

Un matcher senza alcuna regola di corrispondenza è sempre vero; le destinazioni configurate verranno sempre notificate.

matcher: always-matches
        target admin
        comment This matcher always matches

17.3.1. Opzioni del matcher

  • target: Determina quale destinazione deve essere notificata se il matcher corrisponde. Può essere utilizzato più volte per notificare più destinazioni.

  • invert-match: Inverte il risultato dell'intero matcher

  • mode: Determina come vengono valutate le singole regole di corrispondenza per calcolare il risultato per l'intero matcher. Se impostato su all, tutte le regole di corrispondenza devono corrispondere. Se impostato su any, almeno una regola deve corrispondere. Il valore predefinito è all.

  • match-calendar: Verificare la corrispondenza del timestamp della notifica con una pianificazione.

  • match-field: Verificare la corrispondenza dei campi dei metadati della notifica.

  • match-severity: verificare la corrispondenza con la gravità della notifica.

  • comment: commento per questa regola di corrispondenza.

17.3.2. Regole di corrispondenza del calendario

Una regola di corrispondenza del calendario confronta l'orario di invio di una notifica con una pianificazione configurabile.

  • match-calendar 8-12

  • match-calendar 8:00-15:30

  • match-calendar mon..fri 9:00-17:00

  • match-calendar sun,tue..wed,fri 9-17

17.3.3. Regole di corrispondenza dei campi

Le notifiche dispongono di una selezione di campi di metadati che possono essere confrontati. Quando si utilizza exact come modalità di corrispondenza, è possibile utilizzare , come separatore. La regola di corrispondenza trova quindi una corrispondenza se il campo di metadati presenta uno qualsiasi dei valori specificati.

  • match-field exact:type=vzdump Corrisponde solo alle notifiche relative ai backup.

  • match-field exact:type=replication,fencing Corrisponde alle notifiche replication e fencing.

  • match-field regex:hostname=^.+\.example\.com$ Verificare la corrispondenza con il nome host del nodo.

Se un campo di metadati confrontato non esiste, la notifica non verrà trovata come corrispondente. Ad esempio, una direttiva match-field regex:hostname=.* troverà una corrispondenza solo per le notifiche che presentano un campo di metadati hostname arbitrario, ma non troverà una corrispondenza se il campo non esiste.

17.3.4. Regole di corrispondenza della gravità

A una notifica è associata una gravità che può essere confrontata.

  • match-severity error: corrisponde solo agli errori

  • match-severity warning,error: corrisponde ad avvisi ed errori

Sono in uso le seguenti gravità: info, notice, warning, error, unknown.

17.3.5. Esempi

matcher: workday
        match-calendar mon..fri 9-17
        target admin
        comment Notify admins during working hours

matcher: night-and-weekend
        match-calendar mon..fri 9-17
        invert-match true
        target on-call-admins
        comment Separate target for non-working hours
matcher: backup-failures
        match-field exact:type=vzdump
        match-severity error
        target backup-admins
        comment Send notifications about backup failures to one group of admins

matcher: cluster-failures
        match-field exact:type=replication,fencing
        target cluster-admins
        comment Send cluster-related notifications to other group of admins

17.4. Eventi di notifica

Evento type Gravità Campi di metadati (in aggiunta a type)

Aggiornamenti di sistema disponibili

package-updates

info

hostname

Nodo del cluster isolato (fenced)

fencing

error

hostname

Job di replicazione dello storage non riuscito

replication

error

hostname, job-id

Backup riuscito

vzdump

info

hostname, job-id (solo per i job di backup)

Backup non riuscito

vzdump

error

hostname, job-id (solo per i job di backup)

Mail per root

system-mail

unknown

hostname

Nome del campo Descrizione

type

Tipo di notifica

hostname

Hostname, senza dominio (es. pve1)

job-id

ID del job

Note Le notifiche dei job di backup hanno il campo job-id impostato solo se il job di backup è stato eseguito automaticamente in base alla sua pianificazione, ma non se è stato avviato manualmente tramite il pulsante Esegui ora nell'interfaccia utente.

17.5. Inoltro della posta di sistema

Alcuni demoni di sistema locali, come smartd, generano email di notifica inizialmente indirizzate all'utente locale root. Queste email vengono convertite in eventi di notifica con il tipo system-mail e una gravità unknown e vengono elaborate in base alle impostazioni globali di notifica.

Quando l'email viene inoltrata a una destinazione sendmail, il contenuto e le intestazioni dell'email vengono inoltrati così come sono. Per tutte le altre destinazioni, il sistema tenta di estrarre sia una riga dell'oggetto che il corpo del testo principale dal contenuto dell'email. Nei casi in cui le email sono composte esclusivamente da contenuto HTML, verranno trasformate in formato testo semplice durante questo processo.

17.6. Permessi

Per modificare/visualizzare la configurazione delle destinazioni di notifica, sono richiesti i permessi Mapping.Modify/Mapping.Audit per il nodo ACL /mapping/notifications.

Il test di una destinazione richiede i permessi Mapping.Use, Mapping.Audit o Mapping.Modify su /mapping/notifications

17.7. Modalità di notifica

I job di backup consentono di scegliere tra due modalità per l'invio delle notifiche relative al backup. Questo è controllato dall'opzione notification-mode nella configurazione del job di backup.

  • Inviare le notifiche in base alle impostazioni globali di notifica (notification-system).

  • Inviare le email di notifica tramite il comando sendmail del sistema all'indirizzo email configurato nel job di backup (legacy-sendmail). Questa modalità consente anche di selezionare se l'email deve essere inviata sempre oppure solo in caso di errore del backup. Tutte le destinazioni e tutti i matcher configurati nelle impostazioni globali di notifica vengono ignorati. Questa modalità è equivalente al comportamento di notifica delle versioni di Proxmox VE precedenti alla 8.1. Questa modalità potrebbe essere rimossa in una versione successiva di Proxmox VE.

17.8. Sostituzione dei template di notifica

Proxmox VE utilizza template Handlebars per il rendering delle notifiche. I template originali forniti da Proxmox VE sono memorizzati in /usr/share/pve-manager/templates/default/.

I template di notifica possono essere sostituiti fornendo un file di template personalizzato nella directory di override in /etc/pve/notification-templates/default/. Durante il rendering di una notifica di un determinato tipo, Proxmox VE tenterà prima di caricare un template dalla directory di override. Se questo non esiste o il rendering non riesce, verrà utilizzato il template originale.

I file di template seguono la convenzione di denominazione <type>-<body|subject>.<html|txt>.hbs. Ad esempio, il file vzdump-body.html.hbs contiene il template per il rendering della versione HTML delle notifiche di backup, mentre package-updates-subject.txt.hbs viene utilizzato per il rendering della riga dell'oggetto delle notifiche per gli aggiornamenti dei package disponibili.

Le destinazioni di notifica basate su email, come sendmail e smtp, inviano sempre messaggi multi-part con una parte HTML e una parte in testo semplice. Di conseguenza, verranno utilizzati sia il template <type>-body.html.hbs sia il template <type>-body.txt.hbs durante il rendering del messaggio email. Tutti gli altri tipi di destinazione di notifica utilizzano solo il template <type>-body.txt.hbs.

18. Demoni di servizio importanti

18.1. pvedaemon - Demone API di Proxmox VE

Questo demone espone l'intera API di Proxmox VE su 127.0.0.1:85. Viene eseguito come root e dispone dei permessi per eseguire tutte le operazioni privilegiate.

Note Il demone è in ascolto solo su un indirizzo locale, pertanto non è possibile accedervi dall'esterno. Il demone pveproxy espone l'API al mondo esterno.

18.1.1. Numero di worker

pvedaemon delega la gestione delle richieste in arrivo a processi worker. Per impostazione predefinita, pvedaemon avvia 3 processi worker, un numero sufficiente per la maggior parte dei carichi di lavoro. Per carichi di lavoro fortemente automatizzati che generano un volume elevato di richieste API e che presentano una gestione lenta delle richieste o timeout, il numero di processi worker può essere aumentato impostando MAX_WORKERS in /etc/default/pvedaemon, ad esempio:

MAX_WORKERS=5

Si noti che un numero maggiore di processi worker può comportare un utilizzo più elevato della CPU. Il numero di processi worker deve essere maggiore di 0 e inferiore a 128.

La stessa impostazione esiste per pveproxy.

18.2. pveproxy - Demone proxy API di Proxmox VE

Questo demone espone l'intera API di Proxmox VE sulla porta TCP 8006 tramite HTTPS. Viene eseguito come utente www-data e dispone di permessi molto limitati. Le operazioni che richiedono permessi maggiori vengono inoltrate al pvedaemon locale.

Le richieste destinate ad altri nodi vengono inoltrate automaticamente a tali nodi. Ciò significa che è possibile gestire l'intero cluster collegandosi a un singolo nodo Proxmox VE.

18.2.1. Controllo degli accessi basato su host

È possibile configurare liste di controllo degli accessi simili a quelle di "apache2". I valori vengono letti dal file /etc/default/pveproxy. Ad esempio:

ALLOW_FROM="10.0.0.1-10.0.0.5,192.168.0.0/22"
DENY_FROM="all"
POLICY="allow"

Gli indirizzi IP possono essere specificati utilizzando qualsiasi sintassi comprensibile da Net::IP. Il nome all è un alias per 0/0 e ::/0 (ovvero tutti gli indirizzi IPv4 e IPv6).

La policy predefinita è allow.

Corrispondenza POLICY=deny POLICY=allow

Corrispondenza solo con Allow

allow

allow

Corrispondenza solo con Deny

deny

deny

Nessuna corrispondenza

deny

allow

Corrispondenza sia con Allow che con Deny

deny

allow

18.2.2. Indirizzo IP di ascolto

Per impostazione predefinita, i demoni pveproxy e spiceproxy sono in ascolto sull'indirizzo wildcard e accettano connessioni sia da client IPv4 che IPv6.

Impostando LISTEN_IP in /etc/default/pveproxy è possibile controllare su quale indirizzo IP restano in ascolto i demoni pveproxy e spiceproxy. L'indirizzo IP deve essere configurato sul sistema.

Impostare il parametro sysctl net.ipv6.bindv6only al valore non predefinito 1 farà sì che i demoni accettino connessioni solo da client IPv6, causando però di solito anche molti altri problemi. Se si imposta questa configurazione, si consiglia di rimuovere l'impostazione sysctl, oppure di impostare LISTEN_IP su 0.0.0.0 (che consentirà solo client IPv4).

LISTEN_IP può essere utilizzato per limitare il socket a un'interfaccia interna e quindi avere una minore esposizione verso internet pubblico, ad esempio:

LISTEN_IP="192.0.2.1"

Analogamente, è possibile impostare anche un indirizzo IPv6:

LISTEN_IP="2001:db8:85a3::1"

Si noti che, per specificare un indirizzo IPv6 link-local, è necessario indicare il nome dell'interfaccia stessa. Ad esempio:

LISTEN_IP="fe80::c463:8cff:feb9:6a4e%vmbr0"
Warning I nodi di un cluster necessitano dell'accesso a pveproxy per la comunicazione, eventualmente su sottoreti diverse. Non è consigliato impostare LISTEN_IP su sistemi in cluster.

Per applicare la modifica è necessario riavviare il nodo oppure riavviare completamente i servizi pveproxy e spiceproxy:

systemctl restart pveproxy.service spiceproxy.service
Note A differenza di reload, un restart del servizio pveproxy può interrompere alcuni processi worker di lunga durata, ad esempio una console o una shell in esecuzione in un guest virtuale. Si consiglia pertanto di rendere effettiva questa modifica durante una finestra di manutenzione.

18.2.3. Suite di cifratura SSL

È possibile definire l'elenco delle cifrature in /etc/default/pveproxy tramite le chiavi CIPHERS (TLS ⇐ 1.2) e CIPHERSUITES (TLS >= 1.3). Ad esempio

CIPHERS="ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"
CIPHERSUITES="TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"

Quanto sopra rappresenta il valore predefinito. Consultare la pagina man ciphers(1) del package openssl per un elenco di tutte le opzioni disponibili.

Inoltre, è possibile impostare il client affinché scelga la cifratura utilizzata in /etc/default/pveproxy (il valore predefinito è la prima cifratura nell'elenco disponibile sia per il client che per pveproxy):

HONOR_CIPHER_ORDER=0

18.2.4. Versioni TLS supportate

Le versioni SSL 2 e 3, non sicure, sono disabilitate incondizionatamente per pveproxy. Le versioni TLS inferiori a 1.1 sono disabilitate per impostazione predefinita nelle versioni recenti di OpenSSL, impostazione rispettata da pveproxy (vedere /etc/ssl/openssl.cnf).

Per disabilitare la versione TLS 1.2 o 1.3, impostare quanto segue in /etc/default/pveproxy:

DISABLE_TLS_1_2=1

oppure, rispettivamente:

DISABLE_TLS_1_3=1
Note A meno che non vi sia un motivo specifico per farlo, non si consiglia di modificare manualmente le versioni TLS supportate.

18.2.5. Parametri Diffie-Hellman

È possibile definire i parametri Diffie-Hellman utilizzati in /etc/default/pveproxy impostando DHPARAMS con il percorso di un file contenente i parametri DH in formato PEM, ad esempio

DHPARAMS="/path/to/dhparams.pem"

Se questa opzione non è impostata, verranno utilizzati i parametri skip2048 integrati.

Note I parametri DH vengono utilizzati solo se viene negoziata una suite di cifratura che utilizza l'algoritmo di scambio delle chiavi DH.

18.2.6. Certificato HTTPS alternativo

È possibile sostituire il certificato utilizzato con uno esterno o con uno ottenuto tramite ACME.

pveproxy utilizza /etc/pve/local/pveproxy-ssl.pem e /etc/pve/local/pveproxy-ssl.key, se presenti, e ricorre in alternativa a /etc/pve/local/pve-ssl.pem e /etc/pve/local/pve-ssl.key. La chiave privata non può utilizzare una passphrase.

È possibile sovrascrivere la posizione della chiave privata del certificato /etc/pve/local/pveproxy-ssl.key impostando TLS_KEY_FILE in /etc/default/pveproxy, ad esempio:

TLS_KEY_FILE="/secrets/pveproxy.key"
Note L'integrazione ACME inclusa non rispetta questa impostazione.

Per maggiori dettagli, consultare il capitolo Amministrazione del sistema host della documentazione.

18.2.7. Compressione della risposta

Per impostazione predefinita pveproxy utilizza la compressione gzip a livello HTTP per i contenuti comprimibili, se il client la supporta. Questa funzione può essere disabilitata in /etc/default/pveproxy:

COMPRESSION=0
Note Disabilitare la compressione mitiga gli attacchi side-channel di tipo BREACH contro i cookie delle sessioni autenticate, a costo di un utilizzo leggermente maggiore della larghezza di banda da parte dell'interfaccia web. Nella maggior parte delle installazioni non è necessario modificare l'impostazione predefinita; è opportuno valutare la disabilitazione della compressione sugli host in cui l'interfaccia web è esposta su reti di cui non si ha il pieno controllo.

18.2.8. Registrazione dell'IP reale del client

Per impostazione predefinita, pveproxy registra l'indirizzo IP del client che ha inviato la richiesta. Nei casi in cui un server proxy si trova davanti a pveproxy, potrebbe essere opportuno registrare l'IP del client che effettua la richiesta invece dell'IP del proxy.

Per abilitare l'elaborazione di un header HTTP impostato dal proxy a scopo di registrazione, impostare PROXY_REAL_IP_HEADER con il nome dell'header da cui recuperare l'IP del client. Ad esempio:

PROXY_REAL_IP_HEADER="X-Forwarded-For"

Qualsiasi valore non valido passato in questo header verrà ignorato.

Il comportamento predefinito consiste nel registrare il valore di questo header su tutte le richieste in entrata. Per definire un elenco di server proxy considerati attendibili per impostare l'header HTTP sopra indicato, impostare PROXY_REAL_IP_ALLOW_FROM, ad esempio:

PROXY_REAL_IP_ALLOW_FROM="192.168.0.2"

L'impostazione PROXY_REAL_IP_ALLOW_FROM supporta anche valori simili a quelli supportati dalle impostazioni ALLOW_FROM e DENY_FROM.

Gli indirizzi IP possono essere specificati utilizzando qualsiasi sintassi comprensibile da Net::IP. Il nome all è un alias per 0/0 e ::/0 (ovvero tutti gli indirizzi IPv4 e IPv6).

18.2.9. Numero di worker

pveproxy delega la gestione delle richieste in arrivo a processi worker. Per impostazione predefinita, pveproxy avvia 3 processi worker, un numero sufficiente per la maggior parte dei carichi di lavoro. Per carichi di lavoro fortemente automatizzati che generano un enorme volume di richieste API e che presentano una gestione lenta delle richieste o timeout, il numero di processi worker può essere aumentato impostando MAX_WORKERS in /etc/default/pveproxy, ad esempio:

MAX_WORKERS=5

Si noti che un numero maggiore di processi worker può comportare un utilizzo più elevato della CPU. Il numero di processi worker deve essere maggiore di 0 e inferiore a 128.

La stessa impostazione esiste per pvedaemon.

18.3. pvestatd - Demone di stato di Proxmox VE

Questo daemon interroga lo stato di VM, storage e container a intervalli regolari. Il risultato viene inviato a tutti i nodi del cluster.

18.4. spiceproxy - Servizio proxy SPICE

SPICE (Simple Protocol for Independent Computing Environments) è una soluzione di calcolo remoto open source, che fornisce accesso client a display e dispositivi remoti (ad es. tastiera, mouse, audio). Il caso d'uso principale è ottenere l'accesso remoto a macchine virtuali e container.

Questo daemon resta in ascolto sulla porta TCP 3128 e implementa un proxy HTTP per inoltrare la richiesta CONNECT dal client SPICE alla VM Proxmox VE corretta. Viene eseguito come utente www-data e ha permessi molto limitati.

18.4.1. Controllo accessi basato su host

È possibile configurare liste di controllo accessi simili a quelle di "apache2". I valori vengono letti dal file /etc/default/pveproxy. Per i dettagli, consultare la documentazione di pveproxy.

18.5. pvescheduler - Demone di pianificazione di Proxmox VE

Questo daemon è responsabile dell'avvio dei job secondo la pianificazione, come i job di replicazione e di vzdump.

Per i job di vzdump, la configurazione viene letta dal file /etc/pve/jobs.cfg

19. Strumenti da riga di comando utili

19.1. pvesubscription - Gestione abbonamenti

Questo strumento viene usato per gestire gli abbonamenti Proxmox VE.

19.2. pveperf - Script di benchmark Proxmox VE

Tenta di raccogliere alcuni dati sulle prestazioni di CPU/disco rigido sul disco rigido montato in PATH (/ è usato come predefinito):

CPU BOGOMIPS

somma dei bogomips di tutte le CPU

REGEX/SECOND

espressioni regolari al secondo (test delle prestazioni di perl), il valore dovrebbe essere superiore a 300000

HD SIZE

dimensione del disco rigido

BUFFERED READS

semplice test di lettura degli HD. Gli HD moderni dovrebbero raggiungere almeno 40 MB/sec

AVERAGE SEEK TIME

verifica il tempo medio di seek. Gli HD SCSI veloci raggiungono valori < 8 millisecondi. I comuni dischi IDE/SATA ottengono valori da 15 a 20 ms.

FSYNCS/SECOND

il valore dovrebbe essere superiore a 200 (è consigliabile abilitare la modalità cache write back sul controller RAID - necessita di una cache con batteria tampone (BBWC)).

DNS EXT

tempo medio per risolvere un nome DNS esterno

DNS INT

tempo medio per risolvere un nome DNS locale

19.3. Interfaccia shell per l'API di Proxmox VE

Lo strumento di gestione di Proxmox VE (pvesh) consente di invocare direttamente le funzioni API, senza utilizzare il server REST/HTTPS.

Note Solo root è autorizzato a farlo.

19.3.1. Esempi

Ottenere l'elenco dei nodi nel proprio cluster

# pvesh get /nodes

Ottenere un elenco delle opzioni disponibili per il datacenter

# pvesh usage cluster/options -v

Impostare la console HTML5 NoVNC come console predefinita per il datacenter

# pvesh set cluster/options -console html5

20. Domande frequenti

Note Le nuove domande frequenti vengono aggiunte in fondo a questa sezione.
  1. Su quale distribuzione è basato Proxmox VE?

    Proxmox VE è basato su Debian GNU/Linux

  2. Quale licenza utilizza il progetto Proxmox VE?

    Il codice di Proxmox VE è concesso in licenza secondo i termini della GNU Affero General Public License, versione 3.

  3. Proxmox VE funziona su un processore a 32 bit?

    Proxmox VE funziona solo su CPU a 64 bit. Le architetture supportate sono x86_64 (AMD64 o Intel 64) e aarch64 sulle piattaforme NVIDIA Grace Hopper e NVIDIA Vera. Non è previsto il supporto di host a 32 bit.

    Note Le VM e i container possono essere sia a 32 bit che a 64 bit.
  4. La CPU in uso supporta la virtualizzazione?

    Per verificare se la CPU è compatibile con la virtualizzazione, controllare la presenza del tag vmx o svm nell'output del seguente comando:

    egrep '(vmx|svm)' /proc/cpuinfo
    Note Questo controllo si applica solo agli host x86. Sulle piattaforme arm64 supportate, la virtualizzazione KVM assistita dall'hardware è disponibile e non riporta alcun flag CPU equivalente.
  5. CPU Intel supportate

    Processori a 64 bit con supporto per Intel Virtualization Technology (Intel VT-x). (Elenco dei processori a 64 bit con Intel VT)

  6. CPU AMD supportate

    Processori a 64 bit con supporto per AMD Virtualization Technology (AMD-V).

  7. Piattaforme arm64 supportate

    Le piattaforme NVIDIA Grace Hopper e NVIDIA Vera. Per i dettagli, vedere Supporto ARM a 64 bit (arm64).

  8. Che cos'è un container/ambiente virtuale (VE)/server privato virtuale (VPS)?

    Nel contesto dei container, questi termini si riferiscono tutti al concetto di virtualizzazione a livello di sistema operativo. La virtualizzazione a livello di sistema operativo è un metodo di virtualizzazione in cui il kernel di un sistema operativo consente più istanze isolate, che condividono tutte il kernel. Quando si fa riferimento a LXC, tali istanze vengono chiamate container. Poiché i container utilizzano il kernel dell'host invece di emulare un sistema operativo completo, richiedono un overhead inferiore, ma sono limitati ai guest Linux.

  9. Che cos'è un guest QEMU/KVM (o VM)?

    Un guest QEMU/KVM (o VM) è un sistema guest in esecuzione virtualizzata su Proxmox VE tramite QEMU e il modulo kernel Linux KVM.

  10. Che cos'è QEMU?

    QEMU è un emulatore e virtualizzatore di macchine generico e open source. QEMU utilizza il modulo kernel Linux KVM per ottenere prestazioni quasi native eseguendo il codice del guest direttamente sulla CPU dell'host. Non è limitato ai guest Linux, ma consente l'esecuzione di sistemi operativi arbitrari.

  11. Per quanto tempo sarà supportata la versione di Proxmox VE in uso?

    Le versioni di Proxmox VE sono supportate almeno per tutto il tempo in cui la corrispondente versione di Debian è supportata dal Debian Security Team, ovvero per circa 3 anni dal rilascio iniziale; vedere Durata del supporto Debian. Proxmox VE utilizza un modello a rilascio continuo (rolling release) e si consiglia sempre di utilizzare l'ultima versione stabile.

    Versione di Proxmox VE Versione di Debian Primo rilascio Fine supporto Debian Fine supporto Proxmox

    Proxmox VE 9

    Debian 13 (Trixie)

    2025-08

    da definire

    da definire

    Proxmox VE 8

    Debian 12 (Bookworm)

    2023-06

    2026-07

    2026-08

    Proxmox VE 7

    Debian 11 (Bullseye)

    2021-07

    2024-07

    2024-07

    Proxmox VE 6

    Debian 10 (Buster)

    2019-07

    2022-09

    2022-09

    Proxmox VE 5

    Debian 9 (Stretch)

    2017-07

    2020-07

    2020-07

    Proxmox VE 4

    Debian 8 (Jessie)

    2015-10

    2018-06

    2018-06

    Proxmox VE 3

    Debian 7 (Wheezy)

    2013-05

    2016-04

    2017-02

    Proxmox VE 2

    Debian 6 (Squeeze)

    2012-04

    2014-05

    2014-05

    Proxmox VE 1

    Debian 5 (Lenny)

    2008-10

    2012-03

    2013-01

  12. Come è possibile aggiornare Proxmox VE alla successiva point release?

    Gli aggiornamenti di versione minore, ad esempio l'aggiornamento di Proxmox VE dalla versione 8.1 alla 8.2 o 8.3, possono essere effettuati come un normale aggiornamento. È comunque consigliabile consultare le note di rilascio per eventuali modifiche rilevanti o che introducono cambiamenti incompatibili.

    Per eseguire l'aggiornamento, utilizzare il pannello Nodo → Aggiornamenti dell'interfaccia Web oppure procedere tramite CLI con:

    apt update
    apt full-upgrade
    Note Assicurarsi sempre di configurare correttamente i repository dei package e procedere con l'aggiornamento effettivo solo se apt update non ha riportato errori.
  13. Come è possibile aggiornare Proxmox VE alla successiva major release?

    Gli aggiornamenti di versione major, ad esempio il passaggio da Proxmox VE 8.4 a 9.0, sono anch'essi supportati. Devono essere pianificati e testati con attenzione e non vanno mai avviati senza disporre di un backup aggiornato.

    Sebbene i passaggi specifici di aggiornamento dipendano dalla configurazione in uso, vengono fornite istruzioni generali e consigli su come eseguire un aggiornamento:

  14. LXC vs LXD vs container Proxmox vs Docker

    LXC è un'interfaccia userspace per le funzionalità di containment del kernel Linux. Attraverso una potente API e strumenti semplici, consente agli utenti Linux di creare e gestire facilmente container di sistema. LXC, così come il precedente OpenVZ, è orientato alla virtualizzazione di sistema. Consente quindi di eseguire un sistema operativo completo all'interno di un container, nel quale è possibile effettuare il login tramite ssh, aggiungere utenti, eseguire apache, ecc…

    LXD è costruito sopra LXC per offrire un'esperienza utente nuova e migliore. Internamente, LXD utilizza LXC tramite liblxc e il suo binding Go per creare e gestire i container. È essenzialmente un'alternativa agli strumenti e al sistema di template di distribuzione di LXC, con le funzionalità aggiuntive derivanti dalla possibilità di controllo tramite rete.

    I container Proxmox sono i container creati e gestiti tramite il Proxmox Container Toolkit (pct). Anche questi sono orientati alla virtualizzazione di sistema e utilizzano LXC come base dell'offerta di container. Con l'aggiunta del supporto alle immagini OCI (tech preview), Proxmox VE può anche creare container a partire da immagini OCI, inclusi container di sistema completi ma anche container applicativi (tech preview). Il Proxmox Container Toolkit (pct) è strettamente integrato con Proxmox VE. Ciò significa che è consapevole delle configurazioni cluster e può utilizzare le stesse risorse di rete e storage delle macchine virtuali (VM) QEMU. È persino possibile utilizzare il firewall di Proxmox VE, creare e ripristinare backup, oppure gestire i container tramite il framework HA. Tutto può essere controllato tramite rete utilizzando l'API di Proxmox VE.

    Docker è orientato all'esecuzione di una singola applicazione in un ambiente isolato e autonomo. Questi vengono generalmente definiti "container applicativi", piuttosto che "container di sistema". Un'istanza Docker viene gestita dall'host, utilizzando l'interfaccia a riga di comando di Docker Engine. Non è consigliato eseguire docker direttamente sull'host Proxmox VE.

    Note Sebbene possa essere comodo eseguire i "container applicativi" direttamente come container Proxmox, farlo è attualmente una tech preview. Per casi d'uso che richiedono l'orchestrazione dei container o la live migration, si consiglia comunque di eseguirli all'interno di una macchina virtuale Proxmox QEMU.

21. Bibliografia

Books about Proxmox VE
  • [Ahmed16] Wasim Ahmed. Mastering Proxmox - Third Edition. Packt Publishing, 2017. ISBN 978-1788397605

  • [Ahmed15] Wasim Ahmed. Proxmox Cookbook. Packt Publishing, 2015. ISBN 978-1783980901

  • [Cheng14] Simon M.C. Cheng. Proxmox High Availability. Packt Publishing, 2014. ISBN 978-1783980888

  • [Goldman16] Rik Goldman. Learning Proxmox VE. Packt Publishing, 2016. ISBN 978-1783981786

  • [Surber16]] Lee R. Surber. Virtualization Complete: Business Basic Edition. Linux Solutions (LRS-TEK), 2016. ASIN B01BBVQZT6

Books about related technology
  • [Hertzog13] Raphaël Hertzog, Roland Mas., Freexian SARL The Debian Administrator's Handbook: Debian Bullseye from Discovery to Mastery, Freexian, 2021. ISBN 979-10-91414-20-3

  • [Bir96] Kenneth P. Birman. Building Secure and Reliable Network Applications. Manning Publications Co, 1996. ISBN 978-1884777295

  • [Walsh10] Norman Walsh. DocBook 5: The Definitive Guide. O’Reilly & Associates, 2010. ISBN 978-0596805029

  • [Richardson07] Leonard Richardson & Sam Ruby. RESTful Web Services. O’Reilly Media, 2007. ISBN 978-0596529260

  • [Singh15] Karan Singh. Learning Ceph. Packt Publishing, 2015. ISBN 978-1783985623

  • [Singh16] Karan Signh. Ceph Cookbook Packt Publishing, 2016. ISBN 978-1784393502

  • [Mauerer08] Wolfgang Mauerer. Professional Linux Kernel Architecture. John Wiley & Sons, 2008. ISBN 978-0470343432

  • [Loshin03] Pete Loshin, IPv6: Theory, Protocol, and Practice, 2nd Edition. Morgan Kaufmann, 2003. ISBN 978-1558608108

  • [Loeliger12] Jon Loeliger & Matthew McCullough. Version Control with Git: Powerful tools and techniques for collaborative software development. O’Reilly and Associates, 2012. ISBN 978-1449316389

  • [Kreibich10] Jay A. Kreibich. Using SQLite, O’Reilly and Associates, 2010. ISBN 978-0596521189

Books about related topics
  • [Bessen09] James Bessen & Michael J. Meurer, Patent Failure: How Judges, Bureaucrats, and Lawyers Put Innovators at Risk. Princeton Univ Press, 2009. ISBN 978-0691143217

22. Appendice A: interfaccia a riga di comando

22.1. Generale

Per quanto riguarda lo stile storicamente non uniforme delle maiuscole per le opzioni, vedere la sezione relativa ai file di configurazione.

22.2. Opzioni di formato di output [FORMAT_OPTIONS]

È possibile specificare il formato di output usando il parametro --output-format. Il formato predefinito text usa ASCII-art per disegnare bordi gradevoli attorno alle tabelle. Inoltre trasforma alcuni valori in testo leggibile, ad esempio:

  • L'epoca Unix viene visualizzata come stringa di data ISO 8601.

  • Le durate vengono visualizzate come conteggio di settimane/giorni/ore/minuti/secondi, ad es. 1d 5h.

  • I valori delle dimensioni in byte includono le unità (B, KiB, MiB, GiB, TiB, PiB).

  • Le frazioni vengono visualizzate come percentuale, ad es. 1.0 viene visualizzato come 100%.

È anche possibile disattivare completamente l'output usando l'opzione --quiet.

--human-readable <boolean> (predefinito = 1)

Richiamare le funzioni di rendering dell'output per produrre testo leggibile da persone.

--noborder <boolean> (predefinito = 0)

Non disegnare i bordi (per il formato text).

--noheader <boolean> (predefinito = 0)

Non mostrare le intestazioni delle colonne (per il formato text).

--output-format <json | json-pretty | text | yaml> (predefinito = text)

Formato di output.

--quiet <boolean>

Non stampa i risultati.

22.3. pvesm - Proxmox VE Storage Manager

pvesm <COMMAND> [ARGS] [OPTIONS]

pvesm add <type> <storage> [OPTIONS]

Creare un nuovo storage.

<type>: <btrfs | cephfs | cifs | dir | esxi | iscsi | iscsidirect | lvm | lvmthin | nfs | pbs | rbd | zfs | zfspool>

Tipo di storage.

<storage>: <storage ID>

L'identificatore dello storage.

--authsupported <string>

Authsupported.

--base <string>

Volume di base. Questo volume viene attivato automaticamente.

--blocksize <una potenza di 2 con suffisso opzionale k o m>

Dimensione del blocco ZFS

--bwlimit [clone=<LIMIT>] [,default=<LIMIT>] [,migration=<LIMIT>] [,move=<LIMIT>] [,restore=<LIMIT>]

Impostare il limite di larghezza di banda I/O per le varie operazioni (in KiB/s).

--comstar_hg <string>

gruppo host per le viste comstar

--comstar_tg <string>

gruppo target per le viste comstar

--content <string>

Tipi di contenuto consentiti.

Note il valore rootdir viene utilizzato per i container e il valore images per le VM.
--content-dirs <string>

Override delle directory predefinite per i tipi di contenuto.

--create-base-path <boolean> (default = yes)

Creare la directory di base se non esiste.

--create-subdirs <boolean> (default = yes)

Popolare la directory con la struttura predefinita.

--data-pool <string>

Pool di dati (solo per erasure coding)

--datastore <string>

Nome del datastore di Proxmox Backup Server.

--disable <boolean>

Flag per disabilitare lo storage.

--domain <string>

Dominio CIFS.

--encryption-key un file contenente una chiave di cifratura, oppure il valore speciale "autogen"

Chiave di cifratura. Usare autogen per generarne una automaticamente senza passphrase.

--export <string>

Percorso di export NFS.

--fingerprint ([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}

Fingerprint SHA 256 del certificato.

--format <qcow2 | raw | subvol | vmdk>

Formato immagine predefinito.

--fs-name <string>

Nome del filesystem Ceph.

--fuse <boolean>

Montare CephFS tramite FUSE.

--is_mountpoint <string> (default = no)

Considerare il percorso indicato come un punto di mount gestito esternamente e considerare lo storage offline se non è montato. L'uso di un valore booleano (yes/no) costituisce una scorciatoia rispetto all'uso del percorso di destinazione in questo campo.

--iscsiprovider <string>

Provider iscsi

--keyring file contenente il keyring per autenticarsi nel cluster Ceph

Contenuto del keyring client (per cluster esterni).

--krbd <boolean> (default = 0)

Accedere sempre a rbd tramite il modulo kernel krbd.

--lio_tpg <string>

gruppo di portali di destinazione per i target Linux LIO

--master-pubkey un file contenente una chiave pubblica principale in formato PEM

Chiave pubblica RSA in formato PEM, codificata in Base64. Utilizzata per cifrare una copia della chiave di cifratura che verrà aggiunta a ogni backup cifrato.

--max-protected-backups <integer> (-1 - N) (valore predefinito = Illimitato per gli utenti con il privilegio Datastore.Allocate, 5 per gli altri utenti)

Numero massimo di backup protetti per guest. Usare -1 per un valore illimitato.

--mkdir <boolean> (default = yes)

Creare la directory se non esiste e popolarla con le sottodirectory predefinite. NOTA: opzione deprecata; usare invece le opzioni create-base-path e create-subdirs.

--monhost <string>

Indirizzi IP dei monitor (per cluster esterni).

--mountpoint <string>

Punto di mount

--namespace <string>

Namespace.

--nocow <boolean> (default = 0)

Impostare il flag NOCOW sui file. Disabilita il checksum dei dati e rende irrecuperabili gli errori sui dati, consentendo però l'I/O diretto. Utilizzare questa opzione solo se i dati non richiedono una protezione superiore a quella di un singolo disco formattato in ext4 senza un sistema RAID sottostante.

--nodes <string>

Elenco dei nodi a cui si applica la configurazione dello storage.

--nowritecache <boolean>

disabilitare la cache di scrittura sul target

--options <string>

Opzioni di mount NFS/CIFS (vedere man nfs o man mount.cifs)

--password <password>

Password per accedere alla condivisione/al datastore.

--path <string>

Percorso del file system.

--pool <string>

Pool.

--port <integer> (1 - 65535)

Utilizzare questa porta per connettersi allo storage invece di quella predefinita (ad esempio, con PBS o ESXi). Per NFS e CIFS, utilizzare l'opzione options per configurare la porta tramite le opzioni di mount.

--portal <string>

Portale iSCSI (IP o nome DNS con porta opzionale).

--preallocation <falloc | full | metadata | off> (default = metadata)

Modalità di preallocazione per le immagini raw e qcow2. Utilizzando metadata sulle immagini raw si ottiene preallocation=off.

--prune-backups [keep-all=<1|0>] [,keep-daily=<N>] [,keep-hourly=<N>] [,keep-last=<N>] [,keep-monthly=<N>] [,keep-weekly=<N>] [,keep-yearly=<N>]

Le opzioni di conservazione con intervalli più brevi vengono elaborate per prime, con --keep-last come prima in assoluto. Ogni opzione copre un periodo di tempo specifico: si dice che i backup all'interno di questo periodo sono coperti da tale opzione. L'opzione successiva non considera i backup già coperti e prende in esame solo quelli più vecchi.

--saferemove <boolean>

Azzerare i dati durante la rimozione dei LV.

--saferemove-stepsize <1 | 16 | 2 | 32 | 4 | 8> (default = 32)

Dimensione del passo di wipe in MiB. Verrà limitata al massimo supportato dallo storage.

--saferemove_throughput <string>

Throughput di wipe (valore del parametro -t di cstream).

--server <string>

IP del server o nome DNS.

--share <string>

Share CIFS.

--shared <boolean>

Indicare che si tratta di un singolo storage con lo stesso contenuto su tutti i nodi (o su tutti quelli elencati nell'opzione nodes). Non rende automaticamente accessibile ad altri nodi il contenuto di uno storage locale, ma si limita a contrassegnare come tale uno storage già condiviso!

--skip-cert-verification <boolean> (default = false)

Disabilitare la verifica del certificato TLS; abilitare questa opzione solo su reti completamente fidate!

--smbversion <2.0 | 2.1 | 3 | 3.0 | 3.11 | default> (default = default)

Versione del protocollo SMB. Se non specificata, viene utilizzato default, che negozia la versione SMB2+ più alta supportata sia dal client che dal server.

--snapshot-as-volume-chain <boolean> (default = 0)

Abilitare il supporto per la creazione di snapshot indipendenti dal fornitore di storage tramite catene di backing dei volumi.

--sparse <boolean>

utilizzare volumi sparse

--subdir <string>

Sottodirectory da montare.

--tagged_only <boolean>

Elencare solo i volumi logici contrassegnati con il tag pve-vm-ID.

--target <string>

Target iSCSI.

--thinpool <string>

Nome del LV del pool thin LVM.

--username <string>

ID RBD.

--vgname <string>

Nome del gruppo di volumi.

--zfs-base-path <string>

Percorso di base in cui cercare i device a blocchi ZFS creati. Impostato automaticamente durante la creazione se non specificato. Solitamente /dev/zvol.

pvesm alloc <storage> <vmid> <filename> <size> [OPTIONS]

Allocare immagini disco.

<storage>: <storage ID>

L'identificatore dello storage.

<vmid>: <integer> (100 - 999999999)

Specificare la VM proprietaria

<filename>: <string>

Il nome del file da creare.

<size>: \d+[MG]?

Dimensione in kilobyte (1024 byte). Suffissi opzionali M (megabyte, 1024K) e G (gigabyte, 1024M)

--format <qcow2 | raw | subvol | vmdk>

Formato dell'immagine.

Note Richiede l'opzione: size

pvesm apiinfo

Restituisce APIVER e APIAGE.

pvesm cifsscan

Un alias per pvesm scan cifs.

pvesm export <volume> <format> <filename> [OPTIONS]

Utilizzato internamente per esportare un volume.

<volume>: <string>

Identificatore del volume

<format>: <btrfs | qcow2+size | raw+size | tar+size | vmdk+size | zfs>

Formato del flusso di esportazione

<filename>: <string>

Nome del file di destinazione

--base (?^i:[a-z0-9_\-]{1,40})

Snapshot da cui avviare un flusso incrementale

--snapshot (?^i:[a-z0-9_\-]{1,40})

Snapshot da esportare

--snapshot-list <string>

Elenco ordinato di snapshot da trasferire

--with-snapshots <boolean> (default = 0)

Indica se includere gli snapshot intermedi nel flusso

pvesm extractconfig <volume>

Estrae la configurazione dall'archivio di backup vzdump.

<volume>: <string>

Identificatore del volume

pvesm free <volume> [OPTIONS]

Eliminare il volume

<volume>: <string>

Identificatore del volume

--delay <integer> (1 - 30)

Tempo di attesa per il completamento dell'operazione. Viene restituito null se l'operazione termina entro tale periodo.

--storage <storage ID>

L'identificatore dello storage.

pvesm help [OPTIONS]

Visualizzare la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvesm import <volume> <format> <filename> [OPTIONS]

Utilizzato internamente per importare un volume.

<volume>: <string>

Identificatore del volume

<format>: <btrfs | qcow2+size | raw+size | tar+size | vmdk+size | zfs>

Formato dello stream di importazione

<filename>: <string>

Nome del file sorgente. Per - viene utilizzato stdin, il formato tcp://<IP-or-CIDR> consente di utilizzare una connessione TCP, il formato unix://PATH-TO-SOCKET un socket UNIX come input. Altrimenti, il file viene trattato come un file comune.

--allow-rename <boolean> (predefinito = 0)

Scegliere un nuovo ID volume se l'ID volume richiesto esiste già, invece di generare un errore.

--base (?^i:[a-z0-9_\-]{1,40})

Snapshot di base di uno stream incrementale

--delete-snapshot (?^i:[a-z0-9_\-]{1,80})

Uno snapshot da eliminare in caso di successo

--snapshot (?^i:[a-z0-9_\-]{1,40})

Lo snapshot dello stato corrente se lo stream contiene snapshot

--with-snapshots <boolean> (default = 0)

Indica se lo stream include snapshot intermedi

pvesm iscsiscan

Un alias per pvesm scan iscsi.

pvesm list <storage> [OPTIONS]

Elencare il contenuto dello storage.

<storage>: <storage ID>

L'identificatore dello storage.

--content <string>

Elencare solo il contenuto di questo tipo.

--vmid <integer> (100 - 999999999)

Elencare solo le immagini per questa VM

pvesm lvmscan

Un alias per pvesm scan lvm.

pvesm lvmthinscan

Un alias per pvesm scan lvmthin.

pvesm nfsscan

Un alias per pvesm scan nfs.

pvesm path <volume>

Ottiene il percorso del filesystem per il volume specificato

<volume>: <string>

Identificatore del volume

pvesm prune-backups <storage> [OPTIONS]

Rimuovere i backup. Vengono considerati solo quelli che utilizzano lo schema di denominazione standard. Se non vengono specificate opzioni di conservazione, vengono utilizzate quelle della configurazione dello storage.

<storage>: <storage ID>

L'identificatore dello storage.

--dry-run <boolean>

Mostrare solo cosa verrebbe rimosso, senza eliminare nulla.

--keep-all <boolean>

Conservare tutti i backup. Se impostato su true, è in conflitto con le altre opzioni.

--keep-daily <N>

Conservare i backup degli ultimi <N> giorni distinti. Se per un singolo giorno è presente più di un backup, viene conservato solo il più recente.

--keep-hourly <N>

Conservare i backup delle ultime <N> ore distinte. Se per una singola ora è presente più di un backup, viene conservato solo il più recente.

--keep-last <N>

Conservare gli ultimi <N> backup.

--keep-monthly <N>

Conservare i backup degli ultimi <N> mesi distinti. Se per un singolo mese è presente più di un backup, viene conservato solo il più recente.

--keep-weekly <N>

Conservare i backup delle ultime <N> settimane distinte. Se per una singola settimana è presente più di un backup, viene conservato solo il più recente.

--keep-yearly <N>

Conservare i backup degli ultimi <N> anni distinti. Se per un singolo anno è presente più di un backup, viene conservato solo il più recente.

--type <lxc | qemu>

qemu oppure lxc. Considerare solo i backup dei guest di questo tipo.

--vmid <integer> (100 - 999999999)

Considerare solo i backup di questo guest.

pvesm remove <storage>

Eliminare la configurazione dello storage.

<storage>: <storage ID>

L'identificatore dello storage.

pvesm scan cifs <server> [OPTIONS]

Eseguire la scansione di un server CIFS remoto.

<server>: <string>

L'indirizzo del server (nome o IP).

--domain <string>

Dominio SMB (Workgroup).

--password <password>

Password dell'utente.

--username <string>

Nome utente.

pvesm scan iscsi <portal>

Esegue la scansione di un server iSCSI remoto.

<portal>: <string>

Il portale iSCSI (IP o nome DNS con porta opzionale).

pvesm scan lvm

Elencare i gruppi di volumi LVM locali.

pvesm scan lvmthin <vg>

Elencare i thin pool LVM locali.

<vg>: [a-zA-Z0-9\.\+\_][a-zA-Z0-9\.\+\_\-]+

nessuna descrizione disponibile

pvesm scan nfs <server>

Eseguire la scansione di un server NFS remoto.

<server>: <string>

L'indirizzo del server (nome o IP).

pvesm scan pbs <server> <username> --password <string> [OPTIONS] [FORMAT_OPTIONS]

Esegue la scansione di un Proxmox Backup Server remoto.

<server>: <string>

L'indirizzo del server (nome o IP).

<username>: <string>

Nome utente o ID del token API.

--fingerprint ([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}

Fingerprint SHA 256 del certificato.

--password <string>

Password dell'utente o secret del token API.

--port <integer> (1 - 65535) (default = 8007)

Porta opzionale.

pvesm scan zfs

Esegue la scansione dell'elenco dei pool zfs sul nodo locale.

pvesm set <storage> [OPTIONS]

Aggiornare la configurazione dello storage.

<storage>: <storage ID>

L'identificatore dello storage.

--blocksize <a power of 2 with optional k or m suffix>

Dimensione del blocco ZFS

--bwlimit [clone=<LIMIT>] [,default=<LIMIT>] [,migration=<LIMIT>] [,move=<LIMIT>] [,restore=<LIMIT>]

Impostare il limite di larghezza di banda I/O per le varie operazioni (in KiB/s).

--comstar_hg <string>

gruppo host per le viste comstar

--comstar_tg <string>

gruppo target per le viste comstar

--content <string>

Tipi di contenuto consentiti.

Note il valore rootdir viene utilizzato per i container e il valore images per le VM.
--content-dirs <string>

Override per le directory predefinite dei tipi di contenuto.

--create-base-path <boolean> (default = yes)

Creare la directory di base se non esiste.

--create-subdirs <boolean> (default = yes)

Popolare la directory con la struttura predefinita.

--data-pool <string>

Pool di dati (solo per erasure coding)

--delete <string>

Un elenco delle impostazioni da eliminare.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest diverso. È possibile utilizzare questa opzione per evitare modifiche concorrenti.

--disable <boolean>

Flag per disabilitare lo storage.

--domain <string>

Dominio CIFS.

--encryption-key un file contenente una chiave di crittografia, oppure il valore speciale "autogen"

Chiave di cifratura. Usare autogen per generarne una automaticamente senza passphrase.

--fingerprint ([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}

Fingerprint SHA 256 del certificato.

--format <qcow2 | raw | subvol | vmdk>

Formato immagine predefinito.

--fs-name <string>

Nome del filesystem Ceph.

--fuse <boolean>

Montare CephFS tramite FUSE.

--is_mountpoint <string> (default = no)

Considerare il percorso indicato come un punto di mount gestito esternamente e considerare lo storage offline se non è montato. L'uso di un valore booleano (yes/no) costituisce una scorciatoia rispetto all'uso del percorso di destinazione in questo campo.

--keyring file contenente il keyring per l'autenticazione nel cluster Ceph

Contenuto del keyring client (per cluster esterni).

--krbd <boolean> (default = 0)

Accedere sempre a rbd tramite il modulo kernel krbd.

--lio_tpg <string>

gruppo di portali target per i target Linux LIO

--master-pubkey un file contenente una chiave pubblica master in formato PEM

Chiave pubblica RSA in formato PEM, codificata in Base64. Utilizzata per cifrare una copia della chiave di cifratura che verrà aggiunta a ogni backup cifrato.

--max-protected-backups <integer> (-1 - N) (valore predefinito = Illimitato per gli utenti con il privilegio Datastore.Allocate, 5 per gli altri utenti)

Numero massimo di backup protetti per guest. Usare -1 per un valore illimitato.

--mkdir <boolean> (default = yes)

Creare la directory se non esiste e popolarla con le sottodirectory predefinite. NOTA: opzione deprecata; usare invece le opzioni create-base-path e create-subdirs.

--monhost <string>

Indirizzi IP dei monitor (per cluster esterni).

--mountpoint <string>

Punto di mount

--namespace <string>

Namespace.

--nocow <boolean> (default = 0)

Impostare il flag NOCOW sui file. Disabilita il checksum dei dati e rende irrecuperabili gli errori sui dati, consentendo però l'I/O diretto. Utilizzare questa opzione solo se i dati non richiedono una protezione superiore a quella di un singolo disco formattato in ext4 senza un sistema RAID sottostante.

--nodes <string>

Elenco dei nodi a cui si applica la configurazione dello storage.

--nowritecache <boolean>

disabilitare la cache di scrittura sulla destinazione

--options <string>

Opzioni di mount NFS/CIFS (vedere man nfs o man mount.cifs)

--password <password>

Password per accedere alla condivisione/al datastore.

--pool <string>

Pool.

--port <integer> (1 - 65535)

Utilizzare questa porta per connettersi allo storage invece di quella predefinita (ad esempio, con PBS o ESXi). Per NFS e CIFS, utilizzare l'opzione options per configurare la porta tramite le opzioni di mount.

--preallocation <falloc | full | metadata | off> (default = metadata)

Modalità di preallocazione per le immagini raw e qcow2. Utilizzando metadata sulle immagini raw si ottiene preallocation=off.

--prune-backups [keep-all=<1|0>] [,keep-daily=<N>] [,keep-hourly=<N>] [,keep-last=<N>] [,keep-monthly=<N>] [,keep-weekly=<N>] [,keep-yearly=<N>]

Le opzioni di conservazione con intervalli più brevi vengono elaborate per prime, con --keep-last come prima in assoluto. Ogni opzione copre un periodo di tempo specifico: si dice che i backup all'interno di questo periodo sono coperti da tale opzione. L'opzione successiva non considera i backup già coperti e prende in esame solo quelli più vecchi.

--saferemove <boolean>

Azzerare i dati durante la rimozione dei LV.

--saferemove-stepsize <1 | 16 | 2 | 32 | 4 | 8> (default = 32)

Dimensione del passo di wipe in MiB. Verrà limitata al massimo supportato dallo storage.

--saferemove_throughput <string>

Throughput di wipe (valore del parametro -t di cstream).

--server <string>

IP del server o nome DNS.

--shared <boolean>

Indica che si tratta di un singolo storage con lo stesso contenuto su tutti i nodi (o su tutti quelli elencati nell'opzione nodes). Non rende automaticamente accessibile ad altri nodi il contenuto di uno storage locale, ma si limita a contrassegnare come tale uno storage già condiviso!

--skip-cert-verification <boolean> (default = false)

Disabilita la verifica del certificato TLS, abilitare solo su reti completamente fidate!

--smbversion <2.0 | 2.1 | 3 | 3.0 | 3.11 | default> (default = default)

Versione del protocollo SMB. Se non specificata, viene utilizzato il valore default, che negozia la versione SMB2+ più alta supportata sia dal client che dal server.

--snapshot-as-volume-chain <boolean> (default = 0)

Abilita il supporto per la creazione di snapshot indipendenti dal fornitore di storage tramite catene di backing dei volumi.

--sparse <boolean>

usa volumi sparse

--subdir <string>

Sottodirectory da montare.

--tagged_only <boolean>

Elenca solo i volumi logici taggati con pve-vm-ID.

--username <string>

ID RBD.

--zfs-base-path <string>

Percorso di base in cui cercare i device a blocchi ZFS creati. Impostato automaticamente durante la creazione se non specificato. Solitamente /dev/zvol.

pvesm status [OPTIONS]

Ottiene lo stato di tutti i datastore.

--content <string>

Elenca solo gli storage che supportano questo tipo di contenuto.

--enabled <boolean> (default = 0)

Elenca solo gli storage abilitati (non disabilitati nella configurazione).

--format <boolean> (default = 0)

Include informazioni sui formati

--storage <storage ID>

Elenca lo stato solo per lo storage specificato

--target <string>

Se la destinazione è diversa dal nodo, vengono elencati solo gli storage condivisi il cui contenuto è accessibile su questo nodo e sul nodo di destinazione specificato.

pvesm zfsscan

Un alias per pvesm scan zfs.

22.4. pvesubscription - Gestore delle sottoscrizioni di Proxmox VE

pvesubscription <COMMAND> [ARGS] [OPTIONS]

pvesubscription delete

Elimina la chiave di sottoscrizione di questo nodo.

pvesubscription get

Legge le informazioni sulla sottoscrizione.

pvesubscription help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvesubscription set <key>

Impostazione della chiave di sottoscrizione.

<key>: \s*pve([1248])([cbsp])-(arm-)?[0-9a-f]{10}\s*

Chiave di sottoscrizione Proxmox VE

pvesubscription set-offline-key <data>

Solo per uso interno! Per impostare una chiave offline, utilizzare invece il package proxmox-offline-mirror-helper.

<data>: <string>

Un blob firmato con le informazioni sulla sottoscrizione

pvesubscription update [OPTIONS]

Aggiornare le informazioni sulla sottoscrizione.

--force <boolean> (default = 0)

Connettersi sempre al server, anche se la cache locale è ancora valida.

22.5. pveperf - Script di benchmark di Proxmox VE

pveperf [PATH]

22.6. pveceph - Gestione dei servizi Ceph sui nodi Proxmox VE

pveceph <COMMAND> [ARGS] [OPTIONS]

pveceph auth status [FORMAT_OPTIONS]

Mostrare i cifrari delle chiavi cephx e i prerequisiti per la migrazione ad aes256k.

pveceph createmgr

Un alias per pveceph mgr create.

pveceph createmon

Un alias per pveceph mon create.

pveceph createosd

Un alias per pveceph osd create.

pveceph createpool

Un alias per pveceph pool create.

pveceph destroymgr

Un alias per pveceph mgr destroy.

pveceph destroymon

Un alias per pveceph mon destroy.

pveceph destroyosd

Un alias per pveceph osd destroy.

pveceph destroypool

Un alias per pveceph pool destroy.

pveceph fs create [OPTIONS]

Creare un filesystem Ceph

--add-storage <boolean> (default = 0)

Configurare il CephFS creato come storage per questo cluster.

--name (?^:^[^:/\s]+$) (default = cephfs)

Il nome del filesystem ceph.

--pg_num <integer> (8 - 32768) (default = 128)

Numero di placement group per il pool di dati sottostante. Il pool di metadati utilizzerà un quarto di questo valore.

pveceph fs destroy <name> [OPTIONS]

Elimina un filesystem Ceph. L'operazione viene rifiutata se una voce di storage PVE di tipo cephfs fa ancora riferimento al filesystem e non è disabilitata. Opzionalmente rimuove anche le voci di storage e/o i pool di metadati e dati sottostanti.

<name>: <string>

Nome del filesystem Ceph.

--remove-pools <boolean> (default = 0)

Rimuove i pool di metadati e dati utilizzati da questo filesystem.

--remove-storages <boolean> (predefinito = 0)

Rimuove gli storage gestiti da pveceph configurati per questo filesystem.

pveceph help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pveceph init [OPTIONS]

Crea la configurazione Ceph predefinita iniziale e configura i symlink. Idempotente in caso di richiamo ripetuto: se nel ceph.conf esiste già una sezione [global], i valori predefiniti esistenti di fsid / auth / pool vengono mantenuti e la maggior parte dei parametri viene ignorata silenziosamente.

--cluster-network <string>

Dichiara una rete cluster separata; gli OSD instraderanno su di essa il traffico di heartbeat, replica degli oggetti e ripristino

Note Richiede l'opzione/le opzioni: network
--disable_cephx <boolean> (predefinito = 0)

Disabilita l'autenticazione cephx.

Warning cephx è una funzionalità di sicurezza che protegge dagli attacchi man-in-the-middle. Considerare la disattivazione di cephx solo se la rete è privata!
--min_size <integer> (1 - 7) (predefinito = 2)

Numero minimo di repliche disponibili per oggetto per consentire l'I/O

--network <string>

Usa una rete specifica per tutto il traffico relativo a ceph

--pg_bits <integer> (6 - 14) (predefinito = 6)

Bit dei placement group, usati per specificare il numero predefinito di placement group.

Deprecato. Questa impostazione è stata deprecata nelle versioni recenti di Ceph.

--size <integer> (1 - 7) (predefinito = 3)

Numero di repliche per oggetto previsto

pveceph install [OPTIONS]

Installa i package relativi a ceph.

--allow-experimental <boolean> (predefinito = 0)

Consente versioni sperimentali. Usare con cautela!

--repository <enterprise | manual | no-subscription | test> (predefinito = enterprise)

Repository Ceph da utilizzare. L'opzione manual non configurerà alcun repository. Utilizzarla se l'host non può accedere ai repository pubblici, ad esempio se viene utilizzato Proxmox Offline Mirror. Un repository che contiene i pacchetti Ceph per la versione deve essere configurato manualmente prima di avviare l'installazione!

--version <squid | tentacle> (predefinito = tentacle)

Versione di Ceph da installare.

pveceph lspools

Un alias per pveceph pool ls.

pveceph mds create [OPTIONS]

Creare un server di metadati Ceph (MDS)

--hotstandby <boolean> (predefinito = 0)

Determina se un demone ceph-mds debba effettuare il polling e il replay del log di un MDS attivo. Consente un passaggio più rapido in caso di guasto dell'MDS, ma richiede più risorse inattive. Deprecato: l'impostazione è stata rimossa in Ceph 14.1.1.

--name [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])? (predefinito = nodename)

L'ID per il mds; se omesso, corrisponde al nome del nodo

pveceph mds destroy <name>

Eliminare il server di metadati Ceph

<name>: [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

Il nome (ID) del mds

pveceph mgr create [OPTIONS]

Creare il Ceph Manager

--id [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])? (predefinito = nodename)

L'ID per il manager; se omesso, corrisponde al nome del nodo.

pveceph mgr destroy <id>

Elimina il Ceph Manager.

<id>: [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

L'ID del manager

pveceph mon create [OPTIONS]

Creare un Ceph Monitor. Per il primo monitor viene creato automaticamente anche un Manager.

--mon-address <string>

Sovrascrive l'indirizzo IP (o gli indirizzi IP) rilevato automaticamente per il monitor. Deve trovarsi nella rete pubblica (o nelle reti pubbliche) di Ceph.

--monid [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])? (predefinito = nodename)

L'ID per il monitor; se omesso, corrisponde al nome del nodo.

pveceph mon destroy <monid>

Elimina un Ceph Monitor. Rifiuta di rimuovere l'ultimo monitor del cluster. Non elimina alcun Manager presente sullo stesso nodo; utilizzare

<monid>: [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

ID del monitor

pveceph osd create <dev> [OPTIONS]

Creare OSD

<dev>: <string>

Nome del dispositivo a blocchi.

--crush-device-class <string>

Impostare la classe del dispositivo dell'OSD in crush.

--db_dev <string>

Nome del dispositivo a blocchi per block.db.

--db_dev_size <number> (1 - N)

Dimensione in GiB per block.db.

Note Richiede opzione/i: db_dev
--encrypted <boolean> (predefinito = 0)

Abilita la crittografia dell'OSD.

--osds-per-device <integer> (1 - N)

Servizi OSD per dispositivo fisico. Utile solo per dispositivi NVMe veloci, per sfruttarne meglio le prestazioni. Mutuamente esclusivo con db_dev e wal_dev.

--wal_dev <string>

Nome del block device per block.wal.

--wal_dev_size <number> (0.5 - N)

Dimensione in GiB per block.wal.

Note Richiede opzione/i: wal_dev

pveceph osd destroy <osdid> [OPTIONS]

Distruggere OSD

<osdid>: <integer>

ID OSD

--cleanup <boolean> (default = 0)

Se impostato, distrugge anche i volumi logici sottostanti tramite ceph-volume lvm zap --destroy, rimuove il volume fisico del volume group con pvremove e cancella eventuali partizioni journal/block.db/block.wal rimaste da OSD filestore. Senza questo flag, gli LV e le partizioni vengono lasciati intatti per l'ispezione.

pveceph osd details <osdid> [OPTIONS] [FORMAT_OPTIONS]

Ottenere i dettagli dell'OSD.

<osdid>: <string>

ID dell'OSD

--verbose <boolean> (default = 0)

Stampa informazioni dettagliate, equivalente al formato di output json-pretty.

pveceph pool create <name> [OPTIONS]

Creare un pool Ceph

<name>: (?^:^[^:/\s]+$)

Il nome del pool. Deve essere univoco.

--add_storages <boolean> (default = 0)

Configurare lo storage di VM e CT utilizzando il nuovo pool. Il valore predefinito è false per i pool replicati e true per i pool con erasure coding (poiché i pool EC sono generalmente utili solo se collegati allo storage).

--application <cephfs | rbd | rgw> (default = rbd)

L'applicazione del pool.

--crush_rule <string>

La regola da utilizzare per mappare il posizionamento degli oggetti nel cluster.

--erasure-coding k=<integer> ,m=<integer> [,device-class=<class>] [,failure-domain=<domain>] [,profile=<profile>]

Creare un pool con erasure coding per RBD, accompagnato da un pool replicato per lo storage dei metadati. Con EC, i parametri comuni di Ceph size, min_size e crush_rule verranno applicati al pool dei metadati.

--min_size <integer> (1 - 7) (predefinito = 2)

Numero minimo di repliche per oggetto

--pg_autoscale_mode <off | on | warn> (default = warn)

La modalità di scalatura automatica dei PG del pool.

--pg_num <integer> (1 - 32768) (default = 128)

Numero di placement group.

--pg_num_min <integer> (-N - 32768)

Numero minimo di placement group.

--size <integer> (1 - 7) (predefinito = 3)

Numero di repliche per oggetto

--target_size ^(\d+(\.\d+)?)([KMGT])?$

La dimensione target stimata del pool per il PG autoscaler.

--target_size_ratio <number>

Rapporto target stimato del pool per l'autoscaler dei PG.

pveceph pool destroy <name> [OPTIONS]

Eliminare il pool

<name>: <string>

Il nome del pool. Deve essere univoco.

--force <boolean> (default = 0)

Se impostato su true, elimina il pool anche se in uso

--remove_ecprofile <boolean> (default = 1)

Rimuove il profilo erasure code. Il valore predefinito è true, se applicabile.

--remove_storages <boolean> (default = 0)

Rimuove tutti gli storage gestiti da pveceph configurati per questo pool

pveceph pool get <name> [OPTIONS] [FORMAT_OPTIONS]

Mostrare lo stato attuale del pool.

<name>: <string>

Il nome del pool. Deve essere univoco.

--verbose <boolean> (default = 0)

Se abilitato, verranno visualizzati dati aggiuntivi (ad es. statistiche).

pveceph pool ls [FORMAT_OPTIONS]

Elencare tutti i pool e le relative impostazioni (modificabili tramite gli endpoint POST/PUT).

pveceph pool set <name> [OPTIONS]

Modificare le impostazioni del POOL

<name>: (?^:^[^:/\s]+$)

Il nome del pool. Deve essere univoco.

--application <cephfs | rbd | rgw>

L'applicazione del pool.

--crush_rule <string>

La regola da utilizzare per mappare il posizionamento degli oggetti nel cluster.

--min_size <integer> (1 - 7)

Numero minimo di repliche per oggetto

--pg_autoscale_mode <off | on | warn>

La modalità di scalatura automatica dei PG del pool.

--pg_num <integer> (1 - 32768)

Numero di placement group.

--pg_num_min <integer> (-N - 32768)

Numero minimo di placement group.

--size <integer> (1 - 7)

Numero di repliche per oggetto

--target_size ^(\d+(\.\d+)?)([KMGT])?$

La dimensione target stimata del pool per il PG autoscaler.

--target_size_ratio <number>

Rapporto target stimato del pool per l'autoscaler dei PG.

pveceph purge [OPTIONS]

Eliminare i dati e i file di configurazione relativi a Ceph.

--crash <boolean>

Eliminare anche i log di crash di Ceph, /var/lib/ceph/crash.

--logs <boolean>

Eliminare anche i log di Ceph, /var/log/ceph.

pveceph start [OPTIONS]

Avviare i servizi Ceph.

--service (ceph|mon|mds|osd|mgr)(\.[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)? (predefinito = ceph.target)

Nome del servizio Ceph.

pveceph status

Ottiene lo stato di Ceph.

pveceph stop [OPTIONS]

Arrestare i servizi Ceph.

--service (ceph|mon|mds|osd|mgr)(\.[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)? (predefinito = ceph.target)

Nome del servizio Ceph.

22.7. pvenode - Gestione dei nodi di Proxmox VE

pvenode <COMMAND> [ARGS] [OPTIONS]

pvenode acme account deactivate [<name>]

Disattivare l'account ACME esistente presso la CA.

<name>: <name> (predefinito = default)

Nome del file di configurazione dell'account ACME.

pvenode acme account info [<name>] [FORMAT_OPTIONS]

Restituisce le informazioni relative a un account ACME esistente.

<name>: <name> (predefinito = default)

Nome del file di configurazione dell'account ACME.

pvenode acme account list

Indice degli account ACME.

pvenode acme account register [<name>] {<contact>} [OPTIONS]

Registrare un nuovo account ACME presso una CA compatibile.

<name>: <name> (predefinito = default)

Nome del file di configurazione dell'account ACME.

<contact>: <string>

Indirizzi email di contatto.

--directory ^https?://.*

URL dell'endpoint della directory della CA ACME.

pvenode acme account update [<name>] [OPTIONS]

Aggiornare le informazioni di un account ACME esistente presso la CA. Nota: se non vengono specificate nuove informazioni sull'account, viene attivato un aggiornamento.

<name>: <name> (predefinito = default)

Nome del file di configurazione dell'account ACME.

--contact <string>

Indirizzi email di contatto.

pvenode acme cert order [OPTIONS]

Ordinare un nuovo certificato da una CA compatibile con ACME.

--force <boolean> (default = 0)

Sovrascrive il certificato personalizzato esistente.

pvenode acme cert renew [OPTIONS]

Rinnovare il certificato esistente presso la CA.

--force <boolean> (default = 0)

Forzare il rinnovo anche se mancano più di 30 giorni alla scadenza.

pvenode acme cert revoke

Revocare il certificato esistente presso la CA.

pvenode acme plugin add <type> <id> [OPTIONS]

Aggiunge la configurazione di un plugin ACME.

<type>: <dns | standalone>

Tipo di challenge ACME.

<id>: <string>

Nome ID del plugin ACME

--api <1984hosting | acmedns | acmeproxy | active24 | ad | ali | alviy | anx | artfiles | arvan | aurora | autodns | aws | azion | azure | beget | bookmyname | bunny | cf | clouddns | cloudns | cn | conoha | constellix | cpanel | curanet | cyon | da | ddnss | desec | df | dgon | dnsexit | dnshome | dnsimple | dnsservices | doapi | domeneshop | dp | dpi | dreamhost | duckdns | durabledns | dyn | dynu | dynv6 | easydns | edgecenter | edgedns | euserv | exoscale | fornex | freedns | freemyip | gandi_livedns | gcloud | gcore | gd | geoscaling | googledomains | he | he_ddns | hetzner | hetznercloud | hexonet | hostingde | huaweicloud | infoblox | infomaniak | internetbs | inwx | ionos | ionos_cloud | ipv64 | ispconfig | jd | joker | kappernet | kas | kinghost | knot | la | leaseweb | lexicon | limacity | linode | linode_v4 | loopia | lua | maradns | me | miab | mijnhost | misaka | myapi | mydevil | mydnsjp | mythic_beasts | namecheap | namecom | namesilo | nanelo | nederhost | neodigit | netcup | netlify | nic | njalla | nm | nsd | nsone | nsupdate | nw | oci | omglol | one | online | openprovider | openprovider_rest | openstack | opnsense | ovh | pdns | pleskxml | pointhq | porkbun | rackcorp | rackspace | rage4 | rcode0 | regru | scaleway | schlundtech | selectel | selfhost | servercow | simply | spaceship | technitium | tele3 | tencent | timeweb | transip | udr | ultra | unoeuro | variomedia | veesp | vercel | vscale | vultr | websupport | west_cn | world4you | yandex360 | yc | zilore | zone | zoneedit | zonomi>

Nome del plugin API

--data File con una coppia chiave-valore per riga, che verrà codificato in base64url per essere memorizzato nella configurazione del plugin.

Dati del plugin DNS. (codificati in base64)

--disable <boolean>

Flag per disabilitare la configurazione.

--nodes <string>

Elenco dei nomi dei nodi del cluster.

--validation-delay <integer> (0 - 172800) (default = 30)

Ritardo extra in secondi da attendere prima di richiedere la validazione. Consente di gestire un TTL lungo dei record DNS.

pvenode acme plugin config <id> [FORMAT_OPTIONS]

Recuperare la configurazione del plugin ACME.

<id>: <string>

Identificatore univoco per l'istanza del plugin ACME.

pvenode acme plugin list [OPTIONS] [FORMAT_OPTIONS]

Indice dei plugin ACME.

--type <dns | standalone>

Elencare solo i plugin ACME di un tipo specifico

pvenode acme plugin remove <id>

Eliminare la configurazione del plugin ACME.

<id>: <string>

Identificatore univoco per l'istanza del plugin ACME.

pvenode acme plugin set <id> [OPTIONS]

Aggiornare la configurazione del plugin ACME.

<id>: <string>

Nome ID del plugin ACME

--api <1984hosting | acmedns | acmeproxy | active24 | ad | ali | alviy | anx | artfiles | arvan | aurora | autodns | aws | azion | azure | beget | bookmyname | bunny | cf | clouddns | cloudns | cn | conoha | constellix | cpanel | curanet | cyon | da | ddnss | desec | df | dgon | dnsexit | dnshome | dnsimple | dnsservices | doapi | domeneshop | dp | dpi | dreamhost | duckdns | durabledns | dyn | dynu | dynv6 | easydns | edgecenter | edgedns | euserv | exoscale | fornex | freedns | freemyip | gandi_livedns | gcloud | gcore | gd | geoscaling | googledomains | he | he_ddns | hetzner | hetznercloud | hexonet | hostingde | huaweicloud | infoblox | infomaniak | internetbs | inwx | ionos | ionos_cloud | ipv64 | ispconfig | jd | joker | kappernet | kas | kinghost | knot | la | leaseweb | lexicon | limacity | linode | linode_v4 | loopia | lua | maradns | me | miab | mijnhost | misaka | myapi | mydevil | mydnsjp | mythic_beasts | namecheap | namecom | namesilo | nanelo | nederhost | neodigit | netcup | netlify | nic | njalla | nm | nsd | nsone | nsupdate | nw | oci | omglol | one | online | openprovider | openprovider_rest | openstack | opnsense | ovh | pdns | pleskxml | pointhq | porkbun | rackcorp | rackspace | rage4 | rcode0 | regru | scaleway | schlundtech | selectel | selfhost | servercow | simply | spaceship | technitium | tele3 | tencent | timeweb | transip | udr | ultra | unoeuro | variomedia | veesp | vercel | vscale | vultr | websupport | west_cn | world4you | yandex360 | yc | zilore | zone | zoneedit | zonomi>

Nome del plugin API

--data File con una coppia chiave-valore per riga, che verrà codificato in base64url per la memorizzazione nella configurazione del plugin.

Dati del plugin DNS. (codificati in base64)

--delete <string>

Un elenco delle impostazioni da eliminare.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest diverso. È possibile utilizzare questa opzione per evitare modifiche concorrenti.

--disable <boolean>

Flag per disabilitare la configurazione.

--nodes <string>

Elenco dei nomi dei nodi del cluster.

--validation-delay <integer> (0 - 172800) (default = 30)

Ritardo extra in secondi da attendere prima di richiedere la validazione. Consente di gestire un TTL lungo dei record DNS.

pvenode cert delete [<restart>]

Eliminare la catena di certificati e la chiave personalizzate.

<restart>: <boolean> (default = 0)

Riavviare pveproxy.

pvenode cert info [FORMAT_OPTIONS]

Ottenere informazioni sui certificati del nodo.

pvenode cert set <certificates> [<key>] [OPTIONS] [FORMAT_OPTIONS]

Caricare o aggiornare la catena di certificati e la chiave personalizzate.

<certificates>: <string>

Certificato (catena) codificato in formato PEM.

<key>: <string>

Chiave privata codificata in formato PEM.

--force <boolean> (default = 0)

Sovrascrivere i file di certificato personalizzati o ACME esistenti.

--restart <boolean> (default = 0)

Riavviare pveproxy.

pvenode config get [OPTIONS]

Ottenere le opzioni di configurazione del nodo.

--property <acme | acmedomain0 | acmedomain1 | acmedomain2 | acmedomain3 | acmedomain4 | acmedomain5 | ballooning-target | description | location | startall-onboot-delay | wakeonlan> (default = all)

Restituire solo una proprietà specifica dalla configurazione del nodo.

pvenode config set [OPTIONS]

Impostare le opzioni di configurazione del nodo.

--acme [account=<name>] [,domains=<domain[;domain;...]>]

Impostazioni ACME specifiche del nodo.

--acmedomain[n] [domain=]<domain> [,alias=<domain>] [,plugin=<name of the plugin configuration>]

Dominio ACME e plugin di validazione

--ballooning-target <integer> (0 - 100) (default = 80)

Target di utilizzo della RAM per il ballooning (in percentuale della memoria totale)

--delete <string>

Un elenco delle impostazioni da eliminare.

--description <string>

Descrizione per il nodo. Visualizzata nel pannello delle note del nodo nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest SHA1 diverso. Può essere utilizzato per prevenire modifiche concorrenti.

--location latitude=<number> ,longitude=<number> [,name=<name>]

La posizione del nodo. Sovrascrive il valore predefinito della configurazione del datacenter.

--startall-onboot-delay <integer> (0 - 300) (default = 0)

Ritardo iniziale in secondi, prima di avviare tutti i Guest virtuali con l'avvio automatico abilitato.

--wakeonlan [mac=]<MAC address> [,bind-interface=<bind interface>] [,broadcast-address=<IPv4 broadcast address>]

Impostazioni Wake on LAN specifiche del nodo.

pvenode help [OPTIONS]

Visualizzare la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvenode migrateall <target> [OPTIONS]

Migrare tutte le VM e i container.

<target>: <string>

Nodo di destinazione.

--max-workers <integer> (1 - 64)

Numero massimo di job di migrazione paralleli. Se non impostato, utilizza 'max_workers' da datacenter.cfg. Almeno uno dei due deve essere impostato!

--maxworkers <integer> (1 - 64)

Numero massimo di job di migrazione paralleli. Se non impostato, utilizza 'max_workers' da datacenter.cfg. Almeno uno dei due deve essere impostato! Deprecato, utilizzare max-workers invece.

--vms <string>

Considerare solo i guest con questi ID.

--with-local-disks <boolean>

Abilitare la migrazione live dello storage per il disco locale

pvenode startall [OPTIONS]

Avvia tutte le VM e i container presenti su questo nodo (per impostazione predefinita solo quelli con onboot=1).

--force <boolean> (default = off)

Emette il comando di avvio anche se il guest virtuale non ha onboot impostato oppure lo ha impostato su off.

--max-workers <integer> (1 - 64)

Definisce il numero massimo di attività eseguite contemporaneamente. Se non impostato, utilizza max_workers da datacenter.cfg e, se anche questo non è impostato, vengono utilizzati i thread CPU disponibili, limitati a un massimo di 8.

--vms <string>

Considerare solo i guest appartenenti a questo elenco di VMID separati da virgola.

pvenode stopall [OPTIONS]

Interrompe tutte le VM e i container.

--force-stop <boolean> (predefinito = 1)

Forza un hard-stop dopo il timeout.

--max-workers <integer> (1 - 64)

Definisce il numero massimo di attività eseguite contemporaneamente. Se non impostato, utilizza max_workers da datacenter.cfg e, se anche questo non è impostato, vengono utilizzati i thread CPU disponibili, limitati a un massimo di 8.

--timeout <integer> (0 - 7200) (predefinito = 180)

Timeout per ciascuna operazione di arresto di un guest. In base al valore di force-stop, l'arresto viene semplicemente interrotto oppure viene forzato un hard-stop.

--vms <string>

Considerare solo i guest con questi ID.

pvenode task list [OPTIONS] [FORMAT_OPTIONS]

Legge l'elenco dei task per un nodo (task terminati).

--errors <boolean> (predefinito = 0)

Elenca solo i task con stato ERROR.

--limit <integer> (0 - N) (predefinito = 50)

Elenca solo questo numero di task.

--since <integer>

Elencare solo i task a partire da questo timestamp UNIX.

--source <active | all | archive> (predefinito = archive)

Elenca i task archiviati, attivi o tutti.

--start <integer> (0 - N) (predefinito = 0)

Elenca i task a partire da questo offset.

--statusfilter <string>

Elenco degli stati dei task che devono essere restituiti.

--typefilter <string>

Elenca solo i task di questo tipo (ad es. vzstart, vzdump).

--until <integer>

Elencare solo i task fino a questo timestamp UNIX.

--userfilter <string>

Elenca solo i task di questo utente.

--vmid <integer> (100 - 999999999)

Elenca solo i task relativi a questa VM.

pvenode task log <upid> [OPTIONS]

Legge il log del task.

<upid>: <string>

L'ID univoco del task.

--download <boolean>

Indica se il file del log del task deve essere scaricato. Questo parametro non può essere utilizzato insieme ad altri parametri

--start <integer> (0 - N) (predefinito = 0)

Iniziare da questa riga durante la lettura del tasklog

pvenode task status <upid> [FORMAT_OPTIONS]

Legge lo stato del task.

<upid>: <string>

L'ID univoco del task.

pvenode wakeonlan <node>

Tenta di risvegliare un nodo tramite un pacchetto di rete wake on LAN.

<node>: <string>

Nodo di destinazione per il pacchetto wake on LAN

22.8. pvesh - Interfaccia shell per le API di Proxmox VE

pvesh <COMMAND> [ARGS] [OPTIONS]

pvesh create <api_path> [OPTIONS] [FORMAT_OPTIONS]

Esegue una chiamata API POST su <api_path>.

<api_path>: <string>

Percorso API.

--noproxy <boolean>

Disabilita il proxying automatico.

pvesh delete <api_path> [OPTIONS] [FORMAT_OPTIONS]

Esegue una chiamata API DELETE su <api_path>.

<api_path>: <string>

Percorso API.

--noproxy <boolean>

Disabilita il proxying automatico.

pvesh get <api_path> [OPTIONS] [FORMAT_OPTIONS]

Esegue una chiamata API GET su <api_path>.

<api_path>: <string>

Percorso API.

--noproxy <boolean>

Disabilita il proxying automatico.

pvesh help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvesh ls <api_path> [OPTIONS] [FORMAT_OPTIONS]

Elencare gli oggetti figli su <api_path>.

<api_path>: <string>

Percorso API.

--noproxy <boolean>

Disabilitare il proxying automatico.

pvesh set <api_path> [OPTIONS] [FORMAT_OPTIONS]

Effettuare una chiamata API PUT su <api_path>.

<api_path>: <string>

Percorso API.

--noproxy <boolean>

Disabilitare il proxying automatico.

pvesh usage <api_path> [OPTIONS]

Stampare le informazioni sull'utilizzo dell'API per <api_path>.

<api_path>: <string>

Percorso API.

--command <create | delete | get | set>

Comando API.

--returns <boolean>

Include lo schema per i dati restituiti.

--verbose <boolean>

Formato di output esteso.

22.9. qm - Gestore di macchine virtuali QEMU/KVM

qm <COMMAND> [ARGS] [OPTIONS]

qm agent

Un alias per qm guest cmd.

qm cleanup <vmid> <clean-shutdown> <guest-requested>

Pulisce le risorse come i dispositivi tap, le vgpu, etc. Viene chiamato dopo l'arresto, il crash, etc. di una vm.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<clean-shutdown>: <boolean>

Indica se qemu si è arrestato correttamente.

<guest-requested>: <boolean>

Indica se l'arresto è stato richiesto dal guest o tramite qmp.

qm clone <vmid> <newid> [OPTIONS]

Creare una copia della macchina virtuale/template.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<newid>: <integer> (100 - 999999999)

VMID per il clone.

--bwlimit <integer> (0 - N) (predefinito = limite di clonazione dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--description <string>

Descrizione per la nuova VM.

--format <qcow2 | raw | vmdk>

Formato del disco di destinazione. Valido solo per il clone completo. Se lo storage di destinazione non supporta il formato, viene utilizzato invece il formato predefinito dello storage.

--full <boolean>

Crea una copia completa di tutti i dischi. Questa operazione viene sempre eseguita quando si clona una VM normale. Per i template di VM, si tenta di creare per impostazione predefinita un clone collegato.

--name <string>

Imposta un nome per la nuova VM.

--pool <string>

Aggiunge la nuova VM al pool specificato.

--snapname <string>

Il nome dello snapshot.

--storage <storage ID>

Storage di destinazione per il clone completo.

--target <string>

Nodo di destinazione. Consentito solo se la VM originale si trova su uno storage condiviso.

qm cloudinit dump <vmid> <type>

Ottiene la configurazione cloudinit generata automaticamente.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<type>: <meta | network | user>

Tipo di configurazione.

qm cloudinit pending <vmid>

Ottiene la configurazione cloudinit con i valori sia correnti che in attesa.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm cloudinit update <vmid>

Rigenera e modifica l'unità di configurazione cloudinit.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm config <vmid> [OPTIONS]

Ottiene la configurazione della macchina virtuale con le modifiche di configurazione in attesa applicate. Impostare il parametro current per ottenere invece la configurazione corrente.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--current <boolean> (default = 0)

Ottiene i valori correnti (invece dei valori in attesa).

--snapshot <string>

Recuperare i valori di configurazione dallo snapshot indicato.

qm create <vmid> [OPTIONS]

Creare o ripristinare una macchina virtuale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--acpi <boolean> (default = 1)

Abilitare/disabilitare ACPI.

--affinity <string>

Elenco dei core host utilizzati per eseguire i processi guest, ad esempio: 0,5,8-11

--agent [enabled=]<1|0> [,freeze-fs=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

Abilitare/disabilitare la comunicazione con il QEMU Guest Agent e le relative proprietà.

--allow-ksm <boolean> (default = 1)

Consente l'unione delle pagine di memoria di questo guest tramite KSM (Kernel Samepage Merging).

--amd-sev [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

Funzionalità Secure Encrypted Virtualization (SEV) delle CPU AMD

--arch <aarch64 | x86_64>

Architettura del processore virtuale. Il valore predefinito è l'architettura dell'host.

--archive <string>

L'archivio di backup. Può essere il percorso del file system di un file .tar o .vma (usare - per inviare i dati tramite pipe da stdin) oppure un identificativo di volume di backup dello storage Proxmox.

--args <string>

Argomenti arbitrari passati a kvm.

--audio0 device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

Configurare un dispositivo audio, utile in combinazione con QXL/Spice.

--autostart <boolean> (predefinito = 0)

Riavvio automatico dopo un crash (attualmente ignorato).

--balloon <integer> (0 - N)

Quantità di RAM di destinazione per la VM in MiB. Il driver balloon è abilitato per impostazione predefinita, a meno che non venga esplicitamente disabilitato impostando il valore a zero.

--bios <ovmf | seabios> (predefinito = seabios)

Selezionare l'implementazione del BIOS.

--boot [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

Specificare l'ordine di avvio del guest. Utilizzare la sottoproprietà order=, poiché l'utilizzo senza chiave o con legacy= è deprecato.

--bootdisk (ide|sata|scsi|virtio)\d+

Abilitare l'avvio dal disco specificato. Deprecato: utilizzare boot: order=foo;bar al suo posto.

--bwlimit <integer> (0 - N) (predefinito = limite di ripristino dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--cdrom <volume>

Questo è un alias per l'opzione -ide2

--cicustom [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init: specificare file personalizzati per sostituire quelli generati automaticamente all'avvio.

--cipassword <password>

cloud-init: password da assegnare all'utente. L'utilizzo di questa opzione non è generalmente consigliato. Utilizzare invece le chiavi SSH. Notare inoltre che le versioni di cloud-init meno recenti non supportano le password sottoposte a hash.

--citype <configdrive2 | nocloud | opennebula>

Specifica il formato di configurazione di cloud-init. Il valore predefinito dipende dal tipo di sistema operativo configurato (ostype). Viene utilizzato il formato nocloud per Linux e configdrive2 per Windows.

--ciupgrade <boolean> (predefinito = 1)

cloud-init: eseguire un aggiornamento automatico dei pacchetti dopo il primo avvio.

--ciuser <string>

cloud-init: nome utente per il quale modificare le chiavi SSH e la password, invece dell'utente predefinito configurato nell'immagine.

--cores <integer> (1 - N) (predefinito = 1)

Numero di core per socket.

--cpu [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,guest-phys-bits=<integer>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,level=<integer>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

Tipo di CPU emulata.

--cpulimit <number> (0 - 128) (predefinito = 0)

Limite di utilizzo della CPU.

--cpuunits <integer> (1 - 262144) (predefinito = cgroup v1: 1024, cgroup v2: 100)

Peso CPU per una VM; nel cgroup v2 viene limitato all'intervallo [1, 10000].

--description <string>

Descrizione per la VM. Visualizzata nel riepilogo della VM nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

--efidisk0 [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,import-from=<source volume>] [,ms-cert=<enum>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

Configura un disco per memorizzare le variabili EFI. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Da notare che SIZE_IN_GiB viene ignorato in questo caso e che le variabili EFI predefinite vengono invece copiate nel volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--force <boolean>

Consente di sovrascrivere una VM esistente.

Note Richiede opzione/i: archive
--freeze <boolean>

Blocca la CPU all'avvio (utilizzare il comando monitor c per avviare l'esecuzione).

--ha-managed <boolean> (predefinito = 0)

Aggiunge la VM come risorsa HA dopo la sua creazione.

--hookscript <string>

Script che verrà eseguito durante varie fasi del ciclo di vita della VM.

--hostpci[n] [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,driver=<vfio|keep>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>]

Mappa i dispositivi PCI host nel guest.

--hotplug <string> (predefinito = network,disk,usb)

Abilitare selettivamente le funzionalità di hotplug. Si tratta di un elenco separato da virgole di funzionalità hotplug: network, disk, cpu, memory, usb e cloudinit. Utilizzare 0 per disabilitare completamente l’hotplug. L’utilizzo di 1 come valore è un alias per il valore predefinito network,disk,usb. L’hotplug USB è possibile per i guest con versione della macchina >= 7.1 e ostype l26 oppure windows > 7.

--hugepages <1024 | 2 | any>

Abilita la memoria hugepages.

Impostare la dimensione delle hugepages in MiB. Se il valore è impostato su any, verranno utilizzate hugepages da 1 GiB, se possibile; altrimenti verrà utilizzata la dimensione di 2 MiB.

--ide[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido IDE o CD-ROM (n va da 0 a 3). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--import-working-storage <storage ID>

Uno storage basato su file con il content-type images abilitato, utilizzato come storage di estrazione intermedio durante l'importazione. Il valore predefinito è lo storage di origine.

--intel-tdx [type=]<tdx-type> ,attestation=<1|0> [,vsock-cid=<integer>] [,vsock-port=<integer>]

Funzionalità Trusted Domain Extension (TDX) delle CPU Intel

--ipconfig[n] [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init: specificare indirizzi IP e gateway per l'interfaccia corrispondente.

Gli indirizzi IP utilizzano la notazione CIDR; i gateway sono opzionali, ma richiedono la specifica di un IP dello stesso tipo.

La stringa speciale dhcp può essere utilizzata per gli indirizzi IP per usare il DHCP, nel qual caso non deve essere specificato alcun gateway esplicito. Per IPv6, la stringa speciale auto può essere utilizzata per la configurazione automatica stateless. Questo richiede cloud-init 19.4 o versioni successive.

Se cloud-init è abilitato e non viene specificato né un indirizzo IPv4 né un indirizzo IPv6, viene utilizzato per impostazione predefinita il DHCP su IPv4.

--ivshmem size=<integer> [,name=<string>]

Memoria condivisa inter-VM. Utile per la comunicazione diretta tra VM, o con l'host.

--keephugepages <boolean> (default = 0)

Da usare insieme a hugepages. Se abilitata, le hugepages non verranno eliminate dopo lo spegnimento della VM e potranno essere utilizzate per gli avvii successivi.

--keyboard <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

Layout di tastiera per il server VNC. Questa opzione generalmente non è necessaria e spesso è gestita meglio all'interno del sistema operativo guest.

--kvm <boolean> (default = 1)

Abilitare/disabilitare la virtualizzazione hardware KVM.

--live-restore <boolean>

Avviare immediatamente la VM durante l'importazione o il ripristino in background.

--localtime <boolean>

Impostare l'orologio in tempo reale (RTC) sull'ora locale. Questa opzione è abilitata per impostazione predefinita se ostype indica un sistema operativo Microsoft Windows.

--lock <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

Bloccare/sbloccare la VM.

--machine [[type=]<machine type>] [,aw-bits=<number>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

Specificare la macchina QEMU.

--memory [current=]<integer>

Proprietà della memoria.

--migrate_downtime <number> (0 - N) (default = 0.1)

Impostare il downtime massimo tollerato (in secondi) per le migrazioni. Se la migrazione non riesce a convergere al termine, poiché deve essere trasferita una quantità eccessiva di RAM modificata di recente, il limite viene aumentato automaticamente passo dopo passo finché la migrazione non riesce a convergere. Il valore viene limitato a 2000 secondi (massimo consentito in QEMU).

--migrate_speed <integer> (0 - N) (default = 0)

Impostare la velocità massima (in MB/s) per le migrazioni. Il valore 0 indica che non è previsto alcun limite.

--name <string>

Impostare un nome per la VM. Utilizzato solo nell'interfaccia web di configurazione.

--nameserver <string>

cloud-init: imposta l'indirizzo IP del server DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

--net[n] [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,host-tunnel=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

Specificare i dispositivi di rete.

--numa <boolean> (default = 0)

Abilitare/disabilitare NUMA.

--numa[n] cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

Topologia NUMA.

--onboot <boolean> (default = 0)

Specifica se una VM verrà avviata durante l'avvio del sistema.

--ostype <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp> (default = other)

Specificare il sistema operativo guest.

--parallel[n] /dev/parport\d+|/dev/usb/lp\d+

Mappare i dispositivi paralleli dell'host (n va da 0 a 2).

--pool <string>

Aggiungere la VM al pool specificato.

--protection <boolean> (predefinito = 0)

Imposta il flag di protezione della VM. Questo disabilita le operazioni di rimozione della VM e rimozione del disco.

--reboot <boolean> (predefinito = 1)

Consente il riavvio. Se impostato su 0 la VM si arresta al riavvio.

--rng0 [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

Configurare un generatore di numeri casuali basato su VirtIO.

--sata[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SATA o CD-ROM (n va da 0 a 5). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--scsi[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SCSI o CD-ROM (n va da 0 a 30). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--scsihw <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (predefinito = lsi)

Modello di controller SCSI

--searchdomain <string>

cloud-init: imposta i domini di ricerca DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

--serial[n] (/dev/[^,]+|socket)

Creare un dispositivo seriale all'interno della VM (n va da 0 a 3)

--shares <integer> (0 - 50000) (predefinito = 1000)

Quantità di quote di memoria per l'auto-ballooning. Maggiore è il numero, maggiore è la memoria assegnata a questa VM. Il numero è relativo ai pesi di tutte le altre VM in esecuzione. Il valore zero disabilita l'auto-ballooning. L'auto-ballooning viene eseguito da pvestatd.

--smbios1 [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

Specificare i campi SMBIOS di tipo 1.

--smp <integer> (1 - N) (predefinito = 1)

Il numero di CPU. Utilizzare invece l'opzione -sockets.

--sockets <integer> (1 - N) (predefinito = 1)

Il numero di socket CPU.

--spice_enhancements [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

Configurare miglioramenti aggiuntivi per SPICE.

--sshkeys <filepath>

cloud-init: configurare le chiavi SSH pubbliche (una chiave per riga, formato OpenSSH).

--start <boolean> (predefinito = 0)

Avviare la VM dopo che è stata creata correttamente.

--startdate (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (predefinito = now)

Impostare la data iniziale dell'orologio in tempo reale. I formati di data validi sono: 'now' oppure 2006-06-17T16:01:21 oppure 2006-06-17.

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

--storage <storage ID>

Storage predefinito.

--tablet <boolean> (predefinito = 1)

Abilitare/disabilitare il dispositivo tablet USB.

--tags <string>

Tag della VM. Si tratta solo di metadati.

--tdf <boolean> (predefinito = 0)

Abilitare/disabilitare la correzione della deriva temporale.

--template <boolean> (predefinito = 0)

Abilitare/disabilitare il template.

--tpmstate0 [file=]<volume> [,format=<raw|qcow2|vmdk>] [,import-from=<source volume>] [,size=<DiskSize>] [,version=<v1.2|v2.0>]

Configurare un disco per memorizzare lo stato TPM. Il formato è impostato su raw e non è modificabile. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Si noti che in questo caso SIZE_IN_GiB viene ignorato e vengono utilizzati 4 MiB al suo posto. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--unique <boolean>

Assegnare un indirizzo ethernet casuale univoco.

Note Opzioni richieste: archive
--unused[n] [file=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

--usb[n] [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

Configurare un dispositivo USB (n va da 0 a 4; per una versione della macchina >= 7.1 e ostype l26 o windows > 7, n può arrivare fino a 14).

--vcpus <integer> (1 - N) (predefinito = 0)

Numero di vcpu collegate a caldo.

--vga [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

Configurare l'hardware VGA.

--virtio[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,werror=<enum>]

Utilizzare il volume come disco rigido VIRTIO (n va da 0 a 15). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--virtiofs[n] [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

Configurazione per la condivisione di una directory tra host e guest tramite Virtio-fs.

--vmgenid <UUID> (predefinito = 1 (autogenerated))

Impostare l'ID generazione VM. Utilizzare 1 per generarlo automaticamente in fase di creazione o aggiornamento, oppure 0 per disabilitarlo esplicitamente.

--vmstatestorage <storage ID>

Storage predefinito per i volumi/file di stato della VM.

--watchdog [[model=]<i6300esb|ib700>] [,action=<enum>]

Creare un dispositivo watchdog hardware virtuale.

qm delsnapshot <vmid> <snapname> [OPTIONS]

Eliminare uno snapshot della VM.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<snapname>: <string>

Il nome dello snapshot.

--force <boolean>

Per la rimozione dal file di configurazione, anche se la rimozione degli snapshot del disco non riesce.

qm destroy <vmid> [OPTIONS]

Distrugge la VM e tutti i volumi utilizzati/posseduti. Rimuove eventuali permessi specifici della VM e le regole firewall

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--destroy-unreferenced-disks <boolean> (predefinito = 0)

Se impostato, distrugge inoltre tutti i dischi non referenziati nella configurazione ma con un VMID corrispondente provenienti da tutti gli storage abilitati.

--purge <boolean>

Rimuove il VMID dalle configurazioni, come i job di backup e replica e HA.

--skiplock <boolean>

Ignorare i lock - solo root può utilizzare questa opzione.

qm disk import <vmid> <source> <storage> [OPTIONS]

Importare un'immagine disco esterna come disco non utilizzato in una VM. Il formato dell'immagine deve essere supportato da qemu-img(1).

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<source>: <string>

Percorso dell'immagine disco da importare

<storage>: <storage ID>

ID dello storage di destinazione

--format <qcow2 | raw | vmdk>

Formato di destinazione

--target-disk <efidisk0 | ide0 | ide1 | ide2 | ide3 | sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

Il nome del disco in cui il volume verrà importato (ad es. scsi1).

qm disk move <vmid> <disk> [<storage>] [OPTIONS]

Spostare il volume su uno storage diverso o su una VM diversa.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<disk>: <efidisk0 | ide0 | ide1 | ide2 | ide3 | sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

Il disco da spostare.

<storage>: <storage ID>

Storage di destinazione.

--bwlimit <integer> (0 - N) (valore predefinito = limite di trasferimento dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--delete <boolean> (default = 0)

Elimina il disco originale dopo la copia completata con successo. Per impostazione predefinita il disco originale viene conservato come disco inutilizzato.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest SHA1 diverso. Può essere utilizzato per prevenire modifiche concorrenti.

--format <qcow2 | raw | vmdk>

Formato del disco di destinazione. Utilizzato solo quando si sposta su uno storage diverso. Se lo storage di destinazione non supporta il formato, viene utilizzato invece il formato predefinito dello storage.

--target-digest <string>

Impedisce le modifiche se il file di configurazione corrente della VM di destinazione ha un digest SHA1 diverso. Può essere utilizzato per rilevare modifiche concorrenti.

--target-disk <efidisk0 | ide0 | ide1 | ide2 | ide3 | sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

La chiave di configurazione a cui il disco sarà spostato sulla VM di destinazione (ad esempio, ide0 o scsi1). Il valore predefinito è la chiave del disco di origine.

--target-vmid <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm disk rescan [OPTIONS]

Eseguire una nuova scansione di tutti gli storage e aggiornare le dimensioni dei dischi e le immagini disco non utilizzate.

--dryrun <boolean> (default = 0)

Non scrive effettivamente le modifiche nella/nelle configurazione/i della VM.

--vmid <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm disk resize <vmid> <disk> <size> [OPTIONS]

Estende le dimensioni del volume.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<disk>: <efidisk0 | ide0 | ide1 | ide2 | ide3 | sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

Il disco da ridimensionare.

<size>: \+?\d+(\.\d+)?[KMGT]?

La nuova dimensione. Con il segno + il valore viene aggiunto alla dimensione attuale del volume, mentre senza di esso il valore viene considerato come assoluto. La riduzione delle dimensioni del disco non è supportata.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest SHA1 diverso. Può essere utilizzato per prevenire modifiche concorrenti.

--skiplock <boolean>

Ignora i lock - solo root può utilizzare questa opzione.

Scollega/elimina immagini disco.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--force <boolean>

Forza la rimozione fisica. Senza questa opzione, viene semplicemente rimosso il disco dal file di configurazione e creata una voce di configurazione aggiuntiva chiamata unused[n], che contiene l'ID del volume. Lo scollegamento di unused[n] causa sempre la rimozione fisica.

--idlist <string>

Un elenco di ID disco da eliminare.

qm enroll-efi-keys <vmid>

Registrare i certificati aggiornati importanti sul disco EFI con pre-enrolled-keys. Attualmente, si tratta dei certificati UEFI 2023 di Microsoft. L'operazione deve essere eseguita mentre la VM è spenta.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm guest cmd <vmid> <command>

Eseguire comandi del QEMU Guest Agent.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<command>: <fsfreeze-freeze | fsfreeze-status | fsfreeze-thaw | fstrim | get-fsinfo | get-host-name | get-memory-block-info | get-memory-blocks | get-osinfo | get-time | get-timezone | get-users | get-vcpus | info | network-get-interfaces | ping | shutdown | suspend-disk | suspend-hybrid | suspend-ram>

Il comando QGA.

qm guest exec <vmid> [<extra-args>] [OPTIONS]

Esegue il comando specificato tramite il guest agent

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<extra-args>: <array>

Argomenti aggiuntivi come array

--pass-stdin <boolean> (default = 0)

Se impostato, legge STDIN fino a EOF e lo invia al guest agent tramite input-data (solitamente trattato come STDIN del processo avviato dal guest agent). Consente un massimo di 1 MiB.

--synchronous <boolean> (default = 1)

Se impostato su off, restituisce immediatamente il pid invece di attendere il completamento del comando o il timeout.

--timeout <integer> (0 - N) (default = 30)

Il tempo massimo di attesa sincrona per il completamento del comando. Al raggiungimento, viene restituito il pid. Impostare a 0 per disattivare

qm guest exec-status <vmid> <pid>

Ottiene lo stato del pid specificato avviato dal guest-agent

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<pid>: <integer>

Il PID da interrogare

qm guest passwd <vmid> <username> [OPTIONS]

Imposta la password per l'utente specificato alla password indicata

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<username>: <string>

L'utente per cui impostare la password.

--crypted <boolean> (default = 0)

impostato a 1 se la password è già stata passata attraverso crypt()

qm help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

qm import <vmid> <source> --storage <string> [OPTIONS]

Consente di importare un guest virtuale esterno da un'origine di importazione supportata, ad esempio uno storage ESXi.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<source>: <string>

L'id del volume di origine dell'importazione.

--acpi <boolean> (default = 1)

Abilita/disabilita ACPI.

--affinity <string>

Elenco dei core host utilizzati per eseguire i processi guest, ad esempio: 0,5,8-11

--agent [enabled=]<1|0> [,freeze-fs=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

Abilita/disabilita la comunicazione con il QEMU Guest Agent e le relative proprietà.

--allow-ksm <boolean> (default = 1)

Consente l'unione delle pagine di memoria di questo guest tramite KSM (Kernel Samepage Merging).

--amd-sev [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

Funzionalità Secure Encrypted Virtualization (SEV) delle CPU AMD

--arch <aarch64 | x86_64>

Architettura del processore virtuale. Il valore predefinito è l'architettura dell'host.

--args <string>

Argomenti arbitrari passati a kvm.

--audio0 device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

Configura un dispositivo audio, utile in combinazione con QXL/Spice.

--autostart <boolean> (predefinito = 0)

Riavvio automatico dopo un crash (attualmente ignorato).

--balloon <integer> (0 - N)

Quantità di RAM di destinazione per la VM in MiB. Il driver balloon è abilitato per impostazione predefinita, a meno che non venga esplicitamente disabilitato impostando il valore a zero.

--bios <ovmf | seabios> (predefinito = seabios)

Selezionare l'implementazione del BIOS.

--boot [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

Specificare l'ordine di avvio del guest. Utilizzare la sottoproprietà order=, poiché l'utilizzo senza chiave o con legacy= è deprecato.

--bootdisk (ide|sata|scsi|virtio)\d+

Abilitare l'avvio dal disco specificato. Deprecato: utilizzare boot: order=foo;bar al suo posto.

--cdrom <volume>

Questo è un alias per l'opzione -ide2

--cicustom [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init: specificare file personalizzati per sostituire quelli generati automaticamente all'avvio.

--cipassword <string>

cloud-init: password da assegnare all'utente. L'utilizzo di questa opzione non è generalmente consigliato. Utilizzare invece le chiavi SSH. Notare inoltre che le versioni di cloud-init meno recenti non supportano le password sottoposte a hash.

--citype <configdrive2 | nocloud | opennebula>

Specifica il formato di configurazione di cloud-init. Il valore predefinito dipende dal tipo di sistema operativo configurato (ostype). Viene utilizzato il formato nocloud per Linux e configdrive2 per Windows.

--ciupgrade <boolean> (predefinito = 1)

cloud-init: eseguire un aggiornamento automatico dei pacchetti dopo il primo avvio.

--ciuser <string>

cloud-init: nome utente per il quale modificare le chiavi SSH e la password, invece dell'utente predefinito configurato nell'immagine.

--cores <integer> (1 - N) (predefinito = 1)

Numero di core per socket.

--cpu [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,guest-phys-bits=<integer>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,level=<integer>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

Tipo di CPU emulata.

--cpulimit <number> (0 - 128) (predefinito = 0)

Limite di utilizzo della CPU.

--cpuunits <integer> (1 - 262144) (predefinito = cgroup v1: 1024, cgroup v2: 100)

Peso CPU per una VM; nel cgroup v2 viene limitato all'intervallo [1, 10000].

--delete <string>

Un elenco delle impostazioni da eliminare.

--description <string>

Descrizione per la VM. Visualizzata nel riepilogo della VM nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

--dryrun <boolean> (default = 0)

Mostrare il comando di creazione e uscire senza eseguire alcuna azione.

--efidisk0 [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,import-from=<source volume>] [,ms-cert=<enum>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

Configurare un disco per memorizzare le variabili EFI. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Da notare che SIZE_IN_GiB viene ignorato in questo caso e che le variabili EFI predefinite vengono invece copiate nel volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--format <qcow2 | raw | vmdk>

Formato di destinazione

--freeze <boolean>

Bloccare la CPU all'avvio (utilizzare il comando c del monitor per avviare l'esecuzione).

--hookscript <string>

Script che verrà eseguito durante varie fasi del ciclo di vita delle VM.

--hostpci[n] [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,driver=<vfio|keep>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>]

Mappare i dispositivi PCI dell'host nel guest.

--hotplug <string> (predefinito = network,disk,usb)

Abilitare selettivamente le funzionalità di hotplug. Si tratta di un elenco separato da virgole di funzionalità hotplug: network, disk, cpu, memory, usb e cloudinit. Utilizzare 0 per disabilitare completamente l’hotplug. L’utilizzo di 1 come valore è un alias per il valore predefinito network,disk,usb. L’hotplug USB è possibile per i guest con versione macchina >= 7.1 e ostype l26 oppure windows > 7.

--hugepages <1024 | 2 | any>

Abilita la memoria hugepages.

Impostare la dimensione delle hugepage in MiB. Se il valore è impostato su any, verranno utilizzate hugepage da 1 GiB, se possibile; altrimenti verranno utilizzate hugepage da 2 MiB.

--ide[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido IDE o CD-ROM (n va da 0 a 3). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--intel-tdx [type=]<tdx-type> ,attestation=<1|0> [,vsock-cid=<integer>] [,vsock-port=<integer>]

Funzionalità Trusted Domain Extension (TDX) delle CPU Intel

--ipconfig[n] [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init: specificare gli indirizzi IP e i gateway per l'interfaccia corrispondente.

Gli indirizzi IP utilizzano la notazione CIDR; i gateway sono opzionali, ma richiedono la specifica di un IP dello stesso tipo.

La stringa speciale dhcp può essere utilizzata per gli indirizzi IP per usare il DHCP, nel qual caso non deve essere specificato alcun gateway esplicito. Per IPv6, la stringa speciale auto può essere utilizzata per la configurazione automatica stateless. Questo richiede cloud-init 19.4 o versioni successive.

Se cloud-init è abilitato e non viene specificato né un indirizzo IPv4 né un indirizzo IPv6, viene utilizzato per impostazione predefinita il DHCP su IPv4.

--ivshmem size=<integer> [,name=<string>]

Memoria condivisa inter-VM. Utile per la comunicazione diretta tra VM, o con l'host.

--keephugepages <boolean> (default = 0)

Da usare insieme a hugepages. Se abilitata, le hugepages non verranno eliminate dopo lo spegnimento della VM e potranno essere utilizzate per gli avvii successivi.

--keyboard <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

Layout di tastiera per il server VNC. Questa opzione generalmente non è necessaria e spesso è gestita meglio all'interno del sistema operativo guest.

--kvm <boolean> (default = 1)

Abilitare/disabilitare la virtualizzazione hardware KVM.

--live-import <boolean> (predefinito = 0)

Avviare immediatamente la VM e copiare i dati in background.

--localtime <boolean>

Impostare l'orologio in tempo reale (RTC) sull'ora locale. Questa opzione è abilitata per impostazione predefinita se ostype indica un sistema operativo Microsoft Windows.

--lock <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

Bloccare/sbloccare la VM.

--machine [[type=]<machine type>] [,aw-bits=<number>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

Specificare la macchina QEMU.

--memory [current=]<integer>

Proprietà della memoria.

--migrate_downtime <number> (0 - N) (default = 0.1)

Impostare il tempo massimo di inattività tollerato (in secondi) per le migrazioni. Se la migrazione non riesce a convergere nella fase finale, poiché deve essere trasferita una quantità eccessiva di RAM appena modificata, il limite viene aumentato automaticamente in modo graduale finché la migrazione non riesce a convergere. Il limite non può superare i 2000 secondi (valore massimo in QEMU).

--migrate_speed <integer> (0 - N) (default = 0)

Impostare la velocità massima (in MB/s) per le migrazioni. Il valore 0 indica che non vi sono limiti.

--name <string>

Impostare un nome per la VM. Utilizzato solo nell'interfaccia web di configurazione.

--nameserver <string>

cloud-init: imposta l'indirizzo IP del server DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

--net[n] [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,host-tunnel=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

Specificare i dispositivi di rete.

--numa <boolean> (default = 0)

Abilitare/disabilitare NUMA.

--numa[n] cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

Topologia NUMA.

--onboot <boolean> (default = 0)

Specifica se una VM verrà avviata durante l'avvio del sistema.

--ostype <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp> (default = other)

Specificare il sistema operativo guest.

--parallel[n] /dev/parport\d+|/dev/usb/lp\d+

Mappare i dispositivi paralleli dell'host (n va da 0 a 2).

--protection <boolean> (predefinito = 0)

Imposta il flag di protezione della VM. Questo disabilita le operazioni di rimozione della VM e rimozione del disco.

--reboot <boolean> (predefinito = 1)

Consente il riavvio. Se impostato su 0 la VM si arresta al riavvio.

--rng0 [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

Configurare un generatore di numeri casuali basato su VirtIO.

--sata[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SATA o CD-ROM (n va da 0 a 5). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--scsi[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SCSI o CD-ROM (n va da 0 a 30). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--scsihw <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (predefinito = lsi)

Modello di controller SCSI

--searchdomain <string>

cloud-init: imposta i domini di ricerca DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

--serial[n] (/dev/[^,]+|socket)

Creare un dispositivo seriale all'interno della VM (n va da 0 a 3)

--shares <integer> (0 - 50000) (predefinito = 1000)

Quantità di share di memoria per l'auto-ballooning. Maggiore è il numero, maggiore è la memoria riservata a questa VM. Il numero è relativo ai pesi di tutte le altre VM in esecuzione. Utilizzare zero per disabilitare l'auto-ballooning. L'auto-ballooning viene eseguito da pvestatd.

--smbios1 [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

Specificare i campi SMBIOS di tipo 1.

--smp <integer> (1 - N) (predefinito = 1)

Il numero di CPU. Utilizzare invece l'opzione -sockets.

--sockets <integer> (1 - N) (predefinito = 1)

Il numero di socket CPU.

--spice_enhancements [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

Configurare miglioramenti aggiuntivi per SPICE.

--sshkeys <string>

cloud-init: configurare le chiavi SSH pubbliche (una chiave per riga, formato OpenSSH).

--startdate (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (predefinito = now)

Impostare la data iniziale dell'orologio in tempo reale. I formati di data validi sono: 'now' oppure 2006-06-17T16:01:21 oppure 2006-06-17.

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

--storage <storage ID>

Storage predefinito.

--tablet <boolean> (predefinito = 1)

Abilitare/disabilitare il dispositivo tablet USB.

--tags <string>

Tag della VM. Si tratta solo di metadati.

--tdf <boolean> (predefinito = 0)

Abilitare/disabilitare la correzione della deriva temporale.

--template <boolean> (predefinito = 0)

Abilitare/disabilitare il template.

--tpmstate0 [file=]<volume> [,format=<raw|qcow2|vmdk>] [,import-from=<source volume>] [,size=<DiskSize>] [,version=<v1.2|v2.0>]

Configurare un disco per memorizzare lo stato TPM. Il formato è impostato su raw e non è modificabile. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Si noti che SIZE_IN_GiB viene ignorato in questo caso e verranno utilizzati 4 MiB al suo posto. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--unused[n] [file=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

--usb[n] [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

Configurare un dispositivo USB (n va da 0 a 4; per una versione della macchina >= 7.1 e ostype l26 o windows > 7, n può arrivare fino a 14).

--vcpus <integer> (1 - N) (predefinito = 0)

Numero di vcpu collegate a caldo.

--vga [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

Configurare l'hardware VGA.

--virtio[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,werror=<enum>]

Utilizzare il volume come disco rigido VIRTIO (n va da 0 a 15). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--virtiofs[n] [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

Configurazione per la condivisione di una directory tra host e guest tramite Virtio-fs.

--vmgenid <UUID> (predefinito = 1 (autogenerated))

Impostare l'ID generazione VM. Utilizzare 1 per generarlo automaticamente in fase di creazione o aggiornamento, oppure 0 per disabilitarlo esplicitamente.

--vmstatestorage <storage ID>

Storage predefinito per i volumi/file di stato della VM.

--watchdog [[model=]<i6300esb|ib700>] [,action=<enum>]

Creare un dispositivo watchdog hardware virtuale.

qm importdisk

Un alias per qm disk import.

qm importovf <vmid> <manifest> <storage> [OPTIONS]

Creare una nuova VM utilizzando i parametri letti da un manifest OVF

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<manifest>: <string>

percorso del file ovf

<storage>: <storage ID>

ID dello storage di destinazione

--dryrun <boolean>

Stampare una rappresentazione dei parametri OVF estratti ottenuta mediante parsing, senza creare una VM

--format <qcow2 | raw | vmdk>

Formato di destinazione

qm list [OPTIONS]

Indice delle macchine virtuali (per nodo).

--full <boolean>

Determinare lo stato completo delle VM attive.

qm listsnapshot <vmid>

Elenca tutti gli snapshot.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm migrate <vmid> <target> [OPTIONS]

Migrare la macchina virtuale. Viene creata una nuova attività di migrazione.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<target>: <string>

Nodo di destinazione.

--bwlimit <integer> (0 - N) (valore predefinito = limite di migrazione dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--force <boolean>

Consente di migrare VM che utilizzano dispositivi locali. Solo root può utilizzare questa opzione.

--migration_network <string>

CIDR della (sotto)rete utilizzata per la migrazione.

--migration_type <insecure | secure>

Per impostazione predefinita, il traffico di migrazione viene cifrato tramite un tunnel SSH. Su reti sicure e completamente private, questa opzione può essere disabilitata per aumentare le prestazioni.

--online <boolean>

Utilizza la migrazione online/live se la VM è in esecuzione. Ignorato se la VM è arrestata.

--targetstorage <string>

Mappatura dagli storage di origine agli storage di destinazione. Fornendo un solo ID di storage, tutti gli storage di origine vengono mappati su quello storage. Fornendo il valore speciale 1, ciascuno storage di origine viene mappato su se stesso.

--with-conntrack-state <boolean> (default = 0)

Indica se migrare le voci conntrack per le VM in esecuzione.

--with-local-disks <boolean>

Abilitare la migrazione live dello storage per il disco locale

qm monitor <vmid>

Accede all'interfaccia QEMU Monitor.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm move-disk

Un alias per qm disk move.

qm move_disk

Un alias per qm disk move.

qm mtunnel

Utilizzato da qmigrate - non utilizzare manualmente.

qm nbdstop <vmid>

Arresta il server nbd integrato.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm pending <vmid>

Ottiene la configurazione della macchina virtuale con i valori sia correnti che in sospeso.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm reboot <vmid> [OPTIONS]

Riavvia la VM arrestandola e avviandola nuovamente. Applica le modifiche in sospeso.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--timeout <integer> (0 - N)

Attende al massimo il numero di secondi di timeout per l'arresto.

qm remote-migrate <vmid> [<target-vmid>] <target-endpoint> --target-bridge <string> --target-storage <string> [OPTIONS]

Migra la macchina virtuale verso un cluster remoto. Crea una nuova attività di migrazione. Funzionalità SPERIMENTALE!

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<target-vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<target-endpoint>: apitoken=<PVEAPIToken=user@realm!token=SECRET> ,host=<ADDRESS> [,fingerprint=<FINGERPRINT>] [,port=<PORT>]

Endpoint di destinazione remoto

--bwlimit <integer> (0 - N) (valore predefinito = limite di migrazione dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--delete <boolean> (default = 0)

Elimina la VM originale e i relativi dati dopo la migrazione riuscita. Per impostazione predefinita la VM originale viene mantenuta sul cluster di origine in stato arrestato.

--online <boolean>

Utilizza la migrazione online/live se la VM è in esecuzione. Ignorato se la VM è arrestata.

--target-bridge <string>

Mappatura dai bridge di origine ai bridge di destinazione. Fornendo un solo ID bridge, tutti i bridge di origine vengono mappati su quel bridge. Fornendo il valore speciale 1 ogni bridge di origine verrà mappato su se stesso.

--target-storage <string>

Mappatura dagli storage di origine agli storage di destinazione. Fornendo un solo ID di storage, tutti gli storage di origine vengono mappati su quello storage. Fornendo il valore speciale 1, ciascuno storage di origine viene mappato su se stesso.

qm rescan

Un alias per qm disk rescan.

qm reset <vmid> [OPTIONS]

Reimpostare la macchina virtuale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--skiplock <boolean>

Ignora i lock - solo root può utilizzare questa opzione.

qm resize

Un alias per qm disk resize.

qm resume <vmid> [OPTIONS]

Riprendere la macchina virtuale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--nocheck <boolean>

Non verificare se la VM è in esecuzione; questa opzione viene utilizzata internamente durante la migrazione. Solo root può utilizzare questa opzione.

--skiplock <boolean>

Ignora i lock - solo root può utilizzare questa opzione.

qm rollback <vmid> <snapname> [OPTIONS]

Ripristina lo stato della VM allo snapshot specificato.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<snapname>: <string>

Il nome dello snapshot.

--start <boolean> (predefinito = 0)

Indica se la VM deve essere avviata dopo il ripristino riuscito. (Nota: le VM verranno avviate automaticamente se lo snapshot include la RAM.)

qm sendkey <vmid> <key> [OPTIONS]

Inviare un evento relativo a un tasto alla macchina virtuale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<key>: <string>

Il tasto (codifica del monitor qemu).

--skiplock <boolean>

Ignorare i lock - solo root può utilizzare questa opzione.

qm set <vmid> [OPTIONS]

Impostare le opzioni della macchina virtuale (API sincrona) - Si consiglia di valutare l'utilizzo del metodo POST in alternativa per qualsiasi azione che comporti hotplug o allocazione dello storage.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--acpi <boolean> (default = 1)

Abilitare/disabilitare ACPI.

--affinity <string>

Elenco dei core host utilizzati per eseguire i processi guest, ad esempio: 0,5,8-11

--agent [enabled=]<1|0> [,freeze-fs=<1|0>] [,fstrim_cloned_disks=<1|0>] [,type=<virtio|isa>]

Abilitare/disabilitare la comunicazione con il QEMU Guest Agent e le relative proprietà.

--allow-ksm <boolean> (default = 1)

Consente l'unione delle pagine di memoria di questo guest tramite KSM (Kernel Samepage Merging).

--amd-sev [type=]<sev-type> [,allow-smt=<1|0>] [,kernel-hashes=<1|0>] [,no-debug=<1|0>] [,no-key-sharing=<1|0>]

Funzionalità Secure Encrypted Virtualization (SEV) delle CPU AMD

--arch <aarch64 | x86_64>

Architettura del processore virtuale. Il valore predefinito è l'architettura dell'host.

--args <string>

Argomenti arbitrari passati a kvm.

--audio0 device=<ich9-intel-hda|intel-hda|AC97> [,driver=<spice|none>]

Configurare un dispositivo audio, utile in combinazione con QXL/Spice.

--autostart <boolean> (predefinito = 0)

Riavvio automatico dopo un crash (attualmente ignorato).

--balloon <integer> (0 - N)

Quantità di RAM di destinazione per la VM in MiB. Il driver balloon è abilitato per impostazione predefinita, a meno che non venga esplicitamente disabilitato impostando il valore a zero.

--bios <ovmf | seabios> (predefinito = seabios)

Selezionare l'implementazione del BIOS.

--boot [[legacy=]<[acdn]{1,4}>] [,order=<device[;device...]>]

Specificare l'ordine di avvio del guest. L'utilizzo della sottoproprietà order= è preferibile, poiché l'utilizzo senza chiave o con legacy= è deprecato.

--bootdisk (ide|sata|scsi|virtio)\d+

Abilitare l'avvio dal disco specificato. Deprecato: utilizzare boot: order=foo;bar al suo posto.

--cdrom <volume>

Questo è un alias per l'opzione -ide2

--cicustom [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

cloud-init: specificare file personalizzati per sostituire quelli generati automaticamente all'avvio.

--cipassword <password>

cloud-init: password da assegnare all'utente. L'utilizzo di questa opzione non è generalmente consigliato. Utilizzare invece le chiavi SSH. Notare inoltre che le versioni di cloud-init meno recenti non supportano le password sottoposte a hash.

--citype <configdrive2 | nocloud | opennebula>

Specifica il formato di configurazione di cloud-init. Il valore predefinito dipende dal tipo di sistema operativo configurato (ostype). Viene utilizzato il formato nocloud per Linux e configdrive2 per Windows.

--ciupgrade <boolean> (predefinito = 1)

cloud-init: eseguire un aggiornamento automatico dei pacchetti dopo il primo avvio.

--ciuser <string>

cloud-init: nome utente per il quale modificare le chiavi SSH e la password, invece dell'utente predefinito configurato nell'immagine.

--cores <integer> (1 - N) (predefinito = 1)

Numero di core per socket.

--cpu [[cputype=]<string>] [,flags=<+FLAG[;-FLAG...]>] [,guest-phys-bits=<integer>] [,hidden=<1|0>] [,hv-vendor-id=<vendor-id>] [,level=<integer>] [,phys-bits=<8-64|host>] [,reported-model=<enum>]

Tipo di CPU emulata.

--cpulimit <number> (0 - 128) (predefinito = 0)

Limite di utilizzo della CPU.

--cpuunits <integer> (1 - 262144) (predefinito = cgroup v1: 1024, cgroup v2: 100)

Peso CPU per una VM; nel cgroup v2 viene limitato all'intervallo [1, 10000].

--delete <string>

Un elenco delle impostazioni da eliminare.

--description <string>

Descrizione per la VM. Visualizzata nel riepilogo della VM nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest SHA1 diverso. Può essere utilizzato per prevenire modifiche concorrenti.

--efidisk0 [file=]<volume> [,efitype=<2m|4m>] [,format=<enum>] [,import-from=<source volume>] [,ms-cert=<enum>] [,pre-enrolled-keys=<1|0>] [,size=<DiskSize>]

Configurare un disco per memorizzare le variabili EFI. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Da notare che SIZE_IN_GiB viene ignorato in questo caso e che le variabili EFI predefinite vengono invece copiate nel volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--force <boolean>

Forzare la rimozione fisica. Senza questa opzione, viene semplicemente rimosso il disco dal file di configurazione e creata una voce di configurazione aggiuntiva chiamata unused[n], che contiene l'ID del volume. Lo scollegamento di unused[n] causa sempre la rimozione fisica.

Note Richiede opzione/i: delete
--freeze <boolean>

Bloccare la CPU all'avvio (utilizzare il comando c del monitor per avviare l'esecuzione).

--hookscript <string>

Script che verrà eseguito durante varie fasi del ciclo di vita della VM.

--hostpci[n] [[host=]<HOSTPCIID[;HOSTPCIID2...]>] [,device-id=<hex id>] [,driver=<vfio|keep>] [,legacy-igd=<1|0>] [,mapping=<mapping-id>] [,mdev=<string>] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=<string>] [,sub-device-id=<hex id>] [,sub-vendor-id=<hex id>] [,vendor-id=<hex id>] [,x-vga=<1|0>]

Mappare i dispositivi PCI dell'host nel guest.

--hotplug <string> (predefinito = network,disk,usb)

Abilitare selettivamente le funzionalità di hotplug. Si tratta di un elenco separato da virgole di funzionalità hotplug: network, disk, cpu, memory, usb e cloudinit. Utilizzare 0 per disabilitare completamente l’hotplug. L’utilizzo di 1 come valore è un alias per il valore predefinito network,disk,usb. L’hotplug USB è possibile per i guest con versione della macchina >= 7.1 e ostype l26 oppure windows > 7.

--hugepages <1024 | 2 | any>

Abilita la memoria hugepages.

Impostare la dimensione delle hugepage in MiB. Se il valore è impostato su any, verranno utilizzate hugepage da 1 GiB, se possibile; altrimenti verranno utilizzate hugepage da 2 MiB.

--ide[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,model=<model>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido IDE o CD-ROM (n va da 0 a 3). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--intel-tdx [type=]<tdx-type> ,attestation=<1|0> [,vsock-cid=<integer>] [,vsock-port=<integer>]

Funzionalità Trusted Domain Extension (TDX) delle CPU Intel

--ipconfig[n] [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

cloud-init: specificare gli indirizzi IP e i gateway per l'interfaccia corrispondente.

Gli indirizzi IP utilizzano la notazione CIDR; i gateway sono opzionali, ma richiedono la specifica di un IP dello stesso tipo.

La stringa speciale dhcp può essere utilizzata per gli indirizzi IP per usare il DHCP, nel qual caso non deve essere specificato alcun gateway esplicito. Per IPv6, la stringa speciale auto può essere utilizzata per la configurazione automatica stateless. Questo richiede cloud-init 19.4 o versioni successive.

Se cloud-init è abilitato e non viene specificato né un indirizzo IPv4 né un indirizzo IPv6, viene utilizzato per impostazione predefinita il DHCP su IPv4.

--ivshmem size=<integer> [,name=<string>]

Memoria condivisa inter-VM. Utile per la comunicazione diretta tra VM, o con l'host.

--keephugepages <boolean> (default = 0)

Da usare insieme a hugepages. Se abilitata, le hugepages non verranno eliminate dopo lo spegnimento della VM e potranno essere utilizzate per gli avvii successivi.

--keyboard <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

Layout di tastiera per il server VNC. Questa opzione generalmente non è necessaria e spesso è gestita meglio all'interno del sistema operativo guest.

--kvm <boolean> (default = 1)

Abilitare/disabilitare la virtualizzazione hardware KVM.

--localtime <boolean>

Impostare l'orologio in tempo reale (RTC) sull'ora locale. Questa opzione è abilitata per impostazione predefinita se ostype indica un sistema operativo Microsoft Windows.

--lock <backup | clone | create | migrate | rollback | snapshot | snapshot-delete | suspended | suspending>

Bloccare/sbloccare la VM.

--machine [[type=]<machine type>] [,aw-bits=<number>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

Specificare la macchina QEMU.

--memory [current=]<integer>

Proprietà della memoria.

--migrate_downtime <number> (0 - N) (default = 0.1)

Impostare il downtime massimo tollerato (in secondi) per le migrazioni. Se la migrazione non riesce a convergere nella fase finale, poiché deve essere trasferita una quantità eccessiva di RAM modificata di recente, il limite viene aumentato automaticamente passo dopo passo finché la migrazione non riesce a convergere. Il valore viene limitato a 2000 secondi (massimo consentito in QEMU).

--migrate_speed <integer> (0 - N) (default = 0)

Impostare la velocità massima (in MB/s) per le migrazioni. Il valore 0 indica nessun limite.

--name <string>

Impostare un nome per la VM. Utilizzato solo nell'interfaccia web di configurazione.

--nameserver <string>

cloud-init: imposta l'indirizzo IP del server DNS per un container. In fase di creazione verrà utilizzata automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

--net[n] [model=]<enum> [,bridge=<bridge>] [,firewall=<1|0>] [,host-tunnel=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,mtu=<integer>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

Specificare i dispositivi di rete.

--numa <boolean> (default = 0)

Abilitare/disabilitare NUMA.

--numa[n] cpus=<id[-id];...> [,hostnodes=<id[-id];...>] [,memory=<number>] [,policy=<preferred|bind|interleave>]

Topologia NUMA.

--onboot <boolean> (default = 0)

Specifica se una VM verrà avviata durante l'avvio del sistema.

--ostype <l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win11 | win7 | win8 | wvista | wxp> (default = other)

Specificare il sistema operativo guest.

--parallel[n] /dev/parport\d+|/dev/usb/lp\d+

Mappare i dispositivi paralleli dell'host (n va da 0 a 2).

--protection <boolean> (predefinito = 0)

Imposta il flag di protezione della VM. Questo disabilita le operazioni di rimozione della VM e rimozione del disco.

--reboot <boolean> (predefinito = 1)

Consente il riavvio. Se impostato su 0 la VM si arresta al riavvio.

--revert <string>

Annullare una modifica in sospeso.

--rng0 [source=]</dev/urandom|/dev/random|/dev/hwrng> [,max_bytes=<integer>] [,period=<integer>]

Configurare un generatore di numeri casuali basato su VirtIO.

--sata[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SATA o CD-ROM (n va da 0 a 5). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--scsi[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,product=<product>] [,queues=<integer>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,scsiblock=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,ssd=<1|0>] [,vendor=<vendor>] [,werror=<enum>] [,wwn=<wwn>]

Utilizzare il volume come disco rigido SCSI o CD-ROM (n va da 0 a 30). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--scsihw <lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single> (predefinito = lsi)

Modello di controller SCSI

--searchdomain <string>

cloud-init: imposta i domini di ricerca DNS per un container. In fase di creazione verrà utilizzata automaticamente l'impostazione dell'host se non sono impostati né searchdomain né nameserver.

--serial[n] (/dev/[^,]+|socket)

Creare un dispositivo seriale all'interno della VM (n va da 0 a 3)

--shares <integer> (0 - 50000) (predefinito = 1000)

Quantità di quote di memoria per l'auto-ballooning. Maggiore è il numero, maggiore è la memoria assegnata a questa VM. Il numero è relativo ai pesi di tutte le altre VM in esecuzione. Utilizzare zero per disabilitare l'auto-ballooning. L'auto-ballooning viene eseguito da pvestatd.

--skiplock <boolean>

Ignorare i lock - solo root può utilizzare questa opzione.

--smbios1 [base64=<1|0>] [,family=<Base64 encoded string>] [,manufacturer=<Base64 encoded string>] [,product=<Base64 encoded string>] [,serial=<Base64 encoded string>] [,sku=<Base64 encoded string>] [,uuid=<UUID>] [,version=<Base64 encoded string>]

Specificare i campi SMBIOS di tipo 1.

--smp <integer> (1 - N) (predefinito = 1)

Il numero di CPU. Utilizzare invece l'opzione -sockets.

--sockets <integer> (1 - N) (predefinito = 1)

Il numero di socket CPU.

--spice_enhancements [foldersharing=<1|0>] [,videostreaming=<off|all|filter>]

Configurare miglioramenti aggiuntivi per SPICE.

--sshkeys <filepath>

cloud-init: configurare le chiavi SSH pubbliche (una chiave per riga, formato OpenSSH).

--startdate (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (predefinito = now)

Impostare la data iniziale dell'orologio in tempo reale. I formati di data validi sono: 'now' oppure 2006-06-17T16:01:21 oppure 2006-06-17.

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

--tablet <boolean> (predefinito = 1)

Abilitare/disabilitare il dispositivo tablet USB.

--tags <string>

Tag della VM. Si tratta solo di metadati.

--tdf <boolean> (predefinito = 0)

Abilitare/disabilitare la correzione della deriva temporale.

--template <boolean> (predefinito = 0)

Abilitare/disabilitare il template.

--tpmstate0 [file=]<volume> [,format=<raw|qcow2|vmdk>] [,import-from=<source volume>] [,size=<DiskSize>] [,version=<v1.2|v2.0>]

Configurare un disco per memorizzare lo stato del TPM. Il formato è fissato a raw. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Si noti che SIZE_IN_GiB viene ignorato in questo caso e verranno utilizzati 4 MiB al suo posto. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--unused[n] [file=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

--usb[n] [[host=]<HOSTUSBDEVICE|spice>] [,mapping=<mapping-id>] [,usb3=<1|0>]

Configurare un dispositivo USB (n va da 0 a 4; per una versione della macchina >= 7.1 e ostype l26 o windows > 7, n può arrivare fino a 14).

--vcpus <integer> (1 - N) (predefinito = 0)

Numero di vcpu collegate a caldo.

--vga [[type=]<enum>] [,clipboard=<vnc>] [,memory=<integer>]

Configurare l'hardware VGA.

--virtio[n] [file=]<volume> [,aio=<native|threads|io_uring>] [,backup=<1|0>] [,bps=<bps>] [,bps_max_length=<seconds>] [,bps_rd=<bps>] [,bps_rd_max_length=<seconds>] [,bps_wr=<bps>] [,bps_wr_max_length=<seconds>] [,cache=<enum>] [,detect_zeroes=<1|0>] [,discard=<ignore|on>] [,format=<enum>] [,import-from=<source volume>] [,iops=<iops>] [,iops_max=<iops>] [,iops_max_length=<seconds>] [,iops_rd=<iops>] [,iops_rd_max=<iops>] [,iops_rd_max_length=<seconds>] [,iops_wr=<iops>] [,iops_wr_max=<iops>] [,iops_wr_max_length=<seconds>] [,iothread=<1|0>] [,mbps=<mbps>] [,mbps_max=<mbps>] [,mbps_rd=<mbps>] [,mbps_rd_max=<mbps>] [,mbps_wr=<mbps>] [,mbps_wr_max=<mbps>] [,media=<cdrom|disk>] [,replicate=<1|0>] [,rerror=<ignore|report|stop>] [,ro=<1|0>] [,serial=<serial>] [,shared=<1|0>] [,size=<DiskSize>] [,snapshot=<1|0>] [,werror=<enum>]

Utilizzare il volume come disco rigido VIRTIO (n va da 0 a 15). Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume. Utilizzare STORAGE_ID:0 e il parametro import-from per importare da un volume esistente.

--virtiofs[n] [dirid=]<mapping-id> [,cache=<enum>] [,direct-io=<1|0>] [,expose-acl=<1|0>] [,expose-xattr=<1|0>]

Configurazione per la condivisione di una directory tra host e guest tramite Virtio-fs.

--vmgenid <UUID> (predefinito = 1 (autogenerated))

Impostare l'ID generazione VM. Utilizzare 1 per generarlo automaticamente in fase di creazione o aggiornamento, oppure 0 per disabilitarlo esplicitamente.

--vmstatestorage <storage ID>

Storage predefinito per i volumi/file di stato della VM.

--watchdog [[model=]<i6300esb|ib700>] [,action=<enum>]

Creare un dispositivo watchdog hardware virtuale.

qm showcmd <vmid> [OPTIONS]

Mostrare la riga di comando utilizzata per avviare la VM (informazioni di debug).

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--pretty <boolean> (default = 0)

Pone ciascuna opzione su una nuova riga per migliorare la leggibilità

--snapshot <string>

Recuperare i valori di configurazione dallo snapshot indicato.

qm shutdown <vmid> [OPTIONS]

Arrestare la macchina virtuale. È un'operazione simile alla pressione del pulsante di alimentazione su una macchina fisica. Verrà inviato un evento ACPI al sistema operativo guest, che dovrebbe quindi procedere a un arresto pulito.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--forceStop <boolean> (default = 0)

Assicurarsi che la VM si arresti.

--keepActive <boolean> (default = 0)

Non disattivare i volumi di storage.

--skiplock <boolean>

Ignorare i lock - solo root può utilizzare questa opzione.

--timeout <integer> (0 - N)

Attendere al massimo per il numero di secondi specificato dal timeout.

qm snapshot <vmid> <snapname> [OPTIONS]

Creare uno snapshot di una VM.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<snapname>: <string>

Il nome dello snapshot.

--description <string>

Una descrizione testuale o un commento.

--vmstate <boolean>

Salvare lo stato della VM

qm start <vmid> [OPTIONS]

Avviare la macchina virtuale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--force-cpu <string>

Sovrascrive l'argomento -cpu di QEMU con la stringa specificata.

--machine [[type=]<machine type>] [,aw-bits=<number>] [,enable-s3=<1|0>] [,enable-s4=<1|0>] [,viommu=<intel|virtio>]

Specificare la macchina QEMU.

--migratedfrom <string>

Il nome del nodo del cluster.

--migration_network <string>

CIDR della (sotto)rete utilizzata per la migrazione.

--migration_type <insecure | secure>

Per impostazione predefinita, il traffico di migrazione viene cifrato tramite un tunnel SSH. Su reti sicure e completamente private, questa opzione può essere disabilitata per aumentare le prestazioni.

--nets-host-mtu net\d+=\d+(,net\d+=\d+)*

Utilizzato per la compatibilità di migrazione. Elenco dei dispositivi di rete VirtIO e della relativa impostazione host_mtu effettiva secondo il modello a oggetti QEMU sul lato di origine della migrazione. Un valore pari a 0 indica che il parametro host_mtu deve essere evitato per il dispositivo corrispondente.

--skiplock <boolean>

Ignorare i lock - solo root può utilizzare questa opzione.

--stateuri <string>

Alcuni comandi salvano/ripristinano lo stato da questa posizione.

--targetstorage <string>

Mappatura dagli storage di origine agli storage di destinazione. Fornendo un solo ID di storage, tutti gli storage di origine vengono mappati su quello storage. Fornendo il valore speciale 1, ciascuno storage di origine viene mappato su se stesso.

--timeout <integer> (0 - N) (default = max(30, vm memory in GiB))

Attendere al massimo per il numero di secondi specificato dal timeout.

--with-conntrack-state <boolean> (default = 0)

Indica se migrare le voci conntrack per le VM in esecuzione.

qm status <vmid> [OPTIONS]

Mostra lo stato della VM.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--verbose <boolean>

Formato di output dettagliato

qm stop <vmid> [OPTIONS]

Arrestare la macchina virtuale. Il processo qemu terminerà immediatamente. Questo equivale a staccare la spina di alimentazione di un computer in funzione e può danneggiare i dati della VM.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--keepActive <boolean> (default = 0)

Non disattiva i volumi di storage.

--migratedfrom <string>

Il nome del nodo del cluster.

--overrule-shutdown <boolean> (default = 0)

Tentare di interrompere le attività qmshutdown attive prima dell'arresto.

--skiplock <boolean>

Ignorare i lock - solo root può utilizzare questa opzione.

--timeout <integer> (0 - N)

Attendere al massimo per il numero di secondi specificato dal timeout.

qm suspend <vmid> [OPTIONS]

Sospende la macchina virtuale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--skiplock <boolean>

Ignorare i lock - solo root può utilizzare questa opzione.

--statestorage <storage ID>

Lo storage per lo stato della VM

Note Richiede opzione/i: todisk
--todisk <boolean> (predefinito = 0)

Se impostato, sospende la VM su disco. Verrà ripristinata al successivo avvio della VM.

qm template <vmid> [OPTIONS]

Creare un template.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--disk <efidisk0 | ide0 | ide1 | ide2 | ide3 | sata0 | sata1 | sata2 | sata3 | sata4 | sata5 | scsi0 | scsi1 | scsi10 | scsi11 | scsi12 | scsi13 | scsi14 | scsi15 | scsi16 | scsi17 | scsi18 | scsi19 | scsi2 | scsi20 | scsi21 | scsi22 | scsi23 | scsi24 | scsi25 | scsi26 | scsi27 | scsi28 | scsi29 | scsi3 | scsi30 | scsi4 | scsi5 | scsi6 | scsi7 | scsi8 | scsi9 | tpmstate0 | virtio0 | virtio1 | virtio10 | virtio11 | virtio12 | virtio13 | virtio14 | virtio15 | virtio2 | virtio3 | virtio4 | virtio5 | virtio6 | virtio7 | virtio8 | virtio9>

Se si desidera convertire solo 1 disco in immagine base.

qm terminal <vmid> [OPTIONS]

Apre un terminale utilizzando un dispositivo seriale (la VM deve avere un dispositivo seriale configurato, ad esempio serial0: socket)

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--escape <string> (predefinito = ^O)

Carattere di escape.

--iface <serial0 | serial1 | serial2 | serial3>

Selezionare il dispositivo seriale. Per impostazione predefinita viene semplicemente utilizzato il primo dispositivo idoneo.

Un alias per qm disk unlink.

qm unlock <vmid>

Sbloccare la VM.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm vncproxy <vmid>

Esegue il proxy del traffico VNC della VM su stdin/stdout

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

qm wait <vmid> [OPTIONS]

Attende finché la VM non è arrestata.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--timeout <integer> (1 - N)

Timeout in secondi. Per impostazione predefinita si attende indefinitamente.

22.10. qmrestore - Ripristino dei backup vzdump di QemuServer

qmrestore help

qmrestore <archive> <vmid> [OPTIONS]

Ripristina i backup vzdump di QemuServer.

<archive>: <string>

Il file di backup. È possibile indicare - per leggere dallo standard input.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--bwlimit <number> (0 - N)

Sovrascrive il limite di banda I/O (in KiB/s).

--force <boolean>

Consente di sovrascrivere una VM esistente.

--ha-managed <boolean> (predefinito = 0)

Aggiungere la VM come risorsa HA dopo il ripristino.

--live-restore <boolean>

Avviare immediatamente la VM dal backup e ripristinare in background. Solo PBS.

--pool <string>

Aggiungere la VM al pool specificato.

--start <boolean> (predefinito = 0)

Avviare la VM dopo il ripristino completato con successo.

--storage <storage ID>

Storage predefinito.

--unique <boolean>

Assegna un indirizzo ethernet casuale univoco.

22.11. pct - Proxmox Container Toolkit

pct <COMMAND> [ARGS] [OPTIONS]

pct clone <vmid> <newid> [OPTIONS]

Creare un clone/copia di un container

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<newid>: <integer> (100 - 999999999)

VMID per il clone.

--bwlimit <number> (0 - N) (predefinito = limite di clonazione dalla configurazione del datacenter o dello storage)

Sovrascrivere il limite di banda I/O (in KiB/s).

--description <string>

Descrizione per il nuovo CT.

--full <boolean>

Creare una copia completa di tutti i dischi. Questo viene sempre eseguito quando si clona un normale CT. Per i template di CT, per impostazione predefinita si tenta di creare un clone collegato.

--hostname <string>

Impostare un hostname per il nuovo CT.

--pool <string>

Aggiungere il nuovo CT al pool specificato.

--snapname <string>

Il nome dello snapshot.

--storage <storage ID>

Storage di destinazione per il clone completo.

--target <string>

Nodo di destinazione. Consentito solo se la VM originale si trova su uno storage condiviso.

pct config <vmid> [OPTIONS]

Ottenere la configurazione del container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--current <boolean> (default = 0)

Ottenere i valori correnti (invece dei valori in attesa).

--snapshot <string>

Recuperare i valori di configurazione dallo snapshot indicato.

pct console <vmid> [OPTIONS]

Avviare una console per il container specificato.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--escape \^?[a-z] (predefinito = ^a)

Prefisso della sequenza di escape. Ad esempio, per utilizzare <Ctrl+b q> come sequenza di escape, utilizzare ^b.

pct cpusets

Stampa l'elenco dei set di CPU assegnati.

pct create <vmid> <ostemplate> [OPTIONS]

Creare o ripristinare un container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<ostemplate>: <string>

Il template del sistema operativo o il file di backup.

--arch <amd64 | arm64 | armhf | i386 | riscv32 | riscv64> (predefinito = amd64)

Tipo di architettura del sistema operativo.

--bwlimit <number> (0 - N) (predefinito = limite di ripristino dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--cmode <console | shell | tty> (predefinito = tty)

Modalità console. Per impostazione predefinita, il comando console tenta di aprire una connessione a uno dei dispositivi tty disponibili. Impostando cmode su console, tenta invece di collegarsi a /dev/console. Se cmode viene impostato su shell, viene semplicemente avviata una shell all’interno del container (senza login).

--console <boolean> (predefinito = 1)

Collega un dispositivo console (/dev/console) al container.

--cores <integer> (1 - 8192)

Il numero di core assegnati al container. Per impostazione predefinita, un container può utilizzare tutti i core disponibili.

--cpulimit <number> (0 - 8192) (predefinito = 0)

Limite di utilizzo della CPU.

Note Se il computer dispone di 2 CPU, il tempo CPU totale è pari a 2. Il valore 0 indica l’assenza di limiti di CPU.
--cpuunits <integer> (0 - 500000) (predefinito = cgroup v1: 1024, cgroup v2: 100)

Peso della CPU per un container; in cgroup v2 verrà limitato all'intervallo [1, 10000].

--debug <boolean> (predefinito = 0)

Aumentare la verbosità. Attualmente abilita solo il livello di log di debug all'avvio.

--description <string>

Descrizione del container. Viene mostrata nel riepilogo del CT nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

--dev[n] [[path=]<Path>] [,deny-write=<1|0>] [,gid=<integer>] [,mode=<Octal access mode>] [,uid=<integer>]

Dispositivo da passare al container

--entrypoint (?^:[^\x00-\x08\x0a-\x1F\x7F]+) (predefinito = /sbin/init)

Comando da eseguire come init, opzionalmente con argomenti; può iniziare con un percorso assoluto, un percorso relativo o un binario in $PATH.

--env (?^:(?:\w+=[^\x00-\x08\x0a-\x1F\x7F]*)(?:\0\w+=[^\x00-\x08\x0a-\x1F\x7F]*)*)

L'ambiente di runtime del container come elenco separato da NUL. Sostituisce eventuali voci lxc.environment.runtime nella configurazione.

--features [force_rw_sys=<1|0>] [,fuse=<1|0>] [,keyctl=<1|0>] [,mknod=<1|0>] [,mount=<fstype;fstype;...>] [,nesting=<1|0>]

Consente ai container di accedere a funzionalità avanzate.

--force <boolean>

Consente di sovrascrivere un container esistente.

--ha-managed <boolean> (predefinito = 0)

Aggiunge il CT come risorsa HA dopo la creazione.

--hookscript <string>

Script che verrà eseguito durante varie fasi del ciclo di vita dei container.

--hostname <string>

Imposta un nome host per il container.

--ignore-unpack-errors <boolean>

Ignora gli errori durante l'estrazione del template.

--lock <backup | create | destroyed | disk | fstrim | migrate | mounted | rollback | snapshot | snapshot-delete>

Blocca/sblocca il container.

--memory <integer> (16 - N) (predefinito = 512)

Quantità di RAM per il container in MB.

--mp[n] [volume=]<volume> ,mp=<Path> [,acl=<1|0>] [,backup=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,keepattrs=<1|0>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come punto di mount del container. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume.

--nameserver <string>

Imposta l'indirizzo IP del server DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non viene impostato né searchdomain né nameserver.

--net[n] name=<string> [,bridge=<bridge>] [,firewall=<1|0>] [,gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,host-managed=<1|0>] [,hwaddr=<XX:XX:XX:XX:XX:XX>] [,ip=<(IPv4/CIDR|dhcp|manual)>] [,ip6=<(IPv6/CIDR|auto|dhcp|manual)>] [,link_down=<1|0>] [,mtu=<integer>] [,rate=<mbps>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,type=<veth>]

Specifica le interfacce di rete per il container.

--onboot <boolean> (default = 0)

Specifica se un container deve essere avviato durante il boot del sistema.

--ostype <alpine | archlinux | centos | debian | devuan | fedora | gentoo | nixos | opensuse | ubuntu | unmanaged>

Tipo di OS. Viene utilizzato per configurare il container e corrisponde agli script di configurazione lxc in /usr/share/lxc/config/<ostype>.common.conf. Il valore unmanaged può essere utilizzato per saltare la configurazione specifica del sistema operativo.

--password <password>

Imposta la password di root all'interno del container.

--pool <string>

Aggiungere la VM al pool specificato.

--protection <boolean> (predefinito = 0)

Imposta il flag di protezione del container. Questo impedisce le operazioni di rimozione/aggiornamento del CT o del disco del CT.

--restore <boolean>

Contrassegnare questa attività come attività di ripristino.

--rootfs [volume=]<volume> [,acl=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come root del container.

--searchdomain <string>

Imposta i domini di ricerca DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non viene impostato né searchdomain né nameserver.

--ssh-public-keys <filepath>

Configurare le chiavi SSH pubbliche (una chiave per riga, formato OpenSSH).

--start <boolean> (predefinito = 0)

Avviare il CT dopo che la sua creazione è stata completata correttamente.

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

--storage <storage ID> (predefinito = local)

Storage predefinito.

--swap <integer> (0 - N) (predefinito = 512)

Quantità di SWAP per il container in MB.

--tags <string>

Tag del container. Si tratta solo di metadati.

--template <boolean> (predefinito = 0)

Abilitare/disabilitare il template.

--timezone <string>

Fuso orario da utilizzare nel container. Se l'opzione non è impostata, non verrà eseguita alcuna azione. Può essere impostato su host per corrispondere al fuso orario dell'host, oppure a un'opzione di fuso orario arbitraria da /usr/share/zoneinfo/zone.tab

--tty <integer> (0 - 6) (predefinito = 2)

Specificare il numero di tty disponibili per il container

--unique <boolean>

Assegna un indirizzo ethernet casuale univoco.

Note Richiede l'opzione/le opzioni: restore
--unprivileged <boolean> (predefinito = 0)

Fa eseguire il container come utente non privilegiato. Per la creazione, il valore predefinito è 1. Per il ripristino, il valore predefinito è quello proveniente dal backup. (Non dovrebbe essere modificato manualmente.)

--unused[n] [volume=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

pct delsnapshot <vmid> <snapname> [OPTIONS]

Elimina uno snapshot LXC.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<snapname>: <string>

Il nome dello snapshot.

--force <boolean>

Per la rimozione dal file di configurazione, anche se la rimozione degli snapshot del disco non riesce.

pct destroy <vmid> [OPTIONS]

Elimina il container (eliminando anche tutti i file utilizzati).

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--destroy-unreferenced-disks <boolean>

Se impostato, elimina inoltre tutti i dischi con il VMID che si trovano negli storage abilitati e non sono indicati nella configurazione.

--force <boolean> (default = 0)

Forza la distruzione, anche se in esecuzione.

--purge <boolean> (predefinito = 0)

Rimuove il container da tutte le configurazioni correlate. Ad esempio, job di backup, job di replica o HA. Le voci ACL e firewall correlate saranno sempre rimosse.

pct df <vmid>

Visualizza l'utilizzo attuale del disco del container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct enter <vmid> [OPTIONS]

Avvia una shell per il container specificato.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--keep-env <boolean> (predefinito = 1)

Mantiene l'ambiente corrente. Questa opzione sarà disabilitata per impostazione predefinita a partire da PVE 9. Se è necessario fare affidamento su un ambiente preservato, si consiglia di utilizzare questa opzione per essere pronti al cambiamento futuro.

pct exec <vmid> [<extra-args>] [OPTIONS]

Avvia un comando all'interno del container specificato.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<extra-args>: <array>

Argomenti aggiuntivi come array

--keep-env <boolean> (predefinito = 1)

Mantiene l'ambiente corrente. Questa opzione sarà disabilitata per impostazione predefinita a partire da PVE 9. Se è necessario fare affidamento su un ambiente preservato, si consiglia di utilizzare questa opzione per essere pronti al cambiamento futuro.

pct fsck <vmid> [OPTIONS]

Esegue un controllo del filesystem (fsck) su un volume del container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--device <mp0 | mp1 | mp10 | mp100 | mp101 | mp102 | mp103 | mp104 | mp105 | mp106 | mp107 | mp108 | mp109 | mp11 | mp110 | mp111 | mp112 | mp113 | mp114 | mp115 | mp116 | mp117 | mp118 | mp119 | mp12 | mp120 | mp121 | mp122 | mp123 | mp124 | mp125 | mp126 | mp127 | mp128 | mp129 | mp13 | mp130 | mp131 | mp132 | mp133 | mp134 | mp135 | mp136 | mp137 | mp138 | mp139 | mp14 | mp140 | mp141 | mp142 | mp143 | mp144 | mp145 | mp146 | mp147 | mp148 | mp149 | mp15 | mp150 | mp151 | mp152 | mp153 | mp154 | mp155 | mp156 | mp157 | mp158 | mp159 | mp16 | mp160 | mp161 | mp162 | mp163 | mp164 | mp165 | mp166 | mp167 | mp168 | mp169 | mp17 | mp170 | mp171 | mp172 | mp173 | mp174 | mp175 | mp176 | mp177 | mp178 | mp179 | mp18 | mp180 | mp181 | mp182 | mp183 | mp184 | mp185 | mp186 | mp187 | mp188 | mp189 | mp19 | mp190 | mp191 | mp192 | mp193 | mp194 | mp195 | mp196 | mp197 | mp198 | mp199 | mp2 | mp20 | mp200 | mp201 | mp202 | mp203 | mp204 | mp205 | mp206 | mp207 | mp208 | mp209 | mp21 | mp210 | mp211 | mp212 | mp213 | mp214 | mp215 | mp216 | mp217 | mp218 | mp219 | mp22 | mp220 | mp221 | mp222 | mp223 | mp224 | mp225 | mp226 | mp227 | mp228 | mp229 | mp23 | mp230 | mp231 | mp232 | mp233 | mp234 | mp235 | mp236 | mp237 | mp238 | mp239 | mp24 | mp240 | mp241 | mp242 | mp243 | mp244 | mp245 | mp246 | mp247 | mp248 | mp249 | mp25 | mp250 | mp251 | mp252 | mp253 | mp254 | mp255 | mp26 | mp27 | mp28 | mp29 | mp3 | mp30 | mp31 | mp32 | mp33 | mp34 | mp35 | mp36 | mp37 | mp38 | mp39 | mp4 | mp40 | mp41 | mp42 | mp43 | mp44 | mp45 | mp46 | mp47 | mp48 | mp49 | mp5 | mp50 | mp51 | mp52 | mp53 | mp54 | mp55 | mp56 | mp57 | mp58 | mp59 | mp6 | mp60 | mp61 | mp62 | mp63 | mp64 | mp65 | mp66 | mp67 | mp68 | mp69 | mp7 | mp70 | mp71 | mp72 | mp73 | mp74 | mp75 | mp76 | mp77 | mp78 | mp79 | mp8 | mp80 | mp81 | mp82 | mp83 | mp84 | mp85 | mp86 | mp87 | mp88 | mp89 | mp9 | mp90 | mp91 | mp92 | mp93 | mp94 | mp95 | mp96 | mp97 | mp98 | mp99 | rootfs>

Un volume su cui eseguire il controllo del filesystem

--force <boolean> (default = 0)

Forza il controllo, anche se il filesystem risulta integro

pct fstrim <vmid> [OPTIONS]

Esegue fstrim su un CT selezionato e sui relativi mountpoint, eccetto i mountpoint bind o in sola lettura.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--ignore-mountpoints <boolean>

Ignora tutti i mountpoint, esegue fstrim solo sulla root del container.

pct help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pct list

Indice dei container LXC (per nodo).

pct listsnapshot <vmid>

Elenca tutti gli snapshot.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct migrate <vmid> <target> [OPTIONS]

Migra il container su un altro nodo. Crea una nuova attività di migrazione.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<target>: <string>

Nodo di destinazione.

--bwlimit <number> (0 - N) (predefinito = limite di migrazione dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--online <boolean>

Utilizzare la migrazione online/live.

--restart <boolean>

Utilizzare la migrazione con riavvio

--target-storage <string>

Mappatura dagli storage di origine agli storage di destinazione. Fornendo un solo ID di storage, tutti gli storage di origine vengono mappati su quello storage. Fornendo il valore speciale 1, ciascuno storage di origine viene mappato su se stesso.

--timeout <integer> (predefinito = 180)

Timeout in secondi per l'arresto nella migrazione con riavvio

pct mount <vmid>

Montare il filesystem del container sull'host. Questa operazione manterrà un blocco sul container ed è destinata esclusivamente alla manutenzione d'emergenza, poiché impedirà ulteriori operazioni sul container, ad eccezione dell'avvio e dell'arresto.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct move-volume <vmid> <volume> [<storage>] [<target-vmid>] [<target-volume>] [OPTIONS]

Spostare un volume rootfs/mp su uno storage diverso o su un container diverso.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<volume>: <mp0 | mp1 | mp10 | mp100 | mp101 | mp102 | mp103 | mp104 | mp105 | mp106 | mp107 | mp108 | mp109 | mp11 | mp110 | mp111 | mp112 | mp113 | mp114 | mp115 | mp116 | mp117 | mp118 | mp119 | mp12 | mp120 | mp121 | mp122 | mp123 | mp124 | mp125 | mp126 | mp127 | mp128 | mp129 | mp13 | mp130 | mp131 | mp132 | mp133 | mp134 | mp135 | mp136 | mp137 | mp138 | mp139 | mp14 | mp140 | mp141 | mp142 | mp143 | mp144 | mp145 | mp146 | mp147 | mp148 | mp149 | mp15 | mp150 | mp151 | mp152 | mp153 | mp154 | mp155 | mp156 | mp157 | mp158 | mp159 | mp16 | mp160 | mp161 | mp162 | mp163 | mp164 | mp165 | mp166 | mp167 | mp168 | mp169 | mp17 | mp170 | mp171 | mp172 | mp173 | mp174 | mp175 | mp176 | mp177 | mp178 | mp179 | mp18 | mp180 | mp181 | mp182 | mp183 | mp184 | mp185 | mp186 | mp187 | mp188 | mp189 | mp19 | mp190 | mp191 | mp192 | mp193 | mp194 | mp195 | mp196 | mp197 | mp198 | mp199 | mp2 | mp20 | mp200 | mp201 | mp202 | mp203 | mp204 | mp205 | mp206 | mp207 | mp208 | mp209 | mp21 | mp210 | mp211 | mp212 | mp213 | mp214 | mp215 | mp216 | mp217 | mp218 | mp219 | mp22 | mp220 | mp221 | mp222 | mp223 | mp224 | mp225 | mp226 | mp227 | mp228 | mp229 | mp23 | mp230 | mp231 | mp232 | mp233 | mp234 | mp235 | mp236 | mp237 | mp238 | mp239 | mp24 | mp240 | mp241 | mp242 | mp243 | mp244 | mp245 | mp246 | mp247 | mp248 | mp249 | mp25 | mp250 | mp251 | mp252 | mp253 | mp254 | mp255 | mp26 | mp27 | mp28 | mp29 | mp3 | mp30 | mp31 | mp32 | mp33 | mp34 | mp35 | mp36 | mp37 | mp38 | mp39 | mp4 | mp40 | mp41 | mp42 | mp43 | mp44 | mp45 | mp46 | mp47 | mp48 | mp49 | mp5 | mp50 | mp51 | mp52 | mp53 | mp54 | mp55 | mp56 | mp57 | mp58 | mp59 | mp6 | mp60 | mp61 | mp62 | mp63 | mp64 | mp65 | mp66 | mp67 | mp68 | mp69 | mp7 | mp70 | mp71 | mp72 | mp73 | mp74 | mp75 | mp76 | mp77 | mp78 | mp79 | mp8 | mp80 | mp81 | mp82 | mp83 | mp84 | mp85 | mp86 | mp87 | mp88 | mp89 | mp9 | mp90 | mp91 | mp92 | mp93 | mp94 | mp95 | mp96 | mp97 | mp98 | mp99 | rootfs | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99>

Volume che verrà spostato.

<storage>: <storage ID>

Storage di destinazione.

<target-vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<target-volume>: <mp0 | mp1 | mp10 | mp100 | mp101 | mp102 | mp103 | mp104 | mp105 | mp106 | mp107 | mp108 | mp109 | mp11 | mp110 | mp111 | mp112 | mp113 | mp114 | mp115 | mp116 | mp117 | mp118 | mp119 | mp12 | mp120 | mp121 | mp122 | mp123 | mp124 | mp125 | mp126 | mp127 | mp128 | mp129 | mp13 | mp130 | mp131 | mp132 | mp133 | mp134 | mp135 | mp136 | mp137 | mp138 | mp139 | mp14 | mp140 | mp141 | mp142 | mp143 | mp144 | mp145 | mp146 | mp147 | mp148 | mp149 | mp15 | mp150 | mp151 | mp152 | mp153 | mp154 | mp155 | mp156 | mp157 | mp158 | mp159 | mp16 | mp160 | mp161 | mp162 | mp163 | mp164 | mp165 | mp166 | mp167 | mp168 | mp169 | mp17 | mp170 | mp171 | mp172 | mp173 | mp174 | mp175 | mp176 | mp177 | mp178 | mp179 | mp18 | mp180 | mp181 | mp182 | mp183 | mp184 | mp185 | mp186 | mp187 | mp188 | mp189 | mp19 | mp190 | mp191 | mp192 | mp193 | mp194 | mp195 | mp196 | mp197 | mp198 | mp199 | mp2 | mp20 | mp200 | mp201 | mp202 | mp203 | mp204 | mp205 | mp206 | mp207 | mp208 | mp209 | mp21 | mp210 | mp211 | mp212 | mp213 | mp214 | mp215 | mp216 | mp217 | mp218 | mp219 | mp22 | mp220 | mp221 | mp222 | mp223 | mp224 | mp225 | mp226 | mp227 | mp228 | mp229 | mp23 | mp230 | mp231 | mp232 | mp233 | mp234 | mp235 | mp236 | mp237 | mp238 | mp239 | mp24 | mp240 | mp241 | mp242 | mp243 | mp244 | mp245 | mp246 | mp247 | mp248 | mp249 | mp25 | mp250 | mp251 | mp252 | mp253 | mp254 | mp255 | mp26 | mp27 | mp28 | mp29 | mp3 | mp30 | mp31 | mp32 | mp33 | mp34 | mp35 | mp36 | mp37 | mp38 | mp39 | mp4 | mp40 | mp41 | mp42 | mp43 | mp44 | mp45 | mp46 | mp47 | mp48 | mp49 | mp5 | mp50 | mp51 | mp52 | mp53 | mp54 | mp55 | mp56 | mp57 | mp58 | mp59 | mp6 | mp60 | mp61 | mp62 | mp63 | mp64 | mp65 | mp66 | mp67 | mp68 | mp69 | mp7 | mp70 | mp71 | mp72 | mp73 | mp74 | mp75 | mp76 | mp77 | mp78 | mp79 | mp8 | mp80 | mp81 | mp82 | mp83 | mp84 | mp85 | mp86 | mp87 | mp88 | mp89 | mp9 | mp90 | mp91 | mp92 | mp93 | mp94 | mp95 | mp96 | mp97 | mp98 | mp99 | rootfs | unused0 | unused1 | unused10 | unused100 | unused101 | unused102 | unused103 | unused104 | unused105 | unused106 | unused107 | unused108 | unused109 | unused11 | unused110 | unused111 | unused112 | unused113 | unused114 | unused115 | unused116 | unused117 | unused118 | unused119 | unused12 | unused120 | unused121 | unused122 | unused123 | unused124 | unused125 | unused126 | unused127 | unused128 | unused129 | unused13 | unused130 | unused131 | unused132 | unused133 | unused134 | unused135 | unused136 | unused137 | unused138 | unused139 | unused14 | unused140 | unused141 | unused142 | unused143 | unused144 | unused145 | unused146 | unused147 | unused148 | unused149 | unused15 | unused150 | unused151 | unused152 | unused153 | unused154 | unused155 | unused156 | unused157 | unused158 | unused159 | unused16 | unused160 | unused161 | unused162 | unused163 | unused164 | unused165 | unused166 | unused167 | unused168 | unused169 | unused17 | unused170 | unused171 | unused172 | unused173 | unused174 | unused175 | unused176 | unused177 | unused178 | unused179 | unused18 | unused180 | unused181 | unused182 | unused183 | unused184 | unused185 | unused186 | unused187 | unused188 | unused189 | unused19 | unused190 | unused191 | unused192 | unused193 | unused194 | unused195 | unused196 | unused197 | unused198 | unused199 | unused2 | unused20 | unused200 | unused201 | unused202 | unused203 | unused204 | unused205 | unused206 | unused207 | unused208 | unused209 | unused21 | unused210 | unused211 | unused212 | unused213 | unused214 | unused215 | unused216 | unused217 | unused218 | unused219 | unused22 | unused220 | unused221 | unused222 | unused223 | unused224 | unused225 | unused226 | unused227 | unused228 | unused229 | unused23 | unused230 | unused231 | unused232 | unused233 | unused234 | unused235 | unused236 | unused237 | unused238 | unused239 | unused24 | unused240 | unused241 | unused242 | unused243 | unused244 | unused245 | unused246 | unused247 | unused248 | unused249 | unused25 | unused250 | unused251 | unused252 | unused253 | unused254 | unused255 | unused26 | unused27 | unused28 | unused29 | unused3 | unused30 | unused31 | unused32 | unused33 | unused34 | unused35 | unused36 | unused37 | unused38 | unused39 | unused4 | unused40 | unused41 | unused42 | unused43 | unused44 | unused45 | unused46 | unused47 | unused48 | unused49 | unused5 | unused50 | unused51 | unused52 | unused53 | unused54 | unused55 | unused56 | unused57 | unused58 | unused59 | unused6 | unused60 | unused61 | unused62 | unused63 | unused64 | unused65 | unused66 | unused67 | unused68 | unused69 | unused7 | unused70 | unused71 | unused72 | unused73 | unused74 | unused75 | unused76 | unused77 | unused78 | unused79 | unused8 | unused80 | unused81 | unused82 | unused83 | unused84 | unused85 | unused86 | unused87 | unused88 | unused89 | unused9 | unused90 | unused91 | unused92 | unused93 | unused94 | unused95 | unused96 | unused97 | unused98 | unused99>

La chiave di configurazione a cui il volume verrà spostato. Il valore predefinito è la chiave del volume di origine.

--bwlimit <number> (0 - N) (predefinito = limite di clonazione dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--delete <boolean> (default = 0)

Elimina il volume originale dopo la copia riuscita. Per impostazione predefinita, l'originale viene mantenuto come voce di volume non utilizzato.

--digest <string>

Impedire le modifiche se il file di configurazione corrente ha un diverso " . "digest SHA1. Questo può essere utilizzato per impedire modifiche concorrenti.

--target-digest <string>

Impedisce le modifiche se il file di configurazione corrente del " . "container di destinazione presenta un digest SHA1 diverso. Questo può essere utilizzato per prevenire " . "modifiche concorrenti.

pct move_volume

Un alias per pct move-volume.

pct pending <vmid>

Ottiene la configurazione del container, incluse le modifiche in sospeso.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct pull <vmid> <path> <destination> [OPTIONS]

Copia un file dal container al sistema locale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<path>: <string>

Percorso di un file all'interno del container da copiare.

<destination>: <string>

Destinazione

--group <string>

Nome o id del gruppo proprietario.

--perms <string>

Permessi del file da utilizzare (in formato ottale per impostazione predefinita, usare il prefisso 0x per il formato esadecimale).

--user <string>

Nome o id dell'utente proprietario.

pct push <vmid> <file> <destination> [OPTIONS]

Copia un file locale nel container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<file>: <string>

Percorso di un file locale.

<destination>: <string>

Destinazione all'interno del container su cui scrivere.

--group <string>

Nome o id del gruppo proprietario. Se si utilizza un nome, questo deve esistere all'interno del container.

--perms <string>

Permessi del file da utilizzare (in formato ottale per impostazione predefinita, usare il prefisso 0x per il formato esadecimale).

--user <string>

Nome o id dell'utente proprietario. Se si utilizza un nome, questo deve esistere all'interno del container.

pct reboot <vmid> [OPTIONS]

Riavvia il container arrestandolo e riavviandolo. Applica le modifiche in sospeso.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--timeout <integer> (0 - N)

Attende al massimo il numero di secondi di timeout per l'arresto.

pct remote-migrate <vmid> [<target-vmid>] <target-endpoint> --target-bridge <string> --target-storage <string> [OPTIONS]

Migra il container verso un cluster remoto. Crea una nuova attività di migrazione. Funzionalità SPERIMENTALE!

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<target-vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<target-endpoint>: apitoken=<PVEAPIToken=user@realm!token=SECRET> ,host=<ADDRESS> [,fingerprint=<FINGERPRINT>] [,port=<PORT>]

Endpoint di destinazione remoto

--bwlimit <integer> (0 - N) (valore predefinito = limite di migrazione dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--delete <boolean> (default = 0)

Eliminare il CT originale e i relativi dati dopo una migrazione riuscita. Per impostazione predefinita il CT originale viene mantenuto sul cluster di origine in stato arrestato.

--online <boolean>

Utilizza la migrazione online/live.

--restart <boolean>

Utilizza la migrazione con riavvio

--target-bridge <string>

Mappatura dai bridge di origine ai bridge di destinazione. Fornendo un solo ID bridge, tutti i bridge di origine vengono mappati su quel bridge. Fornendo il valore speciale 1 ogni bridge di origine verrà mappato su se stesso.

--target-storage <string>

Mappatura dagli storage di origine agli storage di destinazione. Fornendo un solo ID di storage, tutti gli storage di origine vengono mappati su quello storage. Fornendo il valore speciale 1, ciascuno storage di origine viene mappato su se stesso.

--timeout <integer> (predefinito = 180)

Timeout in secondi per l'arresto nella migrazione con riavvio

pct rescan [OPTIONS]

Eseguire una nuova scansione di tutti gli storage e aggiornare le dimensioni dei dischi e le immagini disco non utilizzate.

--dryrun <boolean> (default = 0)

Non scrivere effettivamente le modifiche nella configurazione.

--vmid <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct resize <vmid> <disk> <size> [OPTIONS]

Ridimensiona un mount point del container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<disk>: <mp0 | mp1 | mp10 | mp100 | mp101 | mp102 | mp103 | mp104 | mp105 | mp106 | mp107 | mp108 | mp109 | mp11 | mp110 | mp111 | mp112 | mp113 | mp114 | mp115 | mp116 | mp117 | mp118 | mp119 | mp12 | mp120 | mp121 | mp122 | mp123 | mp124 | mp125 | mp126 | mp127 | mp128 | mp129 | mp13 | mp130 | mp131 | mp132 | mp133 | mp134 | mp135 | mp136 | mp137 | mp138 | mp139 | mp14 | mp140 | mp141 | mp142 | mp143 | mp144 | mp145 | mp146 | mp147 | mp148 | mp149 | mp15 | mp150 | mp151 | mp152 | mp153 | mp154 | mp155 | mp156 | mp157 | mp158 | mp159 | mp16 | mp160 | mp161 | mp162 | mp163 | mp164 | mp165 | mp166 | mp167 | mp168 | mp169 | mp17 | mp170 | mp171 | mp172 | mp173 | mp174 | mp175 | mp176 | mp177 | mp178 | mp179 | mp18 | mp180 | mp181 | mp182 | mp183 | mp184 | mp185 | mp186 | mp187 | mp188 | mp189 | mp19 | mp190 | mp191 | mp192 | mp193 | mp194 | mp195 | mp196 | mp197 | mp198 | mp199 | mp2 | mp20 | mp200 | mp201 | mp202 | mp203 | mp204 | mp205 | mp206 | mp207 | mp208 | mp209 | mp21 | mp210 | mp211 | mp212 | mp213 | mp214 | mp215 | mp216 | mp217 | mp218 | mp219 | mp22 | mp220 | mp221 | mp222 | mp223 | mp224 | mp225 | mp226 | mp227 | mp228 | mp229 | mp23 | mp230 | mp231 | mp232 | mp233 | mp234 | mp235 | mp236 | mp237 | mp238 | mp239 | mp24 | mp240 | mp241 | mp242 | mp243 | mp244 | mp245 | mp246 | mp247 | mp248 | mp249 | mp25 | mp250 | mp251 | mp252 | mp253 | mp254 | mp255 | mp26 | mp27 | mp28 | mp29 | mp3 | mp30 | mp31 | mp32 | mp33 | mp34 | mp35 | mp36 | mp37 | mp38 | mp39 | mp4 | mp40 | mp41 | mp42 | mp43 | mp44 | mp45 | mp46 | mp47 | mp48 | mp49 | mp5 | mp50 | mp51 | mp52 | mp53 | mp54 | mp55 | mp56 | mp57 | mp58 | mp59 | mp6 | mp60 | mp61 | mp62 | mp63 | mp64 | mp65 | mp66 | mp67 | mp68 | mp69 | mp7 | mp70 | mp71 | mp72 | mp73 | mp74 | mp75 | mp76 | mp77 | mp78 | mp79 | mp8 | mp80 | mp81 | mp82 | mp83 | mp84 | mp85 | mp86 | mp87 | mp88 | mp89 | mp9 | mp90 | mp91 | mp92 | mp93 | mp94 | mp95 | mp96 | mp97 | mp98 | mp99 | rootfs>

Il disco da ridimensionare.

<size>: \+?\d+(\.\d+)?[KMGT]?

La nuova dimensione. Con il segno + il valore viene aggiunto alla dimensione effettiva del volume, senza di esso il valore viene considerato come assoluto. Non è supportata la riduzione della dimensione del disco.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest SHA1 diverso. Può essere utilizzato per prevenire modifiche concorrenti.

pct restore <vmid> <ostemplate> [OPTIONS]

Crea o ripristina un container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<ostemplate>: <string>

Il template del sistema operativo o il file di backup.

--arch <amd64 | arm64 | armhf | i386 | riscv32 | riscv64> (predefinito = amd64)

Tipo di architettura del sistema operativo.

--bwlimit <number> (0 - N) (predefinito = limite di ripristino dalla configurazione del datacenter o dello storage)

Sovrascrive il limite di banda I/O (in KiB/s).

--cmode <console | shell | tty> (predefinito = tty)

Modalità console. Per impostazione predefinita, il comando console tenta di aprire una connessione a uno dei dispositivi tty disponibili. Impostando cmode su console, tenta invece di collegarsi a /dev/console. Se cmode viene impostato su shell, viene semplicemente avviata una shell all’interno del container (senza login).

--console <boolean> (predefinito = 1)

Collega un dispositivo console (/dev/console) al container.

--cores <integer> (1 - 8192)

Il numero di core assegnati al container. Per impostazione predefinita, un container può utilizzare tutti i core disponibili.

--cpulimit <number> (0 - 8192) (predefinito = 0)

Limite di utilizzo della CPU.

Note Se il computer dispone di 2 CPU, il tempo CPU totale è pari a 2. Il valore 0 indica l’assenza di limiti di CPU.
--cpuunits <integer> (0 - 500000) (predefinito = cgroup v1: 1024, cgroup v2: 100)

Peso della CPU per un container; in cgroup v2 verrà limitato all'intervallo [1, 10000].

--debug <boolean> (predefinito = 0)

Aumentare la verbosità. Attualmente abilita solo il livello di log di debug all'avvio.

--description <string>

Descrizione del container. Viene mostrata nel riepilogo del CT nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

--dev[n] [[path=]<Path>] [,deny-write=<1|0>] [,gid=<integer>] [,mode=<Octal access mode>] [,uid=<integer>]

Dispositivo da passare al container

--entrypoint (?^:[^\x00-\x08\x0a-\x1F\x7F]+) (predefinito = /sbin/init)

Comando da eseguire come init, opzionalmente con argomenti; può iniziare con un percorso assoluto, un percorso relativo o un binario in $PATH.

--env (?^:(?:\w+=[^\x00-\x08\x0a-\x1F\x7F]*)(?:\0\w+=[^\x00-\x08\x0a-\x1F\x7F]*)*)

L'ambiente di runtime del container come elenco separato da NUL. Sostituisce eventuali voci lxc.environment.runtime nella configurazione.

--features [force_rw_sys=<1|0>] [,fuse=<1|0>] [,keyctl=<1|0>] [,mknod=<1|0>] [,mount=<fstype;fstype;...>] [,nesting=<1|0>]

Consente ai container di accedere a funzionalità avanzate.

--force <boolean>

Consente di sovrascrivere un container esistente.

--ha-managed <boolean> (predefinito = 0)

Aggiunge il CT come risorsa HA dopo la creazione.

--hookscript <string>

Script che verrà eseguito durante varie fasi del ciclo di vita dei container.

--hostname <string>

Imposta un nome host per il container.

--ignore-unpack-errors <boolean>

Ignora gli errori durante l'estrazione del template.

--lock <backup | create | destroyed | disk | fstrim | migrate | mounted | rollback | snapshot | snapshot-delete>

Blocca/sblocca il container.

--memory <integer> (16 - N) (predefinito = 512)

Quantità di RAM per il container in MB.

--mp[n] [volume=]<volume> ,mp=<Path> [,acl=<1|0>] [,backup=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,keepattrs=<1|0>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come punto di mount del container. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume.

--nameserver <string>

Imposta l'indirizzo IP del server DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non viene impostato né searchdomain né nameserver.

--net[n] name=<string> [,bridge=<bridge>] [,firewall=<1|0>] [,gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,host-managed=<1|0>] [,hwaddr=<XX:XX:XX:XX:XX:XX>] [,ip=<(IPv4/CIDR|dhcp|manual)>] [,ip6=<(IPv6/CIDR|auto|dhcp|manual)>] [,link_down=<1|0>] [,mtu=<integer>] [,rate=<mbps>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,type=<veth>]

Specifica le interfacce di rete per il container.

--onboot <boolean> (default = 0)

Specifica se un container deve essere avviato durante il boot del sistema.

--ostype <alpine | archlinux | centos | debian | devuan | fedora | gentoo | nixos | opensuse | ubuntu | unmanaged>

Tipo di OS. Viene utilizzato per configurare il container e corrisponde agli script di configurazione lxc in /usr/share/lxc/config/<ostype>.common.conf. Il valore unmanaged può essere utilizzato per saltare la configurazione specifica del sistema operativo.

--password <password>

Imposta la password di root all'interno del container.

--pool <string>

Aggiungere la VM al pool specificato.

--protection <boolean> (predefinito = 0)

Imposta il flag di protezione del container. Questo impedisce le operazioni di rimozione/aggiornamento del CT o del disco del CT.

--rootfs [volume=]<volume> [,acl=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come root del container.

--searchdomain <string>

Imposta i domini di ricerca DNS per un container. Durante la creazione verrà utilizzata automaticamente l'impostazione dell'host se non vengono impostati né searchdomain né nameserver.

--ssh-public-keys <filepath>

Configurare le chiavi SSH pubbliche (una chiave per riga, formato OpenSSH).

--start <boolean> (predefinito = 0)

Avviare il CT dopo che la sua creazione è stata completata correttamente.

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

--storage <storage ID> (predefinito = local)

Storage predefinito.

--swap <integer> (0 - N) (predefinito = 512)

Quantità di SWAP per il container in MB.

--tags <string>

Tag del container. Si tratta solo di metadati.

--template <boolean> (predefinito = 0)

Abilitare/disabilitare il template.

--timezone <string>

Fuso orario da utilizzare nel container. Se l'opzione non è impostata, non verrà eseguita alcuna azione. Può essere impostato su host per corrispondere al fuso orario dell'host, oppure a un'opzione di fuso orario arbitraria da /usr/share/zoneinfo/zone.tab

--tty <integer> (0 - 6) (predefinito = 2)

Specificare il numero di tty disponibili per il container

--unique <boolean>

Assegnare un indirizzo ethernet casuale univoco.

Note Richiede l'opzione/le opzioni: restore
--unprivileged <boolean> (predefinito = 0)

Fa eseguire il container come utente non privilegiato. Per la creazione, il valore predefinito è 1. Per il ripristino, il valore predefinito è quello proveniente dal backup. (Non dovrebbe essere modificato manualmente.)

--unused[n] [volume=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

pct resume <vmid>

Riprende il container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct rollback <vmid> <snapname> [OPTIONS]

Esegue il rollback dello stato LXC allo snapshot specificato.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<snapname>: <string>

Il nome dello snapshot.

--start <boolean> (predefinito = 0)

Indica se il container deve essere avviato dopo il rollback eseguito correttamente

pct set <vmid> [OPTIONS]

Impostare le opzioni del container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--arch <amd64 | arm64 | armhf | i386 | riscv32 | riscv64> (predefinito = amd64)

Tipo di architettura del sistema operativo.

--cmode <console | shell | tty> (predefinito = tty)

Modalità console. Per impostazione predefinita, il comando console tenta di aprire una connessione a uno dei dispositivi tty disponibili. Impostando cmode su console, tenta invece di collegarsi a /dev/console. Se cmode viene impostato su shell, viene semplicemente avviata una shell all’interno del container (senza login).

--console <boolean> (predefinito = 1)

Collegare un dispositivo console (/dev/console) al container.

--cores <integer> (1 - 8192)

Il numero di core assegnati al container. Per impostazione predefinita, un container può utilizzare tutti i core disponibili.

--cpulimit <number> (0 - 8192) (predefinito = 0)

Limite di utilizzo della CPU.

Note Se il computer dispone di 2 CPU, ha un tempo CPU totale pari a 2. Il valore 0 indica l’assenza di limiti di CPU.
--cpuunits <integer> (0 - 500000) (predefinito = cgroup v1: 1024, cgroup v2: 100)

Peso della CPU per un container; in cgroup v2 verrà limitato all'intervallo [1, 10000].

--debug <boolean> (predefinito = 0)

Aumentare la verbosità. Attualmente abilita solo il livello di log di debug all'avvio.

--delete <string>

Un elenco delle impostazioni da eliminare.

--description <string>

Descrizione del container. Viene mostrata nel riepilogo del CT nell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

--dev[n] [[path=]<Path>] [,deny-write=<1|0>] [,gid=<integer>] [,mode=<Octal access mode>] [,uid=<integer>]

Dispositivo da passare al container

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest SHA1 diverso. Può essere utilizzato per prevenire modifiche concorrenti.

--entrypoint (?^:[^\x00-\x08\x0a-\x1F\x7F]+) (predefinito = /sbin/init)

Comando da eseguire come init, opzionalmente con argomenti; può iniziare con un percorso assoluto, un percorso relativo o un binario in $PATH.

--env (?^:(?:\w+=[^\x00-\x08\x0a-\x1F\x7F]*)(?:\0\w+=[^\x00-\x08\x0a-\x1F\x7F]*)*)

L'ambiente di runtime del container come elenco separato da NUL. Sostituisce eventuali voci lxc.environment.runtime nella configurazione.

--features [force_rw_sys=<1|0>] [,fuse=<1|0>] [,keyctl=<1|0>] [,mknod=<1|0>] [,mount=<fstype;fstype;...>] [,nesting=<1|0>]

Consente ai container di accedere a funzionalità avanzate.

--hookscript <string>

Script che verrà eseguito durante varie fasi del ciclo di vita dei container.

--hostname <string>

Impostare un nome host per il container.

--lock <backup | create | destroyed | disk | fstrim | migrate | mounted | rollback | snapshot | snapshot-delete>

Bloccare/sbloccare il container.

--memory <integer> (16 - N) (predefinito = 512)

Quantità di RAM per il container in MB.

--mp[n] [volume=]<volume> ,mp=<Path> [,acl=<1|0>] [,backup=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,keepattrs=<1|0>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come punto di mount del container. Utilizzare la sintassi speciale STORAGE_ID:SIZE_IN_GiB per allocare un nuovo volume.

--nameserver <string>

Imposta l'indirizzo IP del server DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non viene impostato né searchdomain né nameserver.

--net[n] name=<string> [,bridge=<bridge>] [,firewall=<1|0>] [,gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,host-managed=<1|0>] [,hwaddr=<XX:XX:XX:XX:XX:XX>] [,ip=<(IPv4/CIDR|dhcp|manual)>] [,ip6=<(IPv6/CIDR|auto|dhcp|manual)>] [,link_down=<1|0>] [,mtu=<integer>] [,rate=<mbps>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,type=<veth>]

Specifica le interfacce di rete per il container.

--onboot <boolean> (default = 0)

Specifica se un container deve essere avviato durante il boot del sistema.

--ostype <alpine | archlinux | centos | debian | devuan | fedora | gentoo | nixos | opensuse | ubuntu | unmanaged>

Tipo di OS. Viene utilizzato per configurare il container e corrisponde agli script di configurazione lxc in /usr/share/lxc/config/<ostype>.common.conf. Il valore unmanaged può essere utilizzato per saltare la configurazione specifica del sistema operativo.

--protection <boolean> (predefinito = 0)

Imposta il flag di protezione del container. Questo impedisce le operazioni di rimozione/aggiornamento del CT o del disco del CT.

--revert <string>

Annullare una modifica in sospeso.

--rootfs [volume=]<volume> [,acl=<1|0>] [,idmap=<type:container:disk:range-size[;type:container:disk:range-size;...]>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>]

Utilizzare il volume come root del container.

--searchdomain <string>

Imposta i domini di ricerca DNS per un container. Create utilizzerà automaticamente l'impostazione dell'host se non viene impostato né searchdomain né nameserver.

--startup `[[order=]\d+] [,up=\d+] [,down=\d+] `

Comportamento di avvio e arresto. L'ordine è un numero non negativo che definisce l'ordine generale di avvio. L'arresto viene eseguito con ordine inverso. È inoltre possibile impostare il ritardo up o down in secondi, che specifica un ritardo di attesa prima che la VM successiva venga avviata o arrestata.

--swap <integer> (0 - N) (predefinito = 512)

Quantità di SWAP per il container in MB.

--tags <string>

Tag del container. Si tratta solo di metadati.

--template <boolean> (predefinito = 0)

Abilitare/disabilitare il template.

--timezone <string>

Fuso orario da utilizzare nel container. Se l'opzione non è impostata, non verrà eseguita alcuna azione. Può essere impostato su host per corrispondere al fuso orario dell'host, oppure a un'opzione di fuso orario arbitraria da /usr/share/zoneinfo/zone.tab

--tty <integer> (0 - 6) (predefinito = 2)

Specificare il numero di tty disponibili per il container

--unprivileged <boolean> (predefinito = 0)

Fa eseguire il container come utente non privilegiato. Per la creazione, il valore predefinito è 1. Per il ripristino, il valore predefinito è quello proveniente dal backup. (Non dovrebbe essere modificato manualmente.)

--unused[n] [volume=]<volume>

Riferimento a volumi non utilizzati. Viene utilizzato internamente e non dovrebbe essere modificato manualmente.

pct shutdown <vmid> [OPTIONS]

Arresta il container. Questo comando attiverà un arresto pulito del container; per i dettagli si veda lxc-stop(1).

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--forceStop <boolean> (default = 0)

Assicurarsi che il container si arresti.

--timeout <integer> (0 - N) (predefinito = 60)

Attendere per un massimo di timeout secondi.

pct snapshot <vmid> <snapname> [OPTIONS]

Crea uno snapshot di un container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<snapname>: <string>

Il nome dello snapshot.

--description <string>

Una descrizione testuale o un commento.

pct start <vmid> [OPTIONS]

Avvia il container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--debug <boolean> (predefinito = 0)

Se impostato, abilita un livello di log di debug molto dettagliato all'avvio.

--skiplock <boolean>

Ignora i lock - solo root può utilizzare questa opzione.

pct status <vmid> [OPTIONS]

Mostra lo stato del CT.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--verbose <boolean>

Formato di output dettagliato

pct stop <vmid> [OPTIONS]

Interrompe il container. Questo interromperà bruscamente tutti i processi in esecuzione nel container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

--overrule-shutdown <boolean> (default = 0)

Tentare di interrompere i task vzshutdown attivi prima di arrestarsi.

--skiplock <boolean>

Ignora i lock - solo root può utilizzare questa opzione.

pct suspend <vmid>

Sospende il container. Questa funzionalità è sperimentale.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct template <vmid>

Crea un template.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct unlock <vmid>

Sblocca la VM.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

pct unmount <vmid>

Smonta il filesystem del container.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

22.12. pveam - Proxmox VE Appliance Manager

pveam <COMMAND> [ARGS] [OPTIONS]

pveam available [OPTIONS]

Elenca i template disponibili.

--section <mail | system | turnkeylinux>

Limita l'elenco alla sezione specificata.

pveam download <storage> <template>

Scarica i template delle appliance.

<storage>: <storage ID>

Lo storage in cui verrà salvato il template

<template>: <string>

Il template da scaricare

pveam help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pveam list <storage>

Ottiene l'elenco di tutti i template presenti sullo storage

<storage>: <storage ID>

Elenca i template solo sullo storage specificato

pveam remove <template_path>

Rimuove un template.

<template_path>: <string>

Il template da rimuovere.

pveam update

Aggiorna il database dei template dei container.

22.13. pvecm - Proxmox VE Cluster Manager

pvecm <COMMAND> [ARGS] [OPTIONS]

pvecm add <hostname> [OPTIONS]

Aggiunge il nodo corrente a un cluster esistente.

<hostname>: <string>

Hostname (o IP) di un membro esistente del cluster.

--fingerprint ([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}

Fingerprint SHA 256 del certificato.

--force <boolean>

Non genera un errore se il nodo esiste già.

--link[n] [address=]<IP> [,priority=<integer>]

Informazioni di indirizzo e priorità per un singolo link corosync (sono supportati fino a 8 link; link0..link7)

--nodeid <integer> (1 - N)

ID del nodo per questo nodo.

--use_ssh <boolean>

Utilizza sempre SSH per l'adesione, anche se il peer può farlo tramite API.

--votes <integer> (0 - N)

Numero di voti per questo nodo

pvecm addnode <node> [OPTIONS]

Aggiunge un nodo alla configurazione del cluster. Questa chiamata è per uso interno.

<node>: <string>

Il nome del nodo del cluster.

--apiversion <integer>

La JOIN_API_VERSION del nuovo nodo.

--force <boolean>

Non genera un errore se il nodo esiste già.

--link[n] [address=]<IP> [,priority=<integer>]

Informazioni di indirizzo e priorità per un singolo link corosync (sono supportati fino a 8 link; link0..link7)

--new_node_ip <string>

Indirizzo IP del nodo da aggiungere. Utilizzato come fallback se non viene fornito alcun link.

--nodeid <integer> (1 - N)

ID del nodo per questo nodo.

--votes <integer> (0 - N)

Numero di voti per questo nodo

pvecm apiver

Restituisce la versione dell'API di adesione al cluster disponibile su questo nodo.

pvecm create <clustername> [OPTIONS]

Genera una nuova configurazione del cluster. Se non viene fornito alcun link, viene utilizzato per impostazione predefinita l'indirizzo IP locale come link0.

<clustername>: <string>

Il nome del cluster.

--link[n] [address=]<IP> [,priority=<integer>]

Informazioni di indirizzo e priorità per un singolo link corosync (sono supportati fino a 8 link; link0..link7)

--nodeid <integer> (1 - N)

ID del nodo per questo nodo.

--token-coefficient <integer> (0 - N) (default = 125)

Coefficiente utilizzato per determinare il timeout del token di Corosync. Per maggiori dettagli, consultare il manuale corosync.conf(5).

--votes <integer> (1 - N)

Numero di voti per questo nodo.

pvecm delnode <node>

Rimuove un nodo dalla configurazione del cluster.

<node>: <string>

Il nome del nodo del cluster.

pvecm expected <expected>

Comunica a corosync un nuovo valore di voti previsti.

<expected>: <integer> (1 - N)

Voti previsti

pvecm help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvecm keygen <filename>

Genera una nuova chiave crittografica per corosync.

<filename>: <string>

Nome del file di output

pvecm mtunnel [<extra-args>] [OPTIONS]

Utilizzato dalla migrazione di VM/CT - non utilizzare manualmente.

<extra-args>: <array>

Argomenti aggiuntivi come array

--get_migration_ip <boolean> (predefinito = 0)

restituisce l'IP di migrazione, se configurato

--migration_network <string>

la rete di migrazione utilizzata per rilevare l'IP di migrazione locale

--run-command <boolean>

Eseguire un comando con un socket tcp come standard input. L'indirizzo IP e la porta vengono prima stampati tramite lo standard output di questo comando, ciascuno su una riga separata.

pvecm nodes

Visualizza la vista locale dei nodi del cluster.

pvecm qdevice remove

Rimuove un QDevice configurato

pvecm qdevice setup <address> [OPTIONS]

Configurare l'utilizzo di un QDevice

<address>: <string>

Specifica l'indirizzo di rete di un QDevice corosync esterno

--force <boolean>

Non genera errori su possibili operazioni pericolose.

--network <string>

La rete che deve essere utilizzata per connettersi al qdevice esterno

pvecm status

Visualizza la vista locale dello stato del cluster.

pvecm updatecerts [OPTIONS]

Aggiornare i certificati del nodo (e generare tutti i file/directory necessari).

--force <boolean>

Forzare la generazione di un nuovo certificato SSL.

--silent <boolean>

Ignorare gli errori (ossia quando il cluster non ha quorum).

--unmerge-known-hosts <boolean> (predefinito = 0)

Annullare l'unione degli host SSH noti legacy.

22.14. pvesr - Replica dello storage di Proxmox VE

pvesr <COMMAND> [ARGS] [OPTIONS]

pvesr create-local-job <id> <target> [OPTIONS]

Creare un nuovo job di replica

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ovvero <GUEST>-<JOBNUM>.

<target>: <string>

Nodo di destinazione.

--comment <string>

Descrizione.

--disable <boolean>

Flag per disabilitare/deattivare la voce.

--rate <number> (1 - N)

Limite di velocità in mbps (megabyte al secondo) come numero in virgola mobile.

--remove_job <full | local>

Contrassegnare il job di replica per la rimozione. Il job rimuoverà tutti gli snapshot di replica locali. Se impostato su full, tenta anche di rimuovere i volumi replicati sulla destinazione. Il job si rimuove quindi dal file di configurazione.

--schedule <string> (default = */15)

Pianificazione della replica dello storage. Il formato è un sottoinsieme degli eventi di calendario di systemd.

--source <string>

Per uso interno, per rilevare se il guest è stato sottratto.

pvesr delete <id> [OPTIONS]

Contrassegnare il job di replica per la rimozione.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ossia <GUEST>-<JOBNUM>.

--force <boolean> (default = 0)

Rimuoverà la voce di configurazione del job, ma non effettuerà la pulizia.

--keep <boolean> (default = 0)

Mantiene i dati replicati sulla destinazione (non li rimuove).

pvesr disable <id>

Disabilita un job di replica.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ovvero <GUEST>-<JOBNUM>.

pvesr enable <id>

Abilita un job di replica.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ossia <GUEST>-<JOBNUM>.

pvesr finalize-local-job <id> [<extra-args>] [OPTIONS]

Finalizza un job di replica. Questo rimuove tutti gli snapshot di replica con timestamp diversi da <last_sync>.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ovvero <GUEST>-<JOBNUM>.

<extra-args>: <array>

L'elenco degli ID dei volumi da considerare.

--last_sync <integer> (0 - N)

Orario (epoch UNIX) dell'ultima sincronizzazione riuscita. Se non specificato, tutti gli snapshot di replica vengono rimossi.

pvesr help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvesr list

Elenca i job di replica.

pvesr prepare-local-job <id> [<extra-args>] [OPTIONS]

Preparare l'avvio di un job di replica. La chiamata viene eseguita sul nodo di destinazione prima dell'avvio della replica. Questa chiamata è per uso interno e restituisce un oggetto JSON su stdout. Il metodo verifica prima se la VM <vmid> risiede sul nodo locale. In tal caso, si interrompe immediatamente. Successivamente il metodo analizza tutti gli ID dei volumi in cerca di snapshot e rimuove tutti gli snapshot di replica con timestamp diversi da <last_sync>. Rimuove inoltre tutti i volumi non utilizzati. Restituisce un hash con indicatori booleani per tutti i volumi con snapshot di replica esistenti.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ovvero <GUEST>-<JOBNUM>.

<extra-args>: <array>

L'elenco degli ID dei volumi da considerare.

--force <boolean> (default = 0)

Consente di rimuovere tutti i volumi esistenti (elenco di volumi vuoto).

--last_sync <integer> (0 - N)

Orario (epoch UNIX) dell'ultima sincronizzazione riuscita. Se non specificato, tutti gli snapshot di replica vengono rimossi.

--parent_snapname <string>

Il nome dello snapshot.

--scan <string>

Elenco di ID storage da analizzare per individuare volumi obsoleti.

pvesr read <id>

Legge la configurazione del job di replica.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, cioè <GUEST>-<JOBNUM>.

pvesr run [OPTIONS]

Questo metodo viene richiamato dal systemd-timer ed esegue tutti i job di sincronizzazione (o uno specifico).

--id [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ossia <GUEST>-<JOBNUM>.

--mail <boolean> (default = 0)

Invia una notifica email in caso di errore.

--verbose <boolean> (default = 0)

Stampa log più dettagliati su stdout.

pvesr schedule-now <id>

Pianifica l'avvio del job di replica il prima possibile.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ossia <GUEST>-<JOBNUM>.

pvesr set-state <vmid> <state>

Imposta lo stato di replica del job in fase di migrazione. Questa chiamata è destinata all'uso interno. Accetterà lo stato del job come oggetto JSON.

<vmid>: <integer> (100 - 999999999)

L'ID (univoco) della VM.

<state>: <string>

Stato del job come stringa decodificata da JSON.

pvesr status [OPTIONS]

Elenca lo stato di tutti i job di replica su questo nodo.

--guest <integer> (100 - 999999999)

Elenca solo i job di replica per questo guest.

pvesr update <id> [OPTIONS]

Aggiorna la configurazione del job di replica.

<id>: [1-9][0-9]{2,8}-\d{1,9}

ID del job di replica. L'ID è composto da un ID guest e un numero di job, separati da un trattino, ossia <GUEST>-<JOBNUM>.

--comment <string>

Descrizione.

--delete <string>

Un elenco delle impostazioni da eliminare.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest diverso. È possibile utilizzare questa opzione per evitare modifiche concorrenti.

--disable <boolean>

Flag per disabilitare/disattivare la voce.

--rate <number> (1 - N)

Limite di velocità in mbps (megabyte al secondo) come numero in virgola mobile.

--remove_job <full | local>

Contrassegnare il job di replica per la rimozione. Il job rimuoverà tutti gli snapshot di replica locali. Se impostato su full, tenta anche di rimuovere i volumi replicati sulla destinazione. Il job si rimuove quindi dal file di configurazione.

--schedule <string> (default = */15)

Pianificazione della replica dello storage. Il formato è un sottoinsieme degli eventi di calendario di systemd.

--source <string>

Per uso interno, per rilevare se il guest è stato sottratto.

22.15. pveum - Gestore degli utenti di Proxmox VE

pveum <COMMAND> [ARGS] [OPTIONS]

pveum acl delete <path> --roles <string> [OPTIONS]

Aggiornare l'elenco di controllo degli accessi (aggiungere o rimuovere permessi).

<path>: <string>

Percorso di controllo degli accessi

--groups <string>

Elenco di gruppi.

--propagate <boolean> (default = 1)

Consente di propagare (ereditare) i permessi.

--roles <string>

Elenco di ruoli.

--tokens <string>

Elenco di token API.

--users <string>

Elenco di utenti.

pveum acl list [FORMAT_OPTIONS]

Ottenere le liste di controllo degli accessi (ACL).

pveum acl modify <path> --roles <string> [OPTIONS]

Aggiornare l'elenco di controllo degli accessi (aggiungere o rimuovere permessi).

<path>: <string>

Percorso di controllo degli accessi

--groups <string>

Elenco di gruppi.

--propagate <boolean> (default = 1)

Consente di propagare (ereditare) i permessi.

--roles <string>

Elenco di ruoli.

--tokens <string>

Elenco di token API.

--users <string>

Elenco di utenti.

pveum acldel

Un alias per pveum acl delete.

pveum aclmod

Un alias per pveum acl modify.

pveum group add <groupid> [OPTIONS]

Creare un nuovo gruppo.

<groupid>: <string>

nessuna descrizione disponibile

--comment <string>

nessuna descrizione disponibile

pveum group delete <groupid>

Eliminare il gruppo.

<groupid>: <string>

nessuna descrizione disponibile

pveum group list [FORMAT_OPTIONS]

Indice dei gruppi.

pveum group modify <groupid> [OPTIONS]

Aggiornare i dati del gruppo.

<groupid>: <string>

nessuna descrizione disponibile

--comment <string>

nessuna descrizione disponibile

pveum groupadd

Un alias per pveum group add.

pveum groupdel

Un alias per pveum group delete.

pveum groupmod

Un alias per pveum group modify.

pveum help [OPTIONS]

Visualizzare la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pveum passwd <userid> [OPTIONS]

Modificare la password dell'utente.

<userid>: <string>

ID utente completo, nel formato name@realm.

--confirmation-password <string>

La password attuale dell'utente che esegue la modifica.

pveum pool add <poolid> [OPTIONS]

Creare un nuovo pool.

<poolid>: <string>

nessuna descrizione disponibile

--comment <string>

nessuna descrizione disponibile

pveum pool delete <poolid>

Eliminare il pool.

<poolid>: <string>

nessuna descrizione disponibile

pveum pool list [OPTIONS] [FORMAT_OPTIONS]

Elenca i pool oppure ottiene la configurazione di un pool.

--poolid <string>

nessuna descrizione disponibile

--type <lxc | qemu | storage>

nessuna descrizione disponibile

Note Richiede una o più opzioni: poolid

pveum pool modify <poolid> [OPTIONS]

Aggiornare il pool.

<poolid>: <string>

nessuna descrizione disponibile

--allow-move <boolean> (default = 0)

Consente di aggiungere un guest anche se già presente in un altro pool. Il guest verrà rimosso dal pool attuale e aggiunto a questo.

--comment <string>

nessuna descrizione disponibile

--delete <boolean> (default = 0)

Rimuove gli ID VM e/o gli ID storage indicati, invece di aggiungerli.

--storage <string>

Elenco di ID storage da aggiungere o rimuovere da questo pool.

--vms <string>

Elenco di ID VM guest da aggiungere o rimuovere da questo pool.

pveum realm add <realm> --type <string> [OPTIONS]

Aggiunge un server di autenticazione.

<realm>: <string>

ID del dominio di autenticazione

--acr-values ^[^\x00-\x1F\x7F <>#"]*$

Specifica i valori di Authentication Context Class Reference che si richiede all'Authorization Server di utilizzare per la richiesta di autenticazione.

--audiences ^[^\x00-\x1F\x7F <>#"]*$

Un elenco di audience che l'OpenID Issuer può includere, accettate in aggiunta a client-id.

--autocreate <boolean> (default = 0)

Creare automaticamente gli utenti se non esistono.

--base_dn <string>

Nome di dominio LDAP di base

--bind_dn <string>

Nome di dominio di bind LDAP

--capath <string> (default = /etc/ssl/certs)

Percorso dello store dei certificati CA

--case-sensitive <boolean> (default = 1)

Il nome utente distingue tra maiuscole e minuscole

--cert <string>

Percorso del certificato client

--certkey <string>

Percorso della chiave del certificato client

--check-connection <boolean> (default = 0)

Verificare la connessione di bind al server.

--client-id <string>

ID client OpenID

--client-key <string>

Chiave client OpenID

--comment <string>

Descrizione.

--default <boolean>

Utilizzare questo come realm predefinito

--domain \S+

Nome di dominio AD

--filter <string>

Filtro LDAP per la sincronizzazione utenti.

--group_classes <string> (predefinito = groupOfNames, group, univentionGroup, ipausergroup)

Le objectclass per i gruppi.

--group_dn <string>

Nome di dominio di base LDAP per la sincronizzazione dei gruppi. Se non impostato, verrà utilizzato il base_dn.

--group_filter <string>

Filtro LDAP per la sincronizzazione dei gruppi.

--group_name_attr <string>

Attributo LDAP che rappresenta il nome di un gruppo. Se non impostato o non trovato, verrà utilizzato come nome il primo valore del DN.

--groups-autocreate <boolean> (predefinito = 0)

Creare automaticamente i gruppi se non esistono.

--groups-claim (?^:[A-Za-z0-9\.\-_]+)

Claim OpenID utilizzato per recuperare i gruppi.

--groups-overwrite <boolean> (predefinito = 0)

Tutti i gruppi verranno sovrascritti per l'utente al momento dell'accesso.

--issuer-url <string>

URL dell'issuer OpenID

--mode <ldap | ldap+starttls | ldaps> (predefinito = ldap)

Modalità del protocollo LDAP.

--password <string>

Password di bind LDAP. Verrà memorizzata in /etc/pve/priv/realm/<REALM>.pw.

--port <integer> (1 - 65535)

Porta del server.

--prompt (?:none|login|consent|select_account|\S+)

Specifica se il server di autorizzazione richiede all'utente finale di eseguire nuovamente l'autenticazione e di fornire il consenso.

--query-userinfo <boolean> (predefinito = 1)

Abilita l'interrogazione dell'endpoint userinfo per i valori dei claim.

--scopes <string> (predefinito = email profile)

Specifica gli scope (dettagli utente) che devono essere autorizzati e restituiti, ad esempio email o profile.

--secure <boolean>

Usare il protocollo sicuro LDAPS. DEPRECATO: usare invece mode.

--server1 <string>

Indirizzo IP del server (o nome DNS)

--server2 <string>

Indirizzo IP del server di fallback (o nome DNS)

--sslversion <tlsv1 | tlsv1_1 | tlsv1_2 | tlsv1_3>

Versione TLS/SSL per LDAPS. Non è consigliabile utilizzare una versione precedente alla 1.2!

--sync-defaults-options [enable-new=<1|0>] [,full=<1|0>] [,purge=<1|0>] [,remove-vanished=([acl];[properties];[entry])|none] [,scope=<users|groups|both>]

Le opzioni predefinite per il comportamento delle sincronizzazioni.

--sync_attributes \w+=[^,]+(,\s*\w+=[^,]+)*

Elenco separato da virgole di coppie chiave=valore per specificare quali attributi LDAP corrispondono a quale campo utente PVE. Ad esempio, per associare l'attributo LDAP mail al campo PVE email, scrivere email=mail. Per impostazione predefinita, ciascun campo utente PVE è rappresentato da un attributo LDAP con lo stesso nome.

--tfa type=<TFATYPE> [,digits=<COUNT>] [,id=<ID>] [,key=<KEY>] [,step=<SECONDS>] [,url=<URL>]

Utilizzare l'autenticazione a due fattori.

--type <ad | ldap | openid | pam | pve>

Tipo di realm.

--user_attr \S{2,}

Nome dell'attributo utente LDAP.

--user_classes <string> (default = inetorgperson, posixaccount, person, user)

Le objectclass per gli utenti.

--username-claim <string>

Claim OpenID utilizzato per generare il nome utente univoco.

--verify <boolean> (default = 0)

Verificare il certificato SSL del server

pveum realm delete <realm>

Eliminare un server di autenticazione.

<realm>: <string>

ID del dominio di autenticazione

pveum realm list [FORMAT_OPTIONS]

Indice dei domini di autenticazione.

pveum realm modify <realm> [OPTIONS]

Aggiornare le impostazioni del server di autenticazione.

<realm>: <string>

ID del dominio di autenticazione

--acr-values ^[^\x00-\x1F\x7F <>#"]*$

Specifica i valori di Authentication Context Class Reference che si richiede all'Authorization Server di utilizzare per la richiesta di autenticazione.

--audiences ^[^\x00-\x1F\x7F <>#"]*$

Un elenco di audience che l'OpenID Issuer può includere, accettate in aggiunta a client-id.

--autocreate <boolean> (default = 0)

Creare automaticamente gli utenti se non esistono.

--base_dn <string>

Nome di dominio LDAP di base

--bind_dn <string>

Nome di dominio di bind LDAP

--capath <string> (default = /etc/ssl/certs)

Percorso dello store dei certificati CA

--case-sensitive <boolean> (default = 1)

Il nome utente distingue tra maiuscole e minuscole

--cert <string>

Percorso del certificato client

--certkey <string>

Percorso della chiave del certificato client

--check-connection <boolean> (default = 0)

Verificare la connessione di bind al server.

--client-id <string>

ID client OpenID

--client-key <string>

Chiave client OpenID

--comment <string>

Descrizione.

--default <boolean>

Utilizzare questo come realm predefinito

--delete <string>

Un elenco delle impostazioni da eliminare.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest diverso. È possibile utilizzare questa opzione per evitare modifiche concorrenti.

--domain \S+

Nome di dominio AD

--filter <string>

Filtro LDAP per la sincronizzazione utenti.

--group_classes <string> (predefinito = groupOfNames, group, univentionGroup, ipausergroup)

Le objectclass per i gruppi.

--group_dn <string>

Nome di dominio di base LDAP per la sincronizzazione dei gruppi. Se non impostato, verrà utilizzato il base_dn.

--group_filter <string>

Filtro LDAP per la sincronizzazione dei gruppi.

--group_name_attr <string>

Attributo LDAP che rappresenta il nome di un gruppo. Se non impostato o non trovato, verrà utilizzato come nome il primo valore del DN.

--groups-autocreate <boolean> (predefinito = 0)

Crea automaticamente i gruppi se non esistono.

--groups-claim (?^:[A-Za-z0-9\.\-_]+)

Claim OpenID utilizzato per recuperare i gruppi.

--groups-overwrite <boolean> (predefinito = 0)

Tutti i gruppi verranno sovrascritti per l'utente al momento dell'accesso.

--issuer-url <string>

URL dell'issuer OpenID

--mode <ldap | ldap+starttls | ldaps> (predefinito = ldap)

Modalità del protocollo LDAP.

--password <string>

Password di bind LDAP. Verrà memorizzata in /etc/pve/priv/realm/<REALM>.pw.

--port <integer> (1 - 65535)

Porta del server.

--prompt (?:none|login|consent|select_account|\S+)

Specifica se il server di autorizzazione richiede all'utente finale di eseguire nuovamente l'autenticazione e di fornire il consenso.

--query-userinfo <boolean> (predefinito = 1)

Abilita l'interrogazione dell'endpoint userinfo per i valori dei claim.

--scopes <string> (predefinito = email profile)

Specifica gli scope (dettagli utente) che devono essere autorizzati e restituiti, ad esempio email o profile.

--secure <boolean>

Usa il protocollo LDAPS sicuro. DEPRECATO: usare mode.

--server1 <string>

Indirizzo IP del server (o nome DNS)

--server2 <string>

Indirizzo IP del server di fallback (o nome DNS)

--sslversion <tlsv1 | tlsv1_1 | tlsv1_2 | tlsv1_3>

Versione TLS/SSL per LDAPS. Non è consigliabile utilizzare una versione precedente alla 1.2!

--sync-defaults-options [enable-new=<1|0>] [,full=<1|0>] [,purge=<1|0>] [,remove-vanished=([acl];[properties];[entry])|none] [,scope=<users|groups|both>]

Le opzioni predefinite per il comportamento delle sincronizzazioni.

--sync_attributes \w+=[^,]+(,\s*\w+=[^,]+)*

Elenco separato da virgole di coppie chiave=valore per specificare quali attributi LDAP corrispondono a quale campo utente PVE. Ad esempio, per associare l'attributo LDAP mail al campo PVE email, scrivere email=mail. Per impostazione predefinita, ciascun campo utente PVE è rappresentato da un attributo LDAP con lo stesso nome.

--tfa type=<TFATYPE> [,digits=<COUNT>] [,id=<ID>] [,key=<KEY>] [,step=<SECONDS>] [,url=<URL>]

Utilizzare l'autenticazione a due fattori.

--user_attr \S{2,}

Nome dell'attributo utente LDAP.

--user_classes <string> (default = inetorgperson, posixaccount, person, user)

Le objectclass per gli utenti.

--verify <boolean> (default = 0)

Verificare il certificato SSL del server

pveum realm sync <realm> [OPTIONS]

Sincronizza utenti e/o gruppi dall'LDAP configurato a user.cfg. NOTA: i gruppi sincronizzati avranno il nome name-$realm, quindi assicurarsi che tali gruppi non esistano già per evitare sovrascritture.

<realm>: <string>

ID del dominio di autenticazione

--dry-run <boolean> (default = 0)

Se impostato, non scrive nulla.

--enable-new <boolean> (default = 1)

Abilitare immediatamente gli utenti appena sincronizzati.

--full <boolean>

DEPRECATO: utilizzare remove-vanished al suo posto. Se impostato, utilizza la directory LDAP come fonte di verità, eliminando utenti o gruppi non restituiti dalla sincronizzazione e rimuovendo tutte le proprietà modificate localmente degli utenti sincronizzati. Se non impostato, sincronizza solo le informazioni presenti nei dati sincronizzati e non elimina né modifica nulla altro.

--purge <boolean>

DEPRECATO: utilizzare remove-vanished al suo posto. Rimuove le ACL per utenti o gruppi rimossi dalla configurazione durante una sincronizzazione.

--remove-vanished ([acl];[properties];[entry])|none (default = none)

Un elenco separato da punto e virgola di elementi da rimuovere quando questi o l'utente scompaiono durante una sincronizzazione. Sono possibili i seguenti valori: entry rimuove l'utente/gruppo quando non viene restituito dalla sincronizzazione. properties rimuove le proprietà impostate su utenti/gruppi esistenti che non compaiono nella fonte (anche quelle personalizzate). acl rimuove le acl quando l'utente/gruppo non viene restituito dalla sincronizzazione. In alternativa a un elenco può anche essere none (il valore predefinito).

--scope <both | groups | users>

Selezionare cosa sincronizzare.

pveum role add <roleid> [OPTIONS]

Creare un nuovo ruolo.

<roleid>: <string>

nessuna descrizione disponibile

--privs <string>

nessuna descrizione disponibile

pveum role delete <roleid>

Eliminare il ruolo.

<roleid>: <string>

nessuna descrizione disponibile

pveum role list [FORMAT_OPTIONS]

Indice dei ruoli.

pveum role modify <roleid> [OPTIONS]

Aggiornare un ruolo esistente.

<roleid>: <string>

nessuna descrizione disponibile

--append <boolean>

nessuna descrizione disponibile

Note Richiede l'opzione/le opzioni: privs
--privs <string>

nessuna descrizione disponibile

pveum roleadd

Un alias per pveum role add.

pveum roledel

Un alias per pveum role delete.

pveum rolemod

Un alias per pveum role modify.

pveum ticket <username> [OPTIONS]

Creare o verificare il ticket di autenticazione.

<username>: <string>

Nome utente

--new-format <boolean> (default = 1)

Questo parametro è ora ignorato e considerato pari a 1.

--otp <string>

Password monouso per l'autenticazione a due fattori.

--path <string>

Verificare il ticket e controllare se l'utente dispone dei privs di accesso sul path

Note Richiede l'opzione/le opzioni: privs
--privs <string>

Verificare il ticket e controllare se l'utente dispone dei privs di accesso sul path

Note Richiede una o più opzioni: path
--realm <string>

È possibile passare facoltativamente il realm utilizzando questo parametro. Normalmente il realm viene semplicemente aggiunto al nome utente <username>@<realm>.

--tfa-challenge <string>

La stringa di challenge TFA firmata a cui l'utente intende rispondere.

pveum user add <userid> [OPTIONS]

Creare un nuovo utente.

<userid>: <string>

ID utente completo, nel formato name@realm.

--comment <string>

nessuna descrizione disponibile

--email <string>

nessuna descrizione disponibile

--enable <boolean> (default = 1)

Abilitare l'account (impostazione predefinita). È possibile impostare questo valore a 0 per disabilitare l'account

--expire <integer> (0 - N)

Data di scadenza dell'account (secondi dall'epoch). 0 significa nessuna data di scadenza.

--firstname <string>

nessuna descrizione disponibile

--groups <string>

nessuna descrizione disponibile

--keys [0-9a-zA-Z!=]{0,4096}

Chiavi per l'autenticazione a due fattori (yubico).

--lastname <string>

nessuna descrizione disponibile

--password <string>

Password iniziale.

pveum user delete <userid>

Eliminare l'utente.

<userid>: <string>

ID utente completo, nel formato name@realm.

pveum user list [OPTIONS] [FORMAT_OPTIONS]

Indice utenti.

--enabled <boolean>

Filtro opzionale per la proprietà enable.

--full <boolean> (default = 0)

Includere le informazioni su gruppi e token.

pveum user modify <userid> [OPTIONS]

Aggiornare la configurazione dell'utente.

<userid>: <string>

ID utente completo, nel formato name@realm.

--append <boolean>

nessuna descrizione disponibile

Note Richiede le opzioni: groups
--comment <string>

nessuna descrizione disponibile

--email <string>

nessuna descrizione disponibile

--enable <boolean> (default = 1)

Abilitare l'account (impostazione predefinita). È possibile impostare questo valore a 0 per disabilitare l'account

--expire <integer> (0 - N)

Data di scadenza dell'account (secondi dall'epoch). 0 significa nessuna data di scadenza.

--firstname <string>

nessuna descrizione disponibile

--groups <string>

nessuna descrizione disponibile

--keys [0-9a-zA-Z!=]{0,4096}

Chiavi per l'autenticazione a due fattori (yubico).

--lastname <string>

nessuna descrizione disponibile

pveum user permissions [<userid>] [OPTIONS] [FORMAT_OPTIONS]

Recuperare i permessi effettivi dell'utente/token specificato.

<userid>: (?^:^(?^:[^\s:/]+)\@(?^:[A-Za-z][A-Za-z0-9\.\-_]+)(?:!(?^:[A-Za-z][A-Za-z0-9\.\-_]+))?$)

ID utente o ID completo del token API

--path <string>

Esegue il dump solo di questo percorso specifico, non dell'intero albero.

pveum user tfa delete <userid> [OPTIONS]

Eliminare le voci TFA di un utente.

<userid>: <string>

ID utente completo, nel formato name@realm.

--id <string>

L'ID TFA; se non specificato, verranno eliminate tutte le voci TFA.

pveum user tfa list [<userid>]

Elencare le voci TFA.

<userid>: <string>

ID utente completo, nel formato name@realm.

pveum user tfa unlock <userid>

Sbloccare l'autenticazione TFA di un utente.

<userid>: <string>

ID utente completo, nel formato name@realm.

pveum user token add <userid> <tokenid> [OPTIONS] [FORMAT_OPTIONS]

Generare un nuovo token API per un utente specifico. NOTA: viene restituito il valore del token API, che deve essere memorizzato poiché non può essere recuperato successivamente!

<userid>: <string>

ID utente completo, nel formato name@realm.

<tokenid>: (?^:[A-Za-z][A-Za-z0-9\.\-_]+)

Identificatore del token specifico dell'utente.

--comment <string>

nessuna descrizione disponibile

--expire <integer> (0 - N) (predefinito = uguale all'utente)

Data di scadenza del token API (secondi dall'epoch). 0 indica nessuna data di scadenza.

--privsep <boolean> (predefinito = 1)

Limitare i privilegi del token API con ACL separate (impostazione predefinita), oppure assegnare tutti i privilegi dell'utente corrispondente.

pveum user token delete <userid> <tokenid> [FORMAT_OPTIONS]

Rimuove il token API per un utente specifico.

<userid>: <string>

ID utente completo, nel formato name@realm.

<tokenid>: (?^:[A-Za-z][A-Za-z0-9\.\-_]+)

Identificatore del token specifico dell'utente.

pveum user token list <userid> [FORMAT_OPTIONS]

Ottiene i token API dell'utente.

<userid>: <string>

ID utente completo, nel formato name@realm.

pveum user token modify <userid> <tokenid> [OPTIONS] [FORMAT_OPTIONS]

Aggiornare il token API per un utente specifico. NOTA: quando viene impostato regenerate, il valore del token restituito deve essere memorizzato poiché non può essere recuperato successivamente!

<userid>: <string>

ID utente completo, nel formato name@realm.

<tokenid>: (?^:[A-Za-z][A-Za-z0-9\.\-_]+)

Identificatore del token specifico dell'utente.

--comment <string>

nessuna descrizione disponibile

--delete <string>

Un elenco delle impostazioni da eliminare.

--expire <integer> (0 - N) (predefinito = uguale all'utente)

Data di scadenza del token API (secondi dall'epoch). 0 indica nessuna data di scadenza.

--privsep <boolean> (predefinito = 1)

Limitare i privilegi del token API con ACL separate (impostazione predefinita), oppure assegnare tutti i privilegi dell'utente corrispondente.

--regenerate <boolean> (predefinito = 0)

Rigenerare il valore segreto del token. Tutti gli utenti che utilizzano il segreto precedente perderanno l'accesso dopo questa operazione.

pveum user token permissions <userid> <tokenid> [OPTIONS] [FORMAT_OPTIONS]

Recuperare i permessi effettivi del token specificato.

<userid>: <string>

ID utente completo, nel formato name@realm.

<tokenid>: (?^:[A-Za-z][A-Za-z0-9\.\-_]+)

Identificatore del token specifico dell'utente.

--path <string>

Esegue il dump solo di questo percorso specifico, non dell'intero albero.

pveum user token remove

Un alias per pveum user token delete.

pveum useradd

Un alias per pveum user add.

pveum userdel

Un alias per pveum user delete.

pveum usermod

Un alias per pveum user modify.

22.16. vzdump - Utility di backup per VM e container

vzdump help

vzdump {<vmid>} [OPTIONS]

Creare un backup.

<vmid>: <string>

L'ID del sistema guest di cui eseguire il backup.

--all <boolean> (default = 0)

Esegue il backup di tutti i sistemi guest noti su questo host.

--bwlimit <integer> (0 - N) (default = 0)

Limitare la banda I/O (in KiB/s).

--compress <0 | 1 | gzip | lzo | zstd> (default = 0)

Comprime il file di dump.

--dumpdir <string>

Memorizzare i file risultanti nella directory specificata.

--exclude <string>

Esclude i sistemi guest specificati (presuppone --all)

--exclude-path <array>

Escludere determinati file/directory (shell globs). I percorsi che iniziano con / sono ancorati alla radice del container, gli altri percorsi corrispondono relativamente a ciascuna sottodirectory.

--fleecing [[enabled=]<1|0>] [,storage=<storage ID>]

Opzioni per il fleecing del backup (solo VM).

--ionice <integer> (0 - 8) (default = 7)

Impostare la priorità IO quando si utilizza lo scheduler BFQ. Per i backup delle VM in modalità snapshot e suspend, questo influisce solo sul compressore. Un valore di 8 significa che viene utilizzata la priorità idle, altrimenti viene utilizzata la priorità best-effort con il valore specificato.

--job-id \S+

L'ID del job di backup. Se impostato, il campo di metadati backup-job della notifica di backup verrà impostato su questo valore. Solo root@pam può impostare questo parametro.

--lockwait <integer> (0 - N) (default = 180)

Tempo massimo di attesa per il lock globale (minuti).

--mailnotification <always | failure> (default = always)

Deprecato: utilizzare invece le destinazioni/i matcher di notifica. Specificare quando inviare un'email di notifica

--mailto <string>

Deprecato: utilizzare invece le destinazioni/i matcher di notifica. Elenco separato da virgole di indirizzi email o utenti che devono ricevere notifiche via email.

--mode <snapshot | stop | suspend> (default = snapshot)

Modalità di backup.

--node <string>

Eseguire solo se l'esecuzione avviene su questo nodo.

--notes-template <string>

Stringa modello per generare le note per uno o più backup. Può contenere variabili che verranno sostituite dai rispettivi valori. Attualmente sono supportate {\{\cluster}}, {\{\guestname}}, {\{\node}} e {\{\vmid}}, ma in futuro potrebbero esserne aggiunte altre. Deve essere su una sola riga; il carattere di nuova riga e la barra rovesciata devono essere rappresentati con le sequenze di escape \n e \\ rispettivamente.

Note Richiede l'opzione/le opzioni: storage
--notification-mode <auto | legacy-sendmail | notification-system> (default = auto)

Determinare quale sistema di notifica utilizzare. Se impostato su legacy-sendmail, vzdump considererà i parametri mailto/mailnotification e invierà email agli indirizzi specificati tramite il comando sendmail. Se impostato su notification-system, una notifica verrà inviata tramite il sistema di notifica di PVE e i parametri mailto e mailnotification verranno ignorati. Se impostato su auto (impostazione predefinita), verrà inviata un'email se mailto è impostato e verrà utilizzato il sistema di notifica in caso contrario.

--pbs-change-detection-mode <data | legacy | metadata>

Modalità PBS utilizzata per rilevare le modifiche ai file e cambiare il formato di codifica per i backup dei container.

--performance [max-workers=<integer>] [,pbs-entries-max=<integer>]

Altre impostazioni relative alle prestazioni.

--pigz <integer> (predefinito = 0)

Utilizzare pigz invece di gzip quando N>0. N=1 utilizza metà dei core, N>1 utilizza N come numero di thread.

--pool <string>

Eseguire il backup di tutti i sistemi guest noti inclusi nel pool specificato.

--protected <boolean>

Se true, contrassegnare i backup come protetti.

Note Richiede l'opzione/le opzioni: storage
--prune-backups [keep-all=<1|0>] [,keep-daily=<N>] [,keep-hourly=<N>] [,keep-last=<N>] [,keep-monthly=<N>] [,keep-weekly=<N>] [,keep-yearly=<N>] (predefinito = keep-all=1)

Utilizzare queste opzioni di conservazione invece di quelle della configurazione dello storage.

--quiet <boolean> (predefinito = 0)

Modalità silenziosa.

--remove <boolean> (predefinito = 1)

Eliminare i backup meno recenti secondo prune-backups.

--script <string>

Utilizzare lo script hook specificato.

--stdexcludes <boolean> (predefinito = 1)

Esclude i file temporanei e i log.

--stdout <boolean>

Scrive il tar sullo stdout, non su un file.

--stop <boolean> (predefinito = 0)

Interrompe i job di backup in esecuzione su questo host.

--stopwait <integer> (0 - N) (predefinito = 10)

Tempo massimo di attesa per l'arresto di un sistema guest (minuti).

--storage <storage ID>

Memorizzare il file risultante in questo storage.

--tmpdir <string>

Memorizzare i file temporanei nella directory specificata.

--zstd <integer> (predefinito = 1)

Thread zstd. Con N=0 viene utilizzata metà dei core disponibili; se N è impostato su un valore maggiore di 0, N viene utilizzato come numero di thread.

22.17. ha-manager - Proxmox VE HA Manager

ha-manager <COMMAND> [ARGS] [OPTIONS]

ha-manager add <sid> [OPTIONS]

Creare una nuova risorsa HA.

<sid>: <type>:<name>

ID della risorsa HA. È composto da un tipo di risorsa seguito da un nome specifico della risorsa, separati da due punti (esempio: vm:100 / ct:100). Per macchine virtuali e container, è possibile semplicemente utilizzare l'id della VM o del CT come scorciatoia (esempio: 100).

--auto-rebalance <boolean> (predefinito = 1)

La risorsa HA può essere migrata durante il ribilanciamento automatico

--comment <string>

Descrizione.

--failback <boolean> (predefinito = 1)

Migrare automaticamente la risorsa HA verso il nodo con la priorità più alta secondo le relative regole di affinità dei nodi, se un nodo con priorità più alta rispetto al nodo corrente diventa online.

--group <string>

L'identificatore del gruppo HA.

--max_relocate <integer> (0 - N) (predefinito = 1)

Numero massimo di tentativi di rilocazione della risorsa quando l'avvio di una risorsa non riesce.

--max_restart <integer> (0 - N) (predefinito = 1)

Numero massimo di tentativi di riavvio della risorsa su un nodo dopo che il suo avvio non è riuscito. Una volta raggiunto, l'HA manager tenterà di rilocare la risorsa su un nodo idoneo.

--state <disabled | enabled | ignored | started | stopped> (predefinito = started)

Stato richiesto per la risorsa.

--type <ct | vm>

Tipo di risorsa.

ha-manager config [OPTIONS]

Elencare le risorse HA.

--type <ct | vm>

Elencare solo le risorse di un tipo specifico

ha-manager crm-command arm-ha

Richiede il riarmo dello stack HA dopo che è stato disarmato.

ha-manager crm-command disarm-ha <resource-mode>

Richiede il disarmo dello stack HA, rilasciando tutti i watchdog a livello di cluster.

<resource-mode>: <freeze | ignore>

Controlla come vengono gestite le risorse gestite da HA quando HA è disarmato. Lo stato attuale delle risorse non viene modificato. freeze: nuovi comandi e cambiamenti di stato non vengono applicati. ignore: le risorse vengono rimosse dal tracciamento HA e possono essere gestite come se non fossero gestite da HA.

ha-manager crm-command migrate <sid> <node>

Richiede la migrazione (online) della risorsa a un altro nodo.

<sid>: <type>:<name>

ID della risorsa HA. È composto da un tipo di risorsa seguito da un nome specifico della risorsa, separati da due punti (esempio: vm:100 / ct:100). Per macchine virtuali e container, è possibile semplicemente utilizzare l'id della VM o del CT come scorciatoia (esempio: 100).

<node>: <string>

Nodo di destinazione.

ha-manager crm-command node-maintenance disable <node>

Modificare lo stato della richiesta di manutenzione del nodo.

<node>: <string>

Il nome del nodo del cluster.

ha-manager crm-command node-maintenance enable <node>

Modificare lo stato della richiesta di manutenzione del nodo.

<node>: <string>

Il nome del nodo del cluster.

ha-manager crm-command relocate <sid> <node>

Richiede la riallocazione della risorsa a un altro nodo. Questo arresta il servizio sul vecchio nodo e lo riavvia sul nodo di destinazione.

<sid>: <type>:<name>

ID della risorsa HA. È composto da un tipo di risorsa seguito da un nome specifico della risorsa, separati da due punti (esempio: vm:100 / ct:100). Per macchine virtuali e container, è possibile semplicemente utilizzare l'id della VM o del CT come scorciatoia (esempio: 100).

<node>: <string>

Nodo di destinazione.

ha-manager crm-command stop <sid> <timeout>

Richiede l'arresto del servizio.

<sid>: <type>:<name>

ID della risorsa HA. È composto da un tipo di risorsa seguito da un nome specifico della risorsa, separati da due punti (esempio: vm:100 / ct:100). Per macchine virtuali e container, è possibile semplicemente utilizzare l'id della VM o del CT come scorciatoia (esempio: 100).

<timeout>: <integer> (0 - N)

Timeout in secondi. Se impostato a 0 verrà eseguito un arresto forzato.

ha-manager groupadd <group> --nodes <string> [OPTIONS]

Creare un nuovo gruppo HA. (deprecato a favore delle regole HA)

<group>: <string>

L'identificatore del gruppo HA.

--comment <string>

Descrizione.

--nodes <node>[:<pri>]{,<node>[:<pri>]}*

Elenco dei nomi dei nodi del cluster con priorità opzionale.

--nofailback <boolean> (default = 0)

Il CRM tenta di eseguire i servizi sul nodo con la priorità più alta. Se un nodo con priorità più alta torna online, il CRM migra il servizio su quel nodo. Abilitare nofailback impedisce questo comportamento.

--restricted <boolean> (default = 0)

Le risorse associate a gruppi vincolati possono essere eseguite solo sui nodi definiti dal gruppo.

--type <group>

Tipo di gruppo.

ha-manager groupconfig

Recuperare i gruppi HA. (Operazione deprecata a favore delle regole HA)

ha-manager groupremove <group>

Eliminare la configurazione del gruppo HA. (Deprecato a favore delle regole HA)

<group>: <string>

L'identificatore del gruppo HA.

ha-manager groupset <group> [OPTIONS]

Aggiornare la configurazione del gruppo HA. (Deprecato a favore delle regole HA)

<group>: <string>

L'identificatore del gruppo HA.

--comment <string>

Descrizione.

--delete <string>

Un elenco delle impostazioni da eliminare.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest diverso. È possibile utilizzare questa opzione per evitare modifiche concorrenti.

--nodes <node>[:<pri>]{,<node>[:<pri>]}*

Elenco dei nomi dei nodi del cluster con priorità opzionale.

--nofailback <boolean> (default = 0)

Il CRM tenta di eseguire i servizi sul nodo con la priorità più alta. Se un nodo con priorità più alta torna online, il CRM migra il servizio su quel nodo. Abilitare nofailback impedisce questo comportamento.

--restricted <boolean> (default = 0)

Le risorse associate a gruppi vincolati possono essere eseguite solo sui nodi definiti dal gruppo.

ha-manager help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

ha-manager migrate

Un alias per ha-manager crm-command migrate.

ha-manager relocate

Un alias per ha-manager crm-command relocate.

ha-manager remove <sid> [OPTIONS]

Elimina la configurazione della risorsa.

<sid>: <type>:<name>

ID della risorsa HA. È composto da un tipo di risorsa seguito da un nome specifico della risorsa, separati da due punti (esempio: vm:100 / ct:100). Per macchine virtuali e container, è possibile semplicemente utilizzare l'id della VM o del CT come scorciatoia (esempio: 100).

--purge <boolean> (predefinito = 1)

Rimuove questa risorsa dalle regole che la referenziano, eliminando la regola se questa risorsa è l'unica risorsa presente nella regola

ha-manager rules add <type> <rule> [OPTIONS]

Crea una regola HA.

<type>: <node-affinity | resource-affinity>

Tipo di regola HA.

<rule>: <string>

Identificatore della regola HA.

Opzioni condizionali:

[type=node-affinity]
--affinity <negative | positive> (default = positive)

Descrive se le risorse HA devono essere posizionate sui nodi indicati (positive), oppure devono essere posizionate su qualsiasi nodo eccetto quelli indicati (negative).

--comment <string>

Descrizione della regola HA.

--disable <boolean>

Indica se la regola HA è disabilitata.

--nodes <node>[:<pri>]{,<node>[:<pri>]}*

Elenco dei nomi dei nodi del cluster con priorità opzionale.

--resources <type>:<name>{,<type>:<name>}*

Elenco di ID delle risorse HA. Consiste in un elenco di tipi di risorsa seguiti da un nome specifico della risorsa separato da due punti (esempio: vm:100,ct:101).

--strict <boolean> (default = 0)

Descrive se la regola di affinità dei nodi è rigida (strict) o non rigida.

[type=resource-affinity]
--affinity <negative | positive>

Descrive se le risorse HA devono essere mantenute sullo stesso nodo (positive), oppure devono essere mantenute su nodi separati (negative).

--comment <string>

Descrizione della regola HA.

--disable <boolean>

Indica se la regola HA è disabilitata.

--resources <type>:<name>{,<type>:<name>}*

Elenco di ID delle risorse HA. Consiste in un elenco di tipi di risorsa seguiti da un nome specifico della risorsa separato da due punti (esempio: vm:100,ct:101).

ha-manager rules config [OPTIONS] [FORMAT_OPTIONS]

Recuperare le regole HA.

--resource <string>

Limitare l'elenco restituito alle regole che interessano la risorsa specificata.

--type <node-affinity | resource-affinity>

Limitare l'elenco restituito al tipo di regola specificato.

ha-manager rules list [OPTIONS] [FORMAT_OPTIONS]

Recuperare le regole HA.

--resource <string>

Limitare l'elenco restituito alle regole che interessano la risorsa specificata.

--type <node-affinity | resource-affinity>

Limitare l'elenco restituito al tipo di regola specificato.

ha-manager rules remove <rule>

Eliminare la regola HA.

<rule>: <string>

Identificatore della regola HA.

ha-manager rules set <type> <rule> [OPTIONS]

Aggiornare la regola HA.

<type>: <node-affinity | resource-affinity>

Tipo di regola HA.

<rule>: <string>

Identificatore della regola HA.

--delete <string>

Un elenco delle impostazioni da eliminare.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest diverso. È possibile utilizzare questa opzione per evitare modifiche concorrenti.

Opzioni condizionali:

[type=node-affinity]
--affinity <negative | positive> (default = positive)

Descrive se le risorse HA devono essere posizionate sui nodi indicati (positive), oppure devono essere posizionate su qualsiasi nodo eccetto quelli indicati (negative).

--comment <string>

Descrizione della regola HA.

--disable <boolean>

Indica se la regola HA è disabilitata.

--nodes <node>[:<pri>]{,<node>[:<pri>]}*

Elenco dei nomi dei nodi del cluster con priorità opzionale.

--resources <type>:<name>{,<type>:<name>}*

Elenco di ID delle risorse HA. Consiste in un elenco di tipi di risorsa seguiti da un nome specifico della risorsa separato da due punti (esempio: vm:100,ct:101).

--strict <boolean> (default = 0)

Descrive se la regola di affinità dei nodi è rigida (strict) o non rigida.

[type=resource-affinity]
--affinity <negative | positive>

Descrive se le risorse HA devono essere mantenute sullo stesso nodo (positive), oppure devono essere mantenute su nodi separati (negative).

--comment <string>

Descrizione della regola HA.

--disable <boolean>

Indica se la regola HA è disabilitata.

--resources <type>:<name>{,<type>:<name>}*

Elenco di ID delle risorse HA. Consiste in un elenco di tipi di risorsa seguiti da un nome specifico della risorsa separato da due punti (esempio: vm:100,ct:101).

ha-manager set <sid> [OPTIONS]

Aggiornare la configurazione della risorsa.

<sid>: <type>:<name>

ID della risorsa HA. È composto da un tipo di risorsa seguito da un nome specifico della risorsa, separati da due punti (esempio: vm:100 / ct:100). Per macchine virtuali e container, è possibile semplicemente utilizzare l'id della VM o del CT come scorciatoia (esempio: 100).

--auto-rebalance <boolean> (predefinito = 1)

La risorsa HA può essere migrata durante il ribilanciamento automatico

--comment <string>

Descrizione.

--delete <string>

Un elenco delle impostazioni da eliminare.

--digest <string>

Impedisce le modifiche se il file di configurazione corrente ha un digest diverso. È possibile utilizzare questa opzione per evitare modifiche concorrenti.

--failback <boolean> (predefinito = 1)

Migrare automaticamente la risorsa HA verso il nodo con la priorità più alta secondo le relative regole di affinità dei nodi, se un nodo con priorità più alta rispetto al nodo corrente diventa online.

--group <string>

L'identificatore del gruppo HA.

--max_relocate <integer> (0 - N) (predefinito = 1)

Numero massimo di tentativi di rilocazione della risorsa quando l'avvio di una risorsa non riesce.

--max_restart <integer> (0 - N) (predefinito = 1)

Numero massimo di tentativi di riavvio della risorsa su un nodo dopo che il suo avvio non è riuscito. Una volta raggiunto, l'HA manager tenterà di rilocare la risorsa su un nodo idoneo.

--state <disabled | enabled | ignored | started | stopped> (predefinito = started)

Stato richiesto per la risorsa.

ha-manager status [OPTIONS]

Visualizzare lo stato del gestore HA.

--verbose <boolean> (default = 0)

Output dettagliato. Include lo stato completo di CRM e LRM (JSON).

23. Appendice B: demoni di servizio

23.1. pve-firewall - Demone firewall di Proxmox VE

pve-firewall <COMMAND> [ARGS] [OPTIONS]

pve-firewall compile

Compilare e stampare le regole del firewall. Questa operazione è utile per i test.

pve-firewall help [OPTIONS]

Visualizzare la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pve-firewall localnet

Stampare informazioni sulla rete locale.

pve-firewall restart

Riavviare il servizio firewall di Proxmox VE.

pve-firewall simulate [OPTIONS]

Simulare le regole del firewall. Questa operazione non simula la tabella di routing del kernel, ma presuppone semplicemente che il routing dalla zona di origine alla zona di destinazione sia possibile.

--dest <string>

Indirizzo IP di destinazione.

--dport <integer>

Porta di destinazione.

--from (host|outside|vm\d+|ct\d+|([a-zA-Z][a-zA-Z0-9]{0,9})/(\S+)) (default = outside)

Zona di origine.

--protocol (tcp|udp) (default = tcp)

Protocollo.

--source <string>

Indirizzo IP di origine.

--sport <integer>

Porta di origine.

--to (host|outside|vm\d+|ct\d+|([a-zA-Z][a-zA-Z0-9]{0,9})/(\S+)) (default = host)

Zona di destinazione.

--verbose <boolean> (default = 0)

Output dettagliato.

pve-firewall start [OPTIONS]

Avviare il servizio firewall di Proxmox VE.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

pve-firewall status

Ottenere lo stato del firewall.

pve-firewall stop

Arrestare il servizio firewall di Proxmox VE. Si noti che l'arresto rimuove attivamente tutte le regole iptables relative a Proxmox VE, lasciando potenzialmente l'host non protetto.

23.2. pvedaemon - Daemon API di Proxmox VE

pvedaemon <COMMAND> [ARGS] [OPTIONS]

pvedaemon help [OPTIONS]

Visualizzare la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvedaemon restart

Riavviare il daemon (o avviarlo se non è in esecuzione).

pvedaemon start [OPTIONS]

Avviare il daemon.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

pvedaemon status

Ottiene lo stato del daemon.

pvedaemon stop

Arrestare il daemon.

23.3. pveproxy - Daemon proxy API di Proxmox VE

pveproxy <COMMAND> [ARGS] [OPTIONS]

pveproxy help [OPTIONS]

Visualizzare la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pveproxy restart

Riavviare il daemon (o avviarlo se non è in esecuzione).

pveproxy start [OPTIONS]

Avviare il daemon.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

pveproxy status

Ottiene lo stato del daemon.

pveproxy stop

Arrestare il daemon.

23.4. pvestatd - Daemon di stato di Proxmox VE

pvestatd <COMMAND> [ARGS] [OPTIONS]

pvestatd help [OPTIONS]

Visualizzare la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvestatd restart

Riavviare il daemon (o avviarlo se non è in esecuzione).

pvestatd start [OPTIONS]

Avviare il daemon.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

pvestatd status

Ottenere lo stato del daemon.

pvestatd stop

Arrestare il daemon.

23.5. spiceproxy - Servizio proxy SPICE

spiceproxy <COMMAND> [ARGS] [OPTIONS]

spiceproxy help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

spiceproxy restart

Riavviare il daemon (o avviarlo se non è in esecuzione).

spiceproxy start [OPTIONS]

Avviare il daemon.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

spiceproxy status

Ottenere lo stato del daemon.

spiceproxy stop

Arrestare il daemon.

23.6. pmxcfs - Proxmox Cluster File System

pmxcfs [OPTIONS]

Opzioni di aiuto:

-h, --help

Mostrare le opzioni di aiuto

Opzioni dell'applicazione:

-d, --debug

Attivare i messaggi di debug

-f, --foreground

Non eseguire il server come demone

-l, --local

Forzare la modalità locale (ignorare corosync.conf, forzare il quorum)

Questo servizio viene normalmente avviato e gestito tramite il set di strumenti systemd. Il servizio si chiama pve-cluster.

systemctl start pve-cluster
systemctl stop pve-cluster
systemctl status pve-cluster

23.7. pve-ha-crm - Demone Cluster Resource Manager

pve-ha-crm <COMMAND> [ARGS] [OPTIONS]

pve-ha-crm help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pve-ha-crm start [OPTIONS]

Avvia il daemon.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

pve-ha-crm status

Ottiene lo stato del daemon.

pve-ha-crm stop

Arresta il daemon.

23.8. pve-ha-lrm - Demone di gestione delle risorse locali

pve-ha-lrm <COMMAND> [ARGS] [OPTIONS]

pve-ha-lrm help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pve-ha-lrm start [OPTIONS]

Avvia il daemon.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

pve-ha-lrm status

Ottiene lo stato del daemon.

pve-ha-lrm stop

Arresta il daemon.

23.9. pvescheduler - Demone di pianificazione di Proxmox VE

pvescheduler <COMMAND> [ARGS] [OPTIONS]

pvescheduler help [OPTIONS]

Visualizza la guida relativa al comando specificato.

--extra-args <array>

Mostra la guida relativa a un comando specifico

--verbose <boolean>

Formato di output esteso.

pvescheduler restart

Riavvia il daemon (o lo avvia se non è in esecuzione).

pvescheduler start [OPTIONS]

Avvia il daemon.

--debug <boolean> (predefinito = 0)

Modalità debug - rimane in primo piano

pvescheduler status

Ottenere lo stato del daemon.

pvescheduler stop

Arrestare il daemon.

24. Appendice C: file di configurazione

24.1. Generale

La maggior parte dei file di configurazione in Proxmox VE risiede nel file system cluster condiviso montato in /etc/pve. Esistono eccezioni, come il file di configurazione specifico del nodo per i backup in /etc/vzdump.conf.

Generalmente, le proprietà in un file di configurazione derivano dallo schema JSON utilizzato anche per i relativi endpoint API.

24.1.1. Uso di maiuscole e minuscole nei nomi delle proprietà

Storicamente, le proprietà più lunghe (e le sotto-proprietà) utilizzavano spesso snake_case, oppure venivano scritte come un'unica parola. Questo può essere probabilmente attribuito al fatto che lo stack Proxmox VE è stato sviluppato principalmente nel linguaggio di programmazione Perl, dove l'accesso alle proprietà tramite kebab-case richiede virgolette aggiuntive, oltre a una minore applicazione dello stile durante le prime fasi di sviluppo, per cui diversi sviluppatori hanno utilizzato convenzioni diverse.

Per le nuove proprietà, kebab-case è il metodo preferito ed è previsto introdurre alias per le proprietà snake_case esistenti e, nel lungo termine, passare a kebab-case per l'API, la CLI e i file di configurazione in uso mantenendo la retrocompatibilità durante il ripristino di una configurazione.

24.2. Configurazione del datacenter

Il file /etc/pve/datacenter.cfg è un file di configurazione per Proxmox VE. Contiene valori predefiniti a livello di cluster utilizzati da tutti i nodi.

24.2.1. Formato del file

Il file utilizza un semplice formato chiave/valore separato da due punti. Ogni riga ha il seguente formato:

OPTION: value

Le righe vuote nel file vengono ignorate, e le righe che iniziano con il carattere # sono considerate commenti e vengono anch'esse ignorate.

24.2.2. Opzioni

bwlimit: [clone=<LIMIT>] [,default=<LIMIT>] [,migration=<LIMIT>] [,move=<LIMIT>] [,restore=<LIMIT>]

Impostare il limite di larghezza di banda I/O per le varie operazioni (in KiB/s).

clone=<LIMIT>

limite di banda in KiB/s per la clonazione dei dischi

default=<LIMIT>

limite di banda predefinito in KiB/s

migration=<LIMIT>

limite di banda in KiB/s per la migrazione dei guest (incluso lo spostamento dei dischi locali)

move=<LIMIT>

limite di banda in KiB/s per lo spostamento dei dischi

restore=<LIMIT>

limite di banda in KiB/s per il ripristino dei guest dai backup

consent-text: <string>

Testo di consenso visualizzato prima dell'accesso.

console: <applet | html5 | vv | xtermjs>

Selezionare il visualizzatore della console predefinito. È possibile utilizzare l'applet Java integrata (VNC; deprecata e associata a html5), un'applicazione esterna compatibile con virt-viewer (SPICE), un visualizzatore VNC basato su HTML5 (noVNC) oppure un client console basato su HTML5 (xtermjs). Se il visualizzatore selezionato non è disponibile (ad es. SPICE non attivato per la VM), viene utilizzato noVNC come alternativa.

crs: [ha=<basic|static|dynamic>] [,ha-auto-rebalance=<1|0>] [,ha-auto-rebalance-hold-duration=<number>] [,ha-auto-rebalance-margin=<number>] [,ha-auto-rebalance-method=<bruteforce|topsis>] [,ha-auto-rebalance-threshold=<number>] [,ha-rebalance-on-start=<1|0>]

Impostazioni di pianificazione delle risorse del cluster.

ha=<basic | dynamic | static> (default = basic)

Configura il modo in cui l'HA Manager deve selezionare i nodi per avviare o ripristinare i servizi:

  • con basic, viene utilizzato solo il numero di servizi,

  • con static, viene considerata la configurazione statica di CPU e memoria dei servizi,

  • con dynamic, viene considerato l'utilizzo statico e dinamico di CPU e memoria dei servizi.

ha-auto-rebalance=<boolean> (default = 0)

Indica se utilizzare il CRS per bilanciare automaticamente le risorse HA in base all'attuale squilibrio dei nodi.

ha-auto-rebalance-hold-duration=<number> (0 - N) (predefinito = 3)

Il numero di round HA per i quali la soglia di squilibrio del nodo del cluster deve essere superata prima di attivare una migrazione automatica di bilanciamento delle risorse.

Note Richiede l'opzione/le opzioni: ha-auto-rebalance
ha-auto-rebalance-margin=<number> (0 - 100) (predefinito = 10)

Il miglioramento relativo minimo dello squilibrio tra i nodi del cluster, in percentuale, necessario per procedere con una migrazione di bilanciamento delle risorse.

Note Richiede l'opzione/le opzioni: ha-auto-rebalance
ha-auto-rebalance-method=<bruteforce | topsis> (predefinito = bruteforce)

Il metodo da utilizzare per il punteggio delle migrazioni di bilanciamento.

Note Richiede l'opzione/le opzioni: ha-auto-rebalance
ha-auto-rebalance-threshold=<number> (0 - 100) (predefinito = 30)

Lo squilibrio del nodo del cluster, in percentuale, che attiverà il sistema di bilanciamento automatico delle risorse se superato.

Note Richiede l'opzione/le opzioni: ha-auto-rebalance
ha-rebalance-on-start=<boolean> (predefinito = 0)

Impostare per utilizzare CRS per selezionare un nodo adeguato quando lo stato richiesto di un servizio HA passa da stop a start.

description: <string>

Descrizione del datacenter. Visualizzata nel pannello note del datacenter dell'interfaccia web. Viene salvata come commento all'interno del file di configurazione.

email_from: <string>

Specificare l'indirizzo email da cui inviare le notifiche (il valore predefinito è root@$hostname)

fencing: <both | hardware | watchdog> (predefinito = watchdog)

Impostare la modalità di fencing del cluster HA. La modalità hardware richiede una configurazione valida dei dispositivi di fencing in /etc/pve/ha/fence.cfg. Con both vengono utilizzate entrambe le modalità.

Warning hardware e both sono SPERIMENTALI e WIP
ha: shutdown_policy=<enum>

Impostazioni HA a livello di cluster.

shutdown_policy=<conditional | failover | freeze | migrate> (predefinito = conditional)

Descrive la politica per la gestione dei servizi HA in caso di spegnimento o riavvio di un nodo. Freeze congela sempre i servizi ancora presenti sul nodo al momento dello spegnimento; tali servizi non verranno ripristinati dal gestore HA. Failover non contrassegna i servizi come congelati, pertanto i servizi verranno ripristinati su altri nodi se il nodo spento non torna rapidamente disponibile (< 1 minuto). conditional sceglie automaticamente in base al tipo di spegnimento, ossia, in caso di riavvio il servizio verrà congelato, mentre in caso di spegnimento il servizio rimarrà invariato e verrà quindi ripristinato dopo circa 2 minuti. Migrate tenterà di spostare tutti i servizi in esecuzione su un altro nodo quando viene attivato un riavvio o uno spegnimento. Il processo di spegnimento continuerà solo quando nessun servizio in esecuzione sarà più presente sul nodo. Se il nodo torna disponibile, il servizio verrà spostato nuovamente sul nodo precedentemente spento, almeno se non sono avvenute altre migrazioni, rilocazioni o ripristini.

http_proxy: http://.*

Specificare un proxy http esterno utilizzato per i download (esempio: http://username:password@host:port/)

keyboard: <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be | fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt | pt-br | sl | sv | tr>

Layout di tastiera predefinito per il server vnc.

language: <ar | ca | da | de | en | es | eu | fa | fr | he | hr | it | ja | ka | kr | nb | nl | nn | pl | pt_BR | ru | sl | sv | tr | ukr | zh_CN | zh_TW>

Lingua predefinita della GUI.

location: latitude=<number> ,longitude=<number> [,name=<name>]

La posizione del cluster.

latitude=<number> (-90 - 90)

La latitudine della posizione dei nodi in gradi.

longitude=<number> (-180 - 180)

La longitudine della posizione dei nodi in gradi.

name=<name>

Il nome della posizione di questo nodo

mac_prefix: <string> (predefinito = BC:24:11)

Prefisso per gli indirizzi MAC generati automaticamente per i guest virtuali. Il valore predefinito BC:24:11 è l'Organizationally Unique Identifier (OUI) assegnato dall'IEEE a Proxmox Server Solutions GmbH per un MAC Address Block Large (MA-L). È consentito utilizzare questo prefisso nelle reti locali, ovvero quelle non direttamente raggiungibili dal pubblico (ad esempio, in una LAN o con NAT/Masquerading).

Si noti che quando si eseguono più cluster che condividono (parzialmente) le reti dei rispettivi guest virtuali, è altamente consigliato estendere il prefisso MAC predefinito, oppure generarne uno personalizzato (valido), per ridurre la probabilità di collisioni MAC. Ad esempio, si può aggiungere un carattere esadecimale extra all'OUI Proxmox per ciascun cluster, come BC:24:11:0 per il primo, BC:24:11:1 per il secondo, e così via. In alternativa, è possibile separare le reti dei guest anche logicamente, ad esempio utilizzando le VLAN.

+ Per i guest accessibili pubblicamente si consiglia di registrare un proprio OUI presso IEEE oppure coordinarsi con i propri amministratori di rete o con quelli del provider di hosting.

max_workers: <integer> (1 - N)

Definisce il numero massimo di worker (per nodo) avviati per azioni come stopall VMs o task da ha-manager.

migration: [type=]<secure|insecure> [,network=<CIDR>]

Per le impostazioni di migrazione a livello di cluster.

network=<CIDR>

CIDR della (sotto)rete utilizzata per la migrazione. Utilizzato come fallback per i task di replica se l'impostazione della rete di replica non è configurata

type=<insecure | secure> (predefinito = secure)

Per impostazione predefinita, il traffico di migrazione viene cifrato tramite un tunnel SSH. Su reti sicure e completamente private, questa opzione può essere disabilitata per aumentare le prestazioni.

migration_unsecure: <boolean>

Per impostazione predefinita la migrazione è protetta tramite un tunnel SSH. Per le reti private sicure è possibile disabilitare il tunnel per velocizzare la migrazione. Deprecato, utilizzare invece la proprietà migration!

next-id: [lower=<integer>] [,upper=<integer>]

Controlla l'intervallo per il pool di auto-selezione dei VMID liberi.

lower=<integer> (predefinito = 100)

Limite inferiore, incluso, per l'intervallo API dei next-id liberi.

upper=<integer> (predefinito = 1000000)

Limite superiore, escluso, per l'intervallo API dei next-id liberi.

notify: [fencing=<always|never>] [,package-updates=<auto|always|never>] [,replication=<always|never>] [,target-fencing=<TARGET>] [,target-package-updates=<TARGET>] [,target-replication=<TARGET>]

Impostazioni di notifica a livello di cluster.

fencing=<always | never>

NON UTILIZZATO - Utilizzare invece le impostazioni di notifica del datacenter.

package-updates=<always | auto | never> (predefinito = auto)

DEPRECATO: Utilizzare invece le impostazioni di notifica del datacenter. Controlla con quale frequenza il task di aggiornamento giornaliero deve inviare notifiche:

  • auto giornalmente per i sistemi con un abbonamento valido, poiché si presume che siano pronti per la produzione e quindi debbano essere informati degli aggiornamenti in sospeso.

  • always a ogni aggiornamento, se sono presenti nuovi aggiornamenti in sospeso.

  • never non invia mai una notifica per i nuovi aggiornamenti in sospeso.

replication=<always | never>

NON UTILIZZATO - Utilizzare invece le impostazioni di notifica del datacenter.

target-fencing=<TARGET>

NON UTILIZZATO - Utilizzare invece le impostazioni di notifica del datacenter.

target-package-updates=<TARGET>

NON UTILIZZATO - Utilizzare invece le impostazioni di notifica del datacenter.

target-replication=<TARGET>

NON UTILIZZATO - Utilizzare invece le impostazioni di notifica del datacenter.

registered-tags: <tag>[;<tag>...]

Un elenco di tag che richiedono Sys.Modify su / per essere impostati ed eliminati. I tag impostati qui che sono presenti anche in user-tag-access richiedono anch'essi Sys.Modify.

replication: [type=]<secure|insecure> [,network=<CIDR>]

Per le impostazioni di replica a livello di cluster.

network=<CIDR>

CIDR della (sotto)rete utilizzata per i job di replicazione.

type=<insecure | secure> (predefinito = secure)

Il traffico di replicazione è cifrato per impostazione predefinita tramite un tunnel SSH. Su reti sicure e completamente private, questa opzione può essere disabilitata per aumentare le prestazioni.

tag-style: [case-sensitive=<1|0>] [,color-map=<tag>:<hex-color>[:<hex-color-for-text>][;<tag>=...]] [,ordering=<config|alphabetical>] [,shape=<enum>]

Opzioni di stile per i tag.

case-sensitive=<boolean> (default = 0)

Controlla se il filtraggio dei tag univoci durante l'aggiornamento deve considerare la distinzione tra maiuscole e minuscole.

color-map=<tag>:<hex-color>[:<hex-color-for-text>][;<tag>=...]

Mappatura manuale dei colori per i tag (separati da punto e virgola).

ordering=<alphabetical | config> (default = alphabetical)

Controlla l'ordinamento dei tag nell'interfaccia web e nell'aggiornamento tramite API.

shape=<circle | dense | full | none> (default = circle)

Forma del tag per l'albero dell'interfaccia web. full disegna il tag completo. circle disegna solo un cerchio con il colore di sfondo. dense disegna solo un piccolo rettangolo (utile quando a ogni guest sono assegnati molti tag). none disabilita la visualizzazione dei tag.

u2f: [appid=<APPID>] [,origin=<URL>]

u2f

appid=<APPID>

Override dell'URL dell'AppId U2F. Il valore predefinito è l'origin.

origin=<URL>

Override dell'Origin U2F. Utile principalmente per nodi singoli con un unico URL.

user-tag-access: [user-allow=<enum>] [,user-allow-list=<tag>[;<tag>...]]

Opzioni sui privilegi per i tag impostabili dall'utente.

user-allow=<existing | free | list | none> (default = free)

Controlla quali tag possono essere impostati o eliminati sulle risorse controllate da un utente (ad esempio i guest). Gli utenti con il privilegio Sys.Modify su / non hanno mai restrizioni.

  • none nessun tag è utilizzabile.

  • list sono utilizzabili i tag presenti in user-allow-list.

  • existing come list, ma sono utilizzabili anche i tag già esistenti sulle risorse.

  • free nessuna restrizione sui tag.

user-allow-list=<tag>[;<tag>...]

Elenco dei tag che gli utenti possono impostare ed eliminare (separati da punto e virgola) per i valori list ed existing di user-allow.

webauthn: [allow-subdomains=<1|0>] [,id=<DOMAINNAME>] [,origin=<URL>] [,rp=<RELYING_PARTY>]

Configurazione webauthn.

allow-subdomains=<boolean> (default = 1)

Indica se consentire che l'origin sia un sottodominio, invece dell'URL esatto.

id=<DOMAINNAME>

ID del relying party. Deve essere il nome di dominio senza protocollo, porta o percorso. La modifica di questo valore renderà inutilizzabili le credenziali esistenti.

origin=<URL>

Origine del sito. Deve essere un URL https:// (oppure http://localhost). Dovrebbe contenere l'indirizzo che gli utenti digitano nel browser per accedere all'interfaccia web. La modifica di questo valore potrebbe rendere inutilizzabili le credenziali esistenti.

rp=<RELYING_PARTY>

Nome del relying party. Un identificativo testuale qualsiasi. La modifica di questo valore potrebbe rendere inutilizzabili le credenziali esistenti.

25. Appendice D: eventi del calendario

25.1. Formato della pianificazione

Proxmox VE dispone di una configurazione di pianificazione molto flessibile. È basata sul formato degli eventi di calendario di systemd.
[vedere man 7 systemd.time per maggiori informazioni]
Gli eventi di calendario possono essere utilizzati per fare riferimento a uno o più istanti temporali in una singola espressione.

Un evento del calendario di questo tipo utilizza il seguente formato:

[WEEKDAY] [[YEARS-]MONTHS-DAYS] [HOURS:MINUTES[:SECONDS]]

Questo formato consente di configurare un insieme di giorni in cui il job deve essere eseguito. È inoltre possibile impostare uno o più orari di avvio. Indica allo scheduler di replica i momenti nel tempo in cui un job deve essere avviato. Con queste informazioni è possibile creare un job che viene eseguito ogni giorno lavorativo alle 22: 'mon,tue,wed,thu,fri 22' che può essere abbreviato in: 'mon..fri 22'; la maggior parte delle pianificazioni ragionevoli può essere scritta in modo abbastanza intuitivo in questo modo.

Note Le ore sono espresse nel formato a 24 ore.

Per consentire una configurazione pratica e più breve, è possibile impostare uno o più orari di ripetizione per guest. Questi indicano che le replicazioni vengono eseguite negli orari di avvio stessi e negli orari di avvio più tutti i multipli del valore di ripetizione. Se si desidera avviare la replica alle 8:00 e ripeterla ogni 15 minuti fino alle 9:00, si utilizzerà: '8:00/15'

Qui si può notare che se non viene utilizzato alcun separatore di ore (:), il valore viene interpretato come minuto. Se viene utilizzato tale separatore, il valore a sinistra indica le ore, mentre il valore a destra indica i minuti. Inoltre, è possibile utilizzare * per far corrispondere tutti i valori possibili.

Per ulteriori idee, consultare altri esempi più avanti.

25.2. Specifica dettagliata

weekdays

I giorni sono specificati con una versione abbreviata in inglese: sun, mon, tue, wed, thu, fri e sat. È possibile utilizzare più giorni come elenco separato da virgole. È inoltre possibile impostare un intervallo di giorni specificando il giorno iniziale e finale separati da “..”, ad esempio mon..fri. Questi formati possono essere combinati. Se omesso, si assume '*'.

time-format

Un formato orario è costituito da elenchi di intervalli di ore e minuti. Ore e minuti sono separati da ':'. Sia le ore che i minuti possono essere elenchi e intervalli di valori, utilizzando lo stesso formato dei giorni. Prima vengono le ore, poi i minuti. Le ore possono essere omesse se non necessarie. In questo caso, per il valore delle ore si assume '*'. L'intervallo valido per i valori è 0-23 per le ore e 0-59 per i minuti.

Note È possibile utilizzare systemd-analyze calendar per verificare se una determinata specifica di un evento di calendario è valida e quando l'evento verrebbe attivato la prossima volta. Passando il flag --iterations=<N> è inoltre possibile visualizzare le prossime <N> occorrenze in cui l'evento di calendario verrebbe attivato (è necessario sostituire <N> con un intero valido).

25.2.1. Esempi:

Esistono alcuni valori speciali che hanno un significato specifico:

Tabella 19. Valori speciali
Valore Sintassi

minutely

*-*-* *:*:00

hourly

*-*-* *:00:00

daily

*-*-* 00:00:00

weekly

mon *-*-* 00:00:00

monthly

*-*-01 00:00:00

yearly o annually

*-01-01 00:00:00

quarterly

*-01,04,07,10-01 00:00:00

semiannually o semi-annually

*-01,07-01 00:00:00

Tabella 20. Esempi di pianificazione
Stringa di pianificazione Alternativa Significato

mon,tue,wed,thu,fri

mon..fri

Ogni giorno lavorativo alle 0:00

sat,sun

sat..sun

Solo nei fine settimana alle 0:00

mon,wed,fri

— 

Solo lunedì, mercoledì e venerdì alle 0:00

12:05

12:05

Ogni giorno alle 12:05

*/5

0/5

Ogni cinque minuti

mon..wed 30/10

mon,tue,wed 30/10

Lunedì, martedì, mercoledì a 30, 40 e 50 minuti dopo ogni ora esatta

mon..fri 8..17,22:0/15

— 

Ogni giorno lavorativo ogni 15 minuti tra le 8:00 e le 18:00 e tra le 22:00 e le 23:00

fri 12..13:5/20

fri 12,13:5/20

Venerdì alle 12:05, 12:25, 12:45, 13:05, 13:25 e 13:45

12,14,16,18,20,22:5

12/2:5

Ogni giorno a partire dalle 12:05 fino alle 22:05, ogni 2 ore

*

*/1

Ogni minuto (intervallo minimo)

*-05

— 

Il 5° giorno di ogni mese

Sat *-1..7 15:00

— 

Primo sabato di ogni mese alle 15:00

2015-10-21

— 

21 ottobre 2015 alle 00:00

26. Appendice E: elenco vCPU QEMU

26.1. Introduzione

Questo è un elenco dei tipi di CPU AMD e Intel x86-64/amd64 definiti in QEMU, a partire dal 2007.

26.2. Tipi di CPU Intel

26.3. Tipi di CPU AMD

27. Appendice F: definizioni delle macro del firewall

Amanda

Backup Amanda

Azione proto dport sport

PARAM

udp

10080

PARAM

tcp

10080

Auth

Traffico Auth (identd)

Azione proto dport sport

PARAM

tcp

113

BGP

Traffico Border Gateway Protocol

Azione proto dport sport

PARAM

tcp

179

BitTorrent

Traffico BitTorrent per BitTorrent 3.1 e versioni precedenti

Azione proto dport sport

PARAM

tcp

6881:6889

PARAM

udp

6881

BitTorrent32

Traffico BitTorrent per BitTorrent 3.2 e versioni successive

Azione proto dport sport

PARAM

tcp

6881:6999

PARAM

udp

6881

CVS

Traffico pserver di Concurrent Versions System

Azione proto dport sport

PARAM

tcp

2401

Ceph

Traffico del cluster di storage Ceph (monitor Ceph, daemon OSD e MDS)

Azione proto dport sport

PARAM

tcp

6789

PARAM

tcp

3300

PARAM

tcp

6800:7300

Citrix

Traffico Citrix/ICA (ICA, ICA Browser, CGP)

Azione proto dport sport

PARAM

tcp

1494

PARAM

udp

1604

PARAM

tcp

2598

DAAP

Traffico Digital Audio Access Protocol (demoni iTunes, Rythmbox)

Azione proto dport sport

PARAM

tcp

3689

PARAM

udp

3689

DCC

Meccanismo di filtraggio spam Distributed Checksum Clearinghouse

Azione proto dport sport

PARAM

tcp

6277

DHCPfwd

Traffico DHCP inoltrato

Azione proto dport sport

PARAM

udp

67:68

67:68

DHCPv6

Traffico DHCPv6

Azione proto dport sport

PARAM

udp

546:547

546:547

DNS

Traffico Domain Name System (udp e tcp)

Azione proto dport sport

PARAM

udp

53

PARAM

tcp

53

Distcc

Servizio Distributed Compiler

Azione proto dport sport

PARAM

tcp

3632

FTP

File Transfer Protocol

Azione proto dport sport

PARAM

tcp

21

Finger

Protocollo Finger (RFC 742)

Azione proto dport sport

PARAM

tcp

79

GNUnet

Traffico di rete peer-to-peer sicuro GNUnet

Azione proto dport sport

PARAM

tcp

2086

PARAM

udp

2086

PARAM

tcp

1080

PARAM

udp

1080

GRE

Protocollo di tunneling Generic Routing Encapsulation

Azione proto dport sport

PARAM

47

Git

Traffico di controllo di versione distribuito Git

Azione proto dport sport

PARAM

tcp

9418

HKP

Traffico del protocollo OpenPGP HTTP key server

Azione proto dport sport

PARAM

tcp

11371

HTTP

Hypertext Transfer Protocol (WWW)

Azione proto dport sport

PARAM

tcp

80

HTTPS

Hypertext Transfer Protocol (WWW) su SSL

Azione proto dport sport

PARAM

tcp

443

ICPV2

Traffico Internet Cache Protocol V2 (Squid)

Azione proto dport sport

PARAM

udp

3130

ICQ

Traffico AOL Instant Messenger

Azione proto dport sport

PARAM

tcp

5190

IMAP

Internet Message Access Protocol

Azione proto dport sport

PARAM

tcp

143

IMAPS

Internet Message Access Protocol su SSL

Azione proto dport sport

PARAM

tcp

993

IPIP

Traffico di incapsulamento IPIP

Azione proto dport sport

PARAM

94

IPsec

Traffico IPsec

Azione proto dport sport

PARAM

udp

500

500

PARAM

50

IPsecah

Traffico di autenticazione IPsec (AH)

Azione proto dport sport

PARAM

udp

500

500

PARAM

51

IPsecnat

Traffico IPsec e Nat-Traversal

Azione proto dport sport

PARAM

udp

500

PARAM

udp

4500

PARAM

50

IRC

Traffico Internet Relay Chat

Azione proto dport sport

PARAM

tcp

6667

Jetdirect

Stampa HP Jetdirect

Azione proto dport sport

PARAM

tcp

9100

L2TP

Traffico Layer 2 Tunneling Protocol

Azione proto dport sport

PARAM

udp

1701

LDAP

Traffico Lightweight Directory Access Protocol

Azione proto dport sport

PARAM

tcp

389

LDAPS

Traffico Lightweight Directory Access Protocol sicuro

Azione proto dport sport

PARAM

tcp

636

MDNS

DNS multicast

Azione proto dport sport

PARAM

udp

5353

MSNP

Microsoft Notification Protocol

Azione proto dport sport

PARAM

tcp

1863

MSSQL

Microsoft SQL Server

Azione proto dport sport

PARAM

tcp

1433

Mail

Traffico di posta (SMTP, SMTPS, Submission)

Azione proto dport sport

PARAM

tcp

25

PARAM

tcp

465

PARAM

tcp

587

Munin

Traffico di Munin per il monitoraggio delle risorse in rete

Azione proto dport sport

PARAM

tcp

4949

MySQL

Server MySQL

Azione proto dport sport

PARAM

tcp

3306

NNTP

Traffico NNTP (Usenet).

Azione proto dport sport

PARAM

tcp

119

NNTPS

Traffico NNTP crittografato (Usenet)

Azione proto dport sport

PARAM

tcp

563

NTP

Network Time Protocol (ntpd)

Azione proto dport sport

PARAM

udp

123

NeighborDiscovery

Sollecitazione dei nodi adiacenti IPv6, annunci dei nodi adiacenti e dei router

Azione proto dport sport

PARAM

icmpv6

router-solicitation

PARAM

icmpv6

router-advertisement

PARAM

icmpv6

neighbor-solicitation

PARAM

icmpv6

neighbor-advertisement

OSPF

Traffico multicast OSPF

Azione proto dport sport

PARAM

89

OpenVPN

Traffico OpenVPN

Azione proto dport sport

PARAM

udp

1194

PCA

Symantec PCAnywere (tm)

Azione proto dport sport

PARAM

udp

5632

PARAM

tcp

5631

PMG

Interfaccia web di Proxmox Mail Gateway

Azione proto dport sport

PARAM

tcp

8006

POP3

Traffico POP3

Azione proto dport sport

PARAM

tcp

110

POP3S

Traffico POP3 crittografato

Azione proto dport sport

PARAM

tcp

995

PPtP

Point-to-Point Tunneling Protocol

Azione proto dport sport

PARAM

47

PARAM

tcp

1723

Ping

Richiesta echo ICMP

Azione proto dport sport

PARAM

icmp

echo-request

PostgreSQL

Server PostgreSQL

Azione proto dport sport

PARAM

tcp

5432

Printer

Stampa con protocollo Line Printer

Azione proto dport sport

PARAM

tcp

515

RDP

Traffico Microsoft Remote Desktop Protocol

Azione proto dport sport

PARAM

tcp

3389

RIP

Routing Information Protocol (bidirezionale)

Azione proto dport sport

PARAM

udp

520

RNDC

Protocollo di gestione remota BIND

Azione proto dport sport

PARAM

tcp

953

Razor

Sistema antispam Razor

Azione proto dport sport

PARAM

tcp

2703

Rdate

Recupero remoto dell'ora (rdate)

Azione proto dport sport

PARAM

tcp

37

Rsync

Server Rsync

Azione proto dport sport

PARAM

tcp

873

SANE

Scansione in rete SANE

Azione proto dport sport

PARAM

tcp

6566

SMB

Traffico SMB Microsoft

Azione proto dport sport

PARAM

udp

135,445

PARAM

udp

137:139

PARAM

udp

1024:65535

137

PARAM

tcp

135,139,445

SMBswat

Samba Web Administration Tool

Azione proto dport sport

PARAM

tcp

901

SMTP

Simple Mail Transfer Protocol

Azione proto dport sport

PARAM

tcp

25

SMTPS

Simple Mail Transfer Protocol cifrato

Azione proto dport sport

PARAM

tcp

465

SNMP

Simple Network Management Protocol

Azione proto dport sport

PARAM

udp

161:162

PARAM

tcp

161

SPAMD

Traffico SPAMD di Spam Assassin

Azione proto dport sport

PARAM

tcp

783

SPICEproxy

Traffico del proxy di visualizzazione SPICE di Proxmox VE

Azione proto dport sport

PARAM

tcp

3128

SSH

Traffico Secure Shell

Azione proto dport sport

PARAM

tcp

22

SVN

Server Subversion (svnserve)

Azione proto dport sport

PARAM

tcp

3690

SixXS

SixXS: implementazione di IPv6 e tunnel broker

Azione proto dport sport

PARAM

tcp

3874

PARAM

udp

3740

PARAM

41

PARAM

udp

5072,8374

Squid

Traffico del proxy web Squid

Azione proto dport sport

PARAM

tcp

3128

Submission

Traffico di invio messaggi di posta

Azione proto dport sport

PARAM

tcp

587

Syslog

Traffico del protocollo Syslog (RFC 5424)

Azione proto dport sport

PARAM

udp

514

PARAM

tcp

514

TFTP

Traffico Trivial File Transfer Protocol

Azione proto dport sport

PARAM

udp

69

Telnet

Traffico Telnet

Azione proto dport sport

PARAM

tcp

23

Telnets

Telnet su SSL

Azione proto dport sport

PARAM

tcp

992

Time

Protocollo Time RFC 868

Azione proto dport sport

PARAM

tcp

37

Trcrt

Traffico Traceroute (fino a 30 hop)

Azione proto dport sport

PARAM

udp

33434:33524

PARAM

icmp

echo-request

VNC

Traffico VNC per i display VNC da 0 a 99

Azione proto dport sport

PARAM

tcp

5900:5999

VNCL

Traffico VNC dai server VNC ai viewer VNC in modalità listen

Azione proto dport sport

PARAM

tcp

5500

Web

Traffico WWW (HTTP e HTTPS)

Azione proto dport sport

PARAM

tcp

80

PARAM

tcp

443

Webcache

Traffico Web Cache/Proxy (porta 8080)

Azione proto dport sport

PARAM

tcp

8080

Webmin

Traffico Webmin

Azione proto dport sport

PARAM

tcp

10000

Whois

Traffico Whois (nicname, RFC 3912)

Azione proto dport sport

PARAM

tcp

43

28. Appendice G: introduzione a Markdown

Markdown è uno strumento di conversione da testo a HTML per chi scrive contenuti web. Markdown consente di scrivere utilizzando un formato di testo semplice, facile da leggere e da scrivere, per poi convertirlo in XHTML (o HTML) strutturalmente valido.

https://daringfireball.net/projects/markdown/
— John Gruber

L'interfaccia web di Proxmox VE supporta l'utilizzo di Markdown per la visualizzazione di testo formattato nelle note dei nodi e dei guest virtuali.

Proxmox VE supporta CommonMark con la maggior parte delle estensioni di GFM (GitHub Flavoured Markdown), come tabelle o elenchi di attività.

28.1. Nozioni di base su Markdown

Si noti che qui vengono descritte solo le nozioni di base; si consiglia di cercare in rete risorse più complete, ad esempio su https://www.markdownguide.org/

28.1.1. Intestazioni

# This is a Heading h1
## This is a Heading h2
##### This is a Heading h5

28.1.2. Enfasi

Utilizzare *testo* oppure _testo_ per l'enfasi.

Utilizzare **testo** oppure __testo__ per testo in grassetto, con peso maggiore.

Sono possibili anche delle combinazioni, ad esempio:

_You **can** combine them_

È possibile utilizzare il rilevamento automatico dei collegamenti; ad esempio, https://forum.proxmox.com/ verrebbe trasformato in un collegamento cliccabile.

È anche possibile controllare il testo del collegamento, ad esempio:

Now, [the part in brackets will be the link text](https://forum.proxmox.com/).

28.1.4. Elenchi

Elenchi non ordinati

Utilizzare * oppure - per gli elenchi non ordinati, ad esempio:

* Item 1
* Item 2
* Item 2a
* Item 2b

L'aggiunta di un'indentazione può essere utilizzata per creare elenchi nidificati.

Elenchi ordinati
1. Item 1
1. Item 2
1. Item 3
  1. Item 3a
  1. Item 3b
Note Il numero intero degli elenchi ordinati non deve essere necessariamente corretto: gli elenchi verranno numerati automaticamente.
Elenchi di attività

Gli elenchi di attività utilizzano una casella vuota [ ] per le attività non completate e una casella con una X per le attività completate.

Ad esempio:

- [X] First task already done!
- [X] Second one too
- [ ] This one is still to-do
- [ ] So is this one

28.1.5. Tabelle

Le tabelle utilizzano il simbolo della pipe | per separare le colonne e - per separare l'intestazione della tabella dal corpo della tabella; in quella separazione è anche possibile impostare l'allineamento del testo, rendendo una colonna allineata a sinistra, al centro o a destra.

| Left columns  | Right columns |  Some  | More | Cols.| Centering Works Too
| ------------- |--------------:|--------|------|------|:------------------:|
| left foo      | right foo     | First  | Row  | Here | >center<           |
| left bar      | right bar     | Second | Row  | Here | 12345              |
| left baz      | right baz     | Third  | Row  | Here | Test               |
| left zab      | right zab     | Fourth | Row  | Here | ☁️☁️☁️              |
| left rab      | right rab     | And    | Last | Here | The End            |

Si noti che non è necessario allineare le colonne in modo ordinato con gli spazi, ma farlo semplifica la modifica delle tabelle.

28.1.6. Citazioni

È possibile inserire citazioni facendo precedere una riga da >, in modo simile a quanto avviene nelle email in testo semplice.

> Markdown is a lightweight markup language with plain-text-formatting syntax,
> created in 2004 by John Gruber with Aaron Swartz.
>
>> Markdown is often used to format readme files, for writing messages in online discussion forums,
>> and to create rich text using a plain text editor.

28.1.7. Codice e snippet

È possibile utilizzare gli apici inversi per evitare l'elaborazione di alcune parole o paragrafi. Ciò è utile per evitare che un blocco di codice o di configurazione venga erroneamente interpretato come markdown.

Codice inline

Racchiudere parte di una riga tra singoli backtick permette di scrivere codice in linea, per esempio:

This hosts IP address is `10.0.0.1`.
Intere porzioni di codice

Per blocchi di codice che si estendono su più righe è possibile usare tripli backtick per iniziare e terminare tale blocco, ad esempio:

```
# This is the network config I want to remember here
auto vmbr2
iface vmbr2 inet static
        address 10.0.0.1/24
        bridge-ports ens20
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

```

29. Appendice H: GNU Free Documentation License

Versione 1.3, 3 novembre 2008

Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
    <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE

Lo scopo di questa Licenza è rendere un manuale, un libro di testo o altro documento funzionale e utile "libero" nel senso della libertà: garantire a chiunque l'effettiva libertà di copiarlo e ridistribuirlo, con o senza modifiche, sia a scopo commerciale che non commerciale. In secondo luogo, questa Licenza preserva per l'autore e l'editore un modo per ottenere credito per il proprio lavoro, senza essere considerati responsabili per le modifiche apportate da altri.

Questa Licenza è un tipo di "copyleft", il che significa che le opere derivate dal documento devono a loro volta essere libere nello stesso senso. Essa integra la GNU General Public License, che è una licenza copyleft progettata per il software libero.

Questa Licenza è stata progettata per essere utilizzata per manuali di software libero, poiché il software libero necessita di documentazione libera: un programma libero dovrebbe essere accompagnato da manuali che offrono le stesse libertà del software stesso. Tuttavia questa Licenza non è limitata ai manuali software; può essere utilizzata per qualsiasi opera testuale, indipendentemente dall'argomento o dal fatto che sia pubblicata come libro stampato. Si raccomanda questa Licenza principalmente per opere il cui scopo è istruttivo o di consultazione.

1. APPLICABILITY AND DEFINITIONS

Questa Licenza si applica a qualsiasi manuale o altra opera, in qualsiasi formato, che contenga una nota apposta dal titolare del copyright che indichi che può essere distribuita secondo i termini di questa Licenza. Tale nota concede una licenza mondiale, gratuita, di durata illimitata, per utilizzare tale opera secondo le condizioni qui indicate. Il "Documento", di seguito, si riferisce a qualsiasi manuale o opera di questo tipo. Qualsiasi membro del pubblico è un licenziatario ed è indicato come "utente". L'accettazione della licenza avviene copiando, modificando o distribuendo l'opera in un modo che richiede un'autorizzazione secondo la legge sul copyright.

Una "Versione Modificata" del Documento indica qualsiasi opera contenente il Documento o una sua parte, copiata letteralmente, oppure con modifiche e/o tradotta in un'altra lingua.

Una "Sezione Secondaria" è un'appendice denominata o una sezione introduttiva del Documento che tratta esclusivamente del rapporto tra gli editori o gli autori del Documento e l'argomento generale del Documento (o argomenti correlati) e non contiene nulla che possa rientrare direttamente in tale argomento generale. (Quindi, se il Documento è in parte un libro di testo di matematica, una Sezione Secondaria non può trattare alcun argomento di matematica.) Il rapporto potrebbe riguardare un collegamento storico con l'argomento o con argomenti correlati, oppure una posizione legale, commerciale, filosofica, etica o politica nei loro confronti.

Le "Sezioni Invarianti" sono determinate Sezioni Secondarie i cui titoli sono indicati, come Sezioni Invarianti, nella nota che afferma che il Documento è distribuito secondo questa Licenza. Se una sezione non corrisponde alla definizione di Sezione Secondaria sopra riportata, non può essere indicata come Invariante. Il Documento può contenere zero Sezioni Invarianti. Se il Documento non identifica alcuna Sezione Invariante, allora non ve ne sono.

I "Testi di Copertina" sono determinati brevi passaggi di testo elencati, come Testi di Prima Copertina o Testi di Quarta Copertina, nella nota che afferma che il Documento è distribuito secondo questa Licenza. Un Testo di Prima Copertina può essere di massimo 5 parole, e un Testo di Quarta Copertina può essere di massimo 25 parole.

Una copia "Trasparente" del Documento indica una copia leggibile da computer, rappresentata in un formato la cui specifica è disponibile al pubblico in generale, adatta alla revisione diretta del documento con editor di testo generici o (per immagini composte da pixel) programmi di grafica generici o (per disegni) un editor di disegno ampiamente disponibile, e adatta come input per formattatori di testo o per la traduzione automatica in una varietà di formati adatti come input per formattatori di testo. Una copia realizzata in un formato di file altrimenti Trasparente il cui markup, o assenza di markup, sia stato predisposto per ostacolare o scoraggiare modifiche successive da parte dei lettori non è Trasparente. Un formato immagine non è Trasparente se utilizzato per una quantità sostanziale di testo. Una copia che non è "Trasparente" viene chiamata "Opaca".

Esempi di formati adeguati per copie Trasparenti includono ASCII puro senza markup, il formato di input Texinfo, il formato di input LaTeX, SGML o XML che utilizzano una DTD disponibile pubblicamente e semplici formati HTML, PostScript o PDF conformi agli standard e progettati per essere modificati da persone. Esempi di formati di immagine trasparenti includono PNG, XCF e JPG. I formati Opachi includono formati proprietari che possono essere letti e modificati solo da elaboratori di testo proprietari, SGML o XML per i quali la DTD e/o gli strumenti di elaborazione non sono generalmente disponibili e HTML, PostScript o PDF generati automaticamente da alcuni elaboratori di testo esclusivamente a scopo di output.

Il "Frontespizio" indica, per un libro stampato, il frontespizio stesso, più le pagine successive necessarie a contenere, in modo leggibile, il materiale che la presente Licenza richiede sia riportato nel frontespizio. Per le opere in formati che non hanno un frontespizio vero e proprio, "Frontespizio" indica il testo vicino al punto in cui il titolo dell'opera compare con maggiore risalto, prima dell'inizio del corpo del testo.

L'"editore" indica qualsiasi persona o entità che distribuisce copie del Documento al pubblico.

Una sezione "Denominata XYZ" indica una sottounità del Documento il cui titolo è precisamente XYZ oppure contiene XYZ tra parentesi a seguito di un testo che traduce XYZ in un'altra lingua. (Qui XYZ sta per un nome di sezione specifico indicato di seguito, come "Riconoscimenti", "Dediche", "Approvazioni" o "Cronologia".) "Conservare il titolo" di una tale sezione, quando si modifica il Documento, significa che essa rimane una sezione "Denominata XYZ" secondo questa definizione.

Il Documento può includere Dichiarazioni di non responsabilità sulla garanzia accanto alla nota che indica che questa Licenza si applica al Documento. Tali Dichiarazioni di non responsabilità sulla garanzia si considerano incluse per riferimento in questa Licenza, ma solo per quanto riguarda la rinuncia alle garanzie: qualsiasi altra implicazione che tali Dichiarazioni di non responsabilità sulla garanzia possano avere è nulla e non ha alcun effetto sul significato di questa Licenza.

2. VERBATIM COPYING

È possibile copiare e distribuire il Documento su qualsiasi supporto, sia commercialmente che non commercialmente, a condizione che questa Licenza, le note di copyright e la nota di licenza che indica che questa Licenza si applica al Documento siano riprodotte in tutte le copie, e che non vengano aggiunte altre condizioni oltre a quelle di questa Licenza. Non è possibile utilizzare misure tecniche per ostacolare o controllare la lettura o l'ulteriore copia delle copie realizzate o distribuite. È tuttavia possibile accettare un compenso in cambio delle copie. Se si distribuisce un numero abbastanza elevato di copie, è necessario seguire anche le condizioni indicate nella sezione 3.

È inoltre possibile prestare copie, alle stesse condizioni indicate sopra, e mostrare pubblicamente le copie.

3. COPYING IN QUANTITY

Se si pubblicano copie stampate (o copie su supporti che comunemente hanno copertine stampate) del Documento, in numero superiore a 100, e la nota di licenza del Documento richiede Testi di copertina, è necessario racchiudere le copie in copertine che riportino, chiaramente e leggibilmente, tutti questi Testi di copertina: i Testi di copertina anteriore sulla copertina anteriore e i Testi di copertina posteriore sulla copertina posteriore. Entrambe le copertine devono inoltre identificare chiaramente e leggibilmente chi pubblica tali copie come loro editore. La copertina anteriore deve presentare il titolo completo con tutte le parole del titolo ugualmente in evidenza e visibili. È possibile aggiungere altro materiale sulle copertine, in aggiunta. La copia con modifiche limitate alle copertine, purché venga conservato il titolo del Documento e siano soddisfatte queste condizioni, può essere considerata come copia letterale per tutti gli altri aspetti.

Se i testi richiesti per una delle due copertine sono troppo lunghi per essere riportati in modo leggibile, si dovrebbero inserire sulla copertina stessa i primi testi elencati (quanti è ragionevolmente possibile farvi stare) e riportare i restanti sulle pagine adiacenti.

Se si pubblicano o distribuiscono copie Opache del Documento in numero superiore a 100, è necessario includere una copia Trasparente leggibile dal computer insieme a ciascuna copia Opaca, oppure indicare in o con ciascuna copia Opaca un indirizzo di rete dal quale il pubblico generale che utilizza la rete possa accedere per scaricare, utilizzando protocolli di rete standard pubblici, una copia Trasparente completa del Documento, priva di materiale aggiunto. Se si utilizza quest'ultima opzione, è necessario adottare misure ragionevolmente prudenti, quando si inizia la distribuzione di copie Opache in quantità, per garantire che tale copia Trasparente rimanga accessibile in tal modo nella posizione indicata per almeno un anno dopo l'ultima volta in cui viene distribuita una copia Opaca (direttamente o tramite agenti o rivenditori) di tale edizione al pubblico.

Si richiede, ma non è obbligatorio, di contattare gli autori del Documento ben prima di ridistribuire un numero elevato di copie, per dare loro la possibilità di fornire una versione aggiornata del Documento.

4. MODIFICATIONS

È possibile copiare e distribuire una Versione modificata del Documento alle condizioni delle sezioni 2 e 3 precedenti, a condizione che la Versione modificata venga rilasciata precisamente sotto questa Licenza, con la Versione modificata che assume il ruolo del Documento, concedendo quindi in licenza la distribuzione e la modifica della Versione modificata a chiunque possieda una copia di essa. Inoltre, è necessario compiere le seguenti azioni nella Versione modificata:

  1. Utilizzare nella Pagina del titolo (e sulle copertine, se presenti) un titolo distinto da quello del Documento e da quelli delle versioni precedenti (che dovrebbero, se ve ne sono state, essere elencate nella sezione Cronologia del Documento). È possibile utilizzare lo stesso titolo di una versione precedente se l'editore originale di tale versione concede il permesso.

  2. Elencare nella Pagina del titolo, come autori, una o più persone o entità responsabili della paternità delle modifiche nella Versione modificata, insieme ad almeno cinque degli autori principali del Documento (tutti i suoi autori principali, se sono meno di cinque), a meno che questi ultimi non concedano un'esenzione da tale obbligo.

  3. Indicare nella Pagina del titolo il nome dell'editore della Versione modificata, come editore.

  4. Conservare tutte le note di copyright del Documento.

  5. Aggiungere un'adeguata nota di copyright per le proprie modifiche accanto alle altre note di copyright.

  6. Includere, immediatamente dopo le note di copyright, una nota di licenza che conceda al pubblico il permesso di utilizzare la Versione modificata secondo i termini di questa Licenza, nella forma indicata nell'Appendice seguente.

  7. Conservare in tale nota di licenza gli elenchi completi delle Sezioni invariabili e dei Testi di copertina richiesti indicati nella nota di licenza del Documento.

  8. Includere una copia non modificata di questa Licenza.

  9. Conservare la sezione Denominata "Cronologia", conservare il suo Titolo e aggiungere ad essa una voce che indichi almeno il titolo, l'anno, i nuovi autori e l'editore della Versione modificata, come indicato nella Pagina del titolo. Se non esiste una sezione Denominata "Cronologia" nel Documento, crearne una che indichi il titolo, l'anno, gli autori e l'editore del Documento come indicato nella sua Pagina del titolo, quindi aggiungere una voce che descriva la Versione modificata come indicato nella frase precedente.

  10. Mantenere la posizione di rete, se presente, indicata nel Documento per l'accesso pubblico a una copia Trasparente del Documento, e allo stesso modo le posizioni di rete indicate nel Documento per le versioni precedenti su cui era basato. Queste possono essere inserite nella sezione "Cronologia". È possibile omettere una posizione di rete per un'opera pubblicata almeno quattro anni prima del Documento stesso, oppure se l'editore originale della versione a cui si riferisce concede il permesso.

  11. Per qualsiasi sezione intitolata "Riconoscimenti" o "Dediche", mantenere il Titolo della sezione e preservare in essa tutta la sostanza e il tono di ciascun riconoscimento e/o dedica ai contributori riportati al suo interno.

  12. Mantenere tutte le Sezioni Invarianti del Documento, senza alterazioni nel testo e nei titoli. I numeri di sezione o equivalenti non sono considerati parte dei titoli delle sezioni.

  13. Eliminare qualsiasi sezione intitolata "Approvazioni". Tale sezione non può essere inclusa nella Versione Modificata.

  14. Non modificare il titolo di alcuna sezione esistente in "Approvazioni" né assegnarle un titolo in conflitto con quello di una qualsiasi sezione invariante.

  15. Mantenere eventuali esclusioni di garanzia.

Se la Versione Modificata include nuove sezioni introduttive o appendici che si qualificano come Sezioni Secondarie e non contengono materiale copiato dal Documento, è possibile, a propria discrezione, designare alcune o tutte queste sezioni come invarianti. Per fare ciò, aggiungere i loro titoli all'elenco delle Sezioni Invarianti nell'avviso di licenza della Versione Modificata. Questi titoli devono essere distinti da qualsiasi altro titolo di sezione.

È possibile aggiungere una sezione intitolata "Approvazioni", a condizione che non contenga altro che approvazioni della propria Versione Modificata da parte di varie parti — ad esempio, dichiarazioni di revisione paritaria o che il testo sia stato approvato da un'organizzazione come definizione autorevole di uno standard.

È possibile aggiungere un passaggio di massimo cinque parole come Testo di Copertina Anteriore e un passaggio di massimo 25 parole come Testo di Copertina Posteriore, alla fine dell'elenco dei Testi di Copertina nella Versione Modificata. Solo un passaggio di Testo di Copertina Anteriore e uno di Testo di Copertina Posteriore possono essere aggiunti da (o tramite accordi presi da) una singola entità. Se il Documento include già un testo di copertina per la stessa copertina, precedentemente aggiunto dall'utente o tramite accordo preso dalla stessa entità per conto della quale si agisce, non è possibile aggiungerne un altro; ma è possibile sostituire quello vecchio, previo permesso esplicito dell'editore precedente che ha aggiunto quello vecchio.

Gli autori e gli editori del Documento non concedono, con questa Licenza, il permesso di utilizzare i loro nomi per pubblicizzare qualsiasi Versione Modificata o per affermare o suggerire che tale versione abbia la loro approvazione.

5. COMBINING DOCUMENTS

È possibile combinare il Documento con altri documenti rilasciati sotto questa Licenza, secondo i termini definiti nella sezione 4 precedente per le versioni modificate, a condizione che siano incluse nella combinazione tutte le Sezioni Invarianti di tutti i documenti originali, non modificate, e che vengano elencate tutte come Sezioni Invarianti della propria opera combinata nel relativo avviso di licenza, e che vengano mantenute tutte le loro Dichiarazioni di Non Garanzia.

È sufficiente che l'opera combinata contenga una copia di questa Licenza, e più Sezioni Invarianti identiche possono essere sostituite da una singola copia. Se sono presenti più Sezioni Invarianti con lo stesso nome ma contenuti diversi, rendere unico il titolo di ciascuna di tali sezioni aggiungendo alla fine, tra parentesi, il nome dell'autore o dell'editore originale di quella sezione, se noto, oppure un numero univoco. Apportare lo stesso adeguamento ai titoli delle sezioni nell'elenco delle Sezioni Invarianti nell'avviso di licenza dell'opera combinata.

Nella combinazione, è necessario combinare tutte le sezioni intitolate "Cronologia" nei vari documenti originali, formando un'unica sezione intitolata "Cronologia"; allo stesso modo combinare tutte le sezioni intitolate "Riconoscimenti", e tutte le sezioni intitolate "Dediche". È necessario eliminare tutte le sezioni intitolate "Approvazioni".

6. COLLECTIONS OF DOCUMENTS

È possibile creare una raccolta costituita dal Documento e da altri documenti rilasciati sotto questa Licenza, e sostituire le copie individuali di questa Licenza nei vari documenti con una singola copia inclusa nella raccolta, a condizione che vengano seguite le regole di questa Licenza per la copia letterale di ciascuno dei documenti in tutti gli altri aspetti.

È possibile estrarre un singolo documento da tale raccolta e distribuirlo individualmente sotto questa Licenza, a condizione che venga inserita una copia di questa Licenza nel documento estratto e che venga seguita questa Licenza in tutti gli altri aspetti relativi alla copia letterale di tale documento.

7. AGGREGATION WITH INDEPENDENT WORKS

Una compilazione del Documento o dei suoi derivati con altri documenti o opere separati e indipendenti, in o su un volume di un supporto di archiviazione o distribuzione, è chiamata "raccolta aggregata" se il copyright risultante dalla compilazione non viene utilizzato per limitare i diritti legali degli utenti della compilazione oltre a quanto consentito dalle singole opere. Quando il Documento è incluso in una raccolta aggregata, questa Licenza non si applica alle altre opere nella raccolta aggregata che non sono esse stesse opere derivate del Documento.

Se il requisito relativo al testo di copertina della sezione 3 è applicabile a queste copie del Documento, allora, se il Documento costituisce meno della metà dell'intera raccolta aggregata, i testi di copertina del Documento possono essere collocati su copertine che racchiudono il Documento all'interno della raccolta aggregata, oppure sull'equivalente elettronico delle copertine se il Documento è in formato elettronico. Altrimenti devono apparire su copertine stampate che racchiudono l'intera raccolta aggregata.

8. TRANSLATION

La traduzione è considerata un tipo di modifica, pertanto è possibile distribuire traduzioni del Documento secondo i termini della sezione 4. La sostituzione delle Sezioni non modificabili con traduzioni richiede un'autorizzazione speciale da parte dei rispettivi titolari del copyright, ma è possibile includere traduzioni di alcune o di tutte le Sezioni non modificabili in aggiunta alle versioni originali di tali Sezioni non modificabili. È possibile includere una traduzione della presente Licenza, e di tutte le note di licenza presenti nel Documento, nonché di eventuali Dichiarazioni di non responsabilità sulla garanzia, a condizione che venga inclusa anche la versione originale in inglese della presente Licenza e le versioni originali di tali note e dichiarazioni di non responsabilità. In caso di discordanza tra la traduzione e la versione originale della presente Licenza o di una nota o dichiarazione di non responsabilità, prevarrà la versione originale.

Se una sezione del Documento è intitolata "Riconoscimenti", "Dediche" o "Cronologia", il requisito (sezione 4) di conservarne il Titolo (sezione 1) richiederà in genere la modifica del titolo stesso.

9. TERMINATION

Non è consentito copiare, modificare, concedere in sublicenza o distribuire il Documento se non come espressamente previsto dalla presente Licenza. Qualsiasi altro tentativo di copiarlo, modificarlo, concederlo in sublicenza o distribuirlo è nullo e comporterà l'automatica cessazione dei diritti concessi dalla presente Licenza.

Tuttavia, in caso di cessazione di ogni violazione della presente Licenza, la licenza concessa da un determinato titolare del copyright viene ripristinata (a) a titolo provvisorio, a meno che e fino a quando tale titolare del copyright non revochi in via definitiva ed esplicita la licenza, e (b) in via permanente, qualora il titolare del copyright non notifichi la violazione con mezzi ragionevoli entro 60 giorni dalla cessazione.

Inoltre, la licenza concessa da un determinato titolare del copyright viene ripristinata in via permanente se tale titolare del copyright notifica la violazione con mezzi ragionevoli, se si tratta della prima notifica di violazione della presente Licenza (per qualsiasi opera) ricevuta da tale titolare del copyright, e se la violazione viene sanata entro 30 giorni dal ricevimento della notifica.

La cessazione dei diritti del licenziatario ai sensi della presente sezione non comporta la cessazione delle licenze delle parti che hanno ricevuto copie o diritti dal licenziatario ai sensi della presente Licenza. Qualora i diritti del licenziatario siano cessati e non siano stati ripristinati in via permanente, il ricevimento di una copia di una parte o della totalità dello stesso materiale non conferisce al licenziatario alcun diritto di utilizzarlo.

10. FUTURE REVISIONS OF THIS LICENSE

La Free Software Foundation può pubblicare di volta in volta nuove versioni riviste della GNU Free Documentation License. Tali nuove versioni saranno simili nello spirito alla presente versione, ma potranno differire nei dettagli per affrontare nuovi problemi o esigenze. Si veda http://www.gnu.org/copyleft/.

A ciascuna versione della Licenza viene attribuito un numero di versione distintivo. Se il Documento specifica che si applica una particolare versione numerata della presente Licenza "o qualsiasi versione successiva", è possibile scegliere di seguire i termini e le condizioni di tale versione specificata oppure di qualsiasi versione successiva pubblicata (non in forma di bozza) dalla Free Software Foundation. Se il Documento non specifica un numero di versione della presente Licenza, è possibile scegliere qualsiasi versione pubblicata (non in forma di bozza) dalla Free Software Foundation. Se il Documento specifica che un soggetto delegato può decidere quali versioni future della presente Licenza possano essere utilizzate, la dichiarazione pubblica di accettazione di una versione da parte di tale soggetto delegato autorizza in via permanente a scegliere tale versione per il Documento.

11. RELICENSING

"Sito di collaborazione multiautore di massa" (o "Sito MMC") indica qualsiasi server del World Wide Web che pubblica opere tutelabili dal diritto d'autore e che offre altresì strumenti ben visibili che consentono a chiunque di modificare tali opere. Un wiki pubblico modificabile da chiunque è un esempio di tale server. Una "Collaborazione multiautore di massa" (o "MMC") contenuta nel sito indica qualsiasi insieme di opere tutelabili dal diritto d'autore in tal modo pubblicate sul sito MMC.

"CC-BY-SA" indica la licenza Creative Commons Attribuzione-Condividi allo stesso modo 3.0 pubblicata da Creative Commons Corporation, una società senza scopo di lucro con sede principale a San Francisco, California, nonché le future versioni copyleft di tale licenza pubblicate dalla medesima organizzazione.

"Incorporare" significa pubblicare o ripubblicare un Documento, in tutto o in parte, come parte di un altro Documento.

Una MMC è "idonea per la rilicenziazione" se concessa in licenza ai sensi della presente Licenza, e se tutte le opere pubblicate per la prima volta ai sensi della presente Licenza in un luogo diverso da tale MMC, e successivamente incorporate in tutto o in parte nella MMC, (1) non presentavano testi di copertina né sezioni non modificabili, e (2) sono state così incorporate prima del 1° novembre 2008.

Il gestore di un Sito MMC può ripubblicare una MMC contenuta nel sito ai sensi della licenza CC-BY-SA sul medesimo sito in qualsiasi momento prima del 1° agosto 2009, a condizione che la MMC sia idonea per la rilicenziazione.