ArkVault: واجهة رسومية لـ BorgBackup حيث يعيد القرص نفسه بناء جهاز لينكس الخاص بك

تاريخ النشر
11 يوليو 2026
بقلم
جاكوب لويد — كُتب بمساعدة الذكاء الاصطناعي بعد إنجاز المشروع
مدة القراءة
قراءة 1 دقيقة

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

وصّل قرص النسخ الاحتياطي بتثبيت لينكس جديد — لا شيء مضبوط، ولا شيء عليه — واحصل على أكثر من مجرد استعادة ملفاتك. يكتب ArkVault عدة استعادة موجَّهة على القرص إلى جانب النسخة الاحتياطية المشفّرة، بحيث يعرف القرص نفسه كيفية إعادة بناء الجهاز: ملفات dotfiles، ومفاتيح SSH، والروابط الرمزية لمشغّلات التطبيقات، ووحدات systemd، وكل شيء آخر.

TL;DR

  • ما هو: واجهة رسومية بتقنية GTK4 (مع واجهة سطر أوامر كاملة بلا واجهة رسومية) تُبنى حول BorgBackup، وتكتب بيان install-map ونسخة من نفسها على كل قرص نسخ احتياطي.
  • تكلفته: مجاني، برخصة MIT. الكود المصدري المضغوط أدناه. لا حساب، لا سحابة.
  • ما تحتاجه: لينكس مزوّد بـ GTK4/libadwaita (مثبّتة مسبقًا على Fedora/GNOME، وسطر واحد عبر apt على Debian/Ubuntu)، وقرص احتياطي، وأمسية واحدة لتعديل كتالوج ما يستحق النسخ.
  • ما ستحصل عليه: نسخة احتياطية مشفّرة وخالية من التكرار، بالإضافة إلى معالج استعادة يعمل مباشرة من القرص على جهاز لم يُثبّت عليه أي شيء. أجريت تمرين الاستعادة فعليًا، وليس فقط في السيناريو المثالي.

ما ستحصل عليه

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

النافذة الرئيسية لـ ArkVault: أداة اختيار وجهة النسخ الاحتياطي، وأربعة مفاتيح تبديل للملفات الشخصية مع تقديرات حجم مباشرة، وشارة قفل على ملف تعريف Settings وDotfiles، وزر 'Back up everything important'

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

معالج الاستعادة في ArkVault يعرض عناصر install-map مجمّعة حسب الفئة — Projects وSettings — مع مربعات اختيار، وأيقونة قفل على عنصر ssh، وزر 'Set options'

هذا هو جوهر الأداة بأكملها: يقرأ معالج الاستعادة ملف install-map من القرص ويعرض بدقة ما جرى نسخه، مجمّعًا وقابلًا للتحديد، مع أيقونة قفل على كل ما هو حساس. لا كتلة بيانات غامضة.

نافذة النسخ الاحتياطي بالسحب والإفلات في ArkVault، مع مجموعة مُسمّاة، ومنطقة إفلات للملفات والمجلدات، وزري 'Add files' و'Add folder'

هناك أيضًا وضع سحب وإفلات لمجموعات لمرة واحدة لا تنتمي إلى الكتالوج الرئيسي.

المقياسالقيمة
الكودنحو 7,100 سطر بايثون موزّعة على 48 ملفًا
اعتماديات pipصفر — GTK يأتي من النظام، وملف requirements.txt فارغ عمدًا
حزمة الاختبارات82 من أصل 82 فحصًا ناجحًا، دون الحاجة إلى pytest
حجم الملف المضغوط108 كيلوبايت، 53 عنصرًا (ملف Borg التنفيذي غير مرفق — المثبّت يجلبه)
نتيجة تمرين الاستعادة8 من أصل 8 عناصر استُعيدت بشكل صحيح في مجلد $HOME ثانٍ وجديد تمامًا
الرخصةMIT، مجانية

ما الذي يقدّمه لك Borg فعليًا

ArkVault ليس محرّك نسخ احتياطي بحد ذاته. إنه واجهة أمامية حول BorgBackup، الذي يتولى الأجزاء الصعبة:

  • التشفير: repokey-blake2. يعيش المفتاح داخل المستودع، محميًا بعبارة مرورك. من يسرق القرص لن يحصل على شيء.
  • إزالة التكرار: تجزئة معتمدة على المحتوى، بحيث لا تكلّف عشر لقطات لمجلد منزلي بطيء التغيّر عشرة أضعاف المساحة.
  • الضغط: zstd عند المستوى 6. تقليص جيد للحجم دون إبطاء النسخ الاحتياطي إلى حد الزحف.
  • سياسة الاحتفاظ: يحتفظ borg prune افتراضيًا بـ 7 نسخ يومية و4 أسبوعية و6 شهرية (قابلة للتعديل)، بحيث تنتهي صلاحية اللقطات القديمة تدريجيًا بدلًا من التهام مساحة القرص.

يضيف ArkVault الجزء الذي لا يهتم به Borg: أي الملفات مهمة، وما الأذونات التي تحتاجها، وما الذي يجب أن يحدث بعد وصول الملفات حتى يعمل الجهاز فعليًا من جديد.

لماذا فرضت التوزيعة غير القابلة للتعديل تصميمًا مختلفًا

بنيت هذه الأداة لجهاز يعمل بتوزيعة Bazzite — نسخة Fedora ذرّية وغير قابلة للتعديل، بجذر للقراءة فقط. هذا القيد شكّل الأداة بأكملها:

  • كل شيء يُثبَّت تحت ~/.local. لا شيء يلمس /.
  • تُبنى البيئة الافتراضية venv بخيار --system-site-packages حتى تأتي GTK4/PyGObject من النظام المضيف بدلًا من ترجمة الربط مقابل قاعدة للقراءة فقط.
  • pip install borgbackup لا يعمل هنا إطلاقًا — لا رؤوس liblz4، ولا حزم wheel مطابقة — وهذا هو السبب الحقيقي وراء تنزيل المثبّت لـملف Borg التنفيذي المستقل الرسمي من المصدر، وهو بناء بـ PyInstaller مع FUSE مدمج فيه.
  • لا وجود لـ sudo في أي مكان. العملية الوحيدة التي تحتاج صلاحيات الجذر — تهيئة قرص — تمر عبر طلب تأكيد polkit/pkexec.

الفكرة الأساسية: القرص يعيد بناء الجهاز

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

  • arkvault-repo/ — مستودع Borg المشفّر.
  • ArkVault-App/ — نسخة ذاتية التضمين من ArkVault، بالكود المصدري والمثبّت، تُنسخ بشكل ذري (مجلد مؤقت ثم إعادة تسمية) بحيث لا تترك عملية نسخ متقطعة تطبيقًا ناقصًا على القرص.
  • arkvault-install-map.json بالإضافة إلى RESTORE-README.md — بيان بكل ما جرى نسخه، وشرح نصي بسيط يمكن قراءته دون أي أدوات إضافية.

يسجّل ملف install-map أن ملفًا ما سرّي، لكنه لا يسجّل محتواه أبدًا. القرص يعرف ما يحمله دون أن يفشي أيًا منه.

ما الذي يحدث فعليًا أثناء تشغيل النسخ الاحتياطي

عملية النسخ الاحتياطي مسار مباشر: اكتشاف ما يطابقه الكتالوج (المسارات المفقودة تُتخطّى)، ثم تهدئة اختيارية للخدمات كثيفة الكتابة حتى تصل قواعد البيانات الحيّة بحالة متّسقة، ثم borg create، ثم borg prune، وأخيرًا كتابة عدة الاستعادة على القرص.

الأجزاء المفرطة في الحذر

هذا هو الكود الذي استغرق الوقت الأطول:

  • حارس التهيئة يرفض قرص النظام. تهيئة القرص الخطأ هي الكارثة الكلاسيكية لأدوات النسخ الاحتياطي. يحلّل ArkVault سلاسل device-mapper الخاصة بـ LUKS/LVM وصولًا إلى الأقراص الفعلية بتتبّع /sys/class/block/*/slaves — فاسم مُعرِّف الجذر المشفّر لا يشبه القرص الأساسي إطلاقًا، لذا تفشل الفحوصات الساذجة بالاسم في اكتشافه. وإذا تعذّر عليه حصر أقراص النظام إطلاقًا، فإنه يفشل بأمان ويرفض تهيئة أي شيء. ورغم ذلك، عليك كتابة اسم الجهاز بالضبط للتأكيد.
  • احتواء المسارات أثناء الاستعادة. ملف install-map المشوَّه أو المتلاعَب به لا يستطيع الكتابة خارج مجلد المستخدم المستهدف: تُحلّ الروابط الرمزية للمجلدات الأعلى، أما الرابط الرمزي الطرفي فلا يُتّبع عمدًا، وأي هدف إعادة نشر يحاول الخروج من مجلد المستخدم يُرفض.
  • نظافة الأسرار في السجلات. تُمحى عبارة المرور وأي شيء مسجَّل كسرّي عبر مطابقة حرفية بالإضافة إلى تعابير نمطية احتياطية لأنماط مثل apiKey: وBearer.
  • ورقة الاسترداد. أول نسخة احتياطية تعرض ورقة عبارة مرور بنص غير قابل للتحديد — لمنع النسخ العرضي إلى الحافظة — ويبقى زر الإغلاق معطّلًا حتى تضع علامة على "لقد حفظت عبارة مروري". لا تُكتب هذه الورقة على القرص أبدًا. إن فقدت عبارة المرور، فقدت النسخة الاحتياطية. هذا هو المعنى الحقيقي للتشفير.
  • يُرفض نظام FAT32 كوجهة للمستودع — فحد حجم الملف عنده وهو 4 غيغابايت يعطّل Borg تمامًا. أما exFAT فمسموح مع تحذير، لأن Borg يخزّن بيانات Unix الوصفية داخليًا على أي حال.
  • تُرفض الأرشيفات الفارغة. إذا اختفت كل مسارات المصدر (قرص غير مركَّب، خطأ إملائي في الكتالوج)، يرفض ArkVault كتابة أرشيف فارغ قد يبدو وكأنه نجح.
  • التحقّق منوط بك، متى شئت. يعمل borg check من الواجهة الرسومية أو سطر الأوامر كفحص سلامة حقيقي، وميزة "Browse snapshot" تركّب الأرشيف للقراءة فقط عبر FUSE حتى تستطيع تفقّده قبل أن تثق به.

الإعداد

تحتاج روابط PyGObject لـ GTK4/libadwaita، وudisks2، وpolkit. مثبّتة مسبقًا على عائلة Fedora/GNOME؛ وسطر واحد على Debian/Ubuntu:

sudo apt install python3-gi gir1.2-gtk-4.0 gir1.2-adw-1

ثم المثبّت، وهو مصمَّم ليكون متكررًا بأمان — يمكن إعادة تشغيله دون خطر:

bash install.sh

هذا ينسخ التطبيق إلى ~/.local/share/arkvault، ويبني بيئة venv بخيار --system-site-packages، وينزّل ملف Borg التنفيذي المستقل الرسمي، ويضع ~/.local/bin/arkvault بالإضافة إلى مدخل سطح مكتب. ثم:

arkvault probe

يجب أن يظهر كل شيء بحالة OK. تشغيل arkvault وحده يطلق الواجهة الرسومية؛ ونفس النواة تشغّل أيضًا واجهة سطر أوامر بلا واجهة رسومية:

arkvault probe|backup|restore|list|check

الخطوة الوحيدة التي تهم فعلًا: عدّل الكتالوج. الكتالوج المرفق مثال عام — تحتوي الملفات core/discovery.py وprofiles.py وcore/quiesce.py وcore/containers.py وcore/installmap.py جميعها على كتل موسومة بـ"EDIT ME". قائمة منتقاة بعناية لما لا يستطيع التثبيت الجديد إعادته هي بيت القصيد كله، ولا أحد يستطيع كتابة قائمتك أنت غيرك.

شغّل أول نسخة احتياطية، واحفظ ورقة الاسترداد في مكان غير قرص النسخ الاحتياطي، وانقر "Copy app to drive". للتشغيل غير المراقَب هناك قالب مؤقّت systemd للمستخدم في README-SETUP؛ يقرأ عبارة المرور من مدير المفاتيح (keyring) أو من ARKVAULT_PASSPHRASE.

إثبات أنه يعمل فعلًا

النسخة الاحتياطية التي لم تختبر استعادتها يومًا ليست نسخة احتياطية، بل أمنية. لذا، وبمواجهة مجلد $HOME وهمي:

  1. فككت ضغط الكود المصدري، وشغّلت install.sh — تنزيل حقيقي لـ Borg بحجم 27.9 ميغابايت.
  2. arkvault probe: كل شيء سليم.
  3. arkvault backup لثلاثة ملفات تعريف نموذجية إلى مجلد قرص تجريبي: دخول 8 عناصر، وتهيئة المستودع بـ repokey-blake2، وكتابة install-map + RESTORE-README + النسخة الذاتية التضمين.
  4. arkvault list، ثم arkvault check: نجح الفحص.
  5. arkvault restore إلى مجلد منزلي ثانٍ جديد تمامًا: وصلت كل العناصر الثمانية إلى مساراتها الصحيحة، وطُبعت قائمة تحقّق يدوية لما تبقّى.

حزمة الاختبارات الخالية من الاعتماديات تنجح بمعدل 82 من 82 على الشجرة نفسها الموجودة في الملف المضغوط.

مطبّات يجب الانتباه لها

  • الملف المضغوط يصلح علّة كانت في سكربت التثبيت الأصلي. إصدارات Borg على GitHub تُشحن بتوقيع GPG بامتداد .asc لكن دون ملف .sha256 مرافق، فكان طلب المثبّت لملخّص التحقّق يفشل برمز 404، وكان set -e يقتل عملية التثبيت قبل أن يعمل الحل الاحتياطي في السكربت نفسه. تم إصلاح ذلك هنا، بالإضافة إلى متغير بيئة اختياري ARKVAULT_BORG_SHA256 لتثبيت بصمة (hash) معروفة وصحيحة. جهازي الشخصي لم يصادف هذه العلة قط — كان ملف Borg التنفيذي موجودًا لديّ مسبقًا، فلم يعمل فرع التنزيل أصلًا.
  • نظام FAT32 سيفسد أسبوعك بصمت. يكتشفه ArkVault ويرفضه، لكن الكثير من أقراص USB تأتي مهيّأة بهذا النظام من المصنع.
  • التشغيل الذي ينهار يترك قفل مستودع عالقًا. يزيله borg break-lock (وله زر في الواجهة الرسومية)، ويجعل BORG_LOCK_WAIT=120 عمليات التشغيل المتداخلة تنتظر بدلًا من أن تفشل فورًا.
  • قاعدة بيانات SQLite النشطة في وضع WAL تحتاج إلى نسخ ملفات db وwal وshm معًا، أو إيقاف الخدمة أولًا. لهذا السبب توجد خطوة التهدئة (quiesce) — وإعادة تشغيلها موضوعة داخل كتلة finally، بحيث تعود الخدمات حتى لو تعطّلت عملية النسخ الاحتياطي في منتصف الطريق.
  • الاستعادة تحت اسم مستخدم مختلف تعمل، لأن كل وجهة مسجَّلة بشكل نسبي لمجلد المستخدم. الملكية التي يتعذّر ربطها بالمستخدم الجديد تُدرج في قائمة التحقّق اليدوية بدلًا من أن تُتخطّى بصمت.
  • لا يوجد مدير مفاتيح GNOME (جهاز بلا واجهة رسومية، أو بيئة CI)؟ يتراجع الأداء إلى عبارة مرور في الذاكرة مع طلب تأكيد بدلًا من الفشل.
  • العلة المملة: كان python -m arkvault backup ... لا يفعل شيئًا بصمت — كان محلّل وسائط الواجهة الرسومية يبتلع الأمر الفرعي ويخرج برمز 0. الآن يوجّه __main__.py الأوامر الفرعية لسطر الأوامر بشكل صريح. الأخطاء المخيفة تعلن عن نفسها؛ أما الخطيرة فتخرج بهدوء دون أن تفعل شيئًا.
  • الكتالوج المرفق مثال فارغ عن قصد. الكتالوج الذي أستخدمه فعليًا يحدد بدقة أين تعيش أشياءي المهمة، وهذا بالضبط ما لا يجب أن يُشحن في ملف مضغوط عام. بدلًا من ذلك تحصل على مثال نظيف لـ Projects/Settings مع نموذج إعادة نشر مُجرَّب — البنية نفسها، دون أي من مساراتي الشخصية.

التنزيلات

مجاني للاستخدام الشخصي. إذا وفّر لك عصرًا كاملًا من الوقت، فزر القهوة قريب منك.


← المزيد من الأدوات والتنزيلات