上一篇 下一篇 分享链接 返回 返回顶部

香港云服务器新增硬盘无法识别?运维工程师亲历排查与解决全流程

发布人:Minchunlin 发布时间:2025-12-04 09:12 阅读量:553


最近,公司为一个跨境电商独立站准备扩容存储空间。原来我们租用的是一个香港云主机,系统盘 50 GB + 数据盘 200 GB,运行 MySQL + 上传图片 + 日志。因业务增长,预计图片/日志量在两个月内增长 3 倍 — 我们向云服务商申请新增一个 1 TB 的数据盘,用于存储用户上传内容 + 日志 +备份。对方报盘后,我们在控制面板看到“已挂载到实例”状态。

为避免重启服务(生产环境 24/7,高并发读写,不允许 downtime),我决定在系统内在线识别新盘、分区、挂载并投入使用。没想到 —— 加盘之后,运行 lsblk / fdisk -l 都没看到新的 /dev/sdX 或 /dev/vdX。

以下就是我从“怀疑是不是服务商的问题”到“确认是系统没识别 + 驱动/扫描机制的问题”,并最终解决的全过程。

排查思路与常见原因 — “为什么新增云硬盘 Linux 识别不到?”

在我自己的故障排查流程中,总结出以下几个常见原因 + 验证方式。其实很多都在一些技术文档/社区经验里有所提及。

序号 原因 说明 / 何时发生 验证/排除方式
1 云控制面板没有真正“挂载/Attach”盘 服务商界面显示“已挂载”,但后台接口可能失败 登录云面板、确认 LUN / 卷是否在该实例处于 “attached / 已挂载” 状态;或联系服务商确认真正在 hypervisor 端 attach
2 虚拟化平台/Hypervisor → 客户 VM 的 SCSI / 虚拟磁盘桥接失败 若是 KVM / VMware / Xen 等,可能因为驱动或桥接配置有误 检查 VM hypervisor 日志;也可重启 VM(如果允许)测试是否能识别到盘
3 Guest OS 内核 / 驱动没加载(尤其对 SAS、SCSI、NVMe 硬盘) 新的块设备类型可能需要内核模块或新内核版本支持 在 Linux 上执行 lsmod, 查看 nvme / scsi 驱动是否加载;若无,尝试 modprobe nvme / modprobe scsi_mod
4 系统没有自动扫描新添加的 SCSI 总线 / block device Linux 不一定自动 rescan 新盘 手动触发扫描 SCSI 总线或 block device
5 设备已识别,但没有分区 / 分区表 / 未初始化 新盘通常是 raw,没有分区表 / filesystem 使用分区工具(fdisk/parted/gdisk)创建分区表 & 分区
6 分区工具/filesystem 不兼容或分区表限制(例如超过 2 TB 的磁盘使用 MBR) 老工具可能不支持大容量磁盘或 GPT 对大盘使用 GPT 分区,选择 parted/gdisk 而不是默认 fdisk

我的实际排查 & 解决过程(真实命令 + 输出 + 心得)

注:我的系统是 Ubuntu 22.04 (也适用于大多数现代 Linux 发行版),云盘是通过服务商 Web 控制面板添加的,类型是“标准块存储(block volume)”,虚拟接口为 SCSI。

确认服务商面板显示“已挂载 / attached”

登录到 cloud provider 面板,确认新加的 1 TB 硬盘确实属于该实例,并已 attach。

虽然 UI 显示已挂载,但我仍记下 LUN ID,准备从 guest OS 端进一步确认。

检查内核日志,看 kernel 有没有 detect 到设备插入

dmesg | tail -n 50 | grep -i sd
dmesg | tail -n 50 | grep -i scsi
dmesg | tail -n 50 | grep -i nvme

结果:没有新条目。说明 kernel 没有捕捉到新设备上线。根据文档,如果 kernel 没 detect,好可能是虚拟化 / bridging 的问题,也可能是驱动没加载。

检查 SCSI / NVMe 驱动是否加载

lsmod | grep -E 'nvme|scsi_mod|sd_mod'

如果你看到 nvme 或 scsi_mod 模块没加载,就手动加载试试:

sudo modprobe scsi_mod
sudo modprobe sd_mod
sudo modprobe nvme   # 视服务商块设备类型而定

然后再看 dmesg 是否有新日志。我当时没问题 —— 驱动是加载的。

手动让 kernel 扫描 SCSI host,总线 rescan
Linux 默认添加盘时不一定自动扫描,需要手动触发。方法:遍历 /sys/class/scsi_host/ 下的 hostX,执行 scan。

for host in /sys/class/scsi_host/host*; do
  echo "- - -" | sudo tee "$host/scan"
done

之后,再运行 lsblk 或 fdisk -l。

我的情况:scan 后,不仅没有 /dev/sdb 出现,也没有新的 scsi 相关 dmesg 日志 → 排除了仅仅是扫描没及时触发的问题。

怀疑是服务商层面的挂载 / hypervisor 问题

我联系了服务商 support,要求他们在 hypervisor 层确认这个 1TB 卷是否 attach 到正确 VM,并且桥接(bridge / device‑map)是否正确。

服务商反馈“确实 attach”,“hypervisor 端看不到错误”。也就是说,从他们那端来看,一切正常 —— 更可能是 guest OS 看不到的原因。

尝试重启 VM(线下窗口 + 业务提醒)

虽然不想重启,但短时间停机窗口允许,我决定重启一次 VM。

重启后,一登陆,就能在 lsblk 下看到 /dev/sdb 1.0T。这说明 hypervisor → guest 之间桥接确实起作用,但 hot‑attach(运行中 attach)没有对 guest 生效。

分区 / 挂载盘

看到新设备后,进行标准分区 / 格式化 / 挂载流程:

# 使用 parted 创建 GPT 分区表并分区
sudo parted /dev/sdb --script mklabel gpt
sudo parted /dev/sdb --script mkpart primary ext4 0% 100%

# 格式化
sudo mkfs.ext4 /dev/sdb1

# 创建挂载点 & 挂载
sudo mkdir -p /data/uploads
sudo mount /dev/sdb1 /data/uploads

# 查看
df -h /data/uploads

然后修改 /etc/fstab,建议使用 UUID 而不是设备名,以防设备名变更。用 blkid 获取 UUID:

sudo blkid /dev/sdb1
# 假设输出: UUID="abcd-1234-ef56-..."
echo 'UUID=abcd-1234-ef56-...  /data/uploads  ext4  defaults,nofail  0  2' | sudo tee -a /etc/fstab

nofail 参数可防止挂载失败影响系统启动。

为什么会这样 — 背后的本质 & 教训

通过这次经历,我深刻认识到:“云服务器加盘 + 虚拟化 + Linux guest” 的环境中,很多地方看似“已经挂载 / attach”,但实际上 guest OS 层可能根本没感知 —— 特别是当系统不重启时。

具体几点教训:

  • Linux 不会默认自动扫描新的 SCSI/SCSI‑bridge 磁盘。手动 echo "- - -" rescan 是必须步骤。
  • 即便 rescan 后没识别,也可能是虚拟化平台桥接的问题,这部分普通用户(guest OS)看不到日志,需要和服务商/hypervisor 管理员配合。
  • 对于大容量磁盘(如 1 TB、2 TB 以上),推荐使用 GPT 分区表 + parted/gdisk,不要用老旧 fdisk(可能局限于 MBR 或兼容性差)。
  • 挂载时 /etc/fstab 最好使用 UUID + nofail,防止设备名变化或盘暂时不可用导致启动失败。

我在现场遇到的坑 & 细节 — 那些容易掉进的“地雷”

下面是真实发生的几个坑/细节 —— 如果你没经历过,很容易忽略,引发宕机/数据丢失/挂载失败等问题。

服务商 UI 与后台状态不同步

UI 显示 “attached / 已挂载”,但实际上后台 attach 操作失败(hypervisor logs show error 但没反馈给用户) —— 导致 guest 看不到硬盘。这个坑很难从 guest 端发现。

热插入(hot‑attach)与 guest OS 不兼容

尤其是某些老旧 Linux 内核 + 某些虚拟化桥接方式,热插入可能不能触发 SCSI 总线重新扫描,必须通过重启 VM。

分区工具默认 MBR,1 TB 以上用 MBR 可能有兼容性、容量限制

如果执意用 fdisk,可能会遇分区失败或未来扩容问题。

fstab 配置不慎

我曾一开始直接写 /dev/sdb1 /data/uploads ext4 defaults 0 0,后来一次重启发现系统挂载失败,导致某些服务因挂载失败出错。后来改成 UUID + nofail 才稳定。

总结 —— 给香港云服务器运营/运维者的建议

不要只相信控制面板 UI,要从 guest OS 层确认实际 attach / detect。

添加大盘后,尽量安排维护窗口,重启 VM:热插入不一定可靠。

分区用 GPT + parted/gdisk;挂载用 UUID + nofail。

写一个通用的 rescan 脚本,方便以后快速热插入/排查。

下面是我平时常用的 rescan 脚本,放到 /usr/local/bin/rescan_new_disks.sh:

#!/usr/bin/env bash
for host in /sys/class/scsi_host/host*; do
    echo "- - -" | sudo tee "$host/scan" >/dev/null
done
sleep 2
lsblk

用这个脚本,加盘后运行一下,一步到位。

最后,作为一家专注香港服务器租用/托管、运营跨境电商/直播/高并发业务的团队,我们更要重视这些基础但容易被忽视的细节 — 因为一次挂盘操作,如果失败,不光是硬盘看不到那么简单,可能导致整个服务异常、数据不一致、甚至用户体验崩塌。希望这次“我亲历 + 解决”的案例,对你未来写技术文章/运维实操有帮助。

目录结构
全文