Btrfs: Failed to recover log tree 重放日志树失败修复实践
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):
- 输入 Root 用户的密码(输入时屏幕不会显示字符)。
- 按 Enter 键。
- 如果密码正确,将获得一个命令提示符(通常是
#)。
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. 排查原因
-
检查物理磁盘健康状况
所示为虚拟磁盘遂跳过此步骤
-
检查 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
没有错误计数
-
-
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′|┛ 嗷~~
技术不到位遂定性为偶偶偶偶偶发性事件