Raspberry Piのimgファイルを縮小してマイクロSDカードに書き込む

新しく買った16GBのマイクロSDカードにバックアップしていたRaspberry Piの16GBのimgファイルを書き込もうとしたところ・・

Not enough space on disk: Size: 31116288 secotors Available: 30881782 sectors Sector size: 512

容量オーバー。。


Raspberry Piのimgファイルを縮小してマイクロSDカードに書き込めるようにします。

同じマイクロSDカードでもサイズが違う!

Raspberry Pi用にAmazonでトランセンドの16GBのマイクロSDカードを買っています。

Transcend microSDHCカード 16GB Class10
【Amazon.co.jp限定】Transcend microSDHCカード 16GB Class10 (無期限保証) Newニンテンドー3DS 動作確認済み TS16GUSDHC10E (FFP)

同じ容量のマイクロSDカードでもメーカーや種類によってサイズが若干異なります。

16.01GBのマイクロSDカードをimgファイルでバックアップ

16.00GBのマイクロSDカードにはそのimgファイルを書き込めない!


これを避けるために、私の場合いつも同じメーカーで同じ型番のマイクロSDカード買っていました。これなら容量も同じだから困らないだろうと思っていました。

違いました。


3ヶ月くらい前に買ったTranscend microSDHCカード 16GB TS16GUSDHC10E
容量15,558,144KB

最近買ったTranscend microSDHCカード 16GB TS16GUSDHC10E
容量15,440,896KB


容量が減ってるー!

3ヶ月前に買ったマイクロSDカードのデータをimgファイルにして新しく買ったマイクロSDカードに書き込もうとしたところ、容量オーバーで書き込めませんでした。

Raspberry Piのimgファイルの容量を減らす

ネットで調べた結果、imgファイルよりも大きな容量のUSBメモリカードを持っている場合、またはRaspberry Piに外部ハードディスクをつなげている場合、Raspberry Piのimgファイルの容量を減らすことができます。

ただしRaspberianしか対応していないようです。

参考サイト:Reducing Raspbian File System Image Size

resizeimage.plというファイルをUSBメモリまたはRaspberry Piにつながっている外部ハードディスクに作成します。

resizeimage.pl
#!/usr/bin/perl

use utf8;
use 5.010;
use strict;
#use autodie;
use warnings;
#use diagnostics;

my $who = `whoami`;

if ($who !~ /root/)
{
   print "This should be run as root or with the sudo command.\n";
   exit 1;
}

if (!$ARGV[0])
{
   print "No image file given.\n";
   exit 1;
}

my $image = $ARGV[0];

if ($image !~ /^\//)
{
   print "Please enter full path to image file.\n";
   exit 1;
}

if (! -e $image)
{
   print "$image does not exist.\n";
   exit 1;
}

my @name = split (/\//, $image);
print "\n$name[(scalar @name) - 1]:\n";
print "=" x (length ($name[(scalar @name) - 1]) + 1) . "\n";

my $info = `parted -m $image unit B print | grep ext4`;

(my $num, my $start, my $old, my $dummy) = split (':', $info, 4);
chop $start;
chop $old;
printf "Old size - %d MB (%1.2f GB)\n", int ($old / 1048576), ($old / 1073741824);

my $loopback = `losetup -f --show -o $start $image`;
chop $loopback;

`e2fsck -p -f $loopback`;

if ($? != 0)
{
   print "There was an error in the file system that can't be automatically fixed... aborting.\n";
   `losetup -d $loopback`;
   exit 1;
}

$info = `resize2fs -P $loopback 2>&1`;

($dummy, my $size) = split (': ', $info, 2);
chop $size;
$size = $size + 1024;

`sudo resize2fs -p $loopback $size 2>&1`;
sleep 1;
`losetup -d $loopback`;

$size = ($size * 4096) + $start;

`parted $image rm $num`;
`parted -s $image unit B mkpart primary $start $size`;

$size = $size + 58720257;
printf "New size - %d MB (%1.2f GB)\n", int ($size / 1048576), ($size / 1073741824);

`truncate -s $size $image`;

my $diff = $old - $size;
printf "Image file was reduced by %d MB (%1.2f GB)\n", int ($diff / 1048576), ($diff / 1073741824);

exit 0;

次にresizeimage.plと同じ場所にRaspberry Piのimgファイルを置きます。

私の場合、外部ハードディスクにresizeimage.plを置いて、imgファイルも同じ場所に配置しました。USBメモリの場合は、resizeimage.plとimgファイルを同じ場所に置いて、Raspberry PiのUSBポートに挿入します。

下記のコマンドでimgファイルを縮小します。
(/media/hdd1/samba/user_name/Unimportantという箇所は、各自resizeimage.plを置いた場所に変更してください)
cd /media/hdd1/samba/user_name/Unimportant

sudo perl ./resizeimage.pl /media/hdd1/samba/user_name/Unimportant/raspberry-pi-2015-02-24-b-plus.img

raspberry-pi-2015-02-24-b-plus.img:
===================================
Old size - 15193 MB (14.84 GB)
New size - 4192 MB (4.09 GB)
Image file was reduced by 11001 MB (10.74 GB)
15193MBのimgファイルが4192MBに縮小されました。これで問題なく16GBのマイクロSDカードに書き込めます。


縮小したimgファイルを新しいマイクロSDカードに書き込んで、そのマイクロSDカードでRaspberry Piを起動して、容量を拡張して作業は完了です。
sudo raspi-config
1. Expand Filesystem

Raspberry Piのimgファイルを縮小してマイクロSDカードに書き込む” への1件のコメント
  1. とおりすがりの者 より:

    “sudo raspi-config” でしょうか?

  2. kyosuke より:

    sudo rpi-updateではなく、sudo raspi-configでした。
    ご指摘ありがとうございます。修正しておきました。

コメントを残す

メールアドレスが公開されることはありません。