12.3. Installazione automatica
Gli amministratori della Falcot Corp, come molti amministratori di grandi servizi IT, hanno bisogno di strumenti per installare (o reinstallare) rapidamente e se possibile automaticamente le loro nuove macchine.
Questi requisiti possono essere soddisfatti da una vasta gamma di soluzioni. Da un lato, strumenti generici come SystemImager gestiscono il compito creando un'immagine basata su una macchina modello, quindi allestiscono quell'immagine sui sistemi destinazione; dall'altro lato dello spettro, l'installatore standard di Debian può essere preimpostato con un file di configurazione che dà le risposte alle domande poste durante il processo di installazione. A metà strada, uno strumento ibrido come FAI (Fully Automatic Installer) installa le macchine usando il sistema di pacchettizzazione, ma usa anche la propria infrastruttura per compiti più specifici su allestimenti di massa (come avviare, partizionare, configurare e così via).
Each of these solutions has its pros and cons: SystemImager works independently from any particular packaging system, which allows it to manage large sets of machines using several distinct Linux distributions. It also includes an update system that doesn't require a reinstallation, but this update system can only be reliable if the machines are not modified independently; in other words, the user must not update any software on their own, or install any other software. Similarly, security updates must not be automated, because they have to go through the centralized reference image maintained by SystemImager. This solution also requires the target machines to be homogeneous, otherwise many different images would have to be kept and managed (an amd64 image won't fit on a powerpc machine, and so on).
On the other hand, an automated installation using debian-installer can adapt to the specifics of each machine: the installer will fetch the appropriate kernel and software packages from the relevant repositories, detect available hardware, partition the whole hard disk to take advantage of all the available space, install the corresponding Debian system, and set up an appropriate bootloader. However, the standard installer will only install standard Debian versions, with the base system and a set of pre-selected “tasks”; this precludes installing a particular system with non-packaged applications. Fulfilling this particular need requires customizing the installer… Fortunately, the installer is very modular, and there are tools to automate most of the work required for this customization, most importantly simple-cdd (CDD being an acronym for Custom Debian Derivative). Even this solution, however, only handles initial installations; this is usually not a problem since the APT tools allow efficient deployment of updates later on.
We will only give a rough overview of FAI, and skip SystemImager altogether (which is no longer in Debian, but available as a third-party package), in order to focus more intently on debian-installer and simple-cdd, which are more interesting in a Debian-only context.
12.3.1. Fully Automatic Installer (FAI)
Fully Automatic Installer è probabilmente il più vecchio sistema di allestimento automatico per Debian, il che spiega il suo status di punto di riferimento; ma la sua natura molto flessibile compensa appena la complessità che esso comporta.
FAI richiede un sistema server per memorizzare le informazioni sull'allestimento e permettere alle macchine destinazione di avviarsi dalla rete. Questo server richiede il pacchetto fai-server (o fai-quickstart, che fornisce anch'esso gli elementi richiesti per una configurazione standard).
FAI uses a specific approach for defining the various installable profiles. Instead of simply duplicating a reference installation, FAI is a full-fledged installer, fully configurable via a set of files and scripts stored on the server; the default location /srv/fai/config/
according to /etc/fai/nfsroot.conf
is not automatically created, so the administrator needs to create it along with the relevant files. Most of the times, these files will be customized from the example files available in the documentation for the fai-doc package, more particularly the /usr/share/doc/fai-doc/examples/simple/
directory.
Once the profiles are defined, the fai-setup
command generates the elements required to start an FAI installation; this mostly means preparing or updating a minimal system (NFS-root) used during installation. An alternative is to generate a dedicated boot CD with fai-cd
.
La creazione di tutti questi file di configurazione richiede una certa comprensione di come funziona FAI. Un tipico processo di installazione è composto dai seguenti passi:
prelevare un kernel dalla rete e avviarlo;
montare il filesystem di root da NFS;
eseguire /usr/sbin/fai
, che controlla il resto del processo (i passi successivi sono quindi iniziati da questo script);
copiare lo spazio di configurazione dal server su /fai/
;
eseguire fai-class
. Gli script /fai/class/[0-9][0-9]*
sono eseguiti in successione e restituiscono nomi di «classi» che si applicano alla macchina che viene installata; questa informazione servirà come base per i passi successivi. Ciò permette una certa flessibilità nel definire i servizi da installare e configurare.
prelevare un certo numero di variabili di configurazione, a seconda delle relative classi;
partizionare i dischi e formattare le partizioni, in base alle informazioni fornite in /fai/disk_config/classe
;
montare le suddette partizioni;
installare il sistema di base;
preimpostare il database di Debconf con fai-debconf
;
prelevare la lista dei pacchetti disponibili per APT;
installare i pacchetti elencati in /fai/package_config/classe
;
eseguire gli script di post-configurazione, /fai/scripts/classe/[0-9][0-9]*
;
registrare i log di installazione, smontare le partizioni e riavviare.
12.3.2. Preimpostare Debian-Installer
At the end of the day, the best tool to install Debian systems should logically be the official Debian installer. This is why, right from its inception, debian-installer has been designed for automated use, taking advantage of the infrastructure provided by debconf. The latter allows, on the one hand, to reduce the number of questions asked (hidden questions will use the provided default answer), and on the other hand, to provide the default answers separately, so that installation can be non-interactive. This last feature is known as preseeding.
12.3.2.1. Usare un file di preimpostazione
Ci sono diversi posti da cui l'installatore può ottenere un file di preimpostazione:
nell'initrd usato per avviare la macchina; in questo caso, la preimpostazione avviene proprio all'inizio dell'installazione e si possono evitare tutte le domande. Il file deve solo essere chiamato preseed.cfg
e memorizzato nella root dell'initrd.
sul supporto di avvio (CD o chiave USB); la preimpostazione in questo caso avviene appena il supporto viene montato, ossia subito dopo le domande su lingua e impostazione di tastiera. Si può usare il parametro di avvio preseed/file
per indicare la posizione del file di preimpostazione (per esempio, /cdrom/preseed.cfg
quando l'installazione viene fatta da CD-ROM o /hd-media/preseed.cfg
nel caso di una chiave USB).
from the network; preseeding then only happens after the network is (automatically) configured; the relevant boot parameter is then preseed/url=http://server/preseed.cfg
(HTTPS, FTPS, SFTP, etc. are not supported).
A prima vista, includere il file di preimpostazione nell'initrd sembra la soluzione più interessante; tuttavia, è raramente usata in pratica perché generare un initrd per l'installatore è piuttosto complesso. Le altre due soluzioni sono molto più comuni, soprattutto dal momento che i parametri di avvio forniscono un altro modo per preimpostare le risposte alle prime domande del processo di installazione. Il modo consueto di risparmiare la fatica di scrivere questi parametri di avvio a mano a ogni installazione è di salvarli nella configurazione di isolinux
(nel caso di un CD-ROM) or syslinux
(nel caso di una chiave USB).
12.3.2.2. Creare un file di preimpostazione
Un file di preimpostazione è un file di testo semplice in cui ogni riga contiene la risposta a una domanda di Debconf. Una linea è divisa in quattro campi separati da spazi vuoti (spazi o tabulazioni) come, ad esempio, d-i mirror/suite string stable
:
il primo campo è il «proprietario» della domanda; «d-i» viene usato per domande relative all'installatore, ma può anche essere il nome di un pacchetto per domande provenienti da pacchetti Debian;
the second field is an identifier for the question (the template name);
terzo, il tipo di domanda;
il quarto e ultimo campo contiene il valore della risposta. Notare che deve essere separato dal terzo campo con uno spazio singolo, se vi sono più di uno, i seguenti spazi sono considerati parte del valore.
Il modo più semplice per scrivere un file di preimpostazione è di installare un sistema a mano. Quindi debconf-get-selections --installer
fornirà le risposte riguardanti l'installatore. Le risposte riguardo altri pacchetti si possono ottenere con debconf-get-selections
. Tuttavia, una soluzione più pulita è di scrivere il file di preimpostazione a mano, a partire da un esempio e dalla documentazione di riferimento: con questo approccio, si possono preimpostare solo le domande a cui bisogna modificare le risposte predefinite; il parametro priority=critical
dirà a Debconf di porre solo domande critiche e usare la risposta predefinita per le altre.
Pre-setting a value in a preseed file automatically instructs the Debian installer to not ask that question. This happens, because loading the preseed file does not just set the given value(s), but also marks each of the affected dialogs as “seen“ by the user. Thus it is possible to pre-set a question's value and still present the dialog to the user by resetting the “seen“ flag. Beware that order in this case matters and that the value has to be preseeded before setting the dialog to “unseen“ as shown in the following example:
d-i netcfg/hostname string worker
d-i netcfg/hostname seen false
12.3.2.3. Creare un supporto di avvio personalizzato
Sapere dove memorizzare il file di preimpostazione è cosa buona e giusta, ma la posizione non è tutto; in un modo o nell'altro, bisogna alterare il supporto di avvio dell'installazione per cambiare i parametri di avvio e aggiungere il file di preimpostazione.
12.3.2.3.1. Avviare dalla rete
When a computer is booted from the network, the server sending the initialization elements also defines the boot parameters. Thus, the change needs to be made in the PXE configuration for the boot server; more specifically, in its
/tftpboot/pxelinux.cfg/default
configuration file. Setting up network boot is a prerequisite; see the Installation Guide for details.
12.3.2.3.2. Preparare una chiave USB avviabile
Once a bootable key has been prepared (see
Sezione 4.1.2, «Avviare da una chiavetta USB»), a few extra operations are needed. Assuming the key contents are available under
/media/usbdisk/
, copy the preseed file to
/media/usbdisk/preseed.cfg
.
If you have been using a hybrid ISO image to create the bootable USB stick, then you have to edit /media/usbdisk/boot/grub/grub.cfg
(for the EFI boot screen):
Esempio 12.2. boot/grub/grub.cfg file and preseeding parameters
menuentry --hotkey=i 'Install' {
set background_color=black
linux /install.amd/vmlinuz preseed/file=/cdrom/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 --- quiet
initrd /install.amd/initrd.gz
}
And you have to edit /media/usbdisk/isolinux/isolinux.cfg
(for BIOS boot) or one of the files it utilizes - e.g. /media/usbdisk/isolinux/txt.cfg
- to add required boot parameters:
Esempio 12.3. isolinux/txt.cfg file and preseeding parameters
label install
menu label ^Install
kernel [...]
append preseed/file=/cdrom/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=/install.amd/initrd.gz --- quiet
If you have been using the hd-media
installer image for a custom USB stick, edit /media/usbdisk/syslinux.cfg
and add the required boot parameters as shown in the example below:
Esempio 12.4. file syslinux.cfg e parametri di preimpostazione
default vmlinuz
append preseed/file=/hd-media/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=initrd.gz --
12.3.2.3.3. Creare un'immagine CD-ROM
Una chiave USB è un supporto leggibile e scrivibile, quindi è stato facile aggiungervi un file e cambiare alcuni parametri. Nel caso di un CD-ROM, l'operazione è più complessa, dal momento che si deve rigenerare un'immagine ISO completa. Questo compito è gestito da debian-cd, ma questo strumento è piuttosto scomodo da usare: ha bisogno di un mirror locale e richiede una comprensione di tutte le opzioni fornite da /usr/share/debian-cd/CONF.sh
; anche così, bisogna invocare make
più volte. Pertanto si raccomanda vivamente di leggere /usr/share/debian-cd/README
.
Having said that, debian-cd always operates in a similar way: an “image” directory with the exact contents of the CD-ROM is generated, then converted to an ISO file with a tool such as genisoimage
, mkisofs
or xorriso
. The image directory is finalized after debian-cd's make image-trees
step. At that point, we insert the preseed file into the appropriate directory (usually $TDIR/$CODENAME/CD1/
, $TDIR and $CODENAME being parameters defined by the CONF.sh
configuration file). The CD-ROM uses isolinux
as its bootloader, and its configuration file must be adapted from what debian-cd generated, in order to insert the required boot parameters (the specific files are $TDIR/$CODENAME/CD1/isolinux/isolinux.cfg
and $TDIR/$CODENAME/CD1/boot/grub/grub.cfg
as shown above). Then the “normal” process can be resumed, and we can go on to generating the ISO image with make image CD=1
(or make images
if several CD-ROMs are generated).
12.3.3. Simple-CDD: la soluzione completa
Usare semplicemente un file di preimpostazione non basta per soddisfare tutti i requisiti che possono verificarsi per allestimenti su larga scala. Anche se è possibile eseguire alcuni script alla fine del normale processo di installazione, la selezione dell'insieme di pacchetti da installare non è ancora molto flessibile (fondamentalmente si possono scegliere solo «task»); cosa più importante, ciò permette di installare solo pacchetti Debian ufficiali e preclude quelli generati localmente.
On the other hand, debian-cd is able to integrate external packages, and debian-installer can be extended by inserting new steps in the installation process. By combining these capabilities, it should be possible to create a customized installer that fulfills our needs; it should even be able to configure some services after unpacking the required packages. Fortunately, this is not a mere hypothesis, since this is exactly what simple-cdd does.
The purpose of this tool is to allow anyone to easily create a distribution derived from Debian, by selecting a subset of the available packages, preconfiguring them with Debconf, adding specific software, and executing custom scripts at the end of the installation process. This matches the “universal operating system” philosophy, since anyone can adapt it to their own needs.
Simple-CDD definisce «profili» che corrispondono al concetto di «classi» in FAI e una macchina può avere diversi profili (determinati al momento dell'installazione). Un profilo è definito da un insieme di file profiles/profilo.*
:
il file .description
contiene una descrizione di una riga del profilo;
il file .packages
elenca i pacchetti che saranno automaticamente installati se il profilo viene scelto;
il file .downloads
elenca i pacchetti che verranno memorizzati sul supporto di installazione, ma non necessariamente installati;
il file .preseed
contiene informazioni di preimpostazione per le domande di Debconf (per l'installatore e/o per i pacchetti);
il file .postinst
contiene uno script che sarà eseguito al termine del processo di installazione;
lastly, the .conf
file allows changing some parameters based on the profiles to be included in an image.
Il profilo default
ha un ruolo particolare, dal momento che è sempre selezionato; contiene il minimo indispensabile richiesto perché Simple-CDD funzioni. L'unica cosa personalizzata di solito in questo profilo è il parametro di preimpostazione simple-cdd/profiles
: questo permette di evitare la domanda, introdotta da Simple-CDD, su quali profili installare.
Notare inoltre che i comandi dovranno essere invocati dalla directory madre della directory profiles
.
12.3.3.2. Configurare e usare build-simple-cdd
Simple-CDD richiede molti parametri per operare appieno. Questi verranno perlopiù riuniti in un file di configurazione, a cui si può far puntare build-simple-cdd
con l'opzione --conf
, ma possono anche essere specificati tramite parametri dedicati dati a build-simple-cdd
. Ecco una panoramica di come si comporta questo comando e di come i suoi parametri vengono usati:
il parametro profiles
elenca i profili che saranno inclusi nell'immagine CD-ROM generata;
in base alla lista dei pacchetti richiesti, Simple-CDD scarica i file appropriati dal server menzionato in server
e li riunisce in un mirror parziale (che in seguito sarà dato a debian-cd);
i pacchetti personalizzati menzionati in local_packages
sono anch'essi integrati in questo mirror locale;
quindi viene eseguito debian cd (da una posizione predefinita che può essere configurata con la variabile debian_cd_dir
), con la lista dei pacchetti da integrare;
una volta che debian-cd ha preparato la sua directory, simple-CDD applica alcuni cambiamenti a questa directory:
i file contenenti i profili sono aggiunti in una sottodirectory simple-cdd
(che sarà inclusa nel CD-ROM);
altri file elencati nel parametro all_extras
sono aggiunti anch'essi;
i parametri di avvio sono regolati per abilitare la preimpostazione. Si possono evitare le domande su lingua e nazione se l'informazione richiesta è memorizzata nelle variabili language
e country
.
quindi debian-cd genera l'immagine ISO finale.
12.3.3.3. Generare un'immagine ISO
Once we have written a configuration file and defined our profiles, the remaining step is to invoke build-simple-cdd --conf simple-cdd.conf
. After a few minutes, we get the required image in images/debian-11-amd64-CD-1.iso
.