#はじめに
Raspberry Piでデバイスを開発した!MicroSDの中身をImage ファイルに書き出して配布したい!でもやり方がわからない!そんなお方向けのマニアチックなQiitaです。
なお、MicroSDのバックアップおよびクローン作成にも最適です。
注意:まずは本内容が動くかどうかテスト用のMicroSDでテストしてから、目的のMicroSDで試してください。本メソッドを用いて生じた損害などについて筆者は一切の責任を持ちません。
#Material
- 配布用imageを作りたいRaspberry PiのMicroSD (今回はRaspberry Pi3B+のRaspbian Buster, 32GB)
- Ubuntu 18.04 LTS (作業用PC)
- GParted (Linux用パーテション編集ソフト.今回の主役)
#Method
-
GPartedをUbuntuへインストール
$ sudo apt update $ sudo apt upgrade $ sudo apt install gparted
-
Raspberry Piから取り出したMicroSDを、Ubuntuが入っているPCへ入れる。
-
どのUSBデバイスとして認識されているのか、
$ sudo fdisk -l
で確認する。ここからの操作を間違えるとデータ全損失につながる可能性があるので注意!$ sudo fdisk -l ... Disk /dev/sdc: 29.2 GiB, 31312576512 bytes, 61157376 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x000816c0 ... # 今回は/dev/sdcでした。
-
dd
コマンドを用いてブロック単位でバックアップを行います。これでパテーション/ファイルシステムによらず、MicroSDの中身すべてのバックアップが可能になります。dd
コマンドを使用する際は、if(input file)とof(output file)の指定に注意してください!間違えると一瞬でデータが飛びます!(参考: Arch linux, ディスクのクローン)。$ sudo dd bs=1M if='/dev/sdx' of='/path/to/image/file/hoge.img' status=progress # ifはMicroSDのデバイス場所今回は'/dev/sdc' # ofはimageファイルのパス。ファイル名は自由。拡張子は'.img'。 # 終了までしばらく待ちます。 31301042176 bytes (31 GB, 29 GiB) copied, 1469 s, 21.3 MB/s 29862+0 records in 29862+0 records out 31312576512 bytes (31 GB, 29 GiB) copied, 1470.23 s, 21.3 MB/s
-
吸い出したimgファイルを、/dev/loop(ループバックデバイス)にマウントし、GPartedで編集します。
$ sudo losetup -f # /dev/loop (ループバックデバイス)の空きを探します。 /dev/loop18 # 今回は /dev/loop18 でした。 $ sudo losetup /dev/loop18 '/path/to/image/file/hoge.img' # 空いていた/dev/loop (今回は/dev/loop18) に dd で吸い取った img ファイルをマウントします。 $ sudo partprobe /dev/loop18 # パーティションテーブルを変更したことをOSに知らせます。 $ sudo gparted /dev/loop18 # GPartedを起動します。
-
GPartedでパーティションの編集を行います。
-
RaspbianをNOOBSでインストールすると、このように複雑なパーティションに分かれています。Raspbianを直にインストールしていればもっと単純なはずです (参考:バックアップしたイメージファイルを縮小する)。
-
パーティションが可視化されたバーの白い部分が空きスペース (データは書き込まれていないが容量は食っている部分) なので、ここを減らします。一番下の
/dev/loop18p7
をクリックし、その上で右クリック --> Resize/Move
を選択し、Resize/Move windowを開きます。
-
スケールバーをドラッグし、白いフリー部分を黄色のデータが存在する領域付近まで持っていきます。なお、このときギリギリまでもってくると失敗します(Trouble-Shooting参照)。その後、
Resize/Move
をクリックし、パーティション変更情報を保存します(まだパーテションの変更処理は行われていません)。
-
/dev/loop18p7
の領域は変更されましたが、親である/dev/loop18p2
はまだ変更されていません。/dev/loop18p2
を選択し、その上で右クリック --> Resize/Move
を選択し、Resize/Move windowを開きます。先ほどと同様、スケールバーをドラッグし、unallocated部分(灰色)を減らしますが、今回はピッチリ黄色の/dev/loop18p7
へ寄せます。その後、Resize/Move
をクリックし、パーティション変更情報を保存します(まだパーテションの変更処理は行われていません)。
-
パーティション変更情報がこの状態になったことを確認し、GParted window上部中央やや左の緑の✔マークをクリックし、プロセスを開始します。
-
処理が終了したのを確認後、
Close
をクリックして画面を閉じ、編集後のパーティションの"unallocated"が/dev/loop18p2
から独立し、分かれて存在していることを確認します。
-
GPartedを終了します。
-
GPartedで編集したパーティションの"unallocated"部分を
fdisk
を用いて削除します。$ sudo losetup -d /dev/loop18 # /dev/loop18をunmountします。 $ sudo fdisk -l '/path/to/image/file/hoge.img' # fdisk -l を用いてGPatedで編集したパーティションを見ます。 Disk /path/to/image/file/hoge.img: 29.2 GiB, 31312576512 bytes, 61157376 sectors Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000816c0
Device Boot Start End Sectors Size Id Type
/path/to/image/file/hoge.img1 8192 4994140 4985949 2.4G e W95 FAT16 (LBA)
/path/to/image/file/hoge.img2 4994141 31594495 26600355 12.7G 5 Extended
/path/to/image/file/hoge.img5 4997120 5062653 65534 32M 83 Linux
/path/to/image/file/hoge.img6 5062656 5586941 524286 256M c W95 FAT32 (LBA)
/path/to/image/file/hoge.img7 5586944 31594495 26007552 12.4G 83 Linux
```
-
truncate
コマンドでhoge.imgのフリースペースを削除し、最終的な配布用imgファイルを作ります。このとき、セクターの最大値(今回は"31594495")に1を足し、それを512倍したもののサイズを指定します。$ sudo truncate --size=$[(31594495+1)*512] '/path/to/image/file/hoge.img'
-
無事にファイルサイズが小さくなった配布用のimageファイルが作成されました!
sudo chown
でパーミッションを変更し完成です!$ ls -lh ... -rw-r--r-- 1 root root 25G Feb 23 20:00 hgoe.img ... $ sudo chown hoge:hoge ./hoge.img ... -rw-r--r-- 1 hoge hoge 25G Feb 23 20:00 hgoe.img ...
-
おつかれさまでした !!
#作成したimgファイルを元にしたクローンの作成
今回作成した img ファイルを元に新たな MicroSD を作成するには、再びdd
コマンドを使用します。ifとofの指定に気をつけてください!特にofの指定を誤ると他の補助記憶装置の中身が全削除されます!
$ sudo dd bs=1M if='/path/to/image/file/hoge.img' of=/dev/sdx status=progress
# MicroSDのデバイスIDは、`fdisk -l`などで調べられます。
#Trouble-Shooting
- GPatedで
/dev/loop18p7
(今回の場合)のパテーションを変更する際、あまりにもギリギリまで攻めすぎると、以下のエラー画面が出ます。この画面が出ましたら、少し余裕を持ってフリースペースを設定してみてください。
#References
以下のサイトを参考にさせていただきました。大変、ありがとうございました。