Raspberry PiのmicroSDのバックアップイメージのレストア

Raspberry PiのmicroSDのバックアップイメージを容量が異なる別のmircoSDにレストアする。

Raspberry PiのmicroSDのバックアップイメージのレストア

Raspberry Piのシステム用で使うmicroSDは耐久性も低いため壊れることを前提に運用するので、システムに変更が必要ないなら作成時に、変更が発生するなら定期的にmicroSDカードのイメージを作成してバックアップイメージとして保存をしています。
バックアップはddかWindowsであればWin32 Disk Imagerあたりで保存できるので問題ありません、レストア用にバックアップを取った時のmicroSDカードを用意してあるもしくは容量の大きいmicroSDにレストアするのであればこちらも問題はありません
問題になるのは表記上は同一容量(32GBとか128GBとかです)ですが実際には微妙に容量が異なる場合で、レストア先のmicroSDの容量が少しでも大きい場合には良いのですが小さい場合にレストアに失敗します。

今回はイメージを作成したmicroSDが32GBで、レストア先が16GBでしたのでそのままではレストアできないためバックアップイメージを縮小してレストアしました。

以下の作業はUbuntu Desktop 22.04.3 LTSを使用しています

実際に作業をする




画像はすでにマウント済みですがDisksを起動してmicroSDカードのイメージファイルをマウントします



この時左下の"Set up read_only loop device"のチェックを外すのを忘れないように。
イメージを選択したら右上の"Attach"を押してイメージをマウントします



縮小したいパーティション(今回はrootfs)を選んで"Resize..."を選択します



スライダーを動かすかもしくは直接数値を入れてサイズを調整します



今回は32GB→16GBのmicroSDへのレストアが目的なので14.0GBまで縮小します、縮小するサイズを決定したら右上の"Resize"ボタンを押します



無事にrootfsのパーティションサイズが14GBになりました。
この状態は32GBのmicroSDイメージの後ろが空き領域になっているだけなのでイメージ自体を縮小します



fdisk -l [imagefile].img
でイメージファイルの情報を見てみます。
必要なのは1セクタの512Bytes と、縮小したlinuxパーティションのエンドセクタの数値(この場合27877357)です。

この値からイメージ自体の縮小を行います。



truncate --size=$[(27877357+1))*512 [imagefile].img
と入力して縮小します、27877357の値は先ほどfdiskで確認した値ですのでリサイズしたサイズによって異なるので注意してください。
エンターキーを押して縮小したら確認のため再度
fdisk -l [imagefile].img
を入力すると、容量とセクター数が変わってるのが確認できます。



Disksで縮小したイメージをマウントすると無事に縮小が完了しました、あとは一般的な手順でイメージをddやWin32 Disk ImagerでmicroSDにレストアできます。