- 投稿日:2019-08-19T22:52:53+09:00
パケットフィルタを使用してパケットドロップを発生させる
クラスタを分断してスプリットブレインを発生させたい!(サーバ間のハートビートが出来ないようにしたい!)
...ということでパケットドロップが起きるようにiptablesによるフィルタを実施。その時のメモ。(2017.07)
フィルタ作成
$ iptables -A INPUT -t filter -p tcp --dport 50000 -j DROP<パラメータ説明>
パラメータ 意味 -A ルールの追加 INPUT 入力(受信)パケット -t filter 対象テーブル=filter(パケットフィルタリングを参照するテーブル) -p tcp プロトコル=tcp --dport 50000 送信先ポート番号=50000 -j DROP ターゲット=パケット破棄 フィルタ確認
$ iptables --list<パラメータ説明>
パラメータ 意味 --list ルール一覧表示 こんな感じで表示されたらちゃんと設定されています!
[root@host ~]# iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:50000フィルタ削除
$ iptables -D INPUT -t filter -p tcp --dport 50000 -j DROP※フィルタ追加で使用するパラメータ
-A
を-D
にすればOK<パラメータ説明>
パラメータ 意味 -D ルールの削除 INPUT 入力(受信)パケット -t filter 対象テーブル=filter(パケットフィルタリングを参照するテーブル) -p tcp プロトコル=tcp --dport 50000 送信先ポート番号=50000 -j DROP ターゲット=パケット破棄 これだけで簡単に使用可能。
- 投稿日:2019-08-19T19:34:37+09:00
未経験者向け ShellScript Bash 〜超初心者用解説〜
未経験者 の ための ShellScript 〜超初心者用解説〜
目的
- ShellScriptを書く方法を知る ※プログラミング未経験状態で入社していきなりShellScriptを書かされた時に教えて欲しかったことを書きます。
※記法など詳しいことは説明せず、記載方法や実行方法を主に書いていきます。この記事のターゲット
- ShellScriptを始めて書く方
- Linuxに全く触ったことがなく、ShellScriptを書かないといけなくなってしまった方
SheellScriptって??
- Linuxコマンドが羅列された処理ファイルのこと。
- ファイルに記載されたコマンドを上から順に実行していく。
- コンパイルしなくても実行できる。
- 拡張子は
.sh
- 難しそうに見えるけど思いの外簡単に書くことができる。
ShellScriptはどこに書くの?
- 記載自体はWindowsでも、macでも、Linuxでも書ける。
- 新規ファイルを作成し、任意のファイル名をつけて拡張子を
.sh
にしてあげて、文字が入力できるアプリ(メモ帳など)で開いて記載する。どうやって実行するの?
- Linuxの環境にファイルを持って行って実行する。
- WindowsにGit Bashをいれて実行する。 Git Bashのインストール方法はこちら
合理的なShellScriptの記載方法は?
- Linuxのマシンを起動してログインをして記載する。
- TeraTermなどのsshを使用したターミナルからログインして記載する。
- VisualStudioCodeのプラグイン「SSH FS」を使用して記載する。
- Windowsの好きなテキストエディタで記載してGit Bashで実行 ※この方法だと、フォルダ階層などが実際に使用する環境とは異なることが多いためちょっとレベル高いかも・・・?
ちょっとしたテクニック
- ShellScriptを書くときは一行書く→Linuxマシンのターミナルで追加した一行を実行してみて処理がおかしくならないか確認してから進めるとエラー箇所が見つけやすい
まとめ
- ShellScriptはLinuxコマンドが羅列されたファイル
- どこでも書ける
- Linux上で実行することが望ましい
- 投稿日:2019-08-19T17:33:00+09:00
ラズベリーパイで監視カメラ作ってみる。
ラズベリーパイで監視カメラを作る方法を書いておきます。
多分USBカメラはこのやり方じゃできないと思います。
まずはRPi_cam_Web_Interfaceというファイルをダウンロードしないといけないので下記のコマンドを実行します。$ git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.gitこれでファイルがインストールできたので、次はそのファイルの中に入っているinstall.shを実行します。
$ ./install.shこれでインストール画面が出てきますので、任意の設定をします。(基本的にはそのままで大丈夫です。)
これができたら、http://ラズパイのIPアドレス/
でカメラにつながると思います。
- 投稿日:2019-08-19T16:48:44+09:00
Web UI on WLS's ubuntu
Web UI
WLSの設定手順は以前書いたが、Gitが使えるWeb UIを入れたくていくつか試した。
- GitLab (途中)
- Kallithea (途中)
- GitBucket インストールできた
GitLab
Ubuntu アップデート
$ sudo apt update
$ sudo apt upgradeGitlab インストール
$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
$ sudo apt install gitlab-ce更新後に、下記のコマンドで再コンフィグをかける
$ sudo gitlab-ctl reconfigureここで終わらない。WLSではないUbuntuではうまくいくのだが。。。
Kallithea
python 関連の準備
apt-get install python-dev
apt-get install git
apt-get install python-pip
easy_install pip
easy_install PasteScriptKallitheaのインストール
pip install kallithea
ここまでOkay
paster make-config Kallithea kallithea.ini
pasterのエラーが取れず挫折中。
GitBucket
こちらの記事の通りで問題なく動作
https://qiita.com/YuseiUeno/items/9cbceb7456068a6a3bb4gitbucketのデータやリポジトリが置かれる場所は、デフォルトでは~/.gitbucketだったため、
環境変数GITBUCKET_HOMEに指定すると変更できた。8080ポート指定は、
apache-tomcat-8.5.8/conf/server.conf
で変更できる以上
- 投稿日:2019-08-19T16:48:44+09:00
Gitlab CE on WLS's ubuntu
ginatraを試してみたけど、Gitlab CEが使いたくなり試してみた
WLS(Windows subsystem for Linux)でUbuntuを動作させて、Gitlabを動かすまでの手順
アップデート
$ sudo apt update
$ sudo apt upgradeGitlab インストール
$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
$ sudo apt install gitlab-ceaptから呼び出すdpkgがとても遅いせいなのか
何が悪いんだろうか、5時間くらいかかった。
設定更新
下記のファイルを更新する
$ sudo emacs /etc/gitlab/gitlab.rb
更新後に、下記のコマンドで再コンフィグをかける
$ sudo gitlab-ctl reconfigure
動作確認
ブラウザからIPアドレスにアクセスして表示を確認。
以上
- 投稿日:2019-08-19T16:38:19+09:00
QEMUでTOPPERS/ASPカーネルを動かす - 本編
前回記事の続きで、今回は、、、
QEMUでTOPPERS/ASPカーネルを動かしてしまいます!すなわち、Linux(今回はUbuntu)さえあればRTOSが動かせるわけで、誰しも容易にRTOSが体験できます!
(本編の)本編
1. 準備
1-1. 環境
基本は前回記事を踏襲ですが、それら以外。
QEMU 0.14.0
TOPPERSで確認済みのバージョン。パッチを当ててからビルドします。
1-2. QEMUの準備
1-2-1. ダウンロード
QEMU 0.14.0
https://download.qemu.org/qemu-0.14.0.tar.gzこいつを、以下のディレクトリに配置します。
user@user-VirtualBox:~/toppers/stellaris$ ls asp asp-1.9.3.tar.gz asp_arch_arm_m_gcc-1.7.0.tar.gz cfg-linux-static-1_9_6.gz qemu-0.14.0.tar.gz1-2-2. 展開
tarコマンドで展開。
user@user-VirtualBox:~/toppers/stellaris$ tar zxf qemu-0.14.0.tar.gz user@user-VirtualBox:~/toppers/stellaris$ ls asp asp-1.9.3.tar.gz asp_arch_arm_m_gcc-1.7.0.tar.gz cfg-linux-static-1_9_6.gz qemu-0.14.0 qemu-0.14.0.tar.gz1-2-3. パッチ適用
ASPカーネルのターゲット依存部のマニュアル(asp/target/lm3sxxxx_gcc/target_user.txt)によれば、QEMUにはパッチを当てる必要性があるとのこと。
以下コマンドを投入します。user@user-VirtualBox:~/toppers/stellaris$ cd qemu-0.14.0/ user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0$ patch -p2 < ../asp/target/lm3sxxxx_gcc/qemu-0.14.0-patch.diff patching file configure patching file gdbstub.c patching file hw/a9mpcore.c patching file hw/arm_gic.c patching file hw/arm11mpcore.c patching file hw/mpcore.c patching file hw/realview.c patching file scripts/signrom.sh patching file target-arm/helper.c1-2-4. configure
以下コマンドを実行。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0$ mkdir OBJ user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0$ cd OBJ/ user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ ../configure --target-list=arm-softmmu Install prefix /usr/local BIOS directory /usr/local/share/qemu (略) rbd support no xfsctl support noなお私の環境では、このままmakeすると
timer_gettimeがない
と怒られビルドが通らなかったので、以下のように設定を書き換えています。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ diff config-host.mak.old config-host.mak 76c76 < LIBS+=-lpthread --- > LIBS+=-lpthread -lrt1-2-5. make
これでmakeが通ることを確認。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ make GEN arm-softmmu/config-devices.mak GEN config-all-devices.mak (略) Signing optionrom/linuxboot.bin rm multiboot.o linuxboot.raw linuxboot.img multiboot.raw multiboot.img linuxboot.o1-2-6. リンクを張る
今後の作業簡略化のため、QEMU実行ファイルへのリンクを張っておきます。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ cd ../../ user@user-VirtualBox:~/toppers/stellaris$ ls qemu-0.14.0/OBJ/arm-softmmu/qemu-system-arm qemu-0.14.0/OBJ/arm-softmmu/qemu-system-arm user@user-VirtualBox:~/toppers/stellaris$ ln -s qemu-0.14.0/OBJ/arm-softmmu/qemu-system-arm user@user-VirtualBox:~/toppers/stellaris$ ls asp asp_arch_arm_m_gcc-1.7.0.tar.gz qemu-0.14.0 qemu-system-arm asp-1.9.3.tar.gz cfg-linux-static-1_9_6.gz qemu-0.14.0.tar.gz2. いよいよ動かす!
2-1. まずは、通常起動
以下コマンドで動作するはずです。
パラメータがかなり多いので、コピーすることを強く推奨。user@user-VirtualBox:~/toppers/stellaris$ ./qemu-system-arm -cpu cortex-m3 -M lm3s6965evb -serial stdio -no-reboot -icount auto --kernel asp/OBJ/asp -L ./qemu-0.14.0/pc-bios VNC server running on `127.0.0.1:5900' TOPPERS/ASP Kernel Release 1.9.3 for LM3SXXXX(ARM Cortex-M3) (Aug 19 2019, 11:39:23) Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory Toyohashi Univ. of Technology, JAPAN Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory Graduate School of Information Science, Nagoya Univ., JAPAN System logging task is started on port 1. Sample program starts (exinf = 0). task1 is running (001). | task1 is running (002). | (略)なお、-Lオプションは、私の環境ですと初回に以下エラーで起動しなかったので、無理矢理追加してみました。
(1回でも起動すれば大丈夫ぽいですが、面倒なので追ってはいません、笑)Could not read keymap file: 'en-us'
なお、正常動作はこちらの記事を参考にしてください。
2-2. GDBデバッグするなら
QEMUはサーバー機能があるので、GDBデバッグが可能です。
これには以下のように「-s -S」オプションを追加してやればよいです。
(「-s」は「-gdb tcp::1234」と同じ意味です)user@user-VirtualBox:~/toppers/stellaris$ ./qemu-system-arm -cpu cortex-m3 -M lm3s6965evb -serial stdio -no-reboot -icount auto --kernel asp/OBJ/asp -L ./qemu-0.14.0/pc-bios -s -S VNC server running on `127.0.0.1:5900' (-Sオプション指定により、ここで止まる)GDBクライアント側は以下のごとく、起動後にtargetでアタッチしてやればよいですね。
user@user-VirtualBox:~/toppers/stellaris$ arm-none-eabi-gdb asp/OBJ/asp GNU gdb (7.10-1ubuntu3+9) 7.10 Copyright (C) 2015 Free Software Foundation, Inc. (略) Type "apropos word" to search for commands related to "word"... Reading symbols from asp/OBJ/asp...done. (gdb) target remote:1234 Remote debugging using :1234 _start () at ../arch/arm_m_gcc/common/start.S:63 63 cpsid f /* 割込みロック状態へ */ (gdb) c Continuing. (以降はご自由に・・・)3. おまけ
自分用メモみたいなもの
ターゲットを「lm3s811evb」とすると起動しない
QEMU内部のRAMサイズ定義誤り。「lm3s6965evb」と同等にする必要がある。
パッチを当てないとどうなるか
起動はするが、以下が出まくる。泣
最新版のQEMUにパッチが当たるか、当ててどうなるかは試してない。../kernel/time_event.c:356: Assertion `sense_context()' failed.
おわりに
えーと、想像より遥かに大変でした。笑
言うならば、ASPカーネルのドキュメントに従っただけなのですが、何しろ情報が古い(確認環境も古い)ので、そのギャップが原因かと思います。
今回は(も)?とりあえず動かしてみたよってだけですので、今後はより使いやすいモノ・情報を提供していく予定です!
参考
(特になし)
- 投稿日:2019-08-19T15:06:07+09:00
Google Edge TPU用に構築されたモデル
以下のリストでは、各「Edge TPUモデル」リンクは、Edge TPUで実行するためにプリコンパイルされた
.tflite
ファイルを提供します。 APIデモに示されているスクリプトを使用して、Coralデバイスでこれらのモデルを実行できます。 (モデルの対応するラベルファイルもダウンロードすることを忘れないでください。)多くのモデルについて、「すべてのモデルファイル」へのリンクも提供しています。これは、以下を含むアーカイブファイルです。
- 訓練されたモデルのチェックポイント
- 訓練されたモデルの凍結グラフ
- 評価グラフテキストプロトタイプ(簡単に表示できるように)
- 入力および出力情報を含む情報ファイル
- CPUで実行される量子化TensorFlow Liteモデル(分類モデルにのみ含まれる)
分類モデルを再トレーニングし、オブジェクト検出モデルを再トレーニングするチュートリアルに示されているように、この「すべてのモデルファイル」アーカイブをダウンロードして、転送学習の基礎としてモデルを使用する場合に必要なチェックポイントファイルを取得します。
すべてのモデルを一度にダウンロードする場合は、Gitリポジトリ
https://coral.googlesource.com/edgetpu
のクローンを作成してから、edgetpu / test_data /
でモデルを見つけることができます。注意:これらは製品品質のモデルではありません。 これらはデモンストレーションのみを目的としています。
Edge TPU用の独自のモデルを構築するには、Edge TPUコンパイラを使用する必要があります。
ImageNetでトレーニングされたすべてのモデルはILSVRC2012データセットを使用しました。
画像分類
EfficientNet-EdgeTpu(S)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224EfficientNet-EdgeTpu(M)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:240x240EfficientNet-EdgeTpu(L)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:300x300MobileNet V1(ImageNet)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224MobileNet V2(ImageNet)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224MobileNet V2(iNat昆虫)
1,000種類以上の昆虫を認識
データセット:iNaturalist
入力サイズ:224x224MobileNet V2(iNatプラント)
2,000種類以上の植物を認識
データセット:iNaturalist
入力サイズ:224x224MobileNet V2(iNatバード)
900種類以上の鳥を認識
データセット:iNaturalist
入力サイズ:224x224Inception V1(ImageNet)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224Inception V2(ImageNet)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224Inception V3(ImageNet)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:299x299Inception V4(ImageNet)
1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:299x299物体検出
MobileNet SSD v1(COCO)
90種類のオブジェクトの位置を検出します
データセット:COCO
入力サイズ:300x300MobileNet SSD v2(COCO)
90種類のオブジェクトの位置を検出します
データセット:COCO
入力サイズ:300x300MobileNet SSD v2(顔)
人間の顔の位置を検出します
データセット:Open Images v4
入力サイズ:320x320
(ラベルファイルは必要ありません)デバイス上の再トレーニング(分類)
MobileNet v1埋め込み抽出プログラム
このモデルは、
SoftmaxRegression API
を使用したデバイス上の転送学習の埋め込み抽出機能として使用できるように、最後に完全に接続されたレイヤーを削除してコンパイルされます。 このモデルはそれ自体で分類を実行しないため、SoftmaxRegression API
とペアにする必要があります。詳細については、「バックプロパゲーションを使用してデバイス上で分類モデルを再トレーニングする」を参照してください。(https://coral.withgoogle.com/docs/edgetpu/retrain-classification-ondevice-backprop/)
L2ノルムを備えたMobileNet v1
これは、L2正規化レイヤーおよびImprintingEngine APIと互換性があるその他の変更を含むMobileNet v1の修正バージョンです。 Edge TPU用に構築されていますが、最後に完全に接続されたレイヤーがCPUで実行され、再トレーニングが可能になります。
詳細については、「重量インプリンティングを使用したデバイス上の分類モデルの再トレーニング」を参照してください。(https://coral.withgoogle.com/docs/edgetpu/retrain-classification-ondevice/)
Coral Dev Boardは、Edge TPUコプロセッサーを搭載したシングルボードコンピューターです。 機械学習モデル用の高速なデバイス上の推論を必要とする新しいプロジェクトのプロトタイピングに最適です。
- Google Coral EDGE TPU 海外代理店薦める,グローバル出荷:https://store.gravitylink.com/global
Coral USB Acceleratorは、コンピューターのコプロセッサーとしてEdge TPUを提供するUSBデバイスです。 Linuxホストコンピューターに接続すると、機械学習モデルの推論が高速化されます。
- 投稿日:2019-08-19T13:04:20+09:00
QEMUでTOPPERS/ASPカーネルを動かす - 準備編
ここまでの記事では、STM32開発ボードでRTOSを動かしてまいりましたが、そもそも私が記事を書いている目的は
より多くの人にRTOSに触れて欲しい
であります。
それに対し、今までの記事は(ほぼ)マイコンボードが手元のある人向けでした。このボード依存を脱却すべく、、、タイトル通り、エミュレータQEMUでTOPPERS/ASPカーネルを動かしてみようと思います!
本記事はその準備編、F/Wバイナリのビルドまでを実施します。
本編
1. 準備
1-1. 環境
- Ubuntu 16.04 LTS
エミュレート対象ボード: Stellaris LM3S6965 Evaluation Board
Cortex-M3マイコンボードです(実物は見たことない)。
QEMUでサポートされており、かつTOPPERSで動作確認済みのためにチョイス。ASPカーネル - ターゲット非依存部は1.9.3 / 依存部は1.7.0
StellarisWare Driver Library 10636
残念ながら、ビルドに必要。
1-2. ASPカーネルの準備
1-2-1. ダウンロード
以下の3つをダウンロードします。
TOPPERS/ASPカーネル ターゲット非依存部パッケージ
https://www.toppers.jp/download.cgi/asp-1.9.3.tar.gzARM Cortex-M3アーキテクチャ・GCC依存部パッケージ
https://www.toppers.jp/download.cgi/asp_arch_arm_m_gcc-1.7.0.tar.gz
(lm3sxxxx_gccが含まれる最新版。1.9.0ではありません!)TOPPERS新世代カーネル用コンフィギュレータ
https://www.toppers.jp/download.cgi/cfg-linux-static-1_9_6.gzこれらを、以下のディレクトリに配置するものとします。
user@user-VirtualBox:~/toppers/stellaris$ ls asp-1.9.3.tar.gz asp_arch_arm_m_gcc-1.7.0.tar.gz cfg-linux-static-1_9_6.gz加えて、以下をダウンロードしておきます。
- 会員登録が必要
- exeインストーラ
という残念さはありますが、、、ここは我慢です。笑
SW-DRL StellarisWare® Driver Library Standalone Package | TI.com
http://www.ti.com/tool/SW-DRL1-2-2. 展開
基本はこちらの手順と同じ(ファイル名が一部異なるだけ)です。
今回は更に、StellarisWare Driver Libraryのコピーをします。
- ダウンロード済みのインストーラをWindowsで実行
- 「StellarisWare」フォルダを「asp/target/lm3sxxxx_gcc」ディレクトリにコピー
user@user-VirtualBox:~/toppers/stellaris/asp/target/lm3sxxxx_gcc$ tree -d -L 1 StellarisWare/ StellarisWare/ ├── docs ├── driverlib ├── examples └── inc 4 directories1-2-3. 文字コード・改行コード変更
こちらの手順と同じ。
1-2-4. StellarisWareの事前ビルド
StellarisWareディレクトリに移動し、何も考えずにmake投入。
user@user-VirtualBox:~/toppers/stellaris/asp/target/lm3sxxxx_gcc/StellarisWare$ make make[1]: ディレクトリ '/home/user/toppers/stellaris/asp/target/lm3sxxxx_gcc/StellarisWare/driverlib' に入ります make[2]: ディレクトリ '/home/user/toppers/stellaris/asp/target/lm3sxxxx_gcc/StellarisWare/driverlib' に入ります CC adc.c (略) AR gcc-cm3/libdriver-cm3.a make[2]: ディレクトリ '/home/user/toppers/stellaris/asp/target/lm3sxxxx_gcc/StellarisWare/driverlib' から出ます make[1]: ディレクトリ '/home/user/toppers/stellaris/asp/target/lm3sxxxx_gcc/StellarisWare/driverlib' から出ます2. ビルド
2-1. configure
ビルド用ディレクトリを作成し、configureを実行します(こちらの手順と類似)。
user@user-VirtualBox:~/toppers/stellaris$ mkdir -p asp/OBJ user@user-VirtualBox:~/toppers/stellaris$ cd asp/OBJ/ user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ ../configure --help configure: -T option is mandatory Installed targets are: dve68k_gcc lm3sxxxx_gcc user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ ../configure -T lm3sxxxx_gcc -dROM configure: Generating Makefile from ../sample/Makefile. configure: Generating sample1.c from ../sample/sample1.c. configure: Generating sample1.h from ../sample/sample1.h. configure: Generating sample1.cfg from ../sample/sample1.cfg. user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ ls Makefile sample1.c sample1.cfg sample1.h2-2. いったんmake
make dependしてみますが、全然通りません。笑
user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ make depend if ! [ -f Makefile.depend ]; then \ rm -f kernel_cfg.timestamp kernel_cfg.h kernel_cfg.c ; \ rm -f cfg1_out.c cfg1_out.o cfg1_out cfg1_out.syms cfg1_out.srec; \ rm -f makeoffset.s offset.h; \ fi rm -f Makefile.depend ../cfg/cfg/cfg --pass 1 --kernel asp -I. -I../include -I../arch -I.. -I../target/lm3sxxxx_gcc -I../target/lm3sxxxx_gcc/StellarisWare -I../arch/arm_m_gcc/common --api-table ../kernel/kernel_api.csv --cfg1-def-table ../kernel/kernel_def.csv --cfg1-def-table ../arch/arm_m_gcc/common/core_def.csv sample1.cfg arm-none-eabi-gcc -c -mlittle-endian -mcpu=cortex-m3 -mthumb -g -Wall -O2 -DTOPPERS_LABEL_ASM -DTOPPERS_ROM -I. -I../include -I../arch -I.. -I../target/lm3sxxxx_gcc -I../target/lm3sxxxx_gcc/StellarisWare -I../arch/arm_m_gcc/common -DALLFUNC -I../kernel cfg1_out.c In file included from cfg1_out.c:7:0: ../target/lm3sxxxx_gcc/target_syssvc.h:74:29: error: unknown type name 'char_t' extern void target_fput_log(char_t c); ^ Makefile:393: ターゲット 'cfg1_out.o' のレシピで失敗しました make: *** [cfg1_out.o] エラー 12-3. ビルドを通す
以下の対策をしていきます。
2-3-1. char_t型をやめる
手法は割愛(雑)しますが、char_t型をchar型に置換してください。
2-3-2. Makefile.dependの修正
こちらも雑ですが、以下のdiffを参考にしてください。
user@user-VirtualBox:~/toppers/stellaris/asp/target/lm3sxxxx_gcc$ diff Makefile.target.old Makefile.target 24c24 < #USE_QEMU = true --- > USE_QEMU = true 35c35 < COPTS := $(COPTS) -mlittle-endian -mcpu=cortex-m3 --- > COPTS := $(COPTS) -mlittle-endian -mcpu=cortex-m3 -nostartfiles 37c37 < LIBS := $(LIBS) $(DRIVER_DIR)/driverlib/gcc/libdriver.a --- > LIBS := $(LIBS) $(DRIVER_DIR)/driverlib/gcc-cm3/libdriver-cm3.a2-4. 再度make
今回はビルドが通るはずです!
(OBJフォルダに移動し) user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ make depend (略) user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ make (略)おわりに
思ったより苦労しましたが、ASPカーネルが簡易パッケージでない(個別パッケージ)ので、こんなものかもしれません・・・。
次回投稿は後半部、いよいよQEMUでF/Wを動作させます!
参考
(特になし)
- 投稿日:2019-08-19T10:40:36+09:00
[memo]shellでAWS S3にログデータを定期に同期させる実行
承前
今までPHPのバックエンドしかやってこなかった人間が初めてShell Scriptに挑戦した記録的なやつ。
AWSコマンド(AWS cli)は事前インストールしておいてください何するの?
EC2に吐き出したログをS3バケットに同期しなきゃという使命感をもって対応する
何した?
EC2のlogを吐き出している場所に対して、S3にSyncをする処理を作る
同期の際は同日に反映されたファイルは上書きするていで良かったらしい(お現場事情)s3_sync_log_api_details.sh#!/bin/sh ## s3_sync_log_api_details.sh $@ ## # initial parameter export PATH=/sbin:/bin:/usr/sbin:/usr/bin export EC2_REGION=`curl -s http://[domain_name]/latest/meta-data/local-hostname | cut -d '.' -f2` INSTANCE_ID=`curl -s http://[domain_name]/latest/meta-data/instance-id` AWS_CONFIG_FILE="/root/.aws/config" # sync detail directories LOG_DIR="/var/log/[project_name]" # sync s3 buckets BUKET_NAME="s3://[s3_repository_domain]/api/log/" # sync logging file into s3 aws s3 sync ${LOG_DIR} ${BUKET_NAME}その次は?
定期的に同期をする必要があるので設定をする必要がありますね
今回は10分毎に同期させようという話crontab.conf/10 * * * * cd /srv/www/[my_directory]/config/sync; sh ./s3_sync_log_api_details.sh感想
このときLaravelを使っていたんですがなんでAtrisanを使わなかったんでしょうねっていう感じ。
でも実はしっかりとバッチで動かすってことをしてこなかったので経験としては非常によかったです。
- 投稿日:2019-08-19T09:55:27+09:00
Linuxディストリビューションまとめ(ざっくり)
どのディストロ入れるか迷ったのでまとめてみた。
ディストリビューションとは
- 英語でDistribution
- 分布, 配布, 流通を指す言葉
- Linuxカーネルにライブラリ, ツール, ユーティリティ, サーバ/デスクトップ向けのアプリケーションを集め, パッケージとしてひとまとまりにしたもの
ディストリビューションの流派
- RedHat系
- 有償のRHEL(RedHat Enterprise Linux), そのクローンのCentOS, RHELの試験的な機能を盛り込んだFedora等
- 「仕事」という言葉が似合う
- Debian系
- 普通のPCとして使いたい場合によく使われる
- Debianやそこから派生したUbuntu, Linux Mint等
- ユーザフレンドリな考え方を持っている
- Slackware系
- 公式に配布されている状態が一つの完成形となっている
- そのため, アプリケーションの追加導入や依存関係の管理が難しい
- 初心者向けではない
- ただし, 安定性や安全性, 高速といったメリットを持つ
- 老舗
ディストリビューションの比較
RedHat系
- RHEL
- 有償
- 技術的なサポート, 長期的で的確なバグフィックス
- サポート期間は10年と長い
- CentOS
- RHELのクローンOS
- RHELの有償部分を取り除いたもの
- 無償だが, RedHatのサポートは受けられない
- 情報は豊富でトラシューしやすい
- Fedora
- アグレッシブなディストリビューション
- 最新の機能をどんどん取り込んでいる
- Fedora -取り込む-> RHEL -クローン-> CentOS といった流れ
- FedoraはRHELとCentOSとはバージョンの付け方が異なっている
Debian系
- Debian
- 無償でサーバを構築するならCentOS, Debian, Ubuntuの三択
- Ubuntu
- ユーザフレンドリ
- Debianから派生
- Ubuntuという言葉自体が「他者への思いやり」を意味している
- 資金面でも問題無く, この先も無償で提供することが宣言されている
- 情報が豊富でトラブルシューティングしやすい
- Linux Mint
- Ubuntuから派生
- かなり簡単に使えるようになっている
- Kubuntu
- Ubuntuのデスクトップ環境をKDEに置き換えたもの(UbuntuはGNOME)
- Xubuntu
- Ubuntuのデスクトップ環境をXFceに置き換えたもの
- Zorin OS
- Ubuntuから派生
- スキンをWindows風/Mac風にできる
- Voyager Linux
- Xubuntuから派生
- フランス産
- Xubuntuの高カスタマイズ版といった立ち位置
- Kali Linux
- ペネトレーションテストを主な目的としている
- 2011年に開発が開始されたため, 割と新しい部類
- Debian -> SLAX(元はSlackwareベース) -> Whoppix -> BackTrack -> Kali Linux
- Tails
- プライバシと匿名性の保護に特化している
- Debianベース
- The Amnesic Incognito Live System の略
Slackware系
- Slackware
- 最古のディストリビューション
- シンプルで堅実
- パッケージの依存関係等は自分で解決する必要がある
- 初心者向けではない
- openSUSE
- Slackware系
- SUSE Linuxから改名
- 様々な用途で利用できる
- 意外と初心者向け?
その他
- Gentoo Linux
- 最も難易度が高いと言われるLinuxディストリビューション
- 公式ドキュメントを見て一からインストールする
- より細かくチューニングできる
- Arch Linux
- 決してユーザフレンドリではないが, 開発者からみてとてもシンプル
- コアな部分でシンプルさと使いやすさを両立
- パワーユーザに人気
- インストールは基本CUIでGUIを使う場合はインストール後
- Manjaro Linux
- ArchLinuxから派生
- ユーザフレンドリを目指してGUI環境が追加された
- Linux From Scratch(LFS)
- 全てを自分で構築したいという人間が行き着く果て
- システムとして最低限何があれば実用的に機能するのかが理解できる
- 自分でディストリビューションを構築する基礎が身につく
- 投稿日:2019-08-19T09:52:22+09:00
Linuxが生まれるまでの変遷(ざっくり)
IBM System/360
- OSのはじまり
- 1960年代前半から1970年代後半まで活躍
- OSという概念が登場したのは1960年代
- それまでは計算用であれば計算専用のコンピュータ, 事務処理用であれば事務処理専用のコンピュータを構築するのが一般的だったらしいが, それでは効率が悪いので, その基盤をなすOS(Operating System)という概念が生まれた
Multics
- AT&Tベル研究所で作られた
- 多機能だったが機能を盛り込みすぎたせいでまともに使えなかった
UNIX
- Multicsの反省を生かして開発された
- はじめはアセンブリ言語で記述されていたが, 後にC言語で書き直された
- ケン・トンプソン, デニス・リッチー, ブライアン・カーニハン等によって開発
- 1960年代後半〜1970年代に主に開発された
GNU
- GNU’s Not Unix! の略
- GNUプロジェクトはリチャード・ストールマンによって1983年に開始される
- 1990年代初頭までにライブラリ, コンパイラ, テキストエディタ, シェル, ウィンドウシステムが完成
- しかしデバドラ, デーモン, カーネルは未完成だった
- この時点でGNU Hurd(カーネル)が完成していた場合, リーナスはLinuxを開発していなかったという
BSD
- 派生版UNIX
- 1970年代後半から開発
- カリフォルニア大学バークレー校で開発
- しかし1984年にUNIXプロプライエタリ製品になったため, 自由に公開できなくなった
- そこでBSDからAT&Tのライセンスが必要な部分を削り92年に386BSDをリリース
- 386BSDがNetBSDやFreeBSDの祖先となる
FreeBSD
- 元々はx86環境のサポートの充実を念頭に置いて開発がはじめられた
- macOSはFreeBSDから派生したOSである
NetBSD
- 多くのアーキテクチャで動作させることを念頭に置いて開発がはじめられた
OpenBSD
- NetBSDから派生
- セキュリティに注意して開発が進められている
Solaris
- サン・マイクロシステムズ(現オラクル)によって開発されたOS
- SUS(Single UNIX Specification)というUNIXを名乗ることが許される認証を受けている
- 元々はSunOSというBSDベースのOSだったが, UNIXベースのものに書き換えられ, Solarisに改名された
MIINIX
- アンドリュー・タネンバウムによって開発されたUNIX系OS
- コンピュータサイエンスにおけるOSの教育という目的に重点を置いた設計
Linux
- UNIXが商用で高価であったことや, MINIXはあくまで教育用で機能が大幅にカットされていたということから開発を開始
- 投稿日:2019-08-19T02:09:24+09:00
ストレージにデータをダラダラと書き込むプロセスの見つけ方
やりたいこと
ストレージにデータをダラダラと書き込むプロセスとその書き込み先を見つけたい。
いまのところ一番良いと思われる方法
/proc/sys/vm/block_dump
+strace
# echo 1 > /proc/sys/vm/block_dump (テストシーケンス) # dmesg | grep "WRITE block" [ 1347.340922] qemu-system-aar(5614): WRITE block 405079400 on sda1 (8 sectors) [ 1347.341256] jbd2/sda1-8(234): WRITE block 470207336 on sda1 (8 sectors) ... (jbd2はジャーナルファイルの書き出し) $ strace -p 5614 strace: Process 5614 attached restart_syscall(<... resuming interrupted futex ...>) = 0 pwrite64(12, "\300;9\230\0\0\0\2\0\0\0\302\0\0\0\0\223\323[)\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024, 17537024) = 1024 $ ls -l /proc/5614/fd/12 lrwx------ 1 user user 64 8月 21 00:10 /proc/5614/fd/12 -> /home/user/buildroot-2019.02.4/output/images/rootfs.ext2他の方法案
案1.
lsof
+awk
をポーリング
良い点
lsof
とawk
さえ動けば可能。(awk
はフィルタだけなので頑張ればgrep
でも可)ダメな点
- ポーリングのインターバルの間にopen/write/closeする場合検出できない。
- ファイルサイズの変化しか見れていないので、writeせずにファイルを作ったり消したりする人や、mmapして汚す人や、メタ情報だけ更新する人などを検出することはできない。
もともとこの方法を使うつもりだったが、検出できないケースが結構あったので却下。
下記のように
lsof
コマンドの出力を加工することで、ストレージに書き込み属性で開かれているファイルの一覧が取得できる。function lsof_writing() { lsof +c 0 -d "0-$(ulimit -n)" -c '^lsof' | awk 'NR == 1 \ || $4 ~ /[0-9]+[wu]/ \ && $5 == "REG" \ && $6 == "8,1" \ && $9 !~ /^\/(memfd|tmp|run|proc|dev\/shm)/' }なお詳細は後述するが、6行目の"8,1"は監視対象のブロックデバイスのメジャー番号とマイナー番号を指定する。
あとは、これを定期的に動かして差分を見れば、書き込んでるプロセスと書き込み先がわかる。watch_lsof.sh#!/bin/bash function lsof_writing() { lsof +c 0 -d "0-$(ulimit -n)" -c '^lsof' | awk 'NR == 1 \ || $4 ~ /[0-9]+[wu]/ \ && $5 == "REG" \ && $6 == "8,1" \ && $9 !~ /^\/(memfd|tmp|run|proc|dev\/shm)/' } NEW=$(lsof_writing) while true; do sleep 2 OLD="$NEW" NEW="$(lsof_writing)" diff -u <(echo "$OLD") <(echo "$NEW") done実行例は下記の通り。
chromium-browser
プロセスが7バイト何か書いてることがわかる。$ ./watch_lsof.sh --- /dev/fd/63 2019-08-19 01:21:28.785795784 +0900 +++ /dev/fd/62 2019-08-19 01:21:28.785795784 +0900 @@ -179,7 +179,7 @@ chromium-browse 29987 user 277w REG 8,1 3898089 186392 /home/user/.config/chromium/Default/Extension State/003194.log chromium-browse 29987 user 281u REG 8,1 7168 238130 /home/user/.config/chromium/Default/databases/Databases.db chromium-browse 29987 user 282ur REG 8,1 17408 238134 /home/user/.config/chromium/Default/QuotaManager -chromium-browse 29987 user 289w REG 8,1 487243 158273 /home/user/.config/chromium/Default/Current Session +chromium-browse 29987 user 289w REG 8,1 487250 158273 /home/user/.config/chromium/Default/Current Session chromium-browse 29987 user 292u REG 8,1 0 237883 /home/user/.config/chromium/Default/Web Data-journal chromium-browse 29987 user 331w REG 8,1 288 135767 /home/user/.config/chromium/Default/File System/001/p/Paths/LOG chromium-browse 29987 user 332uW REG 8,1 0 243892 /home/user/.config/chromium/Default/File System/001/p/Paths/LOCK備忘のために簡単に内容を書いておくと、
lsof
のオプション
+c 0
: コマンド名の出力数をデフォルトの9文字から大きくする。-d "0-$(ulimit -n)"
: fdが数値になっているものに限定して出力する。デフォルトでは、memory-mapped fileなど通常のファイル以外も出力されるため。fdの値の上限はulimit
から取得しているが、十分大きければ何でも良い(上限なし指定はできないっぽい)。-c '^lsof'
:lsof
自身のfdはノイズなので除去。awk
のパターン :lsof
のオプションでフィルタしきれないものはawk
の力を借りた。
NR == 1
: 一応わかりやすいようにヘッダを残す。$4 ~ /[0-9]+[wu]/
: 書き込み属性で開かれているファイルのみ出力。ちなみに第4要素はFDで、fd値の後ろにアクセスモードを示す文字とロックモードを示す文字が続く。アクセスモードがw (write only)
とu (read write)
のみ取り出している。$5 == "REG"
: regular fileのみ出力。なお第5要素はTYPE。$6 == "8,1"
: 第6要素はDEVICE。調査対象のブロックデバイスのメジャー番号、マイナー番号を指定する。環境によって調整が必要。lsblk
で対象のパーティションのメジャー番号、マイナー番号がわかる。lsblk
がなければls -l
でも可。$9 !~ /^\/(memfd|tmp|run|proc|dev\/shm)/'
: 第9要素はNAME。tmpfsを除外している。代表的なパスを入れたつもりだが、環境によって調整が必要。ちなみに、
lsof
には外部プロセスで結果をパースしやすいように出力する-F
オプションが用意されている。
ただ、これ余計パースしにくくなると思うのは自分だけだろうか。。。(実際今回は使っていない)
パースしにくい一番の理由は、せっかく元が行志向のデータなのに、-F
オプションをつけるとそうではなくなることだ。
いっそjsonやxmlのような汎用的なフォーマットで出力されるならまだわかるのだが。。。
気づいてないだけで良いパース方法があるのか?案2.
pidstat -d
+strace
- 良い点
- わかりやすい
- 起動からの総書き込み量が確認できる
- ダメな点
- プロセスの生存期間が短いと検出できない
pidstat
がない環境が結構ある。仮にあっても-d
オプションは/proc/PID/io
に依存しているので、CONFIG_TASK_IO_ACCOUNTING
が有効になっていなければならない。pidstat -d
だけではパーティションがわからない。(strace
まですればわかるが)案3.systemtapでvfs_writeをprobeする
- 良い点
- ある程度集計してから出力するなど、フォーマットの調整が自在
- ダメな点
- 最初からsystemtapが使えればいいが、カーネルコンフィグの変更が必要な場合が多い
その他
perf
やsar
ではイベント回数や流量はわかっても、プロセス・ファイルごとのプロファイルまでは厳しいのかなと。
よりいい方法があればぜひ教えてください。まとめ
eMMCなどのフラッシュストレージを使った組込システムでは、
製品寿命を実現するためにストレージへの書き込み回数・量を意識する必要がある。
プログラマのためのフラッシュメモリ入門などにあるように、
下回りやストレージ側も頑張ってくれているが、
もちろんアプリケーションが不要な書き込みをしないことが大前提。
できるだけ簡単にお行儀悪いアプリがいないか確認できるようにしておきたい。参考
/proc//io
/proc/sys/vm/block-dump
lsof(8) - Linux man page
プログラマのためのフラッシュメモリ入門
テキスト処理にたまに便利なAWK入門