Proxmox VE等虚拟化平台下qcow2类型磁盘文件瘦身命令随记
来自三线的随记
先确保相关的磁盘关联的虚拟机已经关机
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平台中对虚拟机进行节点间的迁移(虚拟机磁盘文件没有放在分布式存储上),有可能带来较长的耗时
(vm migration任务可能一直卡在Formatting '/vm-files/images/xxx/xxx.qcow2'状态)
使用以下命令可以进行文件瘦身
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