如何为Docker清除Thinpool设备

Tom*_*Tom 5 redhat device-mapper docker

正如在生产系统上所建议的那样,我在具有devicemapper和Thinpool设备的Redhat系统上运行docker。现在,当我想重新安装docker时,我需要两个步骤:

1)删除docker目录(在我的情况下为/ area51 / docker)
2)清除Thinpool设备

该搬运工文档指出,使用与dm.metadev和dm.datadev选项devicemapper时,清洁devicemapper的最简单的方法是:

如果设置新的元数据池,则必须有效。这可以通过将前4k设为零以指示空的元数据来实现,如下所示:

$ dd if=/dev/zero of=$metadata_dev bs=4096 count=1
Run Code Online (Sandbox Code Playgroud)

不幸的是,根据文档,dm.metadatadev不推荐使用,而是改为使用dm.thinpooldev 。

我的thinpool是按照此docker 指令创建的, 因此,我的设置现在看起来像这样:

cat /etc/docker/daemon.json  
{
        "storage-driver": "devicemapper", 
        "storage-opts": [ 
        "dm.thinpooldev=/dev/mapper/thinpool_VG_38401-thinpool",
        "dm.basesize=18G"
        ]  
}
Run Code Online (Sandbox Code Playgroud)

在devicemapper目录下,我看到以下Thinpool设备

ls -l /dev/mapper/thinpool_VG_38401-thinpool*
lrwxrwxrwx 1 root root 7 Dec  6 08:31 /dev/mapper/thinpool_VG_38401-thinpool -> ../dm-8
lrwxrwxrwx 1 root root 7 Dec  6 08:31 /dev/mapper/thinpool_VG_38401-thinpool_tdata -> ../dm-7
lrwxrwxrwx 1 root root 7 Dec  6 08:31 /dev/mapper/thinpool_VG_38401-thinpool_tmeta -> ../dm-6
Run Code Online (Sandbox Code Playgroud)

因此,在成功运行docker之后,我尝试如上所述重新安装并通过在tmeta设备中写入4K零来清除Thinpool并重新启动docker:

dd if=/dev/zero of=/dev/mapper/thinpool_VG_38401-thinpool_tmeta bs=4096 count=1  
systemctl start docker
Run Code Online (Sandbox Code Playgroud)

并与

docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2017-12-06 10:28:46 UTC; 10s ago
     Docs: https://docs.docker.com
  Process: 1566 ExecStart=/usr/bin/dockerd -G uwsgi --data-root=/area51/docker -H unix:///var/run/docker.sock (code=exited, status=1/FAILURE)
 Main PID: 1566 (code=exited, status=1/FAILURE)
   Memory: 236.0K
   CGroup: /system.slice/docker.service

Dec 06 10:28:45 yoda3 systemd[1]: Starting Docker Application Container Engine...
Dec 06 10:28:45 yoda3 dockerd[1566]: time="2017-12-06T10:28:45.816049000Z" level=info msg="libcontainerd: new containerd process, pid: 1577"
Dec 06 10:28:46 yoda3 dockerd[1566]: time="2017-12-06T10:28:46.816966000Z" level=warning msg="failed to rename /area51/docker/tmp for background deletion: renam...chronously"
Dec 06 10:28:46 yoda3 dockerd[1566]: Error starting daemon: error initializing graphdriver: devmapper: Unable to take ownership of thin-pool (thinpool_VG_38401-...data blocks
Dec 06 10:28:46 yoda3 systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Dec 06 10:28:46 yoda3 systemd[1]: Failed to start Docker Application Container Engine.
Dec 06 10:28:46 yoda3 systemd[1]: Unit docker.service entered failed state.
Dec 06 10:28:46 yoda3 systemd[1]: docker.service failed.
Run Code Online (Sandbox Code Playgroud)

我以为我可以通过重新启动来解决“无法获得瘦池所有权”的问题。但是在重新启动并尝试再次启动docker之后,出现以下错误:

systemctl status docker
? docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2017-12-06 10:30:37 UTC; 2min 29s ago
     Docs: https://docs.docker.com
  Process: 3180 ExecStart=/usr/bin/dockerd -G uwsgi --data-root=/area51/docker -H unix:///var/run/docker.sock (code=exited, status=1/FAILURE)
 Main PID: 3180 (code=exited, status=1/FAILURE)
   Memory: 37.9M
   CGroup: /system.slice/docker.service

Dec 06 10:30:36 yoda3 systemd[1]: Starting Docker Application Container Engine...
Dec 06 10:30:36 yoda3 dockerd[3180]: time="2017-12-06T10:30:36.893777000Z" level=warning msg="libcontainerd: makeUpgradeProof could not open /var/run/docker/lib...containerd"
Dec 06 10:30:36 yoda3 dockerd[3180]: time="2017-12-06T10:30:36.901958000Z" level=info msg="libcontainerd: new containerd process, pid: 3224"
Dec 06 10:30:37 yoda3 dockerd[3180]: Error starting daemon: error initializing graphdriver: devicemapper: Non existing device thinpool_VG_38401-thinpool 
Dec 06 10:30:37 yoda3 systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Dec 06 10:30:37 yoda3 systemd[1]: Failed to start Docker Application Container Engine.
Dec 06 10:30:37 yoda3 systemd[1]: Unit docker.service entered failed state.
Dec 06 10:30:37 yoda3 systemd[1]: docker.service failed.
Run Code Online (Sandbox Code Playgroud)

因此,显然将零写入thinpool_meta设备是不正确的事情,这似乎破坏了我的thinpool设备。

有人可以告诉我清除瘦池设备的正确步骤吗?优选地,该解决方案不需要重启。