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


12

私は、カーネル(CentOS 5.5の2.6.18-194-el5)がドライブのパーティションを認識できるようにするために、scsiバス(または他のバス)を更新する方法を探していました。方法を見つけません。partprobeは即座にそれを行いました。どうやって?

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

サイズ変更、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に入り、

echo "---">スキャン

そしてやっている

ls / dev / sdb

新しいものは何も表示されなかったので、/ sys / bus / scsi / devicesにアクセスし、リストされた各デバイスについて、

エコー1>再スキャン

それはうまくいきませんでした。

その後、この問題についてさらに調査し、partedに付属している「partprobe」に出会いました。私はそれを実行し、すぐに動作しました。

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

回答:


12

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.