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

ליבה פעילה או ליבה מותקנת

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

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

שלוש בדיקות לפני בנייה מחדש

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

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

uname -r
ls -l /lib/modules/$(uname -r)/build
modinfo wireguard
lsmod | grep wireguard

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

בנו כנגד המהדורה הפעילה

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

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

sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
sudo depmod -a

כשהכותרות הארוזות מפגרות

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

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

אמתו את הממשק אחרי הבנייה מחדש

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

sudo ip link add wg9 type wireguard
lsmod | grep wireguard
sudo dmesg | tail -5

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

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