20190819のLinuxに関する記事は12件です。

パケットフィルタを使用してパケットドロップを発生させる

クラスタを分断してスプリットブレインを発生させたい!(サーバ間のハートビートが出来ないようにしたい!)
...ということでパケットドロップが起きるように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 ターゲット=パケット破棄

これだけで簡単に使用可能。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

未経験者向け 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上で実行することが望ましい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ラズベリーパイで監視カメラ作ってみる。

ラズベリーパイで監視カメラを作る方法を書いておきます。
多分USBカメラはこのやり方じゃできないと思います。
まずはRPi_cam_Web_Interfaceというファイルをダウンロードしないといけないので下記のコマンドを実行します。

$ git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git

これでファイルがインストールできたので、次はそのファイルの中に入っているinstall.shを実行します。

$ ./install.sh

これでインストール画面が出てきますので、任意の設定をします。(基本的にはそのままで大丈夫です。)
これができたら、http://ラズパイのIPアドレス/
でカメラにつながると思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Web UI on WLS's ubuntu

Web UI

WLSの設定手順は以前書いたが、Gitが使えるWeb UIを入れたくていくつか試した。

  • GitLab (途中)
  • Kallithea (途中)
  • GitBucket インストールできた

GitLab

Ubuntu アップデート

$ sudo apt update
$ sudo apt upgrade

Gitlab インストール

$ 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 PasteScript

Kallitheaのインストール

pip install kallithea

ここまでOkay

paster make-config Kallithea kallithea.ini

pasterのエラーが取れず挫折中。

GitBucket

こちらの記事の通りで問題なく動作
https://qiita.com/YuseiUeno/items/9cbceb7456068a6a3bb4

gitbucketのデータやリポジトリが置かれる場所は、デフォルトでは~/.gitbucketだったため、
環境変数GITBUCKET_HOMEに指定すると変更できた。

8080ポート指定は、
apache-tomcat-8.5.8/conf/server.conf
で変更できる

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitlab CE on WLS's ubuntu

ginatraを試してみたけど、Gitlab CEが使いたくなり試してみた

WLS(Windows subsystem for Linux)でUbuntuを動作させて、Gitlabを動かすまでの手順

アップデート

$ sudo apt update

$ sudo apt upgrade

Gitlab インストール

$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
$ sudo apt install gitlab-ce

aptから呼び出すdpkgがとても遅いせいなのか

何が悪いんだろうか、5時間くらいかかった。

設定更新

下記のファイルを更新する

$ sudo emacs /etc/gitlab/gitlab.rb

更新後に、下記のコマンドで再コンフィグをかける

$ sudo gitlab-ctl reconfigure

動作確認

ブラウザからIPアドレスにアクセスして表示を確認。

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.gz

1-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.gz

1-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.c

1-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 -lrt

1-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.o

1-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.gz

2. いよいよ動かす!

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カーネルのドキュメントに従っただけなのですが、何しろ情報が古い(確認環境も古い)ので、そのギャップが原因かと思います。

今回は(も)?とりあえず動かしてみたよってだけですので、今後はより使いやすいモノ・情報を提供していく予定です!

参考

(特になし)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
入力サイズ:224x224

EfficientNet-EdgeTpu(M)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:240x240

EfficientNet-EdgeTpu(L)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:300x300

MobileNet V1(ImageNet)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224

MobileNet V2(ImageNet)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224

MobileNet V2(iNat昆虫)

1,000種類以上の昆虫を認識
データセット:iNaturalist
入力サイズ:224x224

MobileNet V2(iNatプラント)

2,000種類以上の植物を認識
データセット:iNaturalist
入力サイズ:224x224

MobileNet V2(iNatバード)

900種類以上の鳥を認識
データセット:iNaturalist
入力サイズ:224x224

Inception V1(ImageNet)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224

Inception V2(ImageNet)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:224x224

Inception V3(ImageNet)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:299x299

Inception V4(ImageNet)

1,000種類のオブジェクトを認識
データセット:ImageNet
入力サイズ:299x299

物体検出

MobileNet SSD v1(COCO)

90種類のオブジェクトの位置を検出します
データセット:COCO
入力サイズ:300x300

MobileNet SSD v2(COCO)

90種類のオブジェクトの位置を検出します
データセット:COCO
入力サイズ:300x300

MobileNet 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-ai-iot-products.jpg

Coral USB Acceleratorは、コンピューターのコプロセッサーとしてEdge TPUを提供するUSBデバイスです。 Linuxホストコンピューターに接続すると、機械学習モデルの推論が高速化されます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.gz

ARM 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-DRL

1-2-2. 展開

基本はこちらの手順と同じ(ファイル名が一部異なるだけ)です。

今回は更に、StellarisWare Driver Libraryのコピーをします。

  1. ダウンロード済みのインストーラをWindowsで実行
  2. 「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 directories

1-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.h

2-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] エラー 1

2-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.a

2-4. 再度make

今回はビルドが通るはずです!

(OBJフォルダに移動し)
user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ make depend
(略)
user@user-VirtualBox:~/toppers/stellaris/asp/OBJ$ make
(略)

おわりに

思ったより苦労しましたが、ASPカーネルが簡易パッケージでない(個別パッケージ)ので、こんなものかもしれません・・・。

次回投稿は後半部、いよいよQEMUでF/Wを動作させます!

参考

(特になし)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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を使わなかったんでしょうねっていう感じ。

でも実はしっかりとバッチで動かすってことをしてこなかったので経験としては非常によかったです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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)
    • 全てを自分で構築したいという人間が行き着く果て
    • システムとして最低限何があれば実用的に機能するのかが理解できる
    • 自分でディストリビューションを構築する基礎が身につく
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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はあくまで教育用で機能が大幅にカットされていたということから開発を開始
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ストレージにデータをダラダラと書き込むプロセスの見つけ方

やりたいこと

ストレージにデータをダラダラと書き込むプロセスとその書き込み先を見つけたい。

いまのところ一番良いと思われる方法

/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をポーリング

  • 良い点

    • lsofawkさえ動けば可能。(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が使えればいいが、カーネルコンフィグの変更が必要な場合が多い

その他

perfsarではイベント回数や流量はわかっても、プロセス・ファイルごとのプロファイルまでは厳しいのかなと。
よりいい方法があればぜひ教えてください。

まとめ

eMMCなどのフラッシュストレージを使った組込システムでは、
製品寿命を実現するためにストレージへの書き込み回数・量を意識する必要がある。
プログラマのためのフラッシュメモリ入門などにあるように、
下回りやストレージ側も頑張ってくれているが、
もちろんアプリケーションが不要な書き込みをしないことが大前提。
できるだけ簡単にお行儀悪いアプリがいないか確認できるようにしておきたい。

参考

/proc//io
/proc/sys/vm/block-dump
lsof(8) - Linux man page
プログラマのためのフラッシュメモリ入門
テキスト処理にたまに便利なAWK入門

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む