0

スリープ モード (ハードウェア) の HDD で起動する組み込み 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 検出が行われる前にドライブにアクセスしようとします。スリープを追加することもできますが、検出にかかる時間が非決定論的であることがわかっているため、これは信頼できるメカニズムではありません。

カーネル/ホットプラグなどを入手する方法はありますか? HDDが検出されたときにシステムが報告しますか?

ありがとう。

4

3 に答える 3

3

答えはudevデバイス マネージャー (ウィキペディア ページ) のどこかにあると思います。組み込み環境で完全に使用可能です。

一部のデバイスが検出されたときにスクリプト/プログラムを起動できるルールを作成できます。

このような何かができる:

KERNEL=="sda", RUN+="/usr/bin/my_program"

古いカーネルを使用している場合は、ホットプラグシステムが有効になっている可能性があります。

最後のチャンスは、ファイル システム内のあらゆるもの (/dev ディレクトリも含めて :)) を監視できるinotifyツールです。

于 2011-09-07T13:51:38.613 に答える
2

最も単純なものから最も複雑なものまで、これを行うための一連のオプションがあります。

  • 手動ポーリング。実際に使用する前に、ハードディスクが使用可能になるまでポーリングするシェル スクリプトを作成するだけです。確かに、これは最善の解決策ではありませんが、機能し、簡単です。
  • mdev . 組み込み Linux システムが Busybox ベースの場合 (そうであることを願っています!)、Busybox はmdevプログラムを統合します。その使用法は非常に簡単で、 http: //git.buildroot.net/busybox/tree/docs/mdev.txtに文書化されています。mdevデバイスが検出されたときに非常に簡単にシェル スクリプトを実行できます。組み込み Linux システムに Busybox が既にある場合は、これが間違いなく推奨されるソリューションです。
  • 他の人が提案したudev 。これは、本格的なデスクトップ/サーバー システムで使用されるソリューションです。より多くの依存関係がmdevあり、セットアップが少し難しくなります。ハードディスクの検出の問題だけを解決する必要がある場合は、使用するudevのは少しやり過ぎだと思いますが、他の目的に使用する場合は、そうではありません。
  • udev + udisks + dbus、これは実際に本格的なシステムで使用されるものです。udisksシステムに出現する新しいストレージ デバイスの通知を受け取るために使用するデーモンですudev。それらに関する追加情報を取得し、D-Bus 経由でメッセージを送信します。D-Bus サービスを提供してストレージ デバイスを操作できるようにします。

これにより、考えられる解決策の概要が得られることを願っています。

于 2011-09-08T07:26:17.037 に答える
0

uevent netlink ソケットをリッスンできます - udevd と同じイベントを取得します

http://lwn.net/Articles/242046/を参照

于 2011-09-22T01:54:54.133 に答える