Lvm
是否可以將文件用作文件系統?
這是我的問題的起源:
- 我在 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 應該可用。