如何在 ram-disk 上恢復記憶體的 LVM?
在本文中,有一個很好的秘訣,說明如何將 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