[排错] Linux 解决日志里报错 “kernel: [829455.595333][ C10] critical target error, dev sda, sector 104056241 op 0x3:(DISCARD) ……”

报错代码:

kernel: [829455.595333][ C10] critical target error, dev sda, sector 104056241 op 0x3:(DISCARD) ......

分析:

如果是在 VMware 上运行的虚拟机在日志里出现 critical target error 此类报错,尤其是涉及到 DISCARD 操作的错误,通常是由 VMware 进行硬盘垃圾空间回收或者进行硬盘优化造成的。

解决方法:

VMware 的控制平台上,检查宿主机的硬盘是否正常。若不正常则修复或者更换硬盘。

Several situations of Linux automatically reboot without reboot logs in the /var/log/messages

Situation One

This Linux server is a virtual server. If we reboot it though its virtual software, there is no relevant logs in the /var/log/messages.

Situation Two

This Linux server is a member of a pacemaker cluster. If the pacemaker cluster software fences this server for protecting the whole cluster, there is no relate logs in the /var/log/messages.

Situation Three

This Linux server has critical problems in its system or hardware. Core panic of Linux and hardware problem both can reboot the system automatically without any reboot logs in the /var/log/messages.

[内容] Linux 是 BIOS 启动模式还是 UEFI 启动模式的判断

内容一:Linux 判断是 BIOS 启动模式还是 UEFI 启动模式的原理

系统的的启动模式分为 BIOS 启动模式和 UEFI 启动模式两种 (截止到本文发表时)。如果 Linux 是使用的 UEFI 启动模式,则系统里会有 /sys/firmware/efi 文件,若没有此文件的话则代表系统的启动模式为 BIOS。

内容二:Linux 判断是 BIOS 启动模式还是 UEFI 启动模式的方法

# [ -d /sys/firmware/efi ] && echo 'The boot is UEFI' || echo 'The boot is BIOS'

补充:BIOS 启动模式和 UEFI 启动模式的特点

UEFI (Unified Extensible Firmware Interface) 是一种比 BIOS (Basic Input/Outpu System) 更新的启动方式,相比而言主要的区别是 UEFI (Unified Extensible Firmware Interface) 支持 Secure Boot。开启 Secure Boot 的系统在启动的时候更安全,但是某些杀毒软件会让开启 Secure Boot 的系统卡住。

[步骤] Linux page_owner 排查工具的使用 (记录内存的使用情况)

正文:

步骤一:查看 page_owner 是否开启

1.1 通过 dmesg 命令查看 page_owner 是否开启

# dmesg | grep page_owner
[    1.149165] page_owner is disabled

(补充:当显示此类信息时则 page_owner 没有开启)

1.2 通过 /sys/kernel/debug/ 目录查看 page_ownerr 是否开启

# ls -l /sys/kernel/debug/page_owner
ls: cannot access /sys/kernel/debug/page_owner: No such file or directory.

(补充:当 /sys/kernel/debug/page_owner 文件不存在时则 page_owner 没有开启)

步骤二:开启 page_owner

2.1 开启 page_owner

# grubby --args="page_owner=on" --update-kernel=0

(注意:开启 page_owner 会额外占用一定量的内存)

2.2 重启系统

# reboot

2.3 确认 page_owner 已经开启

2.3.1 通过 dmesg 命令确认 page_owner 是否开启
# dmesg | grep page_owner
[    0.000000] Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-425.19.2.el8_7.x86_64 root=/dev/mapper/rootvg-rootlv ro ipv6.disable=1 audit=1 audit_backlog_limit=8192 crashkernel=auto resume=/dev/mapper/rootvg-swaplv rd.lvm.lv=rootvg/rootlv rd.lvm.lv=rootvg/swaplv rhgb quiet rd.shell=0 page_owner=on
[    0.000000] Kernel command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-425.19.2.el8_7.x86_64 root=/dev/mapper/rootvg-rootlv ro ipv6.disable=1 audit=1 audit_backlog_limit=8192 crashkernel=auto resume=/dev/mapper/rootvg-swaplv rd.lvm.lv=rootvg/rootlv rd.lvm.lv=rootvg/swaplv rhgb quiet rd.shell=0 page_owner=o

(补充:当显示此类信息时则 page_owner 已经开启)

2.3.2 通过 /sys/kernel/debug/ 目录确认 page_ownerr 是否开启
# ls -l /sys/kernel/debug/page_owner
-r--------. 1 root root 0 Apr 13 14:36 /sys/kernel/debug/page_owner

(补充:当 /sys/kernel/debug/page_owner 文件存在时则 page_owner 已经开启)

步骤三:分析 page_owner 产生的记录

3.1 导出 page_owner 产生的记录

# cat /sys/kernel/debug/page_owner > page_owner_full.txt

(补充:这里以将 page_owner 产生的记录导出到名为 page_owner_full.txt 文件为例)


注意:
1) 此命令会产生体积很巨大的文件
2) 此命令会持续执行直到手动取消
3) 可以通过同时按下 “ctrl” 键和 “C” 键或者使用 kill 命令取消
4) 如果内存变化较快则可以让此命令多执行一会,反之则可以少执行一会

3.2 解析 page_owner 产生的记录

# page_owner_sort page_owner_full.txt sorted_page_owner.txt
loaded 42903
sorting ....
culling

(补充:这里以分析名为 page_owner_full.txt 的文件并将分析结果导入到 sorted_page_owner.txt 文件为例)

3.3 查看 page_owner 产生的记录

# less sorted_page_owner.txt
1 times:
Page allocated via order 0, mask 0x0(), pid 1, tgid 1 (swapper/0), ts 48952109 ns, free_ts 0 ns
PFN 4096 type Unmovable Block 8 type Unmovable Flags 0xfffffc0000100(slab|node=0|zone=1|lastcpupid=0x1fffff)
 register_early_stack+0x28/0x60
 init_page_owner+0x30/0x2d0
 kernel_init_freeable+0x13c/0x232
 kernel_init+0xa/0x108

1 times:
Page allocated via order 0, mask 0x0(), pid 1, tgid 1 (swapper/0), ts 48952566 ns, free_ts 0 ns
PFN 4097 type Unmovable Block 8 type Unmovable Flags 0xfffffc0000100(slab|node=0|zone=1|lastcpupid=0x1fffff)
 register_early_stack+0x28/0x60
 init_page_owner+0x30/0x2d0
 kernel_init_freeable+0x13c/0x232
 kernel_init+0xa/0x108
......

(补充:这里以查看名为 sorted_page_owner.txt 文件里的分析结果为例)

步骤四:关闭 page_owner

4.1 开启 page_owner

# grubby --remove-args="page_owner=on" --update-kernel=0

(注意:关闭 page_owner 会额外释放一定量的内存)

4.2 重启系统

# reboot

4.3 确认 page_owner 已关闭

4.3.1 通过 dmesg 命令确认 page_owner 是否关闭
# dmesg | grep page_owner
[    2.022585] page_owner is disabled

(补充:当显示此类信息时则 page_owner 没有开启)

4.3.2 通过 /sys/kernel/debug/ 目录确认 page_ownerr 是否关闭
# ls -l /sys/kernel/debug/page_owner
ls: cannot access '/sys/kernel/debug/page_owner': No such file or directory

(补充:当 /sys/kernel/debug/page_owner 文件不存在时则 page_owner 没有开启)

参考文献:

https://access.redhat.com/solutions/5609521