Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Dernière révision Les deux révisions suivantes | ||
tuto:sauvegardes:externalisation_raid1 [05/01/2012 17:11] dani |
tuto:sauvegardes:externalisation_raid1 [13/09/2016 11:10] dani |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Externalisation des sauvegardes par synchronisation RAID 1 logiciel ====== | ====== Externalisation des sauvegardes par synchronisation RAID 1 logiciel ====== | ||
+ | __**Ressources**__ | ||
- | __**Ressources**__ | + | |
- | + | ||
- | + | ||
- | | + | |
- | Une des méthodes les plus simples, efficace et fiable d' | + | |
+ | Une des méthodes les plus simples, efficace et fiable d' | ||
+ | Évidement, cela nécessite un volume dédié à BackupPC (ce qui devrait toujours être le cas). Ce volume doit être configuré en RAID1 logiciel, via **mdadm**, et ce, même si en temps normal le volume ne comporte qu'un seul disque (on peut très bien créé un volume RAID niveau 1 avec un seul disque ) | ||
===== Créer un volume RAID1 ===== | ===== Créer un volume RAID1 ===== | ||
- | + | Dans cet exemple, nous avons un disque /dev/sdc (qui peut être un disque seul, ou un périphérique RAID géré par une carte matérielle) que nous allons dédier aux sauvegardes. La première étape est de créer un périphérique RAID. Pour cela, il est conseillé de créer une partition recouvrant tout l' | |
- | Dans cet exemple, nous avons un disque /dev/sdc (qui peut être un disque seul, ou un périphérique RAID géré par une carte matérielle) que nous allons dédier aux sauvegardes. La première étape est de créer un périphérique RAID. Pour cela, il est conseillé de créer une partition recouvrant tout l' | + | |
< | < | ||
- | fdisk /dev/sdc | + | gdisk /dev/sdc |
- | [...](création d'une partition primaire /dev/sdc1 type fd) | + | [...](création d'une partition primaire /dev/sdc1 type fd00) |
</ | </ | ||
- | |||
Maintenant, nous allons créer le volume RAID /dev/md0 | Maintenant, nous allons créer le volume RAID /dev/md0 | ||
- | |||
- | |||
< | < | ||
- | mdadm --create /dev/md0 --level=1 --force --raid-devices=1 /dev/sdc1 | + | mdadm --create / |
</ | </ | ||
- | |||
Si nous avons plusieurs disques connecté en permanence pour les sauvegardes, | Si nous avons plusieurs disques connecté en permanence pour les sauvegardes, | ||
- | |||
< | < | ||
- | mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1 | + | mdadm --create / |
</ | </ | ||
- | + | La suite est classique, on crée un pv sur /dev/md0, puis un vg, et enfin un lv (en laissant toujours un peu d' | |
- | La suite est classique, on crée un pv sur /dev/md0, puis un vg, et enfin un lv (en laissant toujours un peu d' | + | |
===== Repérer les informations des disques d' | ===== Repérer les informations des disques d' | ||
- | |||
- | |||
Maintenant, nous voulons externaliser ces sauvegardes sur des disques externe (USB ou eSATA). | Maintenant, nous voulons externaliser ces sauvegardes sur des disques externe (USB ou eSATA). | ||
+ | **__Attention__**: | ||
- | **__Attention__ **: ces disques doivent être de taille identique ou supérieur à notre volume RAID | + | En tout premier, nous allons créer la partition /dev/sdd1 (partition primaire, qui couvre tout le disque, de type **Linux Raid Auto Detect** (fd), en utilisant fdisk) |
- | + | ||
- | + | ||
- | En tout premier, nous allons créer la partition /dev/sdd1 (partition primaire, qui couvre tout le disque, de type **Linux Raid Auto Detect** | + | |
Maintenant, nous allons repérer l'ID de notre disque (ou plutôt de notre partition) | Maintenant, nous allons repérer l'ID de notre disque (ou plutôt de notre partition) | ||
- | + | ==== EL5 ou supérieur | |
- | ==== COS5 ou supérieur ==== | + | |
Ligne 78: | Ligne 62: | ||
- | Dans notre exemple, c'est /dev/sdd1 la partition qui nous intéresse, donc son ID est **scsi-SATA_ST31500341AS_9VS2PNS6-part1** | + | Dans notre exemple, c'est /dev/sdd1 la partition qui nous intéresse, donc son ID est **scsi-SATA_ST31500341AS_9VS2PNS6-part1** (trop facile, dire que j'ai galéré à essayer de faire ça avec des règles udev à la con ;)) |
- | + | ==== EL4 (valable pour SME7) ==== | |
- | ==== COS 4 (SME7) ==== | + | |
Ligne 88: | Ligne 71: | ||
Il faut ajouter une règle de ce type dans **/ | Il faut ajouter une règle de ce type dans **/ | ||
- | |||
- | |||
< | < | ||
BUS=" | BUS=" | ||
Ligne 115: | Ligne 96: | ||
- | ici, l' | + | ici, l' |
- | Avec la règle udev créée précédemment, | + | Avec la règle udev créée précédemment, |
===== Mettre en place le script d' | ===== Mettre en place le script d' | ||
+ | Nous pouvons maintenant mettre en place notre script d' | ||
+ | (Par exemple dans / | ||
- | + | <code bash> | |
- | Nous pouvons maintenant mettre en place notre script d' | + | #!/bin/bash |
- | + | ||
- | + | ||
- | <code bash># | + | |
# Read configuration | # Read configuration | ||
if [ -e / | if [ -e / | ||
- | . / | + | |
else | else | ||
- | echo " | + | |
- | exit 1 | + | exit 1 |
fi | fi | ||
Ligne 163: | Ligne 142: | ||
touch $LOCK | touch $LOCK | ||
fi | fi | ||
- | + | ||
RAID_DEVICES=$(/ | RAID_DEVICES=$(/ | ||
logger "The array $RAID has $RAID_DEVICES active member(s)" | logger "The array $RAID has $RAID_DEVICES active member(s)" | ||
Ligne 169: | Ligne 148: | ||
# Grow the RAID device to include one more drive (missing for now) | # Grow the RAID device to include one more drive (missing for now) | ||
logger " | logger " | ||
- | /sbin/mdadm --grow $RAID --raid-devices=$(($RAID_DEVICES+1)) | + | /sbin/mdadm --grow $RAID --raid-devices=$(($RAID_DEVICES+1)) |
+ | |||
+ | if [ -e "/ | ||
+ | # Check the max_sectors_kb before adding the new drive | ||
+ | OLDSIZE=$(cat / | ||
+ | |||
+ | # Freeze the FS | ||
+ | / | ||
+ | fi | ||
# Add the removable device to the raid array | # Add the removable device to the raid array | ||
logger " | logger " | ||
- | /sbin/mdadm --manage $RAID --add $REMOVABLE_DEVICE | + | /sbin/mdadm --manage $RAID --add --write-mostly |
+ | |||
+ | if [ -e "/ | ||
+ | # Now check the new max_sectors_kb | ||
+ | NEWSIZE=$(cat / | ||
+ | |||
+ | REMOUNT=" | ||
+ | # max_sectors_kb has changed ? | ||
+ | if [ " | ||
+ | # We need to update the max_sectors_kb of the device backing the filesystem | ||
+ | # to prevent bio too big errors | ||
+ | FSDEV=$(basename $(readlink / | ||
+ | FSDEVSIZE=$(cat / | ||
+ | if [ $FSDEVSIZE -gt $NEWSIZE ]; then | ||
+ | cat / | ||
+ | REMOUNT=" | ||
+ | fi | ||
+ | fi | ||
+ | |||
+ | # Unfreez the FS | ||
+ | / | ||
+ | |||
+ | # Remount the FS if needed (not sure if it's really needed) | ||
+ | if [ " | ||
+ | mount -o remount $TOPDIR | ||
+ | fi | ||
+ | fi | ||
SYNCING=1 | SYNCING=1 | ||
Ligne 185: | Ligne 198: | ||
logger "RAID array $RAID is now fully synced" | logger "RAID array $RAID is now fully synced" | ||
- | # Stop backuppc and wait a few seconds to be sure the fs is clean | + | if [ " |
- | logger " | + | |
- | / | + | logger " |
- | /bin/sync | + | / |
- | /bin/sleep 10 | + | /bin/sync |
+ | /bin/sleep 10 | ||
- | # Now we can umount the volume | + | |
- | logger " | + | logger " |
- | umount $TOPDIR | + | umount $TOPDIR |
+ | else | ||
+ | sync; sync | ||
+ | fi | ||
# Mark the disk as faulty | # Mark the disk as faulty | ||
logger " | logger " | ||
/sbin/mdadm --manage $RAID --fail $REMOVABLE_DEVICE | /sbin/mdadm --manage $RAID --fail $REMOVABLE_DEVICE | ||
- | sleep 5 | + | sleep 1 |
# Remove it | # Remove it | ||
Ligne 205: | Ligne 222: | ||
# And shrink the raid array so it doesn' | # And shrink the raid array so it doesn' | ||
# Only use the force flag if $RAID_DEVICES is one | # Only use the force flag if $RAID_DEVICES is one | ||
- | logger "Now shrinking the number of active members of $RAID, so it's not in a degraded state" FORCE='' | + | logger "Now shrinking the number of active members of $RAID, so it's not in a degraded state" |
- | </ | + | FORCE='' |
+ | if [ $RAID_DEVICES == 1 ]; then | ||
+ | | ||
+ | fi | ||
+ | /sbin/mdadm --grow $RAID $FORCE --raid-devices=$RAID_DEVICES | ||
+ | |||
+ | if [ " | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | fi | ||
+ | |||
+ | # Send a mail | ||
+ | if [ ! -z "$MAIL_TO" | ||
+ | | ||
+ | logger " | ||
+ | | ||
+ | | ||
+ | fi | ||
+ | |||
+ | # Now loop until the link to $REMOVABLE_DEVICE is no longer here (ie. the drive is disconnected) | ||
+ | # This is to prevent the sync to start over and over | ||
+ | logger " | ||
+ | while [ -e $REMOVABLE_DEVICE ]; do | ||
+ | | ||
+ | done | ||
+ | |||
+ | # And remove the lock | ||
+ | logger " | ||
+ | /bin/rm -f $LOCK | ||
+ | </ | ||
Puis lui donner les permissions: | Puis lui donner les permissions: | ||
- | + | <code bash> | |
- | + | chmod +x / | |
- | <code bash> | + | |
</ | </ | ||
- | |||
On crée ensuite le fichier de configuration dans / | On crée ensuite le fichier de configuration dans / | ||
+ | <code bash> | ||
- | + | # Mount Point for BackupPC volume | |
- | <code bash># Mount Point for BackupPC volume | + | |
# Default: / | # Default: / | ||
TOPDIR='/ | TOPDIR='/ | ||
- | + | ||
# Raid device on which BackupPC data are stored | # Raid device on which BackupPC data are stored | ||
# Example: /dev/md3 | # Example: /dev/md3 | ||
RAID='/ | RAID='/ | ||
- | + | ||
# Path to the removable block device. | # Path to the removable block device. | ||
REMOVABLE_DEVICES[0]='/ | REMOVABLE_DEVICES[0]='/ | ||
REMOVABLE_DEVICES[1]='/ | REMOVABLE_DEVICES[1]='/ | ||
- | + | ||
+ | # Set this to no if you don't want BackupPC to be stopped while the external device | ||
+ | # is removed from the RAID array | ||
+ | CLEAN_REMOVE=" | ||
# Path for the lock file | # Path for the lock file | ||
# Default: / | # Default: / | ||
LOCK='/ | LOCK='/ | ||
- | + | ||
# A valid mail adress to send a repport, and ask to remove the drive once the sync | # A valid mail adress to send a repport, and ask to remove the drive once the sync | ||
# is completed | # is completed | ||
# Just comment this line to disable email notification | # Just comment this line to disable email notification | ||
+ | # You can enter several mail addresses separated by space | ||
+ | # eg: MAIL_TO=' | ||
MAIL_TO=' | MAIL_TO=' | ||
</ | </ | ||
- | |||
En adaptant bien sûre les ID des disques à utiliser, le device md et l' | En adaptant bien sûre les ID des disques à utiliser, le device md et l' | ||
- | |||
Et on place également le fichier text qui contient le corps du mail à envoyer, dans / | Et on place également le fichier text qui contient le corps du mail à envoyer, dans / | ||
- | |||
- | |||
< | < | ||
- | Les sauvegardes ont été copié | + | Les sauvegardes ont été copiées |
L' | L' | ||
</ | </ | ||
- | |||
===== Ajout d'une tâche cron ===== | ===== Ajout d'une tâche cron ===== | ||
- | + | Il ne reste plus qu'à appeler ce script régulièrement via une tâche cron. Le script s' | |
- | Il ne reste plus qu'à appeler ce script régulièrement via une tâche cron. Le script s' | + | |
< | < | ||
- | */10 * * * * root / | + | */10 * * * * root / |
</ | </ | ||
- | + | FIXME: Voire si besoin de nettoyer le fichier lock au démarrage de la machine. | |
- | FIXME : Voire si besoin de nettoyer le fichier lock au démarrage de la machine. | + |