Transférer des fichiers d’un serveur à un autre avec rsync sous Linux

Il arrive très souvent que l’on ait besoin de transférer des fichiers rapidement, d’un serveur à un autre par exemple.

Bien sûr, on peut utiliser le FTP mais il y a beaucoup plus rapide et efficace : je vous présente rsync.[no_toc]

Synchronisation distante

rsync logo

rsync (remote synchronization ou “synchronisation distante” en français) est un logiciel libre de synchronisation de fichiers (disponible sous toutes les plateformes).

La synchronisation est unidirectionnelle, c’est-à-dire qu’elle copie les fichiers de la source en direction de la destination.

rsync est donc utilisé pour réaliser des sauvegardes incrémentales ou pour diffuser le contenu d’un répertoire de référence.

Je vous donne ici les deux commandes que j’utilise quotidiennement lors de ma gestion des serveurs.

Copier tous les fichiers d’un répertoire du serveur A dans le répertoire équivalent du serveur B

Premièrement, connectez-vous via SSH à votre serveur A. Voici la commande :

/* Copie tous les fichiers de /home/website/ vers serveur B. */
rsync --ignore-existing --progress /home/movies/*.* matt@serveurB.net:/home/movies/Code language: PHP (php)

Explications:

  • --ignore-existing signifie que si le fichier existe déjà, on ne le remplace pas.
  • --progress montre la vitesse du transfert et les noms des fichiers transférés.
  • matt@serveurB.net est le nom du login SSH (matt) associé à l’adresse du serveur B (IP ou nom de domaine).
  • /home/website/ : répertoire vers lequel copier les fichiers.

En lançant cette commande, je récupère sur le serveur B tous les fichiers qui se trouvent dans le répertoire /home/movies/ du serveur A. Je ne remplace pas les fichiers existants : étant donné que je ne synchronise qu’avec rsync, ce serait inutile.

Copier tous les fichiers et sous-répertoires d’un répertoire (synchronisation récursive) sur le serveur B

/* Copie tous les fichiers et sous-dossiers de /home/series/ sur serveur B. */
rsync --ignore-existing --progress -r /home/series/*.* matt@serveurB.net:/home/series/Code language: PHP (php)

Explications: -r signifie de manière récursive, c’est-à-dire que tous les fichiers et sous-dossiers du répertoire /home/series/ seront copiés sur le serveur B.

C’est idéal pour sauvegarder les fichiers du site ou les ressources statiques. On lance la commande dans le terminal et hop, on peut aller se faire un café, tout tourne en fond de tâche.

Synchronisation récursive avec connexion SSH sur un autre port que le port 22

Reprenons l’exemple précédent mais connectons-nous maintenant sur le serveur B en SSH sur un autre port que le port par défaut (22) :

rsync --ignore-existing --progress -vr --rsh='ssh -p59222' /home/vids/*.* admin@example.com:/volume1/vidsCode language: PHP (php)

Ici, --rsh='ssh -p59222' indique que la connexion SSH doit se faire sur le port indiqué (ici 59222). Cela me permet de sauvegarder tout un répertoire et de l’envoyer sur mon NAS Synology. Très pratique !

Petit exemple fictif

Allez, juste pour le fun, voici un transfert initié avec rsync entre deux serveurs distants d’à peu près 8 000 kilomètres :

rsync speeds

Bref, rsync, ça dépote et c’est une commande extrêmement pratique à l’usage.

Vous voulez un site WordPress ou WooCommerce qui soit à la fois rapide et performant? Vous êtes au bon endroit.

Découvrez comment je peux booster votre site »

Articles conseillés :

Matt

Matt Biscay est développeur WordPress et WooCommerce certifié chez Codeable, ainsi que sysadmin qualifié et enseignant-chercheur. Passionné par le code performant et les solutions sécurisées, je m'efforce d'offrir une expérience utilisateur exceptionnelle sur chaque projet.

Vous avez aimé cet article ? Vous avez un projet en tête et vous pensez que je pourrais vous aider à le concrétiser ? N'hésitez pas à me contacter, je serais ravi de discuter avec vous de votre projet !

14 pensées sur “Transférer des fichiers d’un serveur à un autre avec rsync sous Linux”

    • J’ai pris une seedbox pour un mois histoire de tester et d’étudier comment ça fonctionnait, c’est pour ça que je n’ai pas flouté l’IP ;-)

      Reply
  1. Bonjour,

    merci pour cette commande bien utile, mais comment faire si le serveur B a un port autre que le port par defaut (22)?
    merci :)

    Reply
  2. Bonsoir,
    Super tuto mais comment éviter de taper le password après le lancement de le commande rsync. Merci.

    Reply
  3. Bonjour,

    si je lance je me connecte sur le serveur A puis je lance Rsync vers le serveur B, qui execute le tache mon Pc, le serveurs A, le serveur B? les données passe t’il par ma machine? puis je éteindre mon pc sans interrompre la tache ?
    est il possible d’avoir alors une journal ou de suivre? ( cas de gros transfert)

    merci

    Reply
    • Bonjour xalonecorp,

      Si tu fermes le terminal de ton PC (qui se connecte au serveur A pour transférer vers serveur B), alors la tâche sera interrompue. Les données ne transitent pas par ton PC, elles sont transférées directement de A vers B – ton PC est juste le donneur d’ordre.

      Pour pouvoir éteindre ton PC tout en gardant la tâche active, tu as plusieurs solutions:

      A. lancer la tâche avec nohup. Syntaxe :

      nohup COMMANDE &

      B. lancer la tâche avec disown :

      COMMANDE & disown

      ou

      COMMANDE &!

      C. installer screen et suivre le guide :

      screen -d -m bash -c "COMMANDE"

      De serveur à serveur, le transfert n’est limité que par la bande passante des serveurs. Tu peux suivre la vitesse du transfert avec l’argument --progress de rsync.

      Reply
  4. Bonjour,
    J’ai testé la commande:
    rsync –ignore-existing –progress /home/test/*.* DenisNAS@192.168.1.51:/DENIS
    sur un PC avec Linux Mint et le dossier test dans le dossier personnel home

    sur mon NAS Synology j’ai un dossier DENIS avec un utilisateur DenisNAS pour le service rsync..

    Voici le retour de la commande rsync ci-dessus après avoir saisi le mot de passe de DenisNAS:

    Could not chdir to home directory /var/services/homes/DenisNAS: No such file or directory
    sending incremental file list
    rsync: change_dir “/home/denis/test” failed: No such file or directory (2)
    ERROR: module is read only
    rsync error: syntax or usage error (code 1) at main.c(1131) [Receiver=3.0.9]
    rsync: connection unexpectedly closed (112 bytes received so far) [sender]
    rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.1.2]

    Avez vous une idée du problème rencontré ?
    Bien Cordialement
    Merci

    Reply
    • Bonjour Rémy,

      Le problème vient du chemin que vous indiquez sur le NAS. Dans la commande, vous avez à la fin: `/DENIS` mais cela ne correspond pas au véritable chemin de votre dossier utilisateur sur un Synology.

      Le bon chemin devrait commencer par `/volume1`. S’il s’agit du répertoire de l’utilisateur, ce serait `/volume1/homes/DENIS`.

      Dîtes-moi si cela passe mieux,
      Matt

      Reply
      • Merci pour votre réponse hyper rapide !!!!
        la nouvelle commande:
        rsync –ignore-existing –progress /home/test/*.* DenisNAS@192.168.1.51:/volume1/homes/DENIS

        et le même retour:
        Could not chdir to home directory /var/services/homes/DenisNAS: No such file or directory
        rsync: change_dir “/home/test” failed: No such file or directory (2)
        ERROR: module is read only
        rsync error: syntax or usage error (code 1) at main.c(1131) [Receiver=3.0.9]
        rsync: connection unexpectedly closed (112 bytes received so far) [sender]
        rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.1.2]

        merci

      • Bonjour Remy,

        Vérifiez dans Panneau de Configuration > Utilisateur > Avancé > Accueil utilisateur que la case Activer le service d’accueil de l’utilisateur soit bien cochée.

Opinions