ひょんなことから昔使っていたRaspberry Pi Zeroが出てきた。

2020年頃にMH-Z19というCO2センサーと組み合わせて二酸化炭素(CO2)濃度測定器として活用していたものだ。
かなり久しぶりに起動したので諸々アップデートしていたら、途中で誤って電源が落ちてしまった。
(最近の多ポートUSB電源は他の機器を挿すと瞬断するのを忘れていた・・・)
そしてラズパイは二度と立ち上がらなくなった・・・アップデート中に電源を落としたせいでSDカードのデータが破損してしまった様子。
ほんと余計な事をするもんじゃないな・・・
microSDカードの復旧を試みる
何とかmicroSDカードを復旧、もしくは最低でもデータは救出したい。
homeディレクトリにMH-Z19を使うためのスクリプト類を全て置いていたので、それさえ確保できれば最悪OSは捨て置いてもいい。というかセキュリティー的にも最新OSに置き換えるいいチャンスだ(ポジティブシンキング)。
まず復旧方法を探したところ、以下のサイトが参考になった。
簡単に言うと
- VMwareをインストールして仮想Linuxマシンを作成
- 仮想マシン内で破損したSDカードをマウントすることでデータを救出
という手順だ。
最近になってVMware Workstation Proが無償化されたため、下記のサイトを参考にありがたく使わせてもらうことにする。
VMware Workstation Pro が無償化されたので試してみた (1) - JBS Tech Blog
復旧手順の参考サイトではUbuntuをインストールしているが、まぁ何でもいいだろうとRaspberry Pi Desktop OSをインストールしてみた。
仮想マシン上でSDカードリーダーが認識されない
仮想マシンが出来上がったのでSDカードリーダーをUSB接続してみたが、仮想マシンのOS側で/dev/sdb1
として認識されない。
色々試す中でUbuntuもインストールしてみたがやはり認識せず。
Google検索に助けを求めた結果、カードリーダーをUSB3.1ポートに接続していたことが原因だった模様。

VMwareの「設定 -> ハードウェア -> USBコントローラ -> USBの互換性」が"USB 2.0"となっていたのを"USB 3.1"を変更したら正常に動作した。
VMware Workstation : USB接続HDDが認識されない時の対処 - rokkonet
上記のとおりに設定変更したら無事認識された。
必要なデータを取り出す
後は復旧手順どおりにマウントすればOK。
$ sudo mkdir -p /mnt/sdb1 && sudo mount /dev/sdb1 /mnt/sdb1
これでSDカードにアクセスでるようになった。

/mnt/sdb1/home/pi
の中身を丸ごとtgzに固め、VMwareの共有ディレクトリ機能を用いてホスト機(Windows)まで取り出せた。
これでファイルの救出は完了。
SDカードの復旧はできなかった
復旧手順の参考サイト通りにfsck
コマンドを叩くとsdb1のdirty bitを取り除くことはできた。

が、そのままmicroSDカードをラズパイに差し込んでも起動しなかった。
やはりSDカード自体を復旧するのは難しそうだ。残念だがこの結果は想定通り。
OSを再インストール
復旧は諦めて再構築の道を選択する。
Raspberry Pi ImagerでラズパイZero用のOSを別のmicroSDカードにインストールする(念のため元のmicroSDカードは残しておく)

いつもの癖でDesktop版(GUI)のOSを選択してしまった・・・。
ラズパイZeroは性能が低いので余計な物が入っていないLite版(CUI専用)の方がいいのだが。
ImagerでWiFiとSSHの事前設定をしておけば、インストール後そのままPCからSSHログインして操作できるのでCUI専用でも困ることはないのだ。
OSがインストールできたらmicroSDをラズパイZeroに挿入して電源を入れ、PCからSSH接続する。

まずはraspi-config
コマンドでGUIモードをオフ&I2Cを有効化し、最後に一通りアップデートする。
GUI版としてインストールしたのでパッケージが多くやたらと時間がかかった。
途中でLite版を入れ直そうかと迷ったが、ctrl+Cを押しても反応しなかったため諦めて最後まで待った。
必要なライブラリをインストールし直す
一通り更新できたら、MH-Z19用のライブラリをインストール・・・
しようと pip3 install
したのだが、error: externally-managed-environment
エラーが出てインストールできない。
先達の知恵を借り、こちらの記事を参考に --break-system-packages
オプションをつけて強行。
GPIO周りや液晶画面(ssd1306)用のパッケージ類も同様の方法でインストールし、ようやく以前のPythonスクリプトが動くようになった。
自動起動用のサービス作成
最後に、電源投入後に自動でPythonスクリプトが動きCO2濃度がディスプレイ表示されるよう設定を追加する。
Raspbianの頃にどうやって自動起動していたか覚えておらず、Raspberry Pi OS用のスタンダードな方法としてsystemdのサービスを作成することにした。
作業自体はそう難しくない。/etc/systemd/system/に新規.serviceファイルを作成し
cd /etc/systemd/system/
sudo nano co2.service
下記のように実行したいスクリプト名などを記述する。
[Unit]
Description=CO2 Monitor
After=syslog.target
[Service]
Type=simple
WorkingDirectory=/home/pi
ExecStart=python3 autorun.py
ExecStop=python3 onexit.py
StandardOutput=append:/home/pi/systemd_log.log
[Install]
WantedBy = multi-user.target
autorun.pyにはメインのCO2読取&ディスプレイ表示機能を記述し、onexit.pyはディスプレイに「service end」と表示する機能を記述(サービスが終了したことが分かるように)。
co2.serviceファイルを保存したら下記コマンドでサービスを実行してみる。
sudo systemctl start co2
下記コマンドでエラーが出ていないことを確認したら、
sudo systemctl status co2
下記コマンドで自動起動を有効にする。
sudo systemctl enable co2
試しにラズパイZeroを再起動してしばらく待つと、何も操作しなくてもCO2濃度がディスプレイ表示された。
ExecStopに記述したonexit.pyもきちんと動いているようで、再起動時にディスプレイ表示が「service end」に変わった後、CO2濃度への表示に移った。
これで自動起動の設定は完了。以前の状態にすべて復旧できた。
できればラズピコに移植したい
当時はマイコンの知識がなかったためラズパイZeroで作ったが、CO2濃度計という単一機能のためだけにZeroを使うのはオーバースペックだし、いきなり電源断できないのも使い勝手が悪い。
以前買ったラズパイPicoがいくつか余っているので、できればPicoに移植したいのだが、ケースまでしっかり作った現行版をバラすのも忍びない。
じゃあMH-Z19をもう1個買うか、とも考えたがCO2濃度計センサーを2つもこしらえてどうするんだ感も否めない。
「ラズパイPico MH-Z19」でWeb検索すれば先達の記事がたくさん見つかるため、難易度はかなり低いしやってみたくはあるのだが・・・どうしたものかなぁ。
コメントする