دليل

rsync: أمثلة لمزامنة الملفات والنسخ الاحتياطي في لينكس

آخر تحديث: · Skillaria.Top

يقوم rsync بنسخ الملفات ومزامنتها محلياً وعبر SSH، ويرسل التغييرات فقط. الأمر الأساسي هو rsync -avz المصدر/ user@host:/المسار/: الخيار -a يحافظ على الصلاحيات والوقت، و-v يعرض الملفات، و-z يضغط حركة المرور. أما --delete فيجعل الوجهة نسخة مطابقة للمصدر، و-n يتيح التحقق من النتيجة أولاً دون أي تغيير.

rsync أداة لينكس القياسية لنسخ الملفات ومزامنتها: محلياً، بين الأقراص، وبين الخوادم عبر SSH. أهم ما يميزه عن cp وscp أنه ينقل ما تغيّر فقط، لذلك تستغرق إعادة مزامنة مجلد كبير ثوانٍ قليلة. فيما يلي أمثلة rsync للمهام المعتادة: رفع مشروع إلى الخادم، ومرآة لمجلد، والاستثناءات، والنسخ الاحتياطي بلقطات، والتشغيل وفق جدول زمني.

الصيغة والخيارات الأهم

الشكل العام للأمر:

rsync [الخيارات] المصدر... الوجهة

يمكن أن يكون المصدر والوجهة مساراً محلياً أو مساراً بعيداً بالصيغة user@host:/المسار. ويجب أن يكون أحد الطرفين محلياً: لا ينسخ rsync مباشرة بين جهازين بعيدين.

الخيارما يفعله
-aوضع الأرشيف: نسخ تكراري مع الحفاظ على الصلاحيات والمالك والمجموعة ووقت التعديل والروابط الرمزية (وهو -rlptgoD)
-vعرض قائمة الملفات المنقولة
-zضغط البيانات أثناء النقل عبر الشبكة
-hأحجام مقروءة (K، M، G)
-Pيعادل --partial --progress: عرض التقدم واستكمال الملفات المقطوعة
-n، --dry-runتشغيل تجريبي: يعرض ما سيحدث دون تغيير أي شيء
--deleteحذف الملفات في الوجهة التي لا توجد في المصدر
--excludeعدم نسخ الملفات التي تطابق نمطاً
-eتحديد الصدفة البعيدة، مثلاً -e "ssh -p 2222"
-H، -A، -Xالحفاظ على الروابط الصلبة وقوائم ACL والسمات الموسّعة (غير مشمولة في -a)

في الغالب، يكفي rsync -avh محلياً وrsync -avzh عبر الشبكة.

الشرطة المائلة في نهاية المسار: الفخ الأكبر

أكثر الأخطاء شيوعاً عند المبتدئين مرتبط بالشرطة المائلة في نهاية المصدر. فهي تحدد ما الذي سيُنسخ: المجلد نفسه، أم محتوياته فقط.

# نسخ المجلد project داخل /backup ← ستصبح النتيجة /backup/project/...
rsync -av project /backup/

# نسخ محتويات project إلى /backup ← تصبح الملفات مباشرة في /backup/
rsync -av project/ /backup/

القاعدة بسيطة: الشرطة المائلة في نهاية المصدر تعني «محتويات هذا المجلد». أما الوجهة فلا تهم الشرطة المائلة فيها. وإذا شككت، أضف -n وانظر إلى المسارات التي يُنوي rsync إنشاءها.

النسخ المحلي

نسخ مجلد إلى قرص خارجي مع عرض التقدم:

rsync -avhP ~/photos/ /mnt/usb/photos/

تشغيل الأمر نفسه مرة ثانية لا ينسخ كل شيء من جديد: يقارن rsync حجم الملف ووقت تعديله، فينقل الجديد والمعدّل فقط. وتُظهر النتيجة في النهاية كمية البيانات التي انتقلت فعلاً:

sending incremental file list
2026/10/IMG_2041.jpg
          4.12M 100%   38.40MB/s    0:00:00 (xfr#1, to-chk=0/1534)

sent 4.13M bytes  received 9.25K bytes  2.76M bytes/sec
total size is 6.82G  speedup is 1,648.21

تبيّن القيمة speedup عدد المرات التي قلّت فيها البيانات المنقولة مقارنةً بالنسخ الكامل.

rsync عبر SSH: النسخ إلى الخادم والعكس

للمسارات البعيدة يستخدم rsync بروتوكول SSH افتراضياً، فلا حاجة لإعداد إضافي — يكفي أن يعمل تسجيل الدخول العادي عبر ssh. والأسهل هو استخدام المفاتيح: عندها لا تُطلب كلمة المرور ويمكن وضع الأمر في cron.

# رفع الموقع إلى الخادم
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/

# تنزيل السجلات من الخادم إلى جهازي
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/

# SSH على منفذ غير قياسي ومع مفتاح محدد
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/

يجب أن يكون rsync مثبتاً على الجهازين، لأنه يُشغَّل على الطرف البعيد عبر SSH. إذا لم يكن مثبتاً هناك، سترى rsync: command not found — ثبّت الحزمة (sudo apt install rsync أو sudo dnf install rsync).

إذا عُرّف المضيف في ~/.ssh/config باسم مستعار، فإن rsync يفهمه: rsync -avz ./site/ prod:/var/www/site/.

الحاجة إلى صلاحيات root على الخادم

إذا كانت الملفات في الوجهة مملوكة لـ root وأنت تدخل بمستخدم عادي، يمكن تشغيل rsync البعيد عبر sudo:

rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/

ولكي يعمل ذلك، يجب أن يعمل sudo للأمر rsync على الخادم دون كلمة مرور (بقاعدة في sudoers)، وإلا فسيتوقف الأمر منتظراً إدخالاً.

مرآة لمجلد: --delete

افتراضياً يضيف rsync الملفات ويحدّثها، لكنه لا يحذف شيئاً. ولكي تصبح الوجهة نسخة مطابقة للمصدر، تحتاج إلى --delete:

rsync -avh --delete ~/projects/ /mnt/backup/projects/

هذا الخيار قوي وخطير. خطأ في المسار (مثلاً مصدر فارغ أو شرطة مائلة منسية) قد يحذف البيانات في الوجهة. لذلك القاعدة واحدة: أي أمر فيه --delete شغّله أولاً مع -n.

$ rsync -avhn --delete ~/projects/ /mnt/backup/projects/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py

sent 1.20K bytes  received 64 bytes  2.53K bytes/sec
total size is 18.4M  speedup is 14,554.39 (DRY RUN)

تبيّن أسطر deleting ما سيُحذف. إذا تأكدت أن كل شيء صحيح، فشغّل الأمر دون -n.

من البدائل المفيدة: --delete-after يحذف الملفات بعد انتهاء النقل (فتبقى الوجهة مكتملة لفترة أطول)، و--backup --backup-dir=/mnt/backup/deleted-$(date +%F) لا يحذف بل ينقل الملفات المحذوفة أو المستبدلة إلى مجلد منفصل.

الاستثناءات: --exclude و--include

استبعاد الملفات المؤقتة والتبعيات والأسرار أمر معتاد في النشر والنسخ الاحتياطي.

# عدة أنماط
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/

# الأنماط من ملف
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/

الملف .rsyncignore قائمة بسيطة من الأنماط، نمط في كل سطر:

.git/
node_modules/
*.log
.env
tmp/

طريقة عمل الأنماط:

  • النمط الذي لا يبدأ بشرطة مائلة (*.log) يطابق على أي عمق.
  • النمط الذي يبدأ بشرطة مائلة (/tmp/) مرتبط بجذر النقل، فيستبعد tmp الموجود في الأعلى فقط.
  • الشرطة المائلة في النهاية (cache/) تعني «المجلدات فقط».
  • تُفحص القواعد بالترتيب، ويُطبَّق أول نمط مطابق.

من النقطة الأخيرة ينتج أسلوب «انسخ الضروري فقط»: اسمح أولاً، ثم امنع الباقي.

# نسخ ملفات .conf فقط مع الحفاظ على بنية المجلدات
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/

هنا --include='*/' ضروري حتى يدخل rsync جميع المجلدات الفرعية. أضف --prune-empty-dirs (-m) حتى لا تُنشأ مجلدات فارغة.

النسخ الاحتياطي باستخدام rsync

نسخة يومية بسيطة

نسخ احتياطي بسيط لمجلد المستخدم الرئيسي إلى قرص ثانٍ:

rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/

عيب هذه الطريقة أنها تحتفظ بنسخة واحدة فقط. إذا أُفسد ملف وتمت مزامنة النسخة الاحتياطية بعد ذلك، فإن النسخة القديمة تكون قد ضاعت.

لقطات تزايدية عبر --link-dest

يحل الخيار --link-dest هذه المشكلة تقريباً دون تكلفة مساحة إضافية. لا تُنسخ الملفات غير المتغيرة، بل تُنشأ روابط صلبة إلى ملفات اللقطة السابقة. كل لقطة تبدو كنسخة كاملة، لكن المساحة تُستهلك فقط بالتغييرات.

#!/bin/bash
set -euo pipefail

SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"

mkdir -p "$DEST"
rsync -aH --delete \
  --exclude='.cache/' \
  --link-dest="$DEST/latest" \
  "$SRC" "$DEST/$TODAY"

ln -sfn "$DEST/$TODAY" "$DEST/latest"

في التشغيل الأول لا يكون المجلد latest موجوداً بعد، فيُصدر rsync تحذيراً وينشئ نسخة كاملة، وهذا طبيعي. وتُحذف اللقطات القديمة بالأمر العادي rm -rf، والملفات التي تشير إليها لقطات أخرى لن تختفي بذلك.

لحذف اللقطات الأقدم من 30 يوماً:

find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +

نسخ الخادم إلى جهاز آخر

من الأفضل أن يكون الاتجاه «من خادم النسخ الاحتياطي إلى الجهاز العامل»: يسحب جهاز النسخ البيانات بنفسه، ولا يملك الخادم العامل صلاحية الوصول إلى النسخ. فإذا تعرّض للاختراق، تبقى النسخ سليمة.

rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
  backup@web01:/var/www/ /srv/backups/web01/www/

تنبيه: لا يمكن نسخ قواعد البيانات بهذه الطريقة، فملفات قاعدة البيانات العاملة تكون غير متسقة أثناء النسخ. أنشئ أولاً ملف تفريغ (mysqldump أو pg_dump)، ودع rsync ينقل ملف التفريغ الجاهز.

التشغيل وفق جدول زمني عبر cron

ضع سكريبت النسخ في cron بالأمر crontab -e:

# كل يوم الساعة 03:15، والمخرجات في السجل
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

ما الذي تتحقق منه حتى تعمل النسخة الاحتياطية من cron فعلاً:

  • استخدم المسارات المطلقة في السكريبت، فلـ cron PATH محدود ومجلد عمل مختلف.
  • مفتاح SSH بدون كلمة مرور، والمضيف موجود مسبقاً في known_hosts، وإلا فسيتوقف rsync منتظراً سؤال التحقق من هوية المضيف.
  • يتحقق السكريبت من رمز الخروج: يعيد rsync الرمز 0 عند النجاح، و23 إذا لم تُنقل بعض الملفات، و24 إذا اختفت الملفات أثناء النسخ.
  • يمنع flock تشغيل نسختين في وقت واحد: flock -n /tmp/backup.lock /usr/local/bin/backup.sh.

بدلاً من cron يمكن استخدام مؤقت systemd، فهو يكتب المخرجات في السجل، ويسهل فحص النتائج عبر journalctl.

خيارات مفيدة للنقل الكبير

المهمةالخيار
تحديد السرعة حتى لا يُغرق القناة--bwlimit=5M
استكمال ملف كبير بعد انقطاع-P (أو --partial)
تقدم إجمالي بدلاً من قائمة الملفات--info=progress2
المقارنة بالمحتوى لا بالوقت-c (--checksum)، وهو أبطأ
عدم لمس الملفات الأحدث في الوجهة-u (--update)
عدم استبدال الملفات الموجودة--ignore-existing
حذف الملفات الأصلية بعد النقل (نقل)--remove-source-files
إحصائيات مفصلة في النهاية--stats

الأخطاء الشائعة وحلولها

  • Permission denied عند الكتابة — ليست لدى المستخدم صلاحية على مجلد الوجهة. تحقق من مالك المجلد، أو استخدم --rsync-path="sudo rsync".
  • تُنسخ الملفات من جديد في كل مرة — وقت التعديل غير محفوظ. تأكد من وجود -a أو -t؛ وفي FAT/exFAT أضف --modify-window=2، لأن هذه الأنظمة تخزن الوقت بدقة ثانيتين.
  • أخطاء chown أو chgrp عند النسخ إلى فلاش أو مجلد شبكي — نظام الملفات لا يدعم المالكين. استبدل -a بـ -rlt.
  • ظهور تداخل زائد /backup/project/project — الشرطة المائلة في نهاية المصدر مختلطة.
  • connection unexpectedly closed — مشكلة في SSH، أو rsync غير مثبت على الطرف البعيد. تحقق من الدخول عبر ssh العادي ومن وجود rsync على الخادم.

الخلاصة

للعمل اليومي تكفي عدة أوامر: rsync -avz src/ host:/dst/ للنسخ عبر SSH، و--delete مع التجربة الأولية -n للمرآة، و--exclude لاستبعاد الزائد، و--link-dest للنسخ باللقطات. انتبه إلى الشرطة المائلة في نهاية المصدر، وسيصبح rsync أكثر الطرق موثوقية لنقل الملفات بين الأجهزة. وتُشرح المزامنة والنسخ الاحتياطي عملياً في دورة Linux.

الأسئلة الشائعة

ما ميزة rsync على scp؟

ينسخ scp الملفات كاملة في كل مرة، أما rsync فينقل التغييرات فقط، ويستطيع استكمال النقل، وحذف الزائد في الوجهة، واستبعاد الملفات بالأنماط. للنسخ لمرة واحدة لملف واحد لا فرق كبير، أما للمزامنة المنتظمة فـ rsync أسرع بكثير.

هل يمكن استخدام rsync في Windows؟

نعم، عبر WSL حيث يُثبَّت rsync كما في لينكس العادي، أو عبر Cygwin. ومزامنة ملفات جهاز Windows مع خادم لينكس أسهل من داخل WSL.

هل يشفّر rsync البيانات المنقولة؟

rsync نفسه لا يشفّر، لكن عند النسخ عبر SSH تمر كل الحركة عبر اتصال SSH مشفّر. بدون تشفير تُنقل البيانات فقط عند العمل مع خادم rsync بالعنوان من الصيغة rsync://.

كيف أتحقق من أن النسخة مطابقة للأصل؟

شغّل rsync -avnc المصدر/ الوجهة/ — مع الخيار -c تُقارن الملفات بمجموع التحقق، والخيار -n لا يغيّر شيئاً. إذا كانت قائمة الملفات فارغة فالنسختان متطابقتان.

ماذا يحدث إذا قطعت rsync أثناء النقل؟

تبقى الملفات التي انتقلت كاملة، ويُحذف الملف غير المكتمل افتراضياً. تكمل إعادة تشغيل الأمر نفسه من حيث توقفت، ومع الخيار -P يُحفظ جزء الملف المقطوع أيضاً.

تعلّم هذا الموضوع بالفيديو

يُشرح هذا الموضوع بالتفصيل مع التطبيق العملي في دورة «Linux: с нуля до уверенного администрирования».

الانتقال إلى الدورة