www.starend.org

TechNIX

Tags

chronosave debian linux apache samba sauvegarde long terme pérénité

Serveur de sauvegarde personnel (chronosave)

15/05/2007 /!\ EN CONSTRUCTION /!\

1/Introduction
2/Préparation du système d'exploitation
3/Découpage des archives
4/Montage et vérification des archives et copies
  4.1/Détection et montage des partitions
  4.2/Vérification des archives
  4.3/Vérification de la cohérence des copies
5/Une archive type
  5.1/fichier 'crc.cfg'
  5.2/fichier 'crc_chk.sh'
  5.3/fichier 'crc_gen.sh'
  5.4/fichier 'programme'
  5.5/répertoire 'Archive 001'
  5.6/fichier 'Archive 001.crc'
  5.7/fichier 'Archive 001.crc.md5'
6/Présentation des archives
7/Supervision de la machine et des archives

1/Introduction

Voir l'article de reflexion : TechNIX - Archivage à long terme [fr]. Ici, c'est la mise en pratique...

2/Préparation du système d'exploitation

Le système d'exploitation est un Debian Linux installé de façon classique sur une partition primaire (la première de préférence) de 1Go. Pas de SWAP de prévu. Pas de paquetage ou serveur, installation de base minimum vital. Le reste du disque peut être utilisé pour les archives.

Sur la racine du système, on crée un répertoire 'chronosave' qui contiendra tout ce qui est relatif au projet. Notament les scripts, fichiers de configuration, logs, et points de montage.

mkdir -p /chronosave/bin /chronosave/db /chronosave/disks/archive /chronosave/disks/physique \
         /chronosave/etc /chronosave/log /chronosave/www
chmod -R 755 /chronosave

Et créer un utilisateur (normal) du système nommé 'chronosave' :

useradd -m chronosave

Lors d'un (re)démarrage de la machine, les archives sont automatiquement vérifiées si leur configuration le demande explicitement. Cela est mis en place plus loin...

3/Découpage des archives

Les archives sont géré par tranches de 4.7Go, équivalente à la taille d'un DVD-ROM. Cela donne à peut près 4.4Go utilisable une fois le support formaté. Le DVD tient lieu actuellement de référence pour la taille, mais celle-ci peut évoluer avec les nouveaux supports qui ne manqueront pas de sortir. Il est ainsi possible de créer intégralement, façilement, sans espace perdu, et à moindre des copies de sauvegarde à court terme.

Rien n'empeîche cependant de créer aussi certaines archives plus grandes pour faire du stockage brut (sans copie).

Pour réaliser de découpage, plutot que de créer des fichiers formatés comme des partitions, c'est directement le disque dur qui est découpé en partitions de 4.7Go . Cela évite les potentiels suppressions de ces fichiers et supprime la notion même de fragmentation pour ceux-ci. Ces partitions sont formatées de préférence en VFAT (compatibilité maximale) et peuvent être marquées en lecture seule.

De plus, chaque archive contient un script de vérification qui lui est propre. Ce script étant appelé lors de la phase de vérification automatique des archives.

4/Montage et vérification des archives et copies

Les opérations se déroulent en trois étapes :
1) Détection et montage des partitions;
2) Vérification des archives;
3) Vérification de la cohérence des copies.

Lors d'un (re)démarrage de la machine, les archives sont automatiquement montées et vérifiées si leur configuration le demande explicitement. On peut aussi lancer manuellement chaque opération en appelant directement le script concerné.

On utilise un script de configuration commun '/chronosave/etc/chronosave.cfg' appelé par tous les autres scripts :

DIRbase=/chronosave
DIRdisks=$DIRbase/disks
DIRphysique=$DIRdisks/physique
DIRarchive=$DIRdisks/archive
DIRetc=$DIRbase/etc
DIRlog=$DIRbase/log

4.1/Détection et montage des partitions

La première étape doit :
1) démonter toutes les partitions précédement utilisées par chronosave et supprimer les liens;
2) déterminer toutes les partitions existantes;
3) savoir si elles sont déjà utilisées par le système;
4) si non = les monter dans un point de montage explicite, en lecture seule si nécessaire;
5) et créer le lien équivalent au nom de l'archive si besoin.
Tout ce qui est fait est ajouté aux fichiers de logs correspondant à chaque disque/partition.

Pour cela, le script '/chronosave/etc/mount_save.sh' est utilisé :

#!/bin/bash
. /chronosave/etc/chronosave.cfg
echo " ---- Auto-mount save disks."
umount $DIRphysique/* 2>&-
rmdir $DIRphysique/* 2>&-
rm $DIRarchive/* 2>&-
> $DIRlog/phylist
for I in $(fdisk -l | grep "^/dev/" | grep -v "Extended" | awk '{ print $1; }')
do
  ShortName=$(echo "$I" | sed 's/\/dev\///')
  echo -n " + Mount $ShortName, "
  if [ "$(mount | grep $I)" == "" ]
  then
    PHYname=$ShortName
    MOUNTsave=""
    NAMEsave=""
    mount -o ro $I /mnt 2>&-
    [ -f /mnt/crc.cfg ] && . /mnt/crc.cfg
    FSsave=$(mount | grep "/mnt" | cut -d ' ' -f 5)
    umount /mnt 2>&-
    if [ "$FSsave" == "vfat" ]
    then
      [ "$NAMEsave" != "" ] && PHYname="$PHYname-$NAMEsave"
      echo "mount=$MOUNTsave link=$DIRphysique/$PHYname"
      echo "Mount archive $PHYname" >> "$DIRlog/$PHYname-log"
      date >> "$DIRlog/$PHYname-log"
      mkdir "$DIRphysique/$PHYname"
      echo "\"$PHYname\"" >> $DIRlog/phylist
      [ "$MOUNTsave" == "" ] && MOUNTsave=rw
      mount -o $MOUNTsave,,uid=chronosave $I "$DIRphysique/$PHYname"
      [ "$NAMEsave" != "" ] && [ ! -h "$DIRarchive/$NAMEsave" ] && ln -s "$DIRphysique/$PHYname/$NAMEsave" "$DIRarchive/$NAMEsave"
      df -h $I >> "$DIRlog/$PHYname-log"
    else
      echo "not an archive."
      echo "Mount $PHYname, not an archive" >> "$DIRlog/$PHYname-log"
      date >> "$DIRlog/$PHYname-log"
      df -h $I >> "$DIRlog/$PHYname-log"
    fi
  else
    echo "already in use on $(mount | grep "$I " | awk '{ print $3 }') ."
  fi
done
echo " ---- End auto-mount save disks."

Et on crée le lien 'S97mount_save.sh' pour le démarrage du runlevel courant.

4.2/Vérification des archives

La deuxième étape passe en revue toutes les partitions qui viennent d'être montées et réalise, si cela est demandé, la vérification intégrale de celle-ci. Toutes les actions de vérification ou non, de succés ou d'échec, et le compte-rendu éventuel sont ajoutés aux fichiers de logs correspondant à chaque disque/partition.

#!/bin/bash
. /chronosave/etc/chronosave.cfg
rm $DIRlog/*-check 2>&-
rm $DIRlog/*-ok 2>&-
rm $DIRlog/*-error 2>&-
rm $DIRlog/*-nocheck 2>&-
cd $DIRphysique
echo " ---- Checking saves."
for I in *
do
  echo -n " + $I : "
  CHECKsave=NO
  [ -f "$I/crc.cfg" ] && . "$I/crc.cfg"
  if [ "$CHECKsave" == "YES" ]
  then
    echo -n "checking... "
    date > "$DIRlog/$I-check"
    cd "$I"
    . crc_chk.sh > "$DIRlog/$I-check" 2>&1
    cd ..
    CHECKsave=$(cat "$DIRlog/$I-check" | wc -c)
    if [ "$CHECKsave" == "0" ]
    then
      echo "ok."
      echo "Check OK" >> "$DIRlog/$I-log"
      date >> "$DIRlog/$I-log"
      date > "$DIRlog/$I-ok"
    else
      echo "ERROR."
      echo "Check ERROR" >> "$DIRlog/$I-log"
      date >> "$DIRlog/$I-log"
      date > "$DIRlog/$I-error"
      uname -a >> "$DIRlog/$I-log"
      uname -a >> "$DIRlog/$I-error"
      cat "$DIRlog/$I-check" >> "$DIRlog/$I-log"
      cat "$DIRlog/$I-check" >> "$DIRlog/$I-error"
    fi
    rm $DIRlog/*-check 2>&-
  else
    echo "no check."
    echo "No check" >> "$DIRlog/$I-log"
    date >> "$DIRlog/$I-log"
    date > "$DIRlog/$I-nocheck"
  fi
done
echo " ---- End checking saves."

Et on crée le lien 'S98check_save.sh' pour le démarrage du runlevel courant.

4.3/Vérification de la cohérence des copies

A faire...

(code en cours)

Et on crée le lien 'S9.sh' pour le démarrage du runlevel courant.

5/Une archive type

Une archive type est contenu dans une partition. Sur cette partition, elle correspond à un répertoire identifié dans le fichier de configuration.

La racine d'une partition (avec archive valide) contient :
- crc.cfg
- crc_chk.sh
- crc_gen.sh
- programme
- Arhive 001 (répertoire)
- Arhive 001.crc
- Arhive 001.crc.md5

Cela donne par exemple pour mes archives :

-rwxr-xr-x   51 crc.cfg
-rwxr-xr-x   53 crc_chk.sh
-rwxr-xr-x   93 crc_gen.sh
-rwxr-xr-x 405K DENDIEVEL Stephane.png
-rwxr-xr-x  28K md5deep
drwxr-xr-x  12K SAUVEphotos001
-rwxr-xr-x 1,3M SAUVEphotos001.crc
-rwxr-xr-x   53 SAUVEphotos001.crc.md5

Vous aurez remarqué qu'il y a un intru :-) En effet tous les fichiers et répertoires en plus sur la racine... sont en plus et non comptabilisés dans l'archive est son système de vérification.

5.1/fichier 'crc.cfg'

Ce fichier contient la configuration de l'archive, il est consulté par tous les scripts qui traitent cette archive en particulier. Il définit trois valeurs :
- NAMEsave : le nom de l'archive, doit être en guillmets si il contient le caractère 'espace' ;
- MOUNTsave : les options spécifiques de montage, notament si on veux le montage en lecture seule =ro ;
- CHECKsave : si la vérification doit être faite =YES, toute autre valeur est un refus implicite.

Le fichier pour mon exemple précédent, à noté que la partition reste en lecture seule et que la vérification est demandée :

NAMEsave="SAUVEphotos001"
MOUNTsave=ro
CHECKsave=YES

A noter que, une fois l'option de lecture seule activée, elle ne peut plus être enlevée. Puisque le fichier de configuration est sur la partition en lecture seule. Le seul moyen de changer cette option est de monter manuellement la partition en lecture/écriture, et de la modifier...

5.2/fichier 'crc_chk.sh'

Ce script est appelé lors de la vérification des archives, ou manuellement. Il est chargé de vérifier l'intégrité de cette archive, et appelle le 'programme' pour cette tâche avec les options nécessaires. Il ne compare pas la valeur md5 du fichier 'Archive 001.crc' avec celle contenu dans 'Archive 001.crc.md5'.

Deux réponses possibles à l'issue de cette vérification. Soit il ne retourne rien, c'est à dire aucune différence entre l'empreinte actuelle des fichiers et l'empreinte mémorisée dans 'Archive 001.crc'. Soit il retourne quelque chose, quelque chose qui s'est mal passé... Lors de la vérification automatique, le compte rendu est ajouté au fichier de log de cette partition, un report d'erreur est fait, et l'archive est positionnée en état endommagée.

Le script que j'utilise avec md5deep :

. crc.cfg
./md5deep -r -l -x $NAMEsave.crc $NAMEsave

5.3/fichier 'crc_gen.sh'

Ce script permet de générer le fichier 'Archive 001.crc' en fonction du contenu du répertoire 'Archive 001'. Il appelle le 'programme' pour cette tâche avec les options nécessaires. Et enfin, il génère la valeur md5 du fichier 'Archive 001.crc' qu'il place dans 'Archive 001.crc.md5'. Les fichiers qu'il génère doivent pouvoir être exploités par le script 'crc_chk.sh' ci-dessus de façon automatique et sans bavardage.

Le script que j'utilise avec md5deep :

. crc.cfg
./md5deep -r -l $NAMEsave > $NAMEsave.crc
md5sum $NAMEsave.crc > $NAMEsave.crc.md5

5.4/fichier 'programme'

Le 'programme' est un programme compilé qui permet de générer et/ou vérifier les signatures (hachage) de fichiers de façon récursif. Il peut être constitué de un ou plusieurs programmes distincts, les scripts 'crc_gen.sh' et 'crc_chk.sh' se chargeant de faire l'interface d'utilisation vis-à-vis des autres scripts de chronosave.

J'utilise le programme UNIX 'md5deep' pour mes archives : /md5deep" alt="md5deep" title="md5deep">md5deep (ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped, md5=8434883310a0700cdca4c7c56dec8c29)

5.5/répertoire 'Archive 001'

Le répertoire, en fait l'archive, est normalement unique. Tout ce qu'il contient est soumis à une prise d'empreinte par 'crc_gen.sh'.

Le répertoire de l'archive pour mon exemple précédent :

$ tree SAUVEphotos001
SAUVEphotos001
|-- 2000.07.22 Belledonne - Sept Laux
|   |-- commentaire.txt
|   |-- commentaires
|   |   |-- m01g.jpg.txt
|   |   |-- m02g.jpg.txt
|   |   |-- m03g.jpg.txt
|   |   |-- m04g.jpg.txt
|   |   |-- m05g.jpg.txt
|   |   |-- m06g.jpg.txt
...

5.6/fichier 'Archive 001.crc'

Le fichier pour mon exemple précédent, avec md5deep :

$ more SAUVEphotos001.crc
2fd52a3070519d9bae6b9fa291c93ae6  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m01g.jpg.txt
ea2531d04eb99e96564977d77487ad01  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m02g.jpg.txt
ccff97553a7094fdcc9da1e33390f398  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m03g.jpg.txt
c2e26f95ef4bb2fa3ae736ffa96d5274  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m04g.jpg.txt
8fe94496c6245170865183637e002150  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m05g.jpg.txt
30fa67614f5fc0946f67a170373e13fc  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m06g.jpg.txt
3d537312139f2f9699012235a0e3b357  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m07g.jpg.txt
34ac7affcb5b1d34fdf241cfa2594045  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m08g.jpg.txt
85a263f517daa151db171fc5c41d3b41  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m09g.jpg.txt
cd84ddee199aeb2b9211cdc1e2498004  SAUVEphotos001/2000.07.22 Belledonne - Sept Laux/commentaires/m10g.jpg.txt
...

Ce fichier doit être identique pour toutes les archives (copies) ayant le même nom.

5.7/fichier 'Archive 001.crc.md5'

Autant le fichier 'Archive 001.crc' peut être structurellement différent pour chaque archive, du sha1 au lieu de md5 par exemple. Autant le fichier 'Archive 001.crc.md5' qui lui est associé doit être la valeur md5 de celui-ci, tel que donné par la commande md5sum. Il permet de vérifier la cohérance de deux copies vérifiées valides, et éventuellement faire remonter une mauvaise synchronisation de celles-ci.

Le fichier pour mon exemple précédent :

$ more SAUVEphotos001.crc.md5
997c8fc1b03001ca632cb9971d8ebcb1  SAUVEphotos001.crc

Ce fichier doit être identique pour toutes les archives (copies) ayant le même nom.

6/Présentation des archives

La consultation et la modification des données des archives se fait soit par samba, soit par les dérivés de ssh.

Via samba, il faut ajouter à la configuration de samba '/etc/samba/smb.conf' le partage suivant :

...
[stock]
  comment = Stockage chronosave
  writeable = yes
  path = /chronosave/disks
  users = chronosave

Puis activer l'utilisateur 'chronosave' pour samba :

# smbpasswd -a chronosave
New SMB password:
Retype new SMB password:

Et on se connecte :

smb://chronosave@machine/stock/
ou \\machine\stock\

Via ssh, pas de configuration particulière, on se connecte avec l'utilisateur 'chronosave' :

sftp://chronosave@machine/chronosave/disks/

A faire : la consultation via apache, et modifier le répertoire par défaut de l'utilisateur chronosave.

7/Supervision de la machine et des archives

On peut surveiller l'état de la machine est des archives depuis une interface web supportée par apache.

La liste complète des archives :

/chronosave_web_total.png" alt="Total" />

Les archives en état 'OK' :

/chronosave_web_ok.png" alt="OK" />

Les logs du système :

/chronosave_web_log.png" alt="log système" />

Les logs du noyau Linux :

/chronosave_web_dmesg.png" alt="dmesg" />

Le temps de disponibilité et la charge du système :

/chronosave_web_uptime.png" alt="uptime" />

Les espaces disques :

/chronosave_web_df.png" alt="disk free" />

Mes partitions et points de montage :

/chronosave_web_mount.png" alt="mount" />

Pour pouvoir superviser la machine depuis l'interface web, un petit script va se charger de récupérer tout le nécessaire et le placer à disposition du serveur web. le script '/chronosave/etc/uptime.sh'

#!/bin/bash
. /chronosave/etc/chronosave.cfg
{ while true
  do date > $DIRlog/date.log
     uptime > $DIRlog/uptime.log
     free > $DIRlog/free.log
     dmesg | tail -30 > $DIRlog/dmesg.log
     tail -30 /var/log/syslog > $DIRlog/syslog.log
     mount > $DIRlog/mount.log
     df -h > $DIRlog/df.log
     sleep 10
  done
} &

Et on crée le lien 'S96uptime.sh' pour le démarrage du runlevel courant.

Licence Creative Common 2007 :: BY-NC-SA :: Webdesign DENDIEVEL Stéphane