Transferindo arquivos grandes (8 GB) por ssh

27

Eu tentei com o SCP, mas diz "Tamanho do arquivo negativo".

>scp matlab.iso xxx@xxx:/matlab.iso
matlab.iso: Negative file size

Também tentei usar o SFTP, funcionou bem até que 2 GB do arquivo foram transferidos e parou:

sftp> put matlab.iso
Uploading matlab.iso to /home/x/matlab.iso
matlab.iso                                           -298% 2021MB -16651.-8KB/s   00:5d
o_upload: offset < 0

Alguma ideia do que pode estar errado? O SCP e o SFTP não suportam arquivos maiores que 2 GB? Se sim, como posso transferir arquivos maiores por SSH?

O sistema de arquivos de destino é ext4. A distribuição Linux é o CentOS 6.5. O sistema de arquivos atualmente possui arquivos grandes (acessíveis) nele (até 100 GB).

eimrek
fonte
5
Parece uma saturação variável de tamanho. Mas o AFAIK scp / sftp não tem limite de tamanho. Qual é o sistema de arquivos de destino? Suporta LARGEFILES?
Milind Dumbare
1
E os aplicativos sftp e scp? Você pode descobrir isso usando o comando file nos binários.
Mdpc
1
@ pastor - sim.
Mdpc
2
Aplicativos de 32 bits podem acessar arquivos grandes se forem compilados -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64. Mas se você estiver executando um sistema 6.5 de 64 bits, provavelmente será mais fácil instalar os administradores openssh-5.3p1-94.el6_6.1.x86_64e a openssh-server-5.3p1-94.el6_6.1.x86_64partir dos repositórios padrão.
Mark Plotnick
1
lol em software usando assinado inteiros para o tamanho do arquivo
raças Leveza com Monica

Respostas:

9

O problema original (baseado na leitura de todos os comentários da pergunta OP) era que o scpexecutável no sistema de 64 bits era um aplicativo de 32 bits. Um aplicativo de 32 bits que não é compilado com "suporte a arquivos grandes" acaba com indicadores de busca limitados a 2^32 =~ 4GB.

Você pode dizer se scpé de 32 bits usando o filecomando:

file `which scp`

Na maioria dos sistemas modernos, ele será de 64 bits, portanto, nenhum truncamento de arquivo ocorrerá:

$ file `which scp`
/usr/bin/scp: ELF 64-bit LSB  shared object, x86-64 ...

Um aplicativo de 32 ainda deve ser capaz de suportar "arquivos grandes", mas precisa ser compilado da fonte com suporte a arquivos grandes, o que aparentemente esse caso não era.

A solução recomendada talvez seja usar uma distribuição padrão de 64 bits completa, na qual os aplicativos são compilados como 64 bits por padrão.

arielf
fonte
33

O Rsync é muito adequado para transferir arquivos grandes por ssh, pois é capaz de continuar as transferências interrompidas por algum motivo. Como ele usa funções hash para detectar blocos iguais de arquivos, o recurso de continuar é bastante robusto.

É surpreendente que suas versões sftp/ scpnão pareçam suportar arquivos grandes - mesmo com binários de 32 bits, o suporte a LFS deve ser bastante padrão hoje em dia.

maxschlepzig
fonte
4
Como uma grande parte do arquivo já foi transferida, rsyncé uma boa ideia agora. Use a -Popção para obter indicação de progresso e instruir o receptor a manter um arquivo incompleto, caso a transferência seja interrompida novamente.
Simon Richter
25

Não tenho certeza sobre os limites de tamanho de arquivo do SCP e SFTP, mas você pode tentar solucionar o problema com a divisão:

split -b 1G matlab.iso

Isso criará 1 arquivo GiB que, por padrão, são nomeados como xaa, xab, xac, .... Você pode usar o scp para transferir os arquivos:

scp xa* xxx@xxx:

Em seguida, no sistema remoto, recrie o arquivo original com cat:

cat xa* > matlab.iso

Obviamente, as penalidades para essa solução alternativa são o tempo gasto nas operações de divisão e de gato, bem como o espaço em disco extra necessário nos sistemas local e remoto.

spinup
fonte
1
boa ideia. Eu já transferi o arquivo com uma unidade USB, mas isso provavelmente teria sido mais conveniente. Porém, não é tão conveniente quanto fazer com que scp e sftp funcionem corretamente.
eimrek