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

الاعتماد على برنامج نصي بسيط من نوع Bash مع جدولة دقيقة عبر cron يوفّر حلاً عمليًا ومستقرًا لأتمتة النسخ الاحتياطي بالكامل. هذا الأسلوب يمنحك تحكمًا كاملًا في ما يتم نسخه، ومتى يتم ذلك، وأين تُحفَظ البيانات، دون الاعتماد على واجهات رسومية ثقيلة أو محدودة.
الواجهات الرسومية قد تبدو أسهل للمستخدم العادي، لكنها غالبًا تستهلك موارد إضافية، وتفتقر إلى المرونة، وتكون أقل ملاءمة للخوادم أو الأنظمة التي تعمل دون بيئة رسومية. في المقابل، الأتمتة عبر الطرفية تضمن الاعتمادية والوضوح وسهولة الصيانة.
اعتماد هذا النهج يجعل النسخ الاحتياطي جزءًا ثابتًا من النظام يعمل في الخلفية بصمت وكفاءة، وهو ما يبحث عنه المستخدمون المحترفون ومديرو الأنظمة.
ملخص
- أنشئ سكربت باش يتحكم في نوع ومكان ووقت تشغيل النسخ الاحتياطية.
- جدول تشغيل الملف التنفيذي backup.sh باستخدام cron، وراجع سجلات النظام ووجهة النسخ الاحتياطية بعد كل تشغيل.
- اختبر السكربت، واستخدم المسارات المطلقة لتجنب أخطاء cron وأخطاء وقت التشغيل، واستخدم التعليقات للتوثيق.
تُعد أداة مثل Déjà Dup طريقة رسومية سهلة وممتازة لأتمتة النسخ الاحتياطية على نظام Linux. مع ذلك، يُعد إنشاء سكربت نسخ احتياطي الطريقة الأمثل والأكثر فعالية لأتمتة النسخ الاحتياطية. فهو يوفر تحكمًا أكبر بكثير في نوع ومكان حفظ البيانات، وعدد مرات النسخ الاحتياطي. كما أنه يُعد مدخلاً ممتعًا لأساسيات البرمجة النصية. إليك كيفية إنشاء سكربت نسخ احتياطي بسيط واستخدام cron لأتمتة عمليات النسخ الاحتياطي.
إنشاء سكربت نسخ احتياطي بسيط وأتمتته
طالما أنك تُعدّل وتُحدّث السكربت بمساراتك المطلقة، يُمكن أن يكون موقع النسخ الاحتياطي مجلدًا محليًا، أو قسمًا جديدًا من القرص، أو قرصًا خارجيًا.
اختيار وجهة النسخ الاحتياطي
كانت الخطة هي إنشاء برنامج نصي بسيط للنسخ الاحتياطي، ولكنني أردت أيضًا نسخة من مجلدات لينكس الأساسية، تحسبًا لأي طارئ قد أحتاج فيه إلى استعادة النظام. كانت وجهة النسخ الاحتياطي لهذا المشروع عبارة عن ذاكرة فلاش USB بسعة 128 جيجابايت.
تجهيز موقع النسخ الاحتياطي
سواءً كان موقع النسخ الاحتياطي لديك هو ذاكرة فلاش USB، أو قرص صلب خارجي، أو قسم جديد، انتبه إلى مسارات المجلدات المطلقة ونقاط التحميل؛ ستحتاج إليها عند بدء كتابة البرنامج النصي.
ملاحظة: يستخدم هذا البرنامج النصي للنسخ الاحتياطي أداة rsync، وهي عادةً ما تكون مثبتة مسبقًا على معظم توزيعات لينكس. تأكد من إصدار rsync لديك، وإذا لم يكن مثبتًا، فاستخدم مدير الحزم لتثبيته.
بدأتُ المشروع بإنشاء مجلد جديد باسم “Backup” على ذاكرة فلاش USB المُحمّلة. يمكنك إنشاء هذا المجلد باستخدام واجهة سطر الأوامر بالانتقال إلى موقع النسخ الاحتياطي ثم استخدام اختصار لوحة المفاتيح Ctrl+SHIFT+N. اخترتُ استخدام سطر الأوامر واستخدمتُ أوامر lsblk وcd وmkdir.
lsblk
cd “/media/htg/DATA BACKUP”
mkdir backup
rsync --version
sudo apt update -y && sudo apt install rsync
تحديد ما يجب نسخه احتياطيًا وإنشاء سكربت backup.sh
لأغراض استعادة النظام، اخترتُ نسخ مجلد يحتوي على ملفاتي الشخصية المدمجة ومجلدات لينكس الأساسية مثل /home و/etc و/var و/usr/local و/root و/opt. تدعم معظم محررات النصوص الطرفية في لينكس كتابة البرامج النصية الأساسية. استخدمتُ nano لإنشاء وحفظ سكربت backup.sh بسيط باستخدام bash في المجلد الرئيسي. انسخ السكربت التالي والصقه في محرر النصوص الطرفي الذي تفضله:
#!/bin/bash
# This bash script backs up Linux recovery directories and personal files
# Preserves ownership, permissions, timestamps, ACLs, and xattrs
set -euo pipefail
#------------This is the CONFIG script-----------
HOSTNAME="$(hostname)"
DATE="$(date +%F)"
BACKUP_ROOT="/media/htg/DATA BACKUP/Backup"
DEST_DIR="$BACKUP_ROOT/archives/${HOSTNAME}_${DATE}"
LOG_FILE="BACKUP_ROOT/logs/backup_${HOSTNAME}_${DATE}.log"
TMP_DIR="$BACKUP_ROOT/tmp"
#Don't forget to edit the BACKUP_ROOT, DEST_DIR, LOG_FILE and TMP_DIR paths
#Customize SOURCES=( to include the files and directories you want to back up
SOURCES=(
"/home"
"/etc"
"/var"
"/root"
"/opt"
"/usr/local"
"/home/htg/Backup"
)
EXCLUDES=(
"--exclude=/var/cache/"
"--exclude=/var/tmp/"
"--exclude=/var/lib/apt/lists/"
"--exclude=/home/*/.cache/"
"--exclude=/home/*/Downloads/"
"--exclude=/var/lib/docker/"
"--exclude=/var/lib/containers/"
)
# Add these flags for backup summary and progress:
# --info=progress2: Total progress line
# --info=name0: Hide individual filenames
# --stats: Final summary block
# --no-inc-recursive: Better progress accuracy
RSYNC_FLAGS=(-aAXH --numeric-ids --delete --human-readable --inplace --partial --info=progress2 --info=name0 --stats --no-inc-recursive)
# ---------- PREPARATION ----------
# Create destination folders on the flash drive
mkdir -p "$DEST_DIR" "$TMP_DIR" "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"
# ---------- BACKUP ----------
echo "[$(date)] Starting backup to $DEST_DIR" | tee -a "$LOG_FILE"
for SRC in "${SOURCES[@]}"; do
echo "[$(date)] Backing up $SRC ..." | tee -a "$LOG_FILE"
# Run rsync and log output
rsync "${RSYNC_FLAGS[@]}" "${EXCLUDES[@]}" "$SRC" "$DEST_DIR" >>"$LOG_FILE" 2>&1
done
echo "[$(date)] Backup completed" | tee -a "$LOG_FILE"
# ---------- VERIFY ----------
echo "[$(date)] Listing destination sizes:" | tee -a "$LOG_FILE"
du -sh "$DEST_DIR"/* 2>/dev/null | tee -a "$LOG_FILE"
exit 0
عدّل البرنامج النصي باستبدال BACKUP_ROOT وDEST_DIR وLOG_FILE وTMP_DIR بمساراتك المطلقة، ثم احفظ التغييرات واخرج. في محرر النصوص nano، استخدم Ctrl+O+Enter وCtrl+X. الخطوة التالية هي استخدام الأمر chmod لجعل البرنامج النصي قابلاً للتنفيذ، والأمر ls للتأكد من صلاحية التنفيذ (ابحث عن -x).
nano ~/backup.sh
chmod +x ~/backup.sh
ls -l ~/backup.sh
اختبار برنامج النسخ الاحتياطي وأتمتته باستخدام مهام cron
~/backup.sh
sudo ~/backup.sh



لن يعمل البرنامج النصي بنجاح في حال حدوث أخطاء، ولكن النظام سيعرضها لك، ويمكنك حينها استكشاف الأخطاء وإصلاحها. إذا سارت الأمور على ما يرام، فسترى رسالتي “بدء النسخ الاحتياطي” و”نسخ /home احتياطيًا”. عند الانتقال إلى وجهة النسخ الاحتياطي، ستجد بعض المجلدات التي تم نسخها احتياطيًا.
ملاحظة
إذا كنتَ تُجري نسخًا احتياطيًا لبيانات كثيرة على قرص خارجي، فقد تستغرق العملية بعض الوقت. طالما لم تظهر لك رسالة خطأ، تحلَّ بالصبر، حتى لو بدا أن نافذة الأوامر قد توقفت.
بعد اختبار البرنامج النصي والتأكد من عمله، استخدمتُ أداة cron لجدولة تشغيله في الساعة 8:00 مساءً، والأمر ls للتأكد من مهمة النسخ الاحتياطي المُجدولة، والأمر systemctl للتحقق من حالة خدمة cron.



sudo crontab -e
0 20 * * * /usr/bin/bash /home/htg/backup.sh >> "/media/htg/DATA BACKUP/Backup/logs/cron_backup.log" 2>&1
sudo crontab -l
ls -l /home/htg/backup.sh
systemctl status cron
في هذه المرحلة، كنت قد أنشأتُ واختبرتُ بنجاح برنامج النسخ الاحتياطي، واستخدمتُ أداة cron لأتمتته. كانت الخطوة الأخيرة هي تأكيد عملية النسخ الاحتياطي ومراجعة السجلات بعد الساعة الثامنة مساءً من اليوم التالي.
الدروس الثلاثة التي تعلمتها بصعوبة
كان إنشاء برنامج النسخ الاحتياطي هذا تجربة ممتعة ومفيدة. علمني المشروع ثلاثة دروس ما زالت عالقة في ذهني حتى اليوم.
اختبر برامج النسخ الاحتياطي دائمًا
لم أختبر برنامج النسخ الاحتياطي الأول. هل يمكنك تخمين ما حدث؟ صحيح: عندما شغّلتُ نسخة احتياطية تجريبية، فشل البرنامج. استغرق الأمر بعض الوقت لأكتشف أنني أخطأتُ في متغير shell؛ فقد كتبتُ DATE+”$(date +%F)” بدلًا من DATE=”$(date +%F)”، مما تسبب في ظهور خطأ “الأمر غير موجود” في السطر 10.



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

التعليق على سكربتك أشبه بترك ملاحظات لنفسك (ولغيرك) تشرح الغرض من جزء أو قسم معين من السكربت. في برمجة bash، يُعد رمز المربع (#) الطريقة الأكثر شيوعًا للتعليق. ربما لاحظتَ وجود عدة تعليقات على سكربت bash الخاص بي.
لنفترض أنك بحاجة لتعديل نص برمجي بعد ستة أشهر من إنشائه. بدون التعليقات، تزداد احتمالية تعديل أجزاء أساسية منه بشكل خاطئ، مما قد يؤدي إلى تعطل النص، لأن النص لم يعد حاضرًا في ذهنك.
هكذا قمتُ بأتمتة نسخ احتياطية لنظام لينكس باستخدام نص برمجي بسيط بلغة باش، وهذه هي الدروس الثلاثة التي تعلمتها بعد تجربة مريرة. صحيح أن كتابة النصوص البرمجية ليست أسهل طريقة لأتمتة النسخ الاحتياطية، إلا أنها ممتعة ومفيدة، خاصةً إذا كنت ترغب في تعلم أساسيات كتابة نصوص باش.
أتمتة النسخ الاحتياطي في لينكس باستخدام Bash و cron ليست مجرد خيار تقني متقدم، بل خطوة أساسية لضمان استمرارية البيانات وتقليل الأخطاء البشرية. هذا الأسلوب يجمع بين البساطة والاعتمادية والتحكم الكامل.
إذا كنت تبحث عن حل ثابت يعمل دون تدخل يومي ويمنحك راحة البال، فابدأ بإنشاء برنامج نصي بسيط وجدولته بشكل منتظم، وستلاحظ الفرق الحقيقي مقارنة بالاعتماد على الواجهات الرسومية.



