运行较新的内核时出现 btrfs 错误

运行较新的内核时出现 btrfs 错误

我在服务器上遇到了一个奇怪的与 btrfs 相关的问题。运行最高 4.9 版的内核时,一切都运行正常。如果我升级到任何 >= 4.19 的版本,一切都会崩溃。较新的内核会记录以下错误:

[Fri Oct 27 23:44:22 2023] BTRFS info (device dm-1): using crc32c (crc32c-intel) checksum algorithm
[Fri Oct 27 23:44:22 2023] BTRFS info (device dm-1): disk space caching is enabled
[Fri Oct 27 23:44:22 2023] BTRFS info (device dm-1): bdev /dev/mapper/vg0-root errs: wr 0, rd 4, flush 0, corrupt 0, gen 0
[Fri Oct 27 23:44:23 2023] BTRFS info (device dm-1): checking UUID tree
[Fri Oct 27 23:44:25 2023] BTRFS critical (device dm-1): corrupt leaf: root=5 block=7800258560 slot=0 ino=22544639, invalid inode transid: has 140710402240512 expect [0, 9501327]
[Fri Oct 27 23:44:25 2023] BTRFS error (device dm-1): read time tree block corruption detected on logical 7800258560 mirror 1
[Fri Oct 27 23:44:26 2023] BTRFS critical (device dm-1): corrupt leaf: root=5 block=86444384256 slot=1 ino=8651007, invalid inode transid: has 140710402240512 expect [0, 9501327]
[Fri Oct 27 23:44:26 2023] BTRFS error (device dm-1): read time tree block corruption detected on logical 86444384256 mirror 1
[Fri Oct 27 23:44:26 2023] BTRFS critical (device dm-1): corrupt leaf: root=5 block=86032809984 slot=41 ino=24641791, invalid inode transid: has 140710402240512 expect [0, 9501327]
[Fri Oct 27 23:44:26 2023] BTRFS error (device dm-1): read time tree block corruption detected on logical 86032809984 mirror 1
[Fri Oct 27 23:44:26 2023] BTRFS critical (device dm-1): corrupt leaf: root=5 block=8081629184 slot=0 ino=8651599, invalid inode transid: has 140710402240512 expect [0, 9501327]
[Fri Oct 27 23:44:26 2023] BTRFS error (device dm-1): read time tree block corruption detected on logical 8081629184 mirror 1
[Fri Oct 27 23:44:26 2023] BTRFS critical (device dm-1): corrupt leaf: root=5 block=86032809984 slot=41 ino=24641791, invalid inode transid: has 140710402240512 expect [0, 9501327]
[Fri Oct 27 23:44:26 2023] BTRFS error (device dm-1): read time tree block corruption detected on logical 86032809984 mirror 1
[Fri Oct 27 23:44:26 2023] BTRFS critical (device dm-1): corrupt leaf: root=5 block=7800258560 slot=0 ino=22544639, invalid inode transid: has 140710402240512 expect [0, 9501327]
[Fri Oct 27 23:44:26 2023] BTRFS error (device dm-1): read time tree block corruption detected on logical 7800258560 mirror 1

4.9 一切顺利。

btrfs check与内核版本 >=5相同:

root@rescue ~ # btrfs check /dev/mapper/vg0-root 
Opening filesystem to check...
Checking filesystem on /dev/mapper/vg0-root
UUID: 18c05fd2-0569-420b-bb74-676b2327d3d5
[1/7] checking root items
[2/7] checking extents
[3/7] checking free space cache
[4/7] checking fs roots
root 5 inode 8651007 errors 100000, invalid inode generation or transid
root 5 inode 8651008 errors 100000, invalid inode generation or transid
root 5 inode 8651599 errors 100000, invalid inode generation or transid
root 5 inode 8651600 errors 100000, invalid inode generation or transid
root 5 inode 22544639 errors 100000, invalid inode generation or transid
root 5 inode 24641791 errors 100000, invalid inode generation or transid
root 5 inode 40419460 errors 200, dir isize wrong
root 5 inode 44021300 errors 200, dir isize wrong
ERROR: errors found in fs roots
found 187456020480 bytes used, error(s) found
total csum bytes: 179106780
total tree bytes: 2667675648
total fs tree bytes: 2107199488
total extent tree bytes: 305291264
btree space waste bytes: 643077002
file data blocks allocated: 496942690304
 referenced 175125786624

并且内容以相当混乱的方式显示:

root@rescue ~ # ll /mnt/
ls: cannot access '/mnt/proc': Input/output error
ls: cannot access '/mnt/run': Input/output error
ls: cannot access '/mnt/sys': Input/output error
ls: cannot access '/mnt/etc': Input/output error
ls: cannot access '/mnt/lib64': Input/output error
ls: cannot access '/mnt/usr': Input/output error
total 32K
drwxr-xr-x 1 root root 2.0K Oct 27 20:18 bin
drwxr-xr-x 1 root root    0 Sep 27  2014 boot
drwxr-xr-x 1 root root    0 Sep 27  2014 dev
d????????? ? ?    ?       ?            ? etc
drwxr-xr-x 1 root root   12 Dec 23  2014 home
lrwxrwxrwx 1 root root   31 Oct 26 11:04 initrd.img -> boot/initrd.img-5.10.0-26-amd64
lrwxrwxrwx 1 root root   30 Oct 26 17:24 initrd.img.old -> boot/initrd.img-4.9.0-13-amd64
-rw-r----- 1 root root  659 Sep 27  2014 installimage.conf
-rw-r----- 1 root root 9.8K Sep 27  2014 installimage.debug
drwxr-xr-x 1 root root  420 Oct 26 17:22 lib
d????????? ? ?    ?       ?            ? lib64
drwx------ 1 root root    0 Sep 12  2012 lost+found
drwxr-xr-x 1 root root   22 Sep 12  2012 media
drwxr-xr-x 1 root root    0 Apr  2  2019 mnt
drwxr-xr-x 1 root root   24 Dec 27  2019 opt
d????????? ? ?    ?       ?            ? proc
drwx------ 1 root root  560 Oct 27 22:47 root
d????????? ? ?    ?       ?            ? run
drwxr-xr-x 1 root root 3.1K Oct 27 20:18 sbin
drwxr-xr-x 1 root root    0 Sep 12  2012 srv
d????????? ? ?    ?       ?            ? sys
drwxrwxrwt 1 root root  106 Oct 27 23:35 tmp
d????????? ? ?    ?       ?            ? usr
drwxr-xr-x 1 root root  118 Sep 28  2014 var
lrwxrwxrwx 1 root root   28 Oct 26 11:04 vmlinuz -> boot/vmlinuz-5.10.0-26-amd64
lrwxrwxrwx 1 root root   27 Oct 26 17:24 vmlinuz.old -> boot/vmlinuz-4.9.0-13-amd64

当我使用内核 4.9 启动时,这些错误神奇地消失了,读写工作完全正常。经过反复检查,文件被正确地读取、写入、重新读取和重写;只要我继续使用版本 4.9。

我已经将使用 btrfs 的其他服务器升级到较新版本,没有任何问题,所以这不是通用问题。如有任何帮助,欢迎提供。

答案1

经过大量的搜索,线程帮助我形成了以下有效的路径(它需求控制台,不要使用 ssh 尝试此操作):

  • 使用内核 4.9,进入运行级别 1,然后创建有问题的目录的副本:
    • rsync -acv /usr /usr_new
    • rsync -acv /etc /etc_new
    • rsync -acv /lib64 /lib64_new
    • rsync -d /proc /proc_new
    • rsync -d /run /run_new
    • rsync -d /sys /sys_new

如果可能的话,使用 USB 或带有内核 4.9 的设备启动,否则就停留在运行级别 1;然后移开有问题的文件夹:

  • mkdir /t && mv /etc /lib64 /usr /proc /run /sys /t

此时如果您尚未使用 USB 启动,系统将会崩溃,因为关键库将不可用。

如果系统崩溃,从 USB 启动或使用内核 4.9 或更新版本启动某些救援系统都不会有什么区别。将分区挂载在 /mnt 下,然后将所有 *_new 文件夹重命名为适当的名称:

  • for i in etc lib64 usr proc run sys; do mv /mnt/${i}_new /mnt/$i; done

完成后,使用内核 4.9 重新启动系统以验证其是否正常工作。如果一切正常,删除包含旧有问题目录的 /t 文件夹。最后,使用较新的内核重新启动。应该没有问题。

PS:上面提到的目录(/etc、/lib64、/usr、/proc、/run 和 /sys)是导致我尝试升级的系统出现 BTRFS 错误的目录,因此不要不负责任地复制/粘贴。

相关内容