Lorsque vous louez un serveur (dédié ou VPS), que ce soit chez Kimsufi, Online ou Hetzner 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.
- Pré-requis
- Récupération de la configuration réseau
- Récupération du nom de l'interface réseau
- Partitionnement
- Installation
- Configuration
- Conclusion
- 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
Si vous n'avez pas la possibilité d'installer Arch Linux, vous pouvez installer Debian 8 ou supérieur puis récupérer le fichier de configuration /etc/network/interfaces qu'il vous suffira d'adapter au format netctl (des exemples sont disponibles dans la suite du guide).
Si c'est possible, le plus simple sera de demander l'installation d'Arch Linux via l'interface d'administration de votre serveur, cela permettra de récupérer le fichier 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/netctl/ovh_net_eth0
sftp> get /etc/resolv.conf
sftp> bye
Ceci est la base et vous n'avez normalement besoin de rien d'autre.
Le fichier de configuration ovh_net_eth0 sera sans doute nommée autrement en fonction de votre hébergeur.
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 que nous avons rapatrié plus tôt afin de remplacer eth0 par enp1s0 partout où cela est nécessaire :
[user@local cfg_save]$ mv ovh_net_eth0 ovh_net_enp1s0
[user@local cfg_save]$ vim ovh_net_enp1s0
A titre d'exemple, mon fichier ressemble à ceci sur un serveur dédié Kimsufi KS-2E :
# IPv4 Setup
Description='A basic static ethernet connection'
Interface=enp1s0
Connection=ethernet
IP=static
Address=('37.xxx.xxx.67/24')
Gateway=('37.xxx.xxx.254')
DNS=('213.186.33.99')
# IPv6 Setup
IP6=static
Address6=('xxxx:xxxx:xxxx:xxxx::1/128')
IPCustom=('-6 route add xxxx:xxxx:xxxx:xxxx:ff:ff:ff:ff dev enp1s0' '-6 route add default via xxxx:xxxx:xxxx:xxxx:ff:ff:ff:ff')
Et à ceci sur un VPS FirstHeberg GP 2 :
# IPv4 Setup
Description='A basic static ethernet connection'
Interface=ens18
Connection=ethernet
IP=static
Address=('188.xxx.xxx.154/24')
Gateway='188.xxx.xxx.1'
DNS=('91.229.20.223' '37.59.126.29')
# IPv6 Setup
IP6=static
Address6=('xxxx:xxxx:xx:xxxx::1/128')
IPCustom=('-6 route add default via fe80::1 dev ens18')
4. Partitionnement
- Démarrage du serveur sur une image rescue
- Connexion en SSH avec les identifiants envoyés par email
- Partitionnement du disque, notez l'utilisation de 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 ext2 0% 200MB
(parted) mkpart primary ext4 200MB -2GB
(parted) mkpart primary linux-swap -2GB 100%
(parted) set 1 boot on
(parted) quit
[root@serveur ~]# mkfs.ext2 -m0 /dev/sda1
[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.
Attention, si vous utilisez GRUB, vous devrez taper set 1 bios_grub on
et non set 1 boot on
, dans mon cas j'utiliserais syslinux
.
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 200MB 199MB ext2 primary boot, esp
2 200MB 1998GB 1998GB ext4 primary
3 1998GB 2000GB 2000MB linux-swap(v1) primary
Ce qui me donnera approximativement :
/boot : 200MB
/ : 2TB
swap : 2GB
5. Installation
Nous allons récupérer le dernier lien vers l'archive bootstrap disponible sur la page officielle de téléchargement.
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).
Création de l'environnement :
[root@serveur ~]# curl -O http://archlinux.mirrors.ovh.net/archlinux/iso/latest/archlinux-bootstrap-XXXX.XX.XX-x86_64.tar.gz
[root@serveur ~]# tar zxf archlinux-bootstrap-XXXX.XX.XX-x86_64.tar.gz
[root@serveur ~]# rm -f archlinux-bootstrap-XXXX.XX.XX-x86_64.tar.gz
[root@serveur ~]# cd root.x86_64/
[root@serveur root.x86_64]# cp /etc/resolv.conf etc
[root@serveur root.x86_64]# mount -B /proc proc
[root@serveur root.x86_64]# mount -B /run run
[root@serveur root.x86_64]# mount -B /sys sys
[root@serveur root.x86_64]# mount -B /dev dev
[root@serveur root.x86_64]# mount -B /dev/pts dev/pts
[root@serveur root.x86_64]# mount /dev/sda2 mnt
[root@serveur root.x86_64]# mkdir mnt/boot/
[root@serveur root.x86_64]# mount /dev/sda1 mnt/boot
[root@serveur root.x86_64]# vim etc/pacman.conf
[root@serveur root.x86_64]# vim etc/pacman.d/mirrorlist
Modification de la ligne suivante dans etc/pacman.conf :
; […]
SigLevel = Never
; […]
On décommente un ou plusieurs mirrors au choix dans etc/pacman.d/mirrorlist :
; […]
Server = http://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
#Server = http://archlinux.mirror.pkern.at/$repo/os/$arch
#Server = https://archlinux.mirror.pkern.at/$repo/os/$arch
Server = http://archlinux.polymorf.fr/$repo/os/$arch
#Server = http://arch.static.lu/$repo/os/$arch
; […]
On rentre dans le chroot et on installe :
[root@serveur root.x86_64]# cd ~
[root@serveur ~]# chroot root.x86_64/ /bin/bash
[root@serveur /]# pacstrap /mnt base syslinux gptfdisk openssh haveged vim
[root@serveur /]# genfstab -pU /mnt >> /mnt/etc/fstab
[root@serveur /]# cat /mnt/etc/fstab
[root@serveur /]# exit
[root@serveur ~]# cd root.x86_64/
[root@serveur root.x86_64]# umount {proc,run,sys,dev/pts,dev}
Votre fichier /mnt/etc/fstab devrait ressembler à ceci, libre à vous de l'optimiser :
#
# /etc/fstab: static file system information
#
# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sda2
UUID=a6912f6f-83fd-4c22-8ed8-ad94bfb5bf22 / ext4 rw,relatime,data=ordered 0 1
# /dev/sda1
UUID=8286b904-7995-4d15-b744-92aa10bbd6b9 /boot ext2 rw,relatime,errors=continue,user_xattr,acl 0 2
# /dev/sda3
UUID=0d1e6a93-96e2-4508-bc88-52d7363a934b none swap defaults 0 0
L'installation initiale est terminée.
6. Configuration
Le fichier de configuration réseau doit être restauré :
[user@local ~]$ cd cfg_save/
[user@local ~]$ sftp root@ip
sftp> put ovh_net_enp1s0 /root/root.x86_64/mnt/etc/netctl/
sftp> bye
Chroot sur le futur système :
[user@local ~]$ ssh root@ip
[root@serveur ~]# cd ~/root.x86_64/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 ~/root.x86_64/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.localdomain CHANGEME
; […]
Création du fichier /etc/vconsole.conf pour un clavier français :
KEYMAP=fr-latin9
FONT=lat9w-16
Création du fichier /etc/locale.conf pour la localisation française :
LANG=fr_FR.UTF-8
LC_COLLATE=C
Modification de /etc/locale.gen pour le français :
; […]
en_US.UTF-8 UTF-8
; […]
fr_FR.UTF-8 UTF-8
; […]
Génération des locales :
[root@serveur /]# locale-gen
[root@serveur /]# export LANG=fr_FR.UTF-8
Fuseau horaire :
[root@serveur /]# ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
[root@serveur /]# hwclock --systohc
Configuration du client ntp systemd-timesyncd en modifiant le fichier /etc/systemd/timesyncd.conf :
[Time]
NTP=0.fr.pool.ntp.org 1.fr.pool.ntp.org 2.fr.pool.ntp.org 3.fr.pool.ntp.org
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org
Démarrage et activation du daemon systemd-timesyncd :
[root@serveur /]# timedatectl set-ntp true
Activation de netctl et sshd
[root@serveur /]# systemctl enable sshd.service
[root@serveur /]# netctl enable ovh_net_enp1s0
Installation de syslinux sur la MBR :
[root@serveur /]# syslinux-install_update -iam
Modification de /etc/mkinitcpio.d/linux.preset :
; […]
PRESETS=('default')
; […]
Le preset fallback n'étant pas utilisé, on supprime l'image car elle ne sera de toute façon plus jamais générée ni utilisée :
[root@serveur /]# rm -f /boot/initramfs-linux-fallback.img
Récupération des UUID :
[root@serveur /]# blkid
Qui pour moi retourne :
/dev/sda1: UUID="8286b904-7995-4d15-b744-92aa10bbd6b9" TYPE="ext2" PARTLABEL="primary" PARTUUID="6ca524fc-ed2d-48a8-a5d7-c915884f985c"
/dev/sda2: UUID="a6912f6f-83fd-4c22-8ed8-ad94bfb5bf22" TYPE="ext4" PARTLABEL="primary" PARTUUID="10544719-d5e9-4a7b-bd40-9a594ed8486e"
/dev/sda3: UUID="0d1e6a93-96e2-4508-bc88-52d7363a934b" TYPE="swap" PARTLABEL="primary" PARTUUID="2207b1c0-3123-404c-9fc0-279af579427a"
Modification de /boot/syslinux/syslinux.cfg en utilisant l'UUID de la partition /, vous devrez donc adapter :
; […]
TIMEOUT 1
; […]
LABEL arch
MENU LABEL Arch Linux
LINUX ../vmlinuz-linux
APPEND root=UUID=a6912f6f-83fd-4c22-8ed8-ad94bfb5bf22 rw
INITRD ../initramfs-linux.img
; […]
Le kernel fallback ayant été supprimé, vous devez supprimer ce bloc :
; […]
LABEL archfallback
MENU LABEL Arch Linux Fallback
LINUX ../vmlinuz-linux
APPEND root=/dev/sda3 rw
INITRD ../initramfs-linux-fallback.img
; […]
Modification du password root :
[root@serveur /]# passwd
Création d'un utilisateur :
[root@serveur /]# useradd -m -s /bin/bash CHANGEME
[root@serveur /]# passwd CHANGEME
Initialisation du trousseau pacman :
[root@serveur /]# haveged -w 1024
[root@serveur /]# pacman-key --init
[root@serveur /]# pacman-key --populate archlinux
[root@serveur /]# pkill haveged
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 ~/root.x86_64/mnt/
[root@serveur mnt]# umount {proc,run,sys,dev/pts,dev}
[root@serveur mnt]# cd ..
[root@serveur root.x86_64]# umount mnt/ -R
[root@serveur root.x86_64]# reboot
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ée
- De peaufiner votre fichier /etc/pacman.d/mirrorlist grâce à l'outil Pacman Mirrorlist Generator
- D'activer iptables.service et ip6tables.service puis de créer vos règles