大家好!这是我在 StackOverflow 网络上的第一篇帖子 :)
我们正在运行一些 ESXi 5.0/vCenter 基础架构,主要托管具有 ext3 分区的 Debian 6/amd64 客户系统,并open-vm-tools
从源代码编译Debian 错误 471784。
遇到了一个在互联网上被提出的问题,但却没有任何地方给出确切的答案。
当尝试在独立持久模式下缩小精简配置的磁盘时,没有任何快照、父级、克隆,我始终收到以下错误:
root@linux64:~# vmware-toolbox-cmd disk list
Shrink disk is disabled for this virtual machine.
Shrinking is disabled for linked clones, parents of linked clones,
pre-allocated disks, snapshots, or due to other factors.
See the User's manual for more information.
(顺便问一下,“其他因素”是什么?在大量白皮书和技术手册中,哪些是“其他因素”?是用户手册?:)
我知道我可以用零填充分区(事实上,我shred -fuzn0
在删除大文件时确实会使用),然后关闭有问题的客户机并使用各种方法,例如vmkfstools
在精简配置模式下克隆或 vMotioning 磁盘等,但所有这些方法要么导致客户机缩小的停机损失,要么导致数据存储和/或主机之间不必要的数据移动。
答案是:ESX/ESXi 下没有缩小(从版本 5 开始)。
这文档内容如下:
重要的不允许收缩磁盘在下列情况下:
虚拟机托管在 ESX/ESXi 服务器上。 ESX/ESXi 服务器仅当虚拟机导出时才可以缩小虚拟磁盘的大小。但虚拟磁盘在 ESX/ESXi 服务器上占用的空间不会改变。
虚拟机有一个Mac 客户端操作系统。
你预先分配创建虚拟磁盘时,将所有磁盘空间分配给虚拟磁盘。
虚拟机包含快照。
虚拟机是一个链接克隆或者 父母链接克隆。
虚拟磁盘是独立的磁盘 非持久模式。
文件系统是日志文件系统,例如ext4、xfs 或 jfs文件系统。
难怪是在 VMWare Workstation 中可以选择缩小,但在连接到 ESXi 或 vCenter 实例的 vSphere 客户端中则不行。
答案1
http://www.vmware.com/pdf/vmware-tools-cli.pdf 第 13 页:
以下情况不允许缩盘:
虚拟机托管在 ESX/ESXi 服务器上。仅当虚拟机导出时,ESX/ESXi 服务器才能缩小虚拟磁盘的大小。但虚拟磁盘在 ESX/ESXi 服务器上占用的空间不会改变。
答案2
实际上,有一种方法可以缩小 ESXi 上的虚拟机,尽管您需要关闭虚拟机。方法如下:
将虚拟机内所有未使用的空间清零:
dd if=/dev/zero bs=1048576 of=/zero ; sync ; rm /zero
对其他挂载点、交换分区等执行相同操作。
关闭虚拟机。
通过 SSH 连接到 ESXi,并发出以下命令:
vmkfstools -K /vmfs/volumes/volumename/vmname/vmname.vmdk
这将需要一些时间... vmkfstools 会在您的 VMDK 内部“打洞”,例如,释放所有填充零的块,从而有效地缩小您的 VMDK。
答案3
在 vSphere ESXi 中缩小 VMDK 的唯一方法是导出或迁移/Storage vMotion 到另一个数据存储。我经常使用可以处理迁移(不是 SQL 或 Exchange)的实时服务器执行此操作。以前的服务器管理员使用厚置备磁盘构建了所有虚拟机。我将虚拟机从一个数据存储迁移到另一个数据存储,并将 VMDK 更改为精简置备。
如果服务器处于离线状态,您也可以执行 vmkfstools。
答案4
在 ESXi 上可以缩小磁盘空间。
找到大文件并将其删除。
find / -type f -size +50M
碎片整理(无需卸载/重新安装任何内容)。忽略任何错误。某些文件(如符号链接和设备文件)无法进行碎片整理。
sudo e4defrag /
用零填充所有未使用的空间,以便 VMware 知道它确实未使用:
dd if=/dev/zero of=wipefile bs=1M; sync; rm wipefile
运行缩减操作:如果4失败,则继续执行5。
sudo vmware-toolbox-cmd disk shrinkonly
使用尝试选项重新启动 Linux 系统,并使用 gparted 编辑分区表。缩小根文件系统并删除交换分区并将其移动到根分区附近。
通过 SSH 连接到 ESXi,并发出以下命令:
vmkfstools -K /vmfs/volumes/volumename/vmname/vmname.vmdk
我们需要编辑 *.vmdk 文件。RW 字母后面定义了 VMware 虚拟磁盘 (VMDK) 的大小
*40 GB = 40 * 1024 * 1024 * 1024 / 512 = 83886080*
将其迁移到另一个数据存储以反映新的大小。