新 ラズパイのOSイメージをできるだけ小さくddでバックアップする手順

# 最初に
この記事は、[ラズパイのOSイメージをできるだけ小さくddでバックアップする手順](https://qiita.com/narista/items/2812e6f596f956bc8e89)の私による焼き直しである。
このような詳細な記事を書いてくださった@naristaさんに感謝をこめて、実際にやってみて発生した問題の解決法や、手順の際にメモしておくべき値を事前に紹介するなどを踏まえて追記する形でこの記事を記す。

# 免責事項
私と@naristaさんはこの記事を基にして起きたあらゆる問題に対し責任を持ちません。ご了承を。

# 実行環境と事前準備
今回はUbuntu16.04LTS DesktopがインストールされているPCにより行った。

01) しっかりと対象のSDカードをPCに装着しそれを確かめる。

02) GUI状態だとうまくいかないので、CUIモードに入る。
Ctrl+Alt+F1(or F2, F3, F4, F5, F6)で入る。
戻るときはCtrl+Alt+F7
以下を参考
[CUIモードへの入り方](http://hisha11.hatenablog.com/entry/2013/05/06/203757)
[GUI状態でチャレンジして砕けた例 by 私](https://teratail.com/questions/294351)

# ファイルシステムの縮小

03) 次に、以下のいずれかのコマンドで対象を確認
両方とも同じ意味だが、短い方だとたまに実行できない。

```
sudo fdisk –l
sudo fdisk –-list
```
見つけた対象は今回の例では<対象>とする。


04) 対象のLinuxパーティションに不整合や破断がないかどうかチェック

```
sudo e2fsck -p -f /dev/<対象>

# 表示例
/dev/<対象>: XXXX/XXXX files (XXX% non-contiguous), XXXX/XXXX blocks
```
05) 縮小後のファイルシステムのサイズ見積もり
以下のコマンドで、パーティション上のファイルシステムをいくつに縮小できるか見積もり
（単位はブロック[4KB]）

```
sudo resize2fs -P /dev/<対象>

# 表示例
resize2fs X.XX.X (XX-XXX-XXXX)
Estimated minimum size of the filesystem: <最小見積もり>
```
06) ファイルシステムの縮小
上記で見積もられた 最小見積もりブロックサイズ+1024 にファイルシステムを縮小
以後、<最小見積もり>+1024を<縮小後用量>と置く

```
sudo resize2fs -p /dev/<対象> <縮小後用量>

# 表示例
resize2fs X.XX.X (XX-XXX-XXXX)
Resizing the filesystem on /dev/<対象> to <縮小後用量> (4k) blocks.
Begin pass 2 (max = XXXX)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = XXXX)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = XXXX)
Updating inode references    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/<対象> is now <縮小後用量> (4k) blocks long.
```

# パーティションの縮小
07) 以下のコマンドを実行し、対話型インタフェースで操作しパーティションを縮小

```
sudo fdisk /dev/<対象>
```

08) p と入力し、パーティションの状態を表示
ここで、2番目のLinuxパーティションの開始位置をメモしておく。
この値を<開始位置>とする。


09) d と入力後 2 と入力し、2番目のLinuxパーティションを削除
"削除"と聞いてぎょっとするが、問題はない。


10) p と入力し、パーティションが削除されたか確認
(2番目のLinuxパーティションがなくなっていれば正常)


11) n と入力し、パーティションを作成する。


12) p と入力し、プライマリーパーティションとする。


13) 2 と入力し、削除した2番目のLinuxパーティションを再度作り始める。


14) セクタの開始位置を、削除した2番目のLinuxパーティションと同じ値<開始位置>にする。


15) 上記スタート位置からどれだけの領域を確保するか入力。
ここでは、縮小したファイルシステムのサイズに若干余裕を持たせたサイズにする。
<縮小後用量>[ブロック] x 4[KB] /(10^6) を小数点以下切り上げした値[GB]を目安に容量を決める。
決めた値を<確保用量>とする。

例えば、1191452ブロック×4KB≒4.5GBなので余裕をみて5GBとする。

入力する値は+<確保用量>Gであり、例の場合は、+5Gとなる。

16) Do you want to remove the signature? [Y]es/[N]o: と出た場合はNと入力。出ないときもあるようだ。


17) w と入力し、更したパーティションを書き込む。


18) しっかりと書き込めているか、ディスクの構成を再確認
下記のいずれかのコマンドで、再度ディスク構成を表示しパーティションが縮小されていることを確認
注釈は同上。

```
sudo fdisk –l
sudo fdisk –-list
```
この際に、<対象>2のEndの値を確認し記録しておく。
この値を<終端>とする。


# 使用領域のみに縮小されたイメージの作成
19) パーティションが縮小されたSDカードをddでそのままバックアップしても、
物理的なSDカードのサイズでイメージデータが作成される。

そこで、どの位置までをイメージデータとしてバックアップするべきか指定する必要がある。

具体的には以下のコマンドを用いて必要な部分だけをイメージ化する。

```
sudo dd if=/dev/<対象> of=<保存先ディレクトリ>/<保存するファイル名>.img count=<カウント> bs=1m
```
<カウント>の算出方法は、<終端>÷2048を小数点以下切り上げ

例えば、/dev/sda2のEndが10579967であれば、10579967÷2048=5165.99……なので切り上げて5166を<カウント>とする。

「bs=1m」は、エラー「dd: bs: illegal numeric value」が発生する場合、「bs=1m」を「bs=1M」に変えて実行。
[参考](http://igarashi-systems.com/sample/translation/raspberry-pi/installation/install-mac.html)


以下の工程で、使用領域部分だけがバックアップされたイメージファイルを作成できる。

お疲れさまでした。