מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

שלום לכולם! אנחנו ממשיכים להשיק זרמים חדשים לקורסים שכבר התאהבתם בהם ועכשיו אנחנו ממהרים להודיע ​​שאנחנו מתחילים סט חדש של קורסים "מנהל לינוקס"שיושק בסוף אפריל. לאירוע זה יתוארך פרסום חדש. עם החומר המקורי, אתה יכול קרא כאן.

מערכות קבצים וירטואליות משמשות מעין הפשטה קסומה המאפשרת לפילוסופיה של לינוקס לומר ש"הכל קובץ".

מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

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

יסודות מערכת הקבצים

לליבה של לינוקס יש דרישות מסוימות עבור ישות שיכולה להיחשב כמערכת קבצים. היא חייבת ליישם את השיטות open(), read() и write() עבור אובייקטים מתמידים בעלי שמות. מנקודת מבט מכוונת עצמים תכנות, הליבה מגדירה מערכת קבצים גנרית כממשק מופשט, ושלוש הפונקציות הגדולות הללו נחשבות "וירטואליות" ואין להן הגדרה קונקרטית. בהתאם לכך, יישום ברירת המחדל של מערכת הקבצים נקרא מערכת קבצים וירטואלית (VFS).

מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

אם אנחנו יכולים לפתוח, לקרוא ולכתוב לישות, אזי אותה ישות נחשבת לקובץ, כפי שאנו יכולים לראות מהדוגמה במסוף למעלה.
תופעת ה-VFS רק מדגישה את התצפית דמויית יוניקס ש"הכל קובץ". תחשוב כמה מוזר שהדוגמה הקטנה של /dev/console שלמעלה מראה איך הקונסולה עובדת בפועל. התמונה מציגה סשן אינטראקטיבי של Bash. שליחת מחרוזת לקונסולה (מכשיר קונסולה וירטואלית) מציגה אותה על מסך וירטואלי. ל-VFS יש מאפיינים אחרים, אפילו מוזרים יותר. לדוגמה, זה מאפשר לך לחפש לפי זה.

למערכות מוכרות כמו ext4, NFS ו-/proc יש שלוש פונקציות חשובות במבנה נתונים C הנקרא file_operations. בנוסף, מערכות קבצים מסוימות מרחיבות ומגדירות מחדש את פונקציונליות VFS בצורה מוכרת מונחה עצמים. כפי שרוברט לאב מציין, ההפשטה של ​​VFS מאפשרת למשתמשי לינוקס להעתיק באופן נונשלנטי קבצים אל או ממערכות הפעלה של צד שלישי או ישויות מופשטות כמו צינורות מבלי לדאוג לפורמט הנתונים הפנימי שלהם. בצד המשתמש (מרחב המשתמש), באמצעות קריאת מערכת, תהליך יכול להעתיק מקובץ למבני נתונים של ליבה באמצעות השיטה read() מערכת קבצים אחת ולאחר מכן השתמש בשיטה write () מערכת קבצים נוספת לפלט נתונים.

הגדרות הפונקציות השייכות לסוגי ה-VFS הבסיסיים נמצאות בקבצים fs/*.c קוד מקור ליבה, בעוד ספריות משנה fs/ מכילים מערכות קבצים מסוימות. הליבה מכילה גם ישויות כגון cgroups, /dev и tmpfs, אשר נדרשים במהלך תהליך האתחול ולכן הם מוגדרים בספריית המשנה של הליבה init/. שים לב ש cgroups, /dev и tmpfs אל תקרא לפונקציות "שלוש הגדולות". file_operations, אבל ישר לקרוא ולכתוב לזיכרון.
התרשים שלהלן מראה כיצד מרחב המשתמש ניגש לסוגים השונים של מערכות קבצים המותקנות בדרך כלל במערכות לינוקס. מבנים לא מוצגים pipes, dmesg и POSIX clocks, שגם מיישמים את המבנה file_operations, הגישה אליו דרך שכבת VFS.

מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

VFS היא "שכבת עטיפה" בין קריאות מערכת והטמעות של מסוימות file_operations, כגון ext4 и procfs. פונקציות file_operations יכול לקיים אינטראקציה עם מנהלי התקנים או התקני גישה לזיכרון. tmpfs, devtmpfs и cgroups אל תשתמש file_operations, אבל לגשת ישירות לזיכרון.
קיומו של VFS מספק הזדמנות לשימוש חוזר בקוד, שכן השיטות הבסיסיות הקשורות למערכות קבצים אינן חייבות להיות מיושמות מחדש על ידי כל סוג של מערכת קבצים. שימוש חוזר בקוד הוא נוהג נפוץ בקרב מהנדסי תוכנה! עם זאת, אם הקוד לשימוש חוזר מכיל טעויות חמורות, כל המימושים היורשים שיטות נפוצות סובלים מהם.

/tmp: רמז פשוט

דרך קלה לזהות ש-VFS קיימים במערכת היא להקליד mount | grep -v sd | grep -v :/, שיציג את הכל רכוב (mounted) מערכות קבצים שאינן תושבות דיסק ואינן NFS, מה שנכון ברוב המחשבים. אחד הרכיבים הרשומים (mounts) VFS יהיה ללא ספק /tmp, ימין?

מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

כולם מכירים את האחסון הזה / tmp על מדיום פיזי - טירוף! מקור.

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

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

/proc ו-/sys

חוץ מזה /tmp, VFS (מערכות קבצים וירטואליות) המוכרות ביותר למשתמשי לינוקס /proc и /sys. (/dev שוכן בזיכרון משותף ואין לו file_operations). מדוע שני המרכיבים הללו? בואו נבחן את הנושא הזה.

procfs יוצר תמונת מצב של הליבה והתהליכים שאחריהם הוא מנטר userspace. בתוך /proc הקרנל מדפיס מידע על מה שיש לו זמין, כגון פסיקות, זיכרון וירטואלי ומתזמן. חוץ מזה, /proc/sys הוא המקום שבו הפרמטרים מוגדרים עם הפקודה sysctl, פנוי ל userspace. סטטוס וסטטיסטיקה של תהליכים בודדים מוצגים בקטלוגים /proc/.

מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

כאן /proc/meminfo הוא קובץ ריק שבכל זאת מכיל מידע רב ערך.

התנהגות /proc קבצים מראה כמה מערכות קבצי דיסק VFS יכולות להיות שונות. מצד אחד, /proc/meminfo מכיל מידע שניתן לראות באמצעות הפקודה free. מצד שני, זה ריק! איך זה עובד? המצב מזכיר את המאמר המפורסם שכותרתו האם הירח קיים כשאף אחד לא מסתכל עליו? מציאות ותורת הקוונטים"נכתב על ידי פרופסור לפיזיקה באוניברסיטת קורנל דיוויד מרמין ב-1985. העובדה היא שהקרנל אוסף סטטיסטיקות זיכרון כאשר מתקבלת בקשה /proc, ולמעשה בקבצים /proc אין כלום כשאף אחד לא מסתכל. כמו שנאמר מרמין, "תורת הקוונטים הבסיסית אומרת שמדידה בדרך כלל אינה חושפת ערך קיים מראש של הנכס הנמדד." (וחשבו על השאלה על הירח כשיעורי בית!)
ריקנות לכאורה procfs הגיוני כי המידע שם הוא דינמי. מצב קצת שונה עם sysfs. בואו נשווה כמה קבצים בגודל של בת אחד לפחות נמצאים /proc ו - /sys.

מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

Procfs יש קובץ אחד, כלומר תצורת הליבה המיוצאת, שהיא חריגה מכיוון שצריך ליצור אותה רק פעם אחת בכל אתחול. מצד שני, ב /sys יש הרבה קבצים גדולים יותר, שרבים מהם תופסים עמוד שלם של זיכרון. בדרך כלל קבצים sysfs מכילים מספר או שורה אחת בדיוק, בניגוד לטבלאות מידע המתקבלות מקריאת קבצים כגון /proc/meminfo.

יעד sysfs - לספק מאפייני קריאה/כתיבה של מה שהקרנל קורא «kobjects» במרחב המשתמש. המטרה היחידה kobjects הוא ספירת קישורים: כאשר הקישור האחרון ל-kobject יוסר, המערכת תשחזר את המשאבים המשויכים אליו. על כל פנים, /sys מרכיב את רוב המפורסמים "ABI יציב למרחב משתמש" ליבה, שאף אחד לא יכול לעולם, בשום מצב "לשבור". זה לא אומר שקבצים ב-sysfs הם סטטיים, מה שלא יעלה בקנה אחד עם ספירת הפניות של אובייקטים לא יציבים.
ה-ABI היציב של הקרנל מגביל את מה שיכול להופיע בו /sys, לא מה שבאמת נוכח באותו רגע מסוים. רישום הרשאות קבצים ב-sysfs מספק תובנה כיצד ניתן להגדיר הגדרות עבור התקנים, מודולים, מערכות קבצים וכו'. ניתן להגדיר או לקרוא. המסקנה ההגיונית היא ש-procfs הוא גם חלק מה-ABI היציב של הליבה, למרות שזה לא נאמר במפורש ב- תיעוד.

מערכות קבצים וירטואליות בלינוקס: מדוע הן נחוצות וכיצד הן פועלות? חלק 1

קבצים ב sysfs תאר מאפיין מסוים עבור כל ישות ויכול להיות קריא, לכתיבה או שניהם. "0" בקובץ אומר שלא ניתן להסיר את ה-SSD.

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

מקור: www.habr.com

הוספת תגובה