Le but de la manipulation va être de configurer un système Linux (ici Debian) pour installer de manière totalement automatisée une Ubuntu Trusty 64 bits.
L'utilisation typique est pour un GUL qui souhaite installer très facilement plusieurs PC qui serviront pour faire des démonstrations.
Prérequis
Il faut une machine avec deux connexions réseau, dont au moins une filaire et un peu moins de 100 Go pour un miroir complet d'Ubuntu pour une architecture (32 bits ou 64 bits).
Pour la partie système, j'ai choisi d'installer Debian avec XFCE et l'installation de ce dernier n'est pas l'objet de ce billet.
Avoir une connaissance du fonctionnement d'un système Linux et de l'utilisation de la ligne de commande.
Une fois le système installé, on a besoin de quelques outils supplémentaires :
dnsmasq
(peut être remplacé par dhcpd + tftpd + bind9, mais c'est beaucoup plus simple avec dnsmasq) ;nginx
(ou n'importe quel serveur web) ;apt-mirror
;syslinux-common
;pxelinux
;ntp
(démon) ;apt-cacher-ng
(facultatif).
Configuration d'apt-mirror
apt-mirror
va servir à faire un miroir local d'apt pour fournir les paquets sans connexion internet.
Le fichier de configuration d'apt-mirror est situé ici /etc/apt/mirror.list
, par défaut apt-mirror utilise l'architecture du système, dans notre cas le but est d'avoir un miroir d'Ubuntu 14.04 64 bits, et le système installé est une Debian Jessie 32 bits. Le fichier de configuration a donc été modifié pour ressembler à ça :
set defaultarch amd64 set _tilde 0 deb http://archive.ubuntu.com/ubuntu trusty main multiverse universe restricted deb http://archive.ubuntu.com/ubuntu trusty-updates main multiverse universe restricted deb http://archive.ubuntu.com/ubuntu trusty-security main multiverse universe restricted #needed for netboot install deb http://archive.ubuntu.com/ubuntu trusty main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer deb http://archive.ubuntu.com/ubuntu trusty-updates main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer deb http://security.ubuntu.com/ubuntu trusty-security main multiverse universe restricted #avoid timeout with netboot autoconfiguring security deb-i386 http://security.ubuntu.com/ubuntu trusty-security main multiverse universe restricted deb-i386 http://archive.ubuntu.com/ubuntu trusty-security main multiverse universe restricted
D'autres options sont possibles, comme spécifier où stocker les paquets, le nombre de téléchargements à effectuer en parallèle, pour les détails voir la documentation d'apt-mirror.
Pour générer le miroir, il suffit de lancer la commande apt-mirror
, en root. Il est possible d'arrêter la commande à tout moment, relancer la commande pour reprendre les téléchargements.
Configuration de l'interface réseau en IP statique
Avant d'aller plus loin, il est important d'identifier quelle interface réseau va servir à effectuer les installations, ici, il s'agit de l'interface eth0 et le réseau 192.168.2.0/24
sera utilisé.
Voici ce que l'on positionne dans le fichier /etc/network/interfaces :
allow-hotplug eth0 iface eth0 inet static address 192.168.2.1 netmask 255.255.255.0 auto eth0
Pour activer le port forwarding (permet de laisser la machine accéder à Internet lorsqu'elle est sur le réseau filaire), cela se fait avec la commande suivante qui a été ajoutée dans le fichier /etc/rc.local
afin que le paramétrage soit effectué au démarrage de la machine :
iptables -t nat -A POSTROUTING -j MASQUERADE -s 192.168.2.0/24
Et enfin, en ajoutant l'option suivante dans le fichier /etc/sysctl.conf
net.ipv4.ip_forward=1
Configuration de dnsmasq
DNSmasq va servir à plusieurs choses :
- Serveur DHCP ;
- Serveur TFTP ;
- Serveur DNS.
Le fichier de configuration de dnsmasq est ici : /etc/dnsmasq.conf
.
Dans un premier temps, on va configurer dnsmasq pour ne fonctionner que sur l'interface réseau qui nous intéresse, ici eth0.
interface=eth0 except-interface=wlan0 bind-interfaces
Ensuite, on active la partie DHCP
dhcp-range=192.168.2.20,192.168.2.80,1h dhcp-option=option:router,192.168.2.1 dhcp-boot=pxelinux.0 dhcp-authoritative domain=toulibre.org
Puis TFTP
enable-tftp tftp-root=/srv/tfpd tftp-no-blocksize
Et enfin, la partie DNS
address=/security.ubuntu.com/192.168.2.1 address=/local.ubuntu.com/192.168.2.1 address=/boot.ubuntu.com/192.168.2.1
Ici, on effectue un DNS menteur
sur la zone ubuntu.com, ce n'est pas forcément très heureux mais ça permet d'éviter d'aller sur internet pour des ressources que l'on peut servir localement.
De plus, on « fabrique » deux sous-domaines qui n'existent pas chez ubuntu.com, pour local. et boot. on pouvait aussi prendre un domaine bidon comme chez.moi.
Configuration de nginx
On va activer nginx pour servir trois domaines, les trois que l'on usurpe à ubuntu.com.
Voici donc ce que l'on va placer dans /etc/nginx/sites-available/defaults
:
server { listen 80 default_server; root /srv/apt/archive.ubuntu.com/; index index.html index.htm; server_name archive.ubuntu.com local.ubuntu.com; location / { try_files $uri $uri/ =404; } } server { server_name security.ubuntu.com; root /srv/apt/security.ubuntu.com; location / { try_files $uri $uri/ =404; } } server { server_name boot.ubuntu.com; root /srv/boot/; location / { try_files $uri $uri/ =404; } }
Il ne reste plus qu'à faire des liens symboliques pour rendre les fichiers d'apt-mirror visibles par nginx.
mkdir -p /srv/apt/ ln -s /var/spool/apt-mirror/mirror/archive.ubuntu.com/ /srv/apt/archive.ubuntu.com ln -s /var/spool/apt-mirror/mirror/archive.ubuntu.com/ /srv/apt/security.ubuntu.com
Configuration de la partie TFTP
Commençons par créer le dossier
mkdir -p /srv/tftp cd /srv/tftp
Puis par copier les fichiers de base
cp /usr/lib/syslinux/modules/bios/menu.c32 . cp /usr/lib/syslinux/modules/bios/ldlinux.c32 . #?? cp /usr/lib/PXELINUX/pxelinux.0 .
On télécharge l'image netboot fournie par Ubuntu
wget http://archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/linux wget http://fr.archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz
Et on termine de configurer le menu de boot PXE :
mdkir pxelinux.cfg cat pxelinux.cfg/default << EOF default menu.c32 menu "install auto, Toulibre" label autoboot menu label Ubuntu Trusty 64 bits fullauto menu default timeout 30 kernel linux append initrd=initrd.gz auto url=http://boot.ubuntu.com/preseed.cfg vga=788 debian-installer/locale=fr_FR console-setup/ask_detect=false console-setup/layoutcode=fr keyboard-configuration/layoutcode=fr keyboard-configuration/variantcode=latin9 EOF
Ici, on a ajouté quelques options sur la ligne append, voici le détail :
- auto : installation automatique, suivre les informations du fichier preseed ;
- url : où trouver le fichier preseed ;
- vga : permet d'avoir une résolution d'écran lisible, peut être totalement supprimé sans problème ;
- debian-installer, console-setup et keyboard-configuration : permet de répondre aux questions relatives à la disposition du clavier qui sont demandées avant la lecture du fichier preseed.cfg.
Configuration du système preseed
Le fichier preseed contient les réponses dont a besoin l'installeur pour fonctionner. S'il ne trouve pas la réponse dans le fichier, alors il demande à l'utilisateur.
apt-mirror-setup apt-setup/backports boolean true apt-mirror-setup apt-setup/extras boolean true apt-mirror-setup apt-setup/multiverse boolean true apt-mirror-setup apt-setup/partner boolean true apt-mirror-setup apt-setup/restricted boolean true apt-mirror-setup apt-setup/universe boolean true apt-setup-udeb apt-setup/services-select multiselect security d-i apt-setup/backports boolean true d-i apt-setup/restricted boolean true d-i apt-setup/universe boolean true
Ces différentes options activent les dépôts apt que l'on souhaite utiliser sur la machine.
clock-setup clock-setup/ntp boolean true clock-setup clock-setup/utc boolean true d-i clock-setup/ntp-server string local.ubuntu.com tzsetup-udeb time/zone string Europe/Paris d-i time/zone string Europe/Paris
Questions relatives à l'heure, synchronisation ntp et horloge interne en UTC.
d-i cdrom-detect/eject boolean false d-i finish-install/reboot_in_progress note
Faut-il éjecter le cd à la fin de l'installation, non, car il s'agit d'une install réseau :) (permet aussi de laisser le PC redémarrer automatiquement).
d-i console-setup/ask_detect boolean false d-i console-setup/detect detect-keyboard d-i console-setup/detected note d-i debconf/language string fr d-i debian-installer/country string FR d-i debian-installer/language string fr d-i debian-installer/locale select fr_FR.UTF-8 d-i keyboard-configuration/layout select Français d-i keyboard-configuration/layout select Français d-i keyboard-configuration/modelcode string pc105 d-i keyboard-configuration/model select d-i keyboard-configuration/variantcode string latin9 d-i keyboard-configuration/variant select Français - Français (variante obsolète) d-i keyboard-configuration/variant select Français - Français (variante obsolète) d-i keyboard-configuration/xkb-keymap select fr(latin9) d-i localechooser/languagelist select fr d-i localechooser/preferred-locale select fr_FR.UTF-8 d-i localechooser/shortlist select FR d-i localechooser/shortlist select FR
Permet de configurer le clavier et la langue, certaines options ont déjà été fournies au moment du boot et sont donc renseignées deux fois, mais ça n'a aucun impact.
d-i grub-installer/only_debian boolean true d-i grub-installer/with_other_os boolean true
Installation de grub automatique et réponses aux questions pour savoir s'il n'y a qu'un seul système ou plusieurs.
d-i mirror/country string manual d-i mirror/http/directory string /ubuntu d-i mirror/http/hostname string local.ubuntu.com d-i mirror/http/proxy string
Définition du miroir qui va être utilisé, on sélectionne donc le miroir local (qui pointe sur notre PC).
d-i hw-detect/load_firmware boolean true
Chargement automatique des firmwares pour faire fonctionner certains périphériques (carte réseau notamment).
d-i msttcorefonts/accepted-mscorefonts-eula boolean true d-i msttcorefonts/present-mscorefonts-eula note ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula boolean true
Permet d'installer automatiquement les polices de compatibilité microsoft (package ttf-mscorefont)
d-i netcfg/choose_interface select auto
Sélectionne automatiquement la carte réseau, peut ne pas fonctionner sur une machine avec plusieurs cartes réseau.
d-i partman-auto/choose_recipe select atomic d-i partman-auto/disk string /dev/sda d-i partman-auto-lvm/guided_size string max d-i partman-auto/method string regular d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true d-i partman/default_filesystem string ext4 d-i partman-lvm/confirm boolean true d-i partman-lvm/device_remove_lvm boolean true d-i partman-md/device_remove_md boolean true d-i partman-partitioning/confirm_write_new_label boolean true
Partitionnement du disque dur, ici on demande d'effectuer un partitionnement de manière automatique avec une seule partition en ext4, utilisant tout le disque /dev/sda.
Pas de présence de RAID logiciel ou LVM.
Attention donc car l'installeur ne cherchera pas à savoir si ce qu'il y a sur le disque est (était) important !
d-i passwd/root-login boolean false d-i passwd/user-fullname string Toulibre Demo d-i passwd/username string toulibre d-i passwd/user-password-again password toulibre d-i passwd/user-password password toulibre d-i user-setup/allow-password-weak boolean true d-i user-setup/encrypt-home boolean false
Configuration de l'utilisateur avec le mot de passe, il est possible de fournir une chaîne chiffrée pour le mot de passe (afin de ne pas l'écrire en clair dans ce fichier)
d-i pkgsel/include string openssh-server build-essential vim htop libreoffice firefox thunderbird gimp eog ntp screen vlc audacity language-pack-fr openshot ubuntu-restricted-extras d-i pkgsel/language-packs multiselect fr tasksel tasksel/first multiselect ubuntu-desktop, standard
Sélection des tâches à effectuer et paquets à installer, ubuntu-desktop permet d'avoir un environnement standard, ensuite on installe quelques logiciels que l'on souhaite avoir en plus.
pkgsel pkgsel/update-policy select unattended-upgrades popularity-contest popularity-contest/participate boolean false
Unattended upgrades permet au système de faire les mises à jour silencieusement (cf https://help.ubuntu.com/community/AutomaticSecurityUpdates).
L'autre ligne permet de répondre que l'on ne souhaite pas participer à l'évaluation (anonyme) de popularité des logiciels.
d-i preseed/late_command string in-target wget --no-proxy -O/tmp/postconf.sh http://boot.ubuntu.com/postconf.sh; in-target bash /tmp/postconf.sh
Permet d’exécuter un script de post-configuration.
C'est tout pour le fichier preseed.
Script de post configuration
Le script de post-conf est facultatif, mais il permet d'effectuer quelques dernières modif sur le système avant de le relancer.
#!/bin/bash #update ubuntu using apt-cacher-ng, not impacted by dnsmasq jobs on secu. echo 'Acquire::http::Proxy "http://192.168.2.1:3142/";' > /etc/apt/apt.conf cat << EOF > /etc/apt/sources.list deb http://fr.archive.ubuntu.com/ubuntu trusty main universe multiverse restricted deb http://fr.archive.ubuntu.com/ubuntu trusty-updates main universe multiverse restricted deb http://fr.archive.ubuntu.com/ubuntu trusty-backports main universe multiverse restricted deb http://security.ubuntu.com/ubuntu trusty-security main universe multiverse restricted deb http://archive.canonical.com/ubuntu trusty partner deb http://extras.ubuntu.com/ubuntu trusty main EOF
apt-get update apt-get -y dist-upgrade #reset apt-proxy to a null value, allow end-user to install apps rm -f /etc/apt/apt.conf
Ces quelques lignes permettent de mettre à jour l'installation en allant chercher sur internet (cas où le miroir local de ne serait pas à jour), il remet aussi les lignes du sources.list sur des valeurs qui existent.
#### fixubuntu #amazon apt-get -y purge unity-webapps-common #script from fixubuntu.com wget http://boot.ubuntu.com/fixubuntu.sh -O/tmp/fixubuntu.sh su - toulibre -c '/bin/bash /tmp/fixubuntu.sh' &>/var/log/fixubuntu.log if ! grep -q "127.0.0.1 productsearch.ubuntu.com" /etc/hosts; then echo -e "\n127.0.0.1 productsearch.ubuntu.com" | tee -a /etc/hosts >/dev/null fi exit 0
Enfin, cette partie supprime la présence d'Amazon sur le système.
1 De Hadrien TOMA -
Bonjour et merci pour cet article! Preseeding <3.
Petite question: Sauriez-vous où trouver les références officielles concernant les valeurs que prendre un item du `preseed.cfg`? Par exemple, pour la ligne `d-i debian-installer/country string FR`, comment puis-je savoir les autres valeurs (différentes de `FR`) que peut prendre `debian-installer/country`? J'ai trouvé des exemples et de la documentation mais pas de "Références" officielles et complètes.
En vous remerciant encore!
2 De Aymeric -
@Hadrien, je n’ai pas liste pour d-i/country mais tu peux trouver une bonne partie des options possibles ici : https://www.aplu.fr/v2/public/prese...
Pour extraire cette liste, il faut utiliser on fait ça avec les commandes du wiki Debian : https://wiki.debian.org/DebianInsta...
Aymeric/aplu.fr
3 De Phalazur -
Bonsoir, je voudrais savoir quels sont les variables utilisées pour enregistrer l’utilisateur
$USER = root. Je souhaiterais lancer un script à la fin mais pas en root , ?