rsync mkstemp a échoué Argument invalide (22) avec le montage davfs du cloud Box.com

10

J'ai monté le stockage cloud Box.com en utilisant davfs selon ces instructions . J'ai monté mon compte Box.com sous / home / me / Cloud / Box

Je peux accéder au système de fichiers monté via Dolphin ainsi que via le terminal. C'est un peu lent, mais je peux lister (ls) et parcourir toute la structure du répertoire sans erreur.

Ensuite, j'ai tenté d'exécuter rsync comme suit:

rsync -auvz  --max-size=250M --exclude '.*' /home/me/Music/ /home/me/Cloud/Box/Music

J'ai aussi essayé:

rsync -auv  /home/me/Music/A /home/me/Cloud/Box/Music

et d'autres variantes des commandes rsync. La commande copie ma musique depuis mon système de fichiers local (/ home / me / Music /) vers le cloud Box (/ home / me / Cloud / Box / Music) via le montage davfs.

Je reçois toujours beaucoup d'erreurs de ce formulaire:

rsync: mkstemp <filename> failed: Invalid argument (22)

Un exemple spécifique est:

rsync: mkstemp "/home/me/Cloud/Box/Music/VariousArtists/.01_Track_1.mp3.YVmFI9" failed: Invalid argument (22)

Tout cela se produit sur le matériel Kubuntu 12.04 LTS 64 bits, de qualité serveur, avec une connexion par modem câble rapide / fiable (vitesses de téléchargement de 12 Mb / s).

MountainX
la source

Réponses:

7

Le problème se produit en raison de la rsynccréation de fichiers temporaires avec des noms de fichiers que box.com et / ou davfs ne comprennent pas. Ainsi, le fichier .01_Track_1.mp3.YVmFI9n'existe pas sur votre système, mais est un artefact temporaire de rsync. Quelques suppositions de mon côté: si vous n'obtenez pas l'erreur sur tous les fichiers, vous n'obtiendrez probablement que les erreurs sur les fichiers qui ont déjà été téléchargés (et modifiés).

Il était autrefois impossible de désactiver cette génération de fichier temporaire, mais vous pouvez aujourd'hui avoir plus de chance en ajoutant l'option --inplace. Cependant, les avantages de l'utilisation de rsync si vous ne parlez pas à un démon rsync (ce que vous n'êtes pas si vous utilisez davfs), ne sont pas clairs pour moi.

Par conséquent, vous pouvez également essayer de cp --updatecopier un fichier uniquement lorsque la source est plus récente que la destination. Les nouveaux fichiers et tous les fichiers avec des modifications dans les balises ID3 seront copiés, d'autres non.

Ou si vous avez besoin d'avoir plus de contrôle, utilisez find:

cd /home/me/Music/
find * -size -250M -print0 | cpio -pdmv0 /home/me/Cloud/Box/Music

cela préserve la structure hiérarchique et cpion'écrase pas les fichiers existants qui ne sont pas plus anciens.

Anthon
la source
1
Une des raisons d'utiliser rsync est que je sais déjà comment le limiter à la copie de fichiers de moins de 250 Mo et de fichiers ou de répertoires qui ne sont pas masqués. J'utilise --max-size=250M --exclude '.*' . Je suis sûr cpqu'on peut faire ça ... peut-être en canalisant la sortie de find dans cp? Mais je ne sais pas encore comment faire ça. Si nous trouvons une solution, je vais essayer cp -ru. Merci
MountainX
Dans ce cas, vous n'avez pas du tout besoin de cp -u, utilisez cpio (voir la réponse mise à jour)
Anthon
Je vous remercie. Je crois que cela le résoudra pour moi. Vous m'avez éduqué dans le processus, ce que j'apprécie. (Pour info, dans mon cas, je veux des fichiers inférieurs à 250 Mo, pas supérieurs à.)
MountainX
C'est ce qui ... -size -250Mfait, sinon vous utiliseriez +250M(il y avait brièvement une mauvaise version ici, mais je m'en suis rendu compte avant que la modification ne soit corrigée)
Anthon
3

1. Problèmes avec les caractères spéciaux dans les noms de fichiers

Y a-t-il des caractères spéciaux dans les noms de fichiers? Selon le système de fichiers sur lequel vous écrivez ces fichiers, ils peuvent ne pas vous permettre de préfixer les fichiers avec un point ( .) par exemple.

2. Problèmes avec les temps de modification de rsync et webdav2

Je suis tombé sur ce billet de blog où un problème est décrit avec rsyncun problème d'écriture / de suivi des temps de modification des fichiers dans les répertoires box.com montés sur webdav2.

Le problème apparaît comme ceci dans le système de fichiers monté:

david@sydney:~/Pictures$ ls -l /mnt/box/bwca/08/09/IMG_3084.CR2
-rw-r--r-- 1 david david 12564061 Aug 14 16:08 /mnt/box/bwca/08/09/IMG_3084.CR2
david@sydney:~/Pictures$ ls -l 2012/08/09/IMG_3084.CR2
-rw-rw-r-- 1 david david 12564061 Aug  9 13:00 2012/08/09/IMG_3084.CR2

Ce même article a montré une solution de contournement:

$ rsync -avhP --size-only --bwlimit=64 2012/08 /mnt/box/bwca/

C'est une bonne façon d'utiliser rsync, mais ce n'est que de comparer les fichiers en fonction de leur taille maintenant, pas de leurs sommes de contrôle.

3. Problèmes avec davfs2 (WebDAV)

Je suis tombé sur ce fil intitulé: rsync via davfs2? sur le forum WebDAV (davfs) sur sourceforge. Quelqu'un se renseignait sur une situation similaire où ils voulaient utiliser WebDAV pour monter un fournisseur de stockage en ligne et effectuer des rsync sur le stockage monté via WebDAV. C'est ce que l'un des développeurs (Werner Baumann) de WebDAV avait à dire sur ce sujet .

extrait de la réponse de Werner

  • davfs2 ne téléchargera que des fichiers complets. Il ne peut pas faire les choses incrémentielles que rsync fait habituellement, ce qui rend rsync très efficace.

  • davfs2 utilise un cache local sur le disque. Cela le rendra plus réactif et votre application devrait également en profiter. Mais il a besoin d'espace disque local pour cela. Vous devez prévoir une grande taille de cache, afin que rsync puisse faire la plupart de son travail avec le cache local, et davfs2 téléchargera la plupart des fichiers en arrière-plan, lorsque rsync sera déjà terminé.

Werner suggère ensuite ce qui suit

Cela pourrait être un inconvénient dans ce cas. Lorsque rsync lit un fichier sur l'hôte distant, il doit d'abord être transféré par davfs2 dans le cache local (s'il n'est pas déjà là). Cela pourrait rendre le processus vraiment lent et inutile. Comme rsync ne fonctionne que comme un programme de copie sophistiqué dans votre cas, il pourrait être préférable d'utiliser cp à la place. cp a une option (-u) pour copier uniquement les fichiers plus récents que ceux du système de fichiers davfs2 (= smartdrive) et il n'aurait pas besoin de lire les fichiers, mais ne lit que les métadonnées des fichiers comme mtime.

Une commande comme "cp -pru directory / to / backup dav /" pourrait faire le travail. Il ne doit pas télécharger de fichiers (comme rsync pourrait le faire, mais je ne suis pas sûr) (veuillez consulter les manuels de cp et rsync).

Des options?

Ainsi, comme @Anthon l'a suggéré, vous pouvez utiliser la cp -uméthode pour copier les fichiers. Réalisant que cette méthode ne considère que la taille d'un fichier comme un facteur de comparaison, elle n'est donc pas complètement fiable.

Vous ne devriez pas utiliser tout ce qui ne regarde que les temps de modification lorsque l'on compare les fichiers, cp -pru. Werner explique pourquoi dans ce fil :

extrait sur problème avec les heures de modification

Lorsque vous démontez un système de fichiers davfs2 et le montez à nouveau ultérieurement, les heures des fichiers peuvent avoir changé en fonction des informations d'heure du serveur. Des outils comme cp -pu et rsync ne peuvent pas compter sur ces heures pour déterminer quels fichiers ont changé.

Donc, étant donné les divers problèmes entourant les temps de modification, une approche utilisant uniquement des sommes de contrôle semble plus appropriée:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
slm
la source
Salut. Il n'y a pas de caractères spéciaux dans les noms de fichiers. Mon nom de fichier sur le disque est simplement "01_Track_1.mp3". Le préfixe point ne fait pas partie du nom de fichier normal, ni l'extension supplémentaire (par exemple, .mp3.YVmFI9). Notez également que tous les fichiers n'échouent pas. Les échecs ne semblent pas avoir de modèle.
MountainX
est-ce assez d'informations? got file_sum recv_files(Some_Music_[1999]/Some_Music_[1999]Zuni_SongVarious_Artists24.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Some_Music_[1999]/.Some_Music_[1999]Zuni_SongVarious_Artists24.mp3.1aWWRY" failed: Invalid argument (22) got file_sum
MountainX
un autre exemple:got file_sum recv_files(Carlos/Dance/05-Tapestry-Carlos.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Carlos/Dance/.05-Tapestry-Carlos.mp3.WeGbGS" failed: Invalid argument (22) got file_sum recv_files(Carlos/Dance/06-Dance-Turquoise_Dance-Carlos.mp3)
MountainX
@MountainX - voyez si ma mise à jour est votre problème. Quelle version rsyncutilisez-vous également? rsync --version.
slm
rsync version 3.0.9 protocol version 30et je teste votre solution mise à jour maintenant. Merci!
MountainX
3

Pour arrêter l' Invalid argument (22)erreur, j'ai dû arrêter rsync de créer ses fichiers temporaires sur la destination davfs.

rsync --temp-dir=/tmp

Je pense que ce qui se passe est que les noms de fichiers temporaires de rsync commencent par .et davfs ne le permet pas. Je suis donc allé plus loin et j'ai dit à rsync d'ignorer les fichiers source dont le nom commence par .. Depuis que j'utilise --delete, je lui ai également dit de ne pas essayer de supprimer le lost+foundrépertoire dans la destination davfs.

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Dzamo Norton
la source
J'ai rencontré ce problème sur Cygwin et cette question était le premier hit du moteur de recherche. La réponse acceptée n'a pas fonctionné pour moi car je travaillais sur une synchronisation de fichiers à distance sur Internet, donc l'utilisation de rsync était obligatoire. La suggestion --temp-dir dans cette réponse était la solution pour moi.
nickcrabtree