🤏

Raspberry Pi のディスクイメージを小さくする

2025/02/23に公開

はじめに

Raspberry Pi に限らず、SBC などのストレージをクローンするときに、ディスクイメージのサイズを小さくしたい場面があります。

  • バックアップの容量を節約したい
  • より小容量のストレージに移植したい

そんなときに使えるディスクイメージの作成手順をまとめておきます。

パーティションサイズの変更

以降、空き容量が大きいパーティションを /dev/mmcblk0p2 として例示します。

ファイルシステムのサイズを一旦最小にする

まず、ファイルシステムをチェックします。

$ sudo e2fsck -f /dev/mmcblk0p2

ファイルシステムをシュリンクするために、最小サイズを確認します。

$ sudo resize2fs /dev/mmcblk0p2 1
結果例
resize2fs 1.46.5 (30-Dec-2021)
resize2fs: New size smaller than minimum (300279)

minimum () の数値でファイルシステムをシュリンクします。

$ sudo resize2fs /dev/mmcblk0p2 300279
結果例
resize2fs 1.46.5 (30-Dec-2021)
Resizing the filesystem on /dev/mmcblk0p2 to 300279 (4k) blocks.
The filesystem on /dev/mmcblk0p2 is now 300279 (4k) blocks long.

パーティションのサイズを決める

パーティションのサイズをシュリンクします。
fdisk でストレージを指定します(mmcblk0p2 ではなく mmcblk0)。

$ sudo fdisk /dev/mmcblk0

p コマンドで対象パーティションの Start 位置を確認しておきます。

結果例
Command (m for help): p
Disk /dev/mmcblk0: 3.8 GiB, 4008706048 bytes, 7829504 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb4ad033e

Device          Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1         8192  137215  129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2       137216 7829503 7692288  3.7G 83 Linux

d コマンドで、対象パーティションを一旦削除します。

結果例
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.

n コマンドでパーティションを作り直します。
このとき、First sector は上記で確認した Start 位置にします。
また、Last sector+ で目的のサイズを指定します。下の例では、全パーティションの合計が 2GB に収まるように、+1.8 を指定しています。

結果例
Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (137216-7829503, default 137216): 137216
Last sector, +sectors or +size{K,M,G,T,P} (137216-7829503, default 7829503): +1.8G
Created a new partition 2 of type 'Linux' and of size 1.8 GiB.

w コマンドでパーティション変更を実行します。

結果
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

ファイルシステムのサイズを最大化する

ファイルシステムをパーティションのサイズの限界までエクスパンドして、ファイルシステムをチェックします。

$ sudo resize2fs /dev/mmcblk0p2
$ sudo e2fsck -f /dev/mmcblk0p2

ディスクイメージの作成

パーティション構成を確認します。

$ sudo fdisk -l /dev/mmcblk0
結果例
Disk /dev/mmcblk0: 3.8 GiB, 4008706048 bytes, 7829504 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb4ad033e

Device          Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1         8192  137215  129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2       137216 3872767 3735552  1.8G 83 Linux

確認したブロックサイズと End の値を指定してディスクイメージを作成します。

$ dd if=/dev/mmcblk0 bs=512 count=3872767 status=progress | gzip -c  > /path/backup.img.gz

Discussion