نقل الملفات بين السيرفرات باستخدام rsync

تريد نقل موقع من خادم قديم إلى جديد، أو أخذ نسخة من مجلّد كل ليلة. النسخ العادي ينقل كل شيء في كل مرة، ويبدأ من الصفر إن انقطع الاتصال. rsync يقارن الطرفين أولاً، ثم ينقل ما تغيّر فقط. لذلك تنتهي المرة الثانية في ثوانٍ، وتكمل بعد الانقطاع من حيث توقّفت.
قبل البدء#
- rsync مثبّت على الطرفين، لا على الخادم الذي تكتب فيه الأمر وحده. الأمر يشغّل نسخة rsync على الخادم الآخر عبر SSH.
- تستطيع الدخول بـSSH من خادم إلى الآخر. جرّب
ssh root@192.0.2.20أولاً. إن لم ينجح هذا فلن ينجح rsync. - في الوجهة مساحة كافية. تعرف حجم ما ستنقله بـ
du -sh /var/www/html، ومساحة الوجهة بـdf -h.
rsync --version
sudo apt install rsync # إن لم يكن مثبّتاً
rsync أم scp؟#
scp ينسخ الملفات عبر SSH أيضاً، وهو أبسط لنسخ ملف واحد مرة واحدة. لكنه ينقل كل شيء في كل مرة، ولا يعرف ما وصل من قبل. ولا يكمل ملفاً انقطع، ولا يحذف من الوجهة ما حُذف من المصدر. فإن كان النقل كبيراً، أو سيتكرّر، فـrsync هو الأداة.
أجزاء الأمر#
rsync -avz /المصدر/ /الوجهة/
| الخيار | معناه |
|---|---|
-a | وضع الأرشيف: ينسخ المجلّدات بما فيها، ويحفظ الصلاحيات والتواريخ والروابط الرمزية. وإن كان root من يستقبل، يحفظ المالك والمجموعة أيضاً. |
-v | يعرض أسماء الملفات وهي تُنقل. |
-z | يضغط البيانات في الطريق. يفيد في الشبكات البطيئة والملفات النصّية، ولا يفيد في صور مضغوطة أصلاً. |
-P | يجمع --partial، الذي يحتفظ بالملف الناقص عند الانقطاع، و--progress، الذي يعرض التقدّم. |
-n | تجربة: يعرض ما سيفعله ولا يفعل شيئاً. اسمه الطويل --dry-run. |
--delete | يحذف من الوجهة ما لم يعد موجوداً في المصدر. |
الشرطة المائلة في آخر المصدر#
أكثر ما يُربك في rsync حرف واحد في آخر مسار المصدر:
# مع الشرطة: ينقل محتوى html إلى داخل /backup/
rsync -av /var/www/html/ /backup/
# النتيجة: /backup/index.php و /backup/wp-content ...
# بلا الشرطة: ينقل المجلّد html نفسه إلى داخل /backup/
rsync -av /var/www/html /backup/
# النتيجة: /backup/html/index.php ...
قاعدة سهلة: الشرطة في آخر المصدر تعني «ما بداخل المجلّد». أما الشرطة في آخر الوجهة فلا تغيّر شيئاً.
النقل بين خادمين عبر SSH#
الخادم البعيد يُكتب بالشكل المستخدم@العنوان:المسار. الاتجاه يحدّده الترتيب: المصدر أولاً دائماً.
# من هذا الخادم إلى خادم آخر
rsync -avzP /var/www/html/ root@192.0.2.20:/var/www/html/
# من خادم آخر إلى هذا الخادم
rsync -avzP root@192.0.2.10:/var/www/html/ /var/www/html/
وإن كان SSH على منفذ غير 22، فمرّر المنفذ إلى ssh عبر -e:
rsync -avzP -e "ssh -p 2222" /var/www/html/ root@192.0.2.20:/var/www/html/
استثناء ما لا تريد نقله#
الكاش والسجلّات المؤقتة لا داعي لنقلها. أضف --exclude لكل واحد منها، والمسارات فيه نسبية إلى المصدر:
rsync -avzP \
--exclude 'wp-content/cache/' \
--exclude '*.log' \
/var/www/html/ root@192.0.2.20:/var/www/html/
جرّب قبل أن تحذف#
--delete يجعل الوجهة نسخة مطابقة للمصدر، وهذا يعني حذف كل ما في الوجهة وليس في المصدر.
مع --delete، أيّ خطأ في المسار أو في الشرطة المائلة أو في ترتيب المصدر والوجهة يمكن أن يمسح مجلّداً كاملاً. لا يوجد تراجع. شغّل الأمر بـ-n أولاً، واقرأ ما سيحذفه، ثم أزل -n.
# تجربة: يعرض الأسطر التي تبدأ بـ deleting دون أن يحذف
rsync -avn --delete /var/www/html/ root@192.0.2.20:/var/www/html/
# التنفيذ بعد أن تطمئنّ
rsync -av --delete /var/www/html/ root@192.0.2.20:/var/www/html/
إن انقطع النقل#
أعد تشغيل الأمر نفسه. rsync يتخطّى الملفات التي وصلت كاملة. أما الملف الذي انقطع في منتصفه فيحذفه rsync عادةً، ويبدأه من أوّله في المرة التالية. مع -P، أو --partial، يبقى الجزء الذي وصل، فيكمل منه. هذا يفرق كثيراً مع ملفات النسخ الاحتياطي الكبيرة.
كيف تتأكّد أن النقل اكتمل#
أعد الأمر نفسه مع -n و-i. الخيار -i يطبع سطراً لكل ملف سيتغيّر:
rsync -ani /var/www/html/ root@192.0.2.20:/var/www/html/
إن لم يطبع ملفات، فالطرفان متطابقان. وللتحقّق الأدقّ أضف --checksum، فيقارن محتوى كل ملف لا حجمه وتاريخه فقط. هذا أبطأ، لكنه لا يفوّت شيئاً.
نقل موقع كامل: الملفات وحدها لا تكفي#
rsync ينقل الملفات، لكن قاعدة البيانات ليست ملفاً تنسخه وهي تعمل. نسخ ملفات MySQL أثناء عملها يعطيك نسخة قد لا تفتح. لنقل موقع ووردبريس مثلاً، صدّر القاعدة إلى ملف أولاً، ثم انقله مع الموقع، ثم استورده في الخادم الجديد:
# على الخادم القديم
mysqldump -u root -p اسم_القاعدة > /var/www/site.sql
rsync -avzP /var/www/ root@192.0.2.20:/var/www/
# على الخادم الجديد، بعد إنشاء قاعدة فارغة بالاسم نفسه
mysql -u root -p اسم_القاعدة < /var/www/site.sql
والخطوات كاملة، مع تعديل الإعدادات والدومين، في مقال نقل ووردبريس إلى استضافة جديدة. ولا تترك ملف site.sql داخل مجلّد الموقع العام بعد الانتهاء، فقد يُنزَّل من المتصفّح.
المزامنة التلقائية كل ليلة#
المهمّة المجدولة تعمل ولا أحد أمام الشاشة، فلا يوجد من يكتب كلمة مرور. لذلك تحتاج أولاً إلى دخول بمفتاح SSH من هذا الخادم إلى الآخر، كما في مقال الدخول بمفتاح SSH. جرّب أن ssh root@192.0.2.20 يدخل دون أن يسأل عن شيء. بعدها افتح جدول المهام:
crontab -e
وأضف سطراً يعمل كل يوم في الثالثة فجراً:
0 3 * * * rsync -az /var/www/html/ root@192.0.2.20:/backup/html/ >> /var/log/rsync-backup.log 2>&1
النسخة الاحتياطية هنا بلا --delete عن قصد. لو حُذف ملف من المصدر خطأً، فستحذفه المزامنة من النسخة أيضاً في الليلة نفسها، وستضيع النسخة التي كانت ستنقذك. وبعد أول تشغيل، راجع السجلّ /var/log/rsync-backup.log لتتأكّد أن المهمّة عملت.
مشاكل شائعة وحلولها#
«rsync: command not found» ثم «connection unexpectedly closed»#
rsync غير مثبّت على الخادم الآخر. ثبّته هناك بـsudo apt install rsync.
«Permission denied (publickey)»#
هذه رسالة من SSH لا من rsync: الدخول إلى الخادم الآخر لم ينجح. أصلح الدخول بـssh وحده أولاً. وإن كان مفتاحك في ملف غير المعتاد فحدّده بهذا الشكل:
rsync -avz -e "ssh -i ~/.ssh/backup_key" /المصدر/ root@192.0.2.20:/الوجهة/
«rsync error: some files/attrs were not transferred (code 23)»#
النقل تمّ في أغلبه، لكن بعض الملفات لم تُقرأ أو لم تُكتب. السبب في الغالب صلاحيات. ابحث في الناتج عن الأسطر التي فيها Permission denied لتعرف أيّ الملفات:
- ملفات في المصدر لا يقرؤها مستخدمك: شغّل الأمر بـ
sudo. - لا تستطيع الكتابة في الوجهة: ادخل إلى الخادم الآخر بمستخدم يملك الكتابة هناك.
الملفات وصلت لكن مالكها تغيّر#
-a يحفظ المالك فقط حين يكون المستقبِل root. إن دخلت إلى الوجهة بمستخدم عادي، فستُنسب الملفات إليه. ادخل بـroot، أو صحّح الملكية بعد النقل:
chown -R www-data:www-data /var/www/html
النقل يخنق الشبكة#
حدّد السرعة بـ--bwlimit، بالكيلوبايت في الثانية، حتى لا يبطؤ موقع يعمل على الخادم نفسه:
rsync -avzP --bwlimit=5000 /المصدر/ root@192.0.2.20:/الوجهة/



التعليقات