it-swarm-id.com

Bagaimana cara terbaik menyalin banyak file kecil di atas scp?

Saya memiliki direktori yang memiliki beberapa gigabytes dan beberapa ribu file kecil. Saya ingin menyalinnya melalui jaringan dengan scp lebih dari sekali. Waktu CPU pada mesin sumber dan tujuan murah, tetapi overhead jaringan ditambahkan dengan menyalin setiap file secara individual sangat besar. Saya akan tar/gzip dan kirimkan, tetapi mesin sumber pendek pada disk.

Apakah ada cara bagi saya untuk menyalurkan output tar -czf <output> <directory> ke scp? Jika tidak, adakah solusi mudah lainnya? Mesin sumber saya kuno (SunOS) jadi saya lebih suka tidak menginstalnya.

63
nmichaels

Anda dapat memasang tar di sesi ssh:

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

Tar dengan kompresi bzip2 harus mengambil banyak beban dari jaringan dan pada cpu.

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

Tidak menggunakan -v karena output layar mungkin memperlambat proses. Tetapi jika Anda ingin keluaran verbose gunakan di sisi lokal tar (-jcvf), bukan pada bagian jarak jauh.

Jika Anda berulang kali menyalin di jalur tujuan yang sama, seperti memperbarui salinan cadangan, pilihan terbaik Anda adalah rsync dengan kompresi.

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

Perhatikan bahwa kedua src dan jalur dest diakhiri dengan a /. Sekali lagi, tidak menggunakan -v dan -P menandai dengan sengaja, menambahkannya jika Anda membutuhkan output verbose.

23
forcefsck

gunakan rsync , ia menggunakan SSH.

Pemakaian:

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

Switch rsync peduli tentang informasi kompresi dan I-Node. -P menampilkan progres setiap file.

Kamu bisa menggunakan scp -C, yang memungkinkan kompresi, tetapi jika memungkinkan, gunakan rsync.

16
polemon

Anda dapat menjalankan tar di kedua ujungnya menggunakan ssh. scp adalah bagian dari ssh keluarga kebaikan, jadi Anda mungkin memilikinya di kedua ujungnya.

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

Mungkin ada cara untuk bekerja gzip atau bzip2 ke dalam pipa untuk mengurangi lalu lintas jaringan juga.

3
Bruce Ediger

@ pdo jawaban baik, tetapi orang dapat meningkatkan kecepatan dengan buffer dan kompresi yang baik dan menambahkan progress bar.

Seringkali jaringan menjadi penghambat dan kecepatan bervariasi dari waktu ke waktu. Oleh karena itu, ada baiknya Anda melakukan buffer data sebelum mengirimnya melalui jaringan. Ini bisa dilakukan dengan pv.

Selain itu, seseorang biasanya dapat meningkatkan kecepatan dengan algoritma kompresi yang tepat. Gzip (seperti yang digunakan di atas) adalah algoritma kompresi cepat, tetapi secara umum zstandard (zstd) (dan untuk rasio kompresi tinggi LZMA/LZMA2 (xz) akan memampatkan lebih baik dan lebih cepat pada waktu yang sama Xz dan zstd baru sudah memiliki dukungan multi-inti. Untuk menggunakan gzip dengan beberapa inti, pigz dapat digunakan.

Berikut adalah contoh untuk mengirim data dengan bilah kemajuan, buffering, dan kompresi zstandard melalui jaringan:

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 -"

pv pertama adalah untuk menunjukkan progres ( p ), perkiraan waktu ( e ), kecepatan transfer ( r ), laju rata-rata ( a ), total byte yang ditransfer ( b ). Ukuran total diperkirakan dengan du dan ditambahkan ke opsi ukuran ( s ). Kemajuan diukur sebelum kompresi dan buffering, karena itu tidak terlalu akurat, tetapi masih bermanfaat.

zstd digunakan dengan pengaturan kompresi 14 . Jumlah ini dapat dikurangi atau ditingkatkan tergantung pada jaringan dan kecepatan CPU sehingga zstd sedikit lebih cepat dari kecepatan jaringan. Dengan empat core pada Haswell 3.2 GHz CPU 14 memberikan kecepatan sekitar 120 MB/s. Dalam contoh ini, mode panjang 31 (menggunakan jendela 2 GB, membutuhkan banyak RAM, tetapi sangat baik misalnya untuk mengompres database dumps) digunakan . Opsi T0 mengatur jumlah utas ke jumlah inti. Orang harus menyadari bahwa bersama dengan mode lama pengaturan ini menggunakan banyak memori.

Masalah dengan zstd adalah sebagian besar sistem operasi tidak memberikan versi> = 1.3.4. Versi ini diperlukan untuk dukungan multi-inti dan panjang yang tepat. Jika tidak tersedia, dapat dikompilasi dan diinstal dari https://github.com/facebook/zstd hanya dengan make -j4 && Sudo make install. Alih-alih zstd, kita juga bisa menggunakan xz atau pigz. xz lambat tetapi kompres sangat baik (bagus untuk koneksi lambat), pigz/gzip cepat tapi kompres tidak begitu baik. pv kemudian digunakan lagi, tetapi untuk buffering (q untuk senyap, C untuk mode tanpa sambungan [selalu diperlukan untuk buffering] dan B untuk mengatur ukuran buffer).

Dalam contoh buffer juga digunakan di sisi penerima. Ini seringkali tidak perlu (karena dekompresi dan kecepatan penulisan hard disk paling tinggi daripada kecepatan jaringan), tetapi biasanya juga tidak membahayakan.

3
Fabian Heller

Jika Anda memiliki gzip di kedua ujungnya: sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh [email protected] "cd destinationdir && gzip -c -d | tar xf -"

Jika Anda tidak memiliki gzip di mesin sumber, pastikan Anda memiliki kompresi pada tujuan: sourcehost$ cd sourcedir && tar cf - . | compress | ssh [email protected] "cd destdir && uncompress | tar xf -"

Ini akan lebih cepat daripada zip pertama kali, kemudian mengirim, kemudian membuka ritsleting, dan tidak memerlukan ruang disk tambahan di kedua sisi. Saya mengibarkan bendera kompresi (z) pada tar, karena Anda mungkin tidak memilikinya di sisi kuno.

2
MattBianco

Atau Anda bisa melakukannya sebaliknya jika perlu. Yaitu menarik tarball melalui jaringan daripada Push seperti yang disarankan. Ini tidak menyelesaikan bagian berulang dari pertanyaan Anda dan rsync adalah yang terbaik untuk itu tetapi mungkin ada switch tar untuk membantu.

Jadi pada mesin lokal:

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

Yang terbaik adalah berada di direktori yang benar terlebih dahulu atau Anda harus menggunakan -C beralih pada perintah yang tidak peduli di akhir.

Hanya menyebutkan ini kalau-kalau ini diperlukan. Bagi saya seperti dalam situasi saya server lokal saya ada di belakang nat, jadi akan mengambil beberapa jaringan untuk dapat melakukannya dengan cara yang sebelumnya telah disebutkan.

HTH

2
DaveQB

Atau pasang sistem file jarak jauh melalui sshfs

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

Meskipun bukan yang paling elegan, terutama karena itu tidak menyalin satu file Zip atau tar dan dua kali lipat karena itu tidak membantu mengurangi ovehead jaringan, satu-satunya pilihan saya adalah menggunakan scp -r:

-r

      Salin seluruh direktori secara rekursif. Perhatikan bahwa scp mengikuti tautan simbolis yang ditemui di traversal pohon.
Sumber: scp (1)

Saya mengalami masalah dengan kehabisan ruang disk dengan file tar zip 30GB. Saya pikir gunzip dapat melakukannya secara inline, mis., Menghapus yang asli karena tidak di-zip (dan saya mungkin melewatkan hasil Google) tetapi saya tidak dapat menemukan apa pun.

Akhirnya, karena saya bosan mencoba beberapa kali menunggu file TAR atau Zip baru selesai tar'ing atau zip saya akhirnya hanya melakukannya:

  1. Dari server/PC/laptop asli, navigasikan ke direktori tempat folder Anda dengan banyak file/folder berada.
  2. scp -r source_folder_nameyourname@yourservername:destination_folder_name

Kemudian ambil bir, kopi atau popcorn dan tunggu. Untung saja, scp akan coba lagi jika koneksi jaringan "terhenti". Semoga itu tidak benar-benar turun.

1
JGlass