web-dev-qa-db-ja.com

大きな(8 GB)ファイルをssh経由で転送する

SCPで試してみましたが、「負のファイルサイズ」と表示されています。

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

また、SFTPを使用してみましたが、2 GBのファイルが転送されるまで正常に機能し、その後停止しました。

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

何が間違っているのでしょうか? SCPおよびSFTPは2 GBより大きいファイルをサポートしませんか?もしそうなら、どうすればSSH経由でより大きなファイルを転送できますか?

宛先ファイルシステムはext4です。 LinuxディストリビューションはCentOS 6.5です。ファイルシステムには現在、(アクセス可能な)大きなファイル(最大100 GB)があります。

27
eimrek

(OPの質問に対するすべてのコメントの読み取りに基づく)元の問題は、64ビットシステムのscp実行可能ファイルが32ビットアプリケーションであるということでした。 "large-file support" でコンパイルされていない32ビットアプリケーションは、2^32 =~ 4GBに制限されたシークポインターで終了します。

scpコマンドを使用して、fileが32ビットかどうかを確認できます。

file `which scp`

最近のほとんどのシステムでは64ビットであるため、ファイルの切り捨ては発生しません。

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

32アプリケーションは引き続き「大きなファイル」をサポートできるはずですが、このケースでは明らかにそうではなかった、大きなファイルをサポートするソースからコンパイルする必要があります。

推奨される解決策は、アプリがデフォルトで64ビットとしてコンパイルされる完全な標準64ビットディストリビューションを使用することです。

10
arielf

Rsync は、何らかの理由で中断された転送を続行できるため、sshを介して大きなファイルを転送するのに非常に適しています。ハッシュ関数を使用して等しいファイルブロックを検出するため、継続機能は非常に堅牢です。

あなたのsftp/scpバージョンが大きなファイルをサポートしていないように見えるのはちょっと意外です-32ビットのバイナリでも LFSサポート は今日ではかなり標準的なはずです。

34
maxschlepzig

SCPとSFTPのファイルサイズの制限についてはわかりませんが、分割の問題を回避してみてください。

split -b 1G matlab.iso

これにより、1 GiBファイルが作成され、デフォルトではxaa, xab, xac, ...。次に、scpを使用してファイルを転送できます。

scp xa* xxx@xxx:

次に、リモートシステムで元のファイルをcatで再作成します。

cat xa* > matlab.iso

もちろん、この回避策のペナルティは、splitとcat操作にかかる時間、およびローカルシステムとリモートシステムに必要な追加のディスク容量です。

26
spinup