partprobe如何工作?


12

我一直在寻找一种刷新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>重新扫描

那没有用。

然后,我对该问题进行了更多的研究,并发现了“ partprobe”,它与parted一起提供。我运行它,它立即起作用。

如果我在这里没有得到可能的答案,我可能会去获取源代码并进行查找,但是我认为这里除了我之外还有向导,因此我认为我对所有人都有吸引力。

Answers:


12

Partprobe调用了BLKRRPARTioctl,该文件在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告诉内核检查驱动器是否发生了变化。如果驱动器没有更改(或者已经以内核无法检测到的方式进行了热交换),但是驱动器上的分区结构已更改,那将无济于事。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.