Btrfs: Failed to recover log tree 重放日志树失败修复实践

实践 | Practices 2025年12月14日

1. First | 序

近期某台服务器调试 Reboot 过程中无法启动

随后系统进入 Emergency Mode

此文记录修复过程

1.1. OS & SW Version

➜  ~ cat /etc/os-release
NAME="openSUSE Leap"
VERSION="16.0"
ID="opensuse-leap"
ID_LIKE="suse opensuse"
VERSION_ID="16.0"
PRETTY_NAME="openSUSE Leap 16.0"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:16.0"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"
DOCUMENTATION_URL="https://en.opensuse.org/Portal:Leap"
LOGO="distributor-logo-Leap"
➜  ~ btrfs --version
btrfs-progs v6.14
-EXPERIMENTAL -INJECT -STATIC +LZO +ZSTD +UDEV +FSVERITY +ZONED CRYPTO=builtin
➜  ~ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
sr0          11:0    1  2.3M  0 rom
vda         254:0    0  200G  0 disk
├─vda1      254:1    0    8M  0 part
└─vda2      254:2    0  200G  0 part
  └─cr_root 253:0    0  200G  0 crypt /var/lib/containers/storage/overlay
                                      /var
                                      /usr/local
                                      /tmp
                                      /srv
                                      /root
                                      /opt
                                      /boot/grub2/i386-pc
                                      /boot/grub2/x86_64-efi
                                      /home
                                      /.snapshots
                                      /
➜  ~

2. 排查

2.1. 进入维护 Shell

根据提示:

Enter root password for system maintenance (or press Control-D to continue):

  1. 输入 Root 用户的密码(输入时屏幕不会显示字符)。
  2. 按 Enter 键。
  3. 如果密码正确,将获得一个命令提示符(通常是 #)。

2.2. 查找具体报错原因

直接查看系统建议的报告文件:

less /run/initramfs/rdsosreport.txt

关键行:

BTRFS: error (device dm-0) in btrfs_replay_log:2184: errno=-5 IO failure (Failed to recover log tree)

根文件系统(Btrfs 格式)的日志树(Log Tree)损坏!!!

3. 修复

3.1. 确认设备名称

报错信息中提到的是 device dm-0。这通常是一个逻辑卷或加密卷。

可以输入以下命令确认它的确存在:

ls -l /dev/dm-0

继续查看 blkid 确认它是根分区:

blkid

3.2 执行修复命令

使用 btrfs rescue 工具来清空损坏的日志树。

这将丢弃最后几秒钟未写入磁盘的数据。

请输入以下命令:

btrfs rescue zero-log /dev/dm-0
  • 注意:如果你的系统比较老,没有 btrfs rescue 命令,可以尝试使用旧命令 btrfs-zero-log /dev/dm-0

3.3. Reboot

修复完成后,执行以下命令重启:

reboot

4. 排查原因

  1. 检查物理磁盘健康状况

    所示为虚拟磁盘遂跳过此步骤

  2. 检查 Btrfs 自身的错误统计

    • 运行命令

      btrfs device stats /
      
    • 输出结果

      [/dev/mapper/cr_root].write_io_errs    0
      [/dev/mapper/cr_root].read_io_errs     0
      [/dev/mapper/cr_root].flush_io_errs    0
      [/dev/mapper/cr_root].corruption_errs  0
      [/dev/mapper/cr_root].generation_errs  0
      

      没有错误计数

  3. Btrfs 数据完整性扫描 (Scrub)

    • 启动扫描

      btrfs scrub start /
      
    • 查看进度/结果

      btrfs scrub status /
      
    • 输出结果

      ➜  ~ btrfs scrub start /
      scrub started on /, fsid 6d4d35e0-e39f-4258-9bcb-ba6f53d8681c (pid=27561)
      Starting scrub on devid 1
      ➜  ~ btrfs scrub status /
      UUID:             6d4d35e0-e39f-4258-9bcb-ba6f53d8681c
      Scrub started:    Sun Dec 14 19:16:16 2025
      Status:           finished
      Duration:         0:00:33
      Total to scrub:   43.22GiB
      Rate:             1.31GiB/s
      Error summary:    no errors found
      ➜  ~
      

      未发现任何错误

5. 总结

排查过程中未发现任何 btrfs 数据块异常

根本问题是 Log Tree 损坏重放失败导致文件系统无法挂载

但我也没有异常关机 ┗|`O′|┛ 嗷~~

技术不到位遂定性为偶偶偶偶偶发性事件

标签

xzllll

三分钟热度三分钟收获