BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【RaspberryPi】【VMWareWorkstation】RaspberryPiのSDカードをWindowsで読み書きする方法

こんにちは!BFT名古屋支店の猫です。
とある事情によりRaspberry Piで使用しているSDカード内のデータを取り出す必要に迫られたのですが、意外と躓いてしまったので記事にしたいと思います

  • ラズパイで使用しているSDカードをWindows PCで読み書きしたい
  • 人の失敗談が好き

という方はぜひ読んでみてください。
結論だけ知りたい方はこちら

背景

ラズパイのOSが起動しなくなった

こんどる?というサービスでRaspberry Pi 4を使用しているのですが、ファイルの権限を変更しようとした際にディレクトリ指定を誤ってコマンドを実行してしまいました。

# 正しいコマンド
$ sudo chmod -R 644 /opt/CondorU/source/lib

# 誤ったコマンド(絶対やっちゃダメ!)
$ sudo chmod -R 644 /lib

これによりsudoコマンドは使えないわ、再起動してもOS起動できないわの大惨事に。
幸いハード面では壊れていないのでまっさらにして構築しなおすことはできます。
しかし中にはバックアップを取っていないデータが……

レスキューモードで修復を試みるも断念

始めはラズパイ内でなんとか修復できないか考えました。
社内で相談したところ、LinuxOSにはレスキューモードなるものがあり、「正常に動作するラズパイをレスキューモードで起動→修復したいSDカードをマウントして修正する」という方法があることを教えていただきました。

Linux システムバックアップリストア(xfs dump restore) - きまぐれほげほげひろば

しかしRaspbianOSのレスキューモードはすでに廃止されており、この方法は実行できませんでした。
そのため修復は諦め、データを救出してから構築しなおすことにしました。

データ救出を試みる(失敗)

Windows10にSDカードを接続する

ラズパイからmicroSDカードを引っこ抜き、SDカード変換アダプタを使用してWindows端末に挿入しました。

意外とエクスプローラで開けるんじゃ?などと高を括っていたのですが「ドライブ E: を使うにはフォーマットする必要があります。フォーマットしますか?」「このボリュームは認識可能なファイルシステムではありません」というポップアップが出てきてその妄想は崩れ去りました。

f:id:bftnagoya:20220216095647j:plain:w250   f:id:bftnagoya:20220216133401j:plain:w400
2個も出てきて怖かった

調べてみるとWindowsRaspberry Pi OSで使用しているファイルシステムが異なるため、フォーマットなしでは読み書きできないということでした。(Windows10はNFTS、Raspberry Pi OSはext4

今回は中のデータを壊さずに取り出したかったので、この方法は断念しました。

WSLにSDカードを接続する

ファイルシステムの違いによって読み込めないということが分かった私は、「WindowsがダメならWSLで読めばいいじゃない」とお上品にPowerShellを起動しました。(WSL導入についてはこちら

そしてお上品にSDカードをマウントしようとしたところ、以下のエラーが出てしまいマウントできませんでした。

PS C:\Users\name> GET-CimInstance -query "SELECT * from Win32_DiskDrive"

DeviceID           Caption                    Partitions Size         Model
--------           -------                    ---------- ----         -----
\\.\PHYSICALDRIVE0 SAMSUNG MZNLN256HAJQ-00000 4          256052966400 SAMSUNG MZNLN256HAJQ-00000
\\.\PHYSICALDRIVE1 SDXC Card                  2          63277079040  SDXC Card  ←これがマウントしたいSDカード

PS C:\Users\name> wsl --mount \\.PHYSICALDRIVE1
コマンド ライン オプションが無効です: --mount

~~
以下ヘルプ表示が続く

エラーを出してから知ったのですが、--mountオプションを使用してext4を扱えるのはWindows 11 ビルド 22000 以上のWSL2みたいです。(よい子はちゃんと調べてから実行しましょう)

docs.microsoft.com

私が使っているのはWindows 10のWSL2なのでこの方法は断念しました。

データ救出を試みる(成功!)

仮想マシンにUSBタイプのカードリーダーを接続する

最終的にこの方法でSDカードの中身を救出することができました。

(おまけ)仮想マシンにSDカードを接続する

実際にトラブルシュートした時のやり方ではないのですが、この記事を書きながら検証したら成功したのでご紹介します。 "USBタイプのカードリーダー持ってないよ!SDカード変換アダプタしかないよ!" という方はこちらの方法を試してみてください。

そもそも操作ミスをなくそう

なんとかSDカードのデータを取り出してWindowsPCに持ってくることができました。
ちょっと達成感さえ味わってしまいましたが、そもそも操作ミスをしなければやらなくてよかった話です。
反省。
今後は「自分がうっかりしやすい人間だ」ということを常に意識して、以下のような対策をデフォルトにしていきたいと思います!

  • 事前にコマンドを用意する
  • コマンドには絶対パスを使う
  • 目的のコマンドの前後に確認コマンドを実行する
  • 既存と被らないディレクトリ名/ファイル名を使う
  • 誰かに再鑑をお願いする … etc.

おわりに

ラズパイぶっ壊すのキモチェー!(嘘です)