Linux虚拟机用fdisk分区找不到设备,最常见原因是磁盘未正确挂载到虚拟机、SCSI总线未重扫描或内核缺少对应驱动,先执行lsblk和dmesg | grep sd确认设备节点,再按虚拟化平台重扫描或重新添加磁盘。
为什么fdisk会找不到设备?先理解Linux磁盘识别流程
在虚拟机里敲下fdisk -l,结果新加的磁盘根本没出现,这时候别急着怀疑fdisk坏了,fdisk只是一个分区工具,它只读取内核已经生成的块设备节点,如果设备节点不存在,fdisk自然看不见。
从虚拟磁盘到/dev/sdX:内核、驱动、设备节点三步走
Linux识别一块虚拟磁盘,通常要经过三个环节:
- 虚拟机配置层:磁盘被正确添加到虚拟硬件,比如SCSI、SATA、NVMe或virtio控制器。
- 内核驱动层:内核通过对应驱动枚举设备,比如
mptspi、ahci、virtio_blk、nvme。 - 设备节点层:内核在
/dev/下生成sdX、vda、nvme0n1等块设备节点。
任何一步断了,fdisk -l都看不到,用dmesg | tail -30查看内核最近日志,是定位问题的第一步。
fdisk与lsblk、parted的区别:为什么fdisk看不见
lsblk、parted、fdisk都依赖块设备节点,但行为有差异。lsblk会显示所有块设备,包括未分区的;fdisk需要root权限,且只显示可用的磁盘设备,如果你没用sudo,或者设备被其他进程占用,fdisk可能不显示,先试sudo fdisk -l。
Linux虚拟机fdisk找不到硬盘怎么办?按场景排查
不同虚拟化平台,磁盘识别路径不一样,下面按常见场景拆开说。
VMware虚拟机Linux fdisk看不到磁盘:检查SCSI控制器与重扫描
VMware Workstation或ESXi里添加磁盘后,Linux可能不会自动扫描新设备,先确认VM设置中磁盘已勾选“连接”,然后登录Linux,执行:

ls /sys/class/scsi_host/
看到host0、host1等目录后,逐个重扫描:
for host in /sys/class/scsi_host/host; do echo "- - -" > $host/scan; done
再运行lsblk,新磁盘通常会出现,如果VMware使用NVMe控制器,路径不同,需要检查/sys/class/nvme/。
VirtualBox Linux fdisk分区找不到设备:增强功能与SATA控制器
VirtualBox的磁盘控制器类型影响识别,SATA控制器默认不支持热插拔,添加磁盘后往往需要重启虚拟机,如果不想重启,可以尝试:
sudo partprobe
但SATA热插拔需要先在VirtualBox设置中启用“热插拔”选项,检查存储设置里磁盘是否挂在正确的控制器下,如果是SCSI控制器,重扫描命令同样有效。
云服务器Linux fdisk分区找不到设备:热插拔与virtio驱动
云服务器(KVM/QEMU)通常使用virtio-blk或virtio-scsi,在云控制台挂载云盘后,Linux内需要重扫描,对于virtio-blk:
echo 1 > /sys/block/vda/device/rescan
对于virtio-scsi:
echo "- - -" > /sys/class/scsi_host/host0/scan
如果还是看不到,检查dmesg | grep virtio,确认驱动已加载,近年来,多数云厂商的Linux镜像已内置virtio驱动,但较老的内核可能需要手动加载。
实操:让fdisk重新识别虚拟磁盘的四种方法
下面这些方法按优先级排列,从最轻量到最彻底。
重扫描SCSI总线
这是最常用的方法,适用于VMware、KVM、部分VirtualBox场景。
for host in /sys/class/scsi_host/host; do echo "- - -" > $host/scan; done lsblk
如果看到新磁盘,直接

fdisk /dev/sdX分区即可。
重新添加磁盘并重启虚拟机
如果重扫描无效,在虚拟机设置中移除磁盘,保存后重新添加,然后重启虚拟机,这个方法简单直接,但需要停机,对于生产环境,优先选择热扫描。
检查内核模块与驱动
用lsmod | grep virtio、lsmod | grep mptspi、lsmod | grep ahci查看驱动,如果驱动未加载,尝试modprobe virtio_blk或modprobe mptspi,现代内核一般会自动加载,但定制内核或精简镜像可能缺失。
使用partprobe和partx刷新分区表
如果lsblk能看到磁盘,但fdisk看不到分区,可能是分区表未刷新,执行:
sudo partprobe /dev/sda sudo partx -a /dev/sda
然后重新运行fdisk -l。
对比:不同虚拟化平台下fdisk找不到设备的典型差异
| 平台 | 常见原因 | 推荐命令 | 是否需重启 |
|---|---|---|---|
| VMware | SCSI控制器未扫描 | echo "- - -" > /sys/class/scsi_host/host0/scan |
通常否 |
| VirtualBox | SATA热插拔未启用 | partprobe或重启 |
多数是 |
| KVM/QEMU | virtio驱动未加载 | dmesg+重扫描 |
否 |
| Hyper-V | 集成服务未更新 | 检查vmbus | 可能 |
行业共识认为,Linux内核通过SCSI子系统枚举磁盘,fdisk仅读取已生成的块设备节点,所以排查方向永远是“先让内核看到,再让fdisk看到”。
预防与最佳实践:避免下次fdisk又找不到设备
添加磁盘后先看dmesg
每次在虚拟机里添加磁盘,先执行:
dmesg | tail -20
看有没有类似sd 2:0:0:0: [sdb] Attached SCSI disk

的日志,有日志说明内核已识别,没有就要查驱动或控制器。
使用UUID挂载避免设备名漂移
分区后,用blkid查看UUID,写入/etc/fstab时用UUID=xxx而不是/dev/sdb1,这样即使设备名变化,挂载也不会出错,业内专家指出,虚拟化环境中磁盘设备名漂移是导致启动失败的常见原因之一。
记录虚拟化平台的磁盘控制器类型
在虚拟机配置里记下用的是SCSI、SATA、NVMe还是virtio,不同控制器的重扫描命令和热插拔支持不一样,下次出问题,直接对症下药。
Q&A:Linux虚拟机fdisk找不到设备常见疑问
问:Linux虚拟机fdisk找不到设备,但lsblk能看到,为什么?
答:可能有两个原因,第一,fdisk没用sudo,普通用户看不到磁盘设备,第二,设备被其他进程占用,比如LVM或RAID,先试sudo fdisk -l,再检查lsblk输出中磁盘是否有part类型。
问:云服务器Linux fdisk分区找不到设备,需要重启吗?
答:多数情况下不需要,先在云控制台确认云盘已挂载到实例,然后进入Linux重扫描SCSI总线或virtio设备,如果控制台显示已挂载,但lsblk仍无新盘,检查dmesg看是否有驱动报错,重启是最后手段。
问:VMware虚拟机Linux fdisk看不到磁盘,重扫描命令是什么?
答:先用ls /sys/class/scsi_host/查看host编号,然后执行echo "- - -" > /sys/class/scsi_host/host0/scan,如果host编号不是0,替换即可,也可以一次性扫描所有host:for i in /sys/class/scsi_host/host/scan; do echo "- - -" > $i; done,执行后lsblk确认新磁盘出现。
fdisk找不到设备只是表象,根源在虚拟化层或内核识别环节,按平台重扫描、查驱动、看日志,绝大多数情况无需重装系统。