Installation de Arch Linux depuis une image bootstrap

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.

  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. Conclusion
  8. 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.

9. Références et remerciements