问题起源
我在某个项目上看到docker daemon启动之后默认使用了vfs的存储方式,我们都知道docker官方推荐的是overlay2的方式,vfs存储仅适用于测试环境,性能很差,官网是这么说的:
The
vfs
storage driver is intended for testing purposes, and for situations where no copy-on-write filesystem can be used. Performance of this storage driver is poor, and is not generally recommended for production use.(vfs存储驱动是用于测试目的,以及不能使用写时复制文件系统的情况。这个存储驱动的性能很差,一般不建议在生产中使用。)
overlay2
is the preferred storage driver for all currently supported Linux distributions, and requires no extra configuration.(overlay2是目前所有支持的Linux发行版的首选存储驱动,不需要额外配置。)
排查过程
启用overlay2
其实官方默认启用的就是overlay2,但是既然没有使用,绝对是底层存储不满足嘛,我们可以强制指定存储引擎以后看看报错再依次排查掉问题。
那么咋个指定呢?我们可以在/etc/docker/daemon.json中强制指定存储引擎为overlay2。
|
|
排查底层存储问题
启用之后,果然启动过程中提示报错了:
failed to start daemon: error initializing graphdriver: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorrect behavior. Reformat the filesystem with ftype=1 to enable d_type support. Backing filesystems without d_type support are not supported.
从报错上看,overlay2需要文件系统支持d_type,但出现问题的机器上配置的Data Dir Root目录采用的是xfs文件系统,默认并没有开启d_type,需要开启d_type的支持。
什么是d_type
d_type 是 Linux 内核的一个术语,表示 “目录条目类型”,而目录条目其实是文件系统上目录信息的一个数据结构。d_type,就是这个数据结构的一个字段,这个字段用来表示文件的类型,是文件、管道,目录还是套接字等。
d_type 从 Linux 2.6 内核开始就已经支持了,只不过虽然 Linux 内核虽然支持,但有些文件系统实现了 d_type,而有些没有实现,有些是选择性的实现,也就是需要用户自己用额外的参数来决定是否开启d_type的支持。
检查xfs文件系统是否支持d_type:
|
|
|
|
注意以上输出中的ftype字段,为0则表示不支持。
解决d_type问题
直接重新格式化指定d_type启用即可:
|
|
重启docker daemon发现问题解决