LVM、LUKS2 和 BTRFS 問題
我有以下設置: 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 個磁碟)
- 使用三個磁碟創建(因此 raid-devices = 3):
mdadm --create mediaraid --level=raid5 --raid-devices=3 /dev/sda /dev/sdb /dev/sde
- 可選擇檢查您可以以何種速度使用何種加密(記憶體速度,而不是磁碟 IO):
cryptsetup benchmark /dev/md/mediaraid
- 可選擇加密整個 RAID(這樣的結構不需要單獨解密每個磁碟。整個 RAID 的一個密碼):
cryptsetup luksFormat --hash sha512 --cipher aes-xts-plain64 --key-size 512 /dev/md/mediaraid
- 打開 LUKS 設備(格式化它所必需的):
cryptsetup luksOpen /dev/md/mediaraid
- 使用 btrfs 格式化 RAID:
mkfs.btrfs /dev/mapper/data -f
通過 1 個磁碟和底層 mdadm RAID5 增長/擴展 btrfs 文件系統
前提條件:文件系統未掛載且LUKS設備已關閉:
umount /mnt/raid5 && cryptsetup close /dev/mapper/data
- 將 /dev/sdc(用您的驅動器替換)添加到 mdadm 作為備用磁碟:
mdadm --add /dev/md/mediaraid /dev/sdc
- 驗證它是否出現(將在底部,表示它是備用磁碟):
mdadm --detail /dev/md/mediaraid
**注意:**以下步驟會觸發 RAID 重塑,事情變得真實起來,我的 10TB 硬碟大約需要 25-30 小時才能從 3 個磁碟重塑和同步到 4 個磁碟。我不確定在 respahe 期間重新啟動是否安全 - 但我不會推薦它或至少在虛擬機中嘗試它。
- 將 RAID 增加到磁碟數量(大多數時候您想在此處寫入磁碟總數,3 + 1 = 4,現在我有 4 個可用驅動器,我想使用所有 4 個):
mdadm --grow --raid-devices=4 /dev/md/mediaraid
- 監控 reshape 的進度(第一個更好):
cat /proc/mdstat
或者mdadm --detail /dev/md/mediaraid
改造完成後:
- 或者,如果您使用 LUKS解密 RAID - 否則繼續下一步:
cryptsetup luksOpen /dev/md/mediaraid data
- 掛載 btrfs 文件系統:
mount /dev/mapper/data /mnt/raid5
- 將 btrfs 文件系統增加到最大或任何您想要的:
btrfs filesystem resize max /mnt/raid5
- 可能沒有必要,但我在 btrfs 文件系統調整大小後解除安裝並重新安裝了整個東西
umount /mnt/raid5 && mount /dev/maper/data /mnt/raid5
完畢。