Configuration Rsync

Résolu/Fermé
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 - 24 juin 2013 à 10:04
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 - 28 juin 2013 à 23:32
Bonjour,

Je voudrais savoir comment configurer rsync pour faire un transfert de 200Go vers un serveur distant OVH.
En sachant que l'on devra donner une vitesse donnée suivant une certaine tranche horaire. La nuit, de 20h à 8h, je lui donne le maximum de vitesse d'upload, mais inversement, de 8h à 20h je veux qu'elle diminue de moitié (//40Ko/s).

Et si possible, dire au logiciel que le week-end, il peut travailler au maximum.

Merci d'avance,
Cordialement

Ben

4 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
24 juin 2013 à 10:35
La commande rsync propose une option bandwidth.
https://www.howtogeek.com/50794/keep-rsync-from-using-all-your-bandwidth/

Le truc c'est que je ne pense pas que tu puisses changer facilement ce débit une fois que la commande rsync est lancée. Donc la seule manière que je vois de faire, c'est d'interrompre ton rsync quand tu changes de plage horaire.

Par contre il faut faire quelques tests pour vérifier que le fichier dont le transfert à été interrompu va être repris/réécrit. dans le doute, il suffit de supprimer ce fichier et de relancer rsync ensuite.

Bonne chance
0
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 15
24 juin 2013 à 10:43
Vu que c'est dans une optique professionnelle, une véritable automatisation de rsync serait royale.. Tu connaîtrais un autre moyen pour faire ce que je recherche ?
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 24/06/2013 à 21:42
Pour automatiser rsync tu peux utiliser cron+anacron ou fcron.

http://doc.ubuntu-fr.org/cron
http://doc.ubuntu-fr.org/anacron
http://doc.ubuntu-fr.org/fcron

Il faut juste que cron tue le processus associé à rsync après avoir récupéré le nom du fichier en cours de synchronisation (si tu t'aperçois au cours de tes tests que le fichier en cours de synchronisation n'est pas repris et partiellement écrit). Ensuite il suffit de relancer rsync avec les bons paramètres (bandwith notamment en regardant l'heure).

Avant de penser à une automatisation avec cron ou équivalent, le mieux ce serait que tu commences à écrire le script shell qui sera invoqué par cron et qui en fonction de l'heure, lancera cron avec les bons paramètres. Tu pourras en profiter pour voir comment ça se comporte si un transfert de fichier est coupé en plein milieu.

Ça va ressembler en gros à ceci (script à vérifier et à tester), en supposant que tu utilises ssh pour transporter les informations synchronisées par rsync :

#!/bin/bash

# Source
src="/home/toto"

# Destination
dst_login="tata"
dst_host="1.2.3.4"
dst_path="/tmp"
dst="$dst_login@dst_host:$dst_path"

# Si un script toto.sh on le tue
for pid in $(ps aux | grep -v grep | grep $(basename $0))
do
  kill -9 $pid
done

# Selon l'heure, on définit ou non l'option bandwidth
hour=$(date -u +"%H")
if [ $hour -lt 20 ] && [ $hour -ge 8 ]
then
  bw="--bandwith=40"
fi

# Lancer la commande rsync
echo "rsync -avz --delete-after $bw $src $dst"
rsync -avz --delete-after $bw $src $dst
exit 0


Par rapport aux options passées à rsync :
http://doc.ubuntu-fr.org/rsync

Ensuite il faut installer une clé ssh sur la machine qui exécute ce script pour pouvoir se connecter au serveur sans avoir à taper de mot de passe.
http://prendreuncafe.com/blog/post/2005/08/29/262-installer-sa-cle-ssh-sur-un-serveur-distant

Une fois que ce script fonctionne correctement, tu pourras l'intégrer dans un cron.

Bonne chance
0
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 15
25 juin 2013 à 08:58
# Selon l'heure, on définit ou non l'option bandwidth
hour=$(date -u +"%H")
if [ $hour -lt 20 ] && [ $hour -ge 8 ]
then
bw="--bandwith=40"
fi
---------------------------------

On peut réellement intégrer ce genre de paramètre dans un script shell ?
Je pensais plutôt à faire un shell où c'est à nous de rentrer les paramètres concernant le client et la vitesse demandée.

#!/bin/bash

#choix du client
echo "Client :"$1

#choix de la vitesse en Kb/s
echo "Vitesse :"$2

#Lancement du transfert archivé et compressé
rsync avz --bwlimit=$2 /home user@$1:/save/$1
-----------------------------
Mais je sais pas si cela pourrait marcher..
Le tien serait extra en le bidouillant pour rentrer les différents paramètres lors du lancement. "./toto.sh client 80 40" vitesse de nuit et de jour.

Puis si on veut vraiment l'optimiser faudrait dire dans un cron que le samedi et dimanche, tu me le laisses en vitesse max.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
25 juin 2013 à 22:41
On peut réellement intégrer ce genre de paramètre dans un script shell ?

Ben oui là c'est évalué dynamiquement à l'exécution ce qui évite d'avoir à passer un paramètre. Après rien ne t'empêche que ce soit un paramètre de ton script.

Je pensais plutôt à faire un shell où c'est à nous de rentrer les paramètres concernant le client et la vitesse demandée.

Si ton script est capable de les calculer pourquoi faire ? De plus il faut bien voir que tu vas instancier ton script depuis un cron à terme, donc il faudra bien à un moment définir ce paramètre. Ou alors il faut que ton cron instancie explicitement rsync avec les bons paramètres (en fonction de l'heure à laquelle le job est instancié).

Le tien serait extra en le bidouillant pour rentrer les différents paramètres lors du lancement. "./toto.sh client 80 40" vitesse de nuit et de jour.

Bah c'est trivial tu peux récupérer les valeurs client 80 et 40 respectivement dans $1, $2 et $3. Cf cours de shell.

Puis si on veut vraiment l'optimiser faudrait dire dans un cron que le samedi et dimanche, tu me le laisses en vitesse max.

Encore une fois c'est trivial. Tu vois que mon script récupère l'heure UTC avec la commande date. De la même manière tu peux demander à date de te retourner le jour, il faut juste l'instancier avec les bons paramètres.

man date


Exemple :

date +"%u"


(retourne 1 si on est lundi, 2 si on est mardi, etc...).

Donc là il suffit de tester si $(date +"%u") est supérieur ou égal (-ge) à 6 pour savoir qu'on est le week-end.

Bonne chance
0
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 15
26 juin 2013 à 08:59
Merci, j'ai avancé d'une autre manière. J'ai fait 2 scripts. Un qui envoie les données avec une vitesse donnée et l'autre à vitesse maximale. Le tout sera encadré par 3 cron. à 8h du mat', kill ancien script et hop on lance le nouveau script.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 juin 2013 à 10:17
Comme tu veux mais pourquoi 2 scripts là ou juste un suffit... C'est ce que fait celui que j'ai écrit...
0
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 15
26 juin 2013 à 13:27
A cause du week-end, je voyais pas trop comment configurer directement dans le shell en fait :/. Mais avec des "if" comme tu l'as montré c'est faisable.
Je te remercie.

J'ai essayé de faire une synchro' de mon pc à un autre du réseau avec une simple commande rsync ... ça marche pas..

J'ai pourtant essayé de suivre au mieux ce tuto : http://doc.ubuntu-fr.org/tutoriel/serveur_de_synchronisation_avec_rsync
J'ai juste changé les chemins concernant les répertoires, j'ai mis dans le desktop.
Il me met des erreurs concernant le code rsync et un "access denied" alors que je suis root (et même après avoir fait un chmod 777 sur le répertoire en question).

La commande rsync tantée est : "rsync -avze rsync@192.168.0.123::/home/user/Bureau" si mes souvenirs de ce matin sont bons ...
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 juin 2013 à 19:25
Bah sans le script, le fichier cron, et le message d'erreur exacts c'est un peu compliqué de répondre... Est-ce que tu passes par crontab pour avoir des droits root ?
http://doc.ubuntu-fr.org/cron#autres_considerations

Déjà la question qu'il faut se poser c'est as-tu besoin d'être root ? Imaginons que toto puisse se connecter à rsync@192.168.0.123 et qu'il ait les droits pour écrire dans /home/toto/backup. Alors dans ce cas l'appel à ton script de backup peut se faire en tant que toto.

Je te conseille de lancer ton script à la main et de vérifier que tout marche en lançant ce script avec l'utilisateur qui sera employé à terme au niveau du cron.

Supposons que le script fasse ce qu'il faut (kill, paramétrage de la bande passante, ...) As-tu créé/installé une clé ssh comme je te l'ai indiqué ? Si oui, normalement tu dois arriver à lancer ta commande rsync sans avoir à taper de mots de passe. Note que si le script doit être lancé à terme par root, ton couple de clé doit être généré (ou déplacé) dans /root/.ssh.

Ensuite, dans le tutoriel que je t'ai indiqué la clé est protégée par une passphrase (ce qui est recommandé). Pour éviter d'avoir à retaper la passphrase après l'avoir saisi une première fois avec succès on utilise ssh-agent.

En pratique, quand tu te loggues en mode graphique par exemple en tant que toto, tu as généralement une instance de ssh-agent qui tourne (pour toto). Cela signifie que toto ne tape qu'une fois sa passphrase. La durée de vie de ssh-agent dans ce cas particulier est la durée de vie de sa session graphique (et elle ne concerne que toto).

En admettant que tu veuilles que ton script soit indépendant de ce genre de considération il faut soit ne pas protéger la clé par une passphrase (ce que je ne te recommande pas, car c'est pas secure, mais au moins c'est simple), soit se débrouiller pour avoir au préalable une instance de ssh-agent qui tourne un arrière plan et pour laquelle la clé ssh utilisée est déverrouillée.

Bonne chance
0
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 15
28 juin 2013 à 09:12
Je préfère le faire sans clé ssh. J'ai enfin réussi. Je vais test le script ane changeant la date pour voir la réaction. Je te remercie beaucoup pour ton aide !
Pour avoir test simplement sur un autre pc, ça a fonctionné. Le root, c'est pasque je suis sous backtrack et par habitude.

Voici le script, d'après toi, y'aura-t-il besoin d'un cron ?
-----------------------------
#!/bin/bash

#Choix du client
src=''/dossier/du/client/''

# Destination
dst_host="1.2.3.4"
dst_mod="module_du_client''
dst="$dst_host::$dst_mod"


#Si il y a un script Rsync.sh on le tue
for pid in $(ps aux | grep -v grep | grep $(basename $0))
do
kill -9 $pid
done


#Week-end ou non
# Selon l'heure, on définit ou non l'option bandwith
hour=$(date -u +"%H")

if [ date +`'%u'' -lt 6]
then
elif [ $hour -lt 20 ] && [ $hour -ge 8 ]
then
bw="--bandwith=40"
fi

#Lancement du transfert archivé, compressé et supprimant les dossiers n'existant plus chez le client
echo `' rsync -avz $bw --delete-after $src $dst
rsync -avz $bw --delete-after $src $dst
-------------------------------------------------------
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
28 juin 2013 à 18:54
Le root, c'est parce que je suis sous backtrack et par habitude.

Ce n'est pas une bonne excuse et pas une bonne habitude :-)

En tout cas merci pour le retour et le script final ;-)
0
davielsons-enfer Messages postés 281 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 28 août 2014 15
28 juin 2013 à 23:32
script qui a de nouveau changé et qui m'a l'air fonctionnel, aller juste pour la plaisir des yeux :


#!/bin/bash

#Choix du client
src=''/dossier/du/client/''

# Destination
dst_host="1.2.3.4"
dst_mod="module_du_client''
dst="$dst_host::$dst_mod"


#Si il y a un script Rsync.sh on le tue
#for pid in $(ps aux | grep -v grep | grep $(basename $0))
#do
# kill -9 $pid
#done


#Week-end ou non
# Selon l'heure, on définit ou non l'option bandwith
hour=$(date -u +"%H")

if [ $(date +%u) -lt 6 ]
then
if [ $hour -lt 20 ] && [ $hour -ge 8 ]
then
bw=''--bwlimit=40''
fi
fi

#Lancement du transfert archivé, compressé et supprimant les dossiers n'existant plus chez le client
echo '' rsync -avz $bw --delete-after $src $dst''
rsync -avz $bw --delete-after $src $dst

exit 0
0