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 ditambah 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 dari tar -czf <output> <directory>
ke scp? Jika tidak, adakah solusi mudah lainnya? Mesin sumber saya kuno (SunOS) jadi saya lebih suka tidak menginstalnya.
ssh -C
atauCompression yes
di~/.ssh/config
).$ tar cz <files> | ssh user@host "cd /wherever; tar xvz"
Tar dengan kompresi bzip2 harus mengambil banyak beban dari jaringan dan pada cpu.
Tidak digunakan
-v
karena output layar mungkin memperlambat proses. Tetapi jika Anda ingin output verbose menggunakannya di sisi lokal tar (-jcvf
), bukan pada bagian remote.Jika Anda berulang kali menyalin di jalur tujuan yang sama, seperti memperbarui salinan cadangan, pilihan terbaik Anda adalah rsync dengan kompresi.
Perhatikan bahwa kedua src dan jalur dest diakhiri dengan a /. Sekali lagi, tidak menggunakan
-v
dan-P
menandai dengan sengaja, tambahkan mereka jika Anda membutuhkan output verbose.sumber
gunakan
rsync
, itu menggunakan SSH.Pemakaian:
Switch rsync peduli dengan informasi kompresi dan I-Node.
-P
menampilkan progres setiap file.Anda dapat menggunakan
scp -C
, yang memungkinkan kompresi, tetapi jika memungkinkan, gunakanrsync
.sumber
Anda dapat menjalankan
tar
kedua ujungnya menggunakan ssh.scp
adalah bagian darissh
keluarga kebaikan, jadi Anda mungkin memilikinya di kedua ujungnya.Mungkin ada cara untuk bekerja gzip atau bzip2 ke dalam pipa untuk mengurangi lalu lintas jaringan juga.
sumber
@ 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 memiliki dukungan multi-inti yang sudah ada Untuk menggunakan gzip dengan beberapa core pigz bisa digunakan.Berikut adalah contoh untuk mengirim data dengan bilah kemajuan, buffering, dan kompresi zstandard melalui jaringan:
Yang pertama
pv
adalah untuk menunjukkan kemajuan ( p ), perkiraan waktu ( e ), laju transfer ( r ), laju rata-rata ( a ), total byte yang ditransfer ( b ). Ukuran total diperkirakan dengandu
dan ditambahkan ke pilihan 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, mode panjang 31 (menggunakan jendela 2 GB, membutuhkan banyak RAM, tetapi sangat bagus misalnya untuk mengompres dump database) digunakan. The T0 pilihan menetapkan jumlah benang untuk jumlah core. 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, itu dapat dikompilasi dan diinstal dari https://github.com/facebook/zstd dengan adil
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] danB
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.
sumber
Jika Anda memiliki gzip di kedua ujungnya:
sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh user@destinationhost "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 user@destinationhost "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.
sumber
Atau Anda bisa melakukannya sebaliknya jika perlu. Yaitu menarik tarball melalui jaringan daripada mendorongnya 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:
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
sumber
Atau pasang sistem file jarak jauh melalui sshfs
sumber
Meskipun bukan yang paling elegan, terutama karena itu tidak menyalin satu file zip atau tar dan dua kali lipat sehingga tidak membantu mengurangi ovehead jaringan, satu-satunya pilihan saya adalah menggunakan
scp -r
:Saya mengalami masalah dengan kehabisan ruang disk dengan file tar zip 30 GB. Saya pikir gunzip dapat melakukannya secara inline, yaitu, menghapus yang asli karena sedang membuka ritsleting (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, akhirnya saya lakukan:
scp -r source_folder_name yourname@yourservername:destination_folder_name
Kemudian ambil bir, kopi atau popcorn dan tunggu. Untung saja, scp akan coba lagi jika koneksi jaringan "terhenti". Semoga saja tidak turun sepenuhnya.
sumber
scp
perintah. Tetapi pertanyaannya adalah tentang “overhead jaringan”. Apakah solusi Anda menggunakan jaringan kurang dari menyalin setiap file secara individual? Apakah solusi Anda lebih baik dari tujuh yang sudah diposting?