Synchronisation automatique entre deux disques NAS

Scenario

On a deux disques réseaux NAS (dans ce cas deux Iomega StorCenter ix2). On veut qu’un groupe d’utilisateurs (sous Windows/Mac OS X/Linux) puisse sauvegarder ses données vers un de ces disques et qu’il y ait une copie supplémentaire sur le deuxième disque (sauvegarde hors-site). La sécurité n’est pas un enjeu majeur ici, car tout se passe sur un réseau interne. Un mot de passe stocké en clair dans un serveur n’est pas dramatique.

Synchronisation quotidienne par un ordinateur linux

Configuration

Chaque utilisateur a un compte et un répertoire réservé sur le disque Disk1. Sur le disque Disk2, il y a un répertoire « Backups ». L’accès à ces répertoires est autorisé par le protocole de partage Windows/CIFS/SMB sur les deux disques.
Dans cet exemple, les deux disques ont un nom DNS défini (Disk1 et Disk2). On peut aussi utiliser l’adresse IP des disques à la place.
Un utilisateur backupUser est déclaré sur les deux disques. Sur Disk1, il a les droits de lecture sur tous les répertoires des utilisateurs. Sur Disk2 il a un accès complet (lecture-écriture) au répertoire Backups.
Sur l’ordinateur linux, il faut créer les répertoires /mnt/serv1 et /mnt/serv2.

Script de sauvegarde

Un script perl, backupNAS.pl effectue la copie du disque 1 sur le disque 2 :

#!/usr/bin/perl -w
#
# Il faut : - un utilisateur backupUser avec - les droits de lecture sur tous les répertoires du Disk1
#                                                                 - les droits d'écriture sur le répertoire Disk2/Backups
#           -  Le répertoire Disk2/Backups doit contenir un fichier nommé AutoBackup

# Monter le Disk2 dans le répertoire /mnt/serv2
`umount /mnt/serv2; mount -t cifs -o user=backupUser,password="MyBackupPassword",iocharset=utf8,file_mode=0777,dir_mode=0777 //Disk2/Backups /mnt/serv2/`;
$err1 = $?;

# On vérifie que le fichier "AutoBackup" est présent et qu'il n'y a pas eu d'erreur
if ((not -e '/mnt/serv2/AutoBackup') or $err1 != 0){
	die "ERROR : cannot mount Disk2 !\n";
}

# On liste les dossiers du disque 1
@shareList1 = `smbclient -N -L //Disk1`;

# On filtre pour n'avoir que les dossiers partagés. Les lignes ressemblent à : 
# "        nomDossier        Disk  "
@reps1 = ();
print "Disk 1\n";
foreach $share1(@shareList1){
	chomp $share1;
	if ($share1 =~ /^\s+(\S+)\s+Disk\s+/){
		($name,) = $share1 =~ /^\s+(\S+)\s+Disk\s+/;
		push (@reps1, $name);
	}
}

# Chaque répertoire du disque 1 est monté, copié puis démonté
foreach $rep1(@reps1){
	`umount /mnt/serv1`;
	`mount -t cifs -o user=backupUser,password="MyBackupPassword",ro,iocharset=utf8,file_mode=0444,dir_mode=0555,noperm //Disk1/$rep1 /mnt/serv1/`;
	if ($? != 0){
		print "ERROR : Directory //Disk1/$rep1 mount failed !\n";
		next;
	}
	print "SYNCHRO rsync /mnt/serv1/ /mnt/serv2/$rep1\n";
	print `rsync -rltpv --stats  /mnt/serv1/ /mnt/serv2/$rep1`; # --del if deleted files must be removed on Disk2 too
 }
`umount /mnt/serv1`;
print "SERVER 1 : backup to DISK 2 is done !\n";

Script Cron

Il manque un petit script pour appeler le script ci-dessus chaque jour et créer un log de la sauvegarde. On édite /etc/cron.daily/backupNAScall :

#!/bin/bash
echo >> /var/log/backupServers.log
echo >> /var/log/backupServers.log
echo "-------------------------------------------------" >> /var/log/backupServers.log
echo "Beginning BACKUP -> Launching backupNAS.pl" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
perl /pathToScript/backupNAS.pl >> /var/log/backupServers.log

echo "BACKUP FINISHED" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
echo "**************************************************" >> /var/log/backupServers.log

Chaque jour, la sauvegarde est lancée et des logs détaillés (y compris date, heure et liste des fichiers mis à jour) sont stockés dans le fichier /var/log/backupServers.log !

Depuis un des disques (en cours…)

Le prochaine étape sera de supprimer le PC Linux et d’exécuter le script de sauvegarde sur le système linux minimal d’un des disques. Ce qui suit est spécifique au modèle de disque réseau utilisé (des Iomega StorCenter ix2).
Un serveur ssh peut être activé sur le disque en allant sur la page https://adresseDisque/support.html et en cliquant sur la première icône. Une fois le disque redémarré (en suivant les instructions)on peut se connecter au disque avec ssh root@adresseDisque. Le mot de passe est « soho » suivi du mot de passe du compte administrateur configuré sur le disque (dans l’interface web). On a accès à un petit système Linux (sans perl ni bash, juste sh ou ash – donc le code précédent ne fonctionnera pas tel quel. Par contre rsync est présent).

Dans /etc/crontabs/root il y a un message pour signifier que pour créer des tâches répétées, il faut utiliser le fichier sohoProcs.xml :

# DO NOT SCHEDULE TASKS HERE (use sohoProcs.xml to schedule tasks)
Le fichier /usr/local/cfg/sohoProcs.xml semble correspondre. On y trouve des déclarations comme :

<Program Name= »reportquota » Path= »/bin/sh »>
<Args>/usr/bin/reportquota</Args>
<SysOption Days= »1″ Scheduled= »1″ StartTime= »01:00″/>
</Program>

Je n’ai pas encore essayé d’ajouter une déclaration pour mon script, mais ça doit être la bonne direction pour lancer un script chaque jour à 1h du matin…

Ce wiki pourrait être utile : http://ix2-200.wikidot.com/

Scenario

You have two NAS devices, for example two network hard drives (in my case Iomega StorCenter ix2). You want your users (Windows/Mac OS X/Linux) to be able to backup their data to one of them, and have a mirror of the backups on the second one (off-site backup). The setup does not need to be very secure, as this works on an internal network, so a password stored in cleartext in a script is not a big deal.

Daily Synchronization by a linux computer

Setup

Each user has an account and associated directory on Disk1. On Disk2, there is only one « Backups » directory. Windows share/CIFS/SMB is activated in both disks.
Here, both disks have DNS names « Disk1 » and « Disk2 ». You can use the IP adress of the disks instead.
A backupUser user is declared on both disks, with reading rights only on all Disk1 directories, and all rights on Disk2 Backups directory.
On the linux computer, the directories /mnt/serv1 and /mnt/serv2 must be created.

Backup script

First, let’s make a small perl script backupNAS.pl to perform the backup :

#!/usr/bin/perl -w
#
# You need : - a backupUser with - all reading rights on all Disk1 directories
#                                                   - writing rights in Disk2/Backups
#           - the  Disk2/Backups directory must contain a file named AutoBackup
#

# Mounting Disk2 in /mnt/serv2
`umount /mnt/serv2; mount -t cifs -o user=backupUser,password="MyBackupPassword",iocharset=utf8,file_mode=0777,dir_mode=0777 //Disk2/Backups /mnt/serv2/`;
$err1 = $?;

# Check : There must be an "AutoBackup" file in the directory if the disk in mounted correctly
if ((not -e '/mnt/serv2/AutoBackup') or $err1 != 0){
	die "ERROR : cannot mount Disk2 !\n";
}

# Get the list of user directories in Disk1
@shareList1 = `smbclient -N -L //Disk1`;

# Filtering the list to get only the shared directories. Lines should look like 
# "        username        Disk  "
@reps1 = ();
print "Disk 1\n";
foreach $share1(@shareList1){
	chomp $share1;
	if ($share1 =~ /^\s+(\S+)\s+Disk\s+/){
		($name,) = $share1 =~ /^\s+(\S+)\s+Disk\s+/;
		push (@reps1, $name);
	}
}

# Each directory will be mounted then unmounted
foreach $rep1(@reps1){
	`umount /mnt/serv1`;
	`mount -t cifs -o user=backupUser,password="MyBackupPassword",ro,iocharset=utf8,file_mode=0444,dir_mode=0555,noperm //Disk1/$rep1 /mnt/serv1/`;
	if ($? != 0){
		print "ERROR : Directory //Disk1/$rep1 mount failed !\n";
		next;
	}
	print "SYNCHRO rsync /mnt/serv1/ /mnt/serv2/$rep1\n";
	print `rsync -rltpv --stats  /mnt/serv1/ /mnt/serv2/$rep1`; # --del if deleted files must be removed on Disk2 too
 }
`umount /mnt/serv1`;
print "SERVER 1 : backup to DISK 2 is done !\n";

Cron script

Now, let’s create a small script that will call this one daily and log the results. Edit /etc/cron.daily/backupNAScall :

#!/bin/bash
echo >> /var/log/backupServers.log
echo >> /var/log/backupServers.log
echo "-------------------------------------------------" >> /var/log/backupServers.log
echo "Beginning BACKUP -> Launching backupNAS.pl" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
perl /pathToScript/backupNAS.pl >> /var/log/backupServers.log

echo "BACKUP FINISHED" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
echo "**************************************************" >> /var/log/backupServers.log

Now each day, the backup will start and detailled logs (including the date and time) will be stored in /var/log/backupServers.log !

From the NAS (in progress…)

Next step would be to remove the need for the linux computer entirely and execute this on the small linux system of the NAS disk. The following is specific to the NAS device (Iomega StorCenter ix2).
A ssh server can be activated on the NAS by going to the page https://myDiskAddress/support.html, then activating the access option.
When the disk has rebooted, you can connect to it with ssh root@myDiskAddress. The password is « soho » followed by the admin account password that was set up to access the web interface. With this, you have access to a small system (without perl or bash, just sh or ash – the previous code won’t work on this device « as is ». rsync is there, though).

In /etc/crontabs/root there is a warning :

# DO NOT SCHEDULE TASKS HERE (use sohoProcs.xml to schedule tasks)
The file /usr/local/cfg/sohoProcs.xml seems to be the right place for schheduled tasks. In it, we find commands like this :

<Program Name= »reportquota » Path= »/bin/sh »>
<Args>/usr/bin/reportquota</Args>
<SysOption Days= »1″ Scheduled= »1″ StartTime= »01:00″/>
</Program>

I did not try to add a custom command yet, but this should be the way to go…

This wiki might be helpful : http://ix2-200.wikidot.com/

Ce contenu a été publié dans Notes Info. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*