我的机器的默认文件系统是lvm(Ubuntu 22.04)。我想启动 LXD/LXC 虚拟机来运行一些 Apache 项目,例如 Hadoop 和 Spark。设置 Hadoop 时,有一个步骤需要将 VM 内的文件系统格式化为 hdfs,如果我的存储是 DIR 而不是 zfs 这样的系统,我不知道这会对系统有何影响。此外,我无法手动为 DIR 存储分配自定义大小,但可以在 ZFS 上。
ZFS 似乎是更好的选择,但问题是我的本机文件系统是 lvm 而不是 zfs。尽管下面有 lvm 文件系统,是否可以拥有 zfs 存储,还是我需要将整个文件系统更改为 zfs?
当我运行时,lxd init
安装程序确实提供了让我的后端存储为 zfs [default=zfs] 的功能。
任何有关 ZFS/LVM 共存的见解都将受到高度赞赏。我对这个主题不太熟悉,我不想破坏我的机器:)
答案1
LVM 不是文件系统,它是磁盘和分区的卷管理工具。说“lvm 是我的默认文件系统”就像说“fdisk 是我的默认文件系统”。
您可以在 LVM 提供的一个或多个逻辑卷上使用 ZFS(或任何其他文件系统,例如 ext2/3/4、xfs、btrfs 等)……但是,这样做没有什么意义。除非您出于其他原因需要在主机系统上使用 LVM,否则最好只使用 ZFS,因为 ZFS 提供磁盘/分区/卷/池管理和文件系统。
例如,您可能需要 xfs 或 ext4 上的主机操作系统以及用于 VM 磁盘映像的 zpool(这样做的唯一充分理由是在根文件系统上运行 zfs 可能很困难,但即使这并不像某些人那么难认为是)。有很多方法可以做到这一点,但是,它们都归结为“将一些磁盘空间分配给 /、/boot、/boot/EFI 等分区/LV,并将剩余空间分配给 ZFS”。
如果需要,您可以对非 ZFS 分区使用 RAID,但您应该将原始分区或 LV 提供给 ZFS,以便它可以创建和管理 zpool 本身。在 raid 之上使用 ZFS(无论是硬件 raid 还是软件 raid,如 mdadm 或 lvm 的 raid 功能)都是一个非常糟糕的主意......它完全破坏了 ZFS 的最佳功能,即它使用块校验和和冗余副本不仅可以检测错误的能力但为了维修他们。
对于 ZFS 上的每个 VM 的虚拟磁盘,您可以使用原始磁盘映像文件(不需要 qcow2,因为 zfs 具有内置透明压缩)或根据每个 VM 的需要创建 ZVOL(例如zfs create -V 10G pool/myvmname
)。
顺便说一句,我在我的系统上使用这两种方法 - 对于某些虚拟机,我使用磁盘映像文件,对于其他虚拟机,我使用 zvols,有时我在虚拟机中使用两者(例如,对于我的ztest
虚拟机,用于测试 zfs/lvm/raid/btrfs 和其他磁盘&文件系统相关的东西,我使用一个 10GB ZVOL 作为操作系统,并使用一堆 100MB 磁盘映像文件作为虚拟磁盘来测试东西 - 非常方便地学习和练习诸如回滚快照、恢复备份和从灾难中恢复之类的东西你在现实生活中需要它)。
zvol 是 zpool 的一个块,它作为另一个块设备呈现给系统(因此可以像任何其他块设备一样进行分区和/或格式化和使用)。使用 zvol 的主要优点是每个 zvol 可以独立快照用于备份和/或灾难恢复。增加 zvol 的大小也很容易,例如zfs set volsize="$newsize" poolname/zvolname
(您仍然需要编辑 zvol 的分区表并运行xfs_growfs
或resize2fs
其他什么,无论是在虚拟机运行时在虚拟机内部运行,还是在虚拟机关闭时从主机运行)
您还可以在 ZFS 上使用 qcow2 文件,但没有任何意义,因为 zfs 已经进行了压缩和快照等操作……而加倍使用这些功能只会使其速度慢一些。如果您已经有一个包含 VM 的 .qcow2 文件,IMO,您最好的选择是将qemu-img convert
其转换为原始磁盘映像并将其保存到文件或直接保存到 /dev/zvol/pool 下的 ZVOL 块设备节点。
答案2
理论上,您可以让 ZFS 在 LVM 之上运行,LVM 在 ZFS 之上运行,或者两者在存储的不同部分上并行运行。但两者在这种情况下都在做同样的事情 - 卷管理 - 提供一个可以配置 HDFS 文件系统的空间。 ZFS 确实擅长它的功能,但您不会得到任何好处,而是在 LVM 之上运行 ZFS 的所有缺点。
只需使用 qcow2 虚拟磁盘即可。
如果您现有的存储配置为 lvm-thin,那么您可以将其配置为新的逻辑卷。如果只是 lvm2,请将其放在现有文件系统上。