33800 Docs

← Retour

Proposition : AutoFS + Queuing NFS pour VMs Proxmox 1

Date : 18-12-2025 14:11 Status : IMPLEMENTEE Machines concernées : nginx.local, gitlab.local Objectif : Éviter le blocage des VMs quand PVE est down, avec sync automatique au retour


Problème actuel

Les VMs sur Proxmox 1 (nginx, gitlab) ont un montage NFS hard vers PVE (192.168.1.10). Quand PVE est coupé → le montage bloque → les VMs peuvent freezer.


Solution proposée

1. AutoFS - Montage à la demande

Remplace le montage permanent par un montage automatique :

2. Queuing local - Sync différé

Un dossier local /var/spool/nfs-queue/ pour stocker les fichiers en attente :


Étapes d'installation

Sur nginx.local et gitlab.local :

Étape 1 : Installer autofs

sudo apt update && sudo apt install -y autofs

Étape 2 : Supprimer le montage permanent

# Démonter
sudo umount /mnt/raidz2  # (ou /mnt/zfs pour gitlab)

# Commenter la ligne dans /etc/fstab
sudo sed -i 's|^192.168.1.10:/stock_36to|#192.168.1.10:/stock_36to|' /etc/fstab

Étape 3 : Configurer autofs

/etc/auto.master (ajouter) :

/mnt/nfs  /etc/auto.nfs  --timeout=60 --ghost

/etc/auto.nfs (créer) :

raidz2  -fstype=nfs4,soft,timeo=30,retrans=2  192.168.1.10:/stock_36to/data

Note pour gitlab : remplacer raidz2 par zfs

Étape 4 : Créer le dossier de queue

sudo mkdir -p /var/spool/nfs-queue
sudo chown gouroubleu:gouroubleu /var/spool/nfs-queue

Étape 5 : Script de sync avec queue

/usr/local/bin/nfs-sync.sh :

#!/bin/bash
# NFS Sync avec Queuing
# Transfère les fichiers en attente vers le NFS quand disponible

QUEUE_DIR="/var/spool/nfs-queue"
NFS_TARGET="/mnt/nfs/raidz2"  # ou /mnt/nfs/zfs pour gitlab
LOG_FILE="/var/log/nfs-sync.log"
LOCK_FILE="/tmp/nfs-sync.lock"

# Éviter les exécutions simultanées
exec 200>"$LOCK_FILE"
flock -n 200 || { echo "$(date): Déjà en cours" >> "$LOG_FILE"; exit 1; }

# Vérifier s'il y a des fichiers en attente
if [ -z "$(ls -A $QUEUE_DIR 2>/dev/null)" ]; then
    exit 0
fi

# Tester si NFS accessible (avec timeout)
if timeout 5 ls "$NFS_TARGET" &>/dev/null; then
    echo "$(date): NFS accessible, transfert en cours..." >> "$LOG_FILE"

    # Transférer tous les fichiers en attente
    for file in "$QUEUE_DIR"/*; do
        if [ -f "$file" ]; then
            # Lire la destination depuis le fichier .meta associé
            meta_file="${file}.meta"
            if [ -f "$meta_file" ]; then
                dest=$(cat "$meta_file")
                mkdir -p "$(dirname "$dest")"
                if cp "$file" "$dest"; then
                    echo "$(date): OK - $(basename "$file") -> $dest" >> "$LOG_FILE"
                    rm -f "$file" "$meta_file"
                else
                    echo "$(date): ERREUR - $(basename "$file")" >> "$LOG_FILE"
                fi
            fi
        fi
    done

    echo "$(date): Transfert terminé" >> "$LOG_FILE"
else
    echo "$(date): NFS inaccessible, retry plus tard" >> "$LOG_FILE"
fi

Étape 6 : Fonction helper pour envoyer vers NFS

/usr/local/bin/send-to-nfs :

#!/bin/bash
# Usage: send-to-nfs <fichier_local> <chemin_destination_nfs>
# Exemple: send-to-nfs backup.tar.gz /mnt/nfs/raidz2/backups/

SOURCE="$1"
DEST="$2"
QUEUE_DIR="/var/spool/nfs-queue"
NFS_BASE="/mnt/nfs/raidz2"  # ou /mnt/nfs/zfs

if [ -z "$SOURCE" ] || [ -z "$DEST" ]; then
    echo "Usage: send-to-nfs <fichier> <destination>"
    exit 1
fi

if [ ! -f "$SOURCE" ]; then
    echo "Erreur: $SOURCE n'existe pas"
    exit 1
fi

# Tester si NFS accessible
if timeout 5 ls "$NFS_BASE" &>/dev/null; then
    # NFS OK → transfert direct
    mkdir -p "$(dirname "$DEST")"
    cp "$SOURCE" "$DEST" && echo "Transféré: $SOURCE -> $DEST"
else
    # NFS down → queue
    filename=$(basename "$SOURCE")
    queue_file="$QUEUE_DIR/${filename}_$(date +%s)"
    cp "$SOURCE" "$queue_file"
    echo "$DEST" > "${queue_file}.meta"
    echo "NFS indisponible - En queue: $filename (sera envoyé automatiquement)"
fi

Étape 7 : Timer systemd pour retry automatique

/etc/systemd/system/nfs-sync.service :

[Unit]
Description=NFS Queue Sync
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/nfs-sync.sh
User=root

/etc/systemd/system/nfs-sync.timer :

[Unit]
Description=Retry NFS sync every 5 minutes

[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Persistent=true

[Install]
WantedBy=timers.target

Étape 8 : Activer les services

sudo chmod +x /usr/local/bin/nfs-sync.sh /usr/local/bin/send-to-nfs
sudo systemctl daemon-reload
sudo systemctl enable --now autofs
sudo systemctl enable --now nfs-sync.timer

Récapitulatif après installation

Élément Chemin Description
Montage NFS /mnt/nfs/raidz2 Monte auto à l'accès, timeout 60s
Queue locale /var/spool/nfs-queue/ Fichiers en attente
Commande send-to-nfs Envoie avec fallback queue
Logs /var/log/nfs-sync.log Historique des transferts
Timer nfs-sync.timer Retry toutes les 5 min

Utilisation

# Accès direct au NFS (monte automatiquement)
ls /mnt/nfs/raidz2

# Envoyer un fichier (avec queue si NFS down)
send-to-nfs /tmp/backup.tar.gz /mnt/nfs/raidz2/backups/backup.tar.gz

# Voir la queue
ls /var/spool/nfs-queue/

# Forcer un sync maintenant
sudo systemctl start nfs-sync.service

# Voir les logs
tail -f /var/log/nfs-sync.log

Machines NON concernées


Validation