バックアップしたイメージファイルを縮小する

Win32DiskImagerを使ってバックアップしたRaspberry PiのSDカード内に未使用領域があった場合に、バックアップしたイメージファイルから容量を減らす方法を紹介します。

必要なもの

  • Win32DiskImagerでバックアップしたイメージファイル
  • Linuxが入っているPC

手順

大まかな手順としてはRaspberry Piをバックアップしたイメージファイルをループバックデバイス(イメージファイルを/dev/loop13のようにマウントする機能)として使用し、gpartedを使い、HDDを縮小する要領でイメージファイルを縮小します。 まず、以下のコマンドでループバックデバイスを有効にして、ループバックデバイスとして使用できる場所を調べます。

sudo modprobe loop
sudo losetup -f

losetup -fのコマンドを打つと/dev/loop13が返ってきたので、今回の例ではループバックデバイスとして使用する場所は/dev/loop13になります。 使用できる場所を確認したら、イメージファイルを/dev/loop13にマウントします。 その後、ディスク上のパーティションテーブルを変更したことを OS に知らせるために、partprobeコマンドを使用し、Gpartedを起動してファイルを縮小していきます。

sudo losetup /dev/loop13 20180908.img
sudo partprobe /dev/loop13
sudo gparted /dev/loop13

ここでgpartedが起動するのでファイルを縮小して、保留中の操作を適用を押します。



僕の場合にはすべての空き容量を縮小しようとしたら保留中の操作を適用を押した後にエラーが発生しました。 GPartedで縮小するときには、FAT32でフォーマットされた10MiB程の空き容量が必要になるらしいということが後に調べてわかりました。

その時の実際のエラーの内容になります。

そこで、縮小するサイズを未使用域、全てではなくしたところ上手く縮小することができました。

上手く縮小出来たら、 イメージファイルのどこで、使用しているパーティションが終わっているか、また空き容量が始まっているかをfdiskコマンドを使って知らべます。

sudo losetup -d /dev/loop13
fdisk -l 20180908.img

すると以下が返ってきました。

ディスク 20180908.img: 7.3 GiB, 7780433920 バイト, 15196160 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x66ea2bcd

デバイス      起動 開始位置 最後から  セクタ サイズ Id タイプ
20180908.img1 *        8192   270335  262144   128M  c W95 FAT32 (LBA)
20180908.img2        270336  8390655 8120320   3.9G 83 Linux

truncateコマンドを使って、イメージファイルを縮小していきます。 truncate –size=$[(20180908.img2の最後からの数字+1)*単位の512バイト] 20180908.img というコマンドを打ってください。

truncate --size=$[(8120320+1)*512] 20180908.img

以上の手順でWin32DiskImagerでバックアップしたRaspberry Piのイメージファイルを縮小出来ます。