it-swarm-tr.com

En iyi küçük dosyaları scp üzerinden nasıl kopyalayabilirim?

Birkaç gigabayt ve binlerce küçük dosya içeren bir dizinim var. Birden fazla scp ile ağ üzerinden kopyalamak istiyorum. Kaynak ve hedef makinelerde CPU süresi ucuzdur, ancak her dosyayı ayrı ayrı kopyalayarak eklenen ağ ek yükü çok büyüktür. Katran/gzip alıp gönderirim, ancak kaynak makine diskte kısa.

Benim için tar -czf <output> <directory> scp? Değilse, başka bir kolay çözüm var mı? Kaynak makinem eski (SunOS), bu yüzden üzerine bir şey yüklemeyi tercih etmem.

63
nmichaels

Katranı bir ssh oturumu boyunca iletebilirsiniz:

$ tar czf - <files> | ssh [email protected] "cd /wherever && tar xvzf -"
110
pdo

Bzip2 sıkıştırmalı tar, ağdan ve cpu'dan fazla yük almalıdır.

$ tar -C /path/to/src/dir -jcf - ./ | ssh [email protected] 'tar -C /path/to/dest/dir -jxf -'

Kullanmıyor -v çünkü ekran çıktısı işlemi yavaşlatabilir. Ancak ayrıntılı bir çıktı istiyorsanız, tar'ın yerel tarafında kullanın (-jcvf), uzak kısımda değil.

Yedek bir kopyayı güncellemek gibi aynı hedef yoldan tekrar tekrar kopyalarsanız, en iyi seçim sıkıştırma ile rsync'dir.

$ rsync -az -e ssh /path/to/src/dir/ [email protected]:/path/to/dest/dir/

Hem src hem de dest yollarının/ile biteceğine dikkat edin. Yine, -v ve -P amaca yönelik bayraklar, ayrıntılı çıktı gerekiyorsa onları ekleyin.

23
forcefsck

rsync kullanın, SSH kullanır.

Kullanımı:

rsync -aPz /source/path destination.server:remote/path

Rsync anahtarları sıkıştırma ve I-Düğüm bilgilerine önem verir. -P her dosyanın ilerlemesini görüntüler.

Kullanabilirsiniz scp -C, sıkıştırma sağlar, ancak mümkünse rsync kullanın.

16
polemon

Ssh kullanarak her iki uçta tar çalıştırabilirsiniz. scp, ssh iyilik ailesinin bir parçasıdır, bu yüzden muhtemelen her iki uçta da vardır.

 8:03AM 12 % tar cf - some_directory | ssh dest_Host "tar xf -"

Ağ trafiğini azaltmak için gzip veya bzip2'yi boru hattında çalışmanın bir yolu olabilir.

3
Bruce Ediger

@ pdo'nun cevabı iyidir, ancak bir tampon ve iyi bir sıkıştırma ile hızı artırabilir ve bir ilerleme çubuğu ekleyebilir.

Genellikle ağ bir darboğazdır ve hız zamanla değişir. Bu nedenle, veriyi ağ üzerinden göndermeden önce arabelleğe almanıza yardımcı olur. Bu, pv ile yapılabilir.

Ek olarak, genellikle uygun bir sıkıştırma algoritması ile hız arttırılabilir. Gzip (yukarıda kullanıldığı gibi) hızlı bir sıkıştırma algoritmasıdır, ancak genel olarak zstandard (zstd) (ve yüksek sıkıştırma oranları için LZMA/LZMA2 (xz) daha iyi sıkıştırır ve aynı zamanda daha hızlı olur Yeni xz ve zstd zaten yerleşik çok çekirdekli desteğe sahiptir. Birden çok çekirdekli gzip kullanmak için pigz kullanılabilir.

Bir ilerleme çubuğu, arabelleğe alma ve ağ üzerinde standart sıkıştırma ile veri göndermek için bir örnek:

tar cf - . | pv -perabs $(du -sk . | cut -f 1)K | zstd -14 --long=31 -T0 | pv -qCB 512M | ssh [email protected] "cd /wherever && pv -qCB 512M | zstd -cd -T0 --long=31 | tar xf -"

İlk pv ilerlemeyi ( p ), tahmini süreyi ( e ), aktarım hızı ( r ), ortalama oran ( a ), toplam aktarılan bayt ( b ). Toplam boyut du ile tahmin edilir ve boyut seçeneğine eklenir ( s ). İlerleme, sıkıştırma ve tamponlamadan önce ölçülür, bu nedenle çok doğru değil, yine de yararlıdır.

zstd sıkıştırma ayarıyla 14 kullanılır. Bu sayı ağa ve CPU hızına bağlı olarak azaltılabilir veya artırılabilir, böylece zstd ağ hızından biraz daha hızlıdır. Haswell 3.2 GHz CPU üzerinde dört çekirdekli 14 yaklaşık 120 MB/s hız verir. Örnekte, uzun mod 31 (2 GB'lık bir pencere kullanır, çok fazla RAM gerektirir, ancak çok iyi örneğin veritabanı dökümlerini sıkıştırmak için) kullanılır . T0 seçenekleri, iş parçacığı sayısını çekirdek sayısına ayarlar. Uzun mod ile birlikte bu ayarların çok fazla bellek kullandığının farkında olunmalıdır.

Zstd ile ilgili bir sorun, çoğu işletim sisteminin> 1.3.4 sürümü ile gönderilmemesidir. Bu sürüm uygun çok çekirdekli ve uzun destek için gereklidir. Mevcut değilse, https://github.com/facebook/zstd adresinden derlenebilir ve yalnızca make -j4 && Sudo make install. Zstd yerine xz veya pigz de kullanılabilir. xz yavaş ama çok iyi sıkıştırıyor (yavaş bağlantılarda iyi), pigz/gzip hızlı ama çok iyi sıkıştırmıyor. pv daha sonra tekrar kullanılır, ancak arabelleğe alma için (q sessiz için, C ekleme modu yok [her zaman tamponlama için gereklidir] ve B arabellek boyutu).

Örnekte, alıcı tarafında bir tampon da kullanılmaktadır. Bu genellikle gereksizdir (çünkü dekompresyon ve sabit disk yazma hızı çoğu zaman ağ hızından daha yüksektir), ancak genellikle de zarar vermez.

3
Fabian Heller

Her iki uçta gzip varsa: sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh [email protected] "cd destinationdir && gzip -c -d | tar xf -"

Kaynak makinede gzip yoksa, hedefte sıkıştırmayı kaldırdığınızdan emin olun: sourcehost$ cd sourcedir && tar cf - . | compress | ssh [email protected] "cd destdir && uncompress | tar xf -"

Bu, önce sıkıştırdıktan sonra gönderdikten sonra sıkıştırmadan daha hızlı olacaktır ve her iki tarafta da fazladan disk alanı gerektirmez. Sıkıştırma (z) bayrağını katran üzerine aldım, çünkü muhtemelen eski tarafta yok.

2
MattBianco

Ya da gerekirse başka bir şekilde yapabilirsiniz. Yani tarball'ı itin yerine ağ üzerinden çekin önerildi. Bu, sorunuzun yinelenen kısmını çözmez ve rsync bunun için en iyisidir, ancak muhtemelen yardımcı olacak katran anahtarları vardır.

Yani yerel makinede:

ssh remote 'tar zcf - /etc/resolv.conf' | tar zxf -

En iyisi önce doğru dizinde olmak ya da sonunda untaring komutunda -C anahtarını kullanmak zorundasınız.

Bunun gerekli olması durumunda bundan bahsediyoruz. Benim durumumda olduğu gibi benim yerel sunucum nat arkasında olduğu için, bu yüzden daha önce belirtilen şekilde yapmak için bazı futzing alırsınız.

HTH

2
DaveQB

Veya uzak dosya sistemini sshfs ile bağlayın

sshfs [email protected]:/path/on/remote /path/on/local
1
ivanivan

En zarif olmasa da, özellikle tek bir Zip veya tar dosyasını kopyalamadığı ve ağın genelini azaltmaya yardımcı olmadığı için iki katına çıktığı için tek seçeneğim scp -r Kullanmaktı:

-r

      Tüm dizinleri özyinelemeli olarak kopyalayın. scp ağaç geçişinde karşılaşılan sembolik bağlantıları takip ettiğine dikkat edin.
Kaynak: scp (1)

30GB sıkıştırılmış tar dosyasıyla disk alanınızın bitmesi ile ilgili sorunlar yaşıyordum. Gunzip'in bunu satır içinde yapabileceğini düşündüm, yani orijinali sıkıştırılmamış olarak çıkarmak (ve bir Google sonucunu kaçırmış olabilirim), ancak hiçbir şey bulamadım.

Son olarak, yeni bir TAR veya Zip dosyasının tar'ing veya zipping işleminin bitmesini bekleyen birden çok kez denemekten yoruldum çünkü sonunda yaptım:

  1. Orijinal sunucu/PC/dizüstü bilgisayardan, çok sayıda dosya/klasör içeren klasörünüze gidin.
  2. scp -r source_folder_nameyourname@yourservername:destination_folder_name

Sonra biraz bira, kahve veya patlamış mısır alıp bekleyin. İyi bir şey, ağ bağlantısı "durursa" scp yeniden dener. Umarım tamamen düşmez.

1
JGlass