大家好!我在 StackOverflow 网络上的第一篇文章 :)
我们正在运行一些 ESXi 5.0/vCenter 基础架构,以主要托管具有 ext3 分区的 Debian 6/amd64 来宾系统,并根据debian 错误 471784open-vm-tools
从源代码编译。
遇到了一个问题,该问题在整个互联网上都被提出,但在任何地方都没有给出决定性的答案。
当尝试在独立持久模式下收缩精简配置磁盘时,没有任何快照、父母、克隆,我总是收到以下错误:
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 Server只能在导出虚拟机时缩小虚拟磁盘的大小。但是,虚拟磁盘在 ESX/ESXi 服务器上占用的空间不会改变。
虚拟机具有Mac 来宾操作系统。
您在创建虚拟磁盘时将所有磁盘空间预先分配给它。
虚拟机包含快照。
虚拟机是链接克隆或链接克隆的 父级。
虚拟磁盘是非持久模式下的独立磁盘 。
文件系统是一个日志文件系统,例如ext4、xfs 或 jfs文件系统。
难怪在 VMWare Workstation 中有收缩选项,但在连接到 ESXi 或 vCenter 实例的 vSphere 客户端中没有。
实际上,有一种方法可以在 ESXi 上缩小 VM,尽管您需要为此关闭 VM。就是这样:
将 VM 内所有未使用的空间归零:
dd if=/dev/zero bs=1048576 of=/zero ; sync ; rm /zero
对其他挂载点、交换分区等执行相同的操作。
关闭虚拟机。
SSH 到 ESXi,并发出以下命令:
vmkfstools -K /vmfs/volumes/volumename/vmname/vmname.vmdk
这将需要一些时间... vmkfstools 在您的 VMDK 中“打孔”,例如释放所有填充为零的块,从而有效地缩小您的 VMDK。
http://www.vmware.com/pdf/vmware-tools-cli.pdf 第 13 页:
下列情况不允许缩盘:
虚拟机托管在 ESX/ESXi 服务器上。ESX/ESXi Server 只能在导出虚拟机时缩小虚拟磁盘的大小。但是,虚拟磁盘在 ESX/ESXi 服务器上占用的空间不会改变。
在 vSphere ESXi 中收缩 VMDK 的唯一方法是导出或迁移/Storage vMotion 到另一个数据存储。我经常使用可以处理迁移(不是 SQL 或 Exchange)的实时服务器来执行此操作。以前的服务器管理员使用厚配置磁盘构建了所有 VM。我将虚拟机从一个数据存储迁移到另一个,并将 VMDK 更改为自动精简配置。
如果服务器离线,您也可以执行 vmkfstools。
在 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
使用 try 选项重新启动 linux 系统并使用 gparted 编辑分区表。缩小根文件系统并删除交换分区并将其移动到根分区附近。
SSH 到 ESXi,并发出以下命令:
vmkfstools -K /vmfs/volumes/volumename/vmname/vmname.vmdk
我们需要编辑 *.vmdk 文件。在字母 RW 之后,定义了 VMware 虚拟磁盘 (VMDK) 的大小
*40 GB = 40 * 1024 * 1024 * 1024 / 512 = 83886080*
将其迁移到另一个数据存储以反映新的大小。