Cache

如何在 ram-disk 上恢復記憶體的 LVM?

  • September 25, 2018

本文中,有一個很好的秘訣,說明如何將 RAM 磁碟用作經典 LVM 卷的記憶體設備。

假設您有一個較舊的磁碟、大量 RAM 並且沒有 SSD,您可以使用此技術將磁碟性能提高到本機 RAM 吞吐量。

因此,我在用於執行 Windows 10 的虛擬 VM 的 LVM 上執行此操作。瞧:VM 內的磁碟吞吐量快 4 倍(平均吞吐量,最好在修補 Windows 時使用)。

一切都很好——直到我關閉了我的 linux 系統(CentOS 7)。

數據失去!

關機不會反彙編該記憶體。在電源故障情況下也是如此(是的 - 會有數據失去)。

但是 - 必須有一種方法來恢復剩下的東西。但是 LVM 不允許您在缺少磁碟的 VG 上進行操作。

那麼 - 這個案子有收據嗎?

  • 使用新磁碟恢復失去的 LVM 記憶體磁碟
  • 強制清潔狀態
  • 再次訪問記憶體的LV

在最後一步中,將進行文件系統修復並從備份中恢復失去/損壞的文件(使用 rsync)。

您可以使用此技術將磁碟性能提高到本機 RAM 吞吐量

不,不完全是。一旦記憶體充滿了寫入,寫入吞吐量就會降低到底層磁碟的能力。並且從支持磁碟的第一次讀取仍然很慢。記憶體的 I/O,是的更快。


這種方法非常危險,因為它非常不是永久性磁碟。當您可以獲得快速固態磁碟或硬體寫入記憶體時,我對該實用程序持懷疑態度,但測試故障模式很有趣。

**這將導致數據失去。**只有在您有數據備份的情況下才能繼續。

首先,沒有記憶體。

# Create volume
pvcreate /dev/sdb
vgcreate vg /dev/sdb
lvcreate --size 400g --name lv vg
mkfs.xfs /dev/vg/lv
mkdir /mnt/lv
mount /dev/vg/lv /mnt/lv
# Write test
dd bs=1M if=/dev/zero of=/mnt/lv/zero count=10000

添加記憶體。

# Create a RAM disk
modprobe brd rd_nr=1 rd_size=4585760 max_part=0
pvcreate /dev/ram0
vgextend vg /dev/ram0
# Create a cache
lvcreate -L 300M -n cache_meta vg /dev/ram0
lvcreate -L 4G -n cache_vol vg /dev/ram0
lvconvert –type cache-pool –poolmetadata vg/cache_meta –cachemode=writeback vg/cache_vol -y
# Add cache to a LV
lvconvert –type cache –cachepool vg/cache_vol vg/lv
# Write test
dd bs=1M if=/dev/zero of=/mnt/lv/zero2 count=10000
# Crash test
echo 'c' > /proc/sysrq-trigger

當它回來時,LVM 很不高興,卷不可訪問。

[root@sf ~]# lvs
 WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
 LV   VG Attr       LSize   Pool        Origin     Data%  Meta%  Move Log Cpy%Sync Convert
 lv   vg Cwi---C-p- 400.00g [cache_vol] [lv_corig]
[root@sf ~]# mount /dev/vg/lv /mnt/lv/
mount: special device /dev/vg/lv does not exist
[root@sf ~]# pvs
 WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
 PV         VG Fmt  Attr PSize    PFree
 /dev/sdb   vg lvm2 a--  <500.00g 99.70g
 [unknown]  vg lvm2 a-m     4.37g 80.00m

您甚至不能強制取消記憶體它,因為元數據有 I/O 錯誤。

[root@sf ~]# lvconvert --uncache vg/lv --force -y
 WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
 WARNING: Cache pool data logical volume vg/cache_vol_cdata is missing.
 WARNING: Cache pool metadata logical volume vg/cache_vol_cmeta is missing.
 WARNING: Uncaching of partially missing writethrough cache volume vg/lv might destroy your data.
 /dev/mapper/vg-cache_vol_cmeta: read failed: Input/output error
 Failed to active cache locally vg/lv.

但是您可以通過創建具有相同 UUID 的新 PV 來強制失去數據。取消記憶體它以刪除 LVM 認為其中仍有數據但失去的 ramdisk PV。你可以用 重新添加新的記憶體lvconvert,但我不打算在這個實驗的結果之後。

pvcreate --norestore --uuid YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R  /dev/ram0
lvconvert --uncache vg/lv

最後,檢查任何文件系統損壞。需要從備份中恢復才能使您的數據恢復到良好狀態。

xfs_repair /dev/vg/lv

編輯:添加一個具有相同 UUID 的空 PV 似乎超級 hacky。畢竟,lvconvert 拒絕取消記憶體它。相反,如果您將元數據 LV 放在永久磁碟上,那麼清理起來會更容易一些。

# Same procedure but meta is on persistent storage.
lvcreate -L 300M -n cache_meta vg /dev/sdb

可以強制取消記憶體。不要讓“Flushing 0 blocks”輸出讓您放心,正在進行的寫入已經失去。然後可以刪除失去的 ramdisk,使 VG 再次保持一致。

[root@sf ~]# lvconvert --uncache vg/lv --force -y
 WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
 WARNING: Cache pool data logical volume vg/cache_vol_cdata is missing.
 WARNING: Uncaching of partially missing writethrough cache volume vg/lv might destroy your data.
 Flushing 0 blocks for cache vg/lv.
 Logical volume "cache_vol" successfully removed
 Logical volume vg/lv is not cached.
[root@sf ~]# vgreduce --removemissing vg
 WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
 Wrote out consistent volume group vg.
[root@sf ~]# pvs
 PV         VG Fmt  Attr PSize    PFree
 /dev/sdb   vg lvm2 a--  <500.00g <100.00g

引用自:https://serverfault.com/questions/932247