问题描述
在使用 esxcli 命令尝试卸载 VMFS 数据存储时,操作可能会失败并显示以下信息:
Volume 'Datastore-Name' cannot be unmounted. Reason: Busy
这种情况在 ESXi 7.x、8.x 和 9.x 版本中都可能发生,无论你是在 vSphere 客户端还是通过命令行操作。
根本原因分析
“Reason: Busy” 错误表明数据存储正在被使用,无法立即卸载。常见的原因包括:
1. 虚拟机正在访问数据存储:数据存储上可能有运行中的虚拟机或包含虚拟机的虚拟磁盘
2. 活跃的文件系统锁定:文件管理工具、备份工具或其他进程正在访问数据存储上的文件
3. 存储相关操作:存储 vMotion、快照创建或其他存储维护任务正在进行中
4. shell 工作目录:root 用户可能已导航到数据存储根目录,导致目录锁定
故障排查和解决方案
方法 1:识别并处理访问数据存储的虚拟机
1. 使用以下命令列出所有正在运行的虚拟机及其使用的数据存储:
esxcli vm process list
2. 对于找到的虚拟机:
-
- 如果是测试环境,可以将其关机
- 如果是生产环境,可以使用 Storage vMotion 将其迁移到其他数据存储
- 或者,将虚拟机的虚拟磁盘迁移到其他存储位置
3. 验证数据存储是否不再被虚拟机使用:
# 列出正在运行的虚拟机的存储使用情况
for vm in $(esxcli vm process list | grep -i "World ID" | awk '{print $NF}'); do
echo "Checking VM with World ID: $vm"
esxcli vm process get --world-id $vm | grep -i "datastore"
done
方法 2:检查并处理活跃文件或打开的文件
1. 获取数据存储的 UUID(可以从 /vmfs/volumes/ 目录查看)
2. 检查是否有打开的文件:
lsof | grep /vmfs/volumes/
3. 如果发现有进程锁定了数据存储,可以:
-
- 识别该进程并尝试正常终止
- 如果无法正常终止,可以使用
kill命令强制杀死该进程
4. 常见的锁定进程处理:
-
- 如果是 shell 进程(sh)锁定了目录,可以通过改变工作目录来释放锁定:
cd /
方法 3:检查正在进行的存储操作
1. 在 vSphere Client 中:
-
- 检查任务管理器,查看是否有 Storage vMotion、快照或其他存储相关操作正在进行
- 检查数据存储的监控页面,查看是否有活跃的存储 I/O
2. 使用 esxcli 命令检查设备世界列表:
esxcli storage core device world list -d
其中 可以是 LUN 的 NAA(Network Address Authority)标识符。
3. 如果发现有 Worker 线程(如 hostd、vpxa、storageRM)正在使用该设备,可以尝试重启相应的服务:
/etc/init.d/hostd restart
方法 4:检查是否作为持久 Scratch 位置
数据存储可能被用作 ESXi 主机的持久 Scratch 位置,这种情况下无法卸载:
1. 检查 Scratch 位置:
esxcli system scratch get
2. 如果数据存储被用作 Scratch 位置,需要重新配置:
- 在 vSphere Client 中导航到主机 > 配置 > 系统 > 高级系统设置
- 找到
ScratchConfig.CurrentScratchLocation和ScratchConfig.ConfiguredScratchLocation - 如果需要,将 Scratch 位置更改为其他数据存储或本地存储
方法 5:使用强制卸载选项(谨慎使用)
如果以上方法都无法解决问题,可以尝试强制卸载,但这可能会导致数据丢失或损坏,因此只有在绝对必要且数据存储上无重要数据时才应使用:
esxcli storage filesystem unmount --volume-label=Datastore-Name --force
预防措施
为了避免未来遇到类似问题,建议:
1. 提前规划:在尝试卸载数据存储前,确保没有虚拟机或存储操作正在使用该数据存储
2. 使用 vSphere Client:使用 vSphere Client 而不是直接使用命令行,因为它会执行更全面的前置检查
3. 监控数据存储使用:设置监控来跟踪数据存储的使用情况,包括虚拟机、文件系统锁定和存储操作
4. 定期检查:定期检查数据存储的使用情况,特别是在进行存储维护之前
验证与测试
验证步骤
1. 完成所有必要的操作后,再次尝试卸载数据存储:
esxcli storage filesystem unmount --volume-label=Datastore-Name
2. 验证数据存储是否已成功卸载:
esxcli storage filesystem list
3. 检查 /vmfs/volumes/ 目录以确认数据存储已不在挂载列表中:
ls -la /vmfs/volumes/
测试方法
1. 在数据存储卸载之前和之后运行以下命令以验证操作成功:
# 卸载前
esxcli storage filesystem list | grep -i "Datastore-Name"
# 执行卸载操作
esxcli storage filesystem unmount --volume-label=Datastore-Name
# 卸载后
esxcli storage filesystem list | grep -i "Datastore-Name"
2. 检查是否有任何错误信息或警告:
vmkernel.log | grep -i "unmount"
相关资源
1. [VMware KB 390823](https://knowledge.broadcom.com/external/article?articleNumber=390823)
2. [VMware KB 323128 – Unmounting a VMFS Datastore](https://knowledge.broadcom.com/external/article?articleNumber=323128)
3. [VMFS Datastore Management Guide](https://docs.vmware.com/en/VMware-vSphere/8.0/com.vmware.vsphere.storage.doc/GUID-1B6B7C8D-7C6A-4E6F-8D6A-7B8D8B7C6A4E.html)
通过按照本文中的步骤进行故障排查,您可以识别并解决导致 VMFS 数据存储无法卸载并显示 “Reason: Busy” 的问题。
Reference: VMware KB 390823







