2022年5月22日日曜日

Raspberry Piのimgファイルを圧縮(空白領域を少なく)する


背景

Raspberry Pi向けのSDカードを複製するにはSDカードからimgファイルを作成して他のSDに書けば出来はするのですが、何も意識していないとimgファイルがSDカードと同じ容量になるのでとても時間がかかります。

調べてみたところpishrinkという名前のスクリプトを利用するとimgファイルを小さく出来ると分かりました。(参考: How to clone Raspberry Pi SD Card on Linux and shrink it to actual size

取り組むたびに調べ直しているので、備忘録を兼ねて記事を残します。

使ったもの

  • SDカードを読み込めるPC
  • Ubuntuのターミナル
    ddとwgetを利用します。
  • SDカード
    今回はRaspberry PiOSを書き込んだ16GBのSDカードを複製しました

pishrinkの準備

wgetでpishrinkをダウンロードします。
下記のコマンドでは/tmp/pishrink.shとしてダウンロードしています。
wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh -O /tmp/pishrink.sh

引数なしで実行すると使い方が表示されます。
bash /tmp/pishrink.sh


imgファイル処理コマンド

SDカードからimgファイル作成

/dev/mmcblk0として認識されたSDカードから/tmp/raspi.imgファイルを作成します。
sudo dd bs=4M if=/dev/mmcblk0 of=/tmp/raspi.img conv=fsync status=progress

自分のPCだと16GBのSDカードのimgファイルの作成に6分ほどかかりました。
出来上がったimgファイルは15GBでした。


ddコマンドはSDカードの領域を全てコピーするのでSDカードと同等の大きさのimgファイルが出来てしまいますが、今回取り込んだSDカードはbootパーティションとrootfsパーティションを合わせても利用領域が5GBに満たないので、5GB弱になってくれると嬉しいところです。



pishrinkでimgファイルを縮小

この15GBのimgを先ほどダウンロードしたpishcinkで小さくします。
sudo bash /tmp/pishrink.sh /tmp/raspi.img
ちなみに、pishrinkは第2引数に出力先のimgのパスを渡すと元のファイルは維持しますが、処理前にコピーを行うため時間とPCのストレージ領域が多く必要になります。
元のimgファイルを維持する必要が無いなら、処理対象のimgファイルを変更する方が処理が早くて良いと思います。

1分弱の処理で15GBのimgファイルが3.9GBになりました。


imgファイルをSDに書き込み

小さくなったimgファイルは元の大きさのimgファイルと同様にddコマンドでSDカードに書き込めます。
(取り込みコマンドとはofとifの引数が入れ替わっています。)
sudo dd bs=4M if=/tmp/raspi.img of=/dev/mmcblk0 conv=fsync status=progress

pishrinkで小さくしたimgファイルを書き込んだSDカードはboot268MB、rootfs3.9GB、空き11GBでした。


各パーティションの中身は、bootは使用50MBで空き213MB、rootfsは使用2.5GBで空き1.1GBでした。
bootパーティションはpishrinkを適用前とほぼ同じですが、rootfsパーティションは使用量に合わせて小さくなっていました。
(rootfsの使用領域がpishrink適用前より小さくなっているのは謎です。)



配布されているRaspberry Pi OSのようにpishrinkによって初回起動時にパーティションを広げて再起動する処理が動くようになっている(rootfs/etc/rc.localがpishrink用に置き換えられています)ので、起動して放置しておけばrootfsパーティションがSDカードの容量に合わせて大きくなります。

おわり

pishrinkを使うことによりSDカードのimgファイルを小さくしたことよにとり、書き込みの時間を短くできました。

参考

pishrink
How to clone Raspberry Pi SD Card on Linux and shrink it to actual size

0 件のコメント :