自由空間伝搬損失
式:
FSPL(dB)= 20 log10(d) + 20 log10(f) + 20 log10(4π/c) - GTx - GRx
変数、定数:
- d = 距離(メートル単位)
- f = 周波数(Hz)
- c = 光速(3×108 m/s)
- GTx = 送信アンテナ利得(dBi)
- GRx = 受信アンテナ利得(dBi)
参照: https://qiita.com/noguhiro2002/items/60103e6bd21134cad543
Raspberry Piでデバイスを開発した!MicroSDの中身をImage ファイルに書き出して配布したい!でもやり方がわからない!そんなお方向けのマニアチックなQiitaです。
なお、MicroSDのバックアップおよびクローン作成にも最適です。
注意:まずは本内容が動くかどうかテスト用のMicroSDでテストしてから、目的のMicroSDで試してください。本メソッドを用いて生じた損害などについて筆者は一切の責任を持ちません。
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 ファイルを元に新たな 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`などで調べられます。
/dev/loop18p7(今回の場合)のパテーションを変更する際、あまりにもギリギリまで攻めすぎると、以下のエラー画面が出ます。この画面が出ましたら、少し余裕を持ってフリースペースを設定してみてください。以下のサイトを参考にさせていただきました。大変、ありがとうございました。