背景及现象:
某地超融合项目,客户使用centos6.9时,升级了原生2.6.32的内核版本至4.4.113版本内核。
然后客户在此虚机中安装并开启了docker服务。导致在线快照时无法冻结文件系统。
[root@host-172-16-170-171 ~]# cat /proc/self/mounts
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=2011532k,nr_inodes=502883,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw,seclabel,relatime 0 0
/dev/mapper/VolGroup-lv_root / ext4 rw,seclabel,relatime,data=ordered 0 0
none /selinux selinuxfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=2011532k,nr_inodes=502883,mode=755 0 0
/dev/vda1 /boot ext4 rw,seclabel,relatime,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
cgroup /cgroup/cpuset cgroup rw,relatime,cpuset 0 0
cgroup /cgroup/cpu cgroup rw,relatime,cpu 0 0
cgroup /cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0
cgroup /cgroup/memory cgroup rw,relatime,memory 0 0
cgroup /cgroup/devices cgroup rw,relatime,devices 0 0
cgroup /cgroup/freezer cgroup rw,relatime,freezer 0 0
cgroup /cgroup/net_cls cgroup rw,relatime,net_cls 0 0
cgroup /cgroup/blkio cgroup rw,relatime,blkio 0 0
/dev/mapper/VolGroup-lv_root /var/lib/docker/devicemapper ext4 rw,seclabel,relatime,data=ordered 0 0
先冻结 /var/lib/docker/devicemapper 这个mountpoint后,再冻结 / 根文件系统,无法冻结,
自带的版本是2.6.32,fsfreeze的实现如下:
4.4版本的fsfreeze的实现如下:
从上述可以看出,2.6内核在某个目录重复挂载的情况下,并没有特殊处理,而4.4版本此时返回EBUSY错误。
论证如下:
1)原生centos对某个设备 mount多次,fsfreeze后成功;
[root@host-172-16-170-172 ~]# mount /dev/vdb1 /test1
[root@host-172-16-170-172 ~]# mount /dev/vdb1 /test2
[root@host-172-16-170-172 ~]# fsfreeze /test1/
fsfreeze: no action specified
[root@host-172-16-170-172 ~]# fsfreeze -f /test1/
[root@host-172-16-170-172 ~]# fsfreeze -f /test2/
[root@host-172-16-170-172 ~]# fsfreeze -u /test2/
[root@host-172-16-170-172 ~]# fsfreeze -u /test1/
/dev/vdb1 on /test1 type ext3 (rw)
/dev/vdb1 on /test2 type ext3 (rw)
冻结成功
2)升级完内核后对某个设备mount多次,fsfreeze后失败
/dev/vdc1 on /home type ext3 (rw)
/dev/vdc1 on /test-home type ext3 (rw)
[root@host-172-16-170-171 /]# fsfreeze -f /home/
[root@host-172-16-170-171 /]# fsfreeze -f /test-home/
fsfreeze: /test-home/: freeze failed: Device or resource busy
[root@host-172-16-170-171 /]# fsfreeze -u /test-home/
[root@host-172-16-170-171 /]#
冻结失败
解决方法:
https://git.qemu.org/?p=qemu.git;a=commitdiff;h=ce2eb6c4a044d809c
Note:
由于centos6.9或者6.5自带的glibc版本为2.12,而新版本的qga要求编译版本为2.14,直接升级6.9的glibc破坏了原生系统。
所以使用qga-2.0版本合入上述patch,编译后的qga路径在 33.1:/data/tools/qemu-ga.v2.0-with-ebusy-patch
后续使用时候需要将该文件拷贝至虚机的/usr/bin/目录。
该版本qga使用时,需要在虚机内部 手动创建 /usr/local/var/run/ 目录
另:
centos7.1原生内核3.10.0-229.el7.x86_64使用的qemu-guest-agent-2.3.0-4.el7.x86_64存在同样的问题。
当一个目录被挂载多次时,仍然会出现fsfreeze失败的现象。
附centos6.9 minimal编译qemu方法: