أتمتة النسخ الاحتياطي باستخدام rsync على نظام لينكس

  • يُمكّن Rsync من إجراء نسخ احتياطية فعالة عن طريق نقل التغييرات فقط، مع الحفاظ على الأذونات والبيانات الوصفية محليًا وعبر SSH.
  • إن الجمع بين البرامج النصية، أو cron، أو مؤقتات systemd يحول rsync إلى نظام نسخ احتياطي تلقائي، متناوب، ويكاد يكون خالياً من الصيانة.
  • إن الممارسات الجيدة مثل الاستثناءات، والاستخدام الحكيم لـ --delete، والمراقبة، واختبار الاستعادة تحدث فرقًا في الموثوقية الفعلية للنسخة الاحتياطية.

أتمتة النسخ الاحتياطي باستخدام rsync على نظام لينكس

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

سوف ترى خلال هذا الدليل من أساسيات rsync إلى التحرير المتقدمالنسخ الاحتياطية المحلية، والنسخ الاحتياطية عن بُعد عبر SSH، والنسخ الاحتياطية على غرار Time Machine مع لقطات، والبرامج النصية الجاهزة للإنتاج، وcron، ومؤقتات systemd، والاستثناءات، والتدوير، والتحقق. راجع مقارنة طرق النسخ الاحتياطي لتحديد استراتيجية. الفكرة هي أن تنهي المقال بخطة واضحة وأوامر يمكنك نسخها عمليًا وتكييفها مع بيئتك.

ما هو برنامج rsync ولماذا يُستخدم بكثرة في عمليات النسخ الاحتياطي؟

Rsync هي أداة سطر أوامر مصممة لـ مزامنة الملفات والمجلدات بين موقعين، سواء على نفس الكمبيوتر أو بين أجهزة مختلفة، عادةً عبر SSH أو باستخدام برنامج rsyncd الخاص به.

تتمثل ميزة rsync على cp أو scp البسيطين في أنه يطبق خوارزمية ذكية لـ نقل الكتلة التفاضلييقارن البرنامج بين المصدر والوجهة، ويرسل التغييرات فقط، وليس الملف بأكمله في كل مرة. إذا كان لديك كمية كبيرة من البيانات وتُعدّل أجزاءً صغيرة منها فقط، فإن توفير الوقت وعرض النطاق الترددي سيكون هائلاً.

بالإضافة إلى ذلك، يمكن لـ rsync الاحتفاظ بجميع البيانات الوصفية تقريبًاالأذونات، والمالكين، والمجموعات، والطوابع الزمنية، والروابط الرمزية، والأجهزة... هذا هو السبب في أنها مفيدة جدًا لعمليات النسخ الاحتياطي "الجدية"، حيث لا يهم المحتوى فقط، ولكن أيضًا كيفية إعداد نظام الملفات.

ومن المزايا المهمة الأخرى أن rsync يعمل محلياً وعن بعديمكنك استخدامه لمزامنة مجلدين على نفس الخادم، أو لسحب البيانات من خادم بعيد إلى جهاز النسخ الاحتياطي الخاص بك، أو لدفع البيانات إلى جهاز تخزين متصل بالشبكة (NAS) أو خادم افتراضي خاص (VPS) بعيد باستخدام SSH.

rsync في لينكس

قم بتثبيت واختبار rsync على توزيعات مختلفة

على الرغم من أن العديد من التوزيعات تأتي مثبتة مسبقًا مع rsync، إلا أنها فكرة جيدة. تحقق من التثبيت وقم بالتحديث إلى أحدث إصدار. قم بتثبيت النسخ الاحتياطية التلقائية على كل من الجهاز المصدر والجهاز الوجهة.

في الأنظمة المبنية على دبيان أو أوبونتو، يمكنك القيام بشيء بسيط مثل:

rsync --version
sudo apt update
sudo apt install rsync

في توزيعات مثل RHEL وCentOS وRocky Linux أو غيرها من التوزيعات المشتقة، سيكون الإجراء مشابهًا جدًا، حيث يتم تغيير مدير الحزم ولكن بنفس الفكرة. تأكد من توفر برنامج rsync وتحديثه في أقصى الحدود.

rsync --version
sudo dnf install rsync # En sistemas modernos
sudo yum install rsync # En sistemas más antiguos

خيارات rsync الأساسية التي ستستخدمها طوال الوقت

على الرغم من أن rsync يمتلك مجموعة جيدة من المعلمات، إلا أنك عمليًا ستقضي 90% من وقتك في استخدام... مجموعة صغيرة من الخيارات ينبغي حفظ ذلك.

إن البنية العامة للأمر بسيطة للغاية، ولكن هناك تفصيل واحد يضيف الكثير من الاحتمالات: الشرطة المائلة الأخيرة في المسارات تغير السلوك.

بناء الجملة العام:

rsync ORIGEN DESTINO

يكمن الاختلاف الرئيسي في كيفية التعامل مع دليل المصدر:

# Copia el directorio como tal dentro del destino
rsync -av /source/dir /backup/

انسخ محتويات الدليل فقط إلى الوجهة
rsync -av /المصدر/دير/ /النسخ الاحتياطي/

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

  • -a: وضع الملف. مكافئ لـ -rlptgoD (تكراري، يحافظ على الروابط الرمزية، والأذونات، والطوابع الزمنية، والمجموعة، والمالك، والملفات الخاصة).
  • -vالوضع "المفصل". يعرض ما يفعله والملفات التي يصل إليها.
  • -z: يضغط البيانات أثناء النقل، وهو مثالي للنسخ عن بعد عبر الإنترنت.
  • -hيجعل الأحجام تبدو "لطيفة" (ميغابايت، غيغابايت...)، وهو أمر مثالي للبشر.
  • -Pيجمع بين ملفات التقدم والملفات الجزئية، لمعرفة كيف تسير الأمور والقدرة على استئنافها.
  • -حذف: يحذف الملفات التي لم تعد موجودة في المصدر من الوجهة، تاركاً نسخة طبق الأصل.
  • -n / –dry-run: يحاكي التنفيذ دون لمس أي شيء، وهو أمر رائع لتجنب إفساد الأمور.
  • –استبعاد / –استبعاد-من: يسمح لك باستبعاد الأنماط أو قائمة كاملة بالمسارات التي لا تريد نسخها.
  • –link-dest: ينشئ روابط صلبة مع نسخة سابقة، وهو أساس النسخ الاحتياطية التزايدية من نوع Time Machine.

نسخ محلية يدوية وأمثلة أولية

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

إذا كنت ترغب في استنساخ دليل منزلك إلى قرص النسخ الاحتياطي المحليسيكون الأمر البسيط على النحو التالي:

rsync -av /home/usuario/ /mnt/disco_backup/usuario/

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

ومن الأمثلة الكلاسيكية الأخرى التزامن بيانات المشروع، أو الصور، أو المستندات بين مجلدين على نفس الخادم أو حتى أقراص مختلفة، للحصول على لعبة محلية ثانية محدثة دائمًا.

rsync -av /media/fotos/ /backup/fotos/

عندما يتعلق الأمر ببيانات النظام الحساسة، مثل /etc أو /var/wwwمن الطبيعي أن ترغب في نسخة مطابقة تمامًا، بحيث تحذف من النسخة الاحتياطية ما اختفى من النسخة الأصلية. وهنا يأتي دور خيار الحذف الشهير.

rsync -av --delete /var/www/ /backup/www/

rsync لينكس

تأمين النسخ الاحتياطية عن بُعد باستخدام SSH

يتجلى تميز rsync الحقيقي عند دمجه مع SSH لإرسال نسخ من الخادمبهذه الطريقة، يمكنك تخزين بياناتك على جهاز آخر في شبكتك، أو على خادم تخزين متصل بالشبكة (NAS)، أو على خادم افتراضي خاص (VPS) على الإنترنت. وبهذا، لن تعتمد على جهاز واحد فقط، وستلتزم بجزء من قاعدة 3-2-1 الشهيرة (نسخة احتياطية واحدة على الأقل خارج الموقع).

من الأفضل إعداد مصادقة المفتاح العام بدلاً من إدخال كلمات المرور يدويًا في كل مرة. بمجرد نسخ المفتاح إلى خادم النسخ الاحتياطي، تصبح الأوامر سهلة الاستخدام للغاية.

# Empujar datos locales a un servidor remoto de backup
rsync -avz /etc/ backup@servidor-remoto:/backups/etc/

# نقل البيانات من خادم بعيد إلى جهاز النسخ الاحتياطي الخاص بك
rsync -avz backup@remote-server:/var/www/ /backups/www/

في سيناريوهات أكثر دقة، يمكنك التعديل تشفير SSH أو المنفذ أو الضغط من rsync نفسه باستخدام -e، على سبيل المثال إذا كان الخادم الخاص بك يستمع على منفذ مختلف أو كنت تريد تحسين رابط بطيء.

rsync -avz \
-e "ssh -p 2222 -c -o Compression=no" \
/origen/ backup@servidor-remoto:/destino/

تتمثل إحدى الحيل المفيدة عند وجود اتصالات ضعيفة أو شبكات مشتركة في استخدام –bwlimit لتجنب التحميل الزائد على الرابط وعدم ترك أي شخص بدون إنترنت أثناء قيامك بعملية نسخ احتياطي ضخمة.

rsync -avz --bwlimit=5000 /datos/ backup@servidor-remoto:/backups/datos/

النسخ الاحتياطي الكامل والتفاضلي والتزايدي باستخدام rsync

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

النسخ الكامل أمر بسيط: فهو يعيد إنشاء جميع محتويات المصدر في الوجهة، وهو مثالي لأن النسخ الاحتياطي الأولي أو للحصول على مرجع نظيف.

# Copia completa de un árbol de directorios
rsync -a /ruta/origen/ /ruta/destino/

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

# Copia diferencial, manteniendo el destino idéntico al origen
rsync -a --delete /ruta/origen/ /ruta/destino/

أما الجزء الأكثر إثارة فهو النسخ الاحتياطي التزايدي "الحقيقي"، حيث بالإضافة إلى المزامنة، يمكنك حفظ السجلات حسب التاريخ دون تكرار البياناتوهنا يأتي دور خيار –link-dest، الذي يقوم بإنشاء روابط صلبة مقابل نسخة سابقة للملفات التي لم تتغير.

# Copia incremental apoyada en una copia previa
rsync -a --link-dest=/ruta/a/copiaprevia \
/ruta/origen/ /ruta/destino-incremental/

بهذه الطريقة، يبدو كل مجلد نسخ احتياطي وكأنه نسخة كاملة، ولكن داخليًا تتشارك الملفات المتطابقة في الكتل على القرصيؤدي هذا إلى تقليل المساحة المستخدمة بشكل كبير ويسمح بالتنقل بسهولة عبر اللقطات التاريخية.

نسخ احتياطية على غرار Time Machine مع لقطات وروابط صلبة

يرغب الكثير من الناس في محاكاة سهولة استخدام نظام لينكس أداة Time Machine لنظام macOS مع لقطاتها حسب التاريخباستخدام rsync، يصبح ذلك ممكناً تماماً من خلال الجمع بين --link-dest، وبعض الأوامر البرمجية، وبعض التنظيم.

الفكرة هي الاحتفاظ بدليل حالي يشير إلى آخر نسخة احتياطية سليمة، وفي الوقت نفسه إنشاء مجلدات تحتوي على طابع زمني (تاريخ ووقت) تمثل هذه البيانات كل لقطة. ترتبط الملفات غير المتغيرة بروابط صلبة باللقطة السابقة، ولا تُكتب الكتل الجديدة إلا عند وجود اختلافات فعلية.

قد يكون أحد الأوامر النموذجية في هذا المخطط على النحو التالي:

rsync -avPh --delete \
--link-dest="$TARGETDIR/current" \
"$SOURCEDIR/$USER/" \
"$TARGETDIR/$USER-$TIMESTAMP"

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

تأتي الأتمتة بشكل طبيعي: تقوم بحفظ البرنامج النصي في شيء مثل /usr/local/bin/rsync-time-machine وقم بجدولة تشغيله يوميًا باستخدام cron في الوقت الذي يناسبك.

0 5 * * * bash /usr/local/bin/rsync-time-machine

قم بأتمتة عمليات النسخ الاحتياطي باستخدام cron بشكل يومي

يأتي وقت يصبح فيه عمل النسخ يدويًا غير مجدٍ؛ والشيء الطبيعي الذي يجب فعله هو جدولة النسخ الاحتياطية باستخدام cron بحيث يتم تشغيلها تلقائيًا خلال ساعات خارج الذروة (الصباح الباكر، على سبيل المثال) ويمكنك نسيانها باستثناء التحقق من السجلات من وقت لآخر.

العملية دائماً هي نفسها: تقوم بإعداد برنامج نصي يقوم بعمل نسخة كاملة مع جميع الخيارات (الاستثناءات، والسجلات، وما إلى ذلك)، وتمنحه أذونات التنفيذ، وتقوم بتوصيله بجدول المهام الخاص بالمستخدم المناسب أو بالمستخدم الجذر إذا كان ذلك يتضمن تعديل النظام بأكمله.

مثال على نص برمجي بسيط للنسخ المحلي:

#!/bin/bash
SOURCE_DIR="/home"
BACKUP_DIR="/backup/home"
LOG_FILE="/var/log/backup/rsync-local.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

mkdir -p «$BACKUP_DIR» «$(dirname «$LOG_FILE»)»
echo "بدء النسخ الاحتياطي المحلي" >> "$LOG_FILE"

rsync -av --delete
–exclude='*.tmp' \
–exclude='.cache' \
–exclude='Downloads/*' \
«$SOURCE_DIR/» «$BACKUP_DIR/» >> «$LOG_FILE» 2>&1

إذا؛ ثم
echo » اكتمل النسخ الاحتياطي بنجاح» >> «$LOG_FILE»
آخر
echo » النسخ الاحتياطي مع وجود أخطاء» >> «$LOG_FILE»
fi

بمجرد إدخال النص، على سبيل المثال، /usr/local/bin/rsync-local-backup.sh وبعد وضع علامة عليه كملف قابل للتنفيذ، يمكنك إضافته إلى cron بحيث يتم تشغيله في وقت محدد.

sudo chmod +x /usr/local/bin/rsync-local-backup.sh
sudo crontab -e

يمكنك وضع شيء مثل هذا داخل ملف crontab:

0 2 * * * /usr/local/bin/rsync-local-backup.sh

مؤقتات systemd: بديل حديث لـ cron

في الأنظمة الحديثة، غالباً ما يكون ذلك مفيداً استخدم مؤقتات systemd بدلاً من cronخاصة إذا كنت ترغب في تحسين تكامل الخدمات، أو إدارة تبعيات الشبكة، أو الحصول على سجلات مركزية في journalctl.

الفكرة هي تحديد خدمة لتشغيل برنامج النسخ الاحتياطي الخاص بك، ومؤقت لتحديد وقت تشغيله. يمكن أن تكون الخدمة على النحو التالي:


Description=Rsync Backup Service
After=network-online.target
Wants=network-online.target

النوع=oneshot
ExecStart=/usr/local/bin/rsync-remote-backup.sh
المستخدم = الجذر
StandardOutput=journal
الخطأ المعياري = مجلة
TimeoutSec=7200

WantedBy = multi-user.target

وسيتم تعريف المؤقت المرتبط به على النحو التالي، بالنسبة لـ النسخ الاحتياطي اليومي في الساعة 2 صباحًا مع بعض العشوائية حتى لا يطغى على كل شيء دفعة واحدة:


Description=Daily Rsync Backup Timer
Requires=rsync-backup.service

OnCalendar=*-*-* 02:00:00
المستمر = صحيح
تأخير عشوائي بالثواني = 10 دقائق

مطلوب بواسطة = timers.target

وبذلك، كل ما تبقى هو إعادة تحميل نظام systemd، وتفعيل المؤقت، والتحقق من برمجته بشكل صحيح، و يُظهر سجل الخدمة أن النسخ يتم تشغيلها عند حلول الوقت المناسب..

sudo systemctl daemon-reload
sudo systemctl enable --now rsync-backup.timer
systemctl list-timers
journalctl -u rsync-backup.service

قم بتنظيم نسخ احتياطية دورية: يومية، وأسبوعية، وشهرية

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

يتضمن النمط الكلاسيكي وجود دليل حالي يتم تحديثه في كل مرة باستخدام rsync ثم استنساخ تلك الشجرة بروابط صلبة إلى المجلدات اليومية والأسبوعية والشهرية حسب اليوم.

#!/bin/bash
SOURCE_DIR="/var/www"
BACKUP_ROOT="/backup/www"
CURRENT="$BACKUP_ROOT/current"
DAILY="$BACKUP_ROOT/daily"
WEEKLY="$BACKUP_ROOT/weekly"
MONTHLY="$BACKUP_ROOT/monthly"
DATE=$(date +%Y%m%d)
DOW=$(date +%u)
DOM=$(date +%d)

mkdir -p «$CURRENT» «$DAILY» «$WEEKLY» «$MONTHLY»

rsync -av –delete –link-dest=»$CURRENT» \
«$SOURCE_DIR/» «$CURRENT/»

&& cp -al «$CURRENT» «$DAILY/$DATE»
&& cp -al «$CURRENT» «$WEEKLY/$DATE»
&& cp -al «$CURRENT» «$MONTHLY/$DATE»

ابحث عن «$DAILY» -الحد الأقصى للعمق 1 -النوع d -وقت التعديل +7 -تنفيذ rm -rf {} \;
ابحث عن «$WEEKLY» -الحد الأقصى للعمق 1 -النوع d -وقت التعديل +28 -تنفيذ rm -rf {} \;
ابحث عن «$MONTHLY» -الحد الأقصى للعمق 1 -النوع d -وقت التعديل +365 -تنفيذ rm -rf {} \;

مع هذا النظام لديك نافذة تاريخية معقولة إلى حد ما دون ملء القرص بنسخ كاملة، وتبقى كل لقطة قابلة للتصفح مثل مجلد عادي.

إذا كانت بياناتك تتغير بسرعة أو كبيرة جدًا، يمكنك تعديل فترات الاحتفاظ أو الترددات أو حتى دمج ذلك مع لقطات LVM أو ZFS لضمان اتساق قواعد البيانات أو الأجهزة الافتراضية.

راقب وتحقق من مدى فائدة النسخ الاحتياطية الخاصة بك.

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

تتمثل إحدى الطرق البسيطة في ترك علامة صغيرة في مجلد الوجهة في كل مرة تكتمل فيها عملية النسخ الاحتياطي بنجاح، على سبيل المثال، ملف باسم .last-backup-success يحتوي على التاريخ. بعد ذلك، يمكن لبرنامج نصي خارجي، أو حتى فحص Nagios/Icinga، تنبيهك إذا كان هذا الملف قديمًا جدًا.

MARKER="/backup/www/.last-backup-success"
if ; then
echo "Marcador de backup no encontrado"
exit 1
fi

ومن العادات الصحية الأخرى فحص تحقق من سجلات rsync بحثًا عن أخطاء أو معدلات نقل غير معتادةيمنحك البرنامج النصي الذي يستخرج الإحصائيات مثل "عدد الملفات" و"الحجم الإجمالي" و"التسارع" وما شابه ذلك لمحة سريعة عن كيفية سير الأمور.

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

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

المادة ذات الصلة:
دليل كامل لإنشاء نسخ احتياطية متزايدة في Windows