セットアップ済みのラズパイOSをイメージバックアップし、リストアに備える。OSサイズを縮小する。

RasbianOSをインストール後、色々セットアップしていく中で、誤ってシステムを壊してしまうと、それまでの作業がすべて無駄になって、世の中すべてが敵に回ったような気分にさせられちゃいます。

そんなときのために、適当なタイミングで(OSをインストール後、日本語対応やネットワークのセットアップや、よく使うソフトウエアをセットアップし終わった頃合い)OSのイメージバックアップを作成しておくと、そのイメージバックアップからラズパイ環境を復旧できて、明日からもがんばろうという気にさせてくれます。

【準備するもの】

  • パソコン
  • MicroSDドライブ
  • MicroSDカード

 

1.稼働中のOSシステム(MicroSDカード)をディスクイメージに抽出します。

ラズパイからMicroSDを取り出して、コピー作業するパソコンのMicroSDドライブに差し込みます。

Win32 DISK Imager を起動します。

赤丸で囲んだフォルダマークをクリック

赤丸で囲んだフォルダマークをクリック

新規バックアップ名を指定します。

新規バックアップ名を指定します。

  • 新しいテキストファイルを作って、それをイメージファイル名に変更してから、指定する手順をよく目にしますが、新規バックアップ名を直接指定して、問題なくバックアップファイルが作れます。

左上の空白の Image File 欄に、指定img名が表示されるので、赤枠ドライブ欄をクリックしてMicroSDカードを選択し「Read」ボタンを押します。

左上の空白の Image File 欄に、指定img名が表示されるので、赤枠ドライブ欄をクリックしてMicroSDカードを選択し「Read」ボタンを押します。

警告が出ますが”Yes”をクリック

警告が出ますが”Yes”をクリック

MicroSDカードからコピーされるので、終了を待ちます。

MicroSDカードからコピーされるので、終了を待ちます。

終了!!

終了!!

  • MicroSDにあったRasbianOSのイメージファイルが、上記の場合には、パソコンのDドライブにコピーされました。

 

2.バックアップしたディスクイメージから、MicroSDカードにリストア

 

リストアするMicroSDカードを、SDカードドライブに差し込みます。Win32 DISK Imager を起動します。

赤丸で囲んだフォルダマークをクリック

赤丸で囲んだフォルダマークをクリック

このイメージは、外部ハードディスク保存してあったバックアップを指定しています。

このイメージは、外部ハードディスク保存してあったバックアップを指定しています。

 バックアップイメージをリストアするMicroSDカードをDevice 欄で指定します。

バックアップイメージをリストアするMicroSDカードをDevice 欄で指定します。

「Write」をクリックするとメッセージが表示されますが、「Yes」をクリック

「Write」をクリックするとメッセージが表示されますが、「Yes」をクリック

操作のイメージ

要は「Read」を操作すれば、「Image File」に書き込まれます。「Write」を操作すれば「Device」に書き込まれます。

要は「Read」を操作すれば、「Image File」に書き込まれます。 「Write」を操作すれば「Device」に書き込まれます。

 

 

3.RasbianOSのサイズを使っているだけに縮小する

 

下の方法は、ラズパイ財団のHPで紹介されていたんですが、最近はリニューアルされて、なくなってしまったような・・・
以前は、HPから持ってこれたのですが・・・と思っていたらありました。
https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=58069

項番1、2でリストアするときに、バックアップイメージが同じサイズのMicroSDに書き戻しているのに、エラーになってしまうことがあります。MicroSDのメーカー、種類によるのかよくわからないのですが、その場合にこの方法で縮小すると書き込めるようになります。

vi 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)と縮小したいMicroSDのイメージファイルを、USB接続で外付けHDDにコピーする。
    色々処理してみるとラズパイに、USB接続で外付けHDDで処理するのが一番やりやすい。
  • 処理はラズパイで行うので、USB接続で外付けHDDをラズパイに接続する。
    (下はつないだイメージ)

USB接続で外付けHDDをラズパイに接続した

USB接続で外付けHDDをラズパイに接続した

処理するイメージファイル、スクリプト(resizeimage.pl)まで移動すると、絶対パス名をコピペできたり、やり易い。

処理するイメージファイル、スクリプト(resizeimage.pl)まで移動すると、絶対パス名をコピペできたり、やり易い。

  • スクリプトのパーミッションを変更する

chmod 755 /home/pi/resizeimage.pl

  • 後は、ラズパイ上で、スクリプトを起動して、イメージファイル縮小処理を実施する。
    以下は、TeraTermPro でリモート接続して、コマンドを入力した履歴です。

 

実行コマンド:sudo perl ./resizeimage.pl イメージファイルの絶対パス指定

 

pi@r3b-bsf-base:~ $ cd /media/pi/miko-desk/resize
pi@r3b-bsf-base:/media/pi/miko-desk/resize $ ls

python-pi.img      r3b-stf-base-20200524.img      rsp-ubuntu-mate-base.img
r3b-bsf-base-20200524.img      resizeimage.pl     rsp-ubuntu-server2004-base.img

pi@r3b-bsf-base:/media/pi/miko-desk/resize $ sudo perl ./resizeimage.pl /media/pi/miko-desk/resize/r3b-bsf-base-20200524.img

r3b-bsf-base-20200524.img:           ← 対象イメージファイルは、「r3b-bsf-base-20200524.img」(Rasbian Buster)
==========================
Old size - 7419 MB (7.25 GB)          ← 元イメージファイル 7.25G が
New size - 5801 MB (5.67 GB)          ← リサイズされて、5.67G になった。
Image file was reduced by 1618 MB (1.58 GB)   ← 1.58G 縮小できた。(これで、8GのMicroSDにコピー可能となり、コピー処理時間の大幅な短縮になる)

pi@r3b-bsf-base:/media/pi/miko-desk/resize $ sudo perl ./resizeimage.pl /media/pi/miko-desk/resize/r3b-stf-base-20200524.img

r3b-stf-base-20200524.img:           ← 対象イメージファイルは、「r3b-bsf-base-20200524.img」(Rasbian Stretch)
==========================
Old size - 7415 MB (7.24 GB)
New size - 3696 MB (3.61 GB)
Image file was reduced by 3719 MB (3.63 GB)   ← 3.63G 縮小できた。(さらに大幅な短縮になる)

pi@r3b-bsf-base:/media/pi/miko-desk/resize $ sudo perl ./resizeimage.pl /media/pi/miko-desk/resize/rsp-ubuntu-mate-base.img

rsp-ubuntu-mate-base.img:
=========================
Old size - 14803 MB (14.46 GB)
There was an error in the file system that can't be automatically fixed... aborting.  ←できるのは、Rasbianだけみたいで、Ubuntuはエラーになる