
- Simone Piccardi
- Giugno 2024
- Sistemi
Cos’è Proxmox VE ?
E’ una potente piattaforma di virtualizzazione che permette di sostituire VmWare, senza problemi e senza costi di licenza, supportando configurazioni avanzate, come iperconvergenza, clustering, HA, e molto altro.
Ha inoltre il vantaggio di poter utilizzare sia le macchine virtuali classiche, su cui installare qualunque sistema operativo, che il nuovo approccio dei container Linux, più veloce ed efficiente.
Proxmox ha aggiunto il supporto di cloud-initg
dalla versione 5 , uno standard per la gestione dell’inizializzazione delle macchine virtuali supportato dai maggiori fornitori di cloud pubblici, che permette, direttamente dalla piattaforma, di gestire una serie di impostazioni relative alle istanze messe in esecuzione, come la definizione degli accessi SSH, la configurazione di rete, la gestione di utenti e relative credenziali, ecc.
In virtù di questo meccanismo sarà possibile usare dei template da cui creare e configurare più istanze di macchine virtuali pronte all’uso, il tutto in maniera rapida ed efficace.
Ora vediamo come realizzare un’immagine utilizzabile come template per gestire macchine virtuali installate con Debian.
Debian e l’uso dell’immagine cloud-initr
Tra le varie opzioni, una possibile anche per l’uso da parte di Proxmox, è quella di usare una delle immagini messe a disposizione direttamente da Debian, fra quelle predisposte per il cloud. Infatti, sono state pubblicate e rese scaricabili alcune immagini non ufficiali, a partire da https://cloud.debian.org/images/cloud, in particolare per Proxmox servono quelle denominate genericloud
.
Considerando che le immagini non sono ufficiali, sono generate periodicamente e le si dovranno cercare nella opportuna sottodirectory. Ad esempio quelle per Debian 12 Bookworm si dovranno scaricare dalla sottodirectory bookworm
, scegliendo in genere la più recente: in sostanza si dovrà andare a cercare in https://cloud.debian.org/images/cloud/bookworm/latest.
In questa directory potrete trovare diversi file; le immagini infatti sono generate per più piattaforme hardware, ed in diversi formati.
Per l’uso da parte di Proxmox occorrerà selezionarne una per amd64; si può prendere sia quella nel formato .raw
che nel formato .qcow2
, ma quest’ultima è preferibile grazie alle minori dimensioni ed anche perché, nel caso in cui venisse usata direttamente come immagine disco, è già pronta per le funzionalità avanzate di gestione da parte di Proxmox, come gli snapshot. Pertanto la si potrà scaricare con:
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
insieme all’immagine si scarichi il file con le relative checksum:
wget https://cloud.debian.org/images/cloud/bookworm/latest/SHA512SUMS
e si passi a verificare il tutto con il comando:
sha512sum -c SHA512SUMS --ignore-missing
La prima cosa da fare sarà creare una macchina virtuale, ne vanno impostate anzitutto memoria e tipo di rete, facendo riferimento ad una (o più) delle interfacce di bridge disponibili a seconda di dove la si vuole creare di default.
Il bridge potrà comunque essere cambiato in seguito, e se ne possono indicare più di uno se servono più interfacce, oppure li si possono aggiungere.
Restando nell’ipotesi più semplice, con una sola interfaccia di rete questo si ottiene, utilizzando un VMID (identificativo della macchina virtuale, da usare con i comandi di Proxmox) non allocato, con qualcosa come:
qm create 4242 --memory 1024 --net0 virtio,bridge=vmbr0 # --net1 virtio,bridge=vmbr1 #, etc.
dove qualora si vogliano più interfacce di rete le si potranno aggiungere come nella parte lasciata come commento; sarà possibile poi ottenere il disco della nostra macchina virtuale importando l’immagine appena scaricata, nello storage di Proxmox, in questo caso se si sta usando LVM come backend per i dischi associato allo storage local-lvm
(come avviene in una installazione di default di Proxmox) lo si potrà fare con il comando:
root@proxmox ~ # qm importdisk 4242 debian-12-genericcloud-amd64.qcow2 local-lvm importing disk 'debian-12-genericcloud-amd64.qcow2' to VM 4242 ... Logical volume "vm-4242-disk-0" created. transferred 0.0 B of 2.0 GiB (0.00%) transferred 20.5 MiB of 2.0 GiB (1.00%) ... transferred 2.0 GiB of 2.0 GiB (100.00%) Successfully imported disk as 'unused0:local-lvm:vm-4242-disk-0'
(si potrà usare al posto di local-lvm
qualunque altro tipo di storage configurato su Proxmox). Questo permetterà di creare l’immagine del disco con lo stesso schema di denominazione usato nella creazione delle macchine virtuali dall’interfaccia web (vm-4242-disk-0
), convertendo il contenuto del file scaricato (si possono convertire tutti i formati supportati da qemu-img
, primi fa tutti .raw
e .qcow2
); per riuscire ad utilizzare il disco nella macchina virtuale precedentemente creata occorrerà poi collegarcelo, con il comando:
root@proxmox ~ # qm set 4242 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-4242-disk-0,discard=on update VM 4242: -scsi0 local-lvm:vm-4242-disk-0,discard=on -scsihw virtio-scsi-pci
(si ometta il ,discard=on
se lo storage utilizzato non supporta l’uso di discard).
Si dovranno poi impostare due ulteriori caratteristiche della macchina virtuale, per abilitare l’uso di cloud-init
ed impostare l’avvio dal disco, con:
qm set 4242 --ide2 local-lvm:cloudinit qm set 4242 --boot c --bootdisk scsi0
in questo modo si predispone l’immagine di un CD su cui verranno salvate le configurazioni della macchina da passare a cloud-init
per l’impostazione, e si forza l’uso del disco appena collegato come disco di avvio. Sarà possibile anche dare un nome alla macchina con qm set 4242 --name nome
, cosa che si può fare anche direttamente in sede di creazione aggiungendo a qm create
l’opzione --name nome
.
A questo punto dall’interfaccia web sarà possibile utilizzare la sezione Cloud-Init relativa alla macchina, e caricare una chiave SSH per l’accesso (Cloud-Init->SSH-Public-Key->Edit->Load SSH Key File).
Se poi, si vorranno fare delle modifiche all’immagine prima di trasformarla in template, come nel nostro caso, le si potrà assegnare un indirizzo IP e farla partire.
Bisogna considerare che l’immagine fornita da Debian non consente un accesso dalla consolle (tutti gli utenti sono bloccati senza password) per cui sarà possibile utilizzare la consolle solo per accertarsi di quando il processo di boot è finito e si può provare a collegarsi con SSH.
L’unico possibile accesso alla macchina è via SSH con autenticazione a chiavi, attraverso l’utilizzo della chiave corrispondente a quella che si è caricata come descritto in precedenza. Inoltre l’accesso a root
è bloccato (la chiave viene riconosciuta, ma usata per stampare il messaggio di collegarsi con utente debian
e l’unico utente disponibile è appunto debian
(anche se questo può essere cambiato nella sezione Cloud-Init relativa alla macchina). Si potrà pertanto entrare sulla macchina con ssh debian@IND.IP.DEL.SERVER
e poi eseguire sudo -s
per ottenere una shell di root.
Considerando che questa politica prevede un inutile passaggio attraverso un utente intermedio che ha comunque accesso illimitato via sudo
, non offre nessuna garanzia di sicurezza superiore rispetto ad un accesso diretto a root
, al prezzo di complicare le cose per fare operazioni remote, ad esempio per fare delle copie di file con scp
quando queste devono essere effettuate coi privilegi di amministratore sulla macchina stessa. Pertanto è utile ripristinare una configurazione che consenta l’accesso SSH a root
con autenticazione a chiavi.
Per raggiungere questo obiettivo, una volta collegati e ottenuta la shell di root
bisognerà modificare la configurazione di cloud-init
aggiungendo in /etc/cloud/cloud.cfg.d
un ulteriore file di configurazione (ad esempio /etc/cloud/cloud.cfg.d/09_enableroot.cfg
) con una riga che imposti disable_root
da true
a false
. Il file sarà in formato YML, e si potrà usare un contenuto come il seguente, che soprassiede la configurazione di default di /etc/cloud/cloud.cfg
(i file inseriti in /etc/cloud/cloud.cfg.d/
sovrascrivono i default):
# If this is set, 'root' will not be able to ssh in and they # will get a message to login instead as the above $user (debian) disable_root: false
inoltre sarà necessario eliminare dall’authorized_keys
di root
il prefisso che blocca l’accesso alla chiave impostata per entrare (che non viene modificato una volta che è stato creato, anche se poi si è cambiata la configurazione di cloud-init
), occorrerà pertanto cancellare tutta la parte:
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"debian\" rather than the user \"root\".';echo;sleep 10"
lasciando solo i dati della chiave a partire da ssh-rsa
.
Bisognerà, successivamente, verificare il funzionamento della modifica eseguendo un accesso diretto collegandosi con ssh root@ID.DE.LA.MACCHINA
ed è importante ricordarsi anche di mettere una password di root
per potersi collegare in consolle sulla piattaforma di virtualizzazione, eseguendo passwd
.
Dopodicchè sarà possibile passare alle eventuali personalizzazioni dell’immagine prima di trasformarla in un template: ma lo vedremo più avanti.
Come creare un’immagine cloud-init a partire da un’installazione ordinaria.
Come abbiamo visto, l’immagine preparata da Debian fornisce un sistema già installato e pronto all’uso di cloud-init
ma nonostante le personalizzazioni del sistema che vedremo più avanti saranno comunque applicabili, esistono delle scelte di installazione fatte nella realizzazione dell’immagine, che non è possibile modificare in un secondo tempo.
Ad esempio l’uso del filesystem ext4
o la partizione del disco, che non prevede una swap, e che mette la directory per EFI in una partizione in coda al disco.
Se non serve EFI, e si vuole una partizione di swap, o se si vogliono usare altri filesystrem come btrfs
o xfs
, questa non potrà essere usata. Inoltre la configurazione della rete nell’immagine di Debian si appoggia a netplan
, che non è detto si voglia utilizzare rispetto allo standard delle installazioni ordinarie (la configurazione in /etc/network/interfaces
).
Qui di seguito vedremo come è possibile creare un’immagine configurata per l’uso con cloud-init
partendo da una installazione ordinaria di Debian, che potremo fare nella modalità che più preferiamo.
Dovendo fare l’installazione, la complessità di realizzazione in questo caso è maggiore, ma la flessibilità che si può ottenere è nettamente superiore. Quindi assumeremo di avere installato su Proxmox una macchina virtuale con Debian con il CD per l’installazione via rete (il cosiddetto netinst
) seguendo i passi trattati in questo articolo.
Ipotizzeremo che l’installazione sia stata fatta nella maniera illustrata nell’articolo citato, ricordando che è in quella fase che è possibile cambiare le modalità di partizionamento del disco e l’eventuale filesystem di installazione.
Le specifiche scelte che si dovranno fare in fase di installazione di Debian per avere una immagine adeguata al successivo utilizzo come template sono:
- si deve impostare per
root
una password provvisoria per l’accesso, la si potrà rimuovere in seguito, e reimpostare concloud-init
- si deve creare un utente ordinario:
debian
(o altro, andrà comunque cancellato) - si dovrà configurare la rete nella maniera più semplice per poter accedere sulla macchina (anche usando un eventuale DHCP), poi verrà gestita da
cloud-init
- si dovrà scegliere il partizionamento manuale del disco, su cui:
- creare una prima partizione primaria di circa 4G come swap
- creare una eventuale seconda partizione primaria se si vuole usare EFI (non necessaria con i default per il bios virtuale di Proxmox)
- creare una ultima partizione primaria con resto del disco da usare come radice
- si dovrà scegliere nella schermata di “Selezione del software” solo “Server SSH ” e “Utilità di sistema standard” (il resto si installerà dopo).
Una volta fatti tutti questi passaggi, si avrà un disco partizionato in modo da avere la partizione di sistema in coda al disco, cosa che ne consente una facile espansione, permettendo a cloud-init
di allargarla automaticamente una volta che si sia allargato il disco dall’interfaccia di Proxmox.
Una volta completata l’installazione di base sarà possibile passare a preparare l’immagine del server.
Visto che nel momento in cui si procede con l’installazione di default l’accesso in SSH a root
con la password risulterà bloccato, o si dovrà usare l’utente ordinario debian
creato in fase di installazione e poi si potrà ottenere una shell di root con su
o sudo
, o ci si dovrà collegare a root
sulla console via web. Tutte le operazioni seguenti sono da eseguirsi collegati come root
, se le si vogliono effettuare passando da una connessione SSH occorrerà abilitare da subito l’accesso a root
anche con le password, inserendo dentro /etc/ssh/sshd_config.d/root.conf
:
# enable root password access PermitRootLogin yes
e riavviare sshd
con service ssh restart
.
In questa fase non sarà necessario configurare l’uso di chiavi SSH, in quanto possono essere impostate in qualunque momento successivo tramite cloud-init
.
Dopo che ci si sarà ricollegati con successo usando direttamente root
(dalla console o SSH), si potrà cancellare l’utente debian
usato per l’accesso iniziale che non serve più:
userdel -r debian
Ora potremo procedere all’installazione del pacchetto cloud-init
, e configurare il programma.
Considerando che questo di default impiega resolvconf
per la configurazione della rete sarà necessario installare anche questo pacchetto, in sostanza occorrerà eseguire:
apt install cloud-init resolvconf
E’ importante considerare che per poter installare i pacchetti, la rete deve essere accessibile quindi la macchina deve essere stata configurata correttamente per avere un gateway di uscita ed avere un un DNS funzionante (che deve esser stato impostato, a meno di non avere un DHCP sulla rete che configura le interfacce, durante l’installazione).
In generale si potrà sempre impostare manualmente un server DNS valido in /etc/resolv.conf
, con un comando come echo nameserver 1.1.1.1 > /etc/resolv.conf
.
Installato il pacchetto, occorrerà impostare la configurazione di cloud-init
per mantenere l’accesso diretto a root
. Inoltre avendo eliminato l’utente ordinario debian
, occorre anche disabilitarne l’uso, per evitare che venga ricreato come previsto nel default della configurazione. Tutto questo potrà essere fatto aggiungendo un file /etc/cloud/cloud.cfg.d/99_local.cfg
con un contenuto come:
# If this is set, 'root' will not be able to ssh in and they # will get a message to login instead as the above $user (debian) disable_root: false # A set of users which may be applied and/or used by various modules # when a 'default' entry is found it will reference the 'default_user' # from the distro configuration specified below users: - root
dove di nuovo si blocca la disabilitazione di root
e si indica quest’ultimo come unico utente da avere.
Terminate queste operazioni, andrà modificato il file di configurazione delle interfacce di rete /etc/network/interfaces
per evitare che le voci inserite durante l’installazione interferiscano con quelle generate da cloud-init
, che di default usa per la configurazione di rete il file in 50-cloud-init.cfg
sotto /etc/network/interfaces.d/
. In particolare bisognerà rimuovere la configurazione di tutte le interfacce di rete presenti in /etc/network/interfaces
, tranne lo
(l’interfaccia di loopback per il localhost), che però va spostata in cima al file perché non sovrascriva quella di cloud-init
che imposta su questa interfaccia i DNS con resolvconf
.
Dunque /etc/network/interfaces
dovrà essere qualcosa del tipo:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback source /etc/network/interfaces.d/*
Completato questo passaggio l’immagine del sistema è pronta e per poterla usare con cloud-init
sarà sufficiente procedere a creare l’immagine ISO per la gestione dei dati da parte di Proxmox come nel caso precedente, con:
qm set 4242 --ide2 local-lvm:cloudinit
Al termine dei processi su indicati, si potrà provare ad impostare di nuovo i parametri della rete dall’interfaccia di Proxmox, per poi avviare la macchina per verificarne il funzionamento. Si rimuova eventualmente /etc/ssh/sshd_config.d/root.conf
se non si vuole consentire più l’accesso a password con SSH.
Come personalizzare l’immagine e creare un template
In qualunque modo in cui si sia realizzata l’immagine cloud-init
, dopo che si è verificato il suo corretto funzionamento, e ci si è collegati alla stessa, si potranno effettuare tutte le eventuali personalizzazioni volute prima di trasformarla in template, come la creazione di utenti specifici (questi potrebbero comunque essere gestiti anche tramite cloud-init
), l’installazione di pacchetti aggiuntivi, le modifiche alle configurazione, ecc.
Tutte queste variazioni faranno parte del template e saranno già pronte sulle macchine ottenute dallo stesso.
Dopo aver completato le personalizzazioni è opportuno ripulire l’immagine da tutti i dati spuri, cancellare la cache di APT, svuotare i file di log, ecc. Per questo ci si deve connettere e ci si riconnetta (sempre come root
) eseguendo il comando:
# set +o history
che consente di disabilitare la history, che cancelleremo insieme a tutto il resto, eseguendo i comandi:
> .bash_history apt clean find /etc -name "*~" -delete journalctl --rotate journalctl --vacuum-time=1s fstrim / cd /var/log/ > syslog > auth.log > cloud-init.log > cloud-init-output.log > debug > dpkg.log > messages > kern.log > user.log > daemon.log > installer/syslog > wtmp > btmp
Ora si potrà disconnettere e fermare la macchina virtuale ed una volta tolte le impostazioni aggiunte nella sezione Cloud-Init aggiunte per poterla personalizzare, la si potrà trasformare in template dall’interfaccia web di Proxmox o con il comando:
qm template 4242
Giunti fin qui si potranno generare delle nuove macchine virtuali a partire dal template in maniera praticamente istantanea creando un clone, sia dall’interfaccia web di Proxmox che con un comando come:
qm clone 4242 308 --name nuovavm
Dopo aver creato un clone potremo riconfigurarlo a piacere per l’utilizzo delle risorse (aumentando la RAM, le CPU virtuali e dimensione del disco) sia dalla sezione Hardware dell’interfaccia web di Proxmox che dalla riga di comando con un comando come:
qm resize 308 scsi0 50G qm set 308 --memory 2048 qm set 308 --socket 4
in egual misura, via web dalla sezione Cloud-Init, si potranno impostare le caratteristiche pilotate da cloud-init
, operazione che potrà essere eseguita anche dalla riga di comando; ad esempio si potrà configurare la rete con un comando come:
qm set 308 --ipconfig0 ip=192.168.XX.YY/24,gw=192.168.XX.1
mentre si potranno inoltre installare ulteriori chiavi SSH con un comando come:
qm set 308 --sshkey elencochiavissh.pub
dove elencochiavissh.pub
è un file contenente un elenco di chiavi pubbliche (una per riga) che verranno abilitate per la macchina in questione (lo si può generare da una serie di file di chiavi con un comando tipo cat *.pub > elencochiavissh.pub
).
Al termine di questo processo, completate le impostazioni controllate da cloud-init,
si potrà avviare la macchina virtuale con qm start 308
ed all’avvio della stessa verranno rigenerate le chiavi SSH, e verranno create le configurazioni opportune con tutti gli identificativi che dovranno essere diversi. Si potranno poi cambiare le configurazioni in qualunque momento, e queste verranno applicate da cloud-init
al riavvio successivo (si tenga presente però che quando si fanno queste modifche le chiavi SSH che identificano il server vengono modificate, ed occorrerà riaccettarle o riverificarle di nuovo, in questo caso le relative fingerprint per la verifica vengono stampate sulla console della macchina virtuale).
Speriamo che questo tutorial sia stato chiaro e utile, in ogni caso, per maggiori approfondimenti o per consulenze personalizzate non esitate a visitare il nostro sito
La redazione