كل ما تريد معرفته عن inodes على Linux

يعتمد نظام ملفات Linux على inodes. غالبًا ما يُساء فهم هذه الأجزاء الحيوية من الأعمال الداخلية لنظام الملفات. دعونا نلقي نظرة على ما هم بالضبط وماذا يفعلون.

عناصر نظام الملفات

بحكم التعريف ، يحتاج نظام الملفات إلى تخزين الملفات ، كما أنها تحتوي على أدلة. يتم تخزين الملفات داخل الدلائل ، ويمكن أن تحتوي هذه الأدلة على أدلة فرعية. شيء ما ، في مكان ما ، يجب أن يسجل مكان وجود جميع الملفات داخل نظام الملفات ، وما يطلق عليهم ، والحسابات التي ينتمون إليها ، والأذونات التي لديهم ، وغير ذلك الكثير. تسمى هذه المعلومات بالبيانات الوصفية لأنها بيانات تصف بيانات أخرى.

في نظام الملفات Linux ext4 ، تعمل هياكل inode والدليل معًا لتوفير إطار عمل أساسي يخزن جميع البيانات الوصفية لكل ملف ودليل. أنها تجعل التعريف متاح لمن تتطلب ذلك، سواء كان ذلك النواة، تطبيقات المستخدم، أو المرافق لينكس، مثل ls، statو df.

Inodes وحجم نظام الملفات

في حين أنه صحيح أن هناك زوجًا من الهياكل ، فإن نظام الملفات يتطلب أكثر من ذلك بكثير. هناك الآلاف والآلاف من كل هيكل. يتطلب كل ملف ودليل inode ، ولأن كل ملف موجود في دليل ، فإن كل ملف يتطلب أيضًا بنية دليل. تسمى هياكل الدليل أيضًا إدخالات الدليل ، أو "أسنان"

يحتوي كل inode على رقم inode ، وهو فريد داخل نظام الملفات. قد يظهر نفس رقم inode في أكثر من نظام ملفات. ومع ذلك ، يتحد معرف نظام الملفات ورقم inode لإنشاء معرف فريد ، بغض النظر عن عدد أنظمة الملفات المثبتة على نظام Linux الخاص بك.

تذكر ، في Linux ، لا تقم بتركيب محرك أقراص ثابت أو قسم. تقوم بتثبيت نظام الملفات الموجود على القسم ، لذلك من السهل أن يكون لديك أنظمة ملفات متعددة دون أن تدرك ذلك. إذا كان لديك عدة محركات أقراص ثابتة أو أقسام على محرك أقراص واحد ، فلديك أكثر من نظام ملفات واحد. قد تكون من نفس النوع — جميعًا ext4 ، على سبيل المثال — لكنها ستظل أنظمة ملفات مميزة.

يتم الاحتفاظ بجميع inodes في جدول واحد. باستخدام رقم inode ، يقوم نظام الملفات بسهولة بحساب الإزاحة في جدول inode حيث يوجد هذا inode. يمكنك أن ترى لماذا يرمز الحرف "i" في inode إلى الفهرس.

يتم الإعلان عن المتغير الذي يحتوي على رقم inode في التعليمات البرمجية المصدر كعدد صحيح طويل بدون إشارة 32 بت. هذا يعني أن رقم inode هو قيمة عدد صحيح بحد أقصى للحجم 2 ^ 32 ، والذي يتم حسابه حتى 4،294،967،295 - ما يزيد عن 4 مليار inode.

هذا هو الحد الأقصى النظري. من الناحية العملية ، يتم تحديد عدد inode في نظام الملفات ext4 عند إنشاء نظام الملفات بنسبة افتراضية هي inode واحد لكل 16 كيلوبايت من سعة نظام الملفات. يتم إنشاء هياكل الدليل بشكل سريع عندما يكون نظام الملفات قيد الاستخدام ، حيث يتم إنشاء الملفات والدلائل داخل نظام الملفات.

هناك أمر يمكنك استخدامه لمعرفة عدد inodes الموجودة في نظام الملفات على جهاز الكمبيوتر الخاص بك. و -iالخيار (inodes) من dfقيادة يرشد فوقه لعرض انتاجها في أعداد ال inode.

سنلقي نظرة على نظام الملفات في القسم الأول على القرص الصلب الأول ، لذلك نكتب ما يلي:

مدافع -i / dev / sda1

الناتج يعطينا:

  • نظام الملفات : نظام الملفات الذي يتم الإبلاغ عنه.
  • Inodes : إجمالي عدد inodes في نظام الملفات هذا.
  • IUsed : عدد inodes قيد الاستخدام.
  • IFree : عدد inodes المتبقية المتاحة للاستخدام.
  • IUse٪ : النسبة المئوية من inodes المستخدمة.
  • مثبت على : نقطة التحميل لنظام الملفات هذا.

لقد استخدمنا 10 بالمائة من inodes في نظام الملفات هذا. يتم تخزين الملفات على القرص الصلب في شكل كتل أقراص. يشير كل inode إلى كتل القرص التي تخزن محتويات الملف الذي تمثله. إذا كان لديك الملايين من الملفات الصغيرة ، فيمكنك نفاد inodes قبل نفاد مساحة القرص الصلب. ومع ذلك ، فهذه مشكلة صعبة للغاية.

في الماضي ، واجهت بعض خوادم البريد التي تخزن رسائل البريد الإلكتروني كملفات منفصلة (مما أدى بسرعة إلى مجموعات كبيرة من الملفات الصغيرة) هذه المشكلة. عندما غيرت هذه التطبيقات نهاياتها الخلفية إلى قواعد البيانات ، أدى ذلك إلى حل المشكلة. لن ينفد نظام المنزل العادي من inodes ، وهو أمر جيد أيضًا لأنه مع نظام الملفات ext4 ، لا يمكنك إضافة المزيد من inodes دون إعادة تثبيت نظام الملفات.

لمعرفة حجم كتل القرص على نظام الملفات الخاص بك ، يمكنك استخدام blockdevالأمر مع خيار --getbsz(get block size):

sudo blockdev --getbsz / dev / sda

حجم الكتلة 4096 بايت.

دعنا نستخدم خيار -B(حجم الكتلة) لتحديد حجم كتلة 4096 بايت والتحقق من استخدام القرص العادي:

df -B 4096 / dev / sda1

يوضح لنا هذا الإخراج:

  • نظام الملفات : نظام الملفات الذي نُبلغ عنه.
  • كتل 4K : العدد الإجمالي للكتل 4 كيلوبايت في نظام الملفات هذا.
  • مستخدم : كم عدد كتل 4K قيد الاستخدام.
  • متاح : عدد الكتل المتبقية البالغة 4 كيلوبايت والمتاحة للاستخدام.
  • استخدام٪ : النسبة المئوية للكتل 4 كيلوبايت التي تم استخدامها.
  • مثبت على : نقطة التحميل لنظام الملفات هذا.

في مثالنا ، استهلك تخزين الملفات (وتخزين inodes وهياكل الدليل) 28 بالمائة من المساحة على نظام الملفات هذا ، بتكلفة 10 بالمائة من inodes ، لذلك نحن في حالة جيدة.

Inode Metadata

لرؤية رقم inode لملف ، يمكننا استخدامه lsمع -iخيار (inode):

ls -i geek.txt

رقم inode لهذا الملف هو 1441801 ، لذلك يحتوي inode هذا على البيانات الوصفية لهذا الملف ، وتقليديًا ، المؤشرات إلى كتل القرص حيث يوجد الملف على القرص الصلب. إذا كان الملف مجزأًا أو كبيرًا جدًا أو كلاهما ، فقد تحتوي بعض الكتل التي يجب أن تحتوي عليها نقاط inode مؤشرات إضافية لكتل ​​الأقراص الأخرى. وبعض كتل الأقراص الأخرى قد تحتوي أيضًا على مؤشرات لمجموعة أخرى من كتل الأقراص. هذا يتغلب على مشكلة حجم inode ثابت وقادر على الاحتفاظ بعدد محدود من المؤشرات لكتل ​​القرص.

تم استبدال هذه الطريقة بمخطط جديد يستخدم "النطاقات". تسجل هذه الكتل البداية والنهاية لكل مجموعة من الكتل المتجاورة المستخدمة لتخزين الملف. إذا كان الملف غير مجزأ ، ما عليك سوى تخزين الكتلة الأولى وطول الملف. إذا كان الملف مجزأ ، يجب عليك تخزين الكتلة الأولى والأخيرة من كل جزء من الملف. هذه الطريقة (من الواضح) أكثر كفاءة.

إذا كنت تريد معرفة ما إذا كان نظام الملفات لديك يستخدم مؤشرات أو نطاقات كتلة القرص ، يمكنك البحث داخل inode. للقيام بذلك ، سنستخدم debugfsالأمر مع -Rخيار (request) ، ونمرره inode للملف محل الاهتمام. يطلب هذا  debugfs استخدام الأمر "stat" الداخلي الخاص به لعرض محتويات inode. نظرًا لأن أرقام inode فريدة فقط داخل نظام الملفات ، يجب علينا أيضًا إخبار debugfs نظام الملفات الذي يوجد عليه inode.

إليك ما سيبدو عليه هذا المثال:

sudo debugfs -R "stat" / dev / sda1

كما هو موضح أدناه ، debugfsيستخرج الأمر المعلومات من inode ويعرضها لنا في less:

لقد أظهرنا المعلومات التالية:

  • Inode : رقم inode الذي نبحث عنه.
  • النوع : هذا ملف عادي ، وليس دليلاً أو ارتباطًا رمزيًا.
  • الوضع : أذونات الملف بالنظام الثماني.
  • الإشارات : المؤشرات التي تمثل ميزات أو وظائف مختلفة. 0x80000 هي علامة "النطاقات" (المزيد حول هذا أدناه).
  • الجيل : يستخدم نظام ملفات الشبكة (NFS) هذا عندما يصل شخص ما إلى أنظمة الملفات البعيدة عبر اتصال شبكة كما لو كانت مثبتة على الجهاز المحلي. يتم استخدام أرقام الإنود والتوليد كشكل من أشكال مقبض الملف.
  • الإصدار : إصدار inode.
  • المستخدم : صاحب الملف.
  • المجموعة : صاحب المجموعة للملف.
  • المشروع : يجب أن تكون القيمة صفر دائمًا.
  • الحجم : حجم الملف.
  • ملف ACL : قائمة التحكم في الوصول للملف. تم تصميمها للسماح لك بمنح وصول متحكم به إلى الأشخاص الذين ليسوا في مجموعة المالكين.
  • الروابط : عدد الروابط الصلبة المؤدية إلى الملف.
  • Blockcount : مقدار مساحة القرص الصلب المخصصة لهذا الملف ، معطاة بأجزاء 512 بايت. تم تخصيص ثمانية من هذه الملفات لملفنا ، وهو 4096 بايت. لذا ، فإن ملفنا 98 بايت يقع داخل كتلة قرصية واحدة تبلغ 4096 بايت.
  • جزء : هذا الملف غير مجزأ. (هذا علم عفا عليه الزمن).
  • Ctime : الوقت الذي تم فيه إنشاء الملف.
  • Atime : وقت آخر وصول إلى هذا الملف.
  • Mtime : الوقت الذي تم فيه آخر تعديل لهذا الملف.
  • Crtime : الوقت الذي تم فيه إنشاء الملف.
  • حجم حقول inode الإضافية : قدم نظام الملفات ext4 القدرة على تخصيص حجم inode أكبر على القرص في وقت التهيئة. هذه القيمة هي عدد البايتات الإضافية التي يستخدمها inode. يمكن أيضًا استخدام هذه المساحة الإضافية لاستيعاب المتطلبات المستقبلية للنواة الجديدة أو لتخزين السمات الموسعة.
  • المجموع الاختباري Inode : مجموع اختباري لهذا inode ، مما يجعل من الممكن اكتشاف ما إذا كان inode تالفًا.
  • المديات : إذا كان يتم استخدام النطاقات (على EXT4، فهي، بشكل افتراضي)، البيانات الوصفية المتعلقة القرص استخدام كتلة من الملفات واثنين من الأرقام التي تشير إلى بداية ونهاية كتل من كل جزء من ملف مجزأة. يعد هذا أكثر فاعلية من تخزين كل كتلة قرص يتم تناولها بواسطة كل جزء من الملف. لدينا حد واحد لأن ملفنا الصغير يقع في كتلة قرص واحدة عند إزاحة الكتلة هذه.

أين اسم الملف؟

لدينا الآن الكثير من المعلومات حول الملف ، لكن كما لاحظت ، لم نحصل على اسم الملف. هذا هو المكان الذي تلعب فيه بنية الدليل. في Linux ، تمامًا مثل الملف ، يحتوي الدليل على inode. بدلاً من الإشارة إلى كتل القرص التي تحتوي على بيانات الملف ، على الرغم من ذلك ، يشير inode الدليل إلى كتل القرص التي تحتوي على هياكل الدليل.

بالمقارنة مع inode ، تحتوي بنية الدليل على كمية محدودة من المعلومات حول الملف. إنه يحتفظ فقط برقم inode للملف واسمه وطول الاسم.

يحتوي inode وبنية الدليل على كل ما تحتاج لمعرفته (أو التطبيق) حول ملف أو دليل. بنية الدليل موجودة في كتلة قرص الدليل ، لذلك نعرف الدليل الذي يوجد فيه الملف. تعطينا بنية الدليل اسم الملف ورقم inode. يخبرنا inode بكل شيء آخر عن الملف ، بما في ذلك الطوابع الزمنية والأذونات ومكان العثور على بيانات الملف في نظام الملفات.

دليل Inodes

يمكنك رؤية رقم inode لدليل بنفس السهولة التي تراها بها للملفات.

في المثال التالي، سنستخدم ls مع -l(الشكل الطويل)، -i(inode)، و -dخيارات (دليل)، ونظرة على workالدليل:

ls -lid work /

لأننا استخدمنا -dخيار (الدليل) ،  lsتقارير عن الدليل نفسه ، وليس محتوياته. إنود ​​لهذا الدليل هو 1443016.

لتكرار ذلك homeللدليل نكتب ما يلي:

ls -lid ~

وinode لل homeدليل هو 1447510، و workالدليل هو في الدليل الرئيسي. الآن ، دعونا نلقي نظرة على محتويات workالدليل. بدلاً من  -dخيار (الدليل) ، سنستخدم -aخيار (الكل). سيُظهر لنا هذا إدخالات الدليل المخفية عادةً.

نكتب ما يلي:

ls- العمل على /

نظرًا لأننا استخدمنا الخيار -a(الكل) ، يتم عرض المدخلات المفردة (.) والنقطة المزدوجة (..). تمثل هذه الإدخالات الدليل نفسه (نقطة واحدة) ، ودليله الأصلي (نقطة مزدوجة.)

إذا نظرت إلى رقم inode لإدخال نقطة واحدة ، فستجد أنه هو 1443016 - نفس رقم inode الذي حصلنا عليه عندما اكتشفنا رقم inode workللدليل. أيضًا ، رقم inode لإدخال النقطة المزدوجة هو نفسه رقم inode homeللدليل.

لهذا السبب يمكنك استخدام cd ..الأمر للانتقال إلى مستوى أعلى في شجرة الدليل. وبالمثل ، عندما تسبق اسم تطبيق أو برنامج نصي   ./، فإنك تخبر shell من أين يتم تشغيل التطبيق أو البرنامج النصي.

Inodes والروابط

كما غطينا ، يلزم وجود ثلاثة مكونات للحصول على ملف جيد التكوين ويمكن الوصول إليه في نظام الملفات: الملف ، وهيكل الدليل ، و inode. الملف هو البيانات المخزنة على القرص الصلب ، وتحتوي بنية الدليل على اسم الملف ورقم inode الخاص به ، ويحتوي inode على جميع البيانات الوصفية للملف.

الروابط الرمزية هي إدخالات نظام ملفات تشبه الملفات ، لكنها في الحقيقة اختصارات تشير إلى ملف أو دليل موجود. دعونا نرى كيف يديرون ذلك ، وكيف يتم استخدام العناصر الثلاثة لتحقيق ذلك.

لنفترض أن لدينا دليلًا به ملفان: أحدهما برنامج نصي والآخر تطبيق ، كما هو موضح أدناه.

يمكننا استخدام الأمر ln -sوالخيار (الرمزي) لإنشاء رابط لين لملف البرنامج النصي ، مثل:

ls -s my_script geek.sh

لقد أنشأت رابطا ل my_script.shطالب geek.sh. يمكننا كتابة ما يلي واستخدامه  ls للنظر في ملفي البرنامج النصي:

ls -li * .sh

دخول geek.sh يظهر باللون الأزرق. الحرف الأول من أعلام الأذونات هو الحرف "l" للارتباط ،  ->ويشير إلى my_script.sh. كل هذا يشير إلى أن geek.shهذا رابط.

كما تتوقع على الأرجح ، يحتوي ملفا البرنامج النصي على أرقام inode مختلفة. ما قد يكون أكثر إثارة للدهشة هو الرابط اللين geek.sh، الذي لا يمتلك نفس أذونات المستخدم مثل ملف البرنامج النصي الأصلي. في الواقع ، تعتبر الأذونات الخاصة  geek.shبـ "أكثر ليبرالية" - فجميع المستخدمين لديهم أذونات كاملة.

يحتوي هيكل الدليل الخاص geek.shعلى اسم الارتباط و inode الخاص به. عندما تحاول استخدام الرابط ، تتم الإشارة إلى inode الخاص به ، تمامًا مثل الملف العادي. سيشير inode الارتباط إلى كتلة قرص ، ولكن بدلاً من احتواء بيانات محتوى الملف ، تحتوي كتلة القرص على اسم الملف الأصلي. يقوم نظام الملفات بإعادة التوجيه إلى الملف الأصلي.

سنحذف الملف الأصلي ، ونرى ما يحدث عندما نكتب ما يلي لعرض محتويات  geek.sh:

rm my_script.sh
القط المهوس

تم كسر الارتباط الرمزي وفشل إعادة التوجيه.

نكتب الآن ما يلي لإنشاء رابط ثابت لملف التطبيق:

ln تطبيق خاص geek-app

لإلقاء نظرة على inodes لهذين الملفين ، نكتب ما يلي:

ls -li

كلاهما يشبه الملفات العادية. لا شيء geek-appيشير إلى أنه ارتباط بالطريقة التي تم بها lsإدراجها geek.sh. بالإضافة إلى ذلك ،  geek-app لديه نفس أذونات المستخدم مثل الملف الأصلي. ومع ذلك ، ما قد يكون مفاجئًا هو أن كلا التطبيقين لهما نفس رقم inode: 1441797.

يحتوي إدخال الدليل لـ geek-appعلى الاسم "geek-app" ورقم inode ، ولكنه نفس رقم inode للملف الأصلي. لذلك ، لدينا إدخالان لنظام الملفات بأسماء مختلفة يشير كلاهما إلى نفس inode. في الواقع ، يمكن لأي عدد من العناصر أن يشير إلى نفس inode.

سنكتب ما يلي ونستخدم statالبرنامج لإلقاء نظرة على الملف الهدف:

stat خاص التطبيق

نرى أن هناك رابطين صلبين يشيران إلى هذا الملف. يتم تخزين هذا في inode.

في المثال التالي ، نحذف الملف الأصلي ونحاول استخدام الرابط بكلمة مرور سرية وآمنة:

rm تطبيق خاص
./geek-app تصحيح الخوارزمية

والمثير للدهشة أن التطبيق يعمل كما هو متوقع ، ولكن كيف؟ إنه يعمل لأنه ، عند حذف ملف ، يكون inode مجانيًا لإعادة استخدامه. تم وضع علامة على بنية الدليل على أنها تحتوي على رقم inode يساوي صفر ، ثم تتوفر كتل القرص لملف آخر ليتم تخزينه في تلك المساحة.

إذا كان عدد الروابط الثابتة إلى inode أكبر من واحد ، فسيتم تقليل عدد الروابط الثابتة بمقدار واحد ، ويتم تعيين رقم الإدخال لبنية الدليل للملف المحذوف على صفر. تظل محتويات الملف على القرص الصلب و inode متاحة للروابط الصلبة الموجودة.

سنكتب ما يلي ونستخدم stat مرة أخرى - هذه المرة في geek-app:

تطبيق stat geek

يتم سحب هذه التفاصيل من نفس inode (1441797) مثل statالأمر السابق . تم تقليل عدد الروابط بمقدار واحد.

نظرًا لأننا ننتقل إلى رابط ثابت واحد لهذا inode ، إذا قمنا بحذفه  geek-app، فسيتم حذف الملف بالفعل. سيقوم نظام الملفات بتحرير inode ووضع علامة على بنية الدليل باستخدام inode من الصفر. ثم يمكن لملف جديد الكتابة فوق تخزين البيانات على القرص الصلب.

ذات صلة: كيفية استخدام الأمر stat على نظام Linux

Inode النفقات العامة

إنه نظام أنيق ، لكن هناك نفقات عامة. لقراءة ملف ، يجب على نظام الملفات القيام بكل ما يلي:

  • ابحث عن بنية الدليل الصحيحة
  • اقرأ رقم inode
  • ابحث عن inode الصحيح
  • اقرأ معلومات inode
  • اتبع روابط inode أو نطاقات كتل القرص ذات الصلة
  • اقرأ بيانات الملف

يعد القفز أكثر قليلاً ضروريًا إذا كانت البيانات غير متجاورة.

تخيل العمل الذي يجب القيام به  ls لأداء قائمة ملفات تنسيق طويلة للعديد من الملفات. هناك الكثير من الذهاب والإياب فقط lsللحصول على المعلومات التي تحتاجها لتوليد مخرجاتها.

بالطبع ، تسريع الوصول إلى نظام الملفات هو سبب محاولة Linux القيام بأكبر قدر ممكن من التخزين المؤقت للملفات الوقائية. هذا يساعد بشكل كبير ، ولكن في بعض الأحيان - كما هو الحال مع أي نظام ملفات - يمكن أن تظهر النفقات العامة.

الآن ستعرف السبب.