Table of Contents
Installation d'un serveur miniforum MS-01
Voici les états de préparation d'un serveur miniforum, en debian 12. Celui-ci va supporter docker et kvm, avec prise en charge du réseau wifi et filtrage+dhcp par opnsense kvm. Ce document regroupe les étapes que j'ai effectué, un synthèse de mes notes. Je vais essayer d'être le plus précis.
- Il y a surement d'autre façon de procéder, je ne pense pas avoir choisi la plus simple.
- L'idée est de préparer le disk à l'avance, et confortablement à partir d'une autre machine.
- Que le nouveau disk boot directement sur le nouveau serveur, déjà préparé, avec ip et compte.
- Une installation docker + portainer
- Une installation kvm
- Le serveur va supporter frigate
Probablement à ce stade, vous vous demandez pourquoi ne pas installer proxmox. Je veux partir sur une solution 100% de ma conception, c'est formateur.
A noter que:
- wlp90s0 ⇒ support wifi android PPOP8P - source internet
- br0 ⇒ mis en place pour le lan , router 192.168.0.1 + dhcp lan interne. [192.168.0.0]
- br1 ⇒ mis en place pour le wan des machines virtuels . [192.168.120.0]
- dns ⇒ 192.168.0.1
A savoir :
- Le bridge br1 ne peut pas fonctionner correctement avec le wifi. C'est dû aux drivers et c'est une limitation constructeur ou quelque chose comme ça (L'utilisation de plusieurs mac addresse sur le bridge). Une régle iptables/NAT réglera ce problème.
Préparation du disk
- Je prépare le disk à partir d'un autre serveur linux.
- Je le monte le disk via usb et le prépare via un chroot.
- Le nouveua disk est vu comme /dev/sdc
J’efface et je partitionne le nouveau disk
wipefs -a /dev/sdc parted /dev/sdc mklabel gpt sudo parted /dev/sdc -- mkpart ESP fat32 1MiB 513MiB sudo parted /dev/sdc set 1 boot on sudo parted /dev/sdc -- mkpart primary 513MiB 100% sudo parted /dev/sdc set 2 lvm on
Je créé les FS
sudo mkfs.fat -F32 /dev/sdc1 sudo pvcreate /dev/sdc2 sudo vgcreate vg_ms01 /dev/sdc2 # Root 50 Go sudo lvcreate -L 40G -n lv_root vg_ms01 # Swap 16 Go sudo lvcreate -L 2G -n lv_swap vg_ms01 # /var 100 Go sudo lvcreate -L 20G -n lv_var vg_ms01 # Reste en /home sudo lvcreate -L 50G -n lv_home vg_ms01 sudo mkfs.ext4 /dev/vg_ms01/lv_root sudo mkfs.ext4 /dev/vg_ms01/lv_var sudo mkfs.ext4 /dev/vg_ms01/lv_home sudo mkswap /dev/vg_ms01/lv_swap
J'installe quelques outils sur mon serveur de préparation
sudo apt update sudo apt install debootstrap
Préparation du chroot pour l'installation du disk
L'idée est de préparer la structure du FS pour le nouveau serveur.
mkdir -p /mnt/debian
mount /dev/vg_ms01/lv_root /mnt/debian
mkdir /mnt/debian/{boot,var,home}
mount /dev/sdc1 /mnt/debian/boot
mount /dev/vg_ms01/lv_var /mnt/debian/var
mount /dev/vg_ms01/lv_home /mnt/debian/home
swapon /dev/vg_ms01/lv_swap
Install debian + bootstrap
apt install debootstrap gdisk lvm2 linux-image-amd64 grub-efi-amd64 -y debootstrap --arch amd64 bookworm /mnt/debian http://deb.debian.org/debian/
création du fstab
cat > /etc/fstab <<'EOF' /dev/vg_ms01/lv_root / ext4 defaults 0 1 /dev/vg_ms01/lv_var /var ext4 defaults 0 2 /dev/vg_ms01/lv_home /home ext4 defaults 0 2 /dev/vg_ms01/lv_swap none swap sw 0 0 /dev/sdc1 /boot vfat umask=0077 0 1 EOF
hostname + autre truc
echo ms01 > /etc/hostname apt install locales tzdata -y dpkg-reconfigure locales dpkg-reconfigure tzdata #installation noyau apt install systemd-sysv vim net-tools lvm2 linux-image-amd64 grub-efi-amd64 -y #installation grub grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=debian --recheck update-grub #comptes passwd root adduser monuser usermod -aG sudo monuser #console+clavier apt-get install console-data
réseau
La carte est se nomme en(quelque chose). Je fais en sorte d'obtenir sur les cartes en* une addresse ip par le serveur dhcp du lan privé. Comme il y a plusieurs carte réseau, je ne sais pas au 1er boot sur laquelle je serais.
#reseau mkdir -p /etc/systemd/network cat > /etc/systemd/network/20-wired.network <<'EOF' [Match] Name=en* [Network] DHCP=yes EOF
resolver
apt update apt install systemd-resolved dnsutils -y systemctl enable systemd-resolved
drivers video
Le serveur dispose d'un sortie video, je met en place les drivers.
apt install -y vainfo mesa-va-drivers mesa-vulkan-drivers -y
Premier boot
- je monte le disque dans le serveur
- je branche le réseau, le clavier et l'écran.
- check des drivers video ( pour une futur utilisation avec frigate, pour la compression video )
root@ms01:~# vainfo error: can't connect to X server! libva info: VA-API version 1.17.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_17 libva error: /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so init failed libva info: va_openDriver() returns 1 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so libva info: Found init function __vaDriverInit_1_8 libva error: /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so init failed libva info: va_openDriver() returns -1 root@ms01:~# lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Alder Lake-P Integrated Graphics Controller (rev 0c)
Vérification que sensors remonte de la data
root@ms01:/mnt/kvm/ISO# sensors ........... coretemp-isa-0000 Adapter: ISA adapter Package id 0: +54.0°C (high = +100.0°C, crit = +100.0°C) Core 0: +54.0°C (high = +100.0°C, crit = +100.0°C) Core 4: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 8: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 12: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 16: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 20: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 24: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 25: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 26: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 27: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 28: +51.0°C (high = +100.0°C, crit = +100.0°C) Core 29: +51.0°C (high = +100.0°C, crit = +100.0°C) Core 30: +51.0°C (high = +100.0°C, crit = +100.0°C) Core 31: +51.0°C (high = +100.0°C, crit = +100.0°C) ...........
Serveur Ok
- Le serveur dispose du minimum pour ce 1er boot
- Désinstallation du docker debian
- Installation du docker officiel
Install docker
#uninstall docker for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Add Docker's official GPG key: apt-get update apt-get install ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Install portainer
#portainer docker volume create portainer_data docker run -d \ -p 8000:8000 \ -p 9443:9443 \ --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
Install kvm
#installation de la libvirt apt update apt install qemu-kvm libvirt-daemon-system libvirt-clients virt-manager ovmf -y usermod -aG libvirt monuser newgrp libvirt apt install bridge-utils vlan net-tools -y #installation plus complet sudo apt install qemu-system-x86 libvirt-daemon-system virtinst \ virt-manager virt-viewer ovmf swtpm qemu-utils guestfs-tools \ libosinfo-bin tuned
Install cockpit
Cockpit permet la gestion des vm via web interface. Je configure mes VM pour utiliser spice pour le contrôle distant.
#cockpit administration web sudo apt install cockpit cockpit-machines
Si vous utilisez windows, installez le client spice. Lancer un cmd.exe en mode administrateur. Désolé, j'utilise encore windows, j'ai des produits non compatible linux.
winget install virt-viewer
Configuration Wifi
root@ms01:/etc/wpa_supplicant# ip link show wlp90s0
6: wlp90s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DORMANT group default qlen 1000
link/ether 8e:ca:61:xx:xx:xx brd ff:ff:ff:ff:ff:ff permaddr 14:ea:63:xx:xx:xx
ip link set wlp90s0 up
apt install firmware-misc-nonfree
sudo modprobe -r mt7921e
sudo modprobe mt7921e
List SSID
Liste des SSID disponibles, utilisation du point PPOP8P
root@ms01:/etc/wpa_supplicant# nmcli device wifi list
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
xx:xx:xx:xx:xx:xx PointA Infra 36 540 Mb/s 100 ▂▄▆█ WPA2
xx:xx:xx:xx:xx:xx PPOP8P Infra 149 270 Mb/s 80 ▂▄▆_ WPA2
xx:xx:xx:xx:xx:xx PointB Infra 6 270 Mb/s 74 ▂▄▆_ WPA2 WPA3
xx:xx:xx:xx:xx:xx PointC Infra 6 270 Mb/s 74 ▂▄▆_ WPA2
xx:xx:xx:xx:xx:xx PointD Infra 9 270 Mb/s 72 ▂▄▆_ WPA2
xx:xx:xx:xx:xx:xx PointE Infra 149 195 Mb/s 65 ▂▄▆_ WPA2
nmcli device wifi connect "PPOP8P" ifname wlp90s0 --ask
Configuration XML WIFI
La liaison wifi va être utilisée par une vm. J'édite le xml de la configuration kvm et je modifie la section qui va bien.
<interface type='direct'> <mac address='52:54:00:xx:xx:xx'/> <source dev='wlp90s0' mode='bridge'/> <model type='virtio'/> </interface> virsh edit opnsense
Bridge br1 pour la liaison wan
Mise en place du bridge br1 pour la liaison wifi wan de la vm.
Créer le bridge br1 avec IP 192.168.120.1 :
nmcli connection add type bridge ifname br1 con-name br1 ipv4.addresses 192.168.120.1/24 ipv4.method manual ipv6.method ignore
Appliquer le bridge:
nmcli connection up br1
Activer l’IP forwarding:
nmcli connection modify br1 +ipv4.forwarding yes # marche pas en debian12, j'ai quelques difficultés, je fais. echo 1 > /proc/sys/net/ipv4/ip_forward # J'ajoute dans: /etc/sysctl.d/99-ip_forward.conf net.ipv4.ip_forward = 1 #je vérifie avec sysctl -p
Network Manager & wifi br1
on reduit le timout dhcp
nmcli connection modify PPOP8P ipv4.dhcp-timeout 20
Editer le fichier 90-wifi-nat-clean et le rendre executable.
vi /etc/NetworkManager/dispatcher.d/90-wifi-nat-clean chmod +x /etc/NetworkManager/dispatcher.d/90-wifi-nat-clean
A noter que l'internet qui est distribué par le fournisseur est incapable d'accepter une connexion entrante comme un port ssh ouvert. Il y a un nat partagé avec tous les clients pour rationaliser les ip sur le réseau publique. Cela oblige à utiliser wireguard par exemple pour ouvrir une porte de d'entrée ailleurs sur internet. Script:
#!/bin/bash
IFACE="$1"
STATUS="$2"
# On cible uniquement wlp90s0
if [ "$IFACE" = "wlp90s0" ]; then
if [ "$STATUS" = "up" ]; then
# On evite d'exposer les services a l'exterieur
# + connection tracking pour laisser les reponses revenir
iptables -C INPUT -i wlp90s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || \
iptables -I INPUT 1 -i wlp90s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -C INPUT -i wlp90s0 -j DROP 2>/dev/null || \
iptables -I INPUT 2 -i wlp90s0 -j DROP
# --- Ajout NAT/Forward si pas déjà présent ---
iptables -t nat -C POSTROUTING -s 192.168.120.0/24 -o wlp90s0 -j MASQUERADE 2>/dev/null || \
iptables -t nat -A POSTROUTING -s 192.168.120.0/24 -o wlp90s0 -j MASQUERADE
iptables -C FORWARD -i br1 -o wlp90s0 -j ACCEPT 2>/dev/null || \
iptables -A FORWARD -i br1 -o wlp90s0 -j ACCEPT
iptables -C FORWARD -i wlp90s0 -o br1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || \
iptables -A FORWARD -i wlp90s0 -o br1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
echo "WiFi up → règles NAT/Forward appliquées."
fi
if [ "$STATUS" = "down" ]; then
# --- Suppression NAT/Forward ---
iptables -t nat -D POSTROUTING -s 192.168.120.0/24 -o wlp90s0 -j MASQUERADE 2>/dev/null || true
iptables -D FORWARD -i br1 -o wlp90s0 -j ACCEPT 2>/dev/null || true
iptables -D FORWARD -i wlp90s0 -o br1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || true
# --- Suppression protection INPUT ---
iptables -D INPUT -i wlp90s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || true
iptables -D INPUT -i wlp90s0 -j DROP 2>/dev/null || true
echo "WiFi down → règles NAT/Forward supprimées."
fi
fi
Gestion de la vitesse de reprise du wifi après deconnexion
#Partie wifi et rescan automatique ne cas de perte du réseau vi /etc/NetworkManager/conf.d/wifi-reconnect.conf
[device] wifi.scan-rand-mac-address=no [wifi] # Intervalle entre deux rescans (en secondes) scan-interval=10
Toujours de problème de reprise sous wifi. A noter que la liaison n'est pas fixe, et distribué par un partage android avec mon smartphone. Il y a l'intermitance de la lisaison et parfois le temps entre 2 connections qui est très variable, de quelques minutes à plusieurs jours.
Force le check wifi par contab. La log est mise à jour.
* * * * * /usr/local/bin/autowifi.sh >> /var/log/autowifi.log 2>&1
Script autowifi.sh:
#!/bin/bash
WIFI_NAME="PPOP8P"
IFACE="wlp90s0"
CARRIER_FILE="/sys/class/net/$IFACE/carrier"
if [[ -f "$CARRIER_FILE" ]] && [[ "$(cat $CARRIER_FILE)" == "1" ]];
then
# Déjà associé à un AP
echo "$(date) - Interface $IFACE déjà connectée (carrier=1)"
else
# Sinon, on scanne
nmcli device wifi rescan >/dev/null 2>&1
if nmcli -t -f SSID device wifi list ifname "$IFACE" | grep -Fxq "$WIFI_NAME"; then
echo "$(date) - Réseau $WIFI_NAME trouvé, tentative de connexion..."
nmcli connection up "$WIFI_NAME"
else
echo "$(date) - Réseau $WIFI_NAME non trouvé"
fi
fi
