这是我的问题的起源:
我在 VPS 上的 Ubuntu 22.04 上运行具有 LXD snap 版本的 Linux 容器。VPS 的根文件系统是 Ext4,没有附加存储。所以默认的 LXD 存储池是由dir选项创建的。
当我拍摄这些 LXC 的快照时,整个数据都是重复的——即如果容器是 6G,那么快照就会变成另一个 6G。
我认为如果它是 LVM 文件系统,快照将以不同的方式创建。
所以我的问题是:
- 可以做类似的事情
fallocate -l 16G /lvm.fs
,然后将其格式化为 LVM,挂载它并将其用作 LXD 的存储池吗?当然,如果可能的话,我该怎么做呢?
一些注意事项:
@larsks 提供的解决方案按预期工作!后来我发现,当我们在lxc storage create pool-name lvm
没有附加选项和参数的情况下使用时,它的作用几乎相同。在发布问题之前我没有对其进行测试,因为我认为lvm
强制驱动程序将需要使用单独的分区。
但是,在我看来,在这两种情况下,这种方法的弊端都远大于利弊,例如:
dir
与我们使用驱动程序的情况相比,写入速度降低了约 10% 。硬盘上没有剩余空间的情况很难恢复,即使过载数据位于
/tmp
...相反,当使用dir
驱动程序时,LXD防止消耗整个主机的文件系统空间,因此您的系统和容器仍在运行。这在我的 VPS 案例中非常方便。
从制作文件开始。我喜欢将它放在 以外的目录中,因此为此
/
我创建了一个目录:/vol
(正如@LustreOne 在评论中指出的那样,使用
truncate
而不是fallocate
不为文件预分配块,因此它开始使用零字节并且只消耗写入它的磁盘空间)。使用以下命令将该文件配置为块设备
losetup
:这将输出循环设备的名称(可能
/dev/loop0
,但如果不是,请调整以下命令以匹配)。在该设备上设置 LVM:
恭喜,你有一个文件支持的 LVM VG!
不幸的是,如果此时您要重新启动,您会发现 VG 丢失了:循环设备不是持久的,因此我们需要添加一些工具来在系统启动时进行配置。
将以下内容放入
/usr/local/bin/activate-vg.sh
:并确保它是可执行的:
添加一个 systemd 单元来激活服务。将以下内容放入
/etc/systemd/system/activate-vg.service
:启用服务:
现在,当您重新启动时,您的文件支持的 LVM VG 应该可用。