rsync mkstemp gagal Argumen tidak valid (22) dengan davfs mount cloud Box.com

10

Saya memasang penyimpanan cloud Box.com menggunakan davfs sesuai dengan instruksi ini . Saya memasang akun Box.com saya di / home / me / Cloud / Box

Saya dapat mengakses sistem file yang dipasang melalui Dolphin serta melalui terminal. Agak lambat, tapi saya bisa daftar (ls) dan menavigasi seluruh struktur direktori tanpa kesalahan.

Selanjutnya saya mencoba menjalankan rsync sebagai berikut:

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

Saya juga mencoba:

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

dan variasi perintah rsync lainnya. Perintah ini menyalin Musik saya dari sistem file lokal saya (/ home / me / Music /) ke Box cloud (/ home / me / Cloud / Box / Music) melalui davfs mount.

Saya selalu mendapatkan banyak kesalahan dari formulir ini:

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

Contoh spesifik adalah:

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

Ini semua terjadi pada Kubuntu 12.04 LTS 64 bit, perangkat keras tingkat server, dengan koneksi modem kabel yang cepat / andal (kecepatan unggah 12 Mb / dtk).

MountainX
sumber

Jawaban:

7

Masalah terjadi karena rsyncmembuat file sementara dengan nama file yang tidak dimengerti oleh box.com dan / atau davfs. Sehingga file .01_Track_1.mp3.YVmFI9tidak ada pada sistem Anda, tetapi adalah sementara artefak dari rsync. Beberapa tebakan dari pihak saya: jika Anda tidak mendapatkan kesalahan pada semua file, Anda mungkin hanya mendapatkan kesalahan pada file yang sudah diunggah (dan diubah).

Ini digunakan untuk menjadi mustahil untuk mematikan generasi file sementara ini, tetapi Anda mungkin saat ini memiliki lebih beruntung dengan menambahkan pilihan --inplace. Namun keuntungan menggunakan rsync jika Anda tidak berbicara dengan rsync-daemon (yang tidak Anda lakukan jika Anda menggunakan davfs), tidak jelas bagi saya.

Karena itu, sebagai alternatif, Anda bisa mencoba cp --update, yang hanya menyalin file ketika sumbernya lebih baru daripada tujuan. File baru dan file apa pun dengan perubahan pada tag ID3 akan disalin, yang lain tidak.

Atau jika Anda perlu lebih banyak menggunakan kontrol find:

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

ini mempertahankan struktur hierarki dan cpiotidak menimpa file yang sudah ada yang tidak lebih lama.

Anthon
sumber
1
Salah satu alasan untuk menggunakan rsync adalah saya sudah tahu bagaimana membatasinya untuk menyalin file kurang dari 250MB dan file atau direktori yang tidak disembunyikan. Saya menggunakan --max-size=250M --exclude '.*' . Saya yakin cpdapat dibuat untuk melakukan ini ... mungkin dengan mem-pipkan output dari find ke cp? Tapi saya belum tahu bagaimana melakukannya. Jika kami menemukan solusi, saya akan coba cp -ru. Terima kasih
MountainX
Dalam hal ini Anda tidak perlu cp -u sama sekali, gunakan cpio (lihat jawaban yang diperbarui)
Anthon
Terima kasih. Saya percaya ini akan menyelesaikannya untuk saya. Anda mendidik saya dalam proses, yang saya hargai. (FYI, dalam kasus saya, saya ingin file kurang dari 250MB, tidak lebih besar dari.)
MountainX
Itulah yang ... -size -250Mdilakukan, jika tidak Anda akan menggunakan +250M(ada versi yang salah di sini, tapi saya menyadarinya sebelum edit diperbaiki)
Anthon
3

1. Masalah dengan karakter khusus dalam nama file

Apakah ada karakter khusus dalam nama file? Bergantung pada sistem file tempat Anda menulis file-file ini, mereka mungkin tidak memungkinkan Anda untuk mengawali file dengan titik ( .) misalnya.

2. Masalah dengan waktu modifikasi rsync dan webdav2

Saya menemukan posting blog ini di mana masalah dijelaskan dengan rsyncmemiliki masalah menulis / melacak kali modifikasi file di webdav2 mount direktori box.com.

Masalahnya muncul seperti ini di sistem file yang dipasang:

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

Artikel yang sama menunjukkan solusi:

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

Ini adalah cara yang OK untuk digunakan rsync, tetapi ini hanya membandingkan file berdasarkan ukurannya sekarang, bukan checksum mereka.

3. Masalah dengan davfs2 (WebDAV)

Saya menemukan utas ini berjudul: rsync via davfs2? di forum WebDAV (davfs) di atas pada sourceforge. Seseorang bertanya tentang situasi serupa di mana mereka ingin menggunakan WebDAV untuk memasang penyedia penyimpanan online dan melakukan rsync ke penyimpanan yang dipasang melalui WebDAV. Inilah yang dikatakan oleh salah satu pengembang (Werner Baumann) dari WebDAV tentang topik ini .

kutipan tanggapan Werner

  • davfs2 hanya akan mengunggah file lengkap. Itu tidak dapat melakukan hal-hal tambahan yang biasanya dilakukan rsync, dan itu membuat rsync sangat efisien.

  • davfs2 menggunakan cache lokal pada disk. Ini akan membuatnya lebih responsif dan aplikasi Anda akan mendapat keuntungan dari ini juga. Tetapi perlu ruang disk lokal untuk ini. Anda harus mengizinkan ukuran cache yang besar, sehingga rsync dapat melakukan sebagian besar pekerjaannya dengan cache lokal, dan davfs2 akan mengunggah sebagian besar file di latar belakang, ketika rsync telah selesai.

Werner selanjutnya menyarankan yang berikut

Ini bisa menjadi kerugian dalam kasus ini. Ketika rsync membaca file pada host jarak jauh, itu harus ditransfer oleh davfs2 ke cache lokal terlebih dahulu (jika belum ada di sana). Ini bisa membuat prosesnya benar-benar dan tidak perlu lambat. Karena rsync hanya berfungsi sebagai program salin canggih dalam kasus Anda, mungkin lebih baik menggunakan cp. cp memiliki opsi (-u) untuk menyalin hanya file yang lebih baru daripada yang ada di sistem file davfs2 (= smartdrive) dan tidak perlu membaca file, tetapi hanya membaca data meta file seperti mtime.

Perintah seperti "direktori cp -pru / ke / backup dav /" dapat melakukan pekerjaan itu. Shold tidak mengunduh file (seperti yang mungkin dilakukan rsync, tapi saya tidak yakin) (silakan lihat manual cp dan rsync).

Pilihan?

Jadi seperti yang disarankan @Anthon, Anda dapat menggunakan cp -umetode ini untuk menyalin file. Menyadari bahwa metode ini semata-mata melihat ukuran file sebagai faktor perbandingan, sehingga tidak sepenuhnya dapat diandalkan.

Anda tidak boleh menggunakan apa pun yang hanya terlihat pada waktu modifikasi ketika membandingkan file cp -pru,. Werner menjelaskan mengapa di utas ini :

kutipan tentang masalah dengan waktu mod

Ketika Anda melepas sistem file davfs2 dan memasangnya lagi di lain waktu, waktu file mungkin telah berubah sesuai dengan informasi waktu dari server. Alat-alat seperti cp -pu dan rsync tidak dapat mengandalkan waktu ini untuk menentukan file apa yang telah berubah.

Jadi mengingat berbagai masalah seputar waktu modifikasi pendekatan menggunakan checksum murni tampaknya lebih cocok:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
slm
sumber
Hai. Tidak ada karakter khusus dalam nama file. Nama file saya di disk hanyalah "01_Track_1.mp3". Awalan titik bukan bagian dari nama file normal, juga bukan ekstensi tambahan (misalnya, .mp3.YVmFI9). Perhatikan juga bahwa tidak setiap file gagal. Kegagalan tampaknya tidak memiliki pola.
MountainX
apakah ini informasi yang cukup? 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
contoh lain: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 - lihat apakah pembaruan saya adalah masalah Anda. Juga versi apa rsyncyang Anda gunakan? rsync --version.
slm
rsync version 3.0.9 protocol version 30dan saya sedang menguji solusi Anda yang diperbarui sekarang. Terima kasih!
MountainX
3

Untuk menghentikan Invalid argument (22)kesalahan, saya harus menghentikan rsync dari membuat file temp-nya di tujuan davfs.

rsync --temp-dir=/tmp

Saya pikir yang terjadi adalah nama file temp rsync dimulai dengan .dan davfs tidak mengizinkan ini. Jadi saya melangkah lebih jauh dan mengatakan kepada rsync untuk mengabaikan file sumber dengan nama yang dimulai dengan .. Karena saya menggunakan --delete, saya juga mengatakan untuk tidak mencoba menghapus lost+founddirektori di tujuan davfs.

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Dzamo Norton
sumber
Saya mengalami masalah ini di Cygwin dan pertanyaan ini adalah hit mesin pencari teratas. Jawaban yang diterima tidak bekerja untuk saya karena saya sedang mengerjakan sinkronisasi file jarak jauh di internet sehingga menggunakan rsync adalah wajib. Saran --temp-dir dalam jawaban ini adalah solusi bagi saya.
nickcrabtree