Linux

如何在調整大小/縮小後修復 BTRFS 超級塊錯誤(BTRFS:無法為 bytenr 獲取超級緩衝區頭 274877906944)

  • November 7, 2015

帶有 2 500 GB 硬碟的 BTRFS RAID1 陣列,沒有錯誤。這是根文件系統,因此每個驅動器上有 3 個分區:1 = /boot (ext4)、2 = / (btrfs)、3 (swap)

/boot 是 ext4,因為如果 /boot 是 btrfs 文件系統(安裝了新核心但未更新 grub 配置),升級核心並不總是有效。

現在,這個鏡像被移動到更小的驅動器上,新的驅動器是 120 GB,所以 btrfs 文件系統必須調整大小。例如,可以使用 GParted 調整兩個 btrfs 分區的大小。調整大小後,可以將帶有分區資訊的 MBR 從舊的 500 GB 驅動器複製到新的 120 GB 驅動器 ( dd if=/dev/sda of=/dev/sdb bs=512 count=1) 以及 btrfs 分區 ( dd if=/dev/sda2 of=/dev/sdb2)。(忽略交換分區,它必須被移動以適應 120 GB。)

儘管系統啟動並且新的 120 GB 驅動器沒有問題,但正在記錄一條錯誤消息 (dmesg):

BTRFS:無法獲得 bytenr 的超級緩衝區頭 274877906944

並且擦洗髮現“超級”錯誤(但沒有數據錯誤):

“錯誤詳情:super=1”

由於此錯誤,是否存在數據損壞的風險?

如何解決這個問題?

由於 274877906944 是 256 GB,舊的 btrfs 分區是 >256 GB,新的分區是 <256 GB,看來系統正在尋找 256 GB 的超級塊?

警告:不要使用 GParted 調整多設備 BTRFS 文件系統的大小!

可能發生數據失去!

看起來 GParted 是罪魁禍首。顯然,它不知道如何調整多設備 btrfs 文件系統的大小,只是執行btrfs filesystem resize,但不使用resize 1:49g和處理每個設備resize 2:49g

這就是說btrfs filesystem show

Total devices 2 FS bytes used 40.95GiB
devid    1 size 50.00GiB used 43.03GiB path /dev/sda2
devid    2 size 439.45GiB used 43.03GiB path /dev/sdb2

顯然,GParted 沒有調整第二個設備上的文件系統的大小,所以 Btrfs 仍然認為它是一個 500 GB 的文件系統。

在某些時候,Btrfs 會嘗試在磁碟外讀取/寫入數據。這會導致損壞,甚至可能使整個文件系統變得無用。


使固定

首先,啟動實時系統以降低系統在大於其所在分區的文件系統上執行時損壞的風險。

掛載文件系統:

mount /dev/sda2 /mnt/tmp

首先將第二個設備縮小到 50 GB - 1 GB = 49 GB 以避免舍入錯誤:

btrfs filesystem resize 2:49g /mnt/tmp

調整它的大小以填充 50 GB 分區:

btrfs filesystem resize 2:max /mnt/tmp

檢查btrfs filesystem show,兩個設備都應該有正確的尺寸:

devid    1 size 50.00GiB used 43.03GiB path /dev/sda2
devid    2 size 50.00GiB used 43.03GiB path /dev/sdb2

解除安裝,重新啟動,錯誤應該消失了。

如果系統在該不良狀態下執行時沒有任何損壞,那麼文件系統現在應該是健康的。

(感謝幫我解決這個問題的黑暗精靈。)

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