Raspberry PiのOSイメージをddで扱う際の注意点

パソコンを使う若い男性
Raspberry Pi

皆様こんにちは。ラズベリーパイを使用している方も増えているかもしれません。ラズベリーパイはSDカードをストレージに使ってOSをインストールする場合が多くなっています。そんな場合にある程度ギリギリのサイズのSDカードを使うことによりOSイメージを手軽に作ることができるのでddを便利に使っている方も多いと思います。

過去記事 OSをまるまるバックアップ。ddコマンドの使い方

この場合128GサイズのSDカードを使うよりもギリギリサイズの32Gや16GのSDカードを使う場合の方が時間的に有利になるので、そのようなサイズをあえて使うのがよい工夫であると言えます。

そんな中SDカードのサイズは同じ32Gメモリであっても厳密に言うとサイズが異なるのをご存知でしたでしょうか?2つのSDカードのサイズを実際にPCで表示してみてサイズを比べてみましょう。

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カードがより小さいサイズになってしまった場合にはこの度紹介したようにパーティションサイズの変更が厳密には必要になるようです。皆様も楽しくラズベリーパイを使うためにはぜひ注意してお使いくださいませ。

アプリアイコンのイメージ
Tips
ジョジョジョイーン縮小革命で画像を扱いやすく!

皆様こんにちは。今日は画像をブログなどで使う際に扱いやすいサイズに調整する話です。 画像サイズはWEBで使う場合には適切なサイズというものがあります。あまり画像サイズが大きすぎると無駄にデータ通信を使うためにあまり勝手が良くないのです。 大体長辺が1000px以下くらいまで抑えても問題ない場合が多いです。画像のピクセル数、サイズを下げるメリットとしてはファイ …

本山積みの図
Tips
パソコンで本を作ろう。フォトブックや絵本、その他小冊子などの製本方法

皆様こんにちは。今日はパソコンを使った本の作成方法についてご紹介いたします。 パソコンの活用方法色々ありますね。中でも本を作るなんていうのはちょっとワクワクする使い方ではないでしょうか?製本方法にも色々ありますが、パソコンで簡単にできるのは小冊子などを作るための中綴じ(なかとじ)です。その他の製本もできるかもしれませんが中綴じはとても簡単にできるのでおすすめ …

Windows 11
豆知識
Windows11が出る!Windows11は無償アップデート可能だが要件が厳しい。

最後のバージョンと聞いていたWindows10の後継のWindows11が出ることになりました。あちこちで書かれていたことは結果的に誤報といういう結果になりそうです。こちらでもずっと使えるOSだとか書いていたので誤報となり申し訳ございません。 Windows10はいつまで使えるか? Windows11は無償アップデート可能のようですが、システムを導入するのに …