SDカードは同じ型番でもサイズが違うので、バックアップイメージの縮小が必要なことがある

ALL
スポンサーリンク

SDカードは同じ型番のものでも、個々でサイズが微妙に異なるようです。

pi 3 – Win32diskImager “Not enough space on disk Size: 62652416 sectors. Available: 62333952” – Raspberry Pi Stack Exchange

この容量違いが問題になるのが、SDカードのバックアップと復元です。
復元時のSDカードの容量が小さいと、復元が失敗してしまい、大問題です。

先日、この問題にあたりました。

RaspberryPI で使用しているSDカードをイメージファイルとしてバックアップしていました。
SDカードが壊れたので、同じSDカードを買ってリストアしようとしたら、容量が足りないとのエラーで失敗しました。
型番も同じSDカードだったのですが・・

さて、復元できないのは非常に困ります。
幸い、下記サイトに対応方法がありました。
バックアップしていたイメージファイルのパーティションサイズを小さくする方法です。

[RaspberryPi]ディスクイメージを縮小する | BYLOMEDIA

「fdisk でパーティションサイズを変更する」の個所で、Ubuntu16では表示が若干異なりましたので、下記に実行例を記載します。

まず、バックアップイメージの構成を確認します。
なお、下記 /dev/loop0p2 の始点、終点の値は、後の手順で参照します。

# fdisk /dev/loop0
コマンド (m でヘルプ): p
Disk /dev/loop0: 16.1 GB, 16088301568 bytes
ヘッド 255, セクタ 63, シリンダ 1955, 合計 31422464 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x3e7fd08e
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/loop0p1            8192      131071       61440    c  W95 FAT32 (LBA)
/dev/loop0p2          <strong>131072</strong>   <strong> 31422463</strong>    15645696   83  Linux

/dev/loop0p2 を削除します。
削除といっても、この後の手順で /dev/loop0p2 のサイズを設定し直すので、データ自体は消えません。

コマンド (m でヘルプ): d
パーティション番号 (1-4): 2

サイズを設定し直して /dev/loop0p2 を作成します。
開始セクタには、先の /dev/loop0p2 の始点を入力します。
Last セクタには、先の終点を入力します。
なお、下記手順中、作成するパーティションのセクタ数が偶数個になるように、Last セクタを指定したほうがいいです。
開始セクタの値が奇数なら、Lastセクタは偶数にします。
開始セクタが偶数なら、Lastセクタは奇数にします。
この例では、開始セクタが偶数(131072)なので、Lastセクタは奇数(31225849)にしています。

コマンド (m でヘルプ): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
パーティション番号 (1-4, 初期値 2): 2
開始 セクタ (2048-31422463, 初期値 2048): <strong>131072</strong> 
Last セクタ, +セクタ数 or +size{K,M,G} (131072-31422463, 初期値 31422463): <strong>31225849</strong>

/dev/loop0p2 が作成されたか確認します。

コマンド (m でヘルプ): p
Disk /dev/loop0: 16.1 GB, 16088301568 bytes
ヘッド 255, セクタ 63, シリンダ 1955, 合計 31422464 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x3e7fd08e
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/loop0p1            8192      131071       61440    c  W95 FAT32 (LBA)
/dev/loop0p2          131072    31225849    15547389   83  Linux

変更を適用します。

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!
ioctl() を呼び出してパーティションテーブルを再読込みします。
警告: パーティションテーブルの再読込みがエラー 22 で失敗しました: 無効な引数です。
カーネルはまだ古いテーブルを使っています。新しいテーブルは
次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に
使えるようになるでしょう
ディスクを同期しています。

後は、[RaspberryPi]ディスクイメージを縮小する | BYLOMEDIA の「kpartx でパーティションをデバイスのように接続」から続けます。

コメント