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