Installation de Debian 9 Stretch depuis Debootstrap

Lorsque vous commandez un serveur dédié ou VPS, que ce soit chez Kimsufi ou chez Online pour citer les plus connus, vous avez le choix du système d'exploitation.

Celui-ci arrive donc en toute logique préinstallé et préconfiguré, ce que je trouve personnellement dérangeant.

Il est aussi possible que la distribution que vous souhaitez installer ne soit pas disponible, c'est souvent le cas de Arch Linux ou lors de la sortie d'une nouvelle version de Debian par exemple.

L'intérêt d'installer sois même sa distribution c'est que vous savez ce que vous faites, ce que vous ferez et surtout ce qui a été fait.

Je prendrais ici pour exemple le cas d'un serveur dédié Kimsufi mais la manipulation devrait être globalement la même partout à partir du moment ou le fournisseur permet de démarrer sur un système de secours GNU/Linux, que ce soit rescue-pro, Ubuntu, Debian, etc.

  1. Pré-requis
  2. Récupération de la configuration réseau
  3. Récupération du nom de l'interface réseau
  4. Partitionnement
  5. Installation
  6. Configuration
  7. Derniers réglages
  8. Conclusion
  9. Références et remerciements

1. Pré-requis

  • Avoir la possibilité de booter sur un linux rescue (rescue-pro, Ubuntu, Debian, etc.

2. Récupération de la configuration réseau

La première chose à faire et si ce n'est pas déjà fait va être de demander l'installation de Debian (8 et supérieur) via l'interface d'administration de votre serveur.

Cela permettra de récupérer les fichiers de configuration réseau.

Des lignes de commandes valent mieux qu'un long discours :

[user@local ?]$ cd ~
[user@local ~]$ mkdir cfg_save
[user@local ~]$ cd cfg_save/
[user@local cfg_save]$ sftp root@ip
sftp> get /etc/network/interfaces
sftp> get /etc/resolv.conf
sftp> bye

Ceci est la base et vous n'avez normalement besoin de rien d'autre.

On modifie le fichier de configuration resolv.conf afin de supprimer les lignes inutiles comme nameserver 127.0.0.1 servant pour BIND qui est installé depuis le modèle d'origine et search ovh.net :

[user@local cfg_save]$ vim resolv.conf

A titre d'exemple, mon fichier ressemble à ceci sur un serveur dédié Kimsufi KS-2E :

nameserver 213.186.33.99

3. Récupération du nom de l'interface réseau

Depuis la version 197 de systemd, le nom des interfaces réseaux a changé, au-revoir donc à eth0.

[user@local ~]$ ssh root@ip
[root@serveur ~]$ udevadm test-builtin net_id /sys/class/net/eth0 2> /dev/null
    ID_NET_NAME_MAC=enx00123abcde1f
    ID_OUI_FROM_DATABASE=MITAC INTERNATIONAL CORP.
    ID_NET_NAME_PATH=enp1s0
[root@serveur ~]$ exit

Dans mon exemple l'interface réseau s'appelle enp1s0.

On modifie le fichier de configuration interfaces que nous avons rapatrié plus tôt afin de remplacer eth0 par enp1s0 partout où cela est nécessaire :

[user@local cfg_save]$ vim interfaces

A titre d'exemple, mon fichier ressemble à ceci sur un serveur dédié Kimsufi KS-2E :

auto lo
iface lo inet loopback

auto enp1s0
iface enp1s0 inet static
    address 37.xxx.xxx.67
    netmask 255.255.255.0
    broadcast 37.xxx.xxx.255
    gateway 37.xxx.xxx.254

iface enp1s0 inet6 static
    address xxxx:xxxx:xxxx:xxxx::1
    netmask 128
    dns-nameservers 2001:41d0:3:163::1
    post-up sleep 5; /sbin/ip -family inet6 route add xxxx:xxxx:xxxx:xxxx:ff:ff:ff:ff dev enp1s0
    post-up sleep 5; /sbin/ip -family inet6 route add default via xxxx:xxxx:xxxx:xxxx:ff:ff:ff:ff
    pre-down /sbin/ip -family inet6 route del default via xxxx:xxxx:xxxx:xxxx:ff:ff:ff:ff
    pre-down /sbin/ip -family inet6 route del xxxx:xxxx:xxxx:xxxx:ff:ff:ff:ff dev enp1s0

4. Partitionnement

  • Démarrage du serveur sur une image rescue
  • Connexion en SSH avec les identifiants envoyés par email
  • Partitionnement du disque, notez la première partition de 1MIB qui est indispensable à Grub pour du GPT et prenez l'habitude à ne plus utiliser MBR

Allons-y :

[user@local ~]$ ssh-keygen -R ip
[user@local ~]$ ssh root@ip
[root@serveur ~]$ parted /dev/sda
(parted) mklabel gpt
(parted) mkpart primary 1MIB 2MIB
(parted) mkpart primary ext4 2MIB -2GB
(parted) mkpart primary linux-swap -2GB 100%
(parted) set 1 bios_grub on
(parted) quit
[root@serveur ~]$ mkfs.ext4 -m0 /dev/sda2
[root@serveur ~]$ mkswap /dev/sda3
[root@serveur ~]$ swapon /dev/sda3

Vous pouvez adapter votre partitionnement comme bon vous semble, utiliser LVM, faire du thin provisioning mais vous devrez adapter la suite.

Voici mon partitionnement :

[root@serveur ~]$ parted /dev/sda print
    Model: ATA HGST HUS724020AL (scsi)
    Disk /dev/sda: 2000GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:

    Number  Start   End     Size    File system     Name     Flags
    1       1049kB  2097kB  1049kB                  primary  bios_grub
    2       2097kB  1998GB  1998GB  ext4            primary
    3       1998GB  2000GB  2000MB  linux-swap(v1)  primary

Ce qui me donnera :

/    : 2TB
swap : 2GB

5. Installation

Ne pas tenir compte des erreurs que vous pourriez rencontrer du type /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8).

Généralement, deboostrap est installé de base mais si ce n'est pas le cas il suffit de l'installer apt update; apt install debootstrap.

On monte le tout puis on installe avec debootstrap :

[root@serveur ~]$ mount /dev/sda2 /mnt/
[root@serveur ~]$ debootstrap --arch=amd64 --include=dialog,locales,console-data,console-setup,vim,openssh-server stretch /mnt/ http://debian.mirrors.ovh.net/debian/

L'installation initiale est terminée.

6. Configuration

Les fichiers de configuration réseau doivent être restaurés :

[user@local ~]$ cd cfg_save/
[user@local ~]$ sftp root@ip
sftp> put interfaces /mnt/etc/network/
sftp> put resolv.conf /mnt/etc/
sftp> bye

Chroot sur le futur système :

[user@local ~]$ ssh root@ip
[root@serveur ~]$ cd /mnt/
[root@serveur mnt]$ mount -B /proc proc
[root@serveur mnt]$ mount -B /run run
[root@serveur mnt]$ mount -B /sys sys
[root@serveur mnt]$ mount -B /dev dev
[root@serveur mnt]$ mount -B /dev/pts dev/pts
[root@serveur mnt]$ cd ~
[root@serveur ~]$ chroot /mnt/ /bin/bash

Création du fichier /etc/hostname contenant le nom d'hôte souhaité :

[root@serveur /]$ echo CHANGEME > /etc/hostname

Modification de /etc/hosts afin d'ajouter le nom d'hôte :

; […]
127.0.1.1 CHANGEME
; […]

Configuration des locales (choisir en_US.UTF-8 UTF-8 et fr_FR.UTF-8 UTF-8), du clavier, de la zone :

[root@serveur /]$ dpkg-reconfigure locales keyboard-configuration console-data tzdata
[root@serveur /]$ export LANG=fr_FR.UTF-8
[root@serveur /]$ hwclock --systohc

Modification de /etc/apt/sources.list :

deb http://debian.mirrors.ovh.net/debian stretch main
deb http://debian.mirrors.ovh.net/debian stretch-updates main
deb http://debian.mirrors.ovh.net/debian stretch-backports main
deb http://debian.mirrors.ovh.net/debian-security stretch/updates main

Récupération des UUID :

[root@serveur /]$ blkid

Qui pour moi retourne :

/dev/sda1: PARTLABEL="primary" PARTUUID="e00ea6f1-7ada-48f8-923f-b81d06e400d6"
/dev/sda2: UUID="82efb9b0-a19c-4e2a-b77a-6d2ef46b0f51" TYPE="ext4" PARTLABEL="primary" PARTUUID="28d7f730-fc8c-41ac-bd25-781c6d5d3351"
/dev/sda3: UUID="d1d4628a-dc33-49c0-9b6d-9a6d8743f098" TYPE="swap" PARTLABEL="primary" PARTUUID="d27e86c0-bd36-49b9-8814-10b24eb0398a"

Modification de /etc/fstab, vous devrez donc adapter :

UUID=82efb9b0-a19c-4e2a-b77a-6d2ef46b0f51 /     ext4 rw,noatime,nodiratime 0 1
UUID=d1d4628a-dc33-49c0-9b6d-9a6d8743f098 none  swap defaults              0 0

Installation de Grub2 :

[root@serveur /]$ apt install --no-install-recommends linux-image-amd64 grub-pc os-prober

Choisir /dev/sda.

Modification de /boot/grub/grub.cfg afin de supprimer le timeout du menu pour booter immédiatement :

# […]
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=0
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=0
fi
# […]

Modification du password root :

[root@serveur /]$ passwd

Création d'un utilisateur :

[root@serveur /]$ useradd -m -s /bin/bash CHANGEME
[root@serveur /]$ passwd CHANGEME

L'installation est terminée, vous devez maintenant redémarrer sur le disque dur en modifiant l'option de boot via l'interface d'administration de votre manager :

[root@serveur /]$ exit
[root@serveur ~]$ cd /mnt/
[root@serveur mnt]$ umount {proc,run,sys,dev/pts,dev}
[root@serveur mnt]$ cd ..
[root@serveur /]$ umount mnt/ -R
[root@serveur /]$ reboot

7. Derniers réglages

Admettons que tout fonctionne bien, on se connecte en SSH sur notre système :

[user@local ~]$ ssh-keygen -R ip
[user@local ~]$ ssh user@ip
[user@serveur ~]$ su -

On met à jour :

[root@serveur ~]$ apt update
[root@serveur ~]$ apt upgrade
[root@serveur ~]$ apt-get clean

8. Conclusion

Votre système est maintenant installé.

Si votre système ne répond plus ou que vous ne pouvez pas y accéder par SSH c'est que vous avez mal fais quelque chose.

Dans ce cas vous pouvez faire un reboot hardware en rescue et voir ce qui cloche en chrootant puis regarder dans /var/log, journalctl, etc.

  • Il est fortement conseillé de configurer OpenSSH avec un système de clé publique/privé
  • D'installer iptables-persistent puis de créer vos règles

9. Références et remerciements