מערכת הקבצים proc מוסברת - הקרנל שחושף את עצמו כתיקיית קבצים¶
בלינוקס אפשר לראות כמעט כל מידע פנימי על תהליכים, מעבד וזיכרון, פשוט על ידי קריאת "קבצים" בתיקייה /proc. הבעיה, אם אפשר לקרוא לזה בעיה, היא שהקבצים האלה לא באמת קיימים על הדיסק. הם נוצרים בזמן אמת על ידי הקרנל, ברגע שמישהו מבקש לקרוא אותם, ונעלמים ברגע שהם כבר לא רלוונטיים.
אז מה זה בעצם proc¶
/proc היא מערכת קבצים וירטואלית - virtual filesystem, שקיימת רק בזיכרון ולא על אף דיסק פיזי. היא חושפת מבנים פנימיים של הקרנל, כמו מידע על תהליכים רצים, שימוש בזיכרון, ופרטים על החומרה, דרך אותו ממשק מוכר של קבצים ותיקיות שכל תוכנה כבר יודעת לעבוד איתו. במקום לכתוב קוד מיוחד שקורא ל-API ספציפי כדי לקבל את הנתונים האלה, פשוט קוראים קובץ טקסט רגיל, בדיוק כמו כל קובץ אחר.
לכל תהליך רץ יש בתוך /proc תיקייה משלו, בשם המזהה שלו - /proc/1234 למשל, לתהליך עם מזהה 1234. בתוך התיקייה הזאת יושבים "קבצים" שחושפים מידע מפורט על התהליך הספציפי הזה - הזיכרון שלו, המצב שלו, ומה שהוא עושה בדיוק ברגע נתון.
מה בדיוק אפשר למצוא שם¶
כמה דוגמאות שממחישות עד כמה עמוק המידע מגיע:
/proc/[pid]/status. מציג מצב תמציתי של התהליך - כמה זיכרון הוא צורך, באיזה מצב הוא נמצא, ומי ההורה שלו./proc/[pid]/maps. מציג בדיוק את מפת מרחב הזיכרון הווירטואלי של התהליך - אילו טווחי כתובות ממופים, אילו ספריות משותפות נטענו לאן, ומה ההרשאות של כל אזור. זה בדיוק המקום שממנו אפשר לראות בפועל את התוצאה של כל מה שדיברנו עליו כשהסברנו על מיפוי זיכרון./proc/[pid]/fd. תיקייה שמכילה קישור לכל מתאר קובץ פתוח של התהליך, כולל קבצים, צינורות וחיבורי רשת - הדגמה חיה של איך טבלת מתארי הקבצים באמת נראית מבפנים./proc/cpuinfoו-/proc/meminfo. לא ספציפיים לתהליך, אלא מציגים מידע כללי על המעבד והזיכרון של כל המערכת.
איך כלים כמו ps ו-top בכלל עובדים¶
אחת התגליות הכי מפתיעות למי שרואה את זה בפעם הראשונה - כלים כמו ps, top ו-htop לא קוראים למנגנון מיוחד וסודי בקרנל כדי להציג מידע על תהליכים. הם פשוט קוראים קבצים בתוך /proc, מפרשים את התוכן שלהם, ומציגים אותו בצורה נוחה יותר לעין. אפשר להריץ בעצמכם cat /proc/self/status ולראות בדיוק את המידע הגולמי שאותם כלים קוראים, על התהליך של הפקודה cat עצמה, בזמן שהיא רצה.
זה גם אומר שאפשר, בלי לכתוב שום קוד מיוחד, לכתוב סקריפט bash פשוט שקורא ומעבד קבצים מתוך /proc, ולבנות איתו כלי ניטור משלכם, בדיוק כמו הכלים המוכרים.
proc זה לא רק קריאה בלבד¶
חלק מהקבצים בתוך /proc, בעיקר תחת /proc/sys, גם ניתנים לכתיבה, ומאפשרים לשנות בזמן אמת הגדרות של הקרנל עצמו - בלי צורך באתחול מחדש. השינויים האלה, שנקראים sysctl, יכולים לשלוט בהתנהגות דברים כמו ניהול זיכרון, פרמטרים של רשת, ואפילו כמה מידע חשוף על המערכת. זו יכולת עוצמתית שדורשת זהירות, כי שינוי לא נכון יכול להשפיע מיד על יציבות המערכת כולה.
למה זה שווה הכרות מעמיקה¶
/proc הוא בעצם חלון שקוף לתוך הקרנל, בלי צורך לכתוב קוד קרנל בעצמכם. מי שמבין מה יש שם, יכול לאבחן בעיות ביצועים, לחקור תהליכים חשודים, ולהבין בדיוק מה קורה במערכת ברגע נתון, הרבה מעבר למה שכלי ניטור מוכן מציג.
זה בדיוק סוג הכלים שאנחנו לומדים להשתמש בהם בקורס ליבת המחשב - איך לקרוא את הקרנל ישירות, במקום להסתמך רק על כלים מוכנים.
ואם תגלו משהו מוזר תוך כדי חיטוט ב-proc, יש קהילה שמחכה לשמוע על זה.
לסיכום¶
/proc נראית כמו עוד תיקייה על הדיסק, אבל היא בעצם חלון ישיר לתוך מבני הנתונים הפנימיים של הקרנל, שנבנה מחדש בזמן אמת בכל פעם שמישהו קורא ממנה. כמעט כל כלי ניטור שאתם מכירים בלינוקס, מ-ps ועד top, פשוט קורא קבצים משם. וברגע שמבינים את זה, אפשר להפסיק להסתכל על הכלים האלה כקסם, ולהתחיל לקרוא את המידע הגולמי בעצמכם.