起動などが異常に遅くなってしまい、まともに使えない。対処に迫られた。

背景

私はラズパイをメインメインマシンとして使っている。2016年の3Bだった頃から。今は4Bだが、それでもだいたい半年に一回はクラッシュなどのトラブルにみまわれ、OS再インストールさせられる。「またか」という印象。

経緯

おそらく電源のせい。ラズパイ4Bから5V電圧の電源でないと動作しなくなった。ちゃんと5V電圧を使っているのだが、すでに3つ目。まともな電源がみつからない。そのせいか常に「⚡低電圧」のマークが出ていた。新しい電源にすると最初のころは出なくても2〜3ヶ月くらいしたら出てくるようになり、半年くらいで頻出し、そう遠くないうちに外付HDDの電源が落ち、ファイルシステムがやられる。今回もそうだと思われる。もうやだ。

対応

e2fsckでディスクチェックした。

  1. 問題のRaspberry PI OSが入った外付HDDをラズパイから外す
  2. 1を他のLinuxマシンにつなげる(Ubuntu 20)
  3. 自動的にマウントされる(USBを挿して少し待ったらGUI表示される)
  4. df -hで1のデバイスIDとマウントパスをみつける(rootfs,bootの2つあるはず)
  5. umount マウントパスする
  6. e2fsckでディスクチェックする
  7. 再びラズパイに接続して試す

df -hしたら次のようになった。/dev/sdc1がデバイスID、/media/acer/bootがマウントパス。

ラズパイOSはbootrootfsの2つのパーティションがあるはず。あとはディスクの容量などをヒントにあたりをつける。ほかにはディスクIDもヒントになる。sdの後ろはa,b,c,...のようなアルファベット順になる。これはふつう接続順になるようだ。なので番号がもっとも大きいものが対象と思われる。まちがっても今動作しているマシンのディスクを選ばないこと。

$ df -h
...
/dev/sdc2       917G   34G  846G   4% /media/acer/rootfs
/dev/sdc1       253M   49M  204M  20% /media/acer/boot

今回問題になったパーティションはブート側bootと思われる。が、念のため両方e2fsckでディスクチェックする。そのためにはまず全2パーティションともアンマウントする必要がある。以下コマンドで。

umount /media/acer/rootfs
umount /media/acer/boot

e2fsckコマンドでディスクチェックする。sudoがないと権限がないと怒られる。-pがないと不良セクタなど問題が見つかるたびに人が手で応答しなきゃいけない。それらに対応すると以下コマンドになる。

sudo e2fsck -p /dev/sdc1
sudo e2fsck -p /dev/sdc2

/dev/sdc1rootfs)側には問題なかった。が、案の定/dev/sdc2boot)側に問題があったようだ。次のようなログが出た。

rootfs contains a file system with errors, check forced.
rootfs: Entry '01' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 1803633.  CLEARED.
rootfs: Entry '08' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 2699641.  CLEARED.
rootfs: Entry '09' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 2827603.  CLEARED.
rootfs: Entry '0a' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 2827629.  CLEARED.
rootfs: Entry '0b' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 2958078.  CLEARED.
rootfs: Entry '0c' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 2958084.  CLEARED.
rootfs: Entry '0d' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 3216001.  CLEARED.
rootfs: Entry '0e' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 3216002.  CLEARED.
rootfs: Entry '12' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 3474761.  CLEARED.
rootfs: Entry '13' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 3474762.  CLEARED.
rootfs: Entry '14' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 3474763.  CLEARED.
rootfs: Entry '1b' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 3855386.  CLEARED.
rootfs: Entry '21' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 4115315.  CLEARED.
rootfs: Entry '22' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 4115317.  CLEARED.
rootfs: Entry '23' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 4115318.  CLEARED.
rootfs: Entry '33' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 4885637.  CLEARED.
rootfs: Entry '36' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5014253.  CLEARED.
rootfs: Entry '37' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5017811.  CLEARED.
rootfs: Entry '38' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5017812.  CLEARED.
rootfs: Entry '39' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5143740.  CLEARED.
rootfs: Entry '3a' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5143981.  CLEARED.
rootfs: Entry '3b' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5143982.  CLEARED.
rootfs: Entry '3c' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5272732.  CLEARED.
rootfs: Entry '3d' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5272735.  CLEARED.
rootfs: Entry '3e' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5272736.  CLEARED.
rootfs: Entry '3f' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5401167.  CLEARED.
rootfs: Entry '40' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5401168.  CLEARED.
rootfs: Entry '41' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5401169.  CLEARED.
rootfs: Entry '42' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5532320.  CLEARED.
rootfs: Entry '4b' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5915163.  CLEARED.
rootfs: Entry '4c' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5915164.  CLEARED.
rootfs: Entry '4d' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 5915165.  CLEARED.
rootfs: Entry '60' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 6942287.  CLEARED.
rootfs: Entry '61' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 6942288.  CLEARED.
rootfs: Entry '63' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 7071541.  CLEARED.
rootfs: Entry '64' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 7071542.  CLEARED.
rootfs: Entry '65' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 7071543.  CLEARED.
rootfs: Entry '66' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 7200290.  CLEARED.
rootfs: Entry '67' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 7200291.  CLEARED.
rootfs: Entry '68' in /home/pi/.cache/??? (1803480) has 削除/unused iノード 7200292.  CLEARED.
rootfs: ディレクトリ iノード 2059452, block #0, offset 0: ディレクトリ corrupted


rootfs: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
	(i.e., without -a or -p options)

念のためもう一度かけてみる。たぶん問題ない。

$ sudo e2fsck -p /dev/sdc2
rootfs contains a file system with errors, check forced.
rootfs: ディレクトリ iノード 2059452, block #0, offset 0: ディレクトリ corrupted


rootfs: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
	(i.e., without -a or -p options)

これを再びラズパイと接続しなおして正常に起動するか試す。

治らず

まだemergencyモードで起動する。

残念でした。

どうするか

もうOS再インストールしかないのだろう。

そうなるとmpurseで作ったモナコインのアカウントはどうなるのか。

そして諸悪の根源、電源をどうするか。

これらに対応するのに何日かかるのか……orz

ああ、こんなことやりたくないのに。コード書きたいのに!💢

syslogをみる

emergencyモードのとき「journalctl -xb」でsyslogが見れると書いてあった。なので「journalctl -xb | grep error」してみた。

$ journalctl -xb | grep error
 6月 04 09:35:21 raspberrypi systemd-fsck[139]: rootfs contains a file system with errors, check forced.
 6月 04 09:37:04 raspberrypi systemd-fsck[139]: Ignoring error.
 6月 04 09:37:04 raspberrypi kernel: EXT4-fs (sda2): warning: mounting fs with errors, running e2fsck is recommended
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 336, block bitmap and bg descriptor inconsistent: 19225 vs 19223 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 352, block bitmap and bg descriptor inconsistent: 23877 vs 23875 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 368, block bitmap and bg descriptor inconsistent: 6125 vs 6123 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 400, block bitmap and bg descriptor inconsistent: 24077 vs 24075 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 432, block bitmap and bg descriptor inconsistent: 23932 vs 23929 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 448, block bitmap and bg descriptor inconsistent: 24032 vs 24029 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 464, block bitmap and bg descriptor inconsistent: 21754 vs 21751 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 480, block bitmap and bg descriptor inconsistent: 24069 vs 24066 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 512, block bitmap and bg descriptor inconsistent: 24048 vs 24045 free clusters
 6月 04 09:37:14 raspberrypi kernel: EXT4-fs error (device sda2): ext4_mb_generate_buddy:805: group 544, block bitmap and bg descriptor inconsistent: 23947 vs 23944 free clusters
 6月 04 10:05:19 raspberrypi espanso[921]: xdo_get_active_window reported an error
 6月 04 10:05:19 raspberrypi espanso[921]: xdo_get_active_window reported an error
 6月 04 10:05:19 raspberrypi espanso[921]: xdo_get_active_window reported an error
 6月 04 10:05:24 raspberrypi kernel: v3d fec00000.v3d: MMU error from client L2T (0) at 0x4821000, pte invalid
 6月 04 10:07:52 raspberrypi kernel: EXT4-fs (sda2): error count since last fsck: 81
 6月 04 10:07:52 raspberrypi kernel: EXT4-fs (sda2): initial error at time 1: __ext4_find_entry:1536: inode 2
 6月 04 10:07:52 raspberrypi kernel: EXT4-fs (sda2): last error at time 1654303035: ext4_mb_generate_buddy:805

タイムスタンプをみるに「10:05:19」がe2fsck対処後である。それ以前の「09:37:14」やそれより前はe2fsck前のもの。(device sda2)はHDDのデバイスID。このログが消えているのはe2fsckで対処できたからだろう。が、別の新たなエラーが出ている。

 6月 04 10:05:19 raspberrypi espanso[921]: xdo_get_active_window reported an error
 6月 04 10:05:19 raspberrypi espanso[921]: xdo_get_active_window reported an error
 6月 04 10:05:19 raspberrypi espanso[921]: xdo_get_active_window reported an error
 6月 04 10:05:24 raspberrypi kernel: v3d fec00000.v3d: MMU error from client L2T (0) at 0x4821000, pte invalid
 6月 04 10:07:52 raspberrypi kernel: EXT4-fs (sda2): error count since last fsck: 81
 6月 04 10:07:52 raspberrypi kernel: EXT4-fs (sda2): initial error at time 1: __ext4_find_entry:1536: inode 2
 6月 04 10:07:52 raspberrypi kernel: EXT4-fs (sda2): last error at time 1654303035: ext4_mb_generate_buddy:805

espansoはテキストエクスパンダ―というたぐいのアプリ。これはいい。

問題はkernelのほうだ。EXT4-fs (sda2)。またしてもディスク。どうしたらいいんだ。たぶんファイルシステムext4において、所定のノードがみつからないと怒っているのだろう。知らんがな。私はe2fsckをかけただけ。悪いのはe2fsckだろ? どうしろというんだ。

翌日

とりあえず状況整理。

  1. 電源不良により低電圧モードになり外付HDDの電源が落ちてシステムが破損したっぽい
  2. emergencyモードで起動するようになった
  3. e2fsckでディスクチェックするも変わらず
  4. モナレッジの記事投稿ができない tweet
  5. ローカルサーバが起動しない
  6. もうダメポ

本当はちゃんと原因究明したかったのだが、おそらくあまり意味がない。ファイルの書込中に電源断されたせいで何かがどうにかなっちゃった。くらいの認識。半年に一回はこうなるのでいいかげん、どうにかしたいのだが。

rootfsをまっさらなときのものに書き換えれば回復するかもしれないが、中途半端なことをやっても別の不具合にみまわれる恐れがある。なのでもう、いつものようにOSのクリーン・インストールすることにした。進歩がなくて悔しいが、これ以上時間をとられたくもない。ただでさえ環境の再構築に時間がかかるのに。

とりあえずこの記事が投稿できていれば、それができるくらいには復旧できたはず。あとは開発環境とか諸々。もう困ったときにやろう。覚えてないし。