Creazione dell’immagine cloud-init

A partire da FUSS 10 (Debian Buster) si genereranno delle immagini complete per macchina virtuale del server nel formato dei dump della piattaforma Proxmox adottata dal progetto, in modo da semplificare l’installazione e la configurazione iniziale di un FUSS server.

Le immagini si appoggiano a cloud-init in modo da consentire la gestione della rete direttamente dall’interfaccia web, una volta che le si siano importate e gli si sia associato un volume per cloud-init (i dettagli sono illustrati nella fuss-tech-guide.

Creazione macchina virtuale

Si crei una nuova macchina virtuale (VM) su Proxmox, in fase iniziale è sufficiente l’interfaccia di rete singola creata dal wizard, si usi il bridge associato alla rete esterna.

Sulla macchina virtuale si deve fare una installazione ordinaria di Debian con netinstall (ci si procuri l’ultima versione della ISO e la si carichi dentro /var/lib/vz/template/iso):

# cd /var/lib/vz/template/iso/
# wget https://cdimage.debian.org/cdimage/bookworm_di_rc4/amd64/iso-cd/debian-bookworm-DI-rc4-amd64-netinst.iso

Nella creazione si utilizzi la precedente immagine come CDROM e per il resto si usino i valori di default per tutto, compresi i 32 G di dimensione del disco, avendo però cura di fare installare quest’ultimo sullo storage local in formato qcow (che consente eventualmente di distribuire direttamente il file che si otterrà come immagine del disco per l’uso da parte di altre piattaforme).

Una volta completato il wizard, aggiungere la seconda interfaccia per la rete interna, e la eventuale terza per il captive portal, ed assicurarsi che sia queste che la prima interfaccia non abbiano spunta per l’uso del firewall.

Inoltre, modificare il disco ed attivare la spunta di Discard.

Installare Debian

Si esegua l’installazione in maniera ordinaria; per la rete si può anche usare un eventuale DHCP, la configurazione scelta in fase di installazione verrà comunque sovrascritta da quella che si imposterà in fase di deploy con cloud-init.

Le operazioni specifiche che occorre fare in fase di installazione sono:

  • si imposti per root la password di default: fuss

  • si usi un utente normale: fuss (o altro, andrà comunque cancellato)

  • si configuri la rete nella maniera più semplice per accedere sulla macchina

  • scegliere il partizionamento manuale del disco,

    • creare una prima partizione primaria di 4G come swap

    • creare una seconda partizione primaria con resto del disco come radice

  • nella schermata Selezione del software scegliere solo Server SSH e Utilità di sistema standard (il resto si installerà dopo).

Preparazione dell’installazione base

Una volta completata l’installazione base si potrà passare a preparare il server. Dato che l’installazione di default blocca l’accesso in SSH a root, o si usa l’utente normale provvisorio creato in fase di installazione e si usa su o sudo, o ci si collega sulla console via web. Tutte le operazioni seguenti sono da eseguirsi dall’utente root.

Il primo passo è abilitare da subito l’accesso di SSH a root, inserendo dentro /etc/ssh/sshd_config.d/root.conf:

# enable root password access
PermitRootLogin yes

e riavviare sshd con service ssh restart; non è necessario configurare in questa fase l’uso di chiavi in authorized_keys, queste possono essere impostate in qualunque momento successivo tramite cloud-init.

Si rimuova poi l’utente creato in fase di installazione con:

# userdel -r fuss

Occorrerà anzitutto installare cloud-init ed alcuni programmi:

  • gnupg per poter importare le chiavi di APT di FUSS;

  • resolvconf per poter gestire la configurazione del DNS attraverso cloud-init;

  • bind9 per poter configurare da subito la macchina in modalità compatibile con la configurazione che verrà impostata da fuss-server

  • quotatool per attivare le quote nel caso si aggiunga un disco separato per le home;

# apt install cloud-init gnupg resolvconf bind9 quotatool

Per evitare i problemi di risoluzione con indirizzi IPv6 che si sono verificati in alcuni casi, è opportuno che Bind sia configurato da subito per usare solo IPv4, pertanto si modifichi in /etc/default/named l’ultima riga in:

OPTIONS="-4 -u bind"

e si riavvii Bind con systemctl restart named.

Occorre poi configurare opportunamente /etc/apt/sources.list per usare i repository di fuss, si utilizzi un contenuto analogo al seguente:

# bookworm sources
deb http://deb.debian.org/debian/ bookworm main
deb-src http://deb.debian.org/debian/ bookworm main

deb http://security.debian.org/debian-security bookworm-security main
deb-src http://security.debian.org/debian-security bookworm-security main

# fuss-sources
deb [signed-by=/etc/apt/keyrings/fuss-keyring.gpg] http://archive.fuss.bz.it/ bookworm main
#deb [signed-by=/etc/apt/keyrings/fuss-keyring.gpg] http://archive.fuss.bz.it/ bookworm-proposed-updates main

(in genere basta aggiungere le ultime due righe), inoltre si deve importare la chiave GPG di firma dei pacchetti, con:

# wget -qO - https://archive.fuss.bz.it/apt.gpg | gpg --dearmor > /etc/apt/keyrings/fuss-keyring.gpg

Con il passaggio a Debian Buster e seguenti di default le interfacce di rete assumono i nuovi nomi dipendenti dall’hardware, per cui al posto di eth0 ed eth1 si avranno nomi come ens18 o ens19. La configurazione delle stesse con cloud-init riporta però automaticamente in uso i nomi tradizionali, per cui non serve preoccuparsi di questo cambiamento nelle configurazioni, con una eccezione: la eventuale terza interfaccia dedicata al captive portal, che non deve essere configurata.

Non essendo configurata questa prenderà il nome di default, variando rispetto a quello che si avrebbe con una Debian Jessie. Si può però evitare il cambiamento (consentendo il riutilizzo senza cambiamenti dei nomi usati in un precedente fuss-server.yaml) configurando opportunamente le opzioni di avvio del kernel, inserendo in /etc/default/grub la riga:

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

ed eseguendo update-grub; in questo modo le interfacce verranno comunque chiamate eth0, eth1 ed eth2.

Infine per evitare che la voce di configurazione per lo presente in /etc/network/interfaces sovrascriva la stessa voce che cloud-init configura con un suo file sotto /etc/network/interfaces.d (50-cloud-init.cfg) si sposti la riga che include le configurazioni da questa directory in fondo al file, in sostanza /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/*

Nota

si tenga presente che con questo /etc/network/interfaces non verrà configurata automaticamente nessuna interfaccia di rete, e se non si configura la stessa via cloud-init la macchina risulterà raggiungibile solo sulla console, pertanto se vi si deve accedere via rete per lavorarci sopra prima di creare l’immagine di cloud-init si lasci presente la configurazione dell’interfaccia che si intende utilizzare, rimuovendola nella fase di pulizia.

Nota

si tenga presente che con questa configurazione si gestisce il contenuto di /etc/resolv.conf con cloud-init, ma questo file viene anche scritto direttamente dal comando fuss-server, per cui si abbia cura di impostare via cloud-init lo stesso nome a dominio che si imposterà poi nel fuss-server e di indicare sempre come server DNS 127.0.0.1.

Configurazione di cloud-init

La configurazione di default installata da cloud-init prevede la creazione di un utente di default ed il blocco dell’accesso come root. La scelta del progetto è di fornire un accesso diretto a root a chiavi, con la possibilità di usare una password, per questo vanno fatte alcune modifiche in /etc/cloud/cloud.cfg. Anzitutto si devono cambiare le due righe relative alla gestione degli utenti locali creati di default come nell’esempio seguente:

# 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:
   - name: root

e poi bisogna evitare che venga applicata la configurazione che disabilita l’uso dell’utente root, configurando disable_root a false come in:

# 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

infine si aggiungano poi in coda al file la ulteriore configurazione che consente a cloud-init di gestire /etc/hosts:

manage_etc_hosts: true

Si aggiunga poi sotto /etc/cloud/cloud.cfg.d/ il file 10_fuss.cfg, con il contenuto seguente (attenzione: le spaziature non devono contenere tabulazioni):

apt:
    preserve_sources_list: true
packages:
  - fuss-server

Pulizia

Una volte effettuate le configurazioni precedenti si proceda a ripulire l’immagine da tutti i dati spuri, ci si sconnetta e ci si riconnetta eseguendo il comando:

# set +o history

per disabilitare la history.

Se si è lasciato la configurazione dell’interfaccia di rete principale usata in fase di installazione dentro /etc/network/interfaces la si rimuova.

Si eseguano poi (come root) 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

per fare una pulizia finale, compreso ricreare vuoti i file modificati dal sistema mentre era in uso.

Generazione dell’immagine

Una volte effettuate le configurazioni precedenti, si fermi la macchina virtuale e se ne esegua un backup, chiedendo la compressione (coi valori predefiniti in formato zst). Si troverà il file del backup sotto /var/lib/vz/dump (o nella directory che si è configurato come storage di backup) nella forma:

vzdump-qemu-VMID-ANNO_ME_GI-OR_MI_SE.vma.zst

Pubblicazione

Dopo eventuali test, caricare il file sulla macchina dove verrà pubblicato, ad esempio nella home dell’utente root con il comando:

$ scp /var/lib/vz/dump/vzdump-qemu-106-2023_06_05-16_06_42.vma.zst \
      root@iso.fuss.bz.it:

quindi collegarsi alla macchina stessa (ssh root@iso.fuss.bz.it) e lanciare il comando:

# cd /root
# ./release_cloud_image.sh vzdump-qemu-106-2023_06_05-16_06_42.vma.zst

che provvede a spostare il file nella destinazione corretta e generarne checksum e relative firme.

Quindi aggiornare il file /var/www/iso/cloud-init/changelog.txt con l’elenco delle modifiche presenti nella release corrente.

L’immagine è ora disponibile per lo scaricamento su https://iso.fuss.bz.it/cloud-init/