rsync یک ابزار سریع برای کپی و همگامسازی فایل است. طبق manpage رسمی اوبونتو، میتواند محلی کار کند، از راه remote shell (معمولاً ssh) بفرستد یا بگیرد، یا به دیمون rsync وصل شود. الگوریتم دلتا فقط تفاوت بین مبدأ و مقصد را روی شبکه میفرستد؛ برای همین برای بکاپ و mirroring رایج است.
آموزش rsync در لینوکس؛ بکاپ محلی، ریموت SSH و همگامسازی فایل
پیشنیازها را جدی بگیرید: rsync باید هم روی مبدأ و هم روی مقصد نصب باشد؛ برای کپی ریموت، ورود ssh بدون دردسر (ترجیحاً کلید، نه رمز هر بار)؛ و فضای کافی روی دیسک مقصد. اول روی دو پوشهٔ محلی یا یک سرور LAN تست کنید، بعد سراغ اینترنت یا --delete بروید. مرجع این آموزش، صفحهٔ man اوبونتو noble برای rsync(1) است.
نصب و اولین کپی محلی
- روی اوبونتو/دبیان در مبدأ و مقصد: sudo apt update && sudo apt install rsync را اجرا کنید و با rsync --version نصب را تأیید کنید.
- طبق SYNOPSIS رسمی، شکل محلی این است: rsync [OPTION...] SRC... [DEST] وقتی در هیچ سمتی نویسهٔ دونقطه نباشد، مثل یک copy پیشرفته عمل میکند.
- برای حفظ مجوز، زمان، لینک نمادین و مشابه، از حالت آرشیو استفاده کنید: rsync -av /src/foo /dest. فلگ -a همان آرشیو (معادل -rlptgoD) و -v خروجی جزئیتر است.
- اگر میخواهید محتوای پوشه کپی شود نه یک سطح اضافه با نام پوشه، طبق manpage روی مبدأ اسلش پایانی بگذارید: rsync -av /src/foo/ /dest/foo. اسلش پایانی یعنی «محتوای این پوشه»؛ بدون اسلش یعنی «خود پوشه با نامش».
- قبل از بکاپ واقعی، یک اجرای آزمایشی بزنید: rsync -avn /src/foo/ /dest/foo/. فلگ -n همان --dry-run است؛ هیچ تغییری روی دیسک نمینویسد و فقط نشان میدهد چه چیزی منتقل میشد.
اگر جایی در مراحل گیر کردید یا خروجی dry-run برایتان مبهم است، در نظرات همان فرمان را (بدون مسیر خانگی خصوصی) بگذارید تا با هم خطبهخط مرور کنیم.
بکاپ ریموت روی SSH؛ Push و Pull
- طبق بخش SETUP، rsync مدرن برای ارتباط ریموت معمولاً از ssh استفاده میکند. میتوانید شل را با -e یا متغیر RSYNC_RSH عوض کنید.
- Pull (گرفتن از هاست ریموت به ماشین محلی) طبق SYNOPSIS: rsync [OPTION...] [USER@]HOST:SRC... [DEST]. مثال manpage: rsync -avz foo:src/bar /data/tmp — پوشهٔ src/bar از ماشین foo به /data/tmp/bar میآید؛ -z فشردهسازی بخش داده است.
- Push (فرستادن از محلی به ریموت): rsync [OPTION...] SRC... [USER@]HOST:DEST. مثال بکاپ روزانهٔ manpage: rsync -aiz . bkhost:backup/joe/ برای همگامکردن پوشهٔ خانگی به میزبان بکاپ.
- برای آینهٔ نزدیک به بکاپ آینهای، --delete فایلهای اضافهٔ مقصد را پاک میکند تا با مبدأ یکی شود. این فلگ خطرناک است؛ اول با -n ببینید چه چیزهایی حذف میشدند، بعد بدون dry-run اجرا کنید.
- اگر به هاست ریموت اعتماد کامل ندارید، طبق بخش MULTI-HOST SECURITY مستقیماً داخل خانه کپی نکنید؛ یک پوشهٔ اختصاصی بسازید، مثلاً rsync -aiv host1:dir1 ~/host1-files بهجای ریختن داخل ~.
نکتههای ایمنی و عیبیابی بکاپ rsync
خطای «command not found» روی سمت مقابل یعنی rsync آنجا نصب نیست — manpage صریح میگوید هر دو ماشین باید آن را داشته باشند. خطای ssh را جدا با ssh user@host حل کنید؛ rsync فقط روی همان کانال سوار میشود. فضای پر مقصد، مجوز نوشتن، و اشتباه اسلش پایانی سه علت رایج «بکاپ ناقص» هستند.
بکاپ روی همین دیسک مبدأ در برابر خرابی دیسک کمکی نمیکند؛ مقصد را ترجیحاً دیسک یا سرور جدا بگذارید. برای اینترنت عمومی، فقط با کلید ssh و کاربر محدود پیش بروید و --delete را بدون dry-run روی دادهٔ زنده نزنید.
مرجع کامل گزینهها و مثالها: rsync(1) — Ubuntu noble Manpage. اولین بکاپ را محلی میگیرید یا مستقیم به یک VPS روی SSH؟
حالت آرشیو برای بکاپ روزمره نقطهٔ شروع خوبی است چون مالکیت، مجوز و زمان را تا حد ممکن نگه میدارد. اگر فقط چند فایل متنی میفرستید و سرعت مهمتر از متادیتا است، میتوانید بعداً فلگها را سبکتر کنید؛ اول با -av یا -avz پیش بروید تا رفتار را ببینید.
وقتی مبدأ یک پوشه و مقصد نام دیگری است، manpage پیشنهاد میکند روی مبدأ اسلش بگذارید تا محتوا داخل مقصد بریزد: rsync -ai foo/ bar/ . بدون این عادت، یک سطح تو در تو میسازید و مسیر بکاپ بههم میریزد.
فشردهسازی -z روی لینکهای کند مفید است؛ روی LAN گیگابیتی گاهی هزینهٔ CPU بیشتر از سود پهنای باند است. برای دیدن پیشرفت ریزتر، -v یا ترکیبهای info در نسخههای جدیدتر کمک میکند، ولی برای مبتدی همان -avz کافی است.
زمانبندی بکاپ را میتوانید با cron روی همان کاربر غیرریوت بگذارید؛ مثال manpage برای پوشهٔ خانگی دقیقاً همین الگو را نشان میدهد. مهم است کرون به ssh با کلید دسترسی داشته باشد و خروجی خطا به ایمیل یا لاگ برود تا شکست بیصدا نماند.
هرگز کلید خصوصی یا فایل .env را عمداً به میزبان عمومی آینه نکنید. اگر از --delete استفاده میکنید، مقصد باید واقعاً آینه باشد نه محل فایلهای دستی اضافی؛ وگرنه همان فایلهای دستی حذف میشوند.