Preseed installation

Afin de pouvoir automatiser l’installation de Debian et de ses dérivés, nous pouvons écrire des fichiers de réponse qui permettent de dérouler une installation sans interaction utilisateur. Ce fichier est prénommé preseed pour Debian, ou encore Kickstart pour RedHat et ses dérivés. Il existe plusieurs façon de spécifier ce fameux fichier de réponse, soit en modifiant directement le fichier ISO, soit en le spécifiant dans le lancement de l’installation.

Preseed.cfg

Voici un exemple de fichier preseed.cfg. C’est celui que j’utilise personnellement afin de pouvoir effectuer des machines virtuelles de développement et de test. Une fois que nous avons configuré notre fichier preseed.cfg comme nous le voulons, nous avons plusieurs façon de pouvoir l’utiliser. La première façon sera de l’héberger à un endroit sur internet afin de pouvoir le récupérer facilement et indiquer à chaque installation sa localisation. La seconde façon sera de l’intégrer directement dans un ISO de Debian, cette seconde manière va permettre de devoir indiquer directement ou se trouve le fichier preseed.cfg à chaque installation.

preseed.cfg
d-i debian-installer/locale string fr_FR
d-i console-keymaps-at/keymap select fr
d-i keyboard-configuration/xkb-keymap select fr(latin9)
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string DEB-SRV
d-i netcfg/get_domain string overcomputing.net
d-i mirror/country string manual
d-i mirror/http/hostname string http.us.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i mirror/suite string stable
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Paris
d-i clock-setup/ntp boolean false
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i passwd/root-password password root
d-i passwd/root-password-again password root
d-i passwd/make-user boolean false
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false   
d-i apt-setup/cdrom/set-failed boolean false
popularity-contest popularity-contest/participate boolean false
tasksel tasksel/first multiselect standard
d-i pkgsel/include string openssh-server build-essential
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev string /dev/sda
d-i debian-installer/exit/poweroff boolean true
d-i finish-install/reboot_in_progress note

d-i preseed/late_command string cp /cdrom/post_install.sh /target/root/; chmod +x /target/root/post_install.sh; in-target /bin/bash /root/post_install.sh

Spécification du fichier preseed lors de l’installation

Dans un premier temps, nous allons faire la première méthode. Une fois notre fichier preseed.cfg configuré et héberger de façon à être disponible, nous pouvons dès lors lancer l’ISO officiel de Debian. Sur cette prémière interface, nous allons accéder à « Advanced options » comme indiqué en surbrillance.

Une fois l’option « Advanced options » sélectionné, un nouveau menu est apparu, et nous pouvons maintenant sélectionner « Automated install ».

Le système va commencer à effectuer quelques actions de base, comme recevoir une configuration DHCP afin de pouvoir accédera au réseau par exemple. Par la suite, il va demander notre fichier preseed, on indique donc l’adresse de notre fichier.

Intégration du preseed dans l’ISO

Cette seconde méthode permet de déployer une installation de Debian sans même à avoir besoin de spécifier l’emplacement du fichier preseed. Elle va donc nous permettre de nous affranchir d’une étape manuelle supplémentaire.

Dans un premier temps, nous allons télécharger l’ISO.

Bash user command
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso

Une fois que l’iso est téléchargé, nous allons maintenant la décompresser avec l’utilitaire 7zip.

Bash user command
7z x -odebian-ps debian-12.5.0-amd64-netinst.iso

On se déplace dans notre dossier avec notre archive décompressée.

Bash user command
cd debian-ps

On créé notre fichier preseed.cfg dans le dossier extrait de Debian, le fichier doit être neutre, sans commentaire afin d’éviter tout problème de corruption.

preseed.cfg
d-i debian-installer/locale string fr_FR
d-i console-keymaps-at/keymap select fr
d-i keyboard-configuration/xkb-keymap select fr(latin9)
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string DEB-SRV
d-i netcfg/get_domain string overcomputing.net
d-i mirror/country string manual
d-i mirror/http/hostname string http.us.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i mirror/suite string stable
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Paris
d-i clock-setup/ntp boolean false
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i passwd/root-password password root
d-i passwd/root-password-again password root
d-i passwd/make-user boolean false
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false   
d-i apt-setup/cdrom/set-failed boolean false
popularity-contest popularity-contest/participate boolean false
tasksel tasksel/first multiselect standard
d-i pkgsel/include string openssh-server build-essential
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev string /dev/sda
d-i debian-installer/exit/poweroff boolean true
d-i finish-install/reboot_in_progress note

d-i preseed/late_command string cp /cdrom/post_install.sh /target/root/; chmod +x /target/root/post_install.sh; in-target /bin/bash /root/post_install.sh

Dans la dernière commande de notre fichier preseed.cfg, j’exécute un script « post_install » qui va permettre de rendre notre machine virtuelle de développement plus utilisable dès la première utilisation. Il exécute un fichier post_install.sh, dans mon cas sur mes machines de développement mon fichier post_install.sh ressemble à ceci :

post_install.sh
#!/bin/bash

apt-get install git vim ansible net-tools -y

# Disable bell in terminal
echo "set bell-style none" >> /etc/inputrc

# Disable bell in vim
echo "set belloff=all" >> /etc/vim/vimrc

# Configure SSH to allow root login
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

# Configure Issue to show IP
echo "Debian GNU/Linux 12 | My IP address : \4" > /etc/issue

Nous allons maintenant rendre modifiable notre fichier fichier initrd, le décompresser et y ajouter notre fichier preseed.cfg. Chaque commande est à exécuter les unes à la suite des autres.

Bash user command
chmod +w -R install.amd/

gunzip install.amd/initrd.gz

echo preseed.cfg | cpio -H newc -o -A -F install.amd/initrd

gzip install.amd/initrd

chmod -w -R install.amd/

Nous allons maintenant régénérer le md5. Chaque commande est à exécuter les unes à la suite des autres.

Bash user command
chmod +w md5sum.txt

find -follow -type f ! -name md5sum.txt -print0 | xargs -0 md5sum > md5sum.txt

chmod -w md5sum.txt

On génère maintenant notre nouvel ISO.

Bash user command
genisoimage -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../debian-12-ps.iso .

Grâce à notre nouvel ISO précédemment généré, à partir de maintenant quand nous voulons installer notre machine de développement, nous avons la possibilité de soit faire l’installation en « Graphical Install »qui déroulera une installation personnalisé, ou « Install » qui viendra dérouler l’installation sans interaction utilisateur grâce à notre fichier preseed.