1

TL;博士;

我发现我使用 设置的zfs内容、过程lxd中可能执行的操作lxd init以及我期望看到的内容之间存在一些差异。

我已经使用 LXD 大约一个月了,浏览了文档并进行了几次搜索,但它们似乎没有触及这个话题。

请查看以下部分以获取有关我的问题的更多详细信息:

  1. 有人可以解释为什么我观察到 LXD 和 ZFS 之间的挂载点差异以及这可能会产生什么影响(如果有的话)?
  2. LXD 是否实际上tank/lxd数据集内容从其挂载位置 at和 into移出ZFS 池 VDEV ,还是正在执行其他操作?(a)我如何确认/验证这两种情况?(b)更好的是,我怎样才能让 LXD 将所有内容保存/放入我设置使用的数据集中?/mnt/tank/lxd/.../var/lib/lxd/...zfs
  3. 我希望通常存储的所有内容都/var/lib/lxd/存储在tank/lxd我指定的范围内lxd init:我该怎么做?(一个好的 ZFS/LXD 方式更可取;我可以 mv /var/lib/lxd进入油箱和ln -s指向的目录/mnt/tank/...,但这似乎是一个糟糕的 hack,并且想要避免它。必须有更好的方法。)

提前致谢。


背景

我在 Ubuntu 18.04 中使用 LXD 3.0.0,将其设置为使用预先存在的 ZFS 池和数据集。这是运行lxd init的样子:

$ sudo zpool create -m /mnt/tank tank raidz3 <6 storage SSDs omitted>
$ sudo zfs set compression=on tank
$ sudo zfs create tank/lxd
$ sudo zfs list
NAME       USED  AVAIL  REFER  MOUNTPOINT
tank       216K  1.31T  43.7K  /mnt/tank
tank/lxd  41.7K  1.31T  41.7K  /mnt/tank/lxd

这看起来和我预期的一样。然后我运行lxd init并跟进如下:

$ lxd init
[...]
Create a new ZFS pool? (yes/no) [default=yes]: no
Name of the existing ZFS pool or dataset: tank/lxd
[...]

完成上述内容zfs list显示如下:

$ sudo zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
tank                  589K  1.31T  41.7K  /mnt/tank
tank/lxd              250K  1.31T  41.7K  none
tank/lxd/containers  41.7K  1.31T  41.7K  none
tank/lxd/custom      41.7K  1.31T  41.7K  none
tank/lxd/deleted     41.7K  1.31T  41.7K  none
tank/lxd/images      41.7K  1.31T  41.7K  none
tank/lxd/snapshots   41.7K  1.31T  41.7K  none

LXD 创建了一些数据集,但mountpoints 不再是它们以前的样子(即tank/lxd消失了),也不是我所期望的(下面没有lxd/...列出任何内容)。简而言之,原来的挂载点消失了,其他数据集也没有像我预期的那样出现。

我在这里可能错了,但看起来LXD 已经将应该/mnt/tank/lxd/... 位于 ZFS 池 vdevs/var/lib/lxd/下的数据移到了安装操作系统的 LVM 上的目录中。我不确定我错过了什么。

我可以使用zfs set命令来改变“正确”这个:

$ sudo zfs set mountpoint=/mnt/tank/lxd tank/lxd
$ sudo zfs set mountpoint=/mnt/tank/lxd/containers tank/lxd/containers
$ sudo zfs set mountpoint=/mnt/tank/lxd/custom tank/lxd/custom
$ sudo zfs set mountpoint=/mnt/tank/lxd/deleted tank/lxd/deleted
$ sudo zfs set mountpoint=/mnt/tank/lxd/images tank/lxd/images
$ sudo zfs set mountpoint=/mnt/tank/lxd/snapshots tank/lxd/snapshots

并验证它们是否再次按预期显示:

$ sudo zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
tank                  641K  1.31T  43.7K  /mnt/tank
tank/lxd              252K  1.31T  43.7K  /mnt/tank/lxd
tank/lxd/containers  41.7K  1.31T  41.7K  /mnt/tank/lxd/containers
tank/lxd/custom      41.7K  1.31T  41.7K  /mnt/tank/lxd/custom
tank/lxd/deleted     41.7K  1.31T  41.7K  /mnt/tank/lxd/deleted
tank/lxd/images      41.7K  1.31T  41.7K  /mnt/tank/lxd/images
tank/lxd/snapshots   41.7K  1.31T  41.7K  /mnt/tank/lxd/snapshots

但这似乎是一个部分解决方案,因为所有其他文件(例如lxd.db,密钥等)都留在了/var/lib/lxd. 所以,我不确定我是否在“修复”任何东西,或者是否有任何东西需要修复。

此外,我不清楚我是否真的用这些zfs set命令实现了任何目标。例如,touch /var/lib/lxd/containers/hi.txt不显示 下的文件如果他们都在看同一个位置/mnt/tank/lxd/containers/,我会预料到的。

在此先感谢您的帮助。


EDIT0:评论和结果中的建议测试

有人建议我尝试写出一些文件作为测试,以根据系统信息查看实际使用的空间在哪里消耗。测试步骤如下:

  1. 销毁并重新创建 ZFS 池和 LXD 配置,但不运行zfs set mountpoint命令让 LXD 做自己的事情,看看会发生什么。(为简洁起见,下面省略了步骤。)
  2. 作为对照,检查主机上的池/数据集存储容量和使用情况。
  3. 输入一个容器,然后对空间使用情况进行另一次控制检查。
  4. 在容器内写出一个测试文件。
  5. 对步骤 1 和 2 重复检查以查找更改。

结果是不确定的,可以在下面看到。

2.主机上的控制检查

$ sudo zfs list
NAME                                                                               USED  AVAIL  REFER  MOUNTPOINT
tank                                                                              1.18G  1.31T  41.7K  /mnt/tank
tank/lxd                                                                          1.18G  1.31T  41.7K  none
tank/lxd/containers                                                                270M  1.31T  41.7K  none
tank/lxd/containers/base-server                                                    251M  1.31T   588M  /var/lib/lxd/storage-pools/lxd-pool/containers/base-server
tank/lxd/containers/dev-server                                                    9.18M  1.31T   588M  /var/lib/lxd/storage-pools/lxd-pool/containers/dev-server
tank/lxd/containers/qa-server                                                     9.14M  1.31T   588M  /var/lib/lxd/storage-pools/lxd-pool/containers/qa-server
tank/lxd/custom                                                                    125K  1.31T  41.7K  none
tank/lxd/custom/dev-volume                                                        41.7K   512G  41.7K  /var/lib/lxd/storage-pools/lxd-pool/custom/dev-volume
tank/lxd/custom/qa-volume                                                         41.7K   512G  41.7K  /var/lib/lxd/storage-pools/lxd-pool/custom/qa-volume
tank/lxd/deleted                                                                  41.7K  1.31T  41.7K  none
tank/lxd/images                                                                    937M  1.31T  41.7K  none
tank/lxd/images/ab23ac2bda8cfb48c176a2d1e790181d5a1ed3522732a0cf8ff189dea848d3f1   588M  1.31T   588M  none
tank/lxd/images/b36ec647e374da4816104a98807633a2cc387488083d3776557081c4d0333618   349M  1.31T   349M  none
tank/lxd/snapshots                                                                41.7K  1.31T  41.7K  none

3. 容器内部

root@dev-server:~$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
tank/lxd/containers/dev-server  1.4T  589M  1.4T   1% /
none                            492K     0  492K   0% /dev
udev                             32G     0   32G   0% /dev/tty
tmpfs                           100K     0  100K   0% /dev/lxd
tank/lxd/custom/dev-volume      512G  128K  512G   1% /mnt/tank
tmpfs                           100K     0  100K   0% /dev/.lxd-mounts
tmpfs                            32G     0   32G   0% /dev/shm
tmpfs                            32G  160K   32G   1% /run
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                            32G     0   32G   0% /sys/fs/cgroup

4.在容器中写出测试文件

root@dev-server:~$ dd if=/dev/zero of=/root/test.img bs=8MB
^C3929+0 records in
3929+0 records out
31432000000 bytes (31 GB, 29 GiB) copied, 17.7005 s, 1.8 GB/s

root@dev-server:~$ ls -lh
total 512
-rw-r--r-- 1 root root 30G May  7 20:21 test.img

5.1。检查容器的结果

root@dev-server:~$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
tank/lxd/containers/dev-server  1.4T  589M  1.4T   1% /
none                            492K     0  492K   0% /dev
udev                             32G     0   32G   0% /dev/tty
tmpfs                           100K     0  100K   0% /dev/lxd
tank/lxd/custom/dev-volume      512G  128K  512G   1% /mnt/tank
tmpfs                           100K     0  100K   0% /dev/.lxd-mounts
tmpfs                            32G     0   32G   0% /dev/shm
tmpfs                            32G  160K   32G   1% /run
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                            32G     0   32G   0% /sys/fs/cgroup

5.2. 检查主机的结果

$ sudo zfs list
NAME                                                                               USED  AVAIL  REFER  MOUNTPOINT
tank                                                                              1.18G  1.31T  41.7K  /mnt/tank
tank/lxd                                                                          1.18G  1.31T  41.7K  none
tank/lxd/containers                                                                270M  1.31T  41.7K  none
tank/lxd/containers/base-server                                                    251M  1.31T   588M  /var/lib/lxd/storage-pools/lxd-pool/containers/base-server
tank/lxd/containers/dev-server                                                    9.18M  1.31T   588M  /var/lib/lxd/storage-pools/lxd-pool/containers/dev-server
tank/lxd/containers/qa-server                                                     9.14M  1.31T   588M  /var/lib/lxd/storage-pools/lxd-pool/containers/qa-server
tank/lxd/custom                                                                    125K  1.31T  41.7K  none
tank/lxd/custom/dev-volume                                                        41.7K   512G  41.7K  /var/lib/lxd/storage-pools/lxd-pool/custom/dev-volume
tank/lxd/custom/qa-volume                                                         41.7K   512G  41.7K  /var/lib/lxd/storage-pools/lxd-pool/custom/qa-volume
tank/lxd/deleted                                                                  41.7K  1.31T  41.7K  none
tank/lxd/images                                                                    937M  1.31T  41.7K  none
tank/lxd/images/ab23ac2bda8cfb48c176a2d1e790181d5a1ed3522732a0cf8ff189dea848d3f1   588M  1.31T   588M  none
tank/lxd/images/b36ec647e374da4816104a98807633a2cc387488083d3776557081c4d0333618   349M  1.31T   349M  none
tank/lxd/snapshots                                                                41.7K  1.31T  41.7K  none

df -h在创建/销毁测试文件之前和之后在主机上运行命令也显示没有任何变化。我用一个更大的(100GB)测试文件重复了这个,但没有注意到有什么不同。

4

1 回答 1

1

何时mountpointnone,它可能意味着以下两种情况之一:

  1. zfs unmount有人通过该命令显式卸载了该文件系统。
  2. 有人使用该mount命令来设置该文件系统的挂载位置,而不是使用该zfs mount命令。

我猜 LXD 正在做后者,而 ZFS 只是不知道它安装在哪里。如果是这样,LXD 可能还会写入条目以在重新启动/etc/fstab时重新创建这些挂载/var/lib/lxd/...。(哎呀,也许 LXD 的作者甚至认为这是一个功能,如果挂载点不方便输入,那么爱管闲事的 ZFS 爱好者就不太可能尝试在他们的 VM 数据目录中存储或修改内容。)

所以简短的回答是,我认为没有什么可以解决的。但是,我认为您所做的更改也zfs set不会造成任何伤害。

您提到touch ...在 LXD 目录中不会在目录中创建任何内容/mnt/tank/...。一个文件系统一次只能挂载在一个地方,所以我认为对应的目录/mnt只是ZFS在挂载点改变时留下的目录。如果您尝试将挂载点切换回/mnt/...现在,它应该会强制您在允许挂载发生之前删除您在那里触摸的文件(不允许“覆盖”来自两个不同文件系统的重复目录)。如果您出于某种原因希望它们被链接,您可以使用符号链接来执行此操作。

将来,您可以弄清楚文件是在哪个文件系统上写入的,df -P /path/to/file以帮助调试此类问题。

于 2018-05-02T14:46:10.267 回答