扩容后磁盘容量未更新需触发SCSI设备rescan:执行echo 1 > /sys/class/scsi_device/X\:Y\:Z\:W/device/rescan(X:Y:Z:W通过ls -l /sys/block/sda/device获取),再运行blockdev --rereadpt /dev/sda验证。

扩容后的磁盘容量没变,fdisk -l 或 lsblk 仍显示旧大小?不是配置没生效,而是内核根本没重新读取设备容量 —— 必须主动触发 SCSI 设备 rescan,不能只扫总线。
为什么只执行 echo "- - -" > /sys/class/scsi_host/hostX/scan 不够
这条命令只让内核扫描总线、发现新设备(比如新加一块硬盘),但对**已存在设备的容量变更**(如云盘在线扩容、VMware 虚拟磁盘增大)完全无效。内核仍按旧的设备描述符缓存着容量,必须单独通知对应 SCSI 设备刷新容量。
常见错误现象:fdisk -l 显示磁盘仍是 100G,但云平台控制台或虚拟化层已确认扩容到 200G;lsblk 中 SIZE 列不变,blockdev --getsize64 /dev/sda 返回值也不变。
-
/sys/class/scsi_host/hostX/scan:用于「发现新设备」,适用场景是新增 LUN 或挂载新虚拟磁盘 -
/sys/class/scsi_device/X\:Y\:Z\:W/device/rescan或/sys/class/scsi_disk/X\:Y\:Z\:W/device/rescan:用于「刷新已有设备容量」,才是在线扩容后真正该走的路径 - 路径中的
X:Y:Z:W是 SCSI 地址,格式为host:bus:target:lun,冒号必须用\:转义
怎么快速找到要 rescan 的 X\:Y\:Z\:W
别猜,也别硬记。直接查当前系统里所有 SCSI 设备的地址:
ls /sys/class/scsi_device/
输出类似 0:0:0:0 0:0:1:0 1:0:0:0 —— 每一项就是一个 SCSI 设备。你扩容的是哪块盘(比如 /dev/sda),就找它对应的地址。
怎么关联?用这个命令:
ls -l /sys/block/sda/device
输出里会有一行类似 ../../devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0,末尾的 0:0:0:0 就是你要的地址。
确认后执行:
echo 1 > /sys/class/scsi_device/0\:0\:0\:0/device/rescan
注意:scsi_device 和 scsi_disk 下都有 device/rescan,优先用 scsi_device;如果报错“No such file”,再试 scsi_disk 路径。
扫完还是没更新?检查三个关键点
rescan 命令返回成功不代表容量立刻可见,常卡在这几个环节:
- 权限问题:必须用
root执行,普通用户写/sys/下文件会 Permission denied - 路径拼错:
0\:0\:0\:0中的每个冒号都要转义,写成0:0:0:0会提示 No such file or directory - 未同步底层块设备:执行完 rescan 后,运行
blockdev --rereadpt /dev/sda(如果分区表变了)或partprobe /dev/sda(部分老系统需要),否则fdisk -l可能不刷新分区信息
验证是否生效,别只看 fdisk -l,用更底层的命令:
blockdev --getsz /dev/sda # 返回扇区数<br>blockdev --getsize64 /dev/sda # 返回字节数
这两个值变大了,才说明内核真正接受了新容量。
SCSI 设备地址不是固定不变的,尤其在多路径或热插拔频繁的环境里,/sys/block/sda/device 软链接可能指向不同地址。每次扩容前务必重新查,别复用上次的路径。


















