是否可以使用文件作为文件系统?

是否可以使用文件作为文件系统?

这是我的问题的由来:

  • 我正在 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 应该可用。

相关内容