web-dev-qa-db-ja.com

partprobeはどのように機能しますか?

私のカーネル(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」に出会いました。私はそれを実行しました、そしてそれは即座に働きました。

ここで適切な答えが得られない場合は、おそらくソースを取得してそれを調べるだけですが、ここの向こうにウィザードがいると思うので、皆さんにアピールしたいと思いました。

12
Matt Simmons

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_で試したものは、ドライブに変更があったかどうかを確認するようにカーネルに指示していると思います。ドライブが変更されていない場合(またはカーネルが検出しない方法でホットスワップされている場合)は役に立ちませんが、ドライブのパーティション構造は変更されています。