Installer automatiquement Ubuntu (ou Debian)

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 :

  1. Serveur DHCP ;
  2. Serveur TFTP ;
  3. 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.

Haut de page