私のカーネル(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がBLKRRPART
ioctlを呼び出すと、ファイルは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
たことを確認するようにカーネルに指示することです。ドライブは変更されていませんが(またはカーネルが検出できないようにホットプラグされていますか?)、ドライブのパーティション構造が変更された場合は役に立ちません。