ラズパイのイメージをダイエットして保存

# はじめに
　**いつの間にか パッツパツ になっとるんです。**

　「Raspberry Pi」（以下ラズパイ）の記憶媒体はSDカードなので、`dd`コマンド等で気軽にシステム全体のバックアップイメージを作成することができるのが良いところ。
しかし、いつの間にやら大量のバックアップイメージがパソコンのディスク領域を圧迫することに。（そうそう、会長の腹のようにね・・って、**うるさいわ！**）

　さらにSDカードは、

- 最近は容量の小さい（4GB位の）モノの入手性が悪い（あっても割高）。
- 同じ容量表記でも実際に使えるサイズにばらつきがある。

　ということで、バックアップするときはイメージをダイエットしたいのです。

## 目標
　SDカードの物理容量よりも小さなサイズでバックアップイメージを作成出来たら勝ち。

## 注意事項
　オリジナルのSDカードのパーティションを編集するので、安全のために**別途バックアップ取って**からチャレンジしてください。（万が一壊れても会長は責任取れんよ）

## おことわり
　会長はWindowsの民ゆえ、LinuxでもGUIでポチポチしたい派です。

# やってみよう
## 下準備
　とりあえず用意するものを挙げておきます。

- Linuxパソコン（GNOMEデスクトップ）
- SDカードリーダ（USBでmicroSDカードの読み書きできるようにするやつ）
- ラズパイのイメージを書きこんだmicroSDカード（今回使ったのは16GB）

　会長は仮想マシン（VMWare）に「Debian GNU/Linux 10」を入れているので、これで解説します。

## Gpartedのインストール
　パーティション操作ツールである「Gparted」をインストールします。
　まずはデスクトップから`アクティビティ ≫ ソフトウェア`をクリックします。次に「🔍」アイコンをクリックし、入力欄に「Gparted」と入力し、出てきたソフトウェアをインストールします。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/3d776f57-a083-07e5-f412-2f58b68e362e.png)


## SDカードのパーティションサイズを変更する
　SDカードをカードリーダでパソコンに接続し、「Gparted」を起動します。右上のドライブ選択でSDカードのドライブを選択します。（会長の環境では`/deb/sdb`でした。）
　もし、サイズ変更するパーティション（`/deb/sdb2`）がマウントされていれば、「アンマウント」しておきます。
![02.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/31fb6ded-a17d-0f2b-d85e-ec7b091ef1b3.png)

　次に、`/deb/sdb2`を右クリックし、「リサイズ/移動」をクリックします。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/dd85d9f6-9522-e50b-72c6-5b40bba3c4ca.png)

　ダイアログの上部に表示されるバーの右端をドラッグするか、「新しいサイズ」に変更後のサイズを入力します。この時、最小サイズギリギリにするのではなく、少し余裕を持たせておきます。（空き容量がないと、ラズパイが起動できないかもしれないので。）
　サイズを決めたら、「リサイズ/移動」ボタンをクリックします。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/85ef9aa9-e509-ba35-ed3b-9d85617f0600.png)

　メインウィンドウに戻ってきたら「✔」アイコンをクリックします。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/793b75ce-a690-1019-92f3-dd2725877106.png)

　リサイズ操作を適用するかどうかの最終確認ダイアログが表示されるので、適用先が間違っていないか、もう一度**指差し確認**[^1]してから「適用」ボタンを押します。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/e431ca4f-40ce-7306-556d-844235ca7dff.png)
[^1]: 「指差し確認なんて、何をアナログなことを」と言われそうですが、最後にトリガを引くのは人間ですからね。

　リサイズが終わったら、「閉じる」ボタンを押し、その後「Gparted」を終了します。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/63e915b5-2bc6-6b2f-0bcc-fda43bbd0683.png)

## ダイエットしたイメージファイルを作成する。
　あとは`dd`コマンドでイメージファイルを作成するわけですが、初めに`fdisk`コマンドでパーティションのブロックサイズを取得しておきます。

```shell
$ sudo fdisk -l /dev/sdb
```

（`/dev/sdb`はSDカードのデバイス名です。各自の環境で読み替えてください。）
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/95c4748e-f8eb-f736-ab01-f4a5e123a97d.png)
　ここで出力される「Unitsのバイト数」と、「`/dev/sdb2`のEndの値」を使います。
　`dd`コマンドのオプションは以下の通りです。

```shell
$ sudo dd if=/dev/sdb of=output.img bs=512 count=4726784 status=progress
```

　ofに出力ファイル名、bsに「Unitsのバイト数」、countに「Endの値**＋１**」を指定します。後はアイスでも食って終わるのを待ちましょう。（はぁ、寝る前にアイス食っちまった・・・）
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/4cf1094f-d9d4-ab8f-15c0-3c4230850293.png)
　以上で、SDカードの物理容量よりも小さなサイズでバックアップイメージを作成出来ました。

## ちょっと実験
　`dd`コマンドのbsとcountを掛けた値が、イメージファイルにするサイズです。bsを大きくとれば、高速化できるかもしれません。（bsは「Unitsのバイト数」の倍数にしておいた方が良さそうな気がする。）
　とりあえず、bsを32MBとすると、countは

```math
\frac{512 \times 4726784}{32 \times 1024 \times 1024} = 72.125
```

　となるので、小数点以下繰り上げて、73ですね。

```shell
$ sudo dd if=/dev/sdb of=output.img bs=32M count=73 status=progress
```

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/0b4b8d33-004d-4f30-75bb-31ca16af0acb.png)
　うーん、「209.115 s（bs=512）」⇒「209.858 s（bs=32M）」なので、ほぼ同じですね。一回しか計測していないのでバラツキあるかもしれませんが、電卓でcountを計算している時間の方が長くなりそうです。ということで、`fdisk`コマンドの値をそのまま使うほうが良いですね。

## 元のサイズに戻すには
　以上で、SDカードの物理容量よりも小さなサイズでバックアップイメージを作成出来たわけですが、このままだと、バックアップイメージを復元したSDカードも、手元に残ったSDカードもラズパイで使える容量が小さくなっています。「Gparted」でパーティションサイズを戻してもいいのですが、もっと簡単にラズパイ上で

```shell
$ sudo raspi-config --expand-rootfs
$ sudo reboot
```

とコマンドを実行することでSDカードの全サイズを使えるようになります。

- 拡張前
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/cced16bc-041c-3c0c-743f-b94f21ccf15f.png)

- `raspi-config --expand-rootfs`実行後
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/f7821acd-9be8-8cb1-fb82-acdbea6cf9f8.png)

- 再起動後
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574570/e7ca3b29-e9a6-21fc-5ba0-c24870691f86.png)

# 最後に
　これだけは言っておこう。

　**「output.img」とか適当な名前付けてると、後で痛い目見るぞ。**