|
| 1 | +# SD-Cardイメージのbuild方法 |
| 2 | + |
| 3 | +## 必要なbuild環境 |
| 4 | + |
| 5 | +- Window / MacOS / Linux |
| 6 | + |
| 7 | +- githubへのアクセスできる環境 |
| 8 | + |
| 9 | +- Dockerの実行環境 |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | +※ 以下MacOS Montereyで確認しています。 |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +## build方法 |
| 18 | + |
| 19 | +適当なdirectoryで下記を実行します。 |
| 20 | + |
| 21 | +```shell |
| 22 | +# git clone atomcam_tools |
| 23 | +# cd atomcam_tools |
| 24 | +# ./make.sh |
| 25 | +``` |
| 26 | + |
| 27 | +環境に依存しますが1時間程度でatomcam_tools.zipが出来上がります。 |
| 28 | + |
| 29 | +zipの中身は |
| 30 | + |
| 31 | +- authorized_keys |
| 32 | +- hostname |
| 33 | +- factory_t31_ZMC6tiIDQN |
| 34 | +- rootfs_hack.ext2 |
| 35 | + |
| 36 | +で、atomcam_tools/ 以下に出来ているものと同じです。 |
| 37 | + |
| 38 | +remote loginするなら、sshのpublic.keyをauthorized_keysに追加してください。 |
| 39 | + |
| 40 | +```shell |
| 41 | +# cat ~/.ssh/id_rsa.pub >> ./authorized_keys |
| 42 | +``` |
| 43 | + |
| 44 | +デバイス名を変更するなら、hostnameを修正してください。(default : atomcam) |
| 45 | + |
| 46 | +```shell |
| 47 | +# echo "hogehoge" > ./hostname |
| 48 | +``` |
| 49 | + |
| 50 | +上記4つのファイルをSD-CardにコピーしてAtomCamに入れて起動します。 |
| 51 | + |
| 52 | +初回起動時はswap fileの作成とsshのhost-keyを作成するのに少し時間がかかるので40秒程度かかります。 |
| 53 | + |
| 54 | +build環境は一度buildするとopenmiko/のdirectoryができて、docker上にコンテナが起動した状態になっています。 |
| 55 | + |
| 56 | +```shell |
| 57 | +# cd openmiko |
| 58 | +# docker-compose exec builder bash |
| 59 | +``` |
| 60 | + |
| 61 | +でコンテナに入れます。 |
| 62 | +dockerコンテナが落ちてるときは |
| 63 | + |
| 64 | +```shell |
| 65 | +# cd openmiko |
| 66 | +# docker-compose up -d |
| 67 | +``` |
| 68 | + |
| 69 | +で起動してください。 |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | +## Target(ATOMCam内部)の環境 |
| 74 | + |
| 75 | +ここで作ったイメージでATOMCamを起動すると、glibcで生成されたmipsel版のlinux環境が起動します。 |
| 76 | + |
| 77 | +この環境の中で/atom以下に本来のATOMCamのシステムを起動してchroot環境に閉じ込めています。 |
| 78 | + |
| 79 | +システム構成は |
| 80 | + |
| 81 | +- SoC: Ingenic T31 SoC |
| 82 | + |
| 83 | +- CPU: MIPS32R5 I\$32K/D\$32K/L2\$128K |
| 84 | +- kernel: linux 3.10.14 mipsel |
| 85 | + |
| 86 | +です。 |
| 87 | + |
| 88 | +WiFiはatom側のシステムが起動しているので、rootfs側は起動していません。 |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | +### 起動シーケンス |
| 93 | + |
| 94 | +##### u-boot -> kernelが内のinitramfsの/init_atomcam |
| 95 | + |
| 96 | + *initramfsはopenmiko/initramfs_skeletonにatomcam_configs/overlay_initramfsを重ねています。* |
| 97 | + |
| 98 | + initramfsはkernel 起動時のcmdlineで/init_atomcamを実行するようにしています。 |
| 99 | + |
| 100 | + この中でSD-Card上のrootfs_hack.ext2をrootにswitch_rootして、/sbin/init(busybox)を起動します。 |
| 101 | + |
| 102 | +##### rootfs_hack.ext2 |
| 103 | + |
| 104 | + *rootfs_hack.ext2はopenmikoのrootfs_minimalにatomcam_configs/openmiko.configで追加されたイメージにatomcam_configs/overlay_rootfsを重ねたものになります。* |
| 105 | + |
| 106 | + /sbin/initがinittabに従って/etc/init.d/rcSを起動して、rcSで/etc/init.d/S*を順番に実行します。 |
| 107 | + |
| 108 | + S35wifi,S45ntpdはAtomCamのシステム側で処理しているので実行しないほうが良いのですが、openmikoのskeletonに起動スクリプトがあるため、atomcam_config/overlay_rootfsで中身の無いものを上書きして無効にしています。 |
| 109 | + /etc/init.dを最後まで実行すると、serialを繋いでいればgettyでlogin promptが出ます。AtomCamの後ろ側のLEDが青点滅ー>青点灯になるとsshでloginできる状態になります。 |
| 110 | + |
| 111 | + 途中でATOMCamのシステムを起動する環境を整える/etc/init.d/S48atomcamを呼び出しています。 |
| 112 | + |
| 113 | +##### S48atomcam |
| 114 | + |
| 115 | + /atom/以下に本来のATOMCamのシステムと幾つかのmount-pointを共通でアクセスできるようにmountします。また、hackのために/tmp/system/bin/にscriptをコピーしています。 |
| 116 | + |
| 117 | + その後、chrootで/atomの/tmp/system/bin/atom_init.shを呼び出します。 |
| 118 | + |
| 119 | +##### atom_init.sh |
| 120 | + |
| 121 | + 本来のATOMCamの初期化シーケンスを実行します。 |
| 122 | + |
| 123 | + iCamera_appの実行時にlibcallback.soを噛ませて映像の横流しとwebHookのためのctorsへのsetlinebufの設定をしています。 |
| 124 | + |
| 125 | + さらにwebHookのためにlogを/tmp/log/に出力させています。 |
| 126 | + |
| 127 | + これを実行するとwatchdogが起動するため、assisとiCamera_appは止められなくなります。 |
| 128 | + |
| 129 | + iCamera_appは起動すると/configsの設定情報を読み込んで、wifiの起動、時刻の設定が行なっています。 |
| 130 | + |
| 131 | + ただし、外部コマンドは直接iCamera_appで実行されるのではなくassisにメッセージ通信経由で投げてassisが実行しています。 |
| 132 | + |
| 133 | + また、recognition等の機能はiCamera_appにあるわけではなく、cloudから読み込まれて実行されているようです。 |
| 134 | + |
| 135 | + |
| 136 | + |
| 137 | +### 各種script |
| 138 | + |
| 139 | +##### /scripts/mv.sh, /scripts/rm.sh |
| 140 | + |
| 141 | + ATOMCamのiCloud_appが動体検知をcloudに送信後に削除する時のrmコマンド、1分ごとのSD-Cardへの記録ファイルを/tmpから移動するmvコマンドを置き換えてNASへの記録やwebHookのeventを送信するためのscriptです。起動時に/tmp/system/bin/rm, mvにコピーしています。 |
| 142 | + |
| 143 | + iCound_appからmessage経由で外部コマンドを実行するassisの起動時のPATHの先頭に/tmp/system/binを挿入することでrm, mvコマンドを置き換えています。 |
| 144 | + |
| 145 | +##### /scripts/reboot.sh |
| 146 | + |
| 147 | + WebUIの定期reboot設定をcrontabで指定時間に実行するためのscriptです。 |
| 148 | + |
| 149 | + syncしてrebootを実行します。 |
| 150 | + |
| 151 | +##### /scripts/rtspserver.sh |
| 152 | + |
| 153 | + init.d/S58rtspserverとWebUIのRTSPのon/offから呼ばれます。 |
| 154 | + |
| 155 | + v4l2rtspserverをon/offします。 |
| 156 | + |
| 157 | +##### /scripts/webcmd.sh |
| 158 | + |
| 159 | + /var/www/cgi-bin/exec.cgiからnamed-FIFO経由でコマンドを実行します。 |
| 160 | + |
| 161 | + cgiの実行はwww-dataアカウントでの実行なのでシステム制御系のコマンドは直接実行できないので、コマンドを受けて実行して問題ないものだけ実行する構造にしています。 |
| 162 | + |
| 163 | +##### /scripts/webhook.sh |
| 164 | + |
| 165 | + iCamera_appのlogを受けてwebHookのイベントを拾っています。 |
| 166 | + |
| 167 | + iCamera_appの実行環境は制限があるため、logを一旦/tmp/log/atomcam.logに記録して、そのlogをここで受けてパースしてcurlでpostしています。 |
| 168 | + |
| 169 | + iCamera_appの出力をそのまま/tmp/log/atomcam.logにpipeで出力するとbufferされて遅延するため、libcallback.soにConstructorのhookを入れてsetlinebufでlineごとのbufferingに変更しています。 |
| 170 | + |
| 171 | +##### /var/www/cgi-bin/exec.cgi |
| 172 | + |
| 173 | + WebUIからのコマンドをnamed-pipe経由でwebcmd.shに投げています。 |
| 174 | + |
| 175 | +##### /var/www/cgi-bin/get_jpeg.cgi |
| 176 | + |
| 177 | + WebUIで表示するjpeg画像を取得しています。 |
| 178 | + |
| 179 | +##### /var/www/cgi-bin/get_time.cgi |
| 180 | + |
| 181 | + WebUIで表示するATOMCamの時刻を1秒ごとに取得しています。 |
| 182 | + |
| 183 | +##### /var/www/cgi-bin/hack_ini.cgi |
| 184 | + |
| 185 | + WebUIで使用している設定値の取得、設定をします。 |
| 186 | + |
| 187 | + |
| 188 | + |
| 189 | +## WebUI |
| 190 | + |
| 191 | +artomcam_configs/web/以下にWebUIのソースコードがあります。 |
| 192 | + |
| 193 | +WebUIはVue.jsとElementUIで記述しています。 |
| 194 | + |
| 195 | +Target環境はmipselなのでnode.jsの最近のバージョンは未対応になります。 |
| 196 | + |
| 197 | +そのため、frontend側のみbuildして、backend側はlighttpdとcgiで対応し、frontendからaxios経由でアクセスする構造にしています。 |
| 198 | + |
| 199 | +WebUIの画面はatomcam_configs/web/source/vue/Setting.vueに記述しています。 |
| 200 | + |
| 201 | + |
| 202 | + |
| 203 | +## Docker環境 |
| 204 | +Docker環境では/srcがopenmiko/にmapされています。 |
| 205 | + |
| 206 | +以下、基本的にDocker内のコマンドは下記のDirectoryから実行します。 |
| 207 | + |
| 208 | +```shell |
| 209 | +root@ac0375635c01:/openmiko# cd /openmiko/build/buildroot-2016.02 |
| 210 | +``` |
| 211 | + |
| 212 | +rootfsはglibc環境でopenmikoのDocker内のgccを使用します。 |
| 213 | +build時にgccも生成されます。 |
| 214 | +gccのprefixは |
| 215 | +**/openmiko/build/buildroot-2016.02/output/host/usr/bin/mipsel-ingenic-linux-gnu-** |
| 216 | +です。 |
| 217 | + |
| 218 | +ATOMCam本来のシステムのカメラアプリiCamera_appはuClibcの環境でbuildされています。 |
| 219 | + |
| 220 | +そのためiCamera_appのhack用のlibcallback.soのbuildにはuClibc環境が必要なので別途cloneしている |
| 221 | +**/openmiko/build/mips-gcc472-glibc216-64bit/bin/mips-linux-uclibc-gnu-** |
| 222 | +を使用しています。 |
| 223 | + |
| 224 | + |
| 225 | + |
| 226 | +### 各種変更時のbuild方法 |
| 227 | + |
| 228 | + initramfs, kernelのconfigを変更した場合 |
| 229 | + |
| 230 | +```shell |
| 231 | +root@ac0375635c01:/openmiko# make linux-rebuild |
| 232 | +root@ac0375635c01:/openmiko# cp output/images/uImage.lzma /src |
| 233 | +``` |
| 234 | + |
| 235 | +でbuildされてopenmiko/にコピーされます。 |
| 236 | + |
| 237 | + |
| 238 | + |
| 239 | +rootfs内のファイルやopenmiko、busyboxのmenuconfigを修正した場合 |
| 240 | +```shell |
| 241 | +root@ac0375635c01:/openmiko# make |
| 242 | +root@ac0375635c01:/openmiko# cp output/images/rootfs.ex2 /src |
| 243 | +``` |
| 244 | + |
| 245 | +でbuildされてopenmiko/にコピーされます。 |
| 246 | + |
| 247 | +それぞれfactory_t31_ZMC6tiIDQN, rootfs_hack.ex2の名前でSDCardにコピーしてください。 |
| 248 | + |
| 249 | + |
| 250 | + |
| 251 | +rootfsに含まれるpackageの変更した場合 |
| 252 | + |
| 253 | +```shell |
| 254 | +root@ac0375635c01:/openmiko# make menuconfig |
| 255 | +root@ac0375635c01:/openmiko# make |
| 256 | +``` |
| 257 | + |
| 258 | +でrootfsがbuildされます。 |
| 259 | + |
| 260 | + |
| 261 | + |
| 262 | +個別のpackegeのrebuildの場合 |
| 263 | + |
| 264 | +```shell |
| 265 | +root@ac0375635c01:/openmiko# make <package>-rebuild |
| 266 | +``` |
| 267 | + |
| 268 | +です。 |
| 269 | + |
| 270 | + |
| 271 | + |
| 272 | +busyboxのコマンド等の設定変更の場合 |
| 273 | + |
| 274 | +```shell |
| 275 | +root@ac0375635c01:/openmiko# make busybox-menuconfig |
| 276 | +root@ac0375635c01:/openmiko# make |
| 277 | +``` |
| 278 | + |
| 279 | +でrootfsがbuildされます。 |
| 280 | + |
| 281 | + |
| 282 | + |
| 283 | +kernelの設定変更の場合 |
| 284 | + |
| 285 | +```shell |
| 286 | +root@ac0375635c01:/openmiko# make linux-menuconfig |
| 287 | +root@ac0375635c01:/openmiko# make linux-rebuild |
| 288 | +``` |
| 289 | + |
| 290 | +でuImage.lzmaが生成されます。 |
| 291 | + |
| 292 | + |
| 293 | + |
0 commit comments