User Tools

Site Tools


miniforums_ms01_installation

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
miniforums_ms01_installation.txt · Last modified: by ppj