FreeBSD: ACPI Error: Method parse/execution failed が出る

Athlong XPボードから、サーバー引っ越しが完了。引っ越し先は新規ハードウェアで、Intel D945GCLF2 Atom330 CPUの Mini ITXボードです。

このマザーボード、PCIスロットにNICを差しているためか、kernel が Console へメッセージを吐きます。メッセージは、以下の繰り返し。頻繁に出力されるので、messages がすぐにいっぱいになり、ローテートされ、重要なメッセージが記録されているかも知れないのに、電子の藻屑となって消えて行きます。

Jan 15 22:14:15 www kernel: ACPI Error: Method parse/execution failed [\_SB.PCI0.LPC.SMBR] (Node 0xfffff800026b7540), AE_AML_INFINITE_LOOP (20160527/psparse-559)
Jan 15 22:14:16 www kernel: ACPI Error: Method parse/execution failed [\_SB.PCI0.LPC.INIT] (Node 0xfffff800026b7580), AE_AML_INFINITE_LOOP (20160527/psparse-559)
Jan 15 22:14:16 www kernel: ACPI Error: Method parse/execution failed [\_GPE._L00] (Node 0xfffff80002638e00),AE_AML_INFINITE_LOOP (20160527/psparse-559)
Jan 15 22:14:16 www kernel: ACPI Exception: AE_AML_INFINITE_LOOP, while evaluating GPE method [_L00] (20160527/evgpe-622)
Jan 15 22:14:20 www kernel: ACPI Error: Method parse/execution failed [\_SB.PCI0.LPC.SMBR] (Node 0xfffff800026b7540), AE_AML_INFINITE_LOOP (20160527/psparse-559) 
Jan 15 22:14:20 www kernel: ACPI Error: Method parse/execution failed [\_SB.PCI0.LPC.INIT] (Node 0xfffff800026b7580), AE_AML_INFINITE_LOOP (20160527/psparse-559)
Jan 15 22:14:20 www kernel: ACPI Error: Method parse/execution failed [\_GPE._L00] (Node 0xfffff80002638e00),AE_AML_INFINITE_LOOP (20160527/psparse-559)
Jan 15 22:14:20 www kernel: ACPI Exception: AE_AML_INFINITE_LOOP, while evaluating GPE method [_L00] (20160527/evgpe-622)

PCIへNICを差していない時は気にならなかったので、PCI NICのせいと推測しますが、定かではありません。

エラーメッセージをWeb検索してみると、

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=139088

が見つかりました。Webページの情報にはボード型番にタイプミスがあるようですが、おそらく同じボード。私が使っているボードに依存する問題?
この他にも検索結果を読んでみたところ、ACPIが出しているメッセージで、Linuxでも報告されています。
また、Intel D945GCLF2 にレポートが集中していて、どうも Intel BIOSのバグのよう。FreeBSDでは、メッセージが大量に出力されるので /var/log/message が肥大化してしまうという問題がありますが、OSのその他の動きにはほぼ影響無くサービス停止に追い込まれる訳でもなさそう。iftop がcoreを吐いて落ちるという現象が観察されていますが、これが原因かどうかは調査していません。
また、Intel のダウンロードページから、BIOS 0278 をダウンロードしてアップデートすれば解決しそうです。

既に運用に入ったホストなので、できることならBIOSアップデートはやりたくない。

そこで、このメッセージだけ別ファイルに捨てる事にしました。

/var/log 以下のログファイルへの出力は、/etc/syslog.conf  によりコントロールされています。

syslog.conf の書き方は、man syslog.conf と/usr/include/syslog.h を読むことにより理解できました。以下は、syslog.h の一部。

#define LOG_KERN        (0<<3)  /* kernel messages */
#define LOG_USER        (1<<3)  /* random user-level messages */
#define LOG_MAIL        (2<<3)  /* mail system */
#define LOG_DAEMON      (3<<3)  /* system daemons */
#define LOG_AUTH        (4<<3)  /* authorization messages */
#define LOG_SYSLOG      (5<<3)  /* messages generated internally by syslogd */
#define LOG_LPR         (6<<3)  /* line printer subsystem */
#define LOG_NEWS        (7<<3)  /* network news subsystem */
#define LOG_UUCP        (8<<3)  /* UUCP subsystem */
#define LOG_CRON        (9<<3)  /* clock daemon */
#define LOG_AUTHPRIV    (10<<3) /* authorization messages (private) */
                                /* Facility #10 clashes in DEC UNIX, where */
                                /* it's defined as LOG_MEGASAFE for AdvFS  */
                                /* event logging.                          */
#define LOG_FTP         (11<<3) /* ftp daemon */
#define LOG_NTP         (12<<3) /* NTP subsystem */
#define LOG_SECURITY    (13<<3) /* security subsystems (firewalling, etc.) */
#define LOG_CONSOLE     (14<<3) /* /dev/console output */

        /* other codes through 15 reserved for system use */
#define LOG_LOCAL0      (16<<3) /* reserved for local use */
#define LOG_LOCAL1      (17<<3) /* reserved for local use */
#define LOG_LOCAL2      (18<<3) /* reserved for local use */
#define LOG_LOCAL3      (19<<3) /* reserved for local use */
#define LOG_LOCAL4      (20<<3) /* reserved for local use */
#define LOG_LOCAL5      (21<<3) /* reserved for local use */
#define LOG_LOCAL6      (22<<3) /* reserved for local use */
#define LOG_LOCAL7      (23<<3) /* reserved for local use */

#define LOG_EMERG       0       /* system is unusable */
#define LOG_ALERT       1       /* action must be taken immediately */
#define LOG_CRIT        2       /* critical conditions */
#define LOG_ERR         3       /* error conditions */
#define LOG_WARNING     4       /* warning conditions */
#define LOG_NOTICE      5       /* normal but significant condition */
#define LOG_INFO        6       /* informational */
#define LOG_DEBUG       7       /* debug-level messages */

syslogメッセージは、ファシリティーと優先順位の組み合わせで決まる出力を、ファイル、コンソールなどにリダイレクトします。上記のACPI Errorメッセージは、kernel.* のいずれかであることはわかりますが、kernel.* を全部捨ててしまうと必要なメッセージも見られないことになりますので、ACPI Errorを吐いているkernel.優先順位だけを分離したいわけです。

面倒ですが、kern.debug ~ kern.emerg まで一つずつ試すしか無さそうです。
そして、ACPIエラーは、kern.crit が出していると判明しました。

ただ、次のように書くと、

kern.crit                        /dev/null

crit と emerg が含まれて、emerg も捨ててしまうことになるので駄目。
とりあえず、メッセージを捨てずにkern.crit をファイルに隔離して、kern.crit を除くkern.* を messages に書き込む記述を探しました。
特定のファシリティーと優先順位だけ取り除く記述方法があることが判明。

/etc/syslog.conf を次のように書き替えて /var/log/message へのACPI Error出力を抑制できました。

kern.=>crit                                     /var/log/kern_crit.log
*.notice;authpriv.none;lpr.info;mail.crit;kern.!=crit   /var/log/messages

/var/log 以下が荒らされることは防げたのですが、日毎レポートメールにはしっかり記録されています。ゼロにするにはもう一工夫必要ですが、今回は syslog.conf の使い方を理解したということで、ここまでにしておきます。しばらく運用して、メッセージ量に不満な場合は、BIOSアップデートを検討すべきかも。

コメントを残す