أنظمة الملفات الافتراضية لنظام Linux: لماذا هي مطلوبة وكيف تعمل؟ الجزء 1

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

تعمل أنظمة الملفات الافتراضية كنوع من التجريد السحري الذي يسمح لفلسفة Linux بقول "كل شيء ملف".



ما هو نظام الملفات؟ استنادًا إلى كلمات أحد المساهمين والمؤلفين الرئيسيين لنظام Linux ، Robert Love ، "نظام الملفات هو مستودع بيانات هرمي ، تم تجميعه وفقًا لهيكل محدد." على الرغم من أن هذا التعريف مناسب تمامًا لـ VFAT (جدول تخصيص الملفات الظاهري) و Git و Cassandra ( قاعدة بيانات NoSQL ). إذن ما الذي يحدد مفهومًا مثل "نظام الملفات" بالضبط؟

أساسيات نظام الملفات

يحتوي Linux kernel على متطلبات محددة لكيان يمكن اعتباره نظام ملفات. يجب أن تطبق أساليب open() و read() و write() للكائنات الثابتة التي لها أسماء. من وجهة نظر البرمجة الموجهة للكائنات ، تعرف النواة نظام الملفات العامة (نظام الملفات العامة) كواجهة مجردة ، وتعتبر هذه الوظائف الثلاث الكبيرة "افتراضية" وليس لها تعريف محدد. وفقًا لذلك ، يُطلق على التطبيق الافتراضي لنظام الملفات نظام الملفات الظاهري (VFS).



إذا استطعنا فتح كيان وقراءته وكتابته ، فسيتم اعتبار هذا الكيان ملفًا ، كما نرى من المثال الموجود في وحدة التحكم أعلاه.
تؤكد ظاهرة VFS فقط على خاصية الملاحظة للأنظمة المشابهة لنظام Unix ، والتي تنص على أن "كل شيء ملف". فكر في كم هو غريب أن المثال الصغير أعلاه مع / dev / console يوضح كيف تعمل وحدة التحكم فعليًا. تظهر الصورة جلسة باش التفاعلية. إرسال سلسلة إلى وحدة التحكم (جهاز وحدة افتراضية) يعرضها على شاشة افتراضية. VFS له خصائص أخرى ، حتى غريبة. على سبيل المثال ، يجعل من الممكن البحث فيها .

تحتوي الأنظمة المألوفة مثل ext4 و NFS و / proc على ثلاث وظائف مهمة في بنية بيانات C تسمى file_operations . بالإضافة إلى ذلك ، تقوم بعض أنظمة الملفات بتوسيع وظائف VFS وإعادة تعريفها بطريقة مألوفة وموجهة نحو الكائن. كما يلاحظ Robert Love ، فإن تجريد VFS يسمح لمستخدمي Linux بنسخ الملفات بشكل غير واضح إلى أو من أنظمة تشغيل الطرف الثالث أو كيانات مجردة مثل الأنابيب ، دون الحاجة إلى القلق بشأن تنسيق البيانات الداخلية. على جانب المستخدم (userpace) ، باستخدام استدعاء نظام ، يمكن لعملية نسخ من ملف إلى بنيات بيانات kernel باستخدام طريقة read() لنظام ملفات واحد ، ثم استخدام أسلوب write() لنظام ملفات آخر لإخراج البيانات.

تم العثور على تعريفات الوظائف التي تنتمي إلى أنواع VFS الأساسية في ملفات fs / *. C من مصدر kernel ، بينما تحتوي fs/ الدلائل الفرعية على أنظمة ملفات محددة. يحتوي kernel أيضًا على كيانات ، مثل cgroups و /dev و tmpfs ، وهي مطلوبة أثناء عملية التمهيد وبالتالي فهي محددة في الدليل الفرعي init/ kernel. لاحظ أن cgroups و /dev و tmpfs لا تستدعي وظائف الثلاثة الكبار في file_operations ، لكنهم يقرؤون ويكتبون مباشرة على الذاكرة.
يوضح الرسم البياني أدناه كيفية وصول المستخدمين إلى أنواع مختلفة من أنظمة الملفات التي يتم تثبيتها عادة على أنظمة Linux. لا يتم عرض الإنشاءات مثل POSIX clocks pipes و dmesg و POSIX clocks ، والتي تقوم أيضًا بتنفيذ هيكل عمليات file_operations ، والتي يمكن الوصول إليها عبر طبقة VFS.



VFS هي "طبقة file_operations " بين مكالمات النظام والتطبيقات الخاصة ببعض عمليات file_operations ، مثل ext4 و procfs . يمكن أن تتفاعل وظائف file_operations إما مع برامج تشغيل الجهاز أو أجهزة الوصول إلى الذاكرة. لا تستخدم file_operations devtmpfs و devtmpfs و cgroups file_operations ، ولكنها تستخدم الذاكرة مباشرة.
يوفر وجود VFS القدرة على إعادة استخدام التعليمات البرمجية ، لأن الأساليب الأساسية المرتبطة بأنظمة الملفات لا تحتاج إلى إعادة تنفيذها بواسطة كل نوع من أنواع أنظمة الملفات. إعادة استخدام الكود هي ممارسة مقبولة على نطاق واسع لمهندسي البرمجيات! ومع ذلك ، إذا كانت التعليمات البرمجية القابلة لإعادة الاستخدام تحتوي على أخطاء جسيمة ، فإن جميع التطبيقات التي ترث الأساليب الشائعة تعاني منها.

/ tmp: تلميح بسيط

هناك طريقة سهلة للكشف عن وجود VFS على النظام وهي إدخال mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ ، والتي ستُظهر جميع أنظمة الملفات المحمّلة غير المقيمة على القرص وليس NFS ، وهذا صحيح على معظم أجهزة الكمبيوتر. واحد من يتصاعد VFS المذكورة أعلاه سيكون بلا شك /tmp ، أليس كذلك؟



يعلم الجميع أن تخزين /tmp على وسيط مادي هو مجنون! مصدر .

لماذا هو غير مرغوب فيه لتخزين /tmp على وسائل الإعلام المادية؟ لأن الملفات الموجودة في /tmp مؤقتة وأن أجهزة التخزين تكون أبطأ من الذاكرة حيث يتم إنشاء tmpfs. علاوة على ذلك ، تكون الوسائط الفعلية أكثر عرضة للتآكل من الذاكرة. أخيرًا ، قد تحتوي الملفات الموجودة في / tmp على معلومات حساسة ، لذا فإن اختفائها مع كل عملية إعادة تشغيل هي وظيفة متكاملة.

لسوء الحظ ، تقوم بعض برامج تثبيت توزيع Linux بإنشاء / tmp على جهاز التخزين الافتراضي. لا تيأس إذا حدث هذا لنظامك. اتبع بعض الإرشادات البسيطة من Arch Wiki لإصلاح ذلك ، وتذكر أن الذاكرة المخصصة لـ tmpfs لا يمكن الوصول إليها لأغراض أخرى. بمعنى آخر ، يمكن أن ينفد نظام الذاكرة الذي يحتوي على ملفات tmpfs العملاقة والملفات الكبيرة منه. تلميح آخر: عند تحرير ملف /etc/fstab ، تذكر أنه يجب أن ينتهي بسطر جديد ، وإلا فلن يقوم نظامك بالإقلاع.

/ proc و / sys

بالإضافة إلى /tmp ، فإن VFS (أنظمة الملفات الافتراضية) التي يعرفها مستخدمي Linux هي /proc و /sys . ( /dev موجود في الذاكرة المشتركة وليس لديه file_operations ). لماذا بالضبط هذين العنصرين؟ دعونا ننظر في هذه القضية.

يأخذ procfs لقطة من kernel والعمليات التي يراقبها عن userspace . في /proc يعرض kernel معلومات حول الأدوات التي يمتلكها ، على سبيل المثال ، المقاطعات ، الذاكرة الظاهرية ، والمجدولة. بالإضافة إلى ذلك ، /proc/sys هو المكان الذي تتوفر فيه خيارات المستخدمين التي تم تكوينها باستخدام الأمر sysctl . يتم عرض حالة وإحصائيات العمليات الفردية في /proc/ الدلائل.



هنا /proc/meminfo هو ملف فارغ يحتوي مع ذلك على معلومات قيمة.

يوضح سلوك ملفات /proc مدى اختلاف أنظمة ملفات قرص VFS. من ناحية ، يحتوي /proc/meminfo على معلومات يمكن عرضها باستخدام الأمر free . من ناحية أخرى ، إنه فارغ هناك! كيف هذا؟ يشبه الموقف مقالة مشهورة بعنوان "هل القمر موجود عندما لا ينظر إليه أحد؟" الواقع ونظرية الكم ، كتبه أستاذ الفيزياء بجامعة كورنيل ديفيد ميرمين في عام 1985. الحقيقة هي أن النواة تجمع إحصائيات الذاكرة عند تقديم /proc ، وفي الواقع لا يوجد شيء في ملفات /proc عندما لا يبحث أحد هناك. كما قال ميرمين ، "ينص مبدأ المذهب الأساسي على أن القياس ، كقاعدة عامة ، لا يكشف عن القيمة الموجودة مسبقًا للخاصية المقاسة." (فكر في سؤال القمر كواجب منزلي!)
الفراغ الظاهر لل procfs منطقي ، لأن المعلومات هناك ديناميكية. وضع مختلف بعض الشيء مع sysfs . دعنا نقارن بين عدد ملفات بايت واحد على الأقل في /proc و /sys .



يحتوي Procfs على ملف واحد ، وهو تكوين kernel الذي تم تصديره ، والذي يعد استثناء لأنه يحتاج إلى إنشاء مرة واحدة فقط لكل إقلاع. /sys من ناحية أخرى ، يحتوي على العديد من الملفات الضخمة ، يشغل الكثير منها صفحة كاملة من الذاكرة. عادة ، تحتوي ملفات sysfs على رقم أو سطر واحد تمامًا ، على عكس جداول المعلومات التي تم الحصول عليها عن طريق قراءة ملفات مثل /proc/meminfo .

الغرض من sysfs هو توفير خصائص قابلة للقراءة «kobjects» لما يطلق عليه kernel «kobjects» في مساحة المستخدمين. الغرض الوحيد من kobjects هو حساب الروابط: عند حذف آخر رابط إلى kobject ، سيستعيد النظام الموارد المرتبطة به. ومع ذلك ، تشكل /sys الجزء الأكبر من النواة الشهيرة "ABI for userpace" ، والتي لا يمكن لأي شخص ، تحت أي ظرف من الظروف ، كسرها . هذا لا يعني أن الملفات الموجودة في sysfs ثابتة ، والتي من شأنها أن تتناقض مع عدد الروابط للكائنات غير المستقرة.
تحد واجهة تطبيق kernel المستقرة (kernel مستقرة ABI) مما قد يظهر في /sys ، وليس ما هو موجود فعليًا في هذه اللحظة بالذات. يوفر سرد أذونات الملفات في sysfs فهمًا لكيفية ضبط الإعدادات القابلة للتكوين للأجهزة والوحدات النمطية وأنظمة الملفات ، إلخ. يمكن تخصيصها أو قراءتها. نستنتج أن procfs هو أيضًا جزء من نواة ABI المستقرة ، على الرغم من أن هذا لم يرد صراحة في الوثائق .



تصف الملفات الموجودة في sysfs خاصية واحدة محددة لكل كيان ويمكن قراءتها أو إعادة كتابتها أو كليهما مرة واحدة. يشير "0" في الملف إلى أنه لا يمكن حذف SSD.

نبدأ الجزء الثاني من الترجمة بكيفية مراقبة VFS باستخدام أدوات eBPF و bcc ، ونحن الآن في انتظار تعليقاتك ودعوتك تقليديًا إلى ندوة الويب المفتوحة ، والتي سيعقدها مدرسنا فلاديمير دروزديتسكي في 9 أبريل.

الجزء الثاني.

Source: https://habr.com/ru/post/ar446614/


All Articles