カスタマイズしたRaspbianが入ったmicroSDのディスクイメージを能う限りコンパクトに取得する

OS: Ubuntu Server 12.04

大規模な変更や無謀な試みを施す直前にRaspbianのバックアップを取っておきたいけれども64GBの容量を謳うmicroSDのイメージファイルをそのままddコマンドで吐き出すと時間とストレージがいくらあっても足りないものである。容量いっぱいまで拡げられたルートパーティションを縮める手続きが必要である。

$ lsblk -i
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
(snip)
sdf      8:80   1  60.1G  0 disk
|-sdf1   8:81   1  41.8M  0 part
`-sdf2   8:82   1    60G  0 part

作業の大雑把な流れはファイルシステムのサイズを縮小→パーティションサイズを縮小、という具合である。また

 パーティションサイズ >= ファイルシステムサイズ

という掟もあるようであるから計算を誤るとKernel PanicでOSが起動しないイメージファイルが生まれるおそれがあり心を砕いて取り組む繊細な仕事である。利用できる環境であればGPartedでシュッとやるのが早くて確かでよりコンパクトになるからもう絶対GPartedがよかろうとおもう。

仕事をするGPartedのようす

ファイルシステムを縮小

/dev/sdfとして認識されたmicroSDのパーティション構成を具に確認するとこうである。ブートパーティションが/dev/sdf1、ルートパーティションが/dev/sdf2のようである。ルートパーティションのサイズは概ね60GiBであった。此れをresize2fsコマンドで以って縮めることを目当てにする。

$ sudo fdisk -l /dev/sdf
(snip)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1            8192       93802       42805+   c  W95 FAT32 (LBA)
/dev/sdf2           98304   125958143    62929920   83  Linux

$ echo 'scale = 3; (125958143 - 98304 + 1) * 512 / 1024 ^ 3' | bc
60.014

ひとまずe2fsckコマンドを前もって実施しておかないと「Please run ‘e2fsck -f /dev/sdf2’ first.」などと言われて終いであった。

$ sudo e2fsck -f -y -v -C 0 /dev/sdf2

無闇に縮小する訳にはいけないからどれだけの容量が実際に使用されているかを前もって把握せねばならない。tune2fsで以って使用済みのブロック数から値を割り出すとだいたい2.01GiBを使用中というふうに観察できる。

$ sudo tune2fs -l /dev/sdf2
(snip)
Block count:              15732480
Free blocks:              15204597
Block size:               4096

$ echo 'scale = 3; (15732480 - 15204597) * 4096 / 1024 ^ 3' | bc
2.013

まったく隙間なく縮めてしまうとOS起動後に容量不足で禄な操作が許されないので、少しゆとりをもたせて2.1GiBに定めた。これをresize2fsコマンドに渡すと「resize2fs: Invalid new size: 2.1G」というエラーになるからどうも自然数しか受け付けてもらえない情勢である。さりとて3GiBでは目当ての値より一寸隔たりが大きいのでMiB単位で考えるのがよさそうである。2.1GiBは2.1 * 1024 = 2150.4MiBであるから2150Mとすれば概ねよかろうと思う。

$ sudo resize2fs -p /dev/sdf2 2150M

パーティションサイズを縮小

fdiskでルートパーティションのサイズを縮めるには現在のルートパーティションを一旦削除して新たに作り直せばよかった。終了セクタはファイルシステムのサイズより大きくなるよう取らねば都合が悪いようだから2200MiBとした。

$ sudo fdisk /dev/sdf
Command (m for help): p
(snip)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1            8192       93802       42805+   c  W95 FAT32 (LBA)
/dev/sdf2           98304   125958143    62929920   83  Linux

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (2048-125958143, default 2048): 98304
Last sector, +sectors or +size{K,M,G} (98304-125958143, default 125958143): +2200M

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

このあとサイズを指定せずにresize2fsを実行することでファイルシステムのサイズをパーティションサイズに一致するよううまい具合に膨らませてくれるようである。

$ sudo resize2fs -p /dev/sdf2
$ sudo fdisk -l /dev/sdf
(snip)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1            8192       93802       42805+   c  W95 FAT32 (LBA)
/dev/sdf2           98304     4603903     2252800   83  Linux

これで漸くルートパーティションのサイズがコンパクトにまとまった。あとは512byte * (4603903 + 1)sectorだけddコマンドで以ってディスクイメージをファイルに書き出せば終いである。GPartedの仕事にくらぶればやや肥大気味ではあるけれども1bitをシビアに争う要請ではないから良しとしたいところである。

$ sudo dd if=/dev/sdf of=raspbian.img bs=512 count=4603904

なおresize2fsのマニュアルを読み進めているとKiBやGiBに対して風当たりの強い様が見られて大変興味深かった。

Note: when kilobytes is used above, I mean real, power-of-2 kilobytes, (i.e., 1024 bytes), which some politically correct folks insist should be the stupid-sounding “kibibytes”. The same holds true for megabytes, also sometimes known as “mebibytes”, or gigabytes, as the amazingly silly “gibibytes”. Makes you want to gibber, doesn’t it?

参考:
Raspberry Piで最小限に切り詰めたSDカードのイメージをバックアップする手順メモ.md
Linuxファイルシステムのサイズ変更とデフラグ
Raspberry Pi Visual identity guidelines

Similar Posts:

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください