一、需求说明
centos系统下安装docker最新版的时候,安装成功,启动的时候报错。报错信息“failed to start daemon: error initializing graphdriver: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorrect behavior.”。经过一系列排查发现,原来是centos早起版本安装系统的时候如果选择的xfs文件系统格式,默认是ftype=0,如果安装新版docker要求ftype=1。为了解决docker启动问题,我们需要一块ext4或者xfs的ftype=1的磁盘,此博文以此为例进行介绍如何解决docker启动遇到d_type参数错误问题。博文实验环境如下:
- 操作系统:centos7.2
- docker版本:26.0.0
二、解决方案
1、查看磁盘xfs信息
为了确定原因,我们首先检查xfs磁盘的ftype值,docker默认根位置是在/var/lib/docker,我们检查的根分区,可以看到ftype当前是0,不满足要求。
[root@s172 ~]# xfs_info /
2、确认系统是否支持overlay
我们需要先确定系统是否添加overlay模块到内核,如下命令如果没有任何输出说明不支持,我们需要执行步骤3。
[root@s172 ~]# lsmod |grep over
overlay 42451 0
3、添加系统内核支持overlay
如果步骤2没有执行后没有任何输出则需要使用modprobe添加overlay模块到内核中,然后重启系统。
[root@s172 ~]# modprobe overlay
4、添加一块新磁盘
博主是在虚拟机环境下进行的仿真实验,添加一块磁盘比较方便。因为修改ftype值需要格式化磁盘,如果是物理机环境磁盘空间全部分配了,可以考虑添加一块新硬盘或者从现有的磁盘中进行缩减。很遗憾的是xfs系统只支持扩容,不支持在线缩减。如果需要从xfs系统中缩减出磁盘空间可以参考博文Linux之XFS文件系统LVM环境移除home分区故障磁盘。此博文介绍了使用xfsdump的方式缩减xfs磁盘大小。
[root@s172 ~]# fdisk -l
…
5、磁盘分区
使用新磁盘创建磁盘分区。
[root@s172 ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) print free
Error: /dev/sdb: unrecognised disk label
Model: QEMU QEMU HARDDISK (scsi)
Disk /dev/sdb: 32.2GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
(parted) mklabel msdos
(parted) mkpart
Partition type? primary/extended? primary
File system type? [ext2]? xfs
Start? 1
End? 20G
(parted) print
Model: QEMU QEMU HARDDISK (scsi)
Disk /dev/sdb: 32.2GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 20.0GB 20.0GB primary
(parted) quit
6、磁盘格式化时指定ftype=1
将磁盘分区格式化,格式化的时候指定ftype=1。
[root@s172 ~]# mkfs.xfs -n ftype=1 /dev/sdb1
7、创建挂载目录
创建一个挂载目录。
[root@s172 ~]# mkdir -p /docker
8、挂载/docker目录
将新磁盘挂载到新目录。
[root@s172 ~]# mount /dev/sdb1 /docker
9、查看磁盘xfs参数信息
挂载后查看/docker分区的xfs参数信息,确定ftpye参数值为1。
[root@s172 ~]# xfs_info /docker/
10、修改docker的daemon.json配置文件
docker默认根目录是/var/lib/docker,如果是根分区参数不满足要求基本上不可能进行参数修改。所以我们需要重新制定docker的根目录,创建/etc/docker/daemon.json文件并写入如下内容。
[root@s172 ~]# cat /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"data-root": "/docker"
}
11、重新启动docker
完成如上步骤之后再次启动docker发现不再报错,检查docker运行状态为active。至此问题解决。
[root@s172 ~]# systemctl start docker
[root@s172 ~]# systemctl status docker
12、查看docker信息
[root@s172 ~]# docker info
Client: Docker Engine - Community
Version: 26.0.0
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.13.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.25.0
Path: /usr/libexec/docker/cli-plugins/docker-compose
…
Name: s172
ID: 210461dd-21f6-4cfa-bd3b-01c40d778237
Docker Root Dir: /docker
…
三、写在最后
实际上centos7环境下也可以直接yum安装docker,只是安装的版本比较老旧,只能安装到docker1.13版本。博主是需要通过docker安装milvus单机,安装milvus要求docker版本1.19以上。所以是参照博文Linux之docker安装在线安装docker。博主查找了一些资料,作为笔记记录如下:
- Docker v17.06 之前版本 CentOS 和 RHEL 生产环境必须使用 devicemapper 驱动的 direct-lvm 模式
- Docker v17.06 之前版本 CentOS 和 RHEL 生产环境必须使用 devicemapper 驱动的 direct-lvm 模式
- overlay、devicemapper 存储驱动已在 Docker Engine-Enterprise 18.09中弃用,此后docker版本参数配置文件都是overlay2,如果配置overlay则会报错;
- overlay、overlay2 底层为 overlayfs 文件系统需要用到 d_type 特性;
- CentOS7 发行版默认 Kernel 版本为 3.10,可以使用 overlay (Kernel 版本 3.10 支持 overlay),xfs 格式文件系统必须指定 ftype=1 来开启 d_type 特性;
- 担心xfs系统ftype参数影响的可以考虑ext4。