Przesyłanie dużych plików (8 GB) przez ssh


27

Próbowałem z SCP, ale napis „Negatywny rozmiar pliku”.

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

Próbowałem także przy użyciu SFTP, działało dobrze do momentu przesłania 2 GB pliku, a następnie przestało działać:

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

Masz pojęcie, co może być nie tak? Czy SCP i SFTP nie obsługują plików większych niż 2 GB? Jeśli tak, to jak mogę przesyłać większe pliki przez SSH?

Docelowym systemem plików jest ext4. Dystrybucja Linuksa to CentOS 6.5. System plików ma obecnie (dostępne) duże pliki (do 100 GB).


5
Wygląda jak zmienne przekroczenie wielkości. Ale AFAIK scp / sftp nie ma limitu rozmiaru. Co to jest docelowy system plików? Czy obsługuje LARGEFILES?
Milind Dumbare

1
Co z aplikacjami sftp i scp? Możesz to sprawdzić za pomocą polecenia file przeciwko ich plikom binarnym.
mdpc

1
@ shepherd - tak.
mdpc,

2
Aplikacje 32-bitowe mogą uzyskiwać dostęp do dużych plików, jeśli są one kompilowane -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64. Ale jeśli korzystasz z 64-bitowego systemu 6.5, prawdopodobnie łatwiej byłoby mieć administratorów zainstalowanych openssh-5.3p1-94.el6_6.1.x86_64i openssh-server-5.3p1-94.el6_6.1.x86_64ze standardowych repozytoriów.
Mark Plotnick

1
lol w oprogramowaniu używającym liczb całkowitych ze znakiem dla rozmiaru pliku
Lekkość wyścigów z Moniką

Odpowiedzi:


9

Pierwotny problem (oparty na przeczytaniu wszystkich komentarzy do pytania OP) polegał na tym, że scpplik wykonywalny w systemie 64-bitowym był aplikacją 32-bitową. 32-bitowa aplikacja, która nie została skompilowana z „obsługą dużych plików”, kończy się na ograniczeniu wskaźników wyszukiwania 2^32 =~ 4GB.

Możesz sprawdzić, czy scpjest 32-bitowy, używając filepolecenia:

file `which scp`

W większości nowoczesnych systemów będzie to wersja 64-bitowa, więc nie nastąpi obcięcie pliku:

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

32-aplikacja powinna nadal być w stanie obsługiwać „duże pliki”, ale musi być skompilowana ze źródła z obsługą dużych plików, co najwyraźniej nie było w tym przypadku.

Zalecanym rozwiązaniem może być użycie pełnej standardowej dystrybucji 64-bitowej, w której aplikacje są domyślnie kompilowane jako 64-bitowe.


33

Rsync bardzo dobrze nadaje się do przesyłania dużych plików przez ssh, ponieważ jest w stanie kontynuować przesyłanie, które zostały przerwane z jakiegoś powodu. Ponieważ wykorzystuje funkcje skrótu do wykrywania równych bloków plików, funkcja kontynuacji jest dość solidna.

Zaskakujące jest to, że twoje wersje sftp/ scpnie wydają się obsługiwać dużych plików - nawet w przypadku 32-bitowych plików binarnych obsługa LFS powinna być obecnie dość standardowa.


4
Biorąc pod uwagę, że duża część pliku jest już przesłana, rsyncjest to dobry pomysł. Skorzystaj z tej -Popcji, aby zarówno uzyskać wskazanie postępu, jak i poinstruować odbiorcę, aby zachował niekompletny plik na wypadek, gdyby przesyłanie zostało ponownie przerwane.
Simon Richter

25

Nie jestem pewien limitów rozmiaru plików SCP i SFTP, ale możesz spróbować obejść problem z podziałem:

split -b 1G matlab.iso

Spowoduje to utworzenie 1 plików GiB, które domyślnie są nazywane jako xaa, xab, xac, .... Następnie możesz użyć scp do przesłania plików:

scp xa* xxx@xxx:

Następnie w systemie zdalnym odtwórz oryginalny plik za pomocą cat:

cat xa* > matlab.iso

Oczywiście karami za to obejście są czas pracy operacji dzielenia i operacji cat, a także dodatkowe miejsce na dysku potrzebne w systemach lokalnych i zdalnych.


1
dobry pomysł. Plik został już przesłany za pomocą dysku USB, ale prawdopodobnie byłoby to wygodniejsze. Nie jest to jednak tak wygodne, jak poprawne działanie scp i sftp.
eimrek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.