PrivateTmp: كتب الخطاف الملف، فأين ذهب؟
نطاق زمني خاص يخفي الملف بدل أن يحذفه. افحص جذر العملية قبل تعديل الوحدة، ثم امنح البيانات المشتركة مسارًا حقيقيًا.
تُبلّغ الخطافات بالنجاح، ومع ذلك يبدو المسار نفسه فارغًا عند فحصه من الصدفة. يمكن أن يكون القولان صحيحين في الوقت نفسه، لأن خدمة systemd قد تعيش داخل نطاق تركيب خاص بها مع دليل زمني خاص. وبعد فهم ذلك، يصبح السؤال المهم هو ما إذا كانت الكتابة قد نجحت أصلًا.
دليلان زمنيان، ومسار واحد
يمنح إعداد العزل الوحدة رؤية خاصة للأدلة الزمنية بدل أن يجعلها للقراءة فقط. لا تستطيع العمليات خارج الوحدة رؤية ما تكتبه هناك، وكل ما تتركه خلفها يُهمل عندما تتوقف الوحدة. لذلك قد يشير مسار يطبعه الخطاف ومسار يُفحص من الصدفة إلى جسمين مختلفين يحملان الاسم نفسه.
هذه مشكلة رؤية، وهي تبدو كمشكلة فقدان بيانات. لم يُحذف شيء، لأن الملف ببساطة موجود في نطاق ليس للصدفة عضوية فيه. يتصرف الأمر نفسه بشكل مختلف عند تشغيله داخل الوحدة، وهذه هي الملاحظة التي تحسم الجدل عادة. اقرأ إعدادات الوحدة قبل أن تستنتج أي شيء عن الكتابة.
افصل غير المرئي عن غير القابل للكتابة
تنتج الكتابة الناجحة والفتح الفاشل أدلة مختلفة، والتمييز بينهما يحدد الإصلاح. إذا قال الخطاف إن الملف قد أُنشئ لكن قارئًا خارجيًا لا يجده، فلديك سؤال نطاق. إذا أبلغ الخطاف عن خطأ إذن أو فتح فاشل، فلم يُكتب الملف أبدًا ولن يساعد أي تغيير في النطاق.
systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-stateيكشف مسار جذر العملية رؤية نظام الملفات الخاصة بالخدمة، رهنا بفحوص الإذن على تلك العملية ما دامت تعمل. اقرأ سجل الوحدة في الجلسة نفسها، لأن خطأ الكتابة والملف المفقود يسهل الخلط بينهما بعد أن يكون أحدهم قد قرر السبب مسبقًا.
امنح البيانات المشتركة موقعًا صريحًا
البيانات التي تحتاجها الخدمة وحدها مكانها الدليل الزمني الخاص بها. البيانات التي يجب أن يقرأها عملية أخرى تحتاج مسارًا محددًا لكليهما، بمالك معلن ووضع ومدة انتهاء. قرر أي النوعين لديك قبل تعديل الوحدة. معظم هذه الحوادث تأتي من معاملة ملف خاص كملف مشترك.
[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750يضع دليل وقت التشغيل المجلد تحت منطقة وقت تشغيل النظام، وينشئه للمستخدم والمجموعة المكوّنين للوحدة، ويزيله عند توقف الوحدة. أضفه عبر drop-in كي تبقى وحدة الحزمة سليمة، ثم أعد تحميل المدير وأعد تشغيل تلك النسخة، مع قبول أن عملاءها سيتصلون من جديد.
احتفظ بأي دليل وقت تشغيل تتطلبه الوحدة المثبتة بالفعل. استبدال القائمة بدل الإضافة إليها طريقة شائعة لكسر ميزة غير ذات صلة لا يربطها أحد بالتغيير.
طبقتان من الامتيازات قد تختلفان
ينشئ مدير الخدمة الدليل للمستخدم المكوّن للوحدة، بينما يمكن لخادم VPN أن ينزل بشكل منفصل إلى حسابه الخاص قبل تشغيل خطاف اتصال. هاتان طبقتان مختلفتان، وقد تسميان هويتين مختلفتين.
الدليل المملوك للجذر بوضع مقيد مرئي تمامًا لخادم تخلى بالفعل عن امتيازاته، ومع ذلك غير قابل للكتابة منه. يُقرأ الخطأ حينها كمشكلة إذن رغم أن المسار موجود تمامًا حيث توقعت. قارن مالك الدليل بالهوية التي يبلغ عنها الخطاف. عندما يختلفان، لم يكن الوضع هو السؤال أبدًا.
تحقق من الهوية التي يعمل بها الخطاف فعلًا قبل تغيير الملكية. تغيير مستخدم تنفيذ الخدمة لإصلاح دليل قد يغير الوصول إلى الأجهزة وامتيازات الشبكة في مكان آخر، وهذا ثمن كبير لمشكلة صغيرة.
تحقق من التسليم بأكمله
أكّد أربعة أمور دفعة واحدة: أن الخطاف يكتب تحت هويته الحقيقية، وأن القارئ المقصود يستطيع استهلاك الملف، وأن المستخدمين غير المعنيين لا يستطيعون، وأن إيقاف الوحدة ينظف كما صُمم. ظهور ملف في الدليل الزمني المشترك للمضيف ليس شرطًا، وهو عادة علامة على أن التبادل لم يحصل على مساره الخاص أبدًا. اختبر القارئ بعد إعادة التشغيل، لا أثناء التشغيل الأول فقط. سلوك التنظيف جزء من التصميم، لذا راقبه بدل افتراضه.
الحالة الدائمة مكانها حيث يكون عمرها مطابقًا، لأن دليل وقت التشغيل مقصود له أن يختفي. اختر الموقع حسب العمر لا حسب الراحة. تلك العادة تمنع النسخة التالية من هذا التحقيق نفسه.