Mam katalog, który ma kilka gigabajtów i kilka tysięcy małych plików. Chcę skopiować go przez sieć z SCP więcej niż raz. Czas procesora na komputerach źródłowych i docelowych jest tani, ale obciążenie sieci związane z kopiowaniem każdego pliku osobno jest ogromne. Zrobiłbym to tar / gzip i wysłałem, ale na komputerze źródłowym brakuje dysku.
Czy jest dla mnie sposób na przesyłanie danych wyjściowych tar -czf <output> <directory>
do scp? Jeśli nie, czy istnieje inne łatwe rozwiązanie? Moja maszyna źródłowa jest starożytna (SunOS), więc wolałbym nie instalować na niej różnych rzeczy.
ssh -C
lubCompression yes
w~/.ssh/config
).$ tar cz <files> | ssh user@host "cd /wherever; tar xvz"
Tar z kompresją bzip2 powinien pobrać tyle samo obciążenia z sieci i na procesor.
Nie używa,
-v
ponieważ wyświetlanie ekranu może spowolnić proces. Ale jeśli chcesz uzyskać pełne wyjście, użyj go po lokalnej stronie tar (-jcvf
), a nie na zdalnej części.Jeśli wielokrotnie kopiujesz tę samą ścieżkę docelową, na przykład aktualizując kopię zapasową, najlepszym wyborem jest rsync z kompresją.
Zauważ, że ścieżki src i dest kończą się znakiem /. Ponownie, nie używając
-v
i-P
flagi celowo, dodaj je, jeśli potrzebujesz pełnych danych wyjściowych.źródło
użyj
rsync
, używa SSH.Stosowanie:
Przełączniki rsync dbają o kompresję i informacje o I-Node.
-P
wyświetla postęp każdego pliku.Możesz użyć
scp -C
, który umożliwia kompresję, ale jeśli to możliwe, użyjrsync
.źródło
Możesz uruchomić
tar
na obu końcach za pomocą ssh.scp
jest częściąssh
rodziny dobroci, więc prawdopodobnie masz ją po obu stronach.Może istnieć sposób pracy z gzip lub bzip2 w potoku, aby również zmniejszyć ruch w sieci.
źródło
Odpowiedź @ pdo jest dobra, ale można zwiększyć prędkość za pomocą bufora i dobrej kompresji oraz dodać pasek postępu.
Często sieć stanowi wąskie gardło, a prędkość zmienia się w czasie. Dlatego pomaga buforować dane przed wysłaniem ich przez sieć. Można to zrobić za pomocą
pv
.Ponadto zwykle można zwiększyć prędkość za pomocą odpowiedniego algorytmu kompresji. Gzip (jak używany powyżej) jest algorytmem szybkiej kompresji, ale generalnie zstandard (
zstd
) (i dla wysokich współczynników kompresji LZMA / LZMA2 (xz
) będzie kompresował się lepiej i był szybszy w tym samym czasie. Nowe Xz i Zstd mają już wbudowaną obsługę wielu rdzeni Aby użyć gzip z wieloma rdzeniami, można użyć Pigza.Oto przykład wysyłania danych z paskiem postępu, buforowaniem i standardową kompresją przez sieć:
Pierwszym
pv
jest pokazanie postępu ( p ), szacowanego czasu ( e ), szybkości transferu ( r ), średniej prędkości ( a ), całkowitej liczby przesłanych bajtów ( b ). Całkowita wielkość szacuje siędu
i dodaje do wyboru (rozmiar s ). Postęp jest mierzony przed kompresją i buforowaniem, dlatego nie jest zbyt dokładny, ale nadal jest pomocny.zstd
jest używany z ustawieniem kompresji 14 . Liczba ta może zostać zmniejszona lub zwiększona w zależności od prędkości sieci i procesora, więc zstd jest nieco szybszy niż prędkość sieci. Z czterema rdzeniami procesora Haswell 3.2 GHz 14 daje prędkość około 120 MB / s. W tym przykładzie użyto trybu długiego 31 (używa okna 2 GB, wymaga dużo pamięci RAM, ale bardzo dobrze np. Do kompresji zrzutów bazy danych). W T0 Opcje ustawia ilość wątków z liczbą rdzeni. Należy pamiętać, że wraz z długim trybem ustawienia te zajmują dużo pamięci.Problem z ZSTD polega na tym, że większość systemów operacyjnych nie jest dostarczana z wersją> = 1.3.4. Ta wersja jest niezbędna do prawidłowego obsługi wielu rdzeni i długiego wsparcia. Jeśli nie jest dostępny, można go skompilować i zainstalować z https://github.com/facebook/zstd za pomocą just
make -j4 && sudo make install
. Zamiast ZSTD można również użyć XZ lub Pigz. xz jest wolny, ale bardzo dobrze kompresuje (dobry przy wolnych połączeniach), pigz / gzip jest szybki, ale nie tak dobrze.pv
jest następnie używane ponownie, ale do buforowania (q
dla cichej,C
dla trybu bez łączenia [zawsze potrzebne do buforowania] iB
do ustawienia wielkości bufora).W tym przykładzie bufor jest również używany po stronie odbiornika. Jest to często niepotrzebne (ponieważ szybkość dekompresji i zapisu na dysku twardym jest w większości przypadków wyższa niż prędkość sieci), ale zwykle też nie szkodzi.
źródło
Jeśli masz gzip na obu końcach:
sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh user@destinationhost "cd destinationdir && gzip -c -d | tar xf -"
Jeśli nie masz gzip na maszynie źródłowej, upewnij się, że rozpakowałeś w miejscu docelowym:
sourcehost$ cd sourcedir && tar cf - . | compress | ssh user@destinationhost "cd destdir && uncompress | tar xf -"
Byłoby to szybsze niż najpierw skompresowanie go, a następnie wysłanie, a następnie rozpakowanie, i nie wymaga dodatkowego miejsca na dysku po obu stronach. Wytarłem flagę kompresji (z) na tar, ponieważ prawdopodobnie nie masz jej po starożytnej stronie.
źródło
Lub możesz to zrobić na odwrót, jeśli potrzebujesz. To jest ściąganie tarballa przez sieć zamiast przepychania go, jak sugerowano. To nie rozwiązuje powtarzającej się części twojego pytania i rsync jest do tego najlepszy, ale prawdopodobnie są do tego przełączniki tar.
Na komputerze lokalnym:
Najlepiej jest najpierw znaleźć się w odpowiednim katalogu, w przeciwnym razie musisz użyć przełącznika -C na poleceniu odznaczania na końcu.
Wystarczy wspomnieć o tym w razie potrzeby. Jest to dla mnie, ponieważ w mojej sytuacji mój lokalny serwer jest za nat, więc zajęłoby to trochę sieci, aby móc to zrobić tak, jak wcześniej wspomniano.
HTH
źródło
Lub zamontuj zdalny system plików za pomocą sshfs
źródło
Chociaż nie jest to najbardziej eleganckie, zwłaszcza, że nie kopiuje pojedynczego pliku zip lub tar i podwójnie, ponieważ nie pomaga zmniejszyć przepełnienia sieci, moim jedynym wyborem było użycie
scp -r
:Wystąpiły problemy z brakiem miejsca na dysku w pliku tar o rozmiarze 30 GB. Myślałem, że gunzip mógłby to zrobić inline, tj. Usuwając oryginał, ponieważ był rozpakowywany (i mogłem przegapić wynik Google), ale nic nie mogłem znaleźć.
Wreszcie, ponieważ miałem dość wielokrotnego czekania na nowy plik TAR lub ZIP, aby zakończyć tarowanie lub kompresowanie, w końcu właśnie to zrobiłem:
scp -r source_folder_name yourname@yourservername:destination_folder_name
Następnie weź piwo, kawę lub popcorn i poczekaj. Dobrą rzeczą jest to, że scp spróbuje ponownie, jeśli połączenie sieciowe „utknie”. Mam tylko nadzieję, że nie spadnie całkowicie.
źródło
scp
poleceń. Ale pytanie dotyczy „obciążenia sieci”. Czy Twoje rozwiązanie korzysta z sieci mniej niż kopiowanie każdego pliku osobno? Czy twoje rozwiązanie jest lepsze w jakikolwiek sposób od siedmiu, które już zostały opublikowane?