Lab 07 – Prima VM e primo container
Dipendenze
Sezione intitolata “Dipendenze”- Lab precedenti: Lab 06: cluster
deso-clustercon tre nodi. - Servizi: proxy
proxy.proxmox.community:3128per scaricare ISO e template, DNS172.27.199.20. - Indirizzi:
172.27.199.100per la VM e172.27.199.101per il container, dalla fascia riservata ai guest dei lab (Appendice B). - Credenziali:
root/<password-lab>→ Appendice B.
Obiettivi
Sezione intitolata “Obiettivi”- Scaricare una ISO direttamente sul nodo, verificandone l’impronta SHA-256.
- Creare una macchina virtuale con la procedura guidata e capire ogni scheda.
- Installare Debian 13 nella VM dalla console dell’interfaccia web.
- Scaricare un template e creare un container LXC.
- Verificare rete e accesso a Internet di VM e container.
Come funziona
Sezione intitolata “Come funziona”VM e container
Sezione intitolata “VM e container”Proxmox VE esegue due tipi di guest:
| Macchina virtuale (VM) | Container (CT) | |
|---|---|---|
| Tecnologia | KVM e QEMU: hardware virtuale completo | LXC: processi isolati sul kernel del nodo |
| Sistema operativo | qualsiasi (Linux, Windows, BSD…) con il suo kernel | solo Linux, condivide il kernel del nodo |
| Avvio da | ISO o immagine disco, con un installer | template già pronto, in pochi secondi |
| Isolamento | massimo | buono, ma il kernel è condiviso |
| Risorse | più memoria e disco | molto leggeri |
| Comandi | qm |
pct |
VM e container condividono gli ID (VMID) a livello di cluster: lo stesso numero non può essere usato due volte. Nel manuale usiamo una convenzione semplice: il guest con ID 1xx ha indirizzo 172.27.199.1xx.
Gli storage del nodo
Sezione intitolata “Gli storage del nodo”Un’installazione su ZFS crea due storage locali:
local, una directory (/var/lib/vz) per i file: ISO intemplate/iso, template dei container intemplate/cache, backup;local-zfs, un pool ZFS per i dischi di VM e container: ogni disco è un zvol (VM) o un dataset (container).
Sono storage locali: una ISO scaricata su desopve01 non si vede su desopve02. Gli storage condivisi arrivano nel percorso A.
Download dal nodo
Sezione intitolata “Download dal nodo”Download from URL fa scaricare il file direttamente al nodo, passando dal proxy del datacenter (lab 04), invece di caricarlo dal tuo browser. Se indichi l’impronta del file, il nodo la verifica e scarta il download se non corrisponde.
Procedura
Sezione intitolata “Procedura”1. Scaricare la ISO di Debian
Sezione intitolata “1. Scaricare la ISO di Debian”-
Leggi l’impronta della ISO netinst corrente dal file
SHA256SUMSpubblicato da Debian. Dal domain controller il browser non esce su Internet, quindi scaricalo dal nodo tramite il proxy, nella Shell didesopve01o in SSH:root@desopve01 curl -s -x http://proxy.proxmox.community:3128 https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA256SUMS | grep netinstOutput a7ef94ac2fb9a7fec454552abd629b7cc9d5155c886165a45649f5ce6167e355 debian-13.7.0-amd64-netinst.isod33ed0c64bde5ff43445c0c530f9da599954d8585771c55345cb840d7997d4a7 debian-edu-13.7.0-amd64-netinst.isod6d4e0d038936230229a66b7c1765452e73c72a962e79dbb99544882295271e8 debian-mac-13.7.0-amd64-netinst.isoTi serve la prima riga, quella di
debian-13.7.0-amd64-netinst.iso. Quando Debian pubblica una versione successiva, la cartellacurrent/contiene la nuova ISO: usa il nome e l’impronta che leggi nel file (le versioni precedenti restano inhttps://cdimage.debian.org/cdimage/archive/). -
Nell’interfaccia web seleziona lo storage
local (desopve01)→ ISO Images → Download from URL. -
Incolla l’URL
https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.7.0-amd64-netinst.isoe premi Query URL: compaiono nome, dimensione e tipo del file. -
Spunta Advanced, scegli Hash algorithm
SHA-256e incolla l’impronta in Checksum.
-
Premi Download. Il log del task termina con la verifica dell’impronta:
2026-11-09 12:48:27 (56.9 MB/s) - '/var/lib/vz/template/iso/debian-13.7.0-amd64-netinst.iso.tmp_dwnl.8549' saved [792723456/792723456]calculating checksum...OK, checksum verifieddownload of 'https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.7.0-amd64-netinst.iso' to '/var/lib/vz/template/iso/debian-13.7.0-amd64-netinst.iso' finishedTASK OK
2. Creare la VM
Sezione intitolata “2. Creare la VM”Premi Create VM in alto a destra. La procedura guidata ha otto schede.
-
General. Il Node è quello su cui creerai la VM (
desopve01), il VM ID proposto è il primo libero (100). Come Name usadebian01.
-
OS. Scegli Use CD/DVD disc image file (iso), storage
local, ISOdebian-13.7.0-amd64-netinst.iso. Il Guest OS (Linux, kernel7.x - 2.6) serve a Proxmox VE per scegliere i valori predefiniti migliori.
-
System. Lascia i valori predefiniti: scheda video
Default, macchinai440fx, firmwareSeaBIOS, controller dei dischi VirtIO SCSI single. L’opzione Qemu Agent la attiverai nel lab 38. -
Disks. Disco
scsi0sullo storagelocal-zfs, Disk size16GiB. IO thread è già attivo: il disco ha un suo thread di I/O (lab 37).
-
CPU. Cores
2. Il Type predefinito,x86-64-v2-AES, è un modello di CPU generico che permette di migrare la VM tra nodi con processori diversi (lab 35).
-
Memory. Lascia
2048MiB. -
Network. Bridge
vmbr0, modello VirtIO (paravirtualized), firewall attivo: la VM è collegata alla rete di gestione come un server fisico allo switch.
-
Confirm. Il riepilogo mostra i parametri che verranno passati all’API. Lascia spento Start after created e premi Finish.

La VM 100 (debian01) compare nell’albero sotto desopve01. La sua configurazione è un semplice file di testo, /etc/pve/qemu-server/100.conf, condiviso nel cluster:
qm config 100boot: order=scsi0;ide2;net0cores: 2cpu: x86-64-v2-AESide2: local:iso/debian-13.7.0-amd64-netinst.iso,media=cdrom,size=756Mmemory: 2048meta: creation-qemu=11.1.3,ctime=1794225060name: debian01net0: virtio=BC:24:11:2B:FF:8A,bridge=vmbr0,firewall=1numa: 0ostype: l26scsi0: local-zfs:vm-100-disk-0,iothread=1,size=16Gscsihw: virtio-scsi-singlesmbios1: uuid=ce65e842-1c38-47f2-9112-da688d1a8025sockets: 1vmgenid: f52461b5-dbdf-4245-83ba-9897b7d1eacdL’ordine di avvio (boot) prova prima il disco e poi il CD: finché il disco è vuoto la VM parte dalla ISO, dopo l’installazione parte dal disco.
3. Installare Debian dalla console
Sezione intitolata “3. Installare Debian dalla console”-
Seleziona la VM, premi Start e apri Console: è la schermata della VM nel browser (noVNC). Nel menu scegli Install (l’installer in modalità testo) e premi Invio.

-
Rispondi alle domande dell’installer:
Domanda Risposta Language EnglishLocation other→Europe→ItalyLocale United States – en_US.UTF-8Keymap ItalianConfigurazione della rete il DHCP non risponde (nella rete del laboratorio non c’è): Cancel, poi Configure network manually IP address 172.27.199.100/24Gateway 172.27.199.1(proposto)Name server 172.27.199.20Hostname / Domain debian01/proxmox.communityRoot password <password-lab>Utente nome completo Lab User, usernamelabuser, password<password-lab>Ora da Internet l’installer prova a contattare un server NTP pubblico: Cancel Partitioning Guided – use entire disk, disco QEMU HARDDISKda 17.2 GB, All files in one partition, conferma con YesPackage manager mirror in Italia, deb.debian.orgHTTP proxy http://proxy.proxmox.community:3128Popularity contest No Software solo SSH server e standard system utilities GRUB Yes, sul disco /dev/sdaIl disco si presenta come
QEMU HARDDISK: è il disco virtuale che Proxmox VE espone alla VM. Le schermate più importanti sono queste:


-
Quando l’installer chiede di riavviare, premi Continue. La VM riparte dal disco e mostra il login.

-
Scollega la ISO dalla VM. La stessa impostazione, nella GUI, è in Hardware → CD/DVD Drive → Do not use any media:
root@desopve01 qm set 100 --ide2 none,media=cdromOutput update VM 100: -ide2 none,media=cdrom -
Il Summary della VM mostra stato, nodo, utilizzo di CPU, memoria e disco.

4. Scaricare il template di un container
Sezione intitolata “4. Scaricare il template di un container”-
Seleziona lo storage
local (desopve02)→ CT Templates → Templates. L’elenco contiene i template ufficiali di Proxmox: sistemi operativi (system) e applicazioni pronte (turnkeylinux). -
Cerca
debian-13, seleziona debian-13-standard e premi Download.
Anche qui il nodo verifica l’impronta del file:
calculating checksum...OK, checksum verifieddownload of 'http://download.proxmox.com/images/system/debian-13-standard_13.6-1_amd64.tar.zst' to '/var/lib/vz/template/cache/debian-13-standard_13.6-1_amd64.tar.zst' finishedTASK OK
5. Creare il container
Sezione intitolata “5. Creare il container”Premi Create CT.
-
General. Node
desopve02: dall’interfaccia di un nodo puoi creare guest su qualsiasi nodo del cluster. Poi CT ID101, Hostnamedebian-ct01e la password dirootdel container. Unprivileged container è attivo: l’utenterootdel container corrisponde a un utente senza privilegi sul nodo, che è l’impostazione sicura (lab 41).
-
Template. Storage
local, templatedebian-13-standard_13.6-1_amd64.tar.zst. -
Disks. Root disk su
local-zfs,8GiB. -
CPU e Memory.
1core,1024MiB di memoria e512MiB di swap. -
Network.
eth0sul bridgevmbr0, IPv4 statico172.27.199.101/24, gateway172.27.199.1.
-
DNS. Lascia i campi vuoti: il container usa le impostazioni DNS del nodo.
-
Confirm. Spunta Start after created e premi Finish.

Il task estrae il template e genera le chiavi SSH del container. In pochi secondi il container è acceso:
extracting archive '/var/lib/vz/template/cache/debian-13-standard_13.6-1_amd64.tar.zst'Total bytes read: 553512960 (528MiB, 104MiB/s)Detected container architecture: amd64Creating SSH host key 'ssh_host_ecdsa_key' - this may take some time ...done: SHA256:zekotr1oKXgAGnFNcwI/uCX1MRKZbSEfKtC+vRdWoMI root@debian-ct01Creating SSH host key 'ssh_host_ed25519_key' - this may take some time ...done: SHA256:PXwzhEQ7pwnOUkqgq+wMtoRDt/a9+nwCVSdX2l3EZMs root@debian-ct01Creating SSH host key 'ssh_host_rsa_key' - this may take some time ...done: SHA256:NJOZQVV8VkmI73UewHxOJdUD/uEWL4Pp3rElO8yJA1Y root@debian-ct01TASK OK
Il disco del container è un dataset ZFS (subvol-101-disk-0), non un disco virtuale: il container vede direttamente un file system.
pct config 101arch: amd64cores: 1features: nesting=1hostname: debian-ct01memory: 1024net0: name=eth0,bridge=vmbr0,firewall=1,gw=172.27.199.1,hwaddr=BC:24:11:0C:31:84,ip=172.27.199.101/24,type=vethostype: debianrootfs: local-zfs:subvol-101-disk-0,size=8Gswap: 512unprivileged: 1Verifica e test
Sezione intitolata “Verifica e test”-
La VM. Dal DC collegati in SSH a
[email protected]e controlla nome, rete, DNS, gateway e proxy configurato dall’installer:labuser@debian01 hostname -fOutput debian01.proxmox.communitylabuser@debian01 ip -br -4 addrOutput lo UNKNOWN 127.0.0.1/8ens18 UP 172.27.199.100/24labuser@debian01 ip routeOutput default via 172.27.199.1 dev ens18 onlink172.27.199.0/24 dev ens18 proto kernel scope link src 172.27.199.100labuser@debian01 cat /etc/resolv.confOutput search proxmox.communitynameserver 172.27.199.20labuser@debian01 ping -c2 172.27.199.1 | grep lossOutput 2 packets transmitted, 2 received, 0% packet loss, time 1001mslabuser@debian01 cat /etc/apt/apt.confOutput Acquire::http::Proxy "http://proxy.proxmox.community:3128";labuser@debian01 cat /etc/debian_versionOutput 13.7labuser@debian01 timedatectl | grep "Time zone"Output Time zone: Europe/Rome (CET, +0100)ens18è il nome che Linux dà alla scheda VirtIO della VM. -
Il container.
pct execesegue un comando nel container dal nodo, senza password né rete. Il DNS è quello del nodo, scritto da Proxmox VE tra i marcatoriPVE:root@desopve02 pct listOutput VMID Status Lock Name101 running debian-ct01root@desopve02 pct exec 101 -- ip -br -4 addrOutput lo UNKNOWN 127.0.0.1/8eth0@if6 UP 172.27.199.101/24root@desopve02 pct exec 101 -- cat /etc/resolv.confOutput # --- BEGIN PVE ---search proxmox.communitynameserver 172.27.199.20# --- END PVE ---root@desopve02 pct exec 101 -- ping -c2 172.27.199.1 | grep lossOutput 2 packets transmitted, 2 received, 0% packet loss, time 1002msPer una shell interattiva nel container usa
pct enter 101. -
Il proxy nel container. Il template non conosce il proxy del laboratorio: configuralo e aggiorna l’elenco dei pacchetti.
root@desopve02 pct exec 101 -- sh -c "echo 'Acquire::http::Proxy \"http://proxy.proxmox.community:3128\";' > /etc/apt/apt.conf.d/80proxy; apt-get update" | tail -3Output Get:14 http://deb.debian.org/debian trixie-updates/main amd64 Packages T-2026-11-05-1401.10-F-2026-07-18-0800.33.pdiff [1038 B]Fetched 17.0 MB in 2s (7736 kB/s)Reading package lists... -
La vista del cluster. Da qualsiasi nodo vedi tutti i guest del cluster:
root@desopve01 pvesh get /cluster/resources --type vm --output-format yaml | grep -E "^- |id:|name:|node:|status:|type:"Output - cpu: 0.00447667643448901id: qemu/100name: debian01node: desopve01status: runningtype: qemuvmid: 100- cpu: 0.248149203798156id: lxc/101name: debian-ct01node: desopve02status: runningtype: lxcvmid: 101
- La VM
100è accesa, raggiungibile in SSH su172.27.199.100, e scarica pacchetti tramite il proxy. - Il container
101è acceso sudesopve02, risponde su172.27.199.101e scarica pacchetti tramite il proxy.
Stato finale del lab
Sezione intitolata “Stato finale del lab”- Cluster
deso-clusterinvariato;desopve04autonomo. - VM
100debian01sudesopve01, accesa: Debian 13.7 sulocal-zfs(16 GiB), 2 core, 2048 MiB,172.27.199.100, utentirootelabuser, server SSH, proxy perapt. ISO scollegata. - CT
101debian-ct01sudesopve02, acceso: Debian 13 non privilegiato sulocal-zfs(8 GiB), 1 core, 1024 MiB,172.27.199.101, proxy perapt. - ISO
debian-13.7.0-amd64-netinst.isoinlocalsudesopve01; templatedebian-13-standard_13.6-1_amd64.tar.zstinlocalsudesopve02.
Cosa hai imparato
Sezione intitolata “Cosa hai imparato”- Le differenze tra macchine virtuali (KVM/QEMU) e container (LXC), e quando usare gli uni o gli altri.
- Come scaricare ISO e template direttamente sul nodo, con la verifica dell’impronta.
- Il significato delle schede della creazione di una VM e di un container.
- Che la configurazione di un guest è un file di testo in
/etc/pve, leggibile conqm configepct config. - Come entrare in un container dal nodo con
pct execepct enter.