一、简介:
virt-sparsify 命令行工具可用于生成虚拟机磁盘(或任何磁盘镜像)稀疏。这也被称为精简配置。磁盘镜像上的可用磁盘空间转换为主机上可用空间。
virt-sparsify 命令可以处理大多数文件系统,如 ext2、ext3、ext4、btrfs、NTFS。它还可用于 LVM 物理卷。virt-sparsify 可以针对任何磁盘镜像操作,而不只是虚拟机磁盘镜像。
下面的内容主要是对kvm虚拟机的虚拟存储块进行压缩优化。
二、背景:
公司机房的服务器上所运行的虚拟机当时设置的磁盘大小为200G,运行了一年后,虚拟机实际还未使用到100G,但是虚拟机存储块已经达到了恐怖214G,这个对实际的物理机受到很大的影响。当时在网上查了一些资料和解决方案,最后我把我觉得最好用最简单的方案记录一下。
三、操作步骤:
#安装工具 virt-sparsify
yum -y install libguestfs-tools-c.x86_64
#后台运行避免时间太长,终端断开,异常停止
nohup virt-sparsify --compress /home/centos-141.qcow2 /home/centos-141-new.qcow2 --tmp /home/1.141/ &
该命令解释一下:使用virt-sparsify工具将原镜像/home/centos-141.qcow2 稀疏,最后得到/home/centos-141-new.qcow2文件。
其中他会在/home/1.141目录下生成一个临时文件,其目的是为了保护原镜像磁盘文件不会损毁。
--tmp选项可自行指定,也可不用,具体根据服务器的情况来选择。
214G大概压缩时间为3个小时左右,可以通过nohup.out文件查看稀疏的步骤:
[root@105 data]# tailf nohup.out
[ 0.7] Examine source disk
[ 44.5] Fill free space in /dev/centos/home with zero
[ 57.4] Fill free space in /dev/centos/root with zero
[4713.8] Clearing Linux swap on /dev/centos/swap
[4722.2] Fill free space in /dev/sda1 with zero
[4736.0] Fill free space in volgroup centos with zero
[4741.8] Copy to destination and make sparse
[11747.7] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.
通过该日志可以看到在11747秒后稀疏操作完成,并且还会建议:删除旧磁盘前,请仔细检查目标磁盘是否能够正常启动和工作。
#将原来的存储块改名
mv centos-141.qcow2 centos-141-old.qcow2
#将新压缩的存储块改为虚拟机中的默认名称。
mv centos-141-new.qcow2 centos-141.qcow2
[root@106 home]# du -sh centos-141*
214G centos-141-old.qcow2
4.4G centos-141.qcow2
通过对比可以看到,稀疏后的虚拟存储块为4.4G.
重启虚拟机,无问题后删掉centos-141-old.qcow2。
四、额外拓展:
1.提示磁盘空间不足:
当服务器上的磁盘空间不够使用virt-sparsify工具时,可以临时挂在移动硬盘(ntfs格式硬盘使用mount挂载报错的解决方案):
1.1 安装 EPEL 存储库:EPEL 存储库(Extra Packages for Enterprise Linux)提供了额外的软件包,包括 ntfs-3g。
yum install epel-release
1.2 安装 ntfs-3g 软件包:
yum install ntfs-3g
1.3 使用mount -t ntfs-3g 将移动硬盘等挂载到目标目录:
mount -t ntfs-3g /dev/sdb1 /lws/
2提示/var/tmp 空间不足:
virt-sparsify --compress命令使用时,会在/var/tmp 目录下创建一个临时目录以及一些文件,大概几百M大小,如果创建服务器时/var目录分配的资源很小时,可以使用以下命令临时设置一下变量:
export TMPDIR=/lws/tmp
export TMP=/lws/tmp
PS: 在后边使用时,发现有时候会报错/lws/tmp/.g 什么目录权限不对,到时候可以设置给/lws/tmp目录设置成777权限试试。