treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

RaspberryPiのsyslogがなくなった?

RaspberryPi OSをBookworm(Ver.12)にリプレイス(新規インストール)したRaspberryPi環境で思っていたのと違っていた動きがあったのでご報告します。

ログで確認したい

設置場所の電気系統で異常があったため、RaspberryPiでホストするサーバ機能に問題がなかったか調べるよう指示を受けて調べることになりました。

簡単に、電源のON/OFFとか電源断があったのなら起動が正常だったか、といった点をログファイルで確認する、ということです。

しかし、実際にログファイルを確認しようと思ったら、ん?となって操作の手を止めることになりました。

環境はRaspberryPi 3でRaspberryPi OSのBookworm(Ver.12)を新規インストールした環境が対象となります。
他にも旧版からのアップグレードをしたRaspberryPi OSがありますが、今回の対象は新規インストールしたRaspberryPiとなります。

ログファイルに変化があったので戸惑う

確認しようとすると、</var/log/syslog>は存在しておらず、dmesgコマンドで表示されるmessagesファイルも存在していませんでした。

いつも(旧RaspberryPi OSから)アップグレードを重ねてきたRaspberryPiでは、

cat /var/log/syslog

でsyslogが確認できていましたし、現在もできます。ただコマンドdmesgは動作してシステムクロックベースで起動時の状況を確認することはできました。でもsyslogもmessagesもないのに、dmesgコマンドはどこからデータを引っ張ってきているんでしょうか?

調べてみる

ちょっと調べてみたところRaspberryPiフォーラムの中にそれらしい記述がありました。

Missing syslog file - Raspberry Pi Forums

ここにRaspberryPi OS Bookwormを新規インストールで構成したユーザがsyslogがないよ、という趣旨の書込みをしています。それに対して、Debianの変更点であるsyslogファイルはjournalに置き換えになったよ、という感じの記述が見て取れます。

syslogは「journal」に置き換えとなっているとのこと、確かに/var/log 配下には「journal」ディレクトリが用意されていました。

その配下にはいくつかのファイルが保存されています。

--------------------------------------------------------------
root@hostname:/var/log/journal/f735f443902e42b88c773e6798fab20e# ls -la
合計 189352
drwxr-sr-x+ 2 root systemd-journal     4096 12月 18 16:17 .
drwxr-sr-x+ 3 root systemd-journal     4096 12月 11  2023 ..
-rw-r-----+ 1 root systemd-journal  8388608 12月 25 11:54 system.journal
-rw-r-----+ 1 root systemd-journal  8388608  2月 11  2024 system@000611125e51664c-a0935275cbffb505.journal~
-rw-r-----+ 1 root systemd-journal  8180808 11月 18 05:17 system@8bf22a34c228440cb834fd819db02411-000000000001165b-000624bcc40488ab.journal
-rw-r-----+ 1 root systemd-journal  8388608 12月 25 11:54 user-1001.journal
-rw-r-----+ 1 root systemd-journal  3801744 12月 18 16:17 user-1001@8f0f0b2d97d44a23afa37f30bfe4319c-0000000000013602-0006273eb4d73795.journal
-rw-r-----+ 1 root systemd-journal  4108008  3月 19  2024 user-1001@a08256a869fd4bb69bf30dca46b35b7d-0000000000000e55-00061114237365b7.journal
--------------------------------------------------------------

じゃあ、このファイルを閲覧すればいいのかというと、どうもこのjournal配下のファイルはバイナリ形式らしく、そのまま閲覧は出来ないようです。

※参考:Debian GNU/Linux 公式:The system message
https://www.debian.org/doc/manuals/debian-reference/ch03.en.html

ここの記述を抜粋します。

--------------------------------------------------------------

systemd では、カーネル メッセージとシステム メッセージの両方が、ジャーナル サービス systemd-journald.service (別名 journald) によって、「/var/log/journal」の下の永続バイナリ データまたは「/run/log/journal/」の下の揮発性バイナリ データに記録されます。これらのバイナリ ログ データには、journalctl(1) コマンドでアクセスできます。たとえば、最後のブートからのログを表示するには、次のようにします。

(中略)

systemd では、システム ログ ユーティリティ rsyslogd(8) をアンインストールできます。インストールすると、その動作が変更され、揮発性のバイナリ ログ データ (systemd 以前のデフォルトの "/dev/log" ではなく) が読み取られ、従来の永続的な ASCII システム ログ データが作成されます。これは、ログ ファイルと画面上の表示の両方について、"/etc/default/rsyslog" と "/etc/rsyslog.conf" でカスタマイズできます。 rsyslogd(8)およびrsyslog.conf(5)を参照してください。また、セクション9.3.2「ログアナライザ」も参照してください。

--------------------------------------------------------------

journalctlコマンドでバイナリ形式のファイルを閲覧する、ということらしい。今までテキスト形式のsyslogをcatで閲覧していましたが、これからはログの確認にはバイナリ形式のファイルを閲覧するためにjournalctlコマンドを使う必要があるようです。

基本的なコマンドは

$ journalctl -b

ここに、閲覧したいログの種類をオプションで付加します。

システムサービスとカーネルのログ表示には、

journalctl -b --system

と入力、現在のユーザサービスのログを表示する方法は、

journalctl -b --user

と言った具合に、-b オプションのあとに、ログの種類を指定して閲覧できるようです。

やってみる

journalで取得されたログファイルの中身はバイナリなので、journalctlコマンドで読み出す必要がある、ということが分かりました。さっそくやってみました。

単純に以前のsyslogと同じようにログ全体を表示するにはjournalctlコマンドを単体で実行します。catと同様に

# journalctl | less

と、「 | less」を付加してページごとに画面表示できます。最初から中身を順に画面表示するだけなら「journalctl」コマンドだけでいいみたいです。

また、syslogでやっていたようにgrepで抽出も当然可能になっています。

# journalctl | grep dev

とか

# journalctl | grep "/dev/mmcblk0p2"

などで、特定の文字列を含む行を抽出することも可能です。

Debianの公式に記述のあった、

# journalctl -b --system

と実行すると、syslogっぽい感じでシステム関連の動作ログが一覧で表示されます。このオプション「-b」を使ったときは、末尾に「 | less」を付けなくても、画面の表示一杯でページごとに表示が止まりました。

この他に、いつもは「tail -f /var/log/syslog」でログのリアルタイム表示をしていた場合、journalctlコマンドもこの「-f」オプションでリアルタム表示ができます。

# journalctl -f

とすれば、ログがリアルタイムで画面に更新されていくので「Ctrl+C」を押下するまで画面でログの表示を確認することができます。

システムに限るログをリアルタイムで確認する(「tail -f /var/log/syslog」相当)は、

# journalctl -f -b --system

としても良いかもしれません。

ひとまず、ここまでの操作で確認したい情報は確認できたため、journalctlコマンドを調べるのはまた後日とすることにしました。

syslogは手動で追加、アップグレードの場合は、

syslogは既に過去のもの、ということを実感した今回の調査でした。

ファイルベースでログを記録していくsyslogの問題に指摘があったことは知っていましたが、Bookworm(Debian 12)でこの入替えが発生していたのはアップグレード時の調査でも見落としていたので、新しい発見となりました。

アップグレードだと旧syslogが有効なまま動作しているので気に留めなかったのですが、アップグレードで動作しているRaspberryPi(RaspberryPi OS 12 Bookwormのもの)を確認してみたところ、「/var/log/syslog」の存在も「/var/log/messages」ファイルの存在も確認出来ました。さらに「/var/log/journal」配下にジャーナルログ(バイナリ)ファイルも格納されていることが確認できましたので、二重でログを取得するという動作をしているようです。

さらにjournalctlコマンドは自身で絞り込みや検索の機能も有しているので、journalctlコマンド単体でログの閲覧に様々な工夫ができそうなので、もう少し調べてみると新しい発見がありそうです。