一台运行CentOS 7的物理服务器,启用了logwatch服务每天分析系统日志和发送邮件给管理员。
笔者:国际认证信息系统审计师、软考系统分析师
在检查邮件内容时发现系统在启动时,会产生如下的疑似错误信息:
1WARNING: Kernel Errors Present
2ACPI Error: Method parse/ex ...: 2 Time(s)
3ACPI Error: No handler for ...: 1 Time(s)
4ACPI Error: Region IPMI (ID ...: 1 Time(s)
5BERT: Boot Error Record Table sup ...: 1 Time(s)
6bnxt_en 0000:3b:00.0: bnxt_re: probe error: RoCE is not sup ...: 1 Time(s)
7bnxt_en 0000:3b:00.1: bnxt_re: probe error: RoCE is not sup ...: 1 Time(s)
服务器本身运行正常,但本着不放过的态度,于是对以上错误信息进行挖掘。
由于logwatch服务给出的是摘要信息,需要检查日志的具体内容:
[root@SERVER ~]# grep "ACPI Error" /var/log/messages
Dec 6 23:25:01 SERVER kernel: ACPI Error: No handler for Region [SYSI] (ffff90fb6c9dd798) [IPMI] (20130517/evregion-162)
Dec 6 23:25:01 SERVER kernel: ACPI Error: Region IPMI (ID=7) has no handler (20130517/exfldio-305)
Dec 6 23:25:01 SERVER kernel: ACPI Error: Method parse/execution failed [\_SB_.PMI0._GHL] (Node ffff90fb6c97e6f0), AE_NOT_EXIST (20130517/psparse-536)
Dec 6 23:25:01 SERVER kernel: ACPI Error: Method parse/execution failed [\_SB_.PMI0._PMC] (Node ffff90fb6c97e630), AE_NOT_EXIST (20130517/psparse-536)
出错日志显示是IPMI没有ACPI驱动支持。关于ACPI:高级配置和电源管理接口以及IPMI:智能平台管理接口这里不详细解释,简单说就是用于计算机的硬件管理用途。
这个IPMI缺ACPI驱动,属于内核模块问题。于是找到下面这个相关的内核BUG报告:
按里面的讨论,解决问题的办法有两种:1、简单地禁用acpi_power_meter内核模块;2、调整模块加载顺序,先加载ipmi_si,再加载acpi_power_meter。
觉得应该是后者比较科学,但需要进行测试。测试过程也不复杂,就是先卸载acpi_power_meter和ipmi_is模块,然后按先ipmi_si再acpi_power_meter的顺序加载模块,期间检查系统日志输出,如果加载acpi_power_meter模块时还是出现原来的错误提示,那么就是不支持,只能禁用。
于是开两个PUTTY窗口,一个窗口操作,另一个窗口执行
[root@SERVER log]# tail -f /var/log/messages
持续观察日志输出。下面的测试过程为了方便阅读,已经把日志输出内容整合到测试过程中了:
(1)检查确认当前环境内核模块是否有加载
[root@SERVER log]# lsmod | grep acpi
acpi_power_meter 18104 0
[root@SERVER log]# lsmod | grep ipmi
ipmi_ssif 29595 0
ipmi_si 59965 0
ipmi_devintf 17459 0
ipmi_msghandler 56728 3 ipmi_ssif,ipmi_devintf,ipmi_si
(2)卸载模块,检查卸载结果,确认已经卸载
[root@SERVER log]# modprobe -r acpi_power_meter
[root@SERVER log]# modprobe -r ipmi_si
[root@SERVER log]# lsmod | grep acpi
[root@SERVER log]# lsmod | grep ipmi
ipmi_ssif 29595 0
ipmi_devintf 17459 0
ipmi_msghandler 56728 2 ipmi_ssif,ipmi_devintf
(3)按设定的顺序,先加载模块ipmi_si,观察系统日志输出
[root@SERVER log]# modprobe ipmi_si
日志输出:
Dec 11 18:01:37 SERVER kernel: ipmi_si: IPMI System Interface driver
Dec 11 18:01:37 SERVER kernel: ipmi_si dmi-ipmi-si.0: probing via SMBIOS
Dec 11 18:01:37 SERVER kernel: ipmi_platform: ipmi_si: SMBIOS: io 0xca8 regsize 1 spacing 4 irq 10
Dec 11 18:01:37 SERVER kernel: ipmi_si: Adding SMBIOS-specified kcs state machine
Dec 11 18:01:37 SERVER kernel: ipmi_si: Trying SMBIOS-specified kcs state machine at i/o address 0xca8, slave address 0x20, irq 10
Dec 11 18:01:37 SERVER kernel: ipmi_si dmi-ipmi-si.0: The BMC does not support setting the recv irq bit, compensating, but the BMC needs to be fixed.
Dec 11 18:01:37 SERVER kernel: ipmi_si dmi-ipmi-si.0: Using irq 10
Dec 11 18:01:37 SERVER kernel: ipmi_si dmi-ipmi-si.0: Found new BMC (man_id: 0x0002a2, prod_id: 0x0100, dev_id: 0x20)
Dec 11 18:01:37 SERVER kernel: ipmi_si dmi-ipmi-si.0: IPMI kcs interface initialized
[root@SERVER log]# lsmod | grep ipmi
ipmi_si 59965 0
ipmi_ssif 29595 0
ipmi_devintf 17459 0
ipmi_msghandler 56728 3 ipmi_ssif,ipmi_devintf,ipmi_si
从输出看,正常加载了。
(4)再加载模块acpi_power_meter
[root@SERVER log]# modprobe acpi_power_meter
日志输出:
Dec 11 18:01:57 SERVER kernel: ACPI Error: No handler for Region [SYSI] (ffff9eb7bb09e870) [IPMI] (20130517/evregion-162)
Dec 11 18:01:57 SERVER kernel: ACPI Error: Region IPMI (ID=7) has no handler (20130517/exfldio-305)
Dec 11 18:01:57 SERVER kernel: ACPI Error: Method parse/execution failed [\_SB_.PMI0._GHL] (Node ffff9eb7bb063600), AE_NOT_EXIST (20130517/psparse-536)
Dec 11 18:01:57 SERVER kernel: ACPI Error: Method parse/execution failed [\_SB_.PMI0._PMC] (Node ffff9eb7bb063540), AE_NOT_EXIST (20130517/psparse-536)
Dec 11 18:01:57 SERVER kernel: ACPI Exception: AE_NOT_EXIST, Evaluating _PMC (20130517/power_meter-753)
[root@SERVER log]# lsmod | grep acpi_power_meter
acpi_power_meter 18104 0
很显然,模块能加载,但错误信息依旧出现,于是继续找资料。
除了停用acpi_power_meter这个内核模块并黑名单之的处理办法外,还应该在加载ipmp_si模块后,加载acpi_ipmi模块,也就是实际上是用acpi_ipmi模块取代acpi_power_meter模块。于是进行测试:
[root@SERVER ~]# modprobe -r acpi_power_meter
[root@SERVER ~]# lsmod | grep acpi
acpi_pad 116316 0
[root@SERVER ~]# modprobe acpi_ipmi
[root@SERVER ~]# lsmod | grep acpi
acpi_ipmi 13066 0
ipmi_msghandler 56728 4 ipmi_ssif,acpi_ipmi,ipmi_devintf,ipmi_si
acpi_pad 116316 0
观察系统日志没有错误输出,估计是这样处理才对。于是:
(1)添加acpi_ipmi模块加载设置,添加后具体设置应如下:
[root@SERVER /]# ll /etc/sysconfig/modules/acpi_ipmi.modules
-rwxr-xr-x. 1 root root 124 12月 7 16:30 /etc/sysconfig/modules/acpi_ipmi.modules
[root@SERVER /]# ls -Z /etc/sysconfig/modules/acpi_ipmi.modules
-rwxr-xr-x. root root system_u:object_r:etc_t:s0 /etc/sysconfig/modules/acpi_ipmi.modules
[root@SERVER /]# cat /etc/sysconfig/modules/acpi_ipmi.modules
#!/bin/sh
/sbin/modinfo -F filename acpi_ipmi > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe acpi_ipmi
fi
(2)黑名单acpi_power_meter模块:
[root@SERVER ~]# ll /etc/modprobe.d/acpi_power_meter-backlist.conf
-rw-r--r--. 1 root root 28 12月 11 22:53 /etc/modprobe.d/acpi_power_meter-backlist.conf
[root@SERVER ~]# ls -Z /etc/modprobe.d/acpi_power_meter-backlist.conf
-rw-r--r--. root root system_u:object_r:modules_conf_t:s0 /etc/modprobe.d/acpi_power_meter-backlist.conf
[root@SERVER ~]# cat /etc/modprobe.d/acpi_power_meter-backlist.conf
blacklist acpi_power_meter
后来再查资料,也有说由于只是发行版内核版本没跟上硬件升级,不支持ACPI 4.0规范,但由于不会有实际功能损失,所以也可以直接忽略这一出错信息。
我觉得,是否忽略,实际取决于系统管理员有无洁癖了。
看看详细的日志信息:
[root@SERVER ~]# grep "BERT" /var/log/messages
Dec 6 23:24:52 KDSYS kernel: ACPI: BERT 000000006fc0e000 00030 (v01 DELL PE_SC3 00000002 DELL 00000001)
Dec 6 23:24:52 KDSYS kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
然后关键字BERT找到这篇说明:
升级到RHEL 7.9之后,系统启动时就会出现关于BERT的提示信息。BERT是APEI(ACPI Platform Error Interface,ACPI 平台错误接口)的一张表,可以使固件向操作系统报告在操作系统启动之前发生的硬件错误。
这个功能是从RHEL 7.9开始提供的,但默认禁用。更详细的信息可以参考以下核心补丁提交记录:
如果系统支持BERT,驱动也启用了,就可以查看到以下的虚拟设备文件:
/sys/firmware/acpi/tables/data/BERT
既然如此,那么就启用BERT。方法就是增加内核启动参数bert_enabled,过程是: (1)修改/etc/sysconfig/grub配置文件,对GRUB_CMDLINE_LINUX参数加入bert_enabled; (2)重新生成GRUB启动配置。
修改内容和配置过程如下:
[root@SERVER ~]# grep bert_enabled /etc/sysconfig/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet bert_enabled"
[root@SERVER ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.80.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.80.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.76.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.76.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.66.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.66.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.62.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.62.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-775c5564b74843a4a091c4f21ea74959
Found initrd image: /boot/initramfs-0-rescue-775c5564b74843a4a091c4f21ea74959.img
done
这个问题解决得比较简单。
也是先看看详细的信息:
[root@SERVER ~]# grep "bnxt_en" /var/log/messages
Dec 6 23:24:53 KDSYS kernel: Broadcom NetXtreme-C/E driver bnxt_en v1.10.0
Dec 6 23:24:53 KDSYS kernel: bnxt_en 0000:3b:00.0 eth0: Broadcom BCM57412 NetXtreme-E 10Gb Ethernet found at mem ab210000, node addr b0:26:28:5f:8b:d0
Dec 6 23:24:53 KDSYS kernel: bnxt_en 0000:3b:00.0: 63.008 Gb/s available PCIe bandwidth (8 GT/s x8 link)
Dec 6 23:24:53 KDSYS kernel: bnxt_en 0000:3b:00.1 eth3: Broadcom BCM57412 NetXtreme-E 10Gb Ethernet found at mem ab200000, node addr b0:26:28:5f:8b:d1
Dec 6 23:24:53 KDSYS kernel: bnxt_en 0000:3b:00.1: 63.008 Gb/s available PCIe bandwidth (8 GT/s x8 link)
Dec 6 23:25:01 KDSYS kernel: bnxt_en 0000:3b:00.0: bnxt_re: probe error: RoCE is not supported on this device
Dec 6 23:25:01 KDSYS kernel: bnxt_en 0000:3b:00.1: bnxt_re: probe error: RoCE is not supported on this device
[root@SERVER ~]# lspci | grep 3b
3b:00.0 Ethernet controller: Broadcom Inc. and subsidiaries BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (rev 01)
3b:00.1 Ethernet controller: Broadcom Inc. and subsidiaries BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (rev 01)
是和服务器上的万兆网卡有关的情况。
RoCE是RDMA over Converged Ethernet的缩写,而RDMA是Remote Direct Memory Access,远程直接内存访问,一种为了能在主机之间加大网络吞吐量而实现的技术。RoCE即基于以太网实现的 RDMA。
RoCE支持在标准以太网基础设施上使用RDMA技术,但是需要交换机支持无损以太网传输,以及需要服务器使用 RoCE 网卡。
RoCE 与 InfiniBand 技术有相同的软件应用层及传输控制层,仅网络层及以太网链路层存在差异。应用 RoCE 可以使得基于以太网的数据传输能够达到以下效果:
• 提高数据传输吞吐量。 • 减少网络延时。 • 降低 CPU 负载。
OK,本文不打算在RoCE上继续讲解,这是另一个长篇大论的内容,而且实施起来有前提条件。和驱动相关的信息可以查看:
既然网络环境不支持部署RoCE,这个信息本质也只是一个探测结果,那么忽略掉就可以了。
总结
最后循例总结一下,我们修改了系统启动时的KERNEL参数,调整加载acpi_ipmi模块并禁用了acpi_power_meter模块。那么重启服务器后再检查日志,相关信息就不再出现了。
本期题图:作品由无界版图AI绘制
本站微信订阅号:
本页网址二维码: