Alibaba Cloud Linux 2系统的ECS实例中使用已释放的文件系统inode出现系统宕机如何处理?

本文介绍如何解决Alibaba Cloud Linux 2系统的ECS实例中使用已释放的文件系统inode导致系统宕机问题。

问题描述

在符合如下条件的Alibaba Cloud Linux 2实例中,系统运行时出现系统宕机问题。

  • 镜像:Alibaba Cloud Linux 2.1903 LTS 64位

  • 内核:kernel-4.19.91-23.al7及之前的内核版本

系统宕机,且出现如下调用栈信息:

[598398.653602] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
[598398.655740] PGD 0 P4D 0 
[598398.656113] Oops: 0000 [#1] SMP PTI
[598398.656601] CPU: 10 PID: 5519 Comm: kworker/u192:5 Kdump: loaded Not tainted 4.19.91-21.2.al7.x86_64 #1
[598398.657851] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS 8a46cfe 04/01/2014
[598398.658885] Workqueue: writeback wb_workfn (flush-254:48)
[598398.659644] RIP: 0010:locked_inode_to_wb_and_lock_list+0x1a/0x110
[598398.660484] Code: 6b 50 eb ce 48 01 6b 48 eb db 66 0f 1f 44 00 00 0f 1f 44 00 00 41 54 4c 8d a7 88 00 00 00 55 48 89 fd 53 48 8b 9d f8 00 00 00 <48> 8b 03 48 83 c0 58 48 39 c3 74 13 48 8b 83 18 02 00 00 a8 03 0f
[598398.662967] RSP: 0018:ffffbae05dc07c00 EFLAGS: 00010246
[598398.663662] RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffff9d096bd0ed80
[598398.664611] RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffff9d096bd0ed80
[598398.665555] RBP: ffff9d096bd0ed80 R08: 0000000000000001 R09: ffff9d344af394b2
[598398.666530] R10: 0000000000000006 R11: 0000000000000018 R12: ffff9d096bd0ee08
[598398.667470] R13: ffff9d096bd0ee68 R14: ffffbae05dc07e08 R15: ffff9d4e4914b858
[598398.668448] FS:  0000000000000000(0000) GS:ffff9d4e5e680000(0000) knlGS:0000000000000000
[598398.669543] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[598398.670322] CR2: 0000000000000000 CR3: 000000396720a003 CR4: 00000000003606e0
[598398.671267] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[598398.672238] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[598398.673196] Call Trace:
[598398.673563]  writeback_sb_inodes+0x238/0x470
[598398.674170]  __writeback_inodes_wb+0x87/0xb0
[598398.674754]  wb_writeback+0x248/0x2e0
[598398.675260]  ? 0xffffffffb7000000
[598398.675728]  ? cpumask_next+0x16/0x20
[598398.676268]  wb_workfn+0x350/0x420
[598398.676764]  ? __switch_to+0xab/0x460
[598398.677297]  process_one_work+0x15b/0x370
[598398.677859]  worker_thread+0x49/0x3e0
[598398.678391]  kthread+0xf8/0x130
[598398.678834]  ? process_one_work+0x370/0x370
[598398.679419]  ? kthread_park+0xb0/0xb0
[598398.679954]  ret_from_fork+0x35/0x40
[598398.680451] Modules linked in: 8021q garp stp llc tcp_diag inet_diag sunrpc intel_rapl_msr intel_rapl_common iosf_mbi mousedev hid_generic isst_if_common psmouse pvpanic nfit button usbhid uhci_hcd ehci_pci ehci_hcd cirrus
[598398.683106] CR2: 0000000000000000
[598398.683580] ---[ end trace c60ddcb70b40a540 ]---

问题原因

EXT4文件系统删除日志数据的inode过程中,与JBD2事务提交流程之间存在一个竞态条件,可能导致use-after-free的问题,引起系统宕机。

解决方案

说明
  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

当遇到该问题时,您可以参考以下方案处理:

  1. 登录ECS实例,详情请参见连接方式概述

  2. 执行以下命令,确认系统内核版本适用此方案。

    uname -r

    系统显示类似如下。

    4.19.91-19.1.al7.x86_64
  3. 请根据系统内核版本,选择以下对应的解决方法:

    • 4.19.91-19.1.al7.x86_64(不含)之前的版本

      1. 执行以下命令,将操作系统版本更新至最新的内核版本。

        yum update kernel
      2. 更新内核版本之后,需重启生效,请执行以下命令,重启服务器。

        reboot
      3. 若最新内核版本的操作系统同样存在该问题,请执行以下步骤,更新内核热补丁。

    • 对于4.19.91-19.1.al7.x86_64(包含)到4.19.91-23.al7.x86_64(包含)之间的版本,可通过安装内核热补丁解决,安装命令如下。

      yum install -y kernel-hotfix-5260815-`uname -r | awk -F"-" '{print $NF}'`