Raspberry PiのSDカードを壊してしまったので復旧した

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

2020年頃にMH-Z19というCO2センサーと組み合わせて二酸化炭素(CO2)濃度測定器として活用していたものだ。

かなり久しぶりに起動したので諸々アップデートしていたら、途中で誤って電源が落ちてしまった。

(最近の多ポートUSB電源は他の機器を挿すと瞬断するのを忘れていた・・・)

そしてラズパイは二度と立ち上がらなくなった・・・アップデート中に電源を落としたせいでSDカードのデータが破損してしまった様子。

ほんと余計な事をするもんじゃないな・・・

 

 

microSDカードの復旧を試みる

何とかmicroSDカードを復旧、もしくは最低でもデータは救出したい。

homeディレクトリにMH-Z19を使うためのスクリプト類を全て置いていたので、それさえ確保できれば最悪OSは捨て置いてもいい。というかセキュリティー的にも最新OSに置き換えるいいチャンスだ(ポジティブシンキング)。

まず復旧方法を探したところ、以下のサイトが参考になった。

簡単に言うと

  1. VMwareをインストールして仮想Linuxマシンを作成
  2. 仮想マシン内で破損した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ポートに接続していたことが原因だった模様。

001.png

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カードにアクセスでるようになった。

002.png

/mnt/sdb1/home/piの中身を丸ごとtgzに固め、VMwareの共有ディレクトリ機能を用いてホスト機(Windows)まで取り出せた。

これでファイルの救出は完了。

 

SDカードの復旧はできなかった

復旧手順の参考サイト通りにfsckコマンドを叩くとsdb1のdirty bitを取り除くことはできた。

003.png

が、そのままmicroSDカードをラズパイに差し込んでも起動しなかった。

やはりSDカード自体を復旧するのは難しそうだ。残念だがこの結果は想定通り。

 

OSを再インストール

復旧は諦めて再構築の道を選択する。

Raspberry Pi ImagerでラズパイZero用のOSを別のmicroSDカードにインストールする(念のため元のmicroSDカードは残しておく)

004.png

いつもの癖でDesktop版(GUI)のOSを選択してしまった・・・。

ラズパイZeroは性能が低いので余計な物が入っていないLite版(CUI専用)の方がいいのだが。

ImagerでWiFiとSSHの事前設定をしておけば、インストール後そのままPCからSSHログインして操作できるのでCUI専用でも困ることはないのだ。

OSがインストールできたらmicroSDをラズパイZeroに挿入して電源を入れ、PCからSSH接続する。

005.png

まずは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検索すれば先達の記事がたくさん見つかるため、難易度はかなり低いしやってみたくはあるのだが・・・どうしたものかなぁ。

コメントする