• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

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 查看修改内容

参考方法二:不建议使用

  1. Boot into CentOS-7-x86_64-LiveGNOME-1804.iso.

  2. Open a terminal and sudo -s.

  3. Scan for LVM volumes: vgscan

  4. Change into the appropriate volume group (centos in my case): vgchange -ay centos

  5. Scan for the logical volumes in that group: lvscan

  6. Create a mount point for the root FS: mkdir /mnt/root

  7. Mount the logical volume corresponding to the root FS: mount /dev/centos/root /mnt/root

  8. Dump to remote host: xfsdump -J - /mnt/root | ssh <host> 'cat >/data/rootfs.dump'

  9. Unmount the root FS: umount /mnt/root

  10. Recreate the root FS: mkfs.xfs -f -n ftype=1 /dev/centos/root

  11. Mount the recreated root FS: mount /dev/centos/root /mnt/root

  12. Restore from remote host: ssh <host> 'cat /data/rootfs.dump' | xfsrestore -J - /mnt/root

  13. 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


参考:

官网: Use the OverlayFS storage driver

官网:Docker storage drivers

0
0
下一篇:docker 的 storage-driver 是 overlay2 时,限制单个容器可占用的磁盘空间 overlay2.size 设置

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。