Lvm

是否可以將文件用作文件系統?

  • May 9, 2022

這是我的問題的起源:

  • 我在 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 案例中非常方便。

是否可以執行 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 應該可用。

引用自:https://unix.stackexchange.com/questions/701628