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がよかろうとおもう。

ファイルシステムを縮小
/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