Docker-使用 overlayfs 作为后端存储遇到的问题_overlayfs: failed to resolve '/var/lib/docker/over-程序员宅基地

技术标签: Docker  

问题描述

在一个测试环境中,发现容器中无法删除镜像中只读层的文件,现象:
问题描述

问题原因

参考 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.2_Release_Notes/technology-preview-file_systems.html

相关知识点

1、XFS 文件系统作为 overlayfs 底层时,该文件系统创建时必须使用 -n ftype=1 标志,使用 xfs_info 命令查看 xfs 文件系统的标志:

$ xfs_info /var/lib/docker
meta-data=/dev/mapper/centos_k8s--master-root isize=256    agcount=4, agsize=4653056 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=18612224, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=9088, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
$ xfs_info /var/lib/docker | grep ftype
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

在一台正常的机器上:

$ xfs_info /var/lib/docker
meta-data=/dev/mapper/cl-root    isize=512    agcount=4, agsize=2956800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=11827200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=5775, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
$ xfs_info /var/lib/docker |grep ftype
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1

2、通过 man mkfs.xfs 命令,查看 -n ftype 的含义:是否允许将 inode 类型存储在目录结构中,以便 readdir,getdents 不需要查找 inode 就可知道 inode 类型,默认为0,不存在目录结构中。
在这里插入图片描述
3、在 docker-1.13+ 版本中,使用 docker info 命令可以看到对 xfs 的 ftype 特性是否支持的信息 https://github.com/moby/moby/pull/27433
在这里插入图片描述
如果supports d_type为false,会有如下告警信息
在这里插入图片描述

解决办法

使用独立的 LV 并使用 mkfs.xfs -n ftype=1 命令格式化新的分区,然后挂载到 /var/lib/docker
如果 /var/lib/docker 已经使用了单独的 LV,需要先删除原来的 LV,再重新创建一个:

$ systemctl stop docker && systemctl disable docker
$ rm -rf /var/lib/docker/*
$ umount /dev/mapper/centos_k8s--node1-var_lib_docker
$ lvremove /dev/mapper/centos_k8s--node1-var_lib_docker
$ lvcreate -L 180G -n docker-lv centos_k8s-node1
$ mkfs.xfs -n ftype=1 /dev/centos_k8s-node1/docker-lv
$ mount /dev/mapper/centos_k8s--node1-docker--lv /var/lib/docker
$ sed '/centos_k8s--node1-var_lib_docker/d' /etc/fstab
$ echo "/dev/mapper/centos_k8s--node1-docker--lv  /var/lib/docker  xfs     defaults        0 0" >> /etc/fstab
$ systemctl start docker && systemctl enable docker

如果 /var/lib/docker 没有使用单独的 LV,推荐使用新的 LV 挂载到 /var/lib/docker 目录:

$ systemctl stop docker && systemctl disable docker
$ rm -rf /var/lib/docker/*
# 为虚拟机添加一块新磁盘 /dev/sdb 大小 50GB
$ fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x50e1bb21.
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-104857599, default 2048):
Using default value 2048
Last sector, +sectors or +size{
    K,M,G} (2048-104857599, default 104857599):
Using default value 104857599
Partition 1 of type Linux and of size 50 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x50e1bb21
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048   104857599    52427776   8e  Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
# 强制内核写入新的分区表
$ partprobe
# 创建PV
$ pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
$ pvs
  PV         VG                Fmt  Attr PSize  PFree
  /dev/sda2  centos_k8s-master lvm2 a--  98.88g  4.00m
  /dev/sdb1                    lvm2 ---  50.00g 50.00g
# 创建 VG
$ vgcreate docker-vg /dev/sdb1
  Volume group "docker-vg" successfully created
$ vgs
  VG                #PV #LV #SN Attr   VSize  VFree
  centos_k8s-master   1   3   0 wz--n- 98.88g  4.00m
  docker-vg           1   0   0 wz--n- 50.00g 50.00g
# 创建 LV
$ lvcreate -L 45G -n docker-lv docker-vg
  Logical volume "docker-lv" created.
$ lvs
  LV        VG                Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home      centos_k8s-master -wi-ao---- 20.00g                                                   
  root      centos_k8s-master -wi-ao---- 71.00g                                                   
  swap      centos_k8s-master -wi-ao----  7.88g                                                   
  docker-lv docker-vg         -wi-a----- 45.00g
  
###### 使用 mkfs.xfs -n ftype=1 格式化新的 LV
$ mkfs.xfs -n ftype=1 /dev/docker-vg/docker-lv
meta-data=/dev/docker-vg/docker-lv isize=512    agcount=4, agsize=2949120 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=11796480, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=5760, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
$ [[ ! -d /var/lib/docker ]] && mkdir /var/lib/docker
# 将 /dev/docker-vg/docker-lv 挂载到 /var/lib/docker
$ mount /dev/docker-vg/docker-lv /var/lib/docker
# 查看 /var/lib/docker 的 ftype 参数值
$ xfs_info /var/lib/docker |grep ftype
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
# 设置开机自动挂载
$ echo "/dev/mapper/docker--vg-docker--lv   /var/lib/docker         xfs     defaults        0 0" >> /etc/fstab
$ systemctl start docker && systemctl enable docker

现在重新测试一下:

$ docker run --rm -it centos:7.3.1611
Unable to find image 'centos:7.3.1611' locally
7.3.1611: Pulling from library/centos
45a2e645736c: Pull complete
Digest: sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799
Status: Downloaded newer image for centos:7.3.1611
[root@325a7b4bc2d8 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@325a7b4bc2d8 /]# rm -f anaconda-post.log
[root@325a7b4bc2d8 /]# ll
total 0
lrwxrwxrwx.   1 root root   7 Dec 14 14:57 bin -> usr/bin
drwxr-xr-x.   5 root root 360 May 18 04:42 dev
drwxr-xr-x.   1 root root  66 May 18 04:42 etc
drwxr-xr-x.   2 root root   6 Nov  5  2016 home
lrwxrwxrwx.   1 root root   7 Dec 14 14:57 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Dec 14 14:57 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec 14 14:57 lost+found
drwxr-xr-x.   2 root root   6 Nov  5  2016 media
drwxr-xr-x.   2 root root   6 Nov  5  2016 mnt
drwxr-xr-x.   2 root root   6 Nov  5  2016 opt
dr-xr-xr-x. 243 root root   0 May 18 04:42 proc
dr-xr-x---.   2 root root 114 Dec 14 14:59 root
drwxr-xr-x.  10 root root 130 Dec 14 14:59 run
lrwxrwxrwx.   1 root root   8 Dec 14 14:57 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  5  2016 srv
dr-xr-xr-x.  13 root root   0 May 18 04:37 sys
drwxrwxrwt.   7 root root 132 Dec 14 14:59 tmp
drwxr-xr-x.  13 root root 155 Dec 14 14:57 usr
drwxr-xr-x.  18 root root 238 Dec 14 14:59 var
[root@325a7b4bc2d8 /]#

现在一些都正常了。

参考资料:

1、https://github.com/moby/moby/issues/27358

2、https://github.com/moby/moby/issues/31283

3、https://github.com/moby/moby/issues/31445

4、https://github.com/moby/moby/pull/27433

5、https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.2_Release_Notes/technology-preview-file_systems.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iov_aaron/article/details/97128010

智能推荐

GAN for NLP (论文笔记及解读_gan for nlp csdn-程序员宅基地

文章浏览阅读1.6k次。GAN 自从被提出以来,就广受大家的关注,尤其是在计算机视觉领域引起了很大的反响。“深度解读:GAN模型及其在2016年度的进展”[1]一文对过去一年GAN的进展做了详细介绍,十分推荐学习GAN的新手们读读。这篇文章主要介绍GAN在NLP里的应用(可以算是论文解读或者论文笔记),并未涉及GAN的基本知识 (没有GAN基础知识的小伙伴推荐先看[1],由于本人比较懒,就不在这里赘述GAN的基本知识了J_gan for nlp csdn

HELLO---------k8s-->flannel网络组件安装_helm 安装 flannel-程序员宅基地

文章浏览阅读298次。接上一篇博客两个node节点都要装dockervim docker.sh#!/bin/bashyum -y install yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum -y install docker-cesystemctl start docker.se_helm 安装 flannel

同平台,某项目twitter进入二维码扫描界面报错分析_illegal code [twitter]-程序员宅基地

文章浏览阅读872次。应用crash报错log08-28 11:44:41.534805 14795 14963 E AndroidRuntime: FATAL EXCEPTION: QR_CODE_READER_THREAD08-28 11:44:41.534805 14795 14963 E AndroidRuntime: Process: com.twitter.android, PID: 14795..._illegal code [twitter]

java使用GB28181协议访问海康硬盘录像机程序怎么写-程序员宅基地

文章浏览阅读1.5k次。GB28181是国内视频监控领域的标准协议,用于设备之间的视频流传输和控制命令传输。要使用Java访问海康威视硬盘录像机(DVR)的话,可以参考以下步骤:了解GB28181协议的规范,熟悉视频流和控制命令的格式和内容。可以在国家标准化管理委员会网站上查找协议相关文档。根据海康威视硬盘录像机的接口文档,了解硬盘录像机的IP地址、端口号、用户名和密码等信息。在Java中,可以使用第三方库来..._java gb28281

Google DayDream controller实现分析_daydream controller apk-程序员宅基地

文章浏览阅读1.6k次。DayDream的controller主要集中在图中箭头标示的两个地方。 他们实现的效果如下图: 图中的箭头标明了它们实现的模块。GvrControllerMain 里面很重要的一个模块,它包含两个脚本组件,GvrController和GvrArmModel。 其中GvrController部分代码如下 /// If true, the user is currently touching_daydream controller apk

TS error: property values does not exist on objectconstructor_ts。对象中不存在属性-程序员宅基地

文章浏览阅读2k次。翻译一下:Object对象上不存在values属性实际上,Object.values这个API属于ES2017即,此时要求,TS编译器需要包含ES2017以上的API,才能够编译通过。那么,默认情况下,TS会以Javascript(ECMAScript)哪个版本的API为基础呢?TypeScript includes a default set of type definitions for built-in JS APIs (like Math), as well as type definit_ts。对象中不存在属性

随便推点

APK加壳【2】内存加载dex实现详解_dex内存加载-程序员宅基地

文章浏览阅读1.6k次。来源本文要实验的方案同样来源于CSDN大牛Jack_Jia的一篇翻译博文:Android4.0内存Dex数据动态加载技术原文的地址是 http://2013.hackitoergosum.org/presentations/Day1-05.Nifty%20stuff%20that%20you%20can%20still%20do%20with%20Android%20by%_dex内存加载

ARM64的启动过程之(四):打开MMU_arrch开启iommu-程序员宅基地

文章浏览阅读2.1k次。原文地址:http://www.wowotech.net/linux_kenrel/turn-on-mmu.html一、前言经过漫长的前戏,我们终于迎来了打开MMU的时刻,本文主要描述打开MMU以及跳转到start_kernel之前的代码逻辑。这一节完成之后,我们就会离开痛苦的汇编,进入人民群众喜闻乐见的c代码了。二、打开MMU前后的概述对CPU以及其执行的程序而言,打_arrch开启iommu

百度开源AI自然语言处理 FAQ 问答系统(AnyQ)编译安装---Linux(无docker)-程序员宅基地

文章浏览阅读1.3k次。百度AI自然语言处理AnyQ开源FAQ问答系统Centos7编译运行PS:根据“百度开源 FAQ 问答系统(AnyQ)安装—Linux(无docker)” https://blog.csdn.net/qq_28385535/article/details/83213822在以下环境试验成功,特此记录:CentOS Linux release 7.2.1511 (Core)8GB # 如果c...

C++里面头文件和源文件都要怎么编写以及运行-程序员宅基地

文章浏览阅读4k次。** 作为一个资深菜鸟,最近在看那本c++primer时对前面的书店程序难免有点兴趣,便打开vs2017想用宇宙第一IDE装下b,结果是一大堆问题,搞得我不知所措。首先打开vs,创建新项目时,就之前我老是要创建空项目,后来发现原来好多老鸟都是创建win32 console application来创建项目,好吧我就跟着他们来,虽然我不知他们都有什么区别,但是我们还是先按着来。但是后来发现vs2...

外媒中国量子计算机,比美国快100亿倍,中国量子计算机赢得霸权!外媒致敬-程序员宅基地

文章浏览阅读1.3k次。据新华社12月4日报道,中国科学技术大学潘建伟、陆朝阳等组成的研究团队与国内合作,构建了76个光子的量子计算原型机“九章”,实现了具有实用前景的“高斯玻色取样”任务的快速求解。其运算速度比目前最快的超级计算机快一百万亿倍,比去年谷歌发布的53个超导比特量子计算原型机“悬铃木”快一百亿倍。这一成果使得我国成功达到了量子计算研究的第一个“量子霸权”。对此,创造“高斯玻色取样”任务的美国科学家斯科特·阿...

Java动态调用Groove代码(1)-GroovyClassLoader_groovyclassloader.parseclass-程序员宅基地

文章浏览阅读1.1w次。1 目的动态执行任务或者扩展功能,需要java动态执行groovy代码2 项目依赖<dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> ..._groovyclassloader.parseclass