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

مرحباً بالجميع ، نشارك معك الجزء الثاني من المنشور "أنظمة الملفات الافتراضية في نظام Linux: لماذا يحتاجون إليها وكيف تعمل؟" الجزء الأول يمكن قراءته هنا . تذكر أن هذه السلسلة من المنشورات مخصصة لإطلاق سلسلة رسائل جديدة في دورة Linux Administrator ، والتي ستبدأ قريبًا.

كيفية مشاهدة VFS باستخدام أدوات eBPF و bcc

أسهل طريقة لفهم كيفية عمل kernel على ملفات sysfs هي النظر إليه في الممارسة العملية ، وأسهل طريقة لمراقبة ARM64 هي استخدام eBPF. يتكون eBPF (اختصار لـ Berkeley Packet Filter) من جهاز افتراضي يعمل في kernel يمكن للمستخدمين المميزين query من سطر الأوامر. تخبر مصادر النواة القارئ بما يمكن للنواة فعله ؛ تشغيل أدوات eBPF على نظام مزدحم يوضح ما الذي تقوم به النواة بالفعل.



لحسن الحظ ، فإن بدء استخدام eBPF سهل بدرجة كافية باستخدام أدوات bcc ، والتي تتوفر كحزم من توزيع Linux العام ويتم توثيقها بالتفصيل بواسطة Bernard Gregg . أدوات bcc هي البرامج النصية بيثون مع إدراج رمز C الصغيرة ، مما يعني أن أي شخص على دراية باللغتين يمكن بسهولة تعديلها. هناك 80 نصوص بيثون في bcc/tools ، مما يعني أنه على الأرجح سيكون المطور أو مسؤول النظام قادرًا على اختيار شيء مناسب لحل المشكلة.

للحصول على فكرة سطحية حول ما يفعله VFS على نظام التشغيل ، جرب vfscount أو vfsstat . سيظهر هذا ، على سبيل المثال ، أن عشرات المكالمات إلى vfs_open() و "أصدقائه" تحدث حرفيًا كل ثانية.



vfsstat.py هو برنامج نصي Python مع إدراج رمز C والذي يقوم ببساطة بحساب استدعاءات وظائف VFS.


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



باستخدام eBPF ، يمكنك معرفة ما يحدث في /sys عند إدخال محرك أقراص فلاش USB. ويرد مثال بسيط ومعقد هنا.


في المثال أعلاه ، تعرض أداة bcc trace.py رسالة عند sysfs_create_files() الأمر sysfs_create_files() . نرى أن sysfs_create_files() تم إطلاقه باستخدام دفق kworker استجابة لمحرك الأقراص المحمول الذي يتم إدراجه ، ولكن ما هو الملف الذي تم إنشاؤه؟ يوضح المثال الثاني القوة الكاملة لـ eBPF. يعرض trace.py هنا backtrace kernel (خيار -K) واسم الملف الذي تم إنشاؤه بواسطة sysfs_create_files() . إدراج عبارة مفردة هو رمز C يتضمن سلسلة تنسيق يمكن التعرف عليها بسهولة يتم توفيرها بواسطة برنامج نصي Python يقوم بتشغيل برنامج التحويل البرمجي LLVM في الوقت المناسب . يقوم بتجميع وتنفيذ هذا الخط في جهاز افتراضي داخل النواة. يجب إعادة إنتاج التوقيع الكامل sysfs_create_files () في الأمر الثاني حتى تشير سلسلة التنسيق إلى إحدى المعلمات. ينتج عن الأخطاء في جزء التعليمات البرمجية C أخطاء مترجم C يمكن التعرف عليها. على سبيل المثال ، إذا حذفت الخيار -l ، فسترى "فشل في ترجمة نص BPF." سيجد المطورون الذين لديهم دراية بـ C و Python أدوات bcc سهلة التوسيع والتعديل.

عند إدخال محرك أقراص USB ، kworker kernel أن PID 7711 هو دفق kworker الذي أنشأ ملف «events» في sysfs . وفقًا لذلك ، sysfs_remove_files() مكالمة باستخدام sysfs_remove_files() أن إزالة محرك الأقراص قد حذف ملف events ، وهو ما يتماشى مع المفهوم العام لحساب المرجع. في الوقت نفسه ، sysfs_create_link () عرض sysfs_create_link () مع eBPF أثناء إدخال محرك أقراص USB أنه تم إنشاء 48 ارتباطًا رمزيًا على الأقل.

إذن ما معنى ملف الأحداث؟ يوضح استخدام cscope للبحث عن __device_add_disk () أنه يستدعي disk_add_events () ، ويمكن كتابة "media_change" أو "media_change" إما إلى ملف الحدث. هنا ، تُعلم طبقة كتلة kernel مساحة المستخدمين بمظهر واستخراج "القرص". يرجى ملاحظة مدى أهمية طريقة البحث هذه في مثال إدخال محرك أقراص USB مقارنة بمحاولة معرفة كيفية عمل كل شيء ، حصريًا من المصدر.

تتيح أنظمة ملفات الجذر للقراءة فقط للأجهزة المدمجة

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

ومع ذلك ، نعلم جميعًا أن العديد من أجهزة إنترنت الأشياء ، وكذلك أجهزة التوجيه ، وأجهزة التحكم في الحرارة ، والسيارات تعمل الآن على نظام Linux. لا تحتوي العديد من هذه الأجهزة على أي واجهة مستخدم تقريبًا ، ولا توجد طريقة لإيقاف تشغيلها "بشكل نظيف". تخيل بدء تشغيل سيارة ببطارية تم تفريغها ، عندما تقفز قوة جهاز التحكم على نظام Linux باستمرار لأعلى ولأسفل. كيف يتم تشغيل النظام بدون fsck طويل عندما يبدأ المحرك في العمل أخيرًا؟ والجواب بسيط. تعتمد الأجهزة المدمجة على نظام ملفات جذر للقراءة فقط (يتم اختصاره كـ ro-rootfs (نظام ملفات جذر للقراءة فقط)).

ro-rootfs العديد من الفوائد الأقل وضوحًا من تلك الحقيقية. ميزة واحدة هي أن البرمجيات الخبيثة لا تستطيع الكتابة إلى /usr أو /lib إذا لم يكن بإمكان أي عملية Linux الكتابة هناك. والنقطة الأخرى هي أن نظام الملفات غير القابل للتغيير إلى حد كبير أمر حاسم للدعم الميداني للأجهزة البعيدة ، حيث يستخدم موظفو الدعم الأنظمة المحلية التي تتشابه اسمياً مع الأنظمة المحلية. ربما تكون الميزة الأكثر أهمية (ولكن أيضًا الأكثر غدراً) هي أن ro-rootfs يجبر المطورين على تحديد كائنات النظام التي لن تتغير ، حتى في مرحلة تصميم النظام. يمكن أن يكون العمل مع ro-rootf غير مريح ومؤلم ، كما هو الحال غالبًا مع المتغيرات const في لغات البرمجة ، ولكن يمكن أن تغطي فوائدها بسهولة الحمل الإضافي.

يتطلب إنشاء rootfs فقط بعض الجهد الإضافي للمطورين المضمنين ، rootfs يأتي دور VFS في المشهد. يتطلب نظام Linux أن تكون الملفات الموجودة في /var قابلة للكتابة ، بالإضافة إلى أن العديد من التطبيقات الشائعة التي تعمل على أنظمة مدمجة ستحاول إنشاء dot-files التكوين في $HOME . أحد الحلول لملفات التكوين في الدليل الرئيسي هو عادةً الجيل الأولي والتجميع في rootfs . بالنسبة لـ /var أحد الأساليب الممكنة هي تثبيته في قسم منفصل قابل للكتابة ، بينما يكون / mount نفسه للقراءة فقط. بديل شائع آخر هو استخدام ربط أو تراكب يتصاعد.

يتصاعد وربط يتصاعد ، واستخدامها من قبل الحاويات

يعد تشغيل الأمر man mount أفضل طريقة للتعرف على حوامل الربط والتداخل ، والتي تمنح المطورين ومسؤولي النظام القدرة على إنشاء نظام ملفات بطريقة ما ومن ثم توفيره للتطبيقات بطريقة أخرى. بالنسبة للأنظمة المضمّنة ، يعني ذلك القدرة على تخزين الملفات في /var على محرك أقراص محمول للقراءة فقط ، لكن تراكب أو ربط المسار من tmpfs إلى /var عند التمهيد سيسمح للتطبيقات بكتابة ملاحظات هناك (scrawl). في المرة التالية التي تقوم بتمكينها ، سيتم فقد التغييرات على /var . يقوم التحميل المتراكب بإنشاء اتحاد بين tmpfs ونظام الملفات الأساسي ويسمح لك بتعديل الملفات الموجودة في ro-tootf بينما يمكن أن يؤدي التحميل المرتبط إلى جعل مجلدات tmpfs الفارغة الجديدة مرئية على أنها قابلة للكتابة في مسارات ro-rootfs . في حين أن overlayfs هو النوع proper من نظام الملفات ، يتم تطبيق تصاعد الربط في مساحة اسم VFS .

استنادًا إلى وصف التركيبات المركبة والمتصلة ، لا يفاجأ أحد أن حاويات Linux تستخدمها بنشاط. دعونا نلاحظ ما يحدث عندما نستخدم systemd-nspawn لبدء الحاوية باستخدام أداة bcc mountsnoop .



استدعاء system-nspawn يبدأ الحاوية أثناء mountsnoop.py .

دعونا نرى ما حدث:



mountsnoop تشغيل mountsnoop أثناء الحاوية "boot" إلى أن وقت تشغيل الحاوية يعتمد اعتمادًا كبيرًا على التركيب المتصل (يتم عرض بداية المخرجات الطويلة فقط).

هنا ، يوفر systemd-nspawn الملفات المحددة في procfs و sysfs للمضيف إلى الحاوية كمسارات إلى rootfs الخاص rootfs . بالإضافة إلى علامة MS_BIND ، التي تحدد تحميل الربط ، تحدد بعض الإشارات الأخرى في النظام المحمّل العلاقة بين التغييرات في مساحة اسم المضيف والحاوية. على سبيل المثال ، يمكن لتركيب الربط إما تخطي التغييرات في /proc و /sys إلى حاوية ، أو إخفاؤها وفقًا للمكالمة.

استنتاج

قد يبدو فهم البنية الداخلية لنظام Linux مهمة مستحيلة ، نظرًا لأن النواة نفسها تحتوي على قدر كبير من التعليمات البرمجية ، مما يترك تطبيقات مساحة مستخدم Linux وواجهات استدعاء النظام في مكتبات C مثل glibc . تتمثل إحدى طرق إحراز تقدم في قراءة التعليمات البرمجية المصدر لنظام فرعي kernel واحد مع التركيز على فهم مكالمات النظام والرؤوس التي تواجه مساحة المستخدم ، وكذلك واجهات kernel الداخلية الرئيسية ، على سبيل المثال ، جدول file_operations . توفر عمليات الملفات مبدأ "كل شيء ملف" ، لذا فإن إدارتها لطيفة للغاية. تمثل ملفات k مصدر kernel في دليل المستوى الأعلى fs/ تطبيق أنظمة الملفات الافتراضية ، والتي هي طبقة غلاف توفر توافقًا واسعًا وبسيطًا نسبيًا لأنظمة الملفات وأجهزة التخزين الشائعة. التثبيت مع الربط والتراكب من خلال مساحات أسماء Linux هو VFS magic الذي يجعل من الممكن إنشاء حاويات للقراءة فقط وأنظمة ملفات الجذر. مع تعلم شفرة المصدر ، الأداة الأساسية eBPF وواجهتها المخفية
جعل البحوث النواة أسهل من أي وقت مضى.

أيها الأصدقاء ، أكتب هذا المقال كان مفيدًا لك؟ ربما لديك أي تعليقات أو تعليقات؟ وأولئك المهتمين بدورة Linux Administrator ، ندعوك لفتح يوم المنزل ، والذي سيعقد في 18 أبريل.

الجزء الاول.

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


All Articles