Proxmox VE等虚拟化平台下qcow2类型磁盘文件瘦身命令随记

来自三线的随记
Admin讨论 | 贡献2022年4月4日 (一) 11:57的版本

先确保相关的磁盘关联的虚拟机已经关机

Proxmox VE(又简称 pve) 等基于qemu的虚拟化管理平台建虚拟机的时候,有的不支持设置磁盘创建模式为精简置备模式 (精简置备模式是vmware的磁盘磁盘置备模式描述,pve目前似乎没找到类似的概念)

这种情况下在ls -lh 命令中,文件size大小会跟平台上对应磁盘的总体大小基本一致,但是与 du -sh 下显示的大小相差特别大( du -sh 才是实际的占用大小)

这种文件一般又称为: 稀疏文件(sparse file)

example:

root@pve-211:/vm-files/images/110# ls -lh
total 3.6G
-rw-r----- 1 root root 33G Apr  3 20:16 vm-110-disk-0.qcow2

root@pve-211:/vm-files/images/110# du -sh vm-110-disk-0.qcow2 
3.6G	vm-110-disk-0.qcow2

root@pve-211:/vm-files/images/110# stat vm-110-disk-0.qcow2 
  File: vm-110-disk-0.qcow2
  Size: 34365243392	Blocks: 7359256    IO Block: 4096   regular file
Device: 812h/2066d	Inode: 25559069    Links: 1
Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-04-03 20:16:28.146186594 +0800
Modify: 2022-04-03 20:16:27.638194604 +0800
Change: 2022-04-03 20:16:27.638194604 +0800
 Birth: 2022-04-03 20:13:59.396532193 +0800

可以看出id为110的虚拟机,disk-0在创建的时候声明了约33G的容量,目前实际占用约3.6G


在这种情况下,如果需要在pve平台中对虚拟机进行节点间的迁移(虚拟机磁盘文件没有放在分布式存储上),有可能带来较长的耗时


使用以下命令可以进行文件瘦身

qemu-img convert -O qcow2 base-103-disk-0.qcow2 base-103-disk-0.qcow2_new

rm base-103-disk-0.qcow2
mv  base-103-disk-0.qcow2_new base-103-disk-0.qcow2

如上即可完成磁盘文件的瘦身

额外的情况

部分磁盘文件会出现无法删除的情况(特别是pve中template类型虚拟机的关联磁盘文件),会提示

rm: cannot remove 'base-103-disk-0.qcow2': Operation not permitted

这时候需要检查一下磁盘文件属性

root@pve-211:/vm-files/images/103# lsattr
----i---------e------- ./base-103-disk-0.qcow2

一般是由于该文件属性被设置了i属性(immutable, 在文件上启用这个属性时,不能更改、重命名或者删除这个文件)导致的,只需要移除 i 属性然后再删除即可

chattr -i ./base-103-disk-0.qcow2

对于此类重命名后的瘦身磁盘文件,也可以顺手把i属性加回去以保护文件

chattr +i ./base-103-disk-0.qcow2

一键命令(对模板类型虚拟机无效)

进入到相应的磁盘文件目下下后

ls -1|awk '{print "qemu-img convert -O qcow2 "$1" "$1"_prune && rm -vf "$1" && mv -v "$1"_prune "$1" && chmod 640 "$1}'|sh

效果如下

root@pve-211:/vm-files/images/110# ls -lh
total 3.6G
-rw-r----- 1 root root 33G Apr  3 20:16 vm-110-disk-0.qcow2

root@pve-211:/vm-files/images/110# ls -1|awk '{print "qemu-img convert -O qcow2 "$1" "$1"_prune && rm -vf "$1" && mv -v "$1"_prune "$1" && chmod 640 "$1}'|sh
removed 'vm-110-disk-0.qcow2'
renamed 'vm-110-disk-0.qcow2_prune' -> 'vm-110-disk-0.qcow2'

root@pve-211:/vm-files/images/110# ls -lh
total 3.6G
-rw-r----- 1 root root 3.6G Apr  3 21:58 vm-110-disk-0.qcow2