Raspberry Piのimgサイズ縮小後の注意点

私のように無駄に64GBに焼いて、16GBとかに焼き直したい・・・という時にファイルサイズを縮小させますが、その後に起こる注意点など・・・

縮小させる方法は、色々なブログでも紹介されている通り以下のリンク先を参照です

https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=58069

とりあえず、以下の内容を丸コピします

#!/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に外付けHDDを取り付けてマウントさせます

とりあえず、dfでデバイスをチェックします

赤枠の部分を見ると、/dev/sdb1となっているのがHDDです

その下を見ると、/dev/sda1というのがいると思います。これは先に繋いでおいたUSBメモリを認識しています

つまり、繋がった順番毎に割り当てられていくという感じですので、何も事前に繋いでいなければ、通常は/dev/sda1です

とりあえず、/dev/sda1という事にして解説を進めます

先にマウント先のフォルダを作成します

$ sudo mkdir /mnt/hdd

続いてマウントします

$ sudo mount /dev/sda1 /mnt/hdd

これで、先ほど/dev/sda1として認識されていたHDDが、/mnt/hddのフォルダで読み込めるようになりました

先ほど作成したresizeimage.plファイルを/mnt/hddにコピーしましょう

コピー方法は色々とありますが、私はWinSCPを使ってネットワーク越しにコピーします

なので、/mnt/hddを誰でもファイルが書き込めるようにします

$ sudo chmod 777 /mnt/hdd

これで誰でもHDDに書き込めます。本来はセキュリティ的にあんまりやりたくない奴です

ここからはWinSCPを使ってファイルをコピーします。コピーはresizeimage.plと、事前に用意してあるであろう、Raspberry Piのimgファイルです

書くの疲れてきたので、こちらをご参照ください

なお、コピー先は/mnt/hddに両方コピーしてくださいね

コピーが完了したら次に進みます。ちゃんとコピーされてるかを確認する為にフォルダの中を確認します

$ cd /mnt/hdd
$ ls

これでresizeimage.plが表示されていれば、OKです。次に進みます

以下のコマンドを実行します。Raspberry piのimgファイル名までは、フルパスで書いてください

$ sudo perl ./resizeimage.pl /mnt/hdd/RasberryPiのimgファイル名

実行すると、圧縮が始まります

同じファイル名の物が作成され、ファイルサイズが小さくなっているはずです

ここからが本題!

という長い前置きを経て、私が経験した注意点を以下羅列・・・

全て容量圧縮後に発生しています

・Softether VPNの設定が一部消えた(管理ソフトから接続に行く際、992ポートを使うようにしていたはずが、SSL(443ポート)で勝手に接続するようになった)→992ポートに接続するように再設定して解決

・上記のせいでnginxが起動しなかった(既に443ポートは別のアプリで使われてますのエラーを吐いていた)→上記の設定変更により解決

・縮小後は容量が凄くギリギリになるので、Mysqlが正しく起動しなかった→新しいMicroSDカードの領域に合わせて容量を拡張したら解決

というわけなので、縮小後にいつも動いてた設定が動かない!でも慌てず騒がず、一旦容量を拡張して再起動してみましょう

Softetherについては、バグだと思うけど・・・