centos7 下 xfs 文件系统 设置 ftype=1 启动 d_type 让 docker 使用 overlay/overlay2 文件系统
1. 什么是 overlayfs
OverlayFS 是一种现代的联合文件系统,与 AUFS 类似,但是速度更快且实现更简单。Docker 为 OverlayFS 提供了两个存储驱动程序:原始的 overlay,更新的和更稳定的 overlay2。其他的文件系统还有:aufs、device mapper 等
如果使用 OverlayFS,请使用 overlay2 驱动程序而不是 overlay 驱动程序,因为它在 inode 利用率方面更为有效。
要使用新的驱动程序,您需要 :
Linux 内核 的版本 4.0 或更高版本,或者使用 3.10.0-514 及更高版本的 RHEL 或 CentOS。如果使用较旧的内核,则需要使用 overlay 驱动程序,但不建议这样做。
overlay2 驱动程序受 Docker Engine-Community 和 Docker EE 17.06.02-ee5 及更高版本支持
在 overlay 和 overlay2 驱动程序支持 xfs 支持的文件系统,但只 d_type=true 启用下才有用,centos7.0 是没有启用的
使用 xfs_info 验证 ftype 设置为 1。要 xfs 正确格式化 文件系统,请使用标志 mkfs.xfs -n ftype=1 /path/to/your/device
2. xfs文件系统的 d_type是什么
d_type 是 Linux 内核的一个术语,表示 “目录条目类型”,而目录条目,其实是文件系统上目录信息的一个数据结构。d_type,就是这个数据结构的一个字段,这个字段用来表示文件的类型,是文件,还是管道,还是目录还是套接字等。
d_type 从 Linux 2.6 内核开始就已经支持了,只不过虽然 Linux 内核虽然支持,但有些文件系统实现了 d_type,而有些,没有实现,有些是选择性的实现,也就是需要用户自己用额外的参数来决定是否开启 d_type 的支持。
查看系统内核是否支持 overlay
查看内核是否支持:
[root@k8s-master ~]# lsmod |grep over overlay 49152 0 # 如果没有输出,表示不支持,可以通过下面的命令开启overlay [root@k8s-master ~]# modprobe overlay [root@k8s-master ~]# echo "overlay" > /etc/modules-load.d/overlay.conf
检测 xfs 文件系统,是否支持 d_type
[root@k8s-master ~]# xfs_info / meta-data=/dev/vda2 isize=512 agcount=4, agsize=6488000 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=25952000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=12671, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@k8s-master ~]#
ftype=1 :表示开启了 d_type
ftype=0 : 表示没有开启 d_type 不能使用 overlayfs
3. 为什么 docker 在 overlay2( xfs 文件系统)需要 d_type
不论是 overlay,还是 overlay2,它们的底层文件系统都是 overlayfs 文件系统。而 overlayfs 文件系统,就会用到 d_type 这个东西用来文件的操作是被正确的处理了。换句话说,docker只要使用 overlay 或者 overlay2,就等于在用 overlayfs,也就一定会用到 d_type。
如果在不支持 d_typ 的 overlay/overlay 驱动下使用docker,也就意味着 docker 在操作文件的时候,可能会遇到一些错误,比如 无法删除某些目录或文件,设置文件或目录的权限或用户失败等等。这些都是不可预料的错误。举个具体的场景,就是,docker构建的时候,可能在构建过程中,删除文件等操作失败,导致构建停止。
docker info 此命令,用来检测你 docker 服务,是否在使用 overlay 的时候正确的使用 d_type。如果用了 overlay/overlay2,但 d_type 没有开,就报警告。
docker 检测是否正确的使用 d_type
[root@k8s-master ~]# docker info Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true
4. 设置使用
现在已经默认优先使用 overlays2 ,强制指定 docker 的 overlay2 驱动,需要在启动 docker 的时候,指定 --storage-driver 参数,或者,在配置文件 /etc/docker/daemon.json 中 ,指定驱动配置
{ "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] }
5. 用 ftype = 1 重新创建XFS文件系统
如果 overlayfs 存储驱动不支持 d_type 的话,容器在操作文件系统时可能会出现一些奇怪的错误:比如在 bootstrap 的时候出现 Chown error,或者 rebuild 时发生错误等等。
如何解决?
坏消息是只能通过重做文件系统来解决,是不能在已经存在的操作系统上进行修改的哦!!!不能在 根 / 上面操作。不能更改的时候只能使用
下面是基本上可行的步骤:
(1)备份你的数据
(2)重新创建你的文件系统,当然可以是使用XFS,也可以使用Ext4
(3)恢复备份的数据回来
参考方法一:重建文件系统,如果是非 根/ 可以尝试
#卸载驱动(非根/) device的路径可以在xfs_info中找到 umount /dev/mapper/centos-home # 如果提示device is busy 强制卸载 umount -l /dev/mapper/centos-home # 重新格式化同时要重启 mkfs.xfs -n ftype=1 -f /dev/mapper/centos-home #再次挂载 mount /dev/mapper/centos-home /home #验证 xfs_info /home 查看修改内容
参考方法二:不建议使用
Boot into CentOS-7-x86_64-LiveGNOME-1804.iso.
Open a terminal and sudo -s.
Scan for LVM volumes: vgscan
Change into the appropriate volume group (centos in my case): vgchange -ay centos
Scan for the logical volumes in that group: lvscan
Create a mount point for the root FS: mkdir /mnt/root
Mount the logical volume corresponding to the root FS: mount /dev/centos/root /mnt/root
Dump to remote host: xfsdump -J - /mnt/root | ssh <host> 'cat >/data/rootfs.dump'
Unmount the root FS: umount /mnt/root
Recreate the root FS: mkfs.xfs -f -n ftype=1 /dev/centos/root
Mount the recreated root FS: mount /dev/centos/root /mnt/root
Restore from remote host: ssh <host> 'cat /data/rootfs.dump' | xfsrestore -J - /mnt/root
Reboot. Everything should be as it was before, except xfs_info / should now show ftype=1.
Note: My xfsdump call resulted in a number of warnings of the form
xfsdump: WARNING: failed to get bulkstat information for inode 10485897
共 0 条评论