partprobe 是如何工作的?

Mat*_*ons 12 partition fdisk parted

我一直在寻找一种方法来刷新 scsi 总线(或任何其他总线,就此而言),这将允许我的内核(CentOS 5.5 上的 2.6.18-194-el5)了解驱动器上的分区,我不能没有办法。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,然后做了

回声“- - -” > 扫描

和做

ls /dev/sdb

没有显示任何新内容,所以我去了 /sys/bus/scsi/devices 并且对于列出的每个设备,我都做了

回声 1 > 重新扫描

那没有用。

然后我对该问题进行了更多研究,并遇到了parted 附带的'partprobe'。我运行了它,它立即生效。

如果我在这里没有得到可能的答案,我可能会去获取源代码并查找它,但我认为这里有超出我的巫师,所以我想我会吸引你们所有人。

Gil*_*il' 12

Partprobe 调用BLKRRPARTioctl,该 ioctl 记录在 errinclude/linux/fs.h和 之外,内核源代码(肉在rescan_partitions())中:

#define BLKRRPART  _IO(0x12,95) /* re-read partition table */
Run Code Online (Sandbox Code Playgroud)

找出这一点的最简单方法是运行strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

我认为你的尝试/sys/*/*scan告诉内核检查驱动器是否发生了变化。如果驱动器没有改变(或者已经以内核未检测到的方式进行了热交换?)但它的分区结构已经改变,那没有帮助。