微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

openshift上使用devicemapper

 

环境:openshift v3.6.173.0.5

openshift上devicemapper与官方文档中的描述略有不同,在官方文档的描述中,容器使用的lvm文件系统挂载在/var/lib/devicemapper下,因此可以在/var/lib/devicemapper/Metadata中找到容器对应的devicemapper的配置信息,在/var/lib/devicemapper/mnt中可以看到容器的文件系统,描述如下:

The /var/lib/docker/devicemapper/Metadata/ directory contains Metadata about the Devicemapper configuration itself and about each image and container layer that exist. The devicemapper storage driver uses snapshots,and this Metadata include @R_725_4045@ion about those snapshots. These files are in JSON format.

The /var/lib/devicemapper/mnt/ directory contains a mount point for each image and container layer that exists. Image layer mount points are empty,but a container’s mount point shows the container’s filesystem as it appears from within the container.

在openshfit中使用docker inspect查看一个容器的devicemapper信息如下,使用的块设备为 docker-253:0-101504694-13339a03e1b2fc605c83e915a439d8f87131b9e01d599750298a5eada849ae5f

"GraphDriver": {
    Name": devicemapper,Data: {
        deviceid29DeviceNamedocker-253:0-101504694-13339a03e1b2fc605c83e915a439d8f87131b9e01d599750298a5eada849ae5fDeviceSize10737418240
    }
},

但在/var/lib/docker/devicemapper/mnt中该容器对应的文件挂载为空,系统mount命令也查找不到该容器对应的块设备挂载信息

# pwd
/var/lib/docker/devicemapper
# du -d 2|grep 13339a03e1b2fc605c83e915a439d8f87131b9e01d599750298a5eada849ae5f
0       ./mnt/13339a03e1b2fc605c83e915a439d8f87131b9e01d599750298a5eada849ae5f-init
0       ./mnt/13339a03e1b2fc605c83e915a439d8f87131b9e01d599750298a5eada849ae5f

查看该容器对应的进程,pid为19422

# docker inspect 17ba06eb4578|grep Pid
  Pid19422PidMode""PidsLimit0,

在/proc/19422/ns中可以看到其命名空间相关的信息,对比pid 为1的mnt ns(mnt -> mnt:[4026531840]),可以看到该容器与根进程不属于同一个mount 命名空间,因此在根进程所在的mount命名空间中无法查看到该容器的挂载信息

# ll
total 0
lrwxrwxrwx. 1 1000010000 root 0 Apr 12 09:43 ipc -> ipc:[4026532228]
lrwxrwxrwx. 11 19:47 mnt -> mnt:[402653252143 net -> net:[402653223147 pid -> pid:[402653252343 user -> user:[402653183747 uts -> uts:[4026532522]

使用nsenter -t 19422 -m mnt -u命令进入到进程所在的mount和uts命名空间,使用mount命令可以看到容器的块设备挂载到了该mount命名空间的根目录

/dev/mapper/docker-253:0-101504694-13339a03e1b2fc605c83e915a439d8f87131b9e01d599750298a5eada849ae5f on / type xfs (rw,relatime,context=system_u:object_r:container_file_t:s0:c2,c3",nouuid,attr2,inode64,sunit=1024,swidth=当然也可以在/proc/19422/mounts和/proc/19422/mountinfo中看到与该进程相关的mount信息,其中也包括容器的块设备挂载信息

使用lsns可以看系统中的命名空间与进程的对应关系,下面列出了pid为19422的相关命名空间,NPROCS表示该命名空间下面的进程数目,PID表示该命名空间下的最小PID值。可以看出19422与根进程属于同一个user命名空间。其中mnt命名空间中有2个进程,一个是19422,另一个是19422的父进程(此处为java)。因此在容器异常退出后,可以通过进入未退出进程的命名空间定位问题。

[root@lab-node1 proc]# lsns -p 
        NS TYPE  NPROCS   PID USER       COMMAND
4026531837 user     338     1 root       /usr/lib/systemd/systemd --switched-root --system --deserialize 21
4026532228 ipc        3 18413 1001       /usr/bin/pod
4026532231 net        4026532521 mnt        2 19422 1000010000 /bin/sh /opt/eap/bin/standalone.sh -Djavax.net.ssl.keyStore=/opt/hawkular/auth/hawkular-metrics.keystore -Djavax.net.ssl.tru
4026532522 uts        4026532523 pid        1000010000 /bin/sh /opt/eap/bin/standalone.sh -Djavax.net.ssl.keyStore=/opt/hawkular/auth/hawkular-metrics.keystore -Djavax.net.ssl.tru

 

参考:

https://xuxinkun.github.io/2019/04/02/deviemapper-docker/

https://docs.docker.com/engine/reference/commandline/dockerd/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐