部品プローブはどのように機能しますか?

部品プローブはどのように機能しますか?

私のカーネル(CentOS 5.5の2.6.18-194-el5)がドライブのパーティションを認識できるようにscsiバス(または他のバス)をフラッシュする方法を探していますが、方法が見つかりません。 。 partprobeがすぐにやった。どのように?

これが重要なので、私がやっていることは次のとおりです。

サイズ変更、MBRバックアップ、リストアなどのパーティション関連タスクについて練習したいと思います。 /dev/sdbに20GBのパーティションを作成し、MBRをバックアップしました。

dd if=/dev/sdb of=sdb.mbr bs=512 個=1

次にfdiskに行き、パーティションを削除し、そこに書き込んで終了します。

ls /dev/sdb*

パーティションは表示されません

fdisk -l /dev/sdb'

マッチして大丈夫だと思います。

それからddを裏返しました。

dd if=sdb.mbr of=/dev/sdb bs=512 個=1

もちろん当時は何もしなかったので

ls /dev/sdb*

パーティションはリストされていませんが、

fdisk -l

分割が表示されます。これは、おそらくディスクの最初の512バイトを読み取り、カーネルに依存しないためです。バスを空にする必要があることがわかっているので、/sys/class/scsi_host/host1に移動して次の操作を行います。

エコ"- - -">スキャン

そして

ls /dev/sdb

新しいコンテンツが表示されなかったため、/sys/bus/scsi/devices に移動し、リストされた各デバイスに対して対応する操作を実行しました。

エコ1>もう一度検索

しかし、これはうまくいきません。

その後、問題についてさらに調査を行い、partedに付属する「partprobe」を見つけました。実行したらすぐに動作しましたね。

ここで可能な答えが得られない場合は、おそらくソースコードを入手して検索します。しかし、ここには私よりも強力なガイドがあると思うので、皆さんにアピールできると思いました。

答え1

PartprobeがBLKRRPARTioctlを呼び出すと、ファイルはerrに書き込まれます。include/linux/fs.h、カーネルソース(肉rescan_partitions()):

#define BLKRRPART  _IO(0x12,95) /* re-read partition table */

問題を見つける最も簡単な方法はを実行することですstrace -e raw=ioctl -e open,ioctl partprobe /dev/sdb

私の考えであなたが試しているのは、ドライブが変更され/sys/*/*scanたことを確認するようにカーネルに指示することです。ドライブは変更されていませんが(またはカーネルが検出できないようにホットプラグされていますか?)、ドライブのパーティション構造が変更された場合は役に立ちません。

関連情報