手把手教你解决ESXi扩容后Linux LVM分区表『Device busy』报错
当你兴冲冲地在ESXi上给Linux虚拟机扩容磁盘,却在执行fdisk写入分区表时突然看到WARNING: Re-reading the partition table failed with error 16: Device or resource busy的红色警告,是不是瞬间头皮发麻?别慌,这个看似棘手的报错其实藏着Linux内核的一个小秘密。今天我们就来彻底拆解这个"设备忙"错误,不仅告诉你三种解决方案,还会帮你理解背后的原理,下次遇到类似问题就能举一反三。
1. 错误现象深度解析
那个让人心跳漏拍的报错信息通常长这样:
WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot...这个警告的本质是内核的分区表缓存机制在作祟。当你在fdisk中修改分区表并执行w写入时,系统会尝试通过ioctl()系统调用通知内核重新读取分区表。但如果此时有任何进程正在使用这个磁盘(比如挂载了某个分区),内核就会拒绝立即更新缓存中的分区表信息,抛出EBUSY错误(错误码16)。
典型触发场景:
- 扩容
/dev/sda时,其上的/dev/sda1正被挂载为根分区 - LVM正在使用该磁盘的物理卷(PV)
- 任何用户进程持有该磁盘的文件句柄
可以通过以下命令确认设备是否被占用:
# 查看磁盘挂载情况 lsblk | grep -A 10 "sda" # 检查哪些进程正在使用磁盘 lsof /dev/sda*2. 三种解决方案对比
遇到这个报错时,你面前摆着三条路,每种方案各有优劣:
2.1 方案一:partprobe命令 - 优雅刷新
partprobe是parted工具包中的瑞士军刀,专门用于通知内核重新读取分区表。它的工作原理是向内核发送BLKRRPARTioctl请求。
操作步骤:
# 安装parted工具包(如果尚未安装) yum install parted -y # CentOS/RHEL apt-get install parted -y # Ubuntu/Debian # 执行分区表刷新 partprobe /dev/sda优势:
- 无需重启系统
- 对运行中的服务零影响
- 支持指定单个设备刷新
局限:
- 某些老旧内核版本可能不支持
- 对LVM物理卷效果有限
提示:执行后建议用
lsblk确认新分区是否可见,如果仍然看不到,可能需要尝试其他方案。
2.2 方案二:kpartx命令 - LVM专家的选择
当partprobe无效时,特别是处理LVM环境时,kpartx会成为救命稻草。它能动态创建设备映射,特别适合处理复杂的存储配置。
操作流程:
# 安装kpartx(通常包含在multipath-tools中) yum install multipath-tools -y apt-get install multipath-tools -y # 删除旧映射(谨慎操作) dmsetup remove_all # 创建新分区映射 kpartx -av /dev/sda # 验证新分区 ls /dev/mapper/适用场景:
| 场景 | 是否推荐 |
|---|---|
| 传统分区 | ★★☆☆☆ |
| LVM物理卷 | ★★★★☆ |
| 多路径设备 | ★★★★★ |
风险提示:
- 会临时影响依赖原设备映射的服务
- 可能需要手动重建dm设备
2.3 方案三:简单粗暴的重启 - 终极武器
当其他方法都失效时,重启系统永远是最后的保障。这不是玩笑 - 在某些生产环境中,有计划的重启比冒险尝试各种命令更可靠。
重启的正确姿势:
- 确保已保存所有工作
- 使用
sync命令同步磁盘 - 执行
reboot或shutdown -r now
重启 vs 命令刷新的选择矩阵:
| 考虑因素 | 推荐方案 |
|---|---|
| 关键业务系统 | partprobe/kpartx |
| 测试开发环境 | 重启 |
| 远程无console访问 | 优先命令方案 |
| 内核版本<3.10 | 建议重启 |
3. 实战决策树:我该选哪种方案?
面对具体场景时,可以按照这个流程图决策:
首先尝试partprobe
- 执行
partprobe /dev/sda - 检查
lsblk是否显示新分区
- 执行
如果无效且使用LVM
- 运行
kpartx -av /dev/sda - 验证
/dev/mapper/下设备节点
- 运行
前两种方法失败时
- 评估是否允许重启
- 安排维护窗口执行重启
极端情况处理
- 如果重启后仍无效,考虑:
- 检查ESXi层面磁盘是否真扩容
- 确认没有残留的dm设备(
dmsetup ls)
- 如果重启后仍无效,考虑:
4. 扩容后的完整LVM操作指南
成功解决分区表问题后,还需要完成LVM扩容的全流程。以下是关键步骤的快速参考:
4.1 创建物理卷(PV)
pvcreate /dev/sda3 pvdisplay # 验证4.2 扩展卷组(VG)
vgextend centos /dev/sda3 vgdisplay # 检查可用空间4.3 扩展逻辑卷(LV)
# 查看当前LV情况 lvs # 扩展home逻辑卷(示例) lvextend -L +150G /dev/centos/home /dev/sda3 # 或用所有剩余空间 lvextend -l +100%FREE /dev/centos/home4.4 文件系统扩容
对于XFS文件系统:
xfs_growfs /dev/centos/home对于ext4文件系统:
resize2fs /dev/centos/home最后用df -h确认空间已扩容成功。曾经有次我在凌晨3点处理这种问题,因为忘了执行xfs_growfs,盯着没变化的空间大小怀疑人生了半小时...