rsync mkstemp fehlgeschlagen Ungültiges Argument (22) mit davfs mount der Box.com-Cloud

10

Ich habe den Box.com-Cloud-Speicher mithilfe von davfs gemäß diesen Anweisungen bereitgestellt . Ich habe mein Box.com-Konto unter / home / me / Cloud / Box eingerichtet

Ich kann sowohl über Dolphin als auch über das Terminal auf das gemountete Dateisystem zugreifen. Es ist etwas langsam, aber ich kann (ls) auflisten und ohne Fehler durch die gesamte Verzeichnisstruktur navigieren.

Als nächstes habe ich versucht, rsync wie folgt auszuführen:

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

Ich habe auch versucht:

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

und andere Variationen von rsync-Befehlen. Der Befehl kopiert meine Musik von meinem lokalen Dateisystem (/ home / me / Music /) in die Box-Cloud (/ home / me / Cloud / Box / Music) über den davfs-Mount.

Ich bekomme immer viele Fehler dieser Form:

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

Ein konkretes Beispiel ist:

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

Dies alles geschieht auf Kubuntu 12.04 LTS 64-Bit-Hardware mit Serverqualität und einer schnellen / zuverlässigen Kabelmodemverbindung (12 Mbit / s Upload-Geschwindigkeit).

MountainX
quelle

Antworten:

7

Das Problem tritt auf, weil rsynctemporäre Dateien mit Dateinamen erstellt werden, die box.com und / oder davfs nicht verstehen. Somit existiert die Datei .01_Track_1.mp3.YVmFI9nicht auf Ihrem System, sondern ist ein temporäres Artefakt von rsync. Einige Vermutungen von meiner Seite: Wenn Sie den Fehler nicht bei allen Dateien erhalten, erhalten Sie wahrscheinlich nur die Fehler bei Dateien, die bereits hochgeladen (und geändert) wurden.

Es verwendet als unmöglich diese temporäre Datei Generation auszuschalten, aber Sie könnten heute mehr Glück haben , indem Sie die Option Hinzufügen --inplace. Die Vorteile der Verwendung von rsync, wenn Sie nicht mit einem rsync-Daemon sprechen (was Sie nicht sind, wenn Sie davfs verwenden), sind mir jedoch unklar.

Alternativ können Sie daher versuchen cp --update, eine Datei nur zu kopieren, wenn die Quelle neuer als das Ziel ist. Neue Dateien und Dateien mit Änderungen an ID3-Tags werden kopiert, andere nicht.

Oder wenn Sie mehr Kontrolle benötigen find:

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

Dadurch bleibt die Hierarchiestruktur erhalten und cpiovorhandene Dateien, die nicht älter sind, werden nicht überschrieben.

Anthon
quelle
1
Ein Grund für die Verwendung von rsync ist, dass ich bereits weiß, wie ich es auf das Kopieren von Dateien mit weniger als 250 MB und Dateien oder Verzeichnissen beschränken kann, die nicht ausgeblendet sind. Ich benutze --max-size=250M --exclude '.*' . Ich bin mir sicher, dass cpman dazu gebracht werden kann ... vielleicht indem man die Ausgabe von find in cp leitet? Aber ich weiß noch nicht, wie ich das machen soll. Wenn wir eine Lösung finden, werde ich es versuchen cp -ru. Vielen Dank
MountainX
In diesem Fall brauchen Sie cp -u überhaupt nicht, verwenden Sie cpio (siehe aktualisierte Antwort)
Anthon
Danke. Ich glaube, das wird es für mich lösen. Sie haben mich dabei erzogen, was ich sehr schätze. (Zu Ihrer Information, in meinem Fall möchte ich Dateien mit weniger als 250 MB, nicht mehr als.)
MountainX
Das ist, was ... -size -250Mtut, sonst würden Sie verwenden +250M(es gab hier kurz eine falsche Version, aber ich erkannte es, bevor die Bearbeitung behoben wurde)
Anthon
3

1. Probleme mit Sonderzeichen in Dateinamen

Enthalten die Dateinamen Sonderzeichen? Abhängig vom Dateisystem, in das Sie diese Dateien schreiben, können Sie Dateien möglicherweise nicht mit einem Punkt ( .) voranstellen .

2. Probleme mit rsync-Änderungszeiten und webdav2

Ich bin auf diesen Blog-Beitragrsync gestoßen, in dem ein Problem mit einem Problem beim Schreiben / Verfolgen von Änderungszeiten für Dateien in webdav2-gemounteten box.com-Verzeichnissen beschrieben wird.

Das Problem tritt im gemounteten Dateisystem folgendermaßen auf:

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

Der gleiche Artikel zeigte eine Problemumgehung:

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

Dies ist eine in Ordnung zu verwendende Methode rsync, aber es werden nur Dateien anhand ihrer Größe verglichen, nicht anhand ihrer Prüfsummen.

3. Probleme mit davfs2 (WebDAV)

Ich bin auf diesen Thread mit dem Titel gestoßen : rsync via davfs2? im WebDAV (davfs) Forum über SourceForge. Jemand erkundigte sich nach einer ähnlichen Situation, in der er WebDAV verwenden wollte, um einen Online-Speicheranbieter bereitzustellen und über WebDAV Rsync-Vorgänge für den bereitgestellten Speicher durchzuführen. Dies sagte einer der Entwickler (Werner Baumann) von WebDAV zu diesem Thema .

Auszug aus Werners Antwort

  • davfs2 lädt nur vollständige Dateien hoch. Es kann nicht die inkrementellen Aufgaben ausführen, die rsync normalerweise ausführt, und das macht rsync sehr effizient.

  • davfs2 verwendet einen lokalen Cache auf der Festplatte. Dies macht es reaktionsschneller und Ihre Anwendung sollte auch davon profitieren. Dafür wird jedoch lokaler Speicherplatz benötigt. Sie sollten eine große Cache-Größe berücksichtigen, damit rsync den größten Teil seiner Arbeit mit dem lokalen Cache erledigen kann und davfs2 die meisten Dateien im Hintergrund hochlädt, wenn rsync bereits abgeschlossen ist.

Werner schlägt weiter Folgendes vor

Dies könnte in diesem Fall ein Nachteil sein. Wenn rsync eine Datei auf dem Remote-Host liest, muss sie zuerst von davfs2 in den lokalen Cache übertragen werden (falls sie noch nicht vorhanden ist). Dies könnte den Prozess wirklich und unnötig langsam machen. Da rsync in Ihrem Fall nur als ausgeklügeltes Kopierprogramm funktioniert, ist es möglicherweise besser, stattdessen cp zu verwenden. cp hat die Option (-u), nur Dateien zu kopieren, die neuer sind als die im davfs2-Dateisystem (= smartdrive), und es müsste die Dateien nicht lesen, sondern nur Datei-Metadaten wie mtime lesen.

Ein Befehl wie "cp -pru Verzeichnis / to / backup dav /" könnte den Job erledigen. Es sollte keine Dateien herunterladen (wie es rsync tun könnte, aber ich bin nicht sicher) (siehe die Handbücher von cp und rsync).

Optionen?

Wie von @Anthon vorgeschlagen, können Sie cp -udie Dateien mit dieser Methode kopieren. Die Erkenntnis, dass diese Methode nur die Größe einer Datei als Vergleichsfaktor betrachtet, ist daher nicht vollständig zuverlässig.

Sie sollten nichts verwenden, das nur die Änderungszeiten beim Vergleichen von Dateien berücksichtigt cp -pru. Werner erklärt in diesem Thread warum :

Auszug zum Thema Mod Zeiten

Wenn Sie ein davfs2-Dateisystem aushängen und zu einem späteren Zeitpunkt erneut bereitstellen, haben sich die Dateizeiten möglicherweise entsprechend den Zeitinformationen vom Server geändert. Tools wie cp -pu und rsync können sich nicht auf diese Zeiten verlassen, um festzustellen, welche Dateien sich geändert haben.

Angesichts der verschiedenen Probleme im Zusammenhang mit Änderungszeiten scheint ein Ansatz mit reinen Prüfsummen besser zu passen:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
slm
quelle
Hallo. Die Dateinamen enthalten keine Sonderzeichen. Mein Dateiname auf der Festplatte lautet einfach "01_Track_1.mp3". Das Punktpräfix ist weder Teil des normalen Dateinamens noch die zusätzliche Erweiterung (z. B. .mp3.YVmFI9). Beachten Sie auch, dass nicht jede Datei fehlschlägt. Die Fehler scheinen kein Muster zu haben.
MountainX
ist das genug info? 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
ein weiteres Beispiel: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 - Überprüfen Sie, ob mein Update Ihr Problem ist. Auch welche Version von verwenden rsyncSie? rsync --version.
slm
rsync version 3.0.9 protocol version 30und ich teste jetzt Ihre aktualisierte Lösung. Vielen Dank!
MountainX
3

Um den Invalid argument (22)Fehler zu stoppen, musste ich rsync daran hindern, seine temporären Dateien auf dem davfs-Ziel zu erstellen.

rsync --temp-dir=/tmp

Ich denke, was passiert, ist, dass die temporären Dateinamen von rsync damit beginnen .und davfs dies nicht zulässt. Also ging ich weiter und forderte rsync auf, Quelldateien mit Namen zu ignorieren, die mit beginnen .. Da ich benutze --delete, habe ich auch gesagt, dass ich nicht versuchen soll, das lost+foundVerzeichnis im davfs-Ziel zu löschen .

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Dzamo Norton
quelle
Ich bin auf dieses Problem bei Cygwin gestoßen und diese Frage war der Top-Suchmaschinen-Hit. Die akzeptierte Antwort funktionierte bei mir nicht, da ich an einer Remote-Dateisynchronisierung über das Internet arbeitete, sodass die Verwendung von rsync obligatorisch war. Der Vorschlag --temp-dir in dieser Antwort war die Lösung für mich.
Nickcrabtree