背景
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ファイルを小さくしたことよにとり、書き込みの時間を短くできました。参考
pishrinkHow to clone Raspberry Pi SD Card on Linux and shrink it to actual size
0 件のコメント :
コメントを投稿