centos6.9升级内核启动docker时无法冻结

背景及现象:

某地超融合项目,客户使用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方法:

qemu git: https://github.com/qemu/qemu
../configure --enable-guest-agent --disable-werror --target-list=x86_64-linux-user
yum install -y zlib-devel
yum install -y glib2-devel

你可能感兴趣的:(超融合openstack)