بکاپ لینوکس با rsync و Cron

برای بکاپ لینوکس با rsync، دستور rsync -aAXv را با مبدأ و مقصد اجرا می‌کنید و برای خودکار شدن آن را در Cron می‌گذارید. rsync فقط فایل‌های تغییرکرده را منتقل می‌کند، پس بعد از اولین بکاپ کامل، بکاپ‌های بعدی سریع‌اند. با گزینه --link-dest هم می‌توان چند نسخه روزانه ساخت که فضای زیادی نمی‌گیرند.

rsync ابزار هماهنگ‌سازی فایل است، نه نرم‌افزار بکاپ کامل: خودش نسخه‌بندی، رمزنگاری و بازیابی دیتابیس ندارد. برای سرور کوچک و داده‌های فایلی ساده و مطمئن است. برای دیتابیس‌ها باید اول از آن‌ها خروجی بگیرید؛ روشش در بکاپ گرفتن از دیتابیس MySQL آمده است. تصویر کلی از قاعده ۳-۲-۱ و بازیابی بحران را در بکاپ گیری سرور و بازیابی بحران می‌بینید.

ساختار دستور rsync

rsync [گزینه‌ها] مبدأ مقصد

گزینه‌های پرکاربرد:

گزینهکار
-aحالت آرشیو؛ دسترسی‌ها، مالک، زمان و لینک‌ها را حفظ می‌کند و پوشه‌ها را بازگشتی کپی می‌کند
-vنمایش جزئیات
-zفشرده‌سازی هنگام انتقال شبکه
-A و -Xحفظ ACL و ویژگی‌های گسترده فایل
--deleteفایل‌هایی را که در مبدأ پاک شده‌اند در مقصد هم پاک می‌کند
--dry-run یا -nفقط نشان می‌دهد چه کاری انجام می‌شود، بدون انجام
--excludeکنار گذاشتن مسیرها
--progressنمایش پیشرفت هر فایل

اسلش آخر مسیر مبدأ

مهم‌ترین نکته rsync، که زیاد اشتباه می‌شود، اسلش آخر مبدأ است. با rsync -a /var/www/ /backup/www/ محتوای پوشه www در مقصد کپی می‌شود. بدون اسلش، یعنی rsync -a /var/www /backup/www/، خود پوشه www داخل مقصد ساخته می‌شود و مسیر /backup/www/www/ به دست می‌آید. اگر مطمئن نیستید، اول با --dry-run اجرا کنید.

بکاپ لینوکس با rsync: حالت محلی

sudo rsync -aAXv --dry-run /var/www/ /backup/www/
sudo rsync -aAXv /var/www/ /backup/www/

دستور اول فقط نشان می‌دهد چه چیزی کپی می‌شود. اگر درست بود، بدون dry-run اجرا کنید.

بکاپ به سرور دیگر با SSH

rsync از SSH به‌عنوان مسیر انتقال استفاده می‌کند. برای ورود بدون رمز، اول کلید SSH بسازید و روی سرور بکاپ نصب کنید؛ روشش در آموزش SSH Key آمده است. بعد:

rsync -aAXz -e "ssh -p 22" /var/www/ backupuser@203.0.113.20:/srv/backups/www/

آدرس و کاربر مثال هستند. برای امنیت بیشتر، روی سرور بکاپ کاربر جداگانه بسازید که فقط به پوشه بکاپ دسترسی دارد. اگر سرور اصلی هک شود، مهاجم با کلیدی که روی همان سرور هست می‌تواند به بکاپ هم برسد؛ پس بکاپ باید طوری باشد که از سرور اصلی قابل حذف نباشد، مثلاً با کشیدن بکاپ از سرور بکاپ (pull) به‌جای فرستادن از سرور اصلی.

کنار گذاشتن مسیرهای غیرضروری

کش، فایل‌های موقت و لاگ‌های بزرگ لازم نیست در بکاپ باشند:

rsync -aAXz --exclude='cache/' --exclude='*.log' --exclude='tmp/' /var/www/ /backup/www/

برای فهرست طولانی، از فایل استفاده کنید: --exclude-from=/etc/rsync-exclude.txt که هر خط یک الگو دارد.

گزینه delete: با احتیاط

بدون --delete، فایلی که در مبدأ پاک شده، در مقصد می‌ماند و بکاپ مدام بزرگ می‌شود. با --delete مقصد آینه دقیق مبدأ می‌شود. خطر آن این است که اگر مبدأ به‌اشتباه خالی یا ناقص باشد، مقصد را هم خالی می‌کند. برای همین --delete را فقط با نسخه‌بندی یا بکاپ‌های چندنسخه‌ای به کار ببرید و اول با --dry-run نتیجه را ببینید.

نسخه‌های روزانه با link-dest

با --link-dest هر روز یک پوشه جدید کامل ساخته می‌شود، ولی فایل‌هایی که تغییر نکرده‌اند به‌صورت لینک سخت (hard link) به نسخه قبلی اشاره می‌کنند و فضای اضافه نمی‌گیرند:

#!/bin/bash
set -euo pipefail
SRC=/var/www/
DEST=/srv/backups/www
TODAY=$(date +%F)
rsync -aAXz --delete --link-dest="$DEST/latest" "$SRC" "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -name '20*' -mtime +14 -exec rm -rf {} +

آخرین خط پوشه‌های قدیمی‌تر از ۱۴ روز را پاک می‌کند. هر پوشه تاریخ‌دار مثل یک بکاپ کامل است و می‌توانید فایلی را از هر روز بازگردانید. لینک سخت فقط روی یک فایل‌سیستم کار می‌کند، پس مقصد باید یک دیسک یا پارتیشن باشد.

زمان‌بندی با Cron

اسکریپت را در /usr/local/bin/backup-www.sh بگذارید، اجرایی کنید و با crontab کاربر root برای ساعت ۲ بامداد زمان‌بندی کنید:

sudo chmod 700 /usr/local/bin/backup-www.sh
0 2 * * * /usr/local/bin/backup-www.sh >> /var/log/backup-www.log 2>&1

جزئیات نوشتن Cron و گرفتن خروجی و خطا در آموزش Cron Job در لینوکس آمده است. اگر اسکریپت بی‌صدا شکست بخورد، ممکن است هفته‌ها بدون بکاپ بمانید؛ پس موفق بودنش را پایش کنید، مثلاً با بررسی تاریخ آخرین پوشه.

بازیابی از بکاپ

بازیابی همان rsync در جهت برعکس است. اول با dry-run ببینید چه چیزی تغییر می‌کند:

rsync -aAXv --dry-run /srv/backups/www/latest/ /var/www/

بکاپی که بازیابی‌اش را امتحان نکرده‌اید، مطمئن نیست. هر چند وقت یک بار فایلی را در یک پوشه آزمایشی بازگردانید و سالم بودنش را ببینید. برای بررسی بیشتر وضعیت بکاپ، بررسی وضعیت بکاپ را ببینید.

خطاهای رایج

نشانهعلت و راه حل
Permission denied (publickey)کلید SSH نصب نشده یا کاربر اشتباه است
rsync: failed to set timesفایل‌سیستم مقصد از این ویژگی پشتیبانی نمی‌کند؛ مقصد ext4 یا XFS باشد
مقصد خالی شدمبدأ خالی بود و --delete روشن بود؛ بدون نسخه‌بندی خطرناک است
rsync error: some files vanishedفایل‌ها حین بکاپ پاک شده‌اند؛ برای لاگ و کش طبیعی است
بکاپ خیلی کند استحجم زیاد یا شبکه ضعیف؛ -z را برای فایل‌های از قبل فشرده خاموش کنید

سوالات متداول

بکاپ لینوکس با rsync برای دیتابیس هم کافی است؟

نه. کپی مستقیم فایل‌های دیتابیس در حالی که سرویس روشن است بکاپ قابل اعتماد نیست. اول با ابزار خود دیتابیس خروجی بگیرید و فایل آن را با rsync منتقل کنید.

rsync یا tar؟

tar همه‌چیز را در یک فایل بسته‌بندی می‌کند و برای آرشیو مناسب است. rsync برای هماهنگ‌سازی تدریجی و بکاپ‌های تکرارشونده بهتر است، چون فقط تغییرات را می‌فرستد.

rsync را روی ویندوز می‌شود به کار برد؟

بله، با WSL یا ابزارهایی مثل cwRsync. در محیط ویندوز، ابزارهای بکاپ اختصاصی ساده‌تر هستند.

rsync دیتای رمزگذاری‌شده می‌فرستد؟

وقتی از طریق SSH اجرا شود، انتقال رمزنگاری می‌شود. داده در مقصد به همان شکل ذخیره می‌شود و برای رمزنگاری در حالت ذخیره باید از دیسک رمزگذاری‌شده یا ابزار دیگری استفاده کنید.

منابع