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告诉内核检查驱动器是否发生了变化。如果驱动器没有改变(或者已经以内核未检测到的方式进行了热交换?)但它的分区结构已经改变,那没有帮助。