udev

يُعدّ udev ( الموجود في مجلد /dev ضمن مساحة المستخدم ) مديرًا للأجهزة ومجموعة واجهات برمجة تطبيقات (API) خاصة بالأجهزة في نواة لينكس . وباعتباره خليفةً لـ devfsd و hotplug، يُدير udev بشكل أساسي عُقد الأجهزة في مجلد /dev . كما يُعالج udev جميع أحداث مساحة المستخدم التي تحدث عند إضافة أجهزة إلى النظام أو إزالتها منه، بما في ذلك تحميل البرامج الثابتة حسب متطلبات بعض الأجهزة. طُوّر udev بواسطة جريج كروه-هارتمان وكاي سيفرز ، بمساعدة كبيرة من دان ستيكلوف ، وآخرين.

الأساس المنطقي

تُعدّ نواة نظام التشغيل مسؤولة عن توفير واجهة مجردة بين مكونات الجهاز وبقية البرامج. وباعتبارها نواة متجانسة ، فإن نواة لينكس تتضمن برامج تشغيل الأجهزة التي تشكل أكثر من نصف شفرتها المصدرية. [ 2 ] ويمكن الوصول إلى مكونات الجهاز من خلال استدعاءات النظام أو عبر عقد الأجهزة الخاصة بها .

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

تصميم

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

  • في حال توصيل جهاز تخزين جديد عبر منفذ USB، يتم إخطار udevd من قبل نواة النظام، والذي بدوره يُخطر برنامج udisksd-daemon. وبذلك، يستطيع هذا البرنامج تحميل أنظمة الملفات.
  • في حال توصيل كابل إيثرنت جديد ببطاقة الشبكة، يتم إخطار udevd من قبل نواة النظام، والذي بدوره يُخطر برنامج إدارة الشبكة (NetworkManager-daemon). يمكن لبرنامج إدارة الشبكة تشغيل dhclient لتلك البطاقة، أو ضبط الإعدادات وفقًا لتكوين يدوي.

أجبر تعقيد هذه العملية مطوري التطبيقات على إعادة برمجة منطق دعم الأجهزة. كما تطلبت بعض الأجهزة برامج مساعدة ذات صلاحيات مميزة لتجهيزها للاستخدام. وغالبًا ما كان لا بد من استدعاء هذه البرامج بطرق يصعب التعبير عنها باستخدام نموذج صلاحيات يونكس (على سبيل المثال، السماح للمستخدمين بالانضمام إلى الشبكات اللاسلكية فقط إذا كانوا مسجلين الدخول إلى وحدة تحكم الفيديو). لجأ مطورو التطبيقات إلى استخدام ملفات تنفيذية بصلاحيات المستخدم الخارق (setuid) أو تشغيل خدمات خلفية لتوفير التحكم في الوصول وفصل الصلاحيات، مما قد يُؤدي إلى ثغرات أمنية في كل مرة. [ 3 ]

تم إنشاء HAL للتعامل مع هذه التحديات، ولكن تم إهمالها الآن في معظم توزيعات Linux، حيث تم استبدال وظائفها بواسطة udevd.

ملخص

على عكس أنظمة يونكس التقليدية ، حيث كانت عُقد الأجهزة في دليل /dev عبارة عن مجموعة ثابتة من الملفات، فإن مدير أجهزة udev في لينكس يُوفر ديناميكيًا عُقد الأجهزة الموجودة فعليًا على النظام فقط. مع أن devfs كان يُوفر وظائف مماثلة، فقد ذكر جريج كروه-هارتمان عددًا من الأسباب [ 4 ] لتفضيل udev على devfs:

  • يدعم udev تسمية الأجهزة بشكل ثابت، بغض النظر عن ترتيب توصيلها بالنظام. يوفر إعداد udev الافتراضي أسماءً ثابتة لأجهزة التخزين. يتم التعرف على أي قرص صلب من خلال معرّف نظام الملفات الفريد الخاص به، واسم القرص، وموقعه الفعلي على الجهاز المتصل به.
  • يُنفَّذ udev بالكامل في مساحة المستخدم ، على عكس devfs الذي يُنفَّذ في مساحة النواة . ومن نتائج ذلك أن udev نقل سياسة التسمية من النواة، وأصبح بإمكانه تشغيل برامج عشوائية لتكوين اسم للجهاز من خصائصه، قبل إنشاء العقدة؛ وهناك، تكون العملية برمتها قابلة للمقاطعة وتُنفَّذ بأولوية أقل.

ينقسم برنامج udev ككل إلى ثلاثة أجزاء:

يتلقى النظام المكالمات من النواة عبر مقبس netlink . استخدمت الإصدارات السابقة تقنية التوصيل السريع (hotplug) ، حيث أضافت رابطًا إلى نفسها في /etc/hotplug.d/default لهذا الغرض.

عملية

تم دمج udev في systemd 183 [ 5 ]

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

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

في الماضي، كانت إحدى الطرق الشائعة لاستخدام udev على أنظمة لينكس هي السماح له بإرسال الأحداث عبر مقبس إلى طبقة تجريد الأجهزة (HAL )، التي بدورها كانت تُنفذ إجراءات خاصة بالجهاز. على سبيل المثال، كانت طبقة تجريد الأجهزة تُعلم البرامج الأخرى العاملة على النظام بوصول الجهاز الجديد عن طريق إرسال رسالة بث عبر نظام D-Bus IPC إلى جميع العمليات المهتمة . وبهذه الطريقة، تستطيع بيئات سطح المكتب مثل جنوم أو بيئة سطح المكتب K 3 تشغيل مستعرض الملفات لتصفح أنظمة ملفات محركات أقراص USB المحمولة وبطاقات SD المُضافة حديثًا . [ 6 ]

بحلول منتصف عام 2011، تم إيقاف دعم HAL في معظم توزيعات لينكس، بالإضافة إلى بيئات سطح المكتب KDE وGNOME [ 7 ] و Xfce [ 8 ] ، وغيرها. وقد تم دمج الوظائف التي كانت موجودة سابقًا في HAL في udev نفسه، أو نقلها إلى برامج منفصلة مثل udisks و upower .

  • يوفر udev وصولاً مباشراً إلى شجرة أجهزة لينكس. يسمح للبرامج بحصر الأجهزة وخصائصها وتلقي إشعارات عند اتصال الأجهزة أو انقطاعها.
  • dbus هو إطار عمل يسمح للبرامج بالتواصل مع بعضها البعض بشكل آمن وموثوق، وبواجهة برمجة كائنية التوجه عالية المستوى.
  • udisks (المعروف سابقًا باسم DeviceKit-disks) هو برنامج يعمل في الخلفية فوق libudev وواجهات النواة الأخرى ويوفر واجهة عالية المستوى لأجهزة التخزين ويمكن الوصول إليه عبر dbus للتطبيقات.
  • upower (المعروف سابقًا باسم DeviceKit-power) هو برنامج يعمل في الخلفية فوق libudev وواجهات النواة الأخرى ويوفر واجهة عالية المستوى لإدارة الطاقة ويمكن الوصول إليه عبر dbus للتطبيقات.
  • NetworkManager هو برنامج يعمل في الخلفية فوق libudev وواجهات النواة الأخرى (وعدد قليل من البرامج الأخرى) ويوفر واجهة عالية المستوى لتكوين الشبكة وإعدادها ويمكن الوصول إليه عبر dbus للتطبيقات. [ 9 ]

يستقبل برنامج udev الرسائل من نواة النظام، ويمررها إلى برامج النظام الفرعية مثل مدير الشبكة. وتتواصل التطبيقات مع مدير الشبكة عبر ناقل D-Bus.

النواةudevشبكةمدير--د-حافلة--فايرفوكس{\displaystyle {\ce {Kernel -> udev -> Network Manager <=> D-Bus <=> Firefox}}}

أصبحت HAL قديمة ولا تُستخدم إلا في البرامج القديمة. تم إصدار Ubuntu 10.04 بدون HAL. في البداية، كان من المخطط إنشاء برنامج DeviceKit ليحل محل بعض جوانب HAL، ولكن في مارس 2009، تم إيقاف DeviceKit لصالح إضافة نفس الكود إلى udev كحزمة: udev-extras، وقد تم نقل بعض الوظائف الآن إلى udev نفسه.

تاريخ

تم تقديم udev في لينكس 2.5 . وقد أدخلت نواة لينكس الإصدار 2.6.13 أو حدّثت إصدارًا جديدًا من واجهة uevent . لن يتمكن النظام الذي يستخدم إصدارًا جديدًا من udev من الإقلاع مع نواة أقدم من 2.6.13 إلا إذا تم تعطيل udev واستُخدم دليل /dev التقليدي للوصول إلى الأجهزة.

في أبريل 2012، تم دمج قاعدة بيانات udev في شجرة مصدر systemd ، مما جعل systemd 183 أول إصدار يتضمن udev. [ 5 ] [ 10 ] [ 11 ] في أكتوبر 2012، انتقد لينوس تورفالدز نهج كاي سيفرز في صيانة udev وإصلاح الأخطاء المتعلقة بتحميل البرامج الثابتة ، قائلاً: [ 12 ]

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

في عام ٢٠١٢، أنشأ مشروع جنتو لينكس نسخةً معدلةً من قاعدة بيانات udev الخاصة بنظام systemd لتجنب الاعتماد على بنية systemd. تُسمى هذه النسخة المعدلة eudev ، وهي تُتيح وظائف udev دون الحاجة إلى systemd. يتمثل أحد الأهداف المعلنة للمشروع في الحفاظ على استقلالية eudev عن أي توزيعة لينكس أو نظام بدء تشغيل . [ ١٣ ] يصف مشروع جنتو eudev على النحو التالي: [ ١٤ ]

eudev هو نسخة معدلة من systemd-udev بهدف الحصول على توافق أفضل مع البرامج الحالية مثل OpenRC و Upstart ، والنوى القديمة، ومجموعات الأدوات المختلفة، وأي شيء آخر يتطلبه المستخدمون والتوزيعات المختلفة.

في 29 مايو 2014، أُلغي دعم تحميل البرامج الثابتة عبر udev من نظام systemd، إذ تقرر أن تحميل البرامج الثابتة يقع ضمن مهام نواة النظام. [ 15 ] بعد يومين، اقترح لينارت بوتيرينغ تأجيل هذا التحديث حتى يبدأ udev باستخدام kdbus؛ وعندها، كانت الخطة هي تحويل udev لاستخدام kdbus كنظام مراسلة أساسي، والتخلص من النقل القائم على netlink بين مساحات المستخدمين. [ 16 ]

مراجع

  1. "الإصدار 261.2" . 23 يوليو 2026. تم الاطلاع عليه في 24 يوليو 2026 .
  2. مارتي، دون (2 يوليو 2007). "هل يفقد كبار مطوري لينكس الرغبة في البرمجة؟" . ComputerworldUK . مؤرشف من الأصل في 19 يوليو 2016. تم الاطلاع عليه في 2 يونيو 2024 .
  3. بينينجتون، هافوك (10-07-2003)، جعل الأجهزة تعمل ببساطة
  4. غريغ كروه-هارتمان . "udev وdevfs - الكلمة الأخيرة" . مؤرشف من الأصل ( نص عادي ) بتاريخ 9 يوليو 2011. تم الاطلاع عليه بتاريخ 24 يناير 2008 .
  5. 1 2 3 "systemd/systemd" . GitHub . تم الاسترجاع في 21-08-2016 .
  6. "إدارة الأجهزة الديناميكية في Udev" (ملف PDF) . مجلة لينكس. 1 أكتوبر 2006. تاريخ الاسترجاع: 14 يوليو 2008 .
  7. "إزالة هال" . 28-06-2011. مؤرشف من الأصل في 26-11-2011 . تم الاسترجاع في 13-09-2011 .
  8. "ثونار-فولمان وإلغاء دعم هال في إكس إف سي إي" . 17 يناير 2010. مؤرشف من الأصل في 26 ديسمبر 2017. تم الاطلاع عليه في 25 ديسمبر 2017 .
  9. لينارت بوتيرينغ (25-04-2010). "العلاقة بين udev و hal و Dbus و DeviceKit؟" .
  10. سيفرز، كاي (2012-04-03). "مستقبل شجرة مصدر udev" . قائمة بريدية linux-hotplug . تم الاطلاع بتاريخ 22-05-2013 .
  11. سيفرز، كاي، "استيراد udev إلى systemd" ، systemd ، تم الاطلاع عليه بتاريخ 22-05-2013
  12. لينوس تورفالدز (2012-10-03). "رد: أعطال udev" . قائمة بريدية لنواة لينكس . تم الاطلاع بتاريخ 2014-10-28 .
  13. "gentoo/eudev – README.md" . GitHub . تم الاطلاع عليه بتاريخ 25-12-2017 .
  14. "مشاريع جنتو لينكس - مشروع جنتو يوديف" . مؤرشف من الأصل بتاريخ 2015-09-04 . تم الاطلاع عليه بتاريخ 2017-12-25 .
  15. " [ systemd-devel ] [ PATCH ] حذف مُحمِّل البرامج الثابتة udev" . 2014-05-29.
  16. " [ systemd-devel ] [ PATCH ] حذف مُحمِّل البرامج الثابتة udev" . 2014-05-31.