web-dev-qa-db-fra.com

Comment puis-je copier au mieux un grand nombre de petits fichiers sur scp?

J'ai un répertoire contenant plusieurs gigaoctets et plusieurs milliers de petits fichiers. Je veux le copier sur le réseau avec scp plus d'une fois. Le temps CPU sur les machines source et de destination est bon marché, mais la surcharge réseau ajoutée en copiant chaque fichier individuellement est énorme. Je voudrais le tar/gzip et l'expédier, mais la machine source est courte sur le disque.

Existe-t-il un moyen pour moi de diriger la sortie de tar -czf <output> <directory> à scp? Sinon, existe-t-il une autre solution facile? Ma machine source est ancienne (SunOS), donc je préfère ne pas y installer des choses.

63
nmichaels

Vous pouvez diriger du goudron sur une session ssh:

$ tar czf - <files> | ssh user@Host "cd /wherever && tar xvzf -"
110
pdo

Tar avec compression bzip2 devrait prendre autant de charge sur le réseau et sur le processeur.

$ tar -C /path/to/src/dir -jcf - ./ | ssh user@server 'tar -C /path/to/dest/dir -jxf -'

N'utilise pas -v car la sortie d'écran peut ralentir le processus. Mais si vous voulez une sortie détaillée, utilisez-la du côté local de tar (-jcvf), pas sur la partie distante.

Si vous copiez à plusieurs reprises sur le même chemin de destination, comme la mise à jour d'une copie de sauvegarde, votre meilleur choix est rsync avec compression.

$ rsync -az -e ssh /path/to/src/dir/ user@server:/path/to/dest/dir/

Notez que les chemins src et dest se terminent par un /. Encore une fois, n'utilisez pas -v et -P indicateurs volontairement, ajoutez-les si vous avez besoin d'une sortie détaillée.

23
forcefsck

utilisez rsync , il utilise SSH.

Usage:

rsync -aPz /source/path destination.server:remote/path

Les commutateurs rsync se soucient de la compression et des informations I-Node. -P affiche la progression de chaque fichier.

Vous pouvez utiliser scp -C, qui permet la compression, mais si possible, utilisez rsync.

16
polemon

Vous pouvez exécuter tar aux deux extrémités à l'aide de ssh. scp fait partie de la famille de bonté ssh, donc vous l'avez probablement aux deux extrémités.

 8:03AM 12 % tar cf - some_directory | ssh dest_Host "tar xf -"

Il existe peut-être un moyen d'intégrer gzip ou bzip2 dans le pipeline pour réduire également le trafic réseau.

3
Bruce Ediger

La réponse de @ pdo est bonne, mais on peut augmenter la vitesse avec un tampon et une bonne compression et ajouter une barre de progression.

Souvent, le réseau est le goulot d'étranglement et la vitesse varie au fil du temps. Par conséquent, il est utile de mettre les données en mémoire tampon avant de les envoyer sur le réseau. Cela peut être fait avec pv.

De plus, on peut généralement augmenter la vitesse avec un algorithme de compression approprié. Gzip (comme utilisé ci-dessus) est un algorithme de compression rapide, mais en général zstandard (zstd) (et pour les taux de compression élevés LZMA/LZMA2 (xz) compressera mieux et sera plus rapide en même temps Les nouveaux xz et zstd ont déjà un support multi-core intégré. Pour utiliser gzip avec plusieurs cœurs, pigz peut être utilisé.

Voici un exemple pour envoyer des données avec une barre de progression, une mise en mémoire tampon et une compression zstandard sur un réseau:

tar cf - . | pv -perabs $(du -sk . | cut -f 1)K | zstd -14 --long=31 -T0 | pv -qCB 512M | ssh user@Host "cd /wherever && pv -qCB 512M | zstd -cd -T0 --long=31 | tar xf -"

Le premier pv est pour montrer la progression ( p ), le temps estimé ( e ), taux de transfert ( r ), taux moyen ( a ), total des octets transférés ( b ). La taille totale est estimée avec du et ajoutée à l'option de taille ( s ). La progression est mesurée avant la compression et la mise en mémoire tampon, donc ce n'est pas très précis, mais toujours utile.

zstd est utilisé avec le paramètre de compression 14 . Ce nombre peut être réduit ou augmenté en fonction du réseau et de la vitesse du processeur, donc zstd est un peu plus rapide que la vitesse du réseau. Avec quatre cœurs sur un processeur Haswell 3,2 GHz 14 donne une vitesse d'environ 120 Mo/s. Dans l'exemple, le mode long 31 (utilise une fenêtre de 2 Go, nécessite beaucoup de RAM, mais très bon par exemple pour compresser les vidages de la base de données) est utilisé . Les options T0 définissent la quantité de threads sur le nombre de cœurs. Il faut savoir qu'avec le mode long, ces paramètres utilisent beaucoup de mémoire.

Un problème avec zstd est que la plupart des systèmes d'exploitation ne sont pas livrés avec la version> = 1.3.4. Cette version est nécessaire pour un bon multi-core et un support long. S'il n'est pas disponible, il peut être compilé et installé à partir de https://github.com/facebook/zstd avec juste make -j4 && Sudo make install. Au lieu de zstd, on peut également utiliser xz ou pigz. xz est lent mais compresse très bien (bon sur des connexions lentes), pigz/gzip est rapide mais ne compresse pas si bien. pv est ensuite utilisé à nouveau, mais pour la mise en mémoire tampon (q pour le silence, C pour le mode sans épissure [toujours nécessaire pour la mise en mémoire tampon] et B pour définir la taille du tampon).

Dans l'exemple, un tampon est également utilisé côté récepteur. Ceci est souvent inutile (car la vitesse de décompression et d'écriture sur le disque dur est généralement supérieure à la vitesse du réseau), mais ne nuit généralement pas non plus.

3
Fabian Heller

Si vous avez gzip aux deux extrémités: sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh user@destinationhost "cd destinationdir && gzip -c -d | tar xf -"

Si vous n'avez pas gzip sur la machine source, assurez-vous d'avoir décompressé sur la destination: sourcehost$ cd sourcedir && tar cf - . | compress | ssh user@destinationhost "cd destdir && uncompress | tar xf -"

Ce serait plus rapide que de le compresser d'abord, puis d'envoyer, puis de décompresser, et cela ne nécessite aucun espace disque supplémentaire de chaque côté. J'ai sauté le drapeau de compression (z) sur tar, car vous ne l'avez probablement pas du côté ancien.

2
MattBianco

Ou vous pouvez le faire dans l'autre sens si vous en avez besoin. C'est tirer l'arborescence sur le réseau plutôt que de le pousser comme cela a été suggéré. Cela ne résout pas la partie répétitive de votre question et rsync est le meilleur pour cela, mais il y a probablement des commutateurs tar pour vous aider.

Donc sur la machine locale:

ssh remote 'tar zcf - /etc/resolv.conf' | tar zxf -

Mieux vaut être dans le bon répertoire en premier ou vous devez utiliser le commutateur -C sur la commande de non tarage à la fin.

Il suffit de mentionner cela au cas où cela serait nécessaire. C'est pour moi car dans ma situation, mon serveur local est derrière nat, donc il faudrait un peu de réseau pour être en mesure de le faire comme cela a été mentionné précédemment.

HTH

2
DaveQB

Ou montez le système de fichiers distant via sshfs

sshfs user@remotehost:/path/on/remote /path/on/local
1
ivanivan

Bien qu'il ne soit pas le plus élégant, d'autant plus qu'il ne copie pas un seul fichier Zip ou tar et doublement, car cela n'aide pas à réduire les frais généraux du réseau, mon seul choix était d'utiliser scp -r:

-r

      Copiez récursivement des répertoires entiers. Notez que scpsuivent les liens symboliques rencontrés dans la traversée de l'arborescence.
Source: scp (1)

Je rencontrais des problèmes avec le manque d'espace disque avec un fichier tar zippé de 30 Go. Je pensais que gunzip pouvait le faire en ligne, c'est-à-dire supprimer l'original tel qu'il était décompressé (et j'ai peut-être raté un résultat Google), mais je n'ai rien trouvé.

Enfin, parce que j'étais fatigué d'essayer plusieurs fois en attendant qu'un nouveau fichier TAR ou Zip soit terminé, tarage ou fermeture éclair, je viens de le faire:

  1. Depuis le serveur/PC/ordinateur portable d'origine, accédez au répertoire où se trouve votre dossier contenant de nombreux fichiers/dossiers.
  2. scp -r source_folder_nameyourname@yourservername:destination_folder_name

Ensuite, prenez simplement de la bière, du café ou du pop-corn et attendez. Heureusement, scp réessayera si la connexion réseau "bloque". J'espère juste que ça ne descend pas complètement.

1
JGlass