rsync mkstemp falhou Argumento inválido (22) com montagem davfs da nuvem Box.com

10

Montei o armazenamento em nuvem Box.com usando davfs de acordo com estas instruções . Montei minha conta Box.com em / home / me / Cloud / Box

Eu posso acessar o sistema de arquivos montado via Dolphin e também através do terminal. É um pouco lento, mas posso listar (ls) e navegar por toda a estrutura de diretórios sem erros.

Em seguida, tentei executar o rsync da seguinte maneira:

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

Eu também tentei:

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

e outras variações de comandos rsync. O comando está copiando minha música do meu sistema de arquivos local (/ home / me / Music /) para a nuvem Box (/ home / me / Cloud / Box / Music) através da montagem davfs.

Eu sempre recebo muitos erros deste formulário:

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

Um exemplo específico é:

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

Tudo isso está acontecendo no Kubuntu 12.04 LTS de 64 bits, hardware de servidor, com uma conexão de modem a cabo rápida / confiável (velocidades de upload de 12 Mb / s).

MountainX
fonte

Respostas:

7

O problema ocorre devido à rsynccriação de arquivos temporários com nomes de arquivos que o box.com e / ou davfs não entendem. Portanto, o arquivo .01_Track_1.mp3.YVmFI9não existe no seu sistema, mas é um artefato temporário de rsync. Algumas suposições do meu lado: se você não receber o erro em todos os arquivos, provavelmente só receberá os erros nos arquivos que já foram enviados (e alterados).

Ele costumava ser impossível desligar esta geração de arquivos temporários, mas você pode hoje em dia têm mais sorte, adicionando a opção --inplace. No entanto, as vantagens de usar o rsync se você não estiver falando com um rsync-daemon (o que você não faria se estivesse usando o davfs), não são claras para mim.

Portanto, como alternativa, você pode tentar cp --update, que apenas copia um arquivo quando a fonte é mais nova que o destino. Novos arquivos e quaisquer arquivos com alterações nas tags ID3 serão copiados, outros não.

Ou se você precisar ter mais controle, use find:

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

Isso preserva a estrutura de hierarquia e cpionão substituir existentes arquivos que não são mais velhos.

Anthon
fonte
1
Uma razão para usar o rsync é que eu já sei como limitá-lo a copiar arquivos com menos de 250 MB e arquivos ou diretórios que não estão ocultos. Eu uso --max-size=250M --exclude '.*' . Tenho certeza que cppode ser feito para fazer isso ... talvez canalizando a saída do find para cp? Mas ainda não sei como fazer isso. Se surgirmos uma solução, tentarei cp -ru. Obrigado
MountainX
Nesse caso, você não precisa de u cp em tudo, uso cpio (ver resposta atualizado)
Anthon
Obrigado. Eu acredito que isso vai resolver isso para mim. Você me educou no processo, o que eu aprecio. (FYI, no meu caso eu quero arquivos menos de 250 MB, não é superior.)
MountainX
Isso é o que ... -size -250Mfaz, caso contrário, você usaria +250M(havia brevemente uma versão errado aqui, mas eu percebi que antes da edição foi fixado)
Anthon
3

1. Problemas com caracteres especiais nos nomes de arquivos

Existem caracteres especiais nos nomes dos arquivos? Dependendo do sistema de arquivos no qual você está gravando esses arquivos, eles podem não permitir que você prefixe os arquivos com um ponto ( .), por exemplo.

2. Problemas com tempos de modificação do rsync e webdav2

Me deparei com este post do blog, onde é descrito rsyncum problema com o problema de escrever / acompanhar os tempos de modificação de arquivos nos diretórios webdav2 montado em box.com.

O problema aparece assim no sistema de arquivos montado:

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

Esse mesmo artigo mostrou uma solução alternativa:

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

Essa é uma boa maneira de usar rsync, mas está apenas comparando arquivos com base no tamanho atual, não nas somas de verificação.

3. Problemas com davfs2 (WebDAV)

Me deparei com este segmento intitulado: rsync via davfs2? no fórum WebDAV (davfs) no sourceforge. Alguém estava perguntando sobre uma situação semelhante em que desejava usar o WebDAV para montar um provedor de armazenamento online e executar rsync no armazenamento montado via WebDAV. Isso é o que um dos desenvolvedores (Werner Baumann) do WebDAV disse sobre esse tópico .

trecho da resposta de Werner

  • O davfs2 fará upload apenas de arquivos completos. Ele não pode fazer as coisas incrementais que o rsync geralmente faz, e isso torna o rsync muito eficiente.

  • davfs2 usa um cache local no disco. Isso o tornará mais responsivo e seu aplicativo também deverá lucrar com isso. Mas ele precisa de espaço em disco local para isso. Você deve permitir um tamanho de cache grande, para que o rsync possa executar a maior parte de seu trabalho com o cache local, e o davfs2 fará o upload da maioria dos arquivos em segundo plano, quando o rsync já tiver terminado.

Werner continua sugerindo o seguinte

Isso pode ser uma desvantagem neste caso. Quando o rsync lê um arquivo no host remoto, ele deve ser transferido pelo davfs2 para o cache local primeiro (se ainda não estiver lá). Isso pode tornar o processo realmente desnecessário e lento. Como o rsync funciona apenas como um programa de cópia sofisticado no seu caso, pode ser melhor usar o cp. O cp tem uma opção (-u) para copiar apenas os arquivos mais novos que os do sistema de arquivos davfs2 (= smartdrive) e não precisaria ler os arquivos, mas apenas ler os metadados do arquivo como mtime.

Um comando como "diretório cp -pru / para / backup dav /" pode fazer o trabalho. Ele não deve baixar arquivos (como o rsync pode fazer, mas não tenho certeza) (consulte os manuais do cp e do rsync).

Opções?

Então, como o @Anthon sugeriu, você pode usar o cp -umétodo para copiar os arquivos. Perceber que esse método considera apenas o tamanho de um arquivo como um fator em comparação, portanto, não é totalmente confiável.

Você não deve usar nada que apenas observe os tempos de modificação ao comparar arquivos cp -pru,. Werner explica o porquê nesta discussão :

trecho em questão com tempos modernos

Quando você desmonta um sistema de arquivos davfs2 e o monta novamente mais tarde, os horários dos arquivos podem ter sido alterados de acordo com as informações de horário do servidor. Ferramentas como cp -pu e rsync não podem contar com esses horários para determinar quais arquivos foram alterados.

Portanto, considerando os vários problemas relacionados aos tempos de modificação, uma abordagem usando somas de verificação puramente parece um ajuste melhor:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
slm
fonte
Oi. Não há caracteres especiais nos nomes dos arquivos. Meu nome de arquivo no disco é simplesmente "01_Track_1.mp3". O prefixo do ponto não faz parte do nome normal do arquivo nem a extensão extra (por exemplo, .mp3.YVmFI9). Observe também que nem todos os arquivos falham. As falhas não parecem ter um padrão.
MountainX
esta informação é suficiente? 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
outro exemplo: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 - veja se minha atualização é seu problema. Também qual versão rsyncvocê está usando? rsync --version.
slm
rsync version 3.0.9 protocol version 30e estou testando sua solução atualizada agora. Obrigado!
MountainX
3

Para interromper o Invalid argument (22)erro, tive que parar o rsync de criar seus arquivos temporários no destino davfs.

rsync --temp-dir=/tmp

Acho que o que acontece é que os nomes dos arquivos temporários do rsync começam .e o davfs não permite isso. Então fui mais longe e disse ao rsync para ignorar arquivos de origem com nomes começando com .. Desde que eu estou usando --delete, eu também disse para não tentar excluir o lost+founddiretório no destino davfs.

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Dzamo Norton
fonte
Encontrei esse problema no Cygwin e essa foi a principal ferramenta de busca atingida. A resposta aceita não funcionou para mim, pois eu estava trabalhando em uma sincronização remota de arquivos pela Internet, portanto o uso do rsync era obrigatório. A sugestão --temp-dir nesta resposta foi a solução para mim.
nickcrabtree