私のカーネル(CentOS 5.5の2.6.18-194-el5)がドライブのパーティションを認識できるようにするために、SCSIバス(または他の任意のバス)を更新する方法を探していましたが、方法が見つかりません。 partprobeはそれを即座に行いました。どうやって?
重要なので、ここで私がやっていました。
サイズ変更、MBRのバックアップ、MBRの復元など、パーティション固有のことを実践したいと思っていました。/dev/sdbに20GBのパーティションを作成し、MBRをバックアップしました。
dd if =/dev/sdb of = sdb.mbr bs = 512 count = 1
それから私はfdiskに入り、パーティションを削除し、それを書き込んで、終了しました。
ls/dev/sdb *
パーティションがないことを示し、
fdisk -l/dev/sdb '
一致したので、私は良かったと思いました。
次に、ddを逆にしました。
dd if = sdb.mbr of =/dev/sdb bs = 512 count = 1
もちろん、その時点では何もしていなかったので、
ls/dev/sdb *
パーティションは表示されませんでしたが、
fdisk -l
おそらくパーティションがディスクの最初の512バイトを読み取り、カーネルに依存していないため、パーティションが表示されました。バスをリフレッシュする必要があることを知っていたので、/ sys/class/scsi_Host/host1に移動して、
エコー "---">スキャン
そしてやっている
ls/dev/sdb
新しいものは何も表示されなかったので、/ sys/bus/scsi/devicesに移動し、リストされている各デバイスについて、
エコー1>再スキャン
そしてそれはうまくいきませんでした。
その後、問題についてさらに調査を行い、partedに付属する「partprobe」に出会いました。私はそれを実行しました、そしてそれは即座に働きました。
ここで適切な答えが得られない場合は、おそらくソースを取得してそれを調べるだけですが、ここの向こうにウィザードがいると思うので、皆さんにアピールしたいと思いました。
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
_で試したものは、ドライブに変更があったかどうかを確認するようにカーネルに指示していると思います。ドライブが変更されていない場合(またはカーネルが検出しない方法でホットスワップされている場合)は役に立ちませんが、ドライブのパーティション構造は変更されています。