Il y a 389 articles et 19 utilisateurs inscrits (ce bandeau est défini dans MediaWiki:Sitenotice)

Installation de eole3 avec stockage ZFS et migration FTP vers SFTP

De AJLSM
Aller à la navigation Aller à la recherche

Installation de eole3 avec stockage ZFS et migration FTP vers SFTP

[modifier | modifier le wikicode]

Voir aussi :

Le serveur eole3 est le nouveau serveur de DATA destiné à remplacer eole2.

Objectifs de l’installation :

  • installer Ubuntu 24.04 sur les 2 NVMe en miroir ;
  • conserver les 6 disques de 22 To pour le stockage DATA ;
  • mettre en place un pool ZFS RAIDZ2 ;
  • préparer une structure par client avec un dataset ZFS par répertoire de données ;
  • migrer les comptes FTP existants en comptes SFTP chrootés ;
  • conserver les chemins historiques sous /var/data/... ;
  • préparer la migration des données par rsync depuis eole2 ;
  • permettre ensuite des snapshots, quotas et restaurations fines par client.

Contexte matériel

[modifier | modifier le wikicode]

Le serveur eole3 dispose de :

  • 2 × NVMe ~960 Go pour le système ;
  • 6 × HDD ~22 To pour les données.

Le serveur a été installé avec Ubuntu 24.04 et les disques DATA ont été laissés vierges pour permettre la création manuelle du pool ZFS.

Choix d’architecture

[modifier | modifier le wikicode]

Le système d’exploitation est installé sur les 2 NVMe, en miroir RAID1 logiciel, avec :

  • /boot sur RAID1 ;
  • / sur RAID1 ;
  • swap local.

Le stockage DATA est mis en place avec :

  • un pool ZFS nommé data ;
  • un vdev unique en raidz2 sur les 6 disques de 22 To ;
  • un dataset racine monté sur /var/data ;
  • un dataset enfant par client monté directement sur /var/data/<nom>-data.

Cette approche permet :

  • l’isolation logique par client ;
  • la mise en place de snapshots par dataset ;
  • l’ajout éventuel de quotas par client ;
  • la compatibilité avec les chemins historiques ;
  • une migration simple via rsync.

Installation initiale depuis OVH

[modifier | modifier le wikicode]

Choix de l’OS

[modifier | modifier le wikicode]

Dans le manager OVH :

  • choisir Ubuntu Server 24.04 LTS ;
  • choisir uniquement le groupe de disques NVMe pour l’installation système ;
  • ne pas utiliser les 6 disques de 22 To pour l’installation ;
  • laisser ces 6 disques vierges pour ZFS.

Résultat attendu après installation

[modifier | modifier le wikicode]

Connexion SSH fournie par OVH :

  • IP : 51.178.110.230
  • utilisateur initial : ubuntu

Vérification de la présence des disques :

lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

Résultat observé :

NAME          SIZE TYPE  MOUNTPOINT
sda          21.8T disk
sdb          21.8T disk
sdc          21.8T disk
sdd          21.8T disk
sde          21.8T disk
sdf          21.8T disk
nvme0n1     894.3G disk
├─nvme0n1p1   511M part
├─nvme0n1p2     1G part
│ └─md2      1022M raid1 /boot
├─nvme0n1p3 892.3G part
│ └─md3     892.1G raid1 /
└─nvme0n1p4   512M part  [SWAP]
nvme1n1     894.3G disk
├─nvme1n1p1   511M part  /boot/efi
├─nvme1n1p2     1G part
│ └─md2      1022M raid1 /boot
├─nvme1n1p3 892.3G part
│ └─md3     892.1G raid1 /
├─nvme1n1p4   512M part  [SWAP]
└─nvme1n1p5     2M part

Conclusion :

  • les NVMe sont utilisés pour le système ;
  • les 6 disques de 22 To sont libres ;
  • le serveur est prêt pour ZFS.

Installation et création du pool ZFS

[modifier | modifier le wikicode]

Installation du paquet ZFS

[modifier | modifier le wikicode]
sudo apt update
sudo apt install -y zfsutils-linux

Dans le cas présent, le paquet était déjà installé :

zfsutils-linux is already the newest version (2.2.2-0ubuntu9.4).

Nettoyage des signatures éventuelles sur les disques DATA

[modifier | modifier le wikicode]
sudo wipefs -a /dev/sd[a-f]

Création du pool ZFS

[modifier | modifier le wikicode]

Commande utilisée :

sudo zpool create -o ashift=12 \
  -O compression=lz4 \
  -O atime=off \
  -O xattr=sa \
  -O acltype=posixacl \
  data raidz2 \
  /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf

Vérification du pool

[modifier | modifier le wikicode]
zpool status
zpool list
df -h

Résultat observé :

pool: data
state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    data        ONLINE       0     0     0
      raidz2-0  ONLINE       0     0     0
        sda     ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0
        sdf     ONLINE       0     0     0

errors: No known data errors
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
data   131T  1.62M   131T        -         -     0%     0%  1.00x    ONLINE  -

Et dans df -h :

data             88T  256K   88T   1% /data

Ensuite, le point de montage a été utilisé sous /var/data dans la suite de la configuration.

Préparation des comptes SFTP

[modifier | modifier le wikicode]

Les anciens comptes FTP de eole2 ont été exportés, puis recréés sur eole3 en comptes SFTP.

Objectif :

  • conserver les mêmes utilisateurs ;
  • conserver les mêmes UID/GID si possible ;
  • réutiliser les mêmes mots de passe hashés ;
  • utiliser des homes sous /var/data/<client>-data ;
  • interdire le shell ;
  • autoriser uniquement le SFTP ;
  • chrooter l’utilisateur dans son home.

Fichier d’export

[modifier | modifier le wikicode]

Un fichier d’export TSV a été utilisé sur eole3 :

/root/ftp_users_export.tsv

Ce fichier contient des colonnes du type :

username    uid    gid    groupname    home    shell    shadow_hash

Script d’import initial des comptes SFTP

[modifier | modifier le wikicode]

Script initial

[modifier | modifier le wikicode]

Le script initial recréait les utilisateurs et la structure de base :

#!/usr/bin/env bash
set -euo pipefail

IMPORT_FILE="${1:-/root/ftp_users_export.tsv}"

if [[ ! -f "$IMPORT_FILE" ]]; then
  echo "Fichier introuvable : $IMPORT_FILE"
  exit 1
fi

echo "=== Import des utilisateurs SFTP ==="

while IFS=$'\t' read -r username uid gid groupname home shell shadow_hash; do

    # skip header
    [[ "$username" == "username" ]] && continue

    echo "→ Traitement $username ($home)"

    # créer groupe si nécessaire
    if ! getent group "$groupname" >/dev/null; then
        echo "   - création groupe $groupname"
        groupadd "$groupname"
    fi

    # vérifier si user existe déjà
    if id "$username" &>/dev/null; then
        echo "   - utilisateur déjà existant, skip"
        continue
    fi

    # créer utilisateur SANS créer le home automatiquement
    useradd \
        -u "$uid" \
        -g "$groupname" \
        -d "$home" \
        -s /usr/sbin/nologin \
        -M \
        "$username"

    # appliquer mot de passe
    usermod -p "$shadow_hash" "$username"

    # créer structure
    mkdir -p "$home"
    mkdir -p "$home/data"

    # droits chroot
    chown root:root "$home"
    chmod 755 "$home"

    # droits data (zone écriture)
    chown "$username:$groupname" "$home/data"
    chmod 755 "$home/data"

done < "$IMPORT_FILE"

echo "=== Import terminé ==="

Limite du script initial

[modifier | modifier le wikicode]

Après création des datasets ZFS par client, ce script ne suffisait plus, car il faisait continue si l’utilisateur existait déjà. Il ne recréait donc pas la structure du home dans les nouveaux datasets montés.

Création des datasets ZFS par client

[modifier | modifier le wikicode]

Situation avant structuration fine

[modifier | modifier le wikicode]

Au départ, il n’existait qu’un seul dataset :

zfs list -r data
NAME   USED  AVAIL  REFER  MOUNTPOINT
data  1.40M  87.1T   384K  /var/data

Tous les répertoires clients présents sous /var/data/ étaient donc de simples répertoires classiques, pas encore des datasets ZFS dédiés.

Création d’un parent logique

[modifier | modifier le wikicode]

Commande utilisée :

zfs create -o canmount=off -o mountpoint=none data/clients

Vérification :

zfs list -r data

Résultat :

NAME           USED  AVAIL  REFER  MOUNTPOINT
data          1.78M  87.1T   384K  /var/data
data/clients   192K  87.1T   192K  none

Création automatique d’un dataset par home client

[modifier | modifier le wikicode]

Commande utilisée :

cut -f5 /root/ftp_users_export.tsv | tail -n +2 | while read -r home; do
    suffix="${home#/var/data/}"
    dataset="data/clients/${suffix}"
    echo "Creating $dataset -> $home"
    zfs create -o mountpoint="$home" "$dataset"
done

Cette boucle :

  • lit la colonne home du fichier TSV ;
  • retire le préfixe /var/data/ ;
  • crée un dataset enfant sous data/clients/... ;
  • monte ce dataset directement sur le chemin historique du home.

Exemple :

  • /var/data/ad53-data devient le dataset data/clients/ad53-data ;
  • /var/data/module-pleade-data devient le dataset data/clients/module-pleade-data.

Vérification après création

[modifier | modifier le wikicode]
zfs list -r data

Résultat observé :

NAME                               USED  AVAIL  REFER  MOUNTPOINT
data                              8.62M  87.1T   384K  /var/data
data/clients                      4.31M  87.1T   192K  none
data/clients/ad44-data             192K  87.1T   192K  /var/data/ad44-data
data/clients/ad53-data             192K  87.1T   192K  /var/data/ad53-data
data/clients/ad64-data             192K  87.1T   192K  /var/data/ad64-data
data/clients/am-angers-data        192K  87.1T   192K  /var/data/am-angers-data
data/clients/apbp-data             192K  87.1T   192K  /var/data/apbp-data
data/clients/bm-rouen-data         192K  87.1T   192K  /var/data/bm-rouen-data
data/clients/canigo-data           192K  87.1T   192K  /var/data/canigo-data
data/clients/cdf-data              192K  87.1T   192K  /var/data/cdf-data
data/clients/cnd-data              192K  87.1T   192K  /var/data/cnd-data
data/clients/demo-v4-data          192K  87.1T   192K  /var/data/demo-v4-data
data/clients/drac-ge-data          192K  87.1T   192K  /var/data/drac-ge-data
data/clients/ens-lyon-data         192K  87.1T   192K  /var/data/ens-lyon-data
data/clients/formation0-data       192K  87.1T   192K  /var/data/formation0-data
data/clients/formation1-data       192K  87.1T   192K  /var/data/formation1-data
data/clients/formation2-data       192K  87.1T   192K  /var/data/formation2-data
data/clients/formation3-data       192K  87.1T   192K  /var/data/formation3-data
data/clients/formation4-data       192K  87.1T   192K  /var/data/formation4-data
data/clients/module-pleade-data    192K  87.1T   192K  /var/data/module-pleade-data
data/clients/msh-dijon-data        192K  87.1T   192K  /var/data/msh-dijon-data
data/clients/port-dunkerque-data   192K  87.1T   192K  /var/data/port-dunkerque-data
data/clients/siges-data            192K  87.1T   192K  /var/data/siges-data
data/clients/test-ajlsm-data       192K  87.1T   192K  /var/data/test-ajlsm-data

Script d’import SFTP corrigé après création des datasets

[modifier | modifier le wikicode]

Voir uassi : Transfert_des_comptes_FTP_vers_SFTP_(d'un_serveur_à_un_autre)

Pourquoi un second script

[modifier | modifier le wikicode]

Une fois les datasets montés sur les chemins /var/data/<client>-data, les anciens répertoires de base étaient masqués par les nouveaux montages ZFS.

Il fallait donc rejouer la création de la structure :

  • home du chroot ;
  • sous-répertoire data/ ;
  • droits.

Sans recréer les utilisateurs déjà présents.

Script utilisé

[modifier | modifier le wikicode]
#!/usr/bin/env bash
set -euo pipefail

IMPORT_FILE="${1:-/root/ftp_users_export.tsv}"

if [[ ! -f "$IMPORT_FILE" ]]; then
  echo "Fichier introuvable : $IMPORT_FILE"
  exit 1
fi

echo "=== Import des utilisateurs SFTP ==="

while IFS=$'\t' read -r username uid gid groupname home shell shadow_hash; do

    [[ "$username" == "username" ]] && continue

    echo "→ Traitement $username ($home)"

    if ! getent group "$groupname" >/dev/null; then
        echo "   - création groupe $groupname"
        groupadd -g "$gid" "$groupname"
    fi

    if id "$username" &>/dev/null; then
        echo "   - utilisateur déjà existant"
    else
        useradd \
            -u "$uid" \
            -g "$groupname" \
            -d "$home" \
            -s /usr/sbin/nologin \
            -M \
            "$username"

        usermod -p "$shadow_hash" "$username"
    fi

    mkdir -p "$home"
    mkdir -p "$home/data"

    chown root:root "$home"
    chmod 755 "$home"

    chown "$username:$groupname" "$home/data"
    chmod 755 "$home/data"

done < "$IMPORT_FILE"

echo "=== Import terminé ==="
chmod +x /root/import_sftp_users_after-zfs.sh
/root/import_sftp_users_after-zfs.sh

Résultat observé :

  • tous les utilisateurs existaient déjà ;
  • la structure et les droits ont été recréés correctement dans les datasets.
find /var/data -mindepth 1 -maxdepth 2 | sort
ls -ld /var/data/ad53-data /var/data/ad53-data/data

Exemple de résultat :

drwxr-xr-x 3 root root   3 Apr  3 11:46 /var/data/ad53-data
drwxr-xr-x 2 ad53 pleade 2 Apr  3 11:46 /var/data/ad53-data/data

Configuration SSH / SFTP chrooté

[modifier | modifier le wikicode]

Voir aussi : Doctrine_des_accès_sur_eole3#3._Comptes_clients_SFTP

Permettre un accès SFTP de secours (mode emergency) en confinant les utilisateurs dans leur environnement, sans accès SSH interactif.

Configuration retenue

[modifier | modifier le wikicode]

Fichiers :

/etc/ssh/sshd_config
/etc/ssh/sshd_config.d/20-eole3-sftp.conf

Fichier principal

[modifier | modifier le wikicode]
Include /etc/ssh/sshd_config.d/*.conf

PermitRootLogin yes
PasswordAuthentication yes
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding no
PrintMotd no
AcceptEnv LANG LC_*

Subsystem sftp internal-sftp

Configuration spécifique SFTP

[modifier | modifier le wikicode]
Match Group eole3-sftp
    ChrootDirectory %h
    ForceCommand internal-sftp -P setstat,fsetstat
    AllowTcpForwarding no
    PermitTunnel no
    X11Forwarding no
    PasswordAuthentication yes
  • Match Group eole3-sftp applique le confinement uniquement aux comptes SFTP.
  • ChrootDirectory %h enferme l’utilisateur dans son dataset.
  • ForceCommand internal-sftp interdit tout accès SSH interactif.
  • -P setstat,fsetstat limite certaines opérations (compatibilité clients).
  • AllowTcpForwarding no désactive les tunnels TCP.
  • PermitTunnel no désactive les tunnels TUN/TAP.
  • X11Forwarding no interdit le forwarding X11.
  • Le groupe pleade n’est **plus utilisé** pour le confinement SFTP.
  • Le groupe dédié est eole3-sftp.
  • Les comptes d’administration (ex : ajlsm) **ne doivent jamais appartenir à ce groupe**.

Ajout des comptes clients existants à eole3-sftp

[modifier | modifier le wikicode]

Comptes clients déjà créés sous /var/data, en excluant ajlsm, ubuntu, root, etc.

for u in ad44 ad53 ad64 am-angers apbp bm-rouen canigo cdf cnd demo-v4 drac-ge ens-lyon formation0 formation1 formation2 formation3 formation4 module-pleade msh-dijon pdk siges test-ajlsm pleadecom; do   usermod -aG eole3-sftp "$u"; done

Puis contrôle :

getent group eole3-sftp

et pour quelques comptes :

id ad53
id apbp
id pleadecom
id ajlsm

Test de cohérence sshd

sshd -t
sshd -T -C user=ad53,addr=127.0.0.1,host=eole3 | egrep 'forcecommand|chrootdirectory'
sshd -T -C user=ajlsm,addr=127.0.0.1,host=eole3 | egrep 'forcecommand|chrootdirectory'

Résultat attendu :

ad53 : internal-sftp + chrootdirectory %h
ajlsm : forcecommand none / chrootdirectory none

Test et rechargement

[modifier | modifier le wikicode]
sshd -t
systemctl restart ssh

Tests du chroot SFTP

[modifier | modifier le wikicode]

Test avec un utilisateur client

[modifier | modifier le wikicode]
sftp ad53@localhost

Puis dans la session SFTP :

pwd
ls

Résultat attendu et obtenu :

Remote working directory: /
data

Cela confirme :

  • le chroot fonctionne ;
  • l’utilisateur ne voit que son environnement SFTP ;
  • le seul répertoire visible est data.

Préparation à la migration rsync

[modifier | modifier le wikicode]

Les données historiques de eole2 doivent être copiées dans le sous-répertoire data/ de chaque client, et non à la racine du home chrooté.

Donc :

  • source : root@eole2:/var/data/<client>-data/
  • destination : /var/data/<client>-data/data/

Options rsync retenues

[modifier | modifier le wikicode]
-aHAXv --numeric-ids

Signification :

  • -a : archive ;
  • -H : liens physiques ;
  • -A : ACL ;
  • -X : xattrs ;
  • -v : verbeux ;
  • --numeric-ids : conserve les UID/GID numériques.

Test à blanc sur un petit dataset

[modifier | modifier le wikicode]

Exemple avec test-ajlsm-data :

rsync -aHAXvn --numeric-ids \
  root@193.70.47.97:/var/data/test-ajlsm-data/ \
  /var/data/test-ajlsm-data/data/

Résultat observé :

receiving incremental file list
./
projet/
projet/mirador3-reactjs.tar.gz

sent 34 bytes  received 142 bytes  117.33 bytes/sec
total size is 236,697,705  speedup is 1,344,873.32 (DRY RUN)
rsync -aHAXv --numeric-ids \
  root@193.70.47.97:/var/data/test-ajlsm-data/ \
  /var/data/test-ajlsm-data/data/

Résultat observé :

receiving incremental file list
./
projet/
projet/mirador3-reactjs.tar.gz

sent 54 bytes  received 236,755,675 bytes  94,702,291.60 bytes/sec
total size is 236,697,705  speedup is 1.00

Vérification après copie

[modifier | modifier le wikicode]
ls -la /var/data/test-ajlsm-data/data/

Exemple :

total 2
drwxr-xr-x 3 test-ajlsm pleade 3 Jul 29  2025 .
drwxr-xr-x 3 root       root   3 Apr  3 11:46 ..
drwxr-xr-x 2 test-ajlsm   1001 3 Jul 29  2025 projet

Second test rsync : module-pleade-data

[modifier | modifier le wikicode]
rsync -aHAXvn --numeric-ids \
  root@193.70.47.97:/var/data/module-pleade-data/ \
  /var/data/module-pleade-data/data/
rsync -aHAXv --numeric-ids \
  root@193.70.47.97:/var/data/module-pleade-data/ \
  /var/data/module-pleade-data/data/

Vérification locale

[modifier | modifier le wikicode]
ls -la /var/data/module-pleade-data/data/
zfs list data/clients/module-pleade-data

Résultat observé :

total 35
drwxrwxr-x 4          1025   1001     5 Nov 18  2022 .
drwxr-xr-x 3 root          root       3 Apr  3 11:46 ..
-rwxr-xr-x 1 module-pleade pleade 12628 Nov 15  2022 .htaccess
drwxrwxrwx 2 module-pleade pleade     3 Nov 18  2022 logs
drwxrwxrwx 6 module-pleade pleade    16 Dec 19  2022 pleade
NAME                              USED  AVAIL  REFER  MOUNTPOINT
data/clients/module-pleade-data  39.4M  87.1T  39.3M  /var/data/module-pleade-data

Vérification SFTP

[modifier | modifier le wikicode]
sftp module-pleade@localhost

Puis :

pwd
ls
cd data/
ls
cd pleade/
ls

Résultat observé :

  • pwd renvoie / ;
  • ls montre seulement data ;
  • le contenu copié est visible dans data/.

État de l’installation à ce stade

[modifier | modifier le wikicode]

À ce stade, les éléments suivants sont validés :

  • Ubuntu 24.04 installé sur les NVMe ;
  • pool ZFS data en RAIDZ2 sur les 6 disques de 22 To ;
  • dataset racine monté sur /var/data ;
  • dataset ZFS dédié par client ;
  • comptes SFTP recréés ;
  • chroot SFTP fonctionnel ;
  • tests de migration rsync validés sur petits jeux de données.

Étapes suivantes prévues

[modifier | modifier le wikicode]

Les étapes à traiter ensuite sont :

  • lancer les rsync réels pour tous les clients ;
  • éventuellement définir des quotas ZFS par dataset client ;
  • mettre en place des snapshots ZFS ;
  • prévoir la stratégie de rétention et de purge ;
  • surveiller le taux de remplissage du pool ;
  • préparer éventuellement la réplication ou la sauvegarde secondaire.

Commandes utiles récapitulatives

[modifier | modifier le wikicode]

Vérification ZFS

[modifier | modifier le wikicode]
zpool status
zpool list
zfs list -r data
df -h

Vérification des répertoires

[modifier | modifier le wikicode]
find /var/data -mindepth 1 -maxdepth 2 | sort
ls -ld /var/data/ad53-data /var/data/ad53-data/data

Vérification SSH

[modifier | modifier le wikicode]
sshd -t
systemctl restart ssh
grep -v '^#' /etc/ssh/sshd_config
sftp ad53@localhost

Test rsync à blanc

[modifier | modifier le wikicode]

rsync -aHAXvn --numeric-ids \

 root@193.70.47.97:/var/data/module-pleade-data/ \
 /var/data/module-pleade-data/data/

</syntaxhighlight>

rsync -aHAXv --numeric-ids \
  root@193.70.47.97:/var/data/module-pleade-data/ \
  /var/data/module-pleade-data/data/

Synchronisation des données eole2 → eole3 (rsync réseau privé)

[modifier | modifier le wikicode]

Mettre en place une synchronisation incrémentale des données entre :

  • eole2 (source)
  • eole3 (destination ZFS + SFTP)

La synchronisation utilise :

  • le réseau privé (vRack) : 192.168.123.0/24
  • rsync via SSH
  • une exécution automatisée via cron
  • des logs horodatés

---

Chaque dataset client est synchronisé de :

/var/data/<client>-data/

vers :

/var/data/<client>-data/data/

Ce choix est imposé par la configuration SFTP chrootée de eole3.

---

Script de synchronisation

[modifier | modifier le wikicode]

Fichier :

/root/rsync_from_eole2_private.sh

Contenu :

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
umask 022

BASE_DIR="/opt/rsync_eole2_to_eole3"
LOG_DIR="$BASE_DIR/logs"
TMP_DIR="$BASE_DIR/tmp"
LOCK_FILE="$TMP_DIR/rsync_eole2_to_eole3.lock"

SRC_HOST="192.168.123.101"
SRC_USER="root"
SSH_OPTS="-p 22 -o ConnectTimeout=30"

mkdir -p "$LOG_DIR" "$TMP_DIR" /var/data/tmp/rsync-partial

LOG_FILE="$LOG_DIR/rsync_eole2_to_eole3_$(date +%F_%H-%M-%S).log"

log() {
  printf "[%s] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$*"
}

exec 9>"$LOCK_FILE"
if ! flock -n 9; then
  {
    log "Un rsync eole2 -> eole3 est deja en cours, abandon."
  } >> "$LOG_FILE" 2>&1
  exit 0
fi

TARGETS=(
  "template-data"
  "tmp"
  "test-ajlsm-data"
  "cnd-data"
  "module-pleade-data"
  "test-ftp-data"
  "formation3-data"
  "formation4-data"
  "formation-data-template"
  "formation0-data"
  "formation2-data"
  "formation1-data"
  "am-angers-data"
  "demo-v4-data"
  "drac-ge-data"
  "ad44-data"
  "cdf-data"
  "pleade.com-data"
  "ftp-ajlsm-data"
  "canigo-data"
  "msh-dijon-data"
  "ens-lyon-data"
  "apbp-data"
  "ad53-data"
  "ad64-data"
)

{
  log "=== Debut rsync eole2 -> eole3 via reseau prive ==="

  for name in "${TARGETS[@]}"; do
    SRC="/var/data/${name}/"
    DST="/var/data/${name}/data/"

    log "--- ${name} ---"
    log "Source      : ${SRC_USER}@${SRC_HOST}:${SRC}"
    log "Destination : ${DST}"

    if [ ! -d "$DST" ]; then
      log "ERREUR: destination absente : $DST"
      continue
    fi

    /usr/bin/ionice -c2 -n7 /usr/bin/nice -n 19 \
      /usr/bin/rsync \
        -aHAX \
        --numeric-ids \
        --delete-after \
        --safe-links \
        --omit-dir-times \
        --stats \
        --human-readable \
        --partial \
        --partial-dir="/var/data/tmp/rsync-partial" \
        --temp-dir="/var/data/tmp" \
        -e "ssh $SSH_OPTS" \
        "${SRC_USER}@${SRC_HOST}:${SRC}" \
        "$DST"

    RC=$?
    log "Fin ${name} / RC=${RC}"
  done

  log "=== Fin rsync eole2 -> eole3 ==="
} >> "$LOG_FILE" 2>&1

---

Permissions et préparation

[modifier | modifier le wikicode]
chmod +x /root/rsync_from_eole2_private.sh

mkdir -p /opt/rsync_eole2_to_eole3/logs
mkdir -p /opt/rsync_eole2_to_eole3/tmp
mkdir -p /var/data/tmp/rsync-partial

---

Exécution manuelle

[modifier | modifier le wikicode]
nohup /root/rsync_from_eole2_private.sh >/dev/null 2>&1 &

---

Suivi en temps réel

[modifier | modifier le wikicode]
tail -f "$(ls -1t /opt/rsync_eole2_to_eole3/logs/rsync_eole2_to_eole3_*.log | head -1)"

---

Vérification du processus

[modifier | modifier le wikicode]
pgrep -af rsync

---

Supervision ZFS

[modifier | modifier le wikicode]
zpool iostat -v 5

---

Mise en place du cron

[modifier | modifier le wikicode]
crontab -e

Ajouter :

0 1 * * * /root/rsync_from_eole2_private.sh

Vérification :

crontab -l

---

Problèmes connus

[modifier | modifier le wikicode]

Répertoire data absent

[modifier | modifier le wikicode]

Erreur possible :

ERREUR: destination absente : /var/data/<client>-data/data/

Solution :

mkdir -p /var/data/<client>-data/data
chown <user>:<group> /var/data/<client>-data/data

---

Performances observées

[modifier | modifier le wikicode]
  • Réseau privé (vRack)
  • Débit moyen : 60 à 120 MB/s
  • Exemple :
 * 30 Go copiés en ~4 minutes

---

Comportement rsync

[modifier | modifier le wikicode]
  • Première synchronisation : copie complète
  • Synchronisations suivantes :
 * incrémentales
 * très rapides
 * peu de trafic réseau

---

  • Accès via SSH uniquement
  • Utilisation du réseau privé
  • Pas d'exposition Internet
  • Isolation par dataset ZFS

---

  • Le script empêche les exécutions simultanées (flock)
  • Les logs sont horodatés
  • Chaque dataset est traité indépendamment
  • Les erreurs sur un dataset n'interrompent pas les autres