6

我正在使用 devicemapper 和 Thinpool 设备的 Redhat 系统上运行 docker,就像推荐用于生产系统一样。现在,当我想重新安装 docker 时,我需要两个步骤:

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

docker文档指出,当使用带有 dm.metadev 和 dm.datadev 选项的 devicemapper 时,清理 devicemapper 的最简单方法是:

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

$ dd if=/dev/zero of=$metadata_dev bs=4096 count=1

不幸的是,根据文档,dm.metadatadev不推荐使用,它说要dm.thinpooldev 改用。

我的瘦池是按照这个 docker 指令创建的 所以,我的设置现在看起来像这样:

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

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

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

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

dd if=/dev/zero of=/dev/mapper/thinpool_VG_38401-thinpool_tmeta bs=4096 count=1  
systemctl start 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: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.

我以为我可以通过重新启动来解决“无法获得精简池的所有权”的问题。但是在重新启动并尝试再次启动 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.

因此,显然将零写入 Thinpool_meta 设备是不正确的做法,它似乎破坏了我的 Thinpool 设备。

这里有人可以告诉我清除精简池设备的正确步骤吗?该解决方案最好不需要重新启动。

4

0 回答 0