更新时间:2024-10-16 GMT+08:00

配置操作系统dump

操作场景

云服务器的操作系统在运行过程中如果出现故障,可能导致系统崩溃,例如操作系统蓝屏或死机。在这种情况下,如果使用操作系统dump,系统会将内存中的数据以存储文件的形式进行保存,以便于进行云服务器的故障定位和问题分析。

本文介绍如何配置操作系统dump的方法。

背景知识

操作系统dump,即内核转储或崩溃转储,是当云服务器系统运行出现异常时,对操作系统内存数据的实时完整备份。

操作系统dump功能主要利用操作系统内核对硬件异常的处理能力。操作系统内核可以监测到硬件异常,并根据异常的类型来决定处理方式。当系统遇到无法处理的异常或错误时,系统的部分或全部运行状态信息将会转储到磁盘上,这些状态信息包括:CPU的寄存器、物理内存、进程状态、文件系统状态、硬件设备状态等。

操作系统dump可以由以下几种方式触发:

  • 系统崩溃:当操作系统遇到无法处理的异常或错误时,例如非法的内存访问、内核panic等,系统会自动触发dump。
  • 手动触发:系统管理员也可以通过一些命令或者操作手动触发系统dump,例如在Linux系统中可以通过向/proc/sysrq-trigger写入c字符来触发系统dump。
  • 计划触发:某些情况下,系统管理员为了获取系统的某一时刻的运行状态信息,或者模拟系统崩溃的情况,也可以设置在某一特定的时间触发系统dump。

在多数情况下,为了准确获得系统dump,需要对系统进行相关的配置,例如在Linux系统中,需要配置kdump服务等。本文主要介绍手动触发dump的操作指导。

约束与限制

  • 执行操作系统dump会重启云服务器,请提前做好业务备份,避免数据丢失。
  • 鲲鹏架构的云服务器不支持操作系统dump。
  • 支持运行中、关机和故障状态的云服务器进行操作系统dump。
  • 仅支持对4vCPUs,8GiB内存以上规格的ECS使用操作系统dump功能。
  • 预留内存需大于ECS规格的内存。

配置操作系统dump(Windows)

本文以Windows Server 2016版本操作系统为例进行介绍,更多版本的操作,请参考对应操作系统官网帮助文档。

  1. 远程登录云服务器
  2. 在“控制面板中,打开“系统 > 高级系统配置”。
    图1 高级系统配置
  3. 在“系统属性”的“性能”区域,单击“设置”。
  4. 在“高级”页签的“虚拟内存”区域,单击“更改”。
    图2 性能选项设置
  5. 在“虚拟内存”页面,勾选“自动管理所有驱动器的分页文件大小”。
    图3 虚拟内存设置
  6. 单击“确定”,完成虚拟内存设置。
  7. 在“系统属性”的“启动和故障恢复”区域,单击“设置”。
  8. 设置参数。
    • 写入调试信息:设置为“完全内存转储”。
    • 转储文件:可以将路径从“%SystemRoot%\Memory.dmp”更改为指向具有足够磁盘空间的本地驱动器,例如“E:\Memory.dmp”。
    图4 启动和故障恢复设置
  9. 单击“确定”。
  10. 重启云服务器,完成配置。

配置操作系统dump(Linux)

本文以CentOS 7.5版本操作系统为例进行介绍,更多版本的操作,请参考对应操作系统官网帮助文档。

  1. 远程登录云服务器
  2. 执行以下命令,安装kexec-tools。

    yum install kexec-tools

  3. 执行以下命令,查看crashkernel预留内存大小。

    cat /etc/default/grub

    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT="console"
    GRUB_CMDLINE_LINUX="net.ifnames=0 consoleblank=600 console=tty0 console=ttyS0,115200n8 spectre_v2=off nopti crashkernel=auto  "
    GRUB_DISABLE_RECOVERY="true"
  4. 执行以下命令,设置crashkernel的大小。

    vim /etc/default/grub

    当前crashkernel预留内存大小为“auto”,您可以在“GRUB_CMDLINE_LINUX”字段,修改“crashkernel”的值,设置crashkernel的大小。

    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT="console"
    GRUB_CMDLINE_LINUX="net.ifnames=0 consoleblank=600 console=tty0 console=ttyS0,115200n8 spectre_v2=off nopti crashkernel=256M"
    GRUB_DISABLE_RECOVERY="true"

    您可以根据系统架构决定crashkernel预留内存大小,过小会导致生成coredump文件失败。

    当前示例的系统内存是1GiB,预留内存设置为256M。

  5. 执行以下命令,重新生成grub配置文件。

    grub2-mkconfig -o /boot/grub2/grub.cfg

  6. 执行以下命令,编辑内核参数文件/etc/sysctl.conf。

    vim /etc/sysctl.conf

    在/etc/sysctl.conf配置文件中增加以下参数,以便于在收到NMI时将操作系统切换到应急模式,并生成内存转储。

    kernel.panic_on_unrecovered_nmi=1
    kernel.unknown_nmi_panic=1
  7. 重启系统。

    reboot

  8. 执行以下命令,修改kdump默认配置/etc/kdump.conf。

    vim /etc/kdump.conf

    #指定coredump文件存储位置
    path /var/crash
    #增加-c参数,代表压缩coredump文件
    core_collector makedumpfile -c -l --message-level 1 -d 31
    #生成coredump后,重启系统
    default reboot
  9. 执行以下命令,开启kdump服务并设置开机自启动。

    systemctl start kdump.service

    systemctl enable kdump.service

  10. 执行以下命令,检查kdump是否开启成功。

    service kdump status

    Redirecting to /bin/systemctl status kdump.service
    ● kdump.service - Crash recovery kernel arming
       Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
       Active: active (exited) since Wed 2024-05-22 21:19:47 CST; 11min ago
     Main PID: 591 (code=exited, status=0/SUCCESS)
       CGroup: /system.slice/kdump.service

    systemctl is-active kdump.service

    active

触发操作系统dump

  1. 登录管理控制台。
  2. 单击管理控制台左上角的,选择区域和项目。
  3. 单击“”,选择“计算 > 弹性云服务器”。
  4. 弹性云服务器列表的“操作”列,单击“更多 > 故障排查 > 触发操作系统dump”。
  5. 了解风险须知后,勾选已知晓风险的提示。
  6. 单击“确定”,完成触发操作系统dump。