Filesystems

LVM、LUKS2 和 BTRFS 問題

  • January 12, 2022

我有以下設置: 3 個 10Tb 大小的 HDD,採用 LVM Raid5 配置 在 LUKS2 加密之上和 BTRFS 文件系統內。

由於我的儲存空間不足,我添加了另一個 16TB 硬碟(比 10TB 便宜)將其作為物理卷添加到 LVM 中,將其添加到卷組,執行重新同步,以便 LVM 可以調整我的 RAID 的大小。我將 btrfs 分區的大小調整為最大。

我注意到,當我寫信給它時,在 btrfs 調整大小後不久,dmesg 錯誤開始出現:

[53034.840728] btrfs_dev_stat_print_on_error: 299 callbacks suppressed
[53034.840731] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 807, rd 0, flush 0, corrupt 0, gen 0
[53034.841289] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 808, rd 0, flush 0, corrupt 0, gen 0
[53034.844993] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 809, rd 0, flush 0, corrupt 0, gen 0
[53034.845893] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 810, rd 0, flush 0, corrupt 0, gen 0
[53034.846154] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 811, rd 0, flush 0, corrupt 0, gen 0

我可以排除硬體問題,因為我在虛擬機的另一台電腦上嘗試過。當我將更大的文件(400Mb)寫入文件系統時,dmesg 中的問題確實出現了,但不是文本文件之類的文件 - 從一個 raid 文件複製到另一個文件後校驗和也是錯誤的:

gallifrey raid5 # dd if=/dev/urandom of=original.img bs=40M count=100
0+100 records in
0+100 records out
3355443100 bytes (3.4 GB, 3.1 GiB) copied, 54.0163 s, 62.1 MB/s
gallifrey raid5 # cp original.img copy.img
gallifrey raid5 # md5sum original.img copy.img            
29867131c09cc5a6e8958b2eba5db4c9  original.img
59511b99494dd4f7cf1432b19f4548c4  copy.img

gallifrey raid5 # btrfs device stats /mnt/raid5 
[/dev/mapper/data].write_io_errs    811
[/dev/mapper/data].read_io_errs     0
[/dev/mapper/data].flush_io_errs    0
[/dev/mapper/data].corruption_errs  0
[/dev/mapper/data].generation_errs  0

我已經重新同步了整個 lvm raid,多次進行了 smartctl 檢查(不應該是硬體問題,但仍然)並且確實沒有btrfs scrub start -B /mnt/raid5返回btrfs check -p --force /dev/mapper/data任何錯誤。

在核心 5.15.11 和 5.10.27 上發生

lvm版本:

gallifrey raid5 # lvm version  
 LVM version:     2.02.188(2) (2021-05-07)
 Library version: 1.02.172 (2021-05-07)
 Driver version:  4.45.0

我的目標是將來對驅動器的寫入不會損壞,而已經損壞的文件可以刪除,但我想保存或至少不刪除的好文件。

從 btrfs 的手冊頁中可以看出,這write_io_errs意味著下面的塊設備沒有成功寫入。就我而言,這意味著 lvm 和或 luks2 是這裡的問題。

有什麼建議,或者需要更多資訊嗎?

乾杯

我找不到這個問題的根本原因,所以我決定完全放棄 LVM 並用 mdadm 替換它——這在第一次嘗試時就像魅力一樣。

創建 mdadm RAID5(最初使用 3 個磁碟)

  1. 使用三個磁碟創建(因此 raid-devices = 3):

mdadm --create mediaraid --level=raid5 --raid-devices=3 /dev/sda /dev/sdb /dev/sde

  1. 可選擇檢查您可以以何種速度使用何種加密(記憶體速度,而不是磁碟 IO):

cryptsetup benchmark /dev/md/mediaraid

  1. 可選擇加密整個 RAID(這樣的結構不需要單獨解密每個磁碟。整個 RAID 的一個密碼):

cryptsetup luksFormat --hash sha512 --cipher aes-xts-plain64 --key-size 512 /dev/md/mediaraid

  1. 打開 LUKS 設備(格式化它所必需的):

cryptsetup luksOpen /dev/md/mediaraid

  1. 使用 btrfs 格式化 RAID:

mkfs.btrfs /dev/mapper/data -f

通過 1 個磁碟和底層 mdadm RAID5 增長/擴展 btrfs 文件系統

前提條件:文件系統未掛載且LUKS設備已關閉:

umount /mnt/raid5 && cryptsetup close /dev/mapper/data

  1. 將 /dev/sdc(用您的驅動器替換)添加到 mdadm 作為備用磁碟:

mdadm --add /dev/md/mediaraid /dev/sdc

  1. 驗證它是否出現(將在底部,表示它是備用磁碟):

mdadm --detail /dev/md/mediaraid

**注意:**以下步驟會觸發 RAID 重塑,事情變得真實起來,我的 10TB 硬碟大約需要 25-30 小時才能從 3 個磁碟重塑和同步到 4 個磁碟。我不確定在 respahe 期間重新啟動是否安全 - 但我不會推薦它或至少在虛擬機中嘗試它。

  1. 將 RAID 增加到磁碟數量(大多數時候您想在此處寫入磁碟總數,3 + 1 = 4,現在我有 4 個可用驅動器,我想使用所有 4 個):

mdadm --grow --raid-devices=4 /dev/md/mediaraid

  1. 監控 reshape 的進度(第一個更好):

cat /proc/mdstat或者mdadm --detail /dev/md/mediaraid

改造完成後:

  1. 或者,如果您使用 LUKS解密 RAID - 否則繼續下一步:

cryptsetup luksOpen /dev/md/mediaraid data

  1. 掛載 btrfs 文件系統:

mount /dev/mapper/data /mnt/raid5

  1. 將 btrfs 文件系統增加到最大或任何您想要的:

btrfs filesystem resize max /mnt/raid5

  1. 可能沒有必要,但我在 btrfs 文件系統調整大小後解除安裝並重新安裝了整個東西

umount /mnt/raid5 && mount /dev/maper/data /mnt/raid5

完畢。

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