it-swarm-vi.com

Làm cách nào tôi có thể sao chép tốt nhất số lượng lớn tệp nhỏ qua scp?

Tôi có một thư mục có vài gigabyte và vài nghìn tệp nhỏ. Tôi muốn sao chép nó qua mạng với scp nhiều lần. Thời gian CPU trên các máy nguồn và đích là rẻ, nhưng chi phí mạng được thêm bằng cách sao chép từng tệp riêng lẻ là rất lớn. Tôi sẽ tar/gzip nó lên và gửi nó, nhưng máy nguồn bị thiếu trên đĩa.

Có cách nào để tôi dẫn đầu ra của tar -czf <output> <directory> để scp? Nếu không, có một giải pháp dễ dàng khác? Máy nguồn của tôi là cổ (SunOS) vì vậy tôi không muốn cài đặt mọi thứ trên đó.

63
nmichaels

Bạn có thể dẫn tar qua một phiên ssh:

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

Tar với nén bzip2 sẽ tải càng nhiều mạng và trên cpu.

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

Không sử dụng -v vì đầu ra màn hình có thể làm chậm quá trình. Nhưng nếu bạn muốn một đầu ra dài dòng, hãy sử dụng nó ở phía cục bộ của tar (-jcvf), không phải trên phần từ xa.

Nếu bạn liên tục sao chép trên cùng một đường dẫn đích, như cập nhật một bản sao lưu, lựa chọn tốt nhất của bạn là rsync với nén.

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

Lưu ý rằng cả hai đường dẫn src và Dest đều kết thúc bằng a /. Một lần nữa, không sử dụng -v-P cờ trên mục đích, thêm chúng nếu bạn cần đầu ra dài dòng.

23
forcefsck

sử dụng rsync , nó sử dụng SSH.

Sử dụng:

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

Các công tắc rsync quan tâm đến thông tin nén và I-Node. -P hiển thị tiến trình của mọi tập tin.

Bạn có thể dùng scp -C, cho phép nén, nhưng nếu có thể, hãy sử dụng rsync.

16
polemon

Bạn có thể chạy tar trên cả hai đầu bằng ssh. scp là một phần của gia đình ssh, vì vậy bạn có thể có nó ở cả hai đầu.

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

Có thể có một cách để làm việc gzip hoặc bzip2 vào đường ống để giảm lưu lượng mạng.

3
Bruce Ediger

Câu trả lời của @ pdo là tốt, nhưng người ta có thể tăng tốc độ với bộ đệm và nén tốt và thêm thanh tiến trình.

Thông thường mạng là nút cổ chai và tốc độ thay đổi theo thời gian. Do đó, nó giúp đệm dữ liệu trước khi gửi chúng qua mạng. Điều này có thể được thực hiện với pv.

Ngoài ra, người ta thường có thể tăng tốc độ bằng thuật toán nén phù hợp. Gzip (như được sử dụng ở trên) là một thuật toán nén nhanh, nhưng nói chung zst Chuẩn (zstd) (và đối với tỷ lệ nén cao LZMA/LZMA2 (xz) sẽ nén tốt hơn và nhanh hơn cùng thời gian Xz và zstd mới có hỗ trợ đa lõi đã được tích hợp sẵn. Để sử dụng gzip với nhiều lõi pigz có thể được sử dụng.

Dưới đây là một ví dụ để gửi dữ liệu với thanh tiến trình, bộ đệm và nén theo tiêu chuẩn z qua mạng:

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 đầu tiên là hiển thị tiến trình ( p ), thời gian ước tính ( e ), tốc độ truyền ( r ), tốc độ trung bình ( a ), tổng số byte được chuyển ( b ). Tổng kích thước được ước tính bằng du và được thêm vào tùy chọn kích thước ( s ). Tiến trình được đo trước khi nén và đệm, do đó nó không chính xác lắm, nhưng vẫn hữu ích.

zstd được sử dụng với cài đặt nén 14 . Con số này có thể giảm hoặc tăng tùy thuộc vào mạng và tốc độ CPU, vì vậy zstd nhanh hơn một chút so với tốc độ mạng. Với bốn lõi trên CPU Haswell 3,2 GHz 14 cho tốc độ khoảng 120 MB/s. Trong ví dụ này, chế độ dài 31 (sử dụng cửa sổ 2 GB, cần rất nhiều RAM, nhưng rất tốt, ví dụ như để nén các cơ sở dữ liệu) được sử dụng . Các tùy chọn T0 đặt số lượng luồng cho số lượng lõi. Mọi người nên biết rằng cùng với chế độ dài, các cài đặt này sử dụng rất nhiều bộ nhớ.

Một vấn đề với zstd là hầu hết các hệ điều hành không xuất xưởng với phiên bản> = 1.3.4. Phiên bản này là cần thiết cho đa lõi thích hợp và hỗ trợ lâu dài. Nếu không có sẵn, nó có thể được biên dịch và cài đặt từ https://github.com/facebook/zstd chỉ với make -j4 && Sudo make install. Thay vì zstd, người ta cũng có thể sử dụng xz hoặc pigz. xz chậm nhưng nén rất tốt (tốt trên các kết nối chậm), pigz/gzip nhanh nhưng nén không tốt lắm. pv sau đó được sử dụng lại, nhưng để đệm (q cho yên lặng, C cho chế độ không ghép nối [luôn luôn cần thiết cho bộ đệm] và B để đặt kích thước bộ đệm).

Trong ví dụ, một bộ đệm cũng được sử dụng ở phía bên nhận. Điều này thường không cần thiết (vì giải nén và tốc độ ghi đĩa cứng cao nhất thời gian so với tốc độ mạng), nhưng thường cũng không gây hại.

3
Fabian Heller

Nếu bạn có gzip ở cả hai đầu: sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh [email protected] "cd destinationdir && gzip -c -d | tar xf -"

Nếu bạn không có gzip trên máy nguồn, hãy đảm bảo rằng bạn đã giải nén ở đích: sourcehost$ cd sourcedir && tar cf - . | compress | ssh [email protected] "cd destdir && uncompress | tar xf -"

Điều này sẽ nhanh hơn so với lần đầu tiên nén nó, sau đó gửi, sau đó giải nén và không yêu cầu thêm không gian đĩa ở hai bên. Tôi đã gắn cờ nén (z) trên tar, vì có lẽ bạn không có nó ở phía cổ.

2
MattBianco

Hoặc bạn có thể làm theo cách khác nếu bạn cần. Đó là kéo tarball qua mạng thay vì Đẩy nó như đã được đề xuất. Điều này không giải quyết được phần lặp lại của câu hỏi của bạn và rsync là tốt nhất cho điều đó nhưng có lẽ có các công tắc tar để trợ giúp.

Vì vậy, trên máy cục bộ:

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

Tốt nhất là ở trong thư mục bên phải trước hoặc bạn phải sử dụng công tắc -C trên lệnh chưa xử lý ở cuối.

Chỉ cần đề cập đến điều này trong trường hợp này là cần thiết. Đó là đối với tôi vì trong tình huống của tôi, máy chủ cục bộ của tôi đứng sau nat, vì vậy sẽ mất một số mạng để có thể làm điều đó theo cách mà trước đây đã được đề cập.

HTH

2
DaveQB

Hoặc gắn kết hệ thống tập tin từ xa thông qua sshfs

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

Mặc dù không thanh lịch nhất, đặc biệt là vì nó không sao chép một tệp Zip hoặc tar duy nhất và đôi khi vì vậy nó không giúp giảm bớt tình trạng mạng, lựa chọn duy nhất của tôi là sử dụng scp -r:

-r

      Đệ quy sao chép toàn bộ thư mục. Lưu ý rằng scpfollows liên kết tượng trưng gặp phải trong giao dịch cây.
Nguồn: scp (1)

Tôi đã gặp vấn đề với việc hết dung lượng đĩa với tệp tar được nén 30 GB. Tôi nghĩ gunzip có thể thực hiện nội tuyến, tức là, loại bỏ bản gốc vì nó đã được giải nén (và tôi có thể đã bỏ lỡ một kết quả của Google) nhưng tôi không thể tìm thấy bất cứ điều gì.

Cuối cùng, vì tôi đã mệt mỏi vì đã cố gắng nhiều lần chờ đợi một tệp TAR hoặc Zip mới được hoàn thành tar'ing hoặc nén, cuối cùng tôi cũng đã làm:

  1. Từ máy chủ/PC/máy tính xách tay ban đầu, điều hướng đến thư mục chứa thư mục của bạn với nhiều tệp/thư mục.
  2. scp -r source_folder_nameyourname@yourservername:destination_folder_name

Sau đó chỉ cần lấy một ít bia, cà phê hoặc bỏng ngô và chờ đợi. Điều tốt là, scp sẽ thử lại nếu kết nối mạng "gian hàng". Chỉ hy vọng nó không đi xuống hoàn toàn.

1
JGlass