השירות שלך נכשל לפני ש-OpenVPN בכלל רץ, והשגיאה מדברת על יחידת עיגון שמעולם לא הגדרת. זה הסימן: systemd דוחה את כל העסקה מפני שיחידת עיגון השורש מוסתרת, ופרופיל ה-VPN שלך עוד לא נקרא. הסיבה הרגילה היא קובץ שנותר בתיקיית יחידות זמן הריצה, לא fstab שבור ולא תעודה חסרה. עקוב אחרי הקובץ קודם, מפני שזה ההסבר הזול ביותר לשלול.

השגיאה מציינת את עיגון השורש, לא את הפרופיל שלך

systemd יוצר את יחידת עיגון השורש בעצמו ממידע העיגון של הליבה, וקורא ליחידה -.mount מפני שמקף מייצג את נתיב השורש. יחידה זו קיימת בדרך כלל רק בזיכרון ואין מאחוריה קובץ. כשהשגיאה אומרת שהיא מוסתרת, מישהו הניח קובץ יחידה במקום שבו systemd יטען אותו והפנה את הקובץ אל /dev/null. ההסתרה היא מצב אמיתי, לא שגיאת הקלדה בהודעה.

יחידת המופע נכשלת מפני שגרף המשימות שלה מגיע לעיגון השורש דרך הסדר ודרך דרישות העיגון שלה עצמה. העסקה נדחית לפני שהבינרי של OpenVPN מבוצע, ולכן שום דבר בהגדרות הלקוח לא יכול להיות הסיבה. לכן החלפת פרופילים, תעודות או פרטי התחברות אינה משפיעה על הכשל המסוים הזה.

בדוק את תיקיית זמן הריצה לפני שאתה מאתר תקלות ב-OpenVPN

חפש קובץ בשם המדויק הזה בתיקיית יחידות זמן הריצה, ואז שאל את systemd מה הוא חושב שהיחידה היא. שתי התשובות מהירות, וביחד הן מפרידות קובץ שנותר מבעיית עיגון אמיתית.

ls -l /run/systemd/system/-.mount
systemctl status -.mount
systemctl list-unit-files --state=masked | grep mount

מכונה רגילה אינה מכילה קובץ כזה, ורשימת המוסתרים אינה כוללת את עיגון השורש. אם הפקודה הראשונה מדפיסה קישור סמלי אל /dev/null, האבחנה סגורה. אותה תיקייה עשויה להכיל הסתרה tmp.mount שנוצרה על ידי אותם כלים, וזה יוצר את אותה מחלקת כשל בשם אחר. הסתכל על כל התיקייה ולא רק על השם בשגיאה.

ls -la /run/systemd/system/*.mount

אם התיקייה נקייה והיחידה עדיין מוסתרת, ההסתרה נמצאת במקום אחר בנתיב החיפוש, ו-systemctl cat -.mount יראה איזה קובץ נטען.

מחק את הקובץ, טען מחדש והתחל שוב

די בהסרת קובץ זמן הריצה ובטעינה מחדש של המנהל, וזה לא נוגע בשום דבר שהגיע מחבילה. טען מחדש לפני ההתחלה, מפני ש-systemd שומר על מצב היחידה הטעונה עד שיקרא את התיקייה שוב.

sudo rm -f /run/systemd/system/-.mount /run/systemd/system/tmp.mount
sudo systemctl daemon-reload
systemctl status -.mount
sudo systemctl start [email protected]

לאחר מכן קרא את היומן של השירות עצמו במקום להניח שהתיקון עבד. התחלה נקייה מוכיחה רק ש-systemd קיבל את היחידה; הלקוח עדיין עלול למות בגלל פרופיל חסר, עמית בלתי נגיש או תעודה שאינה מאומתת. אלה בעיות OpenVPN רגילות שהוסתרו מאחורי היחידה המוסתרת. היומן מתעד איזה פרופיל נטען והאם המנהרה באמת הוקמה. אם היחידה עולה והמנהרה לא, עברת לבעיה אחרת, וזו התקדמות.

journalctl -u [email protected] -b --no-pager

מכיוון ש-/run הוא מערכת קבצים זמנית, אתחול מחדש מנקה גם את הקובץ. זה הופך אתחול מחדש לבדיקה שימושית: אם השירות עובד אחרי אתחול ונכשל שוב אחרי הפריסה הבאה, הקובץ נאפה לתוך התמונה.

מנע את חזרתו מהתמונה

תבנית מכולה או מכונה וירטואלית שמסתירה יחידות עיגון בזמן הבנייה שלה תעביר את ההסתרה לכל שיבוט. הדבר הבא שזקוק למערכת הקבצים יישבר, וההודעה מאשימה את העיגון במקום את התמונה שממנה הוא בא. תיקון בתוך מופע פועל אחד מסתיר את הבעיה עד ליצירת המופע הבא.

חפש בהקשר הבנייה את שם הקובץ ואת הפקודה שיוצרת אותו, ואז הסר את ההסתרה מהתבנית ובנה מחדש. אם ההסתרה באמת נחוצה בזמן הבנייה, הסר אותה באותה שכבה שמסיימת את הבנייה, כדי שהתמונה הנשלחת תתחיל נקייה. אמת על שיבוט חדש ולא על המכונה שתיקנת ביד. זו הבדיקה היחידה שמוכיחה שהתמונה השתנתה.

התסמין שכדאי לזכור הוא אי-ההתאמה בין השגיאה לבין מה שהגדרת. כשמערכת systemd מתלוננת על עיגון בזמן שאתה מפעיל לקוח VPN, קרא קודם את שם היחידה בהודעה ורק אחר כך את שם השירות.

מאמרים קשורים