Về blog

Rsync vs scp: Nên dùng lệnh copy Linux nào

8 tháng 9, 2026

Dùng rsync cho bất cứ việc gì lớn hơn một lần copy nhanh qua đường, và scp khi bạn chỉ cần một tệp nằm trên máy khác ngay lúc này. Khác biệt cốt lõi: scp stream lại toàn bộ tệp mỗi lần và không có ký ức về kết nối bị đứt, còn rsync so sánh nguồn với đích, chỉ truyền những block đã thay đổi, và nối lại bản copy bị dừng đúng chỗ nó dừng. Với một backup lớn trên đường truyền chập chờn, đó là khoảng cách giữa hai phút và làm lại từ đầu. Cả hai đi kèm OpenSSH trên hầu như mọi bản phân phối Linux, nên đây là chuyện thói quen, không phải chuyện cài đặt — và thói quen nên mặc định là rsync. Bên dưới: bảng so sánh thẳng thắn, chênh lệch tốc độ thật, thủ thuật resume mà scp không làm nổi, và những trường hợp scp vẫn là câu trả lời đúng.

rsync và scp khác nhau ở đâu?

scp chỉ làm một việc: mở kênh SSH, stream các byte, đóng. Nó không giữ state giữa các lần chạy, nên nếu transfer chết ở 90% bạn bắt đầu lại từ số 0.

rsync là công cụ đồng bộ hoá mà tình cờ dùng SSH làm phương tiện vận chuyển. Trước khi gửi, nó dựng danh sách checksum của tệp đích (thuật toán delta rolling-checksum) và chỉ truyền những block khác nhau. Chạy cùng một lệnh hai lần, lần hai gần như không di chuyển gì. Điều đó cũng khiến rsync thành công cụ tự nhiên để giữ hai thư mục đồng bộ — đặt lịch cho nó và mỗi lần chạy chỉ copy đúng phần delta.

Hệ quả thực tế:

  • Bị ngắt: rsync nối lại; scp chạy lại tệp từ đầu.
  • Lần copy thứ hai: rsync chỉ gửi phần thay đổi; scp gửi lại tất cả.
  • Việc xoá: rsync mirror được cả việc xoá bằng --delete; scp thì không.
  • Lọc: rsync có pattern --exclude; scp copy mọi thứ bạn chỉ vào.
  • Dry run: rsync cho thấy nó sẽ làm gì bằng --dry-run; scp không có gì.

rsync có nhanh hơn scp không?

Với lần copy đầu tiên của một tệp lớn trên đường truyền nhanh, hai bên gần ngang nhau — cả hai đều bão hoà SSH, và bước checksum chỉ thêm một chút overhead. Khoảng cách mở ra ở ba chỗ:

  1. Tệp nhỏ với số lượng lớn. rsync pipeline các lần duyệt thư mục và có thể dùng lại một kết nối; các setup scp cũ sinh công việc riêng cho từng tệp. Hàng nghìn tệp nhỏ (một node_modules, một bản cài WordPress) hoàn thành nhanh hơn hẳn với rsync.
  2. Chạy lại. Copy một tệp 4 GB mà 50 MB thay đổi thì rsync di chuyển cỡ 50 MB; scp di chuyển lại 4 GB.
  3. Nén. -z nén trên đường truyền, hữu ích trên link WAN chậm.

Bạn có thể tự đo cả hai — lệnh có hình dạng y hệt nhau:

# cùng một tệp, cùng một server, đều qua SSH
time scp bigfile.tar.gz user@server:/tmp/
time rsync -avh --progress bigfile.tar.gz user@server:/tmp/

# chạy lại cả hai: scp copy lại từ đầu, rsync xác minh và gửi ~không gì
time scp bigfile.tar.gz user@server:/tmp/
time rsync -avh --progress bigfile.tar.gz user@server:/tmp/

Nếu cả ngày của bạn xoay quanh server, tốc độ transfer là thứ đáng đo một lần — giống cách ss thắng netstat trên máy bận rộn (xem ss vs netstat: nên dùng lệnh port Linux nào).

scp có resume được transfer bị ngắt không?

Không. scp không có resume; nếu kết nối đứt ở 900 MB của 1 GB, bạn bắt đầu lại. Đây là lý do được trích nhiều nhất trong mọi cuộc tranh luận rsync-vs-scp, và nó có thật.

Toàn bộ thiết kế của rsync mặc định transfer sẽ thỉnh thoảng bị ngắt. Công thức resume kinh điển:

rsync -avh --partial --append-verify --progress bigfile.tar.gz user@server:/srv/backup/
  • --partial giữ lại tệp viết dở thay vì xoá nó.
  • --append-verify nối tiếp bằng cách append, rồi checksum-verify vùng vừa nối — an toàn trước tệp partial hỏng, khác với --append thuần ngày xưa.
  • --progress cho bạn thấy nó nối lại từ đâu.

Bọc trong một vòng retry, đây là backup cài-xong-quên ngay cả trên kết nối thù địch:

until rsync -avh --partial --append-verify --progress 
    ./bigfile.tar.gz user@server:/srv/backup/; do
  sleep 5
done

Khi nào nên dùng scp thay vì rsync?

scp vẫn là công cụ đúng trong một số ít trường hợp:

  • Một tệp nhỏ, một lần.scp app.conf user@host:/etc/myapp/ ngắn hơn bất kỳ câu rsync nào, và cũng chẳng có gì để resume.
  • Đầu bên kia không có rsync. rsync cần binary của nó ở cả hai đầu. Nhiều container tối giản và appliance đi kèm SFTP server của scp nhưng không có rsync.
  • Bạn không muốn lộ một rsync server ra ngoài. Hiếm, nhưng vài môi trường khóa riêng rsync daemon.

Một chi tiết đáng biết: dự án OpenSSH đã loại bỏ protocol gốc của scp từ nhiều năm trước, và scp hiện đại thực chất nói SFTP bên dưới. Điều đó sửa một lỗi khó chịu về path-escaping, nhưng không thay đổi gì hai giới hạn quan trọng ở đây — không resume, không delta transfer. Đổi protocol không biến scp thành rsync.

Liên quan luôn: nếu câu hỏi của bạn thật ra là “rsync vs cp”, câu trả lời phản chiếu bài này — cp là phiên bản scp chỉ chạy local (không resume, không delta, không attributes trừ khi thêm cờ), còn rsync dùng được cả local lẫn remote. Với các thao tác local một lần, cp là đủ.

Những cờ rsync nào quan trọng nhất?

Đa số mọi người chỉ cần đúng một dòng:

rsync -avh --partial --progress src/ user@server:/srv/dest/
CờTác dụng
-a (archive)Đệ quy + giữ permissions, times, group, symlinks, devices
-v (verbose)Liệt kê những gì nó truyền
-h (human)Kích thước dễ đọc cho người
--partialGiữ tệp truyền dở, để lần chạy sau nối tiếp
--progressTiến độ từng tệp — thứ scp chưa bao giờ có
-zNén trên đường truyền (CPU chậm trên LAN nhanh: bỏ qua)
--deleteMirror cả việc xoá — nguy hiểm, luôn đi kèm dry run
--dry-run (-n)Cho thấy điều sẽ xảy ra, không đổi gì

Hai thói quen đáng áp dụng. Thứ nhất, dry-run mọi lệnh có --delete:

rsync -avh --delete --dry-run src/ user@server:/srv/dest/   # xem trước
rsync -avh --delete src/ user@server:/srv/dest/             # rồi mới chạy thật

Thứ hai, để ý dấu gạch chéo cuối — /srv/src copy chính thư mục đó vào đích, còn /srv/src/ copy nội dung của nó. Cái này làm vấp mỗi người đúng một lần; rsync thậm chí còn cảnh báo “no bytes transferred” khi bạn ý là dạng kia.

Với sync hằng ngày hoặc hằng tuần, thả rsync vào một systemd timer và để nó chỉ copy phần delta — khía cạnh journalctl của việc đặt lịch có trong bản cheat sheet journalctl.

Rsync vs scp: phán quyết

scprsync
Có sẵn cùng OpenSSHCó (cần cả hai đầu)
Resume transfer bị ngắtKhôngCó (--partial)
Delta transfer khi chạy lạiKhông
Giữ permissions/symlinksMột phầnToàn bộ (-a)
Pattern excludeKhông--exclude
Dry runKhông--dry-run
Mirror việc xoáKhông--delete
Phù hợp nhấtCopy nhanh một lầnBackup, sync, cây thư mục lớn

Mặc định chọn rsync cho backup, cây thư mục lớn, bất cứ gì đi qua link có thể đứt, và bất cứ gì bạn sẽ chạy nhiều hơn một lần. Dùng scp khi câu lệnh ngắn hơn cả suy nghĩ. Nếu chỉ mang đi một cờ, hãy lấy --partial — nó biến mọi kết nối đứt trong tương lai từ một lần chạy lại thành một lần tạm dừng.

— mrsaynothing

— mrsaynothing

Ghi chú thực địa về AI, Linux và self-hosting.

Thảo luận bài này trên dev.to dev.to ↗

Nhận how-to tiếp theo qua email

Một email mỗi bài viết. Sửa xong rồi đi tiếp.

self-hosted · không bên thứ ba · hủy đăng ký một cú bấm

cái này là gì?

Cách chạy mô hình GGUF cục bộ: Ollama, llama.cpp & vLLM

Thích kiểu viết này? Tôi build như vậy để kiếm sống. thuê tôi