לדלג לתוכן

שיעור 08: Terminal, launchd & Background Processes - Facilitator Guide (Asset B)

1. מבוא לטרמינל (Terminal)

  1. Objective:

המשתתפים יבינו מדוע ה-Terminal הוא כלי העבודה החשוב ביותר של איש ה-IT, וישרו קו על פקודות וקיצורי מקלדת בסיסיים לפני הצלילה לעומק המערכת.

  1. Discussion (Script):

  2. "ברוכים הבאים לשיעור שבו הכל מתחיל להיות אמיתי."

  3. "עד עכשיו התעסקנו בעיקר בממשק הגרפי:"
    • הממשק של המק יפה וחלק.
    • נועד להחביא מורכבות מהמשתמש.
    • אבל כאנשי IT, אסור לנו להסתתר מאחורי תפריטים נוצצים.
  4. "מתי הממשק הגרפי לא יעזור לנו?"
    • כשיש תקלה.
    • כשהמחשב קופא.
    • כשהמשתמש לא מצליח לעשות כלום.
  5. "ומה לגבי ניהול ארגוני?"
    • במערכות כמו Jamf או Intune, שולחים פקודות למאות מחשבים במקביל.
    • עושים זאת עם סקריפט בטרמינל, לא על ידי לחיצה על עכבר.
  6. "עובדת בונוס היסטורית:"
    • הטרמינל והסקריפטים שאנחנו מריצים הגיעו בירושה ממערכת NeXTSTEP עם השקת Mac OS X Cheetah ב-2001.
  7. "מעבר ל-Zsh:"
    • החל מ-macOS Catalina, זוהי שפת ברירת המחדל בטרמינל.
    • מודרנית יותר מ-Bash.
    • מתאימה יותר לאוטומציות של היום.
  8. "לפני שנצלול פנימה, נעשה יישור קו:"

    • נלמד איך לנווט.
    • נראה איך לבטל פקודה שנתקעה.
    • נלמד לקרוא את המסך בלי סחרחורת.
  9. Demonstration:

  10. פתחו את Terminal:

    • השתמשו ב-Spotlight (Cmd+Space והקלידו Terminal).
  11. הגדילו את הטקסט:
    • לחצו Cmd + כדי שכל הכיתה תראה.
  12. הריצו pwd:
    • הראו היכן מתחילים (תיקיית הבית של המשתמש).
  13. הריצו ls -la:
    • הדגימו הבדל בין קבצים רגילים לנסתרים (מתחילים בנקודה).
  14. הקלידו פקודה ארוכה והדגימו קיצורים:
    • Ctrl + A לקפיצה להתחלה.
    • Ctrl + E לקפיצה לסוף.
  15. הריצו פקודה ש"נתקעת":
    • הריצו ping 1.1.1.1 להדגמת ריצה אינסופית.
  16. עצרו את הפקודה:
    • לחצו Ctrl + C.
    • הסבירו שזהו לחצן ה"ביטול/הצלה" לתהליכים עקשניים בטרמינל.
  17. נקו את המסך:

    • הריצו clear (או לחצו Ctrl + L).
  18. Instructor Deep-Dive:

הרחבה טכנית למדריך (TCC וחסימות טרמינל) **מה קורה אם הטרמינל כותב "Operation not permitted"?** * זה לא באג של הרשאות (קריאה/כתיבה). * זוהי התערבות של מנגנון ה-TCC (Transparency, Consent, and Control). * **מגבלות הגישה:** * מ-Mojave (ובעיקר מ-Catalina), אין לטרמינל גישה לתיקיות רגישות (Desktop, Documents, Downloads). * זה קורה גם אם מריצים כ-`sudo` או כמשתמש מנהל. * **איך פותרים את זה?** 1. **פתרון מקומי:** * היכנסו אל `System Settings > Privacy & Security`. * תנו **Full Disk Access** לאפליקציית Terminal. 2. **פתרון ארגוני מנוהל (MDM):** * דוחפים פרופיל PPPC (Privacy Preferences Policy Control). * הפרופיל מאשר מראש (Pre-approved) גישה לסקריפטים, לטרמינל ולכלי ה-MDM. * מונע הופעת חלונות קופצים מטרידים למשתמש הקצה המבקשים גישה.

2. הלב של המערכת

  1. Objective:

המשתתפים יכירו את תהליך ה-launchd, ה"אבא" של כל התהליכים במק, ויבינו את ההבדל הקריטי בין LaunchAgents ל-LaunchDaemons.

  1. Discussion (Script):

  2. "כשמדליקים את המק:"

    • לאחר טעינת הליבה (Kernel), השליטה עוברת לתוכנה המנצחת על התזמורת: launchd.
    • ל-launchd תמיד יש PID מספר 1 ב-Activity Monitor.
    • התוכנה הראשונה לקום, והאחרונה לרדת בכיבוי.
  3. "על מה launchd אחראי?"
    • טעינה וניהול תהליכים.
    • התנעה מחדש אם משהו קרס.
    • סגירה מסודרת של אפליקציות.
  4. "פרט טריוויה מעניין על launchd:"
    • פותח על ידי Dave Zarzycki בשנת 2005 כדי להחליף מנגנונים ישנים כמו cron במנהל תהליכים אחד מרכזי. מאוחר יותר אפל הוסיפה מערכות כמו DAS לתזמון משימות גמיש לפי עומס המחשב.
  5. "עבור אנשי תמיכה - שני סוגי סוכנים חשובים:"

    1. LaunchDaemon (שד מערכתי):
      • רץ ברקע כמשתמש root.
      • עובד גם אם לא בוצע Login למחשב.
      • דוגמאות: אנטיווירוס ארגוני, סוכן MDM, או VPN מנוהל.
    2. LaunchAgent (סוכן אישי):
      • נטען רק אחרי שמשתמש עושה Login.
      • רץ עם הרשאות המשתמש הנוכחי.
      • דוגמאות: Dropbox, אלמנטים בתפריט העליון, או גיבויים קטנים.
  6. Demonstration:

  7. פתחו פיינדר והדגימו ניווט:

    • השתמשו בתפריט Go -> Go to Folder (קיצור Cmd+Shift+G).
  8. נווטו אל /System/Library/LaunchDaemons:
    • הסבירו: "אלו שירותי הליבה של אפל".
    • ציינו שהם נעולים תחת ה-SSV ואי אפשר למחוק אותם.
  9. נווטו אל /Library/LaunchDaemons (בלי System):
    • הסבירו: "כאן יושבות חברות צד שלישי (CrowdStrike, Jamf, SentinelOne)".
    • ה-Daemons כאן רצים תמיד ברקע ברמת המערכת.
  10. נווטו אל ~/Library/LaunchAgents (עם טילדה):
    • הסבירו: "כאן נשמרים סוכנים אישיים של המשתמש".
    • הם עולים רק כשהמשתמש הספציפי מתחבר.
  11. הראו את מבנה השמות:

    • הדגימו שימוש ב-Reverse Domain Name.
    • למשל: com.apple.mDNSResponder.plist.
  12. Instructor Deep-Dive:

הרחבה טכנית למדריך (BTM ו-launchctl) **איך מנהלים שירותים שנתקעו?** * לפעמים Daemon קורס ולא מתאושש, או שדורש איפוס. * במקום לעשות ריסטרט למחשב, משתמשים בפקודת `launchctl`: * **לפרוק (Unload) שירות:** `sudo launchctl bootout system /Library/LaunchDaemons/com.example.plist` * **לטעון מחדש (Load):** `sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.plist` **הערת Login Items (מנגנון Background Task Management):** * מ-macOS Ventura קיים מסך חדש תחת `System Settings > General > Login Items & Extensions`. * **הסכנה:** * משתמש יכול לכבות Daemons של צד שלישי (מנגנון BTM). * אם כיבו סוכן MDM או Antivirus, ה-`launchd` יסרב להפעיל אותם. * פקודת `bootstrap` תיכשל עם השגיאה: `Service cannot load in requested session`. * **הפתרון הארגוני:** * חובה לדחוף פרופיל תצורה מה-MDM בשם `ServiceManagement Profile`. * הפרופיל נועל את ההגדרות הללו. * מונע מהמשתמש לכבות שירותי רקע ארגוניים חיוניים.

3. אבחון עמוק

  1. Objective:

המשתתפים ילמדו כיצד לאבחן תקלות בזמן אמת דרך עומסי זיכרון (Memory Pressure) ב-Activity Monitor, ויכירו את מבנה ודרכי האבחון של קבצי תצורה מסוג Plist.

  1. Discussion (Script):

  2. "שאלה נפוצה בתמיכה: למה המק שלי איטי?"

    • משתמשים וטכנאים רגילים לבדוק "כמה RAM פנוי נשאר".
    • ב-macOS מודרנית זו שאלה שגויה מיסודה.
  3. "למה זיכרון פנוי הוא זיכרון מבוזבז?"
    • המערכת שואפת למלא את ה-RAM במידע (Cache) כדי לרוץ מהר יותר.
  4. "המדד האמיתי: Memory Pressure (עומס זיכרון):"
    • הגרף ב-Activity Monitor אומר לנו איך המק מרגיש.
    • ירוק: הכל מעולה.
    • צהוב: המק מתאמץ, דוחס זיכרון במקום (Memory Compression).
    • אדום: סכנה. המק כותב המון מידע מה-RAM לכונן הקשיח (Swap). פה מתחילות האיטיות והקריסות.
  5. "קצת היסטוריה מאחורי הקלעים:"
    • ה-Activity Monitor המוכר נוצר ב-2003 מאיחוד תוכנות קטנות (Process Viewer ו-CPU Monitor). בנוסף, השימוש בקבצי Plist הגיע מ-NeXTSTEP, והמעבר לפורמט בינארי ב-2002 נועד לשפר ביצועים ולמנוע שגיאות עריכה ידנית.
  6. "חקירת הגדרות וקריסות (Plists):"

    • כל הגדרה של כל אפליקציה במק נשמרת בקובץ Plist (Property List).
    • אם אפליקציה קורסת, התקנה מחדש לרוב לא תעזור (תוריד שוב את אותו קובץ תקין).
    • הפתרון האמיתי לרוב: לאפס את קובץ ה-Plist המושחת שלה.
  7. Demonstration:

  8. פתחו את Activity Monitor:

    • עברו ללשונית Memory.
    • הראו בתחתית המסך את גרף ה-Memory Pressure (סביר שיהיה ירוק).
  9. הראו את עמודת Swap Used:
    • הסבירו: נתון גבוה + גרף אדום = סכנה ובעיה.
    • במצב כזה, יש לסדר את העמודה לפי צריכת זיכרון כדי לאתר אפליקציה שואבת זיכרון (Memory Leak).
  10. הדגימו קבצי Plist:
    • פתחו Finder ונווטו אל ~/Library/Preferences.
    • פתחו קובץ Plist אקראי (למשל com.apple.finder.plist) עם TextEdit.
    • הראו את תגיות ה-XML במבנה (למשל <key>, <string>, <integer>).
  11. הדגימו בדיקת תקינות עם plutil:

    • פתחו Terminal והקלידו: plutil -lint /Users/youruser/Library/Preferences/com.apple.finder.plist
    • הסבירו שהפקודה מבצעת "Linting" (בדיקת תקינות).
    • היא מוודאת שאין פגמים או שגיאות בקוד לפני הטעינה למערכת.
  12. Instructor Deep-Dive:

הרחבה טכנית למדריך (קריאת Plists ו-Cache) **המרת קבצי Plist בינאריים:** * קבצים רבים שמורים בפורמט בינארי לחסכון במקום (ולא כטקסט XML קריא). * פתיחה ב-TextEdit תציג "ג'יבריש". * **פקודות המרה וקריאה מועילות:** * לקריאה מהירה למסך (כמו חלון הצצה): `plutil -p /path/to/file.plist` * להמרת הקובץ ל-XML עריך: `sudo plutil -convert xml1 /path/to/file.plist` * להמרה חזרה לבינארי (לאחר עריכה): `sudo plutil -convert binary1 /path/to/file.plist` **סכנת ה-cfprefsd:** * מגרסאות ישנות (Mavericks והלאה), המערכת מטמינה (Caches) קבצי Plist בזיכרון כדי לחסוך כתיבות ל-SSD. * התהליך המנהל זאת נקרא `cfprefsd`. * **מה קורה בעריכה ידנית?** * אם תשנו מפתח ב-Plist בעורך טקסט ותשמרו, השינוי עלול להימחק. * ברגע הפעלת האפליקציה, `cfprefsd` עשוי לדרוס את הקובץ עם מה ששמור לו בזיכרון. * **הפתרון לאנשי IT:** * שימוש בפקודת `defaults write`. * הפקודה משוחחת ישירות עם מערכת המטמון ומבטיחה שהשינוי יישמר.

4. תיבול ארגוני

  1. Objective:

המשתתפים ילמדו כיצד סוכן ה-MDM משתלב כתהליך שקוף בתוך מערכת ההפעלה, ויבינו מה לחפש ב-Activity Monitor וב-Console כאשר פקודות MDM נכשלות.

  1. Discussion (Script):

  2. "איך מתנהל המחשב מול שרת MDM?"

    • נדרש סוכן מאחורי הקלעים שיקבל פקודות: mdmclient.
    • הוא מובנה במערכת כ-Daemon ונמצא בכל מק.
    • ממתין להגדרות מול שרת MDM ארגוני (לדוגמה, בזמן Automated Device Enrollment).
  3. "איך התהליך עובד בפועל?"
    • ה-mdmclient מאזין לשירותי ה-Push של אפל (APNs).
    • מקבל "דקירה" (Wake up call) מהרשת.
    • מתעורר, יוצר קשר החוצה (ב-HTTPS) עם שרת ה-MDM.
    • מושך את פקודת העבודה ומעביר ל-LaunchDaemons אחרים (כמו מנוע profiled להתקנת פרופילים).
  4. "למה מחשב לא מגיב לפקודות MDM?"

    • לרוב זו בעיה אצל הלקוח, לא "באג באתר".
    • ה-mdmclient אולי קרס.
    • חומת אש (Firewall או Proxy) מיירטת תקשורת SSL.
    • חסימה של חיבור ה-Push של אפל (פורט 5223).
    • את האבחון האמיתי נעשה דרך קריאת הלוגים.
  5. Demonstration:

  6. פתחו את אפליקציית Console:

    • נמצאת תחת Applications/Utilities.
  7. חפשו את ה-mdmclient:
    • בשורת החיפוש בפינה הימנית העליונה, הקלידו mdmclient ולחצו Enter.
    • הראו כיצד מדווחת כל הפעילות הקשורה לסנכרון הפרופילים.
  8. פתחו Terminal להדגמת לוגים חיים (Streaming):
    • הריצו את הפקודה לשאיבת לוגים חיים. זה מאפשר לאיש תמיכה לראות כניסת פקודות בזמן אמת.
    • הפקודה (ללא sudo רק לשם הדגמה): log stream --predicate 'process == "mdmclient"' --info
  9. ייצרו תנועה במערכת:
    • בקשו מהתלמידים לפתוח את תפריט הפרופילים (System Settings > Privacy & Security > Profiles).
    • הסבירו שכניסה למסך זה או כפיית ריענון תיצור שורות לוג חדשות בזמן אמת.
  10. סיימו את ההדגמה:

    • עצרו את ריצת הפקודה בטרמינל בעזרת Ctrl+C.
  11. Instructor Deep-Dive:

הרחבה טכנית למדריך (כפיית סנכרון ושגיאות רשת) **מה עושים אם ה-MDM "נתקע"?** * ניתן לאלץ כוחנית את הלקוח המקומי למשוך מחדש פקודות משרת ה-MDM. * מצוין לתרחישים בהם יש למחשב בעיה בקבלת ה-Push הראשוני. * **הפקודה בטרמינל:** `sudo profiles renew -type enrollment` **איתור חסימות ארגוניות ברשת:** * אם פקודת ה-renew נכשלת או מחזירה שגיאה ארוכה, לרוב מדובר ביירוט SSL Inspection (כגון זרוע Proxy ארגונית מיושנת). * **מנגנון ההגנה (Certificate Pinning):** * ה-`mdmclient` מוודא תעודות מול Apple ושרת ה-MDM. * אם חומת האש מספקת תעודה מזויפת (במטרה לסרוק תעבורה), הוא מסרב לתקשר. * **אינדיקציה לבעיה בלוגים:** * שגיאות אלמוניות של `NSURLErrorDomain` (כמו Error -1009, -1004). * הודעות כמו: "A Server with the specified hostname could not be found". * **הפתרון היחיד:** * פנייה לצוות הרשת והאבטחה ליישום Bypass / Whitelist. * פתיחת תקשורת מול Apple (פורטים 5223 ו-443 אל תת הרשת 17.0.0.0/8) ושרת ה-MDM. * חובה לבצע זאת ללא כל SSL Inspection.