首页 > 解决方案 > zfs:文件系统有依赖的克隆

问题描述

我正在运行 Ubuntu 20.04 并在我的系统驱动器上使用 zfs。

我正在尝试删除 docker 容器,但出现此错误:

glen $ docker rm c3250e315b06
Error response from daemon: container c3250e315b0631cc7fee17ab0c7f649a3995ea17e969705117e064a045b3775e: driver "zfs" failed to remove root filesystem: exit status 1: "/usr/sbin/zfs fs destroy -r rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d109cf1c84f20db9e6402fef9a4bd91fa8b94f1848a874539663bbdc40" => cannot destroy 'rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d109cf1c84f20db9e6402fef9a4bd91fa8b94f1848a874539663bbdc40': filesystem has dependent clones
use '-R' to destroy the following datasets:
rpool/ROOT/ubuntu_bl0u7i/var/lib/38ff67538bf4b2ccfef54cfeb55847cf6da6bee70a6bf2e5b063ab0e5820c0fd
rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d109cf1c84f20db9e6402fef9a4bd91fa8b94f1848a874539663bbdc40-init

我不知道从哪里开始出错。

任何人都可以帮忙吗?

编辑:

我从这条评论中修复了它:https ://github.com/moby/moby/issues/36967#issuecomment-676698563

但它摧毁了我所有的容器

标签: dockerubuntuzfs

解决方案


我不确定如何通过 Docker 进行操作,但 ZFS 告诉您文件系统rpool/ROOT/ubuntu_bl0u7i/var/lib/120f50d...bbdc40有几个从该文件系统上的快照创建的克隆。为了争论,假设只有一个,并且克隆的文件系统被称为clone1,它是在文件系统上创建snapshot1rpool/...bbdc40。所以你的层次结构是这样的:

rpool/...bbdc40 -> rpool/...bbdc40@snapshot1 -> clone1

问题是它clone1仍在引用来自 的数据snapshot1,因此您无法删除快照,这会阻止您删除原始文件系统。

但是,ZFS 允许您使用以下zfs promote命令更改“父”文件系统的身份,这使您可以将层次结构更改为:

clone1 -> clone1@snapshot1 -> rpool/...bbdc40

现在没有人依赖于其中的数据rpool/...bbdc40(因为快照已被移动到新提升的父级,clone1),因此您可以将其删除。

(也就是说,Docker 可能假设它可以完全控制其文件系统的状态,所以如果你到处运行随机 ZFS 命令,它可能会让 Docker 感到悲伤和困惑。使用风险自负。)


推荐阅读