rsyncالأمر: rsync -aE --delete ~/Documents/ /Volumes/Backup/Documents/
-E هو النصف الخاص بـ macOS، وإغفاله يُفقد السمات الموسّعة وتفرعات الموارد بصمت.
-a هو وضع الأرشفة: يعمل بشكل متكرر عبر المجلدات، ويحافظ على الأذونات والملكية والطوابع الزمنية والروابط الرمزية. إنه الخيار الذي يعرفه الجميع.-E على السمات الموسّعة في macOS وتفرعات الموارد. وسوم Finder، وعلامات الحجر، والأيقونات المخصصة، وقدر كبير من البيانات الوصفية للتطبيقات موجودة هناك. من دونه تختفي، ولا يخبرك شيء.--delete الملفات من الوجهة بمجرد اختفائها من المصدر. هذا ما يجعل النسخة مرآة، وهو الخيار الذي يستحق أكبر قدر من التفكير.-v للمخرجات، و-n للتشغيل التجريبي. شغّل دائمًا تشغيلًا تجريبيًا لأي أمر فيه --delete في المرة الأولى.~/Documents ينسخ المجلد إلى داخل الوجهة، فتحصل على /Volumes/Backup/Documents/Documents. أما ~/Documents/ فينسخ محتواه، وهذا ما قصدته في الغالب. وفي أمر يتضمن أيضًا --delete، الخطأ في ذلك يحذف كل ما كان في الوجهة غير ذلك.--exclude للأشياء التي لا تستحق النسخ: --exclude '.DS_Store'، --exclude 'node_modules'، --exclude 'Library/Caches'.يأتي macOS بإصدار من rsync يكفي لهذا. إذا أردت الإصدار الأحدث من المصدر، فهو متوفر في Homebrew، وتعامله مع ACL على macOS أفضل.
يجعل rsync الوجهة تبدو مثل المصدر. هذه نسخة، والنسخة ليست سجلًا. المستند الذي حذفته يوم الثلاثاء الماضي يختفي من النسخة الاحتياطية في التشغيل التالي. وكذلك الإصدار السليم من ملف كتبت فوقه منذ ذلك الحين، وكذلك كل ما وصلت إليه برامج الفدية قبل أن تعمل المهمة.
إسقاط --delete لا يصلح هذا. يعطيك وجهة تتراكم فيها كل الملفات التي امتلكتها يومًا، ولا يزال لكل منها إصدار واحد بالضبط، ولا طريقة لمعرفة الحالي منها.
--link-destالحيلة المعتادة هي إنشاء مجلد جديد مؤرخ في كل تشغيل وربط الملفات غير المتغيرة بالمجلد السابق بروابط صلبة، فلا تكلف الملفات المتطابقة شيئًا:
DEST=/Volumes/Backup
TODAY=$(date +%F)
rsync -aE --delete \
--link-dest="$DEST/latest" \
~/Documents "$DEST/$TODAY"
ln -snf "$DEST/$TODAY" "$DEST/latest"
الآن يبدو كل مجلد مؤرخ نسخة احتياطية كاملة ولا تشغل المساحة إلا الملفات المتغيرة. هذه تقريبًا الفكرة التي بُني عليها Time Machine.
تنبيهان. الروابط الصلبة تعني أن النسخ ليست مستقلة: التلف في الكتلة الأساسية يؤثر في كل لقطة تشاركها. وتحتاج إلى نظام ملفات يدعم الروابط الصلبة، فهي تعمل على قرص خارجي ولا تعمل داخل معظم المجلدات السحابية.
لا يشفّر rsync أي شيء أثناء التخزين. إذا كانت الوجهة مجلدًا سحابيًا أو قرصًا يغادر المبنى، فشفّر قبل أن تكتب:
tar -cJf - ~/Documents | openssl enc -aes-256-cbc -pbkdf2 -out /Volumes/Backup/documents.tar.xz.enc
هذا أرشيف واحد مغلق: لا نسخ تزايدي، ولا استعادة لملف واحد دون فك الأرشيف كله، و عبارة مرور واحدة بينك وبين كل شيء. هذه المقايضة مهمة، وعندها يتوقف معظم الناس عن الحلول اليدوية.
لا يزال cron موجودًا على macOS لكن launchd هو الطريق المدعوم. ملف plist في ~/Library/LaunchAgents/ مع StartCalendarInterval يشغّل السكربت يوميًا. سيطلب macOS الوصول الكامل إلى القرص لما يشغّله، لأن قراءة المستندات وسطح المكتب محمية.
أيًّا كان ما تجدوله، اجعله يكتب نتيجته في مكان ستراه فعلًا، وتحقق من أن النسخة الاحتياطية حديثة:
find /Volumes/Backup -type f -newermt '-7 days' | head
المهمة الصامتة هي نمط الإخفاق. لا تتوقف برسالة خطأ على شاشتك، بل تتوقف في الليل قبل أربعة أشهر.
الأوامر أعلاه تغطي النسخ. ما لا تغطيه هو ما تريده فعلًا في اليوم الذي يحدث فيه خلل: إصدارات تصمد بعد تشغيل المرآة، وتشفير يتيح لك استعادة ملف واحد، وقراءة تتحقق من كل قطعة مقابل تجزئتها، وشيء يخبرك حين لا يُرى القرص لأسبوع.
كلٌّ من هذه يكلّف عطلة نهاية أسبوع من كتابة السكربتات، ثم تصبح صيانتها مسؤوليتك. Copy Shelter هو الفكرة نفسها مع تلك الأجزاء مدمجة، وهو مجاني لموقع واحد.
rsync وسوم Finder؟لأن -a وحده لا ينقل السمات الموسّعة على macOS. أضف -E. وإذا كنت تحتاج أيضًا إلى ACL، فاستخدم -A، وفكّر في إصدار Homebrew الذي يتعامل معها بموثوقية أكبر من إصدار النظام.
نعم، إما إلى مشاركة مربوطة تحت /Volumes أو عبر SSH إلى NAS نفسه. عبر SSH أسرع ولا يعتمد على وجود الربط، وكثير من أجهزة NAS فيها rsync مدمج.
sudo؟ليس لمجلد المنزل الخاص بك. لكنك تحتاج إلى منح الوصول الكامل إلى القرص لتطبيق Terminal، أو لما يشغّله launchd، قبل أن يسمح macOS له بقراءة المستندات وسطح المكتب والتنزيلات.
--delete خطير؟إنه يفعل بالضبط ما طلبته، وهذا هو الجزء الخطير. جرّب تشغيلًا تجريبيًا بـ -n في المرة الأولى، وتأكد من صحة مسار الوجهة: خطأ مطبعي مع --delete موجّه إلى المجلد الخطأ يزيل الملفات هناك.
نعم، هذا ما صُمم له rsync. شغّله مرة أخرى وسينقل فقط ما هو ناقص أو معدّل. أضف --partial ليُحفظ الملف الكبير المنقول جزئيًا ويُستأنف.
التالي: كيف تتحقق من أن النسخة قابلة للقراءة فعلًا.