שימוש בקובצי ליבה (core dumps) כדי לנתח את הסיבות למכונה וירטואלית (VM) שלא מגיבה.
כדי לאסוף קובצי ליבה ב-Compute Engine, צריך להגדיר את המכונות הווירטואליות לקבלת אות Non-Maskable Interrupt (NMI), ואז להריץ פקודה SendDiagnosticInterrupt כדי להפעיל מצב kernel panic או מסך כחול במערכת ההפעלה. מערכת ההפעלה של האורח מתחילה לאסוף נתוני ליבה (core dump) בעקבות פאניקה בקרנל או מסך כחול. אפשר להשתמש בקובצי ה-core dump האלה למטרות ניפוי באגים, במיוחד בתרחישים שקשה לשחזר, כמו קפיאת ליבה.
לפני שמתחילים
- שליחת אותות NMI נספרת במכסת ברירת המחדל של Queries API. מידע נוסף מופיע במאמר בנושא מגבלות קצב של API.
-
אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות.
אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:
צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:
gcloud
-
התקינו את ה-CLI של Google Cloud. אחר כך, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:
gcloud initאם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
- הגדרת אזור ותחום כברירת מחדל
REST
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.
התקינו את ה-CLI של Google Cloud.
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .
התפקידים הנדרשים
כדי לוודא שלמשתמש או לחשבון השירות שלכם יש את ההרשאה הנדרשת לשליחת אותות NMI למכונה וירטואלית, צריך לבקש מהאדמין להקצות למשתמש או לחשבון השירות שלכם את תפקיד ה-IAM Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) בפרויקט.
כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
התפקיד המוגדר מראש הזה מכיל את ההרשאה compute.instances.sendDiagnosticInterrupt, שנדרשת כדי לשלוח אותות NMI למכונה וירטואלית.
יכול להיות שהאדמין יוכל גם להעניק למשתמש או לחשבון השירות את ההרשאה הזו באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
סקירה כללית
כדי להשתמש בקובצי ליבה כדי לנפות באגים במכונה וירטואלית שלא מגיבה או בבעיית אבטחה, צריך לבצע את השלבים הבאים:
- הגדרת המכונה הווירטואלית ליצירת קובצי dump של ליבת המערכת
- שליחת אות NMI כדי ליצור קובצי dump של הליבה
- בדיקה של קובצי ה-core dump
מגבלות
במכונות וירטואליות שבהן מופעלת הפעלה מאובטחת, צריך להשבית את ההפעלה המאובטחת לפני ששולחים אות פסיקה של NMI. הוראות מפורטות זמינות במאמר שינוי אפשרויות של מכונות וירטואליות מוגנות במכונה וירטואלית.
הגדרת מכונה וירטואלית
התגובה של מכונה וירטואלית לקבלת אות הפרעה מסוג NMI תלויה בהגדרת מערכת ההפעלה של המכונה הווירטואלית.
כל מערכת הפעלה כותבת את יומני ה-core dump במיקום אחר. לדוגמה, במערכות הפעלה של Ubuntu, קובץ ה-crash dump נשמר ב-/var/crash/ כברירת מחדל.
כדי להגדיר את מערכת ההפעלה האורחת ליצירת קובץ dump של קריסה כשמתקבל אות NMI, צריך לעיין במסמכים של מערכת ההפעלה הנתמכת.
| מערכת הפעלה | קישורים להוראות | הערות נוספות |
|---|---|---|
| Ubuntu | Ubuntu: קובץ dump של קריסה של הליבה | במכונות וירטואליות של Linux, צריך להגדיר את ליבת מערכת ההפעלה לקריסה כשהיא מקבלת את אות ההפסקה NMI. כדי להגדיר את ליבת המערכת לקריסה, מוסיפים את השורות הבאות לקובץ התצורה: kernel.unknown_nmi_panic=1 |
| SUSE Linux Enterprise Server (SLES) | הגדרה של זיכרון crashkernel לניתוח של dump ליבת הליבה | |
| Red Hat Enterprise Linux (RHEL) | עליכם להשתמש בשני המסמכים הבאים: |
|
| מערכת הפעלה שמותאמת לקונטיינרים (COS) | הפעלת Kernel Crash Dump במופעי GCE COS | רק ב-COS 93 ואילך יש תמיכה ביצירת kdump באמצעות אות NMI. |
| Windows | יצירה של קובץ dump של ליבה או של קריסה מלאה | מכונות וירטואליות של לקוחות Windows לא שומרות קובצי dump של הזיכרון, אלא אם הן חברות בדומיין AD או אם מתקיים התנאי הבא:
מידע נוסף זמין במאמר בנושא אחסון של קובצי dump של ליבת המערכת והתנהגות של ניקוי ב-Windows 7 |
שליחת NMI ליצירת קובצי ליבה
אחרי שמגדירים את המכונה הווירטואלית, אפשר לשלוח אליה את אות ה-NMI באמצעות Google Cloud CLI או REST.
gcloud
כדי לשלוח את אות ה-NMI, משתמשים בפקודה instances send-diagnostic-interrupt.
gcloud compute instances send-diagnostic-interrupt VM_NAME \
--zone=ZONE
מחליפים את מה שכתוב בשדות הבאים:
-
VM_NAME: מזהה המופע או שם המכונה הווירטואלית שרוצים לאסוף ממנה קובצי ליבה -
ZONE: האזור שבו נמצאת המכונה הווירטואלית
הפלט אמור להיראות כך:
<Empty Response>
רשימה מלאה של הפלט זמינה בקטע הבא במסמך הזה בנושא 'תגובות לפקודות NMI'.
REST
זה שינוי אופציונלי. אם מפתח ה-API עדיין לא זמין, יוצרים מפתח API. מידע נוסף על יצירת מפתחות API מופיע במאמר יצירת מפתח API.
כדי לשלוח את אות ה-NMI, צריך לשלוח בקשת
POSTל-methodsendDiagnosticInterrupt.POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/sendDiagnosticInterrupt?key=API_KEY
לדוגמה, אפשר להשתמש בפקודה
curlכדי לשלוח את הבקשה באופן הבא:curl --request POST 'https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/sendDiagnosticInterrupt?key=API_KEY' \ --header 'Authorization: Bearer $(gcloud auth print-access-token)' \ --header 'Accept: application/json' \ --compressed
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: המזהה של הפרויקט שבו רוצים ליצור את המכונה הווירטואלית -
ZONE: האזור שבו נמצאת המכונה הווירטואלית -
VM_NAME: מזהה המופע או השם של המכונה הווירטואלית שממנה רוצים לאסוף קובצי ליבה -
API_KEY: מפתח ה-API
הפלט אמור להיראות כך:
<Empty Response>
רשימה מלאה של הפלט מופיעה בקטע הבא במסמך הזה בנושא 'תשובות לפקודות NMI'.
-
תגובות לפקודות NMI
אחת מהתגובות הבאות מוחזרת כשמנסים לשלוח אות NMI.
| מדינה | גוף | הערות |
|---|---|---|
| בוצע בהצלחה | <Empty Response> |
SUCCESS מראה שאות ה-NMI מועבר למערכת ההפעלה. הפעולה הזו לא מבטיחה שקבצי ה-core dump ייאספו, או שהמכונה הווירטואלית תכובה או תופעל מחדש. ההתנהגויות האלה נקבעות על ידי ההגדרה של מערכת ההפעלה. |
| FAIL | UNSUPPORTED_OPERATION
|
המצב הזה קורה כשמערכת ההפעלה לא מקבלת את אות ה-NMI. יכולות להיות לכך כמה סיבות. תרחישים נפוצים הם העברה פעילה של המכונה הווירטואלית או שהמכונה הווירטואלית לא מוגדרת כראוי לקבלת אותות NMI.
כדי לפתור את הבעיה, אפשר לנסות את הפתרונות הבאים:
|
| FAIL | Required 'compute.instances.sendDiagnosticInterrupt' permission for [..]
|
הפקודה נכשלה כי למשתמש שהגיש את הבקשה אין מספיק הרשאות. כדי לפתור את הבעיה, אפשר להקצות למשתמש תפקיד שכולל את ההרשאה compute.instances.sendDiagnosticInterrupt. |
בדיקת קובצי dump של הליבה
בודקים את קובץ ה-dump של קריסה במיקום שהוגדר או במיקום ברירת המחדל של מערכת ההפעלה.
לדוגמה, במערכות הפעלה של Ubuntu, כברירת מחדל, קובץ ה-dump של קריסה נשמר ב-/var/crash/.