皆様こんにちは。ラズベリーパイを使用している方も増えているかもしれません。ラズベリーパイはSDカードをストレージに使ってOSをインストールする場合が多くなっています。そんな場合にある程度ギリギリのサイズのSDカードを使うことによりOSイメージを手軽に作ることができるのでddを便利に使っている方も多いと思います。
この場合128GサイズのSDカードを使うよりもギリギリサイズの32Gや16GのSDカードを使う場合の方が時間的に有利になるので、そのようなサイズをあえて使うのがよい工夫であると言えます。
そんな中SDカードのサイズは同じ32Gメモリであっても厳密に言うとサイズが異なるのをご存知でしたでしょうか?2つのSDカードのサイズを実際にPCで表示してみてサイズを比べてみましょう。
Table of Contents(目次)
SDカード1(KIOXIA EXCERIA 32G)
ディスク /dev/sda: 28.9 GiB, 30979129344 バイト, 60506112 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x00000000
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sda1 8192 60506111 60497920 28.9G c W95 FAT32 (LBA)
SDカード2(SanDisk Ultra microSDHC 32G)
ディスク /dev/sda: 29.7 GiB, 31914983424 バイト, 62333952 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x00000000
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sda1 8192 62333951 62325760 29.7G c W95 FAT32 (LBA)
という結果になりました。SDカード1、SDカード2の結果を見ていきますと
SDカード1
30979129344 バイト, 60506112 セクタ
SDカード2
31914983424 バイト, 62333952 セクタ
となっており実際のサイズが異なる事がわかります。この状態で最大までパーティションを拡大してパーティションを作っている場合、パーティションを収め切れない問題が発生してしまいます。よりより大きいサイズのSDカードを使う場合には大丈夫です。サイズが小さくなる場合はパーティションサイズの調整などが必要になってきます。
ではサイズの異なるSDカード(より小さい場合)で適切にddを行うにはどうしたらよいでしょうか。これについても紹介していきます。ただしこの情報は100%保証するものではありません。検証等別途行って頂ますようお願い申し上げます。
ddするファイルをより小さくまとめる手順
1.パーティションサイズを小さくする
2.トランケートする
3.DDする
このような手順になります。場合によってはDDによりより小さいSDカードサイズで強制停止されるのでトランケートは必要ないかもしれません。
(前提条件 SDカードのイメージをddで作成しておく)
ループバックデバイスの空きを確認(結果を後に使う)
sudo losetup -f
イメージファイルをループバックデバイスに紐付け
sudo losetup /dev/loop22 32G.img
パーティション構成を再読込
sudo partprobe /dev/loop22
gpartedでパーティションを再構成
sudo gparted /dev/loop22
ループバックデバイスのアンロード
sudo losetup -d /dev/loop22
FDISKで最終セクタを読み取る
fdisk -l 32G.img
ディスク 32G.img: 28.9 GiB, 30979129344 バイト, 60506112 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x5c219f18
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
32G.img1 8192 7995391 7987200 3.8G c W95 FAT32 (LBA)
7995391のセクタでパーティションが終了している事がわかります。ブロックサイズは512バイトです(セクタ (1 * 512 = 512 バイト)として表示されています。多くの場合セクタサイズは一緒ですが、終了セクタが異なります。
この数字は、パーティションがファイルの7995391 * 512バイト付近で終了することを意味します。これ以上のサイズがあった場合それ以降は未使用領域となるのでトランケートできます。
そのため次の作業はパーティションを含めるギリギリのサイズに調整します。これにはtrancateコマンドが使えます。trancateコマンドはサイズをバイト数で調整できます。最後のブロックは7995391でブロック番号は0から始まります。
これを考慮するとパーティンションを含めるためには、(7995391+1 )* 512バイト必要です。
この計算を含めたコマンドは以下のとおりです
truncate --size=$[(7995391+1)*512] 32G.img
これでファイルを適切なサイズに調整する事ができました。
ディスク 32G.img: 3.8 GiB, 4093640704 バイト, 7995392 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x5c219f18
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
32G.img1 8192 7995391 7987200 3.8G c W95 FAT32 (LBA)
最終的に4093640704バイトに切り詰められている事がわかります。
まとめ
いかがでしたでしょうか。ラズベリーパイでSDカードをDDする場合には同じ容量のSDカードであっても、厳密な容量に注意する必要があることが分かりました。不幸にもSDカードがより小さいサイズになってしまった場合にはこの度紹介したようにパーティションサイズの変更が厳密には必要になるようです。皆様も楽しくラズベリーパイを使うためにはぜひ注意してお使いくださいませ。