お得情報  | ➡

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

パソコンに向かう人アイキャッチ
アプリ
文字変換を便利に使おう。IMEの種類や辞書登録など

皆様こんにちは、IMEを使っていることと思います。IMEって何?と思う方もいらっしゃるかもしれません。 IMEはInput Method Editorの略でパソコンやスマートフォンに文字を入力する際に必要になるソフトウェアです。 これがあるおかげで私達はPCに日本語を入力することができるわけですね。 そこで今日はIMEについて掘り下げて見たいと思います。 I …

ラズベリーパイ画像
Raspberry Pi
もうすぐラズベリーパイ5が出るよ。

皆様お久しぶりになります。まっくんです。皆様お待ちかねのラズベリーパイがそろそろでますね。バージョン5です。 めちゃめちゃ進化しているらしいので私も楽しみでしかたありません。多分第一弾の出荷分は人気すぎて買えない気がします。 日本での発売は技適の法律の関係で国際発売日の3ヶ月後程度をめどなので10月末発売とのことでしたから2月のどこか あたりとなりますでしょ …

豆知識
iPadでWindowsを操作するリモートデスクトップができるアプリ

iPadでリモードデスクトップクライアントになるアプリをマイクロソフトが出しているようです。 iPadでものを書くと変換が自動でされてびっくりしました。 ブルートゥースマウスとキーボードが役に立ちます。 app storeをマイクロソフトリモートデスクトップというワードで検索すると出てきます。 通常通りIPアドレスとユーザ名、パスワードを入力するとリモートデ …