给一台几年前的双路服务器装Proxmox VE(下文简称PVE),ISO引导正常,图形安装向导一路走到语言、时区、网络配置,结果卡在“选择目标磁盘”这一步:磁盘列表空白,点Install直接弹出一行提示——disk not found。更折磨人的是,服务器开机自检时明明能看到两块硬盘,BIOS存储页面里物理盘也都列得好好的。
这类问题我前前后后遇过不止五次,每次的根因都不一样。有阵列卡把物理盘“私藏”起来的,有处理器卷管理特性把NVMe盘接管走的,还有一次纯粹是虚拟化平台里新建虚拟机时忘了加虚拟磁盘。这篇文章把“disk not found”从现象到根因的完整排查链路写出来,重点讲清楚每一步为什么要这么做、命令怎么看、结论怎么下。卡在这一步的朋友照着下面的顺序排,大多数情况下十几分钟就能找到病根。
1. 先搞清楚安装器到底在“找”什么盘
1.1 disk not found 本质上是内核设备树为空
PVE安装器本质上是Debian安装流程的图形化外壳,走到分区步骤时,它会枚举Linux内核当前能看到的全部块设备,并逐个判断容量、介质类型、是否可写。如果没有任何设备满足基本条件,安装器就会在界面上给出“No disks found”或“disk not found”之类的提示。
所以这个报错并不是安装器自身的Bug,它是在告诉你:Linux内核在当前硬件环境下没有扫描到任何适合用来装系统的目标磁盘。这里有一个特别容易误导人的点——开机自检能看到盘、BIOS界面能看到盘,都不代表Linux内核能看到盘。从BIOS层面到操作系统层面之间,隔着控制器驱动、固件行为和硬件枚举逻辑。很多盘“消失”的案例,最后都证明盘本身没坏,而是某个中间环节没有把它放行。
这也是为什么我不建议一上来就盲改BIOS设置。先搞清楚安装器背后的设备枚举机制,再动手,能少走很多弯路。
1.2 阵列卡工作模式是“隐瞒”磁盘的重灾区
大部分服务器上的SAS/SATA控制器都有两种工作模式。一种叫RAID模式(不少厂商固件里写成IR Mode),控制器会把物理盘按规则组成逻辑卷,操作系统只能看到逻辑卷本身,物理盘对系统不可见;另一种叫直通模式,不同厂商叫法各异——HBA Mode、IT Mode、JBOD、Passthrough,本质上都是把物理盘直接透传给操作系统,每块物理盘独立可见。
问题恰恰出在“中间态”上。如果控制器处于RAID模式,但既没有创建任何存储卷,也没有把物理盘逐块设置成直通盘,那么操作系统层面就是一张白纸——没有任何块设备。安装器自然只能报disk not found。
| 工作模式 | 系统能看到什么 | 对PVE安装的影响 |
|---|---|---|
| RAID(IR)模式 | 逻辑卷,物理盘被固件“隐藏” | 未建阵列时无盘可选 |
| 直通(HBA/IT/JBOD)模式 | 每块物理盘独立可见 | 正常识别,推荐配合ZFS使用 |
我通常会建议大家如果机器是拿来跑PVE的,控制器尽量切到直通模式。原因后面细说,但这确实是物理机安装时排错的第一优先级方向。
2. 第一现场:用安装器自带的Shell确认底层状态
2.1 从图形界面切到命令行控制台
PVE的图形安装器保留着一个很实用的后门。在图形界面下按Ctrl+Alt+F2,可以直接切到一个命令行控制台,里面是完好的BusyBox/Linux环境;想切回图形界面就按Ctrl+Alt+F1。有些笔记本需要按住Fn键再配合功能键才能切换,物理服务器一般没有这个问题。
进了控制台后,你会拿到一个root shell。这意味着不需要重新引导什么精简救援系统,直接在安装现场就能做完整诊断。
2.2 四条命令看清整个设备树
lsblk -f lsscsi dmesg | egrep -i "sd|nvme|sata|scsi|reset" fdisk -l /dev/sda逐条解释一下:
lsblk -f用来查看块设备列表、分区和文件系统类型,它是最直观的“到底有没有盘”的判断依据。lsscsi查看SCSI/SAS层级里有没有设备,能区分“控制器没发现盘”和“系统枚举失败”两种情况。dmesg的过滤输出非常关键,如果内核日志里有reset、timeout、I/O error这类关键字,说明设备曾经被发现过然后又掉了,这种情况优先怀疑硬件链路而不是配置。fdisk -l /dev/sda看具体某块盘的容量和分区表,必要时可以换成fdisk -l列出全部磁盘。
2.3 按命令输出把问题分成三类
我在实际排查中会把输出归成三种情况,处理方向完全不同:
lsblk和lsscsi输出都为空:硬件底层就没有识别到盘。优先检查阵列卡模式、背板供电、线缆连接,以及PCIe设备是否被正确枚举。lsscsi能看到设备但lsblk为空:控制器层面发现了设备,但Linux没有建立块设备节点。常见原因是驱动未加载、设备被某个中间层挡在门外。lsblk里有盘,但安装器图形界面仍然报disk not found:这种情况少一些,通常是安装器对设备的过滤规则(比如固件将硬盘标记为可移动介质)或者盘本身分区表状态异常导致的。
把问题定性到这个粒度,后面每一步动手都有的放矢。
3. 物理机最常见的一句话结论:RAID卡没有把盘交出来
3.1 我的实际排错过程:从报错到阵列卡配置
遇到第一台报disk not found的服务器时,我还没经验丰富到直接在Shell里快速判断。整个过程是:先按Ctrl+Alt+F2进控制台,执行lsblk -f,输出完全为空;再执行lsscsi,同样没有任何设备。这基本可以断定是控制器固件层面出了问题,而不是Linux驱动的问题。
重启服务器,在开机自检阶段按提示进入阵列卡配置界面。进去之后一眼就看到了问题所在:物理盘列表里有2块盘,状态都是Ready;但逻辑盘(某些界面里叫Virtual Drive或Logical Drive)数量是0。也就是说控制器正处在RAID模式,却没有创建任何逻辑卷,系统自然什么都看不到。
处理办法很简单:把控制器的工作模式切到直通/JBOD/HBA,或者逐块把物理盘设置成独立直通盘,保存配置后重启。再引导PVE安装器,磁盘列表里两块盘就正常出现了。这个案例里,问题不在Linux,不在ISO,也不在盘本身,纯粹是阵列卡的配置“中间态”造成了假性无盘。
3.2 为什么建议用直通而不是硬阵列
既然支持RAID,为什么PVE用户普遍建议改直通?核心原因在ZFS。
PVE默认推荐基于ZFS做存储,ZFS要求直接管理物理磁盘——它需要读到每块盘的SMART健康信息、物理扇区布局、温控和错误计数。如果控制器做了硬RAID,ZFS在系统层面只能看到一个被固件打包好的逻辑卷,物理盘的SMART信息、坏道重映射记录全部被中间层挡掉了,磁盘故障时很难精准定位是哪一块。官方文档里也多次提示,在ZFS场景下应该让控制器以直通模式工作,而不是硬阵列。
除此之外还有一层现实考量:很多服务器自带的硬阵列卡本身带有缓存模块,如果断电保护机制不完善,意外断电后缓存里的数据可能丢失,这对虚拟化宿主机来说是额外风险。退役服务器转型PVE时,我一般直接建议关掉硬阵列功能,让控制器回归最朴素的直通职责。
4. 虚拟机和NVMe的特殊场景:VMD与虚拟磁盘“失踪”
4.1 虚拟化平台里容易忽略的三个细节
如果你不是在一台物理机上装PVE,而是在某虚拟化平台里建虚拟机来跑PVE,报disk not found的原因往往和实体机不太一样。我见过三类:
第一类最简单——创建虚拟机的时候没有添加任何虚拟磁盘,或者磁盘容量填了0。安装器进场时发现一个块设备都没有,自然报错。第二类:虚拟磁盘控制器的类型选得比较特殊,比如手动指定了NVMe控制器,而某些虚拟化平台的NVMe模拟实现和Linux安装器内核之间存在兼容问题,导致设备节点没有正常暴露。这种情况把控制器换成默认的SATA或者VirtIO SCSI类型,问题通常立刻消失。
第三类是PCIe直通导致的问题。有人想把物理硬盘直接直通给虚拟机,却漏掉了宿主机的直通前置配置,比如没有正确绑定VFIO驱动,虚拟机里自然看不到盘。这三种情况都可以用前文提到的Shell方法快速区分。
4.2 实体机NVMe盘不被识别:VMD开关的坑
和SATA盘不同,NVMe盘在部分服务器平台上会遇到一个额外关卡——VMD,全称Volume Management Device,可以理解为处理器平台固件里的卷管理设备特性。它开启后,NVMe盘会被固件统一接管,相当于在操作系统和物理NVMe设备之间加了一道“中间层”。如果安装器内核没有内置对应驱动,或者驱动加载顺序不对,盘就不会出现在系统设备树里,表现为disk not found。
处理方法通常有两个方向。最直接的是进BIOS设置,找到VMD相关选项,把它关闭(Disabled),让NVMe盘直接挂到PCIe总线上,Linux原生NVMe驱动就能认出来。另一个方向是确认PVE版本的内核足够新,能正确加载VMD支持模块。新版本PVE对这类平台特性的兼容性已经大幅改善,但如果用旧版本ISO引导,还是比较容易撞上这个坑。
我个人的习惯是:普通业务场景下用新版本PVE并保持BIOS默认VMD开启状态,先测试能否识别;如果识别不了,再选择关闭VMD优先保证安装顺利。不要在VMD开关上过度纠结,它不影响PVE本身的稳定性。
5. 边缘但真实存在:电源、线缆与USB设备的干扰
5.1 硬盘背板或数据线接触不良导致设备时有时无
有些服务器经过多次搬运、插拔,硬盘背板供电接口或SATA/SAS数据线已经出现接触不良。这种问题在安装器里表现得很诡异:第一次执行lsblk时能看到sda,过一分钟再执行就消失了,或者安装过程中拷贝文件时盘突然掉线,报I/O错误。
遇到这种“时有时无”的情况,别急着怀疑系统配置。先断电,把数据线和电源线重新插拔一遍,更换一个背板接口或数据线位置,再重新引导安装器测试。还有一次我遇到的是背板供电插头松了,导致多块盘同时供电不足,系统里设备列表忽隐忽现。重新插紧之后,问题彻底消失。这类硬件链路问题如果用软件手段排查,永远找不出答案。
5.2 安装U盘可能被安装器当成目标盘
安装PVE通常用U盘引导,而安装器在枚举块设备时不会把USB存储介质排除在外。所以磁盘列表里除了真实硬盘之外,还会多出一个U盘。
如果分区确认界面里盘符对错了——尤其当服务器存在多块相同型号硬盘时——很容易把系统安装进U盘,或者对U盘执行分区操作,安装过程就会出现各种匪夷所思的报错,其中包括看起来很像“disk not found”的分区失败提示。我的建议是把安装U盘插在后置USB口,并在选择目标盘时逐一核对磁盘型号和容量,确认没有选中USB介质再继续。
5.3 多路径设备重名盘干扰判断
在双控制器背板或双口SAS盘环境下,同一块物理磁盘可能被系统识别成多个设备节点,比如sda和sdb实际上指向同一块盘。如果安装器没有正确合并多路径设备,磁盘列表里会看到重复的盘符。
更麻烦的是,如果你只看到一部分盘,会误以为另外一块盘“丢了”,实际它只是以另一个设备节点存在。遇到这种情况,可以在Shell里执行multipath -ll确认是否存在多路径映射。对绝大多数家用或单机实验环境来说,双控制器场景并不多见,主要是机房环境要留意。
6. 问题解决后的确认:分区、文件系统与重启验证
6.1 需要特殊分区时,可以先用gdisk在Shell里分好
安装器本身的自动分区方案对大多数人来说是够用的。但如果你希望手动规划分区——比如想把EFI、swap、root分开,或者在硬盘开头预留一段空间给后续用途——可以在安装器的Shell里直接用gdisk完成分区,再返回图形安装器继续。
以UEFI引导模式为例,假设目标是/dev/sda,可以在安装器的Shell里输入:
gdisk /dev/sda然后在gdisk交互命令中依次创建三个分区:
n -> 1 -> 回车默认起始 -> +512M -> ef00 n -> 2 -> 默认起始 -> +8G -> 8200 n -> 3 -> 默认起始 -> 默认结束 -> 8300 wef00是EFI系统分区类型代码,8200是Linux swap类型代码,8300是Linux文件系统类型代码。如果你改用传统的legacy BIOS引导,就不需要EFI分区,改成一个小型ef02(BIOS boot)分区给GRUB使用。分好之后回到安装器,引导安装流程,安装器通常能正确识别已有的分区结构,但一定要注意看清楚安装器是否打算重新初始化整块磁盘——如果它对整盘重新分区,你手动分的布局会被覆盖。
6.2 装完之后的几项验证
安装完成后,在重启前先拔掉U盘或安装介质,避免引导设备顺序错乱。进入系统后不要急着部署业务,花几分钟确认磁盘状态稳定:
lsblk -f dmesg | egrep -i "reset|timeout|i/o error" smartctl -H /dev/sdalsblk -f确认目标盘的分区和文件系统挂载正常;dmesg筛选有没有磁盘reset、超时或I/O错误日志;smartctl -H查看硬盘健康状态。如果日志中反复出现磁盘reset,即使系统已经装上了,后续运行也会很不稳定,必须回头检查线缆、电源和固件配置。
还有一个容易忽略的点:如果控制器之前处于RAID模式,在安装完成后进入系统,拿lsscsi确认一下系统里看到的设备数量和物理盘数量是否一致。很多时候盘不是坏了,而是在某些固件设置下依然被“半隐藏”,导致虚拟化平台后续添加存储时找不到预期的磁盘。
最后说一点个人体会。每次装PVE遇到disk not found,我都会提醒自己先别急着乱按BIOS,先在安装器Shell里把设备树摸清楚。大量“盘不见了”的案例,最后都不是盘坏了,而是固件、控制器模式、驱动加载这些“中间环节”没有把盘放行。判断顺序大致是:先看Shell里能不能看到设备,再决定是去动阵列卡还是查线缆。照着这个思路走,基本都能在十几分钟内定位问题。希望这篇记录能让你少走几次弯路。