零件探针如何工作?

零件探针如何工作?

我正在寻找一种刷新 scsi 总线(或任何其他总线)的方法,让我的内核(CentOS 5.5 上的 2.6.18-194-el5)了解驱动器上的分区,我无法找不到办法。 partprobe 立刻就做到了。如何?

因为这很重要,所以这就是我正在做的事情:

我想在特定于分区的事情上进行一些练习,例如调整大小、备份 MBR 和恢复它等等。我在/dev/sdb上创建了一个20GB的分区,备份了MBR:

dd if=/dev/sdb of=sdb.mbr bs=512 计数=1

然后我进入fdisk,删除分区,写入它,然后退出。

ls /dev/sdb*

显示没有分区,并且

fdisk -l /dev/sdb'

匹配,所以我认为我很好。

然后我反转了 dd:

dd if=sdb.mbr of=/dev/sdb bs=512 计数=1

当然,当时我什么也没做,所以

ls /dev/sdb*

没有列出任何分区,但是

fdisk -l

显示了分区,大概是因为它读取磁盘上的前 512 字节并且不依赖于内核。我知道我必须刷新总线,所以我进入 /sys/class/scsi_host/host1,然后执行

回声“- - -” > 扫描

和做

ls /dev/sdb

没有显示任何新内容,因此我转到 /sys/bus/scsi/devices ,对于列出的每个设备,我做了

echo 1 > 重新扫描

但这不起作用。

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

如果我在这里没有得到可能的答案,我可能会去获取源代码并查找它,但我认为这里有比我更强大的向导,所以我想我会吸引你们所有人。

答案1

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告诉内核检查驱动器是否已更改。如果驱动器没有改变(或者已经以内核无法检测到的方式热插拔?)但其上的分区结构已经改变,那么这并没有帮助。

相关内容