apt purge أزال الـ VPN لكن الخدمة ما زالت تبدأ عند الإقلاع
apt purge يحذف ملفات الحزمة، لا وحدة systemd التي أنشأها سكربت المورّد. احذف الوحدة ورابط wants، ثم اختر مالكاً واحداً للإقلاع.
يقول apt purge إن الحزمة اختفت، ومع ذلك ما زال النفق يعود عند كل إقلاع. سجل journal يواصل النمو، والمسارات تعود، والجهاز يتصرف كأن شيئاً لم يُحذف. يمكن لمثبّت المورّد أن يكتب ملفات لم يسجّلها مدير الحزم قط، لذا فإن إزالة الحزمة وإزالة المنتج مهمتان مختلفتان. يفصل دليل التشغيل أدناه بين السجلين وينهي الإزالة عمداً.
مثبّتان، وسجلّان مختلفان
تحتفظ حزم Debian بقائمة ملفات، و purge يحذف بالضبط ما تسميه تلك القائمة إضافة إلى إعدادات الحزمة. مثبّت shell أو حزمة .run لا يحتفظ بقائمة كهذه؛ يكتب حيث يشاء، عادةً في /opt و/usr/local و/etc/systemd/system. لا يظهر أي من هذه المسارات في قائمة ملفات أي حزمة، لذا لا يعرف dpkg عنها ولا يبلّغ بها. ينتهي بك الأمر بمالكين للتنصيب على نظام ملفات واحد، وواحد فقط منهما يحتفظ بالسجلات.
اسأل dpkg عن المسار المحدد قبل حذفه. المسار الذي يتبرأ منه هو لك لتحذفه، والإجابة نفسها تخبرك هل سيعيده تحديث لاحق.
dpkg -S /etc/systemd/system/acmevpn.service
systemctl list-unit-files | grep -i acmevpn
الوحدة ورابط wants ملفان منفصلان
التفعيل فعل منفصل عن التنصيب. تعلن الوحدة علاقات الأهداف في قسم [Install]، ويحوّل systemctl enable تلك الإعلانات إلى روابط رمزية داخل دليل .wants/ لكل هدف. يوجد الآن مساران: ملف الوحدة، والرابط الذي يسحبه إلى هدف إقلاع. احذف الملف وحده وسيشير الرابط إلى لا شيء، ما ينتج شكوى عند الإقلاع؛ واحذف الرابط وحده وتبقى الوحدة قابلة للتشغيل بالاسم. يجب أن يزول الاثنان.
أزلهما بالترتيب ثم أعد التحميل، حتى يتوقف systemd عن الاحتفاظ بالتعريفات القديمة في الذاكرة.
systemctl disable --now acmevpn.service
systemctl show -p FragmentPath -p ExecStart acmevpn.service
sudo rm /etc/systemd/system/acmevpn.service
sudo rm /etc/systemd/system/multi-user.target.wants/acmevpn.service
systemctl daemon-reload
اقرأ FragmentPath بدل افتراض الموقع، لأن المورّد ربما كتب في /usr/lib/systemd/system أو /lib/systemd/system بدل /etc. حذف النسخة التي توقعتها يترك النسخة الفعّالة تعمل، ويبدو الإصلاح ناجحاً حتى إعادة التحميل التالية. اسرد ملفات الوحدات مرة أخرى بعد انتهاء إعادة التحميل، وتأكد أن الاسم لم يعد يظهر.
اعثر على الملف التنفيذي الذي يبقي الترتيب حياً
الوحدة المفعّلة تواصل تشغيل الخدمة مهما اعتقدت قاعدة بيانات الحزم. يمكن لتلك العملية أن تعيد النفق، أو تضيف المسارات من جديد، أو تستعيد قاعدة kill-switch، ويبدو السلوك خارقاً حتى تفحص التخطيط. اتبع مسار ExecStart وتحقق هل الملف التنفيذي ما زال هناك، لأن ملفاً تنفيذياً متروكاً تحت /opt هو كل ما يحتاجه الترتيب. حذف الوحدة يوقف البدء المجدول؛ ولا يحذف البرنامج.
تعامل مع أدلة الحالة بالعناية نفسها. رموز الحساب والملفات الشخصية المولّدة وقوائم الخوادم المخبأة تعيش تحت /var/lib أو في دليل المنزل، وهي بيانات اعتماد لا ذاكرة مؤقتة تُرمى. أزلها بعد إيقاف الخدمة، عمداً، ودوّن ما أخذته.
sudo ls -l /opt/acmevpn /usr/local/bin/acmevpn
sudo find /var/lib -maxdepth 2 -iname "*acme*"
systemctl is-enabled acmevpn.service
اختر مالك إقلاع واحداً واختبره
ثلاثة مرشحين يمكنهم المطالبة بالإقلاع، وتنصيب الثلاثة ينتج سباقاً لا احتياطاً مضاعفاً. ملف التشغيل التلقائي لسطح المكتب يعمل فقط بعد تسجيل أحدهم للدخول، ووحدة systemd تعمل أبكر لكنها تحتاج عميلاً يعمل بلا واجهة، ومدخل cron من نوع @reboot ينطلق وفق جدول قد يكون خاطئاً لعميل شبكة. وقد تتطلب واجهة سطر أوامر المورّد وسيط خادم، لأنه عند الإقلاع لا توجد جلسة سابقة لاستئنافها. اختر المرشح الذي يطابق طريقة مصادقة العميل، وأسقط الآخرين.
اختبره بإعادة تشغيل الجهاز والنظر في ثلاث حقائق مستقلة: حالة الوحدة، وقائمة العمليات، واتصال جديد بشيء يمكنك التحقق منه. العميل الذي يحتاج حلقة مفاتيح أو دخولاً تفاعلياً يفشل عند الإقلاع حتى مع ملف وحدة صحيح، وسجل journal يقول ذلك إن قرأته بدل حالة الخدمة فقط.
إما أن تعطي العميل بيانات اعتماد تعمل دون مطالبة، أو تبدأه عند تسجيل الدخول بدلاً من ذلك. كلا الأمرين مقبول، والجمع بينهما هو كيف يكتسب نفق واحد مالكين يتقاتلان عليه.
دوّن ما يجب أن تتوقعه إزالة الحزمة التالية
دوّن حقيقتين بعد أي إزالة يدوية: أي مثبّت أنشأ الترتيب، وأي مالك يبدأه الآن. تحوّل تلك الملاحظة الإزالة التالية من مفاجأة إلى بند في قائمة تحقق، وتعيش أطول من الشخص الذي قام بالعمل.
احفظها بجوار إعداد الخدمة لا في دليل شخصي، وأرّخها، لأن تحديث المورّد يمكن أن يعيد وحدة حذفتها. مقارنة systemctl list-unit-files بتلك الملاحظة كل بضعة أشهر تلتقط الاستعادة بينما ما زال إصلاحها رخيصاً.