Configuration Serveur Hetzner¶
Introduction¶
Cette section couvre la configuration initiale du serveur dédié Hetzner AX102, incluant l'installation de l'OS, le partitionnement optimal et la configuration réseau de base.
Prérequis¶
- Serveur Hetzner AX102 commandé
- Accès au Robot (panel Hetzner)
- Clé SSH générée
Points à apprendre¶
Spécifications AX102¶
CPU: AMD Ryzen 9 5900X (12 cores / 24 threads @ 3.7-4.8 GHz)
RAM: 128 GB DDR4 ECC
Stockage: 2 x 1.92 TB NVMe SSD (Samsung PM9A3 ou similaire)
Réseau: 1 Gbit/s (upgrade 10G disponible)
Prix: ~130€/mois
Installation via Rescue System¶
1. Booter en mode Rescue¶
# Dans le Robot Hetzner :
# 1. Aller sur le serveur
# 2. Rescue → Activer rescue system (Linux 64bit)
# 3. Reset → Execute automatic hardware reset
# Se connecter en SSH (mot de passe dans le panel)
ssh root@HETZNER_IP
2. Installation avec installimage¶
3. Configuration du partitionnement¶
Éditer la configuration proposée pour optimiser l'espace :
# Configuration installimage
DRIVE1 /dev/nvme0n1
DRIVE2 /dev/nvme1n1
# RAID pour le système (petit, fiable)
SWRAID 1
SWRAIDLEVEL 1
# Partitionnement
PART /boot ext4 1G
PART lvm vg0 all
# Logical volumes sur vg0
LV vg0 root / ext4 100G
LV vg0 swap swap swap 16G
LV vg0 libvirt /var/lib/libvirt ext4 400G
# Le reste sera utilisé pour un second VG (données Ceph simulées)
# On le créera manuellement après
HOSTNAME openstack-lab
4. Post-installation¶
# Après reboot, se reconnecter
ssh root@HETZNER_IP
# Vérifier le partitionnement
lsblk
df -h
vgs
lvs
Configuration réseau¶
Identifier l'interface¶
Netplan pour accès externe¶
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
enp41s0:
addresses:
- HETZNER_IP/32
routes:
- to: default
via: HETZNER_GATEWAY
on-link: true
nameservers:
addresses:
- 185.12.64.1
- 185.12.64.2
Création de l'espace pour les VMs¶
Volume Group pour libvirt¶
# L'espace restant sur les NVMe après le RAID système
# On crée un VG dédié aux images de VMs
# Si le deuxième NVMe n'est pas entièrement utilisé
# Créer un PV avec l'espace restant
lvcreate -l 100%FREE -n data vg0
# Ou utiliser le deuxième NVMe directement pour les OSD
# (nous le ferons plus tard via LVM dans les VMs)
Installation des prérequis¶
# Mise à jour système
apt update && apt upgrade -y
# Paquets essentiels
apt install -y \
qemu-kvm \
libvirt-daemon-system \
libvirt-clients \
virtinst \
bridge-utils \
virt-manager \
cloud-image-utils \
genisoimage \
wget \
curl \
vim \
htop \
tmux \
git
# Activer libvirtd
systemctl enable --now libvirtd
Configuration bridges réseau pour VMs¶
# /etc/netplan/01-netcfg.yaml (version complète)
network:
version: 2
ethernets:
enp41s0:
dhcp4: false
dhcp6: false
bridges:
# Bridge pour accès externe (NAT)
br-external:
interfaces: []
addresses:
- 192.168.100.1/24
mtu: 1500
# Bridge management OpenStack
br-mgmt:
interfaces: []
addresses:
- 10.0.0.1/24
mtu: 1500
# Bridge storage Ceph
br-storage:
interfaces: []
addresses:
- 10.0.1.1/24
mtu: 9000 # Jumbo frames pour stockage
# Bridge externe pour Neutron provider network
br-provider:
interfaces: []
addresses: []
mtu: 1500
# Appliquer
netplan apply
# Vérifier
ip addr show br-mgmt
ip addr show br-storage
ip addr show br-external
Configuration NAT pour accès internet des VMs¶
# Activer IP forwarding
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/99-forward.conf
sysctl -p /etc/sysctl.d/99-forward.conf
# NAT avec iptables (via br-external)
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp41s0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp41s0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o enp41s0 -j MASQUERADE
# Persister les règles
apt install -y iptables-persistent
netfilter-persistent save
Configuration SSH sécurisée¶
# Désactiver password auth
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# Désactiver root password login (garder key)
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
systemctl restart sshd
Télécharger l'image cloud Ubuntu¶
# Créer répertoire pour les images
mkdir -p /var/lib/libvirt/images/base
# Télécharger Ubuntu 24.04 cloud image
cd /var/lib/libvirt/images/base
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
# Vérifier
qemu-img info noble-server-cloudimg-amd64.img
Création d'un template cloud-init¶
mkdir -p /var/lib/libvirt/cloud-init
# Template user-data de base
cat > /var/lib/libvirt/cloud-init/user-data-template << 'EOF'
#cloud-config
hostname: HOSTNAME
manage_etc_hosts: true
users:
- name: ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
lock_passwd: false
ssh_authorized_keys:
- SSH_PUBLIC_KEY
chpasswd:
list: |
ubuntu:ubuntu
expire: false
package_update: true
package_upgrade: false
packages:
- qemu-guest-agent
- python3
- python3-pip
- vim
- curl
- wget
runcmd:
- systemctl enable --now qemu-guest-agent
EOF
Script de création de VM¶
cat > /usr/local/bin/create-vm.sh << 'EOF'
#!/bin/bash
set -e
# Usage: create-vm.sh <name> <ram_mb> <vcpus> <disk_gb> [extra_disk_gb]
NAME=$1
RAM=$2
VCPUS=$3
DISK=$4
EXTRA_DISK=${5:-0}
BASE_IMG="/var/lib/libvirt/images/base/noble-server-cloudimg-amd64.img"
VM_DIR="/var/lib/libvirt/images"
CLOUD_INIT_DIR="/var/lib/libvirt/cloud-init"
SSH_KEY=$(cat ~/.ssh/id_rsa.pub 2>/dev/null || cat ~/.ssh/id_ed25519.pub)
# Créer disque VM
qemu-img create -f qcow2 -F qcow2 \
-b $BASE_IMG \
$VM_DIR/${NAME}.qcow2 ${DISK}G
# Créer disque extra si demandé (pour OSD Ceph)
EXTRA_DISK_OPT=""
if [ "$EXTRA_DISK" -gt 0 ]; then
qemu-img create -f qcow2 $VM_DIR/${NAME}-data.qcow2 ${EXTRA_DISK}G
EXTRA_DISK_OPT="--disk $VM_DIR/${NAME}-data.qcow2,format=qcow2,bus=virtio"
fi
# Générer cloud-init
mkdir -p $CLOUD_INIT_DIR/$NAME
sed "s/HOSTNAME/$NAME/g; s|SSH_PUBLIC_KEY|$SSH_KEY|g" \
$CLOUD_INIT_DIR/user-data-template > $CLOUD_INIT_DIR/$NAME/user-data
cat > $CLOUD_INIT_DIR/$NAME/meta-data << METADATA
instance-id: $NAME
local-hostname: $NAME
METADATA
# Créer ISO cloud-init
genisoimage -output $CLOUD_INIT_DIR/$NAME/cidata.iso \
-V cidata -r -J \
$CLOUD_INIT_DIR/$NAME/user-data \
$CLOUD_INIT_DIR/$NAME/meta-data
# Créer la VM
virt-install \
--name $NAME \
--ram $RAM \
--vcpus $VCPUS \
--disk $VM_DIR/${NAME}.qcow2,format=qcow2,bus=virtio \
$EXTRA_DISK_OPT \
--disk $CLOUD_INIT_DIR/$NAME/cidata.iso,device=cdrom \
--os-variant ubuntu24.04 \
--network bridge=br-mgmt,model=virtio \
--network bridge=br-storage,model=virtio \
--network bridge=br-external,model=virtio \
--graphics none \
--console pty,target_type=serial \
--import \
--noautoconsole
echo "VM $NAME créée. Attendre quelques secondes puis:"
echo " virsh domifaddr $NAME"
echo " ssh ubuntu@<IP>"
EOF
chmod +x /usr/local/bin/create-vm.sh
Exemples pratiques¶
Vérification complète de l'installation¶
#!/bin/bash
# Script de vérification
echo "=== Système ==="
uname -a
cat /etc/os-release | grep VERSION
echo -e "\n=== CPU ==="
lscpu | grep -E "^(Model name|CPU\(s\)|Thread)"
echo -e "\n=== RAM ==="
free -h
echo -e "\n=== Stockage ==="
lsblk
df -h /var/lib/libvirt
echo -e "\n=== Réseau ==="
ip -br addr
echo -e "\n=== KVM ==="
virsh version
virsh list --all
echo -e "\n=== Bridges ==="
bridge link show
Test création VM rapide¶
# Créer une VM de test
/usr/local/bin/create-vm.sh test-vm 2048 2 20
# Attendre et vérifier
sleep 30
virsh domifaddr test-vm
# Supprimer après test
virsh destroy test-vm
virsh undefine test-vm --remove-all-storage
Ressources¶
Checkpoint¶
- Ubuntu 24.04 installé sur le serveur
- Partitionnement optimal avec espace pour VMs
- Bridges réseau créés (br-mgmt, br-storage, br-external)
- NAT configuré pour accès internet des VMs
- libvirt/KVM fonctionnel
- Image Ubuntu cloud téléchargée
- Script de création de VM testé