rsync mkstemp nie powiódł się Niepoprawny argument (22) dla davfs mount z chmury Box.com

10

Zainstalowałem pamięć masową w chmurze Box.com za pomocą davfs zgodnie z tymi instrukcjami . Zainstalowałem swoje konto Box.com w katalogu / home / me / Cloud / Box

Mogę uzyskać dostęp do zamontowanego systemu plików zarówno przez Dolphin, jak i przez terminal. Jest to trochę powolne, ale mogę wyświetlić listę (ls) i poruszać się po całej strukturze katalogów bez błędów.

Następnie próbowałem uruchomić rsync w następujący sposób:

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

Próbowałem także:

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

i inne odmiany poleceń rsync. Polecenie kopiuje moją muzykę z mojego lokalnego systemu plików (/ home / me / Music /) do chmury Box (/ home / me / Cloud / Box / Music) przez davfs mount.

Zawsze pojawia się wiele błędów tego formularza:

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

Konkretnym przykładem jest:

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

Wszystko to dzieje się na 64-bitowym sprzęcie serwerowym Kubuntu 12.04 LTS z szybkim / niezawodnym modemem kablowym (prędkość wysyłania 12 Mb / s).

MountainX
źródło

Odpowiedzi:

7

Problem występuje z powodu rsynctworzenia plików tymczasowych o nazwach plików, których Box.com i / lub davfs nie rozumieją. W ten sposób plik .01_Track_1.mp3.YVmFI9nie istnieje w systemie, ale to tymczasowa artefakt od rsync. Trochę domysłów z mojej strony: jeśli nie pojawi się błąd na wszystkich plikach, prawdopodobnie dostaniesz tylko błędy na plikach, które zostały już przesłane (i zmienione).

To zwyczajnie niemożliwe , aby wyłączyć tę generację plik tymczasowy, ale może w dzisiejszych czasach mieć więcej szczęścia, dodając opcję --inplace. Jednak zalety korzystania z rsync, jeśli nie rozmawiasz z demonem rsync (którym nie jesteś, jeśli używasz davfs), są dla mnie niejasne.

Dlatego alternatywnie można spróbować cp --update, który kopiuje plik tylko wtedy, gdy źródło jest nowsze niż miejsce docelowe. Nowe pliki i wszelkie pliki ze zmianami w znacznikach ID3 zostaną skopiowane, inne nie.

Lub jeśli potrzebujesz mieć więcej kontroli, użyj find:

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

pozwala to zachować strukturę hierarchii i cpionie zastępuje istniejących plików, które nie są starsze.

Anthon
źródło
1
Jednym z powodów używania rsync jest to, że już wiem, jak ograniczyć go do kopiowania plików mniejszych niż 250 MB oraz plików lub katalogów, które nie są ukryte. Używam --max-size=250M --exclude '.*' . Jestem pewien, że cpmożna to zrobić ... może przez przesłanie wyników find do cp? Ale nie wiem jeszcze, jak to zrobić. Jeśli wymyślimy rozwiązanie, spróbuję cp -ru. Dzięki
MountainX
W takim przypadku w ogóle nie potrzebujesz cp -u, użyj cpio (patrz zaktualizowana odpowiedź)
Anthon
Dziękuję Ci. Wierzę, że to rozwiąże dla mnie. Nauczyłeś mnie procesu, który doceniam. (FYI, w moim przypadku chcę pliki mniejsze niż 250 MB, nie większe niż.)
MountainX
Tak właśnie ... -size -250Mdziała, w przeciwnym razie byś użył +250M(tutaj była na krótko niepoprawna wersja, ale zdałem sobie z tego sprawę przed naprawą edycji)
Anthon
4

1. Problemy ze znakami specjalnymi w nazwach plików

Czy w nazwach plików są jakieś znaki specjalne? W zależności od systemu plików, w którym zapisujesz te pliki, mogą one nie pozwalać na przykład poprzedzać plików kropką ( .).

2. Problemy z czasami modyfikacji rsync i webdav2

Natrafiłem na ten post na blogu, w którym opisany jest problem z rsyncczasem zapisu / śledzenia modyfikacji pliku w katalogach box.com zamontowanych w webdav2.

Problem pojawia się w następujący sposób w zamontowanym systemie plików:

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

Ten sam artykuł pokazał obejście:

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

Jest to OK sposób użycia rsync, ale teraz porównuje tylko pliki na podstawie ich rozmiaru, a nie ich sumy kontrolne.

3. Problemy z davfs2 (WebDAV)

Natknąłem się na ten wątek: rsync przez davfs2? na forum WebDAV (davfs) na stronie sourceforge. Ktoś pytał o podobną sytuację, w której chcieli użyć WebDAV do zamontowania dostawcy pamięci masowej online i wykonania rsync do zamontowanej pamięci masowej za pośrednictwem WebDAV. To właśnie powiedział jeden z programistów (Werner Baumann) WebDAV na ten temat .

fragment odpowiedzi Wernera

  • davfs2 prześle tylko pełne pliki. Nie jest w stanie wykonywać czynności przyrostowych, które zwykle wykonuje rsync, a to sprawia, że ​​rsync jest bardzo wydajny.

  • davfs2 używa lokalnej pamięci podręcznej na dysku. Dzięki temu będzie bardziej responsywny, a Twoja aplikacja również powinna na tym skorzystać. Ale potrzebuje do tego lokalnego miejsca na dysku. Powinieneś zezwolić na duży rozmiar pamięci podręcznej, aby rsync mógł wykonywać większość swojej pracy z lokalną pamięcią podręczną, a davfs2 prześle większość plików w tle, gdy rsync już się zakończy.

Werner sugeruje, co następuje

W tym przypadku może to być wadą. Gdy rsync odczytuje plik na zdalnym hoście, musi on zostać najpierw przesłany przez davfs2 do lokalnej pamięci podręcznej (jeśli jeszcze go nie ma). Może to spowodować, że proces będzie naprawdę i niepotrzebnie powolny. Ponieważ rsync działa tylko jako wyrafinowany program kopiujący w twoim przypadku, może być lepiej użyć cp. cp ma opcje (-u) do kopiowania tylko plików nowszych niż te w systemie plików davfs2 (= smartdrive) i nie musiałby czytać plików, a jedynie odczytywał metadane plików, takie jak mtime.

Polecenie takie jak „cp -pru directory / to / backup dav /” może wykonać zadanie. Nie pobiera plików (tak jak rsync może, ale nie jestem pewien) (spójrz na instrukcje cp i rsync).

Opcje?

Tak jak sugeruje @Anthon, możesz użyć cp -umetody do skopiowania plików. Zdając sobie sprawę, że ta metoda uwzględnia jedynie rozmiar pliku jako czynnik porównawczy, więc nie jest całkowicie niezawodna.

Nie należy używać niczego, co tylko wygląda czasami modyfikacji przy porównywaniu plików cp -pru. Werner wyjaśnia dlaczego w tym wątku :

fragment dotyczący problemu z czasami modyfikacji

Po odmontowaniu systemu plików davfs2 i zamontowaniu go później, czasy plików mogły ulec zmianie w zależności od informacji o czasie z serwera. Narzędzia takie jak cp -pu i rsync nie mogą polegać na tych czasach w celu ustalenia, które pliki uległy zmianie.

Biorąc pod uwagę różne problemy związane z czasami modyfikacji, lepsze wydaje się podejście wykorzystujące sumy kontrolne:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
slm
źródło
Cześć. W nazwach plików nie ma znaków specjalnych. Moja nazwa pliku na dysku to po prostu „01_Track_1.mp3”. Prefiks kropki nie jest częścią normalnej nazwy pliku, ani dodatkowe rozszerzenie (np. .Mp3.YVmFI9). Pamiętaj też, że nie każdy plik zawiedzie. Awarie wydają się nie mieć wzorca.
MountainX
czy to wystarczy? 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
inny przykład: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 - sprawdź, czy problem dotyczy mojej aktualizacji. Jakiej wersji rsyncużywasz? rsync --version.
slm
rsync version 3.0.9 protocol version 30i testuję teraz twoje zaktualizowane rozwiązanie. Dzięki!
MountainX
3

Aby zatrzymać Invalid argument (22)błąd, musiałem powstrzymać rsync przed tworzeniem plików tymczasowych w miejscu docelowym davfs.

rsync --temp-dir=/tmp

Myślę, że dzieje się tak, że nazwy plików tymczasowych rsync zaczynają się od, .a davfs na to nie pozwala. Poszedłem więc dalej i powiedziałem rsync, aby ignorowało pliki źródłowe o nazwach zaczynających się od .. Ponieważ używam --delete, powiedziałem mu również, aby nie próbować usuwać lost+foundkatalogu z miejsca docelowego davfs.

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Dzamo Norton
źródło
Zetknąłem się z tym problemem na Cygwin i to pytanie było najczęściej odwiedzaną wyszukiwarką. Przyjęta odpowiedź nie działała dla mnie, ponieważ pracowałem nad zdalną synchronizacją plików przez Internet, więc użycie rsync było obowiązkowe. Sugestia --temp-dir w tej odpowiedzi była dla mnie rozwiązaniem.
nickcrabtree