כל מה שאי פעם רציתם לדעת על צמתים ב- Linux

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

האלמנטים של מערכת קבצים

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

במערכת הקבצים ext4 של לינוקס, מבני ה- inode והספריות עובדים יחד כדי לספק מסגרת בסיסית המאחסנת את כל המטא-נתונים לכל קובץ וספרייה. הם עושים את metadata הזמין לכל מי דורש זאת, אם זה הקרנל, יישומי משתמשים, או כלי עזר לינוקס, כגון ls, stat, ו df.

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

אמנם נכון שיש זוג מבנים, אך מערכת קבצים דורשת הרבה יותר מזה. ישנם אלפים ואלפים של כל מבנה. כל קובץ וספרייה דורשים קוד, ומכיוון שכל קובץ נמצא בספריה, כל קובץ דורש גם מבנה ספריות. מבני ספריות נקראים גם ערכי ספריות, או "שיניים".

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

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

כל האינודים מוחזקים בטבלה אחת. באמצעות מספר קוד, מערכת הקבצים מחשבת את הקיזוז בקלות לטבלת האינודים בה נמצאת אותה קוד. אתה יכול לראות מדוע ה- "i" ב- inode מייצג אינדקס.

המשתנה המכיל את מספר האינודה מוכרז בקוד המקור כמספר שלם ארוך של 32 סיביות ולא חתום. המשמעות היא שמספר האינודה הוא ערך שלם בגודל מקסימלי של 2 ^ 32, המחושב ל -4,294,967,295 - הרבה יותר מ -4 מיליארד אינודים.

זה המקסימום התיאורטי. בפועל, מספר האינודים במערכת קבצים ext4 נקבע כאשר מערכת הקבצים נוצרת ביחס ברירת מחדל של קוד אחד לכל 16 קילו-בתים של קיבולת מערכת הקבצים. מבני ספריות נוצרים באופן מיידי כאשר מערכת הקבצים נמצאת בשימוש, שכן קבצים וספריות נוצרים בתוך מערכת הקבצים.

יש פקודה שבה אתה יכול להשתמש כדי לראות כמה קידודים נמצאים במערכת קבצים במחשב שלך. האפשרות -i(inodes) של dfהפקודה מורה לה להציג את הפלט שלה במספר inodes.

אנו נסתכל על מערכת הקבצים במחיצה הראשונה בכונן הקשיח הראשון, ולכן אנו מקלידים את הדברים הבאים:

df -i / dev / sda1

התפוקה נותנת לנו:

  • מערכת קבצים : מערכת הקבצים עליה מדווחים.
  • Inodes : המספר הכולל של האינודים במערכת קבצים זו.
  • IUsed : מספר האינודים בשימוש.
  • IFree : מספר האינודים הנותרים הזמינים לשימוש.
  • IUse% : אחוז האינודים המשומשים.
  • מותקן ב : נקודת ההרכבה של מערכת קבצים זו.

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

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

כדי לראות את גודל חסימות הדיסק במערכת הקבצים שלך, אתה יכול להשתמש blockdevבפקודה עם האפשרות --getbsz(קבל גודל בלוק):

sudo blockdev - getbsz / dev / sda

גודל החסימה הוא 4096 בתים.

בואו נשתמש באפשרות -B(גודל בלוק) כדי לציין גודל בלוק של 4096 בתים ונבדוק את השימוש הרגיל בדיסק:

df -B 4096 / dev / sda1

פלט זה מראה לנו:

  • מערכת קבצים : מערכת הקבצים עליה אנו מדווחים.
  • קוביות 4K : המספר הכולל של 4 קוביות בלוקים במערכת קבצים זו.
  • בשימוש : כמה קוביות 4K בשימוש.
  • זמין : מספר 4 חסימות ה- KB שנותרו הזמינות לשימוש.
  • השתמש באחוזים : האחוז של 4 חוסמי KB שנעשה בהם שימוש.
  • מותקן ב : נקודת ההרכבה של מערכת קבצים זו.

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

מטא נתונים של Inode

כדי לראות את מספר ה- inode של הקובץ, נוכל להשתמש lsבאפשרות -i(inode):

ls -i geek.txt

מספר האינודה של הקובץ הזה הוא 1441801, ולכן האינודה הזו מחזיקה את המטא נתונים עבור קובץ זה, ובאופן מסורתי, המצביעים על חסימות הדיסק בהן הקובץ נמצא בכונן הקשיח. אם הקובץ מקוטע, גדול מאוד או שניהם, חלק מהחסימות שהאינודה מצביעות עליהן עשויות להחזיק מצביעים נוספים על חסימות דיסק אחרות. וכמה מאותם חסימות דיסק אחרות עשויות להחזיק גם מצביעים לקבוצה אחרת של חסימות דיסק. זה מתגבר על הבעיה שה- inode הוא בגודל קבוע ומסוגל להחזיק מספר סופי של מצביעים לבלוקי דיסק.

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

אם אתה רוצה לראות אם מערכת הקבצים שלך משתמשת במצבי חסימת דיסק או הרחבות, אתה יכול להסתכל בתוך קוד. לשם כך נשתמש debugfsבפקודה עם האפשרות -R(בקשה) ונעביר אותה לאינודו של קובץ העניין. זה מבקש  debugfs להשתמש בפקודה הפנימית "stat" שלה כדי להציג את תוכן ה- inode. מכיוון שמספרי האינוד הם ייחודיים רק במערכת קבצים, עלינו לומר גם debugfs למערכת הקבצים שעליה נמצא האינודה.

הנה איך פקודה לדוגמה זו תיראה:

sudo debugfs -R "stat" / dev / sda1

כפי שמוצג להלן, debugfsהפקודה מוציאה את המידע מה- inode ומציגה לנו אותה ב less:

מוצג לנו המידע הבא:

  • Inode : מספר ה- Inode שאנחנו מסתכלים עליו.
  • סוג : זהו קובץ רגיל, לא ספריה או קישור סמלי.
  • מצב : הרשאות הקבצים באוקטובל.
  • דגלים : אינדיקטורים המייצגים תכונות או פונקציונליות שונים. 0x80000 הוא דגל "extents" (עוד על כך בהמשך).
  • דור : מערכת קבצי רשת (NFS) משתמשת בזה כאשר מישהו ניגש למערכות קבצים מרוחקות באמצעות חיבור רשת כאילו היו מותקנות על המחשב המקומי. מספרי האינודה והדור משמשים כצורה של ידית קבצים.
  • גרסה : גרסת ה- Inode.
  • משתמש : הבעלים של הקובץ.
  • קבוצה : בעל הקבוצה של הקובץ.
  • פרויקט : תמיד צריך להיות אפס.
  • גודל : גודל הקובץ.
  • ACL קובץ : רשימת בקרת הגישה לקבצים. אלה נועדו לאפשר לך לתת גישה מבוקרת לאנשים שאינם בקבוצת הבעלים.
  • קישורים : מספר הקישורים הקשיחים לקובץ.
  • ספירת חסימות : כמות שטח הכונן הקשיח שהוקצה לקובץ זה, נתונה בנתחי 512 בתים. לקובץ שלנו הוקצו שמונה כאלה, שהם 4,096 בתים. לכן, קובץ ה- 98 בתים שלנו יושב בתוך בלוק דיסק בודד של 4,096 בתים.
  • שבר : קובץ זה אינו מקוטע. (זהו דגל מיושן.)
  • Ctime : השעה שבה נוצר הקובץ.
  • זמן : הזמן בו הגישה האחרונה לקובץ זה.
  • Mtime : השעה בה שונה קובץ זה לאחרונה.
  • Crtime : הזמן בו נוצר הקובץ.
  • גודל שדות האינודה הנוספים : מערכת הקבצים ext4 הציגה את היכולת להקצות אינודה גדולה יותר בדיסק בזמן הפורמט. ערך זה הוא מספר הבתים הנוספים בהם משתמש האינודה. ניתן להשתמש במרחב נוסף זה גם כדי להתאים לדרישות עתידיות עבור גרעינים חדשים או לאחסון תכונות מורחבות.
  • בדיקת אינודה : בדיקת בדיקה לאינודה זו, המאפשרת לזהות אם האינודה פגום.
  • הרחבות : אם משתמשים בהרחבות (ב- ext4, הם כברירת מחדל), למטא-נתונים לגבי השימוש בחסימת הדיסקים בקבצים יש שני מספרים המציינים את חסימות ההתחלה והסיום של כל חלק של קובץ מקוטע. זה יעיל יותר מאחסון כל חסימת דיסק שנלקחת על ידי כל חלק בקובץ. יש לנו מידה אחת מכיוון שהקובץ הקטן שלנו יושב בבלוק דיסק אחד בקיזוז הבלוק הזה.

איפה שם הקובץ?

כעת יש לנו מידע רב אודות הקובץ, אך כפי ששמתם לב, לא קיבלנו את שם הקובץ. כאן נכנס לתמונה מבנה הספריות. בלינוקס, בדיוק כמו קובץ, בספריה יש קוד. במקום להצביע על חסימות דיסק המכילות נתוני קבצים, עם זאת, שורת ספרייה מכוונת לבלוקי דיסק המכילים מבני ספריות.

בהשוואה לאינודה, מבנה ספריות מכיל כמות מוגבלת של מידע על קובץ. הוא מחזיק רק את מספר האינוד, השם ואורך השם של הקובץ.

האינודה ומבנה הספריות מכילים את כל מה שאתה (או יישום) צריך לדעת על קובץ או ספריה. מבנה הספריה נמצא בבלוק דיסק ספריות, כך שאנו יודעים את הספריה בה הקובץ נמצא. מבנה הספריה נותן לנו את שם הקובץ ומספר האינוד. ה- Inode מספר לנו כל דבר אחר אודות הקובץ, כולל חותמות זמן, הרשאות ואיפה ניתן למצוא את נתוני הקבצים במערכת הקבצים.

סניפי אינדקס

אתה יכול לראות את מספר ה- inode של הספרייה באותה קלות שאתה יכול לראות אותם עבור קבצים.

בדוגמה הבאה, נשתמש ls עם -l(בפורמט ארוך), -i(inode), ו -d(ספרייה) אופציות, ולהביט workבספרייה:

ls -עבודת מכסה /

מכיוון שהשתמשנו באפשרות -d(directory),  lsמדווחים על הספריה עצמה, ולא על תוכנה. קוד הצפייה לספרייה זו הוא 1443016.

כדי לחזור על כך homeבספריה, אנו מקלידים את הדברים הבאים:

ls -מכסה ~

Inode עבור homeהספרייה הוא 1447510, ואת workהמדריך נמצא בספרייה הביתית. עכשיו, בואו נסתכל על תוכן workהספריה. במקום האפשרות  -d(מדריך) נשתמש באפשרות -a(הכל). זה יראה לנו את ערכי הספריות שבדרך כלל מוסתרים.

אנו מקלידים את הדברים הבאים:

ls -lia work /

מכיוון שהשתמשנו באפשרות -a(הכל), הערכים היחידים (.) והנקודות הכפולות (..) מוצגים. ערכים אלה מייצגים את הספריה עצמה (נקודה אחת), וספריית האב שלה (נקודה כפולה).

אם אתה מסתכל על מספר האינודה עבור ערך הנקודה הבודדת, אתה שזה 1443016 - אותו מספר האינודה שקיבלנו כשגילינו את מספר האינודה של workהספריה. כמו כן, מספר האינודה עבור ערך הנקודה הכפול זהה למספר האינודה של homeהספריה.

זו הסיבה שאתה יכול להשתמש cd ..בפקודה כדי לעלות ברמה בעץ הספריות. כמו כן, כאשר אתה מקדים שם יישום או סקריפט   ./, אתה מודיע לקליפה מאיפה להפעיל את היישום או הסקריפט.

קידודים וקישורים

כפי שסיקרנו, שלושה רכיבים נדרשים שיהיה להם קובץ מעוצב ונגיש במערכת הקבצים: הקובץ, מבנה הספריה והאינודה. הקובץ הוא הנתונים המאוחסנים בכונן הקשיח, מבנה הספריה מכיל את שם הקובץ ומספר האינודו שלו, והאינודה מכילה את כל מטא הנתונים עבור הקובץ.

קישורים סימבוליים הם ערכי מערכת קבצים שנראים כמו קבצים, אך הם באמת קיצורי דרך המצביעים על קובץ או ספרייה קיימים. בואו נראה איך הם מנהלים את זה, ואיך משתמשים בשלושת האלמנטים כדי להשיג זאת.

נניח שיש לנו ספריה ובה שני קבצים: האחד הוא סקריפט, והשני הוא יישום, כפי שמוצג להלן.

אנו יכולים להשתמש בפקודה ln ובאפשרות -s(סמלית) כדי ליצור קישור רך לקובץ הסקריפט, כך:

ls -s my_script geek.sh

יצרנו קישור my_script.shלהתקשרות geek.sh. אנו יכולים להקליד את הדברים הבאים ולהשתמש  ls בכדי לבחון את שני קבצי הסקריפט:

ls -li * .ש

הערך עבור geek.sh מופיע בכחול. התו הראשון של דגלי ההרשאות הוא "l" לקישור,  ->והנקודות אליו my_script.sh. כל זה מצביע על כך geek.shשהוא קישור.

כפי שאתה בוודאי מצפה, לשני קבצי הסקריפט יש מספרים שונים של קוד. מה שעשוי להיות מפתיע יותר, עם זאת, הוא הקישור הרך geek.sh, ואין לו הרשאות משתמש זהות לקובץ הסקריפט המקורי. למעשה, ההרשאות עבור  geek.shהרבה יותר ליברליות - לכל המשתמשים יש הרשאות מלאות.

מבנה הספריה עבור geek.shמכיל את שם הקישור ואת קודו. כשאתה מנסה להשתמש בקישור, מוזכרת לאינודה שלו, ממש כמו קובץ רגיל. קוד קישור יכוון לחסימת דיסק, אך במקום להכיל נתוני תוכן קובץ, חסימת הדיסק מכילה את שם הקובץ המקורי. מערכת הקבצים מפנה מחדש לקובץ המקורי.

אנו נמחק את הקובץ המקורי ונראה מה קורה כאשר אנו מקלידים את הדברים הבאים כדי להציג את התוכן של  geek.sh:

rm my_script.sh
geek.sh חתול

הקישור הסמלי נשבר וההפניה מחדש נכשלת.

כעת אנו מקלידים את הדברים הבאים כדי ליצור קישור קשה לקובץ היישום:

באפליקציה מיוחדת של חנון

כדי לבדוק את האינודים עבור שני הקבצים הללו, אנו מקלידים את הדברים הבאים:

ls -li

שניהם נראים כמו קבצים רגילים. שום דבר לא geek-appמעיד על כך שהוא קישור באופן בו רושם lsהרישום geek.sh. בנוסף,  geek-app יש הרשאות משתמש זהות לקובץ המקורי. עם זאת, מה שמפתיע הוא שלשתי היישומים יש אותו מספר קוד: 1441797.

ערך הספריה עבור geek-appמכיל את השם "geek-app" ומספר קוד, אך זהה למספר האינודה של הקובץ המקורי. לכן, יש לנו שתי ערכי מערכת קבצים עם שמות שונים ששניהם מצביעים על אותו קוד. למעשה, כל מספר פריטים יכול להצביע על אותו קוד.

אנו נקליד את הדברים הבאים ונשתמש statבתוכנית כדי להסתכל על קובץ היעד:

סטט יישום מיוחד

אנו רואים ששני קישורים קשים מצביעים על קובץ זה. זה מאוחסן ב- inode.

בדוגמה הבאה אנו מוחקים את הקובץ המקורי ומנסים להשתמש בקישור עם סיסמה סודית ומאובטחת:

rm יישום מיוחד
./geek-app correcthorsebatterystaple

באופן מפתיע, היישום פועל כצפוי, אבל איך? זה עובד מכיוון שכאשר אתה מוחק קובץ, ניתן לעשות שימוש חופשי באינודה. מבנה הספרייה מסומן ככזה שמספר האינודו הוא אפס, ובלוקי הדיסק זמינים לאחסון קובץ אחר באותו שטח.

אם מספר הקישורים הקשים לאינודה גדול מאחד, לעומת זאת, ספירת הקישורים הקשים מצטמצמת באחד, ומספר האינודה של מבנה הספריה של הקובץ שנמחק נקבע לאפס. תוכן הקובץ בכונן הקשיח וב- Inode עדיין זמין לקישורים הקשיחים הקיימים.

נקליד את הדברים הבאים ונשתמש בסטט פעם נוספת - הפעם בתאריך geek-app:

אפליקציית stat geek

פרטים אלה נשלפים מאותו קוד (1441797) כמו statהפקודה הקודמת . ספירת הקישורים צומצמה באחת.

מכיוון שאנו מקשרים אחד קשה לאינודה זו, אם אנו מוחקים  geek-app, זה באמת ימחק את הקובץ. מערכת הקבצים תשחרר את הצומת ותסמן את מבנה הספריה באינודה של אפס. לאחר מכן קובץ חדש יכול להחליף את אחסון הנתונים בכונן הקשיח.

קשורים: כיצד להשתמש בפקודה stat בלינוקס

תקורות אינוד

זו מערכת מסודרת, אבל יש תקורות. כדי לקרוא קובץ, מערכת הקבצים צריכה לעשות את כל הפעולות הבאות:

  • מצא את מבנה הספריות הנכון
  • קרא את מספר הקוד
  • מצא את ה- inode הנכון
  • קרא את מידע ה- inode
  • עקוב אחר קישורי ה- inode או ההרחבה לבלוקי הדיסק הרלוונטיים
  • קרא את נתוני הקבצים

קצת יותר קפיצה מסביב נחוצה אם הנתונים אינם רציפים.

דמיין את העבודה שיש  ls לבצע כדי לבצע רישום קבצים בפורמט ארוך של קבצים רבים. יש הרבה הלוך ושוב רק lsכדי לקבל את המידע הדרוש להפקת התפוקה שלו.

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

עכשיו תדע מדוע.