Athlon 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アップデートを検討すべきかも。