1. Récupérer les packages nécessaires et les installer

Vous trouverez tous les packages sur le site www.sunfreeware.com. Il vous faut les packages suivants :

- libgcc-3.4.6-sol10-sparc-local.gz
- popt-1.14-sol10-sparc-local.gz
- libiconv-1.13.1-sol10-sparc-local.gz
- libintl-3.4.0-sol10-sparc-local.gz
- rsync-3.0.9-sol10-sparc-local.gz

Dézipper les packages avec la commande gunzip, et les installer avec la commande pkgadd. Par exemple :

# pkgadd -d libgcc-3.4.6-sol-sparc-local

Remarque : Il faut installer le package rsync en dernier.

2. Création du fichier rsyncd.conf

Créér un fichier vide /etc/rsyncd.conf :

# touch /etc/rsyncd.conf

3. Création du service SMF rsync

Pour cela, créér le fichier /var/svc/manifest/network/rsync.xml, et y mettre le contenu du fichier rsync.xml que j'ai mis en annexes. Validez ensuite le fichier rsync.xml :

# xmllint --valid /var/svc/manifest/network/rsync.xml
# svccfg
svc:> import /var/svc/manifest/network/rsync.xml
svc:> quit

On lance ensuite le service :

# svcadm enable svc:/network/rsync:default

On regarde qu'il est bien online :

# svcs -x svc:/network/rsync:default
svc:/network/rsync:default (RSYNC daemon)
 State: online since February  8, 2012 12:12:04 PM MET
   See: rsync(7)
   See: /var/svc/log/network-rsync:default.log

4. Autoriser la connexion SSH entre les deux serveurs

Je suppose que mon serveur de prod se nomme serv1, et son serveur de backup s'appelle serv2. Nous allons donner l'authorisation à serv2 à se connecter en SSH sur serv1, en utilisant la méthode d'authentification par clef publique/clef privée. Ici, j'utilise le compte root comme compte de connexion.
Pour générer la clef, sur le serveur serv2, il faut taper les commandes suivantes :

# cd /root
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:

Un fichier id_rsa.pub a été généré sous /root/.ssh. Maintenant, sur le serveur serv1, dans le répertoire /root/.ssh, il faut créer un fichier appelé authorized_keys dans lequel on met le contenu du fichier id_rsa.pub généré précédemment sur serv2.
Ensuite, par défaut, le compte root n'est pas autorisé à ce connecter en ssh. Pour lever cette restriction, il faut, sur le serveur serv1 :

# vi /usr/dit/openssh/4.4p1/etc/sshd_config

et à la ligne :

PermitRootLogin no

remplacer no par yes. Nous pouvons maintenant utiliser rsync.

5. Exemple d'utilisation

Le répertoire que je synchronise est /appli. Pour des raisons qui sont propres à notre environnement de prod, je copie tout ce qu'il y a dans /appli de serv1 pour mettre dans /appli/serv1 de serv2. A cela, s'ajoute les sous-répertoires de /appli qui seront exclus de la synchronisation, et que nous renseignerons dans le fichier listexcludeRsync.
Pour synchroniser, j'ai mis en place un script afin de tracer dans un fichier de log les erreurs éventuelles. Voici un exemple de script :

#!/bin/sh
DATEDEB=`date +%d/%m/%Y-%T`
echo "                                           " >> /exploit/log/rsync.log
echo "=================" >> /exploit/log/rsync.log
echo "Debut du rsync : $DATEDEB" >> /exploit/log/rsync.log
#Rsync pour copier tout du /appli, excepté ceux de la liste d'exclusion
/usr/local/bin/rsync -rptgovi --stats --delete --exclude-from=/exploit/listexcludeRsync serv1:/appli/ /appli/serv1/ >> /exploit/log/rsync.log 2>&1
res=$?
if [ $res -ne 0 ]; then
 echo "!!! Erreur dans la synchronisation !!!" >> /exploit/log/rsync.log
 exit $res
fi
DATEFIN=`date +%d/%m/%Y-%T`
echo "Fin du rsync : $DATEFIN" >> /exploit/log/rsync.log
echo "                                         " >> /exploit/log/rsync.log
echo "================" >> /exploit/log/rsync.log

Ensuite, il suffit de mettre en crontab pour que le script se lance à la fréquence que vous souhaitez. Le script est à lancer sur le serveur serv2. Le fichier listexcludeRsync contient la liste des fichiers ou répertoires qui seront exclus de la synchronisation. Les chemins indiqués dans le fichier sont des chemins relatifs, à partir du répertoire /appli. Un exemple :

applications/html
applications/icons
applications/workdir
temp
test
ufsdump
*.dbf

Dans cet exemple, les répertoires /appli/applications/html, /appli/applications/icons, ... , /appli/temp, /appli/test, ..., ainsi que les fichiers *.dbf ne seront pas synchronisés.

6. Les options de rsync

Dans ma commande rsync, j'ai mis les options suivantes, avec la signification qui va avec :

 -r : copie récursivement les répertoires
 -p : synchronise les permissions
 -t : synchronise la date de modification
 -g : synchronise le nom des groupes
 -o : synchronise le nom du owner auquel appartient le fichier
 -D : transfère le caractère et le block device s'il y a
 -v : mode verbeux
 -i : affiche une liste simple des changements effectués sur chacun des fichiers
 --stats : affiche les statistiques verbeux sur le transfert de fichiers
 --delete : efface sur serv2 les fichiers qui n'existent pas sur serv1
 --exclude-from=fichier contenant la liste des fichiers et des répertoires à exclure de la synchronisation

7. Signification du format d'affichage dans le fichier de log

Si rsync a fait des synchronisations, alors dans la log, vous verrez quelque chose qui ressemble à ça:

    receiving incremental file list
    .f....o.... dtdbcBAA37a4lL
    .f....p.... dtdbcBAA38aqzw
    .f....og... dtdbcBAA6kaqkQ
    >f..t...... dtdbcBAA37a4lL
    >f..t...... dtdbcBAA38aqzw
    >f..t...... dtdbcBAA6kaqkQ
    >f.st...... dtdbcBAAzUaaOI

La dernière colonne affiche le nom du fichier ou du répertoire modifié.

   f : il s'agit d'un fichier
   d : il s'agit d'un répertoire
   L : il s'agit d'un lien symbolique
   o : le owner (propriétaire) a été modifié
   p : les permissions ont été modifiées
   g : le groupe a été modifié
   s : la taille du fichier a été modifiée
   t : la date de modification a été changée

Voilà, c'est tout. J'espère que cela vous a aidé :)