مرحباً بالجميع ، نشارك معك الجزء الثاني من المنشور "أنظمة الملفات الافتراضية في نظام 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 أبريل.
الجزء الاول.