כדי להתאים אישית את תמונות המכונות הווירטואליות, למשל להריץ סקריפטים של מסוף, לעדכן פרמטרים של אתחול, להעביר קבצים בינאריים או להתקין מנהלי התקנים של GPU, אפשר להגדיר פעולות עזר ספציפיות בתוך הבלוק spec.steps של מתכון ההתאמה האישית (imagebuilder.yaml).
סקירה כללית
במהלך שלב הביצוע של build ב-Image Builder, כלי התזמור מריץ את השלבים שהוגדרו במתכון ההתאמה האישית (spec.steps) באופן רציף במכונת ה-worker VM הזמנית.
בכל שלב צריך לציין בלוק name, בלוק action ובלוק inputs שמותאמים לסוג הפעולה. הכלי Image Builder תומך בפעולות ההתאמה האישית הבאות:
-
Shell: מריץ סקריפטים או פקודות של מסוף מוטבע במערכת ההפעלה האורחת של העובד. -
UpdateKernelCommandLine: שינוי של פרמטרים של אתחול ותכונות ניסיוניות בשורת הפקודה של ליבת המערכת. -
FileCopy: העברת קובצי הגדרות, סקריפטים או נכסים מ-Cloud Storage או מסביבות עבודה מקומיות אל המכונה הווירטואלית. -
InstallGPU: מוריד, מהדר ורושם דרייברים של NVIDIA GPU.
פעולת מעטפת
פעולת Shell מאפשרת להריץ סקריפטים של טרמינל מוטבעים או פקודות של מעטפת יחידה במערכת ההפעלה של האורח במכונה הווירטואלית הזמנית של העובד, כדי לבצע התאמות אישיות כמו עדכון חבילות, הגדרת חשבונות משתמשים או קומפילציה של תוכנה.
מציינים אחת מהאפשרויות הבאות בקטע steps.inputs:
-
inlineScript(מחרוזת): פקודות Shell גולמיות מרובות שורות להפעלה. -
command(מחרוזת): מחרוזת של פקודת מערכת יחידה או נתיב יחסי לקובץ בינארי שניתן להפעלה.
הגדרות לדוגמה
בכרטיסיות הבאות מוצגות דוגמאות להגדרות של שלבים להרצת סקריפט מוטבע לעומת הרצת פקודה יחידה:
הרצת סקריפט בתוך השורה
ההגדרה הבאה מריצה סקריפט רב-שורי שמעדכן חבילות באמצעות apt:
- name: "Update guest packages and configure groups"
action: Shell
inputs:
inlineScript: |
#!/bin/bash
apt-get update -y
apt-get install -y fail2ban build-essential
groupadd -r adminusers
הרצת פקודה בודדת
התצורה הבאה מריצה פקודה אחת של מעטפת כדי לאמת את הגרסה הפעילה של ליבת מערכת ההפעלה:
- name: "Log kernel identifier"
action: Shell
inputs:
command: "uname -a"
התנהגויות מיוחדות
כשמריצים פעולות Shell, מנהל ההקצאות של ההתאמות האישיות מנהל את ביקורת האבטחה ואת הפעלה מחדש אוטומטית של המערכת, כמו שמתואר בקטעים הבאים:
ביקורת אבטחה
כדי למנוע דליפה של טוקנים רגישים, סודות או קוד קנייני ליומני הביצוע, כלי ההקצאה של ההתאמות האישיות לא מדפיס את השורות הגולמיות של הסקריפטים, אלא אם מופעל ניפוי באגים אינטראקטיבי (debug: true). במקום זאת, הוא רושם ביומני הבנייה את גיבוב (hash) השלמות מסוג SHA-256 של מטען הנתונים של הסקריפט. הגיבוב הזה מספק עקבות ביקורת בלתי ניתנות לשינוי של הקוד שהופעל בתמונה.
הפעלה מחדש של המערכת (קוד יציאה 3010)
חלק מהפעולות בשורת הפקודה, כמו עדכוני תיקון ליבת המערכת או שינויים במחיצות האחסון, מחייבות הפעלה מחדש של המערכת לפני שניתן להריץ את השלבים הבאים.
כדי לבקש הפעלה מחדש של המערכת במהלך ההתאמה האישית, סקריפט המעטפת צריך להסתיים בפקודה exit 3010. כשספק ההקצאה של ההתאמה האישית מקבל קוד יציאה 3010,
הוא מטפל במחזור החיים של ההפעלה מחדש באופן הבא:
- ספק ההקצאות מזהה את קוד היציאה
3010, משהה את ההפעלה ומסמן את אינדקס ההתקדמות של השלב. - כלי ההקצאה מפעיל מחדש את מכונת ה-VM של העובד.
- אחרי שהמכונה הווירטואלית מופעלת מחדש, כלי ההקצאה מטמיע את סביבת העבודה וממשיך אוטומטית את צינור הנתונים בשלב הבא בתור.
דוגמה להפעלה מחדש:
בדוגמה הבאה מוצגת הגדרת שלב שמעדכנת חבילות ומבקשת הפעלה מחדש:
- name: "Install core updates and request reboot"
action: Shell
inputs:
inlineScript: |
#!/bin/bash
echo "Applying configuration package upgrades..."
apt-get dist-upgrade -y
# Terminate with return code 3010 to trigger a system reboot
exit 3010
- name: "Post-reboot verification"
action: Shell
inputs:
command: "uname -r"
פעולה UpdateKernelCommandLine
הפעולה UpdateKernelCommandLine מאתרת, מחליפה, מוסיפה או מסירה דגלים של שורת פקודה שמועברים לליבה בזמן אתחול המערכת, למשל כשמגדירים יומני קונסולה או משנים פרמטרים של הליבה.
מציינים את המאפיינים הבאים במפה steps.inputs:
-
oldArguments(מחרוזת, חובה): הארגומנטים המדויקים של שורת הפקודה לאיתור, להסרה או להחלפה בתוך קובץ ההגדרות של טוען האתחול. newArguments(string, Optional): The replacement arguments to write in place of the target flags. אם לא מציינים את המאפייןnewArguments, Image Builder מסיר את הפרמטרים שהוגדרו במאפייןoldArgumentsלחלוטין משורת האתחול.
הגדרות לדוגמה
בכרטיסיות הבאות מוצגות דוגמאות להגדרות של שלבים להחלפה או להסרה של ארגומנטים של אתחול ליבה:
החלפת ארגומנטים של אתחול
ההגדרה הבאה מאתרת את מפתח רמת היומן של ליבת המערכת loglevel=4
ומחליפה אותו בפרמטרים מפורטים יותר loglevel=6 console=ttyS0:
- name: "Configure detailed boot logging"
action: UpdateKernelCommandLine
inputs:
oldArguments: "loglevel=4"
newArguments: "loglevel=6 console=ttyS0"
הסרת ארגומנטים של אתחול
ההגדרה הבאה מחפשת את הפרמטר quiet ומסירה אותו מארגומנטי האתחול כדי להפעיל רישום מפורט ביומן במהלך שלבי הבדיקה של ההפעלה:
- name: "Enable verbose startup diagnostics"
action: UpdateKernelCommandLine
inputs:
oldArguments: "quiet"
פרטי ביצוע ספציפיים למערכת ההפעלה
בכרטיסיות הבאות מוסבר איך כלי ההקצאה של ההתאמה האישית מטפל בשינויים בתמונות, בהתאם למערכת ההפעלה האורחת של המקור:
מערכת הפעלה שמותאמת לקונטיינרים (COS)
מכיוון ש-COS כולל פריסת מחיצות לקריאה בלבד, הוא לא כולל כלי הגדרה רגילים. הכלי להקצאת הרשאות להתאמה אישית מבצע את הפעולות הבאות:
- קובעת את הנתיב של מכשיר האתחול הפעיל.
- מבצעים Mount למחיצה 12, מחיצת ה-EFI, של מכשיר האתחול.
- עדכון ישיר של פרמטרים של טוען האתחול בתוך
/efi/boot/grub.cfg. - מבטלת את הטעינה של מחיצה 12 באופן בטוח.
Ubuntu
בדימויים של Ubuntu, ספק ההקצאות של ההתאמה האישית מבצע את הפעולות הבאות:
- נפתחים
/etc/default/grubוקבצים בתיקייה/etc/default/grub.d/*.cfg. - הפקודה מוסיפה, משנה או מוחקת את ארגומנטי היעד בקטע
GRUB_CMDLINE_LINUX. - מריצים את פקודת החבילה
update-grubכדי ליצור מחדש את ההגדרות של טוען האתחול.
פעולת FileCopy
פעולת FileCopy מעתיקה קובצי הגדרות, קבצים בינאריים או אישורים ממאגר מרוחק או מהמאגר המקומי שלכם לקובץ האימג' המותאם אישית. הכלי לאספקת התאמות אישיות מוריד או קורא את קובץ המקור, כותב אותו לנתיב האורח שצוין במכונת העובד הווירטואלית ומגדיר את ההרשאות.
מציינים את הקלט הבא בקטע steps.inputs:
-
destination(מחרוזת, חובה): הנתיב המוחלט במערכת ההפעלה של האורח שבו נוצר הקובץ. -
permissions(מחרוזת, חובה): ייצוג אוקטלי של הרשאות ההגדרה של היעד, כמו"0755"או"0644". - מציינים אחת מהתכונות הבאות של המקור:
-
gcsSourcePath(מחרוזת): ה-URI של קובץ המקור ב-Cloud Storage, שצריך להיות בפורמטgs://BUCKET_NAME/OBJECT_NAME. -
localSourcePath(מחרוזת): הנתיב היחסי לקובץ בתוך תיקיית המאגר של סביבת העבודה המקומית. Path traversal באמצעות../נחסם מטעמי אבטחה.
-
הגדרות לדוגמה
בכרטיסיות הבאות מוצגות דוגמאות להגדרות של שלבים להעתקת קובץ מ-Cloud Storage לעומת העתקה מסביבת העבודה המקומית:
Cloud Storage
ההגדרה הבאה מעתיקה תבנית הגדרה מקטגוריה של Cloud Storage לתמונה של מכונה וירטואלית אורחת:
- name: "Import licensing configuration"
action: FileCopy
inputs:
gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
destination: "/etc/app/license.key"
permissions: "0600"
סביבת עבודה מקומית
ההגדרה הבאה מעתיקה סקריפט של אפליקציה שעבר קומפילציה במהלך שלבים קודמים של Cloud Build:
- name: "Deploy setup automation daemon"
action: FileCopy
inputs:
localSourcePath: "bin/setup-daemon"
destination: "/usr/local/bin/setup-daemon"
permissions: "0755"
הנחיות ספציפיות למערכת הפעלה
בכרטיסיות הבאות מתוארות הנחיות לגבי מיקום הקבצים בהתאם למערכת ההפעלה האורחת:
מערכת הפעלה שמותאמת לקונטיינרים (COS)
תמונות COS מכילות פריסת מחיצות לקריאה בלבד, למטרות אבטחה. חלק מיעדי המערכת הרגילים, כמו /usr/ או /bin/, מוגנים מפני כתיבה.
כשמגדירים יעדי קבצים ב-COS:
- צריך לציין קבצים רק במיקומים עם מצב ניתן לכתיבה, כמו
/varאו/home. - כדי לזהות את הנתיבים המתאימים, אפשר לעיין בהפניה הרשמית למערכת הקבצים ולדיסקים של מערכת הפעלה שמותאמת לקונטיינרים.
Ubuntu
תמונות Ubuntu כוללות פריסת מחיצות סטנדרטית של Linux לקריאה וכתיבה (/).
אפשר לציין יעדי קבצים בכל נתיב מערכת סטנדרטי, כמו /etc, /usr/local/bin, /var או /home, בתנאי שלפרופיל המשתמש או לתיקיית היעד יש הרשאות תצורה מתאימות במכונת ה-VM של העובד.
פעולת InstallGPU
משתמשים בפעולה InstallGPU כדי ליצור תמונות של מכונות וירטואליות שעברו אופטימיזציה ללמידת מכונה, למדעי הנתונים או לעומסי עבודה מדעיים. Image Builder מוריד, מהדר ורושם דרייברים של NVIDIA GPU בתמונות המותאמות אישית. בהתאם לסוג תמונת הבסיס ולחומרת היעד, אפשר לבחור בין התקנת מנהלי התקנים שעברו קומפילציה מראש לבין קומפילציה של קובצי מנהלי התקנים מותאמים אישית .run.
מציינים אחת מהאפשרויות הבאות בקטע steps.inputs:
-
version(string): מספר הגרסה של דרייבר NVIDIA המיועד, למשל"595.129.03". אם מציינים רקversion, כלי התזמור מוריד את הדרייבר ממאגר NVIDIA הרשמי (https://us.download.nvidia.com/tesla/<version>). -
gcsRunfile(string): נתיב Cloud Storage של קובץ התקנה של דרייבר NVIDIA מותאם אישית, שצריך להיות בפורמטgs://BUCKET_NAME/OBJECT_NAME.run. -
sourceRunfile(מחרוזת): הנתיב היחסי לקובץ.runשל תוכנת ההתקנה בתוך תיקיית המאגר של סביבת העבודה המקומית.
הגדרות לדוגמה
בכרטיסיות הבאות מוצגות דוגמאות להגדרות של שלבים להתקנת גרסה ספציפית של מנהל התקן שהוכנה מראש, לעומת התקנה של קובץ הפעלה בהתאמה אישית:
הורדה של גרסה רגילה
ההגדרה הבאה מורידה ומתקינה גרסה ספציפית של דרייבר NVIDIA מהמאגר הרשמי:
- name: "Configure default NVIDIA drivers"
action: InstallGPU
inputs:
version: "<var>DRIVER_VERSION</var>"
קובץ הרצה של Cloud Storage
ההגדרה הבאה פורסת מתקין של דרייבר NVIDIA בהתאמה אישית .run ישירות מקטגוריה של Cloud Storage:
- name: "Deploy custom GPU driver from Cloud Storage"
action: InstallGPU
inputs:
gcsRunfile: "gs://<var>BUCKET_NAME</var>/drivers/NVIDIA-Linux-aarch64-<var>DRIVER_VERSION</var>.run"
קובץ הרצה של סביבת עבודה מקומית
ההגדרה הבאה פורסת מתקין מותאם אישית של דרייבר NVIDIA .run ממרחב העבודה של המאגר המקומי:
- name: "Deploy custom GPU driver from workspace"
action: InstallGPU
inputs:
sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"
שיטות הגדרה
בכרטיסיות הבאות מוסבר על השיטות הנתמכות להגדרת דרייברים של NVIDIA GPU בתמונות בהתאמה אישית:
מנהלי התקנים שעברו קומפילציה מראש
מומלץ להשתמש בגרסאות מנהלי התקנים מוכנות מראש כדי להימנע מהתקורה של המחשוב ומשך זמן של תהליך build של קומפילציה של מנהלי התקנים מאפס.
מערכת הפעלה שמותאמת לקונטיינרים (COS): אם מציינים גרסת דרייבר שארוזה מראש על ידי Google, מנהל ההקצאות של ההתאמה האישית מפעיל את כלי האורח
cos-extensions install gpuכדי להפעיל אותה.כדי לראות את רשימת הגרסאות הנתמכות של דרייברים שעברו קומפילציה מראש לגרסת COS שלכם, מריצים את הפקודה
sudo cos-extensions listבמופע COS פעיל, או מעיינים במאמר זיהוי גרסת הדרייבר של ה-GPU.Ubuntu: כדי לחסוך משך זמן של תהליך build ב-Ubuntu, מומלץ לבחור תמונות בסיס שהוגדרו מראש מתוך פרויקט
ubuntu-os-accelerator-imagesציבורי שבו מותקנים מראש דרייברים של NVIDIA.כדי להציג רשימה של תמונות מאיץ זמינות, מריצים את הפקודה הבאה ב-
gcloudCLI:gcloud compute images list \ --project=ubuntu-os-accelerator-images \ --no-standard-images
קבצים להרצה בהתאמה אישית
אם אתם צריכים להתקין גרסה של מנהל התקן בהתאמה אישית שלא עברה קומפילציה מראש על ידי Google או Canonical, אתם יכולים לציין קבצים ישירים להפעלת תוכנת ההתקנה לצורך קומפילציה באופן הבא:
- Ubuntu: מתבצעת קומפילציה בתוך האורח. ספק ההקצאה של ההתאמה האישית מתקין באופן אוטומטי את כותרות הליבה התואמות (
linux-headers-$(uname -r)), מהדר את קובץ מנהל ההתקן של NVIDIA (.run) במכונה הווירטואלית של העובד ורושם אותו ב-Dynamic Kernel Module Support (DKMS). הרשמה ל-DKMS מבטיחה שהדרייברים יישארו פעילים גם אחרי עדכונים קלים של ליבת המערכת. - מערכת הפעלה שמותאמת לקונטיינרים (COS): אופן ההידור משתנה בהתאם לארכיטקטורת המעבד (CPU) של תמונת ה-VM של בסיס המקור:
- תמונות ARM64: מכיוון שמכונות וירטואליות של ARM64 COS לא תומכות בהידור של כותרת בתוך האורח, Image Builder מבצע הידור צולב אוטומטי של כלי השירות
.runשל מנהל ההתקן המותאם אישית בתוך קונטיינר הבנייה, ומתקין את החבילה שנוצרת ב-/var/lib/nvidiaבמכונת העובד הווירטואלית. - תמונות x86-64: ביצוע קומפילציה בתוך האורח ישירות במכונת ה-VM של העובד.
- תמונות ARM64: מכיוון שמכונות וירטואליות של ARM64 COS לא תומכות בהידור של כותרת בתוך האורח, Image Builder מבצע הידור צולב אוטומטי של כלי השירות
המאמרים הבאים
- מעיינים בבלוקים של סכימות ברמה העליונה בסכימה של קובץ להתאמה אישית של תמונות.
- מגדירים את הפרמטרים של תזמור פייפליין בסכימת קובץ תצורת ה-build של Cloud Build.
- פועלים לפי ההדרכה כדי ליצור צינור Image Builder.