كيف يتم إعلامك عند اكتشاف محرك أقراص ثابتة في Linux
-
27-10-2019 - |
سؤال
لدينا إصدار Linux مدمج يبدأ بمحرك أقراص ثابتة في وضع السكون (الأجهزة).يبدأ البرنامج بعد ذلك ويتيح الطاقة لمحرك الأقراص.يكتشف Linux محرك الأقراص بشكل جيد:
ata1: exception Emask 0x10 SAct 0x0 SErr 0x4050000 action 0x42 frozen
ata1: soft resetting port
ata1: SATA link up 1.5 Gbps (SStatus 113 SControl F0000)
ata1.00: ATA-8, max UDMA/133, 976773168 sectors: LBA48 NCQ (depth 0/32)
ata1.00: ata1: dev 0 multi count 0
ata1.00: configured for UDMA/133
ata1: EH complete
Vendor: ATA Model: Hitachi HCS5C105 Rev: JC2O
Type: Direct-Access ANSI SCSI revision: 05
SCSI device sda: 976773168 512-byte hdwr sectors (500108 MB)
sda: Write Protect is off
SCSI device sda: drive cache: write back
SCSI device sda: 976773168 512-byte hdwr sectors (500108 MB)
sda: Write Protect is off
SCSI device sda: drive cache: write back
sda: sda1 sda2
sd 0:0:0:0: Attached scsi disk sda
sd 0:0:0:0: Attached scsi generic sg0 type 0
لسوء الحظ، يحاول البرنامج الوصول إلى محرك الأقراص قبل حدوث اكتشاف SCSI أعلاه.يمكننا إضافة نوم ولكن هذه ليست آلية موثوقة حيث لاحظنا أن الوقت المستغرق للكشف غير حتمي.
هل هناك أي طريقة للحصول على kernel/hotplug/etc.نظام للإبلاغ عند اكتشاف القرص الصلب؟
شكرًا.
المحلول
أعتقد أن الإجابة موجودة في مكان ما في udev مدير الجهاز ( صفحة wikipedia ).يمكن استخدامه بالكامل في بيئة مضمنة.
يسمح لك بكتابة القواعد التي يمكنها تشغيل البرامج النصية / البرامج عند اكتشاف بعض الأجهزة.
يمكن لشيء كهذا أن يفعل الأشياء: Genacodicetagpre
إذا كان لديك نواة قديمة ، فقد يتم تنشيط نظام hotplug .
الفرصة الأخيرة هي أداة inotify التي تتيح لك مراقبة أي شيء في ملفكsystem (even / dev directory :)).
نصائح أخرى
لديك مجموعة من الخيارات للقيام بذلك، من الأبسط إلى الأكثر تعقيدًا:
- الاقتراع اليدوي.ما عليك سوى كتابة برنامج نصي shell يقوم بالاستقصاء حتى يصبح القرص الثابت متاحًا قبل استخدامه فعليًا.من المؤكد أن هذا ليس الحل الأفضل، لكنه فعال وبسيط.
- mdev.إذا كان نظام Linux المضمن لديك يعتمد على Busybox (وهو ما آمل أن يكون كذلك!)، فإن Busybox يدمج
mdev
برنامج.استخدامه بسيط للغاية وتم توثيقه في http://git.buildroot.net/busybox/tree/docs/mdev.txt.mdev
سيسمح لك بسهولة بتشغيل برنامج نصي shell عند اكتشاف الجهاز.إذا كان لديك Busybox بالفعل في نظام Linux المضمن لديك، فهذا هو الحل الذي أوصي به بالتأكيد. - udev, ، كما اقترح آخرون.هذا هو الحل المستخدم في أنظمة سطح المكتب/الخادم الكاملة.لديها تبعيات أكثر من
mdev
وهو أصعب قليلاً في الإعداد.إذا كان لديك فقط حل لمشكلة الكشف عن القرص الصلب، فسأقول ذلك باستخدامudev
هو مبالغة بعض الشيء، ولكن إذا كنت تنوي استخدامه لأغراض أخرى، لماذا لا. - udev + udiks + com.dbus, هذا هو في الواقع ما يتم استخدامه في الأنظمة الكاملة.
udisks
هو الشيطان الذي يستخدمudev
ليتم إعلامك بأجهزة التخزين الجديدة التي تظهر في النظام، فإنه يحصل على بعض المعلومات الإضافية عنها ثم يرسل رسالة عبر D-Bus.يسمح بتوفير خدمات D-Bus للتعامل مع أجهزة التخزين.
آمل أن يمنحك هذا نظرة عامة على الحلول الممكنة.
يمكنك الاستماع إلى مقبس netlink uevent - ستحصل على نفس الأحداث مثل udevd